2009-04-15 17:20 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)

* harbour/contrib/xhb/xhbmsgs.c
  * harbour/contrib/xhb/xhbcomp.prg
    + added overloading relation operators (==, =, !=, <, <=, >, >=)
      to mimic xHarbour like one byte string behavior
This commit is contained in:
Przemyslaw Czerpak
2009-04-15 15:13:26 +00:00
parent b3b09f6110
commit 84222550a1
3 changed files with 198 additions and 0 deletions

View File

@@ -8,6 +8,12 @@
2009-12-31 13:59 UTC+0100 Foo Bar (foo.bar foobar.org)
*/
2009-04-15 17:20 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl)
* harbour/contrib/xhb/xhbmsgs.c
* harbour/contrib/xhb/xhbcomp.prg
+ added overloading relation operators (==, =, !=, <, <=, >, >=)
to mimic xHarbour like one byte string behavior
2009-04-15 01:01 UTC-0800 Pritpal Bedi (pritpal@vouchcac.com)
* harbour/contrib/gtqtc/gtqtc.cpp
* harbour/contrib/gtqtc/gtqtc.h

View File

@@ -86,6 +86,15 @@ CREATE CLASS Character FUNCTION _Character
OPERATOR "^" FUNCTION XHB_POW()
OPERATOR "++" FUNCTION XHB_INC()
OPERATOR "--" FUNCTION XHB_DEC()
OPERATOR "==" FUNCTION XHB_EEQUAL()
OPERATOR "=" FUNCTION XHB_EQUAL()
OPERATOR "<>" FUNCTION XHB_NOTEQUAL()
OPERATOR "<" FUNCTION XHB_LESS()
OPERATOR "<=" FUNCTION XHB_LESSEQ()
OPERATOR ">" FUNCTION XHB_GREATER()
OPERATOR ">=" FUNCTION XHB_GREATEREQ()
ENDCLASS
CREATE CLASS Numeric FUNCTION _Numeric
@@ -98,6 +107,14 @@ CREATE CLASS Numeric FUNCTION _Numeric
OPERATOR "^" FUNCTION XHB_POW()
OPERATOR "++" FUNCTION XHB_INC()
OPERATOR "--" FUNCTION XHB_DEC()
OPERATOR "==" FUNCTION XHB_EEQUAL()
OPERATOR "=" FUNCTION XHB_EQUAL()
OPERATOR "<>" FUNCTION XHB_NOTEQUAL()
OPERATOR "<" FUNCTION XHB_LESS()
OPERATOR "<=" FUNCTION XHB_LESSEQ()
OPERATOR ">" FUNCTION XHB_GREATER()
OPERATOR ">=" FUNCTION XHB_GREATEREQ()
ENDCLASS
CREATE CLASS Array FUNCTION _Array

View File

@@ -116,6 +116,181 @@ HB_FUNC( XHB_INCLUDE )
}
}
HB_FUNC( XHB_EEQUAL )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue == ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc == dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1070, NULL, "==", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
HB_FUNC( XHB_EQUAL )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue == ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc == dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1071, NULL, "=", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
HB_FUNC( XHB_NOTEQUAL )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue != ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc != dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1072, NULL, "<>", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
HB_FUNC( XHB_LESS )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue < ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc < dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1073, NULL, "<", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
HB_FUNC( XHB_LESSEQ )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue <= ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc <= dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1074, NULL, "<=", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
HB_FUNC( XHB_GREATER )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue > ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc > dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1075, NULL, ">", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
HB_FUNC( XHB_GREATEREQ )
{
PHB_ITEM pSelf = hb_stackSelfItem();
PHB_ITEM pValue = hb_param( 1, HB_IT_ANY );
if( HB_IS_NUMERIC( pSelf ) && hb_itemGetCLen( pValue ) == 1 )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pValue )[0];
double dValue = hb_itemGetND( pSelf );
hb_retl( dValue >= ( double ) uc );
}
else if( hb_itemGetCLen( pSelf ) == 1 && pValue && HB_IS_NUMERIC( pValue ) )
{
UCHAR uc = ( UCHAR ) hb_itemGetCPtr( pSelf )[0];
double dValue = hb_itemGetND( pValue );
hb_retl( ( double ) uc >= dValue );
}
else
{
PHB_ITEM pResult = hb_errRT_BASE_Subst( EG_ARG, 1076, NULL, ">=", 2, pSelf, pValue );
if( pResult )
hb_itemReturnRelease( pResult );
}
}
/*
* check if array/string index is in valid range, update it if necessary
* in xHarbour compatibility mode where negative indexes are used to access