diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 0d44e3213c..7cd0765de4 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -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 diff --git a/harbour/contrib/xhb/xhbcomp.prg b/harbour/contrib/xhb/xhbcomp.prg index 831f28cc95..0475f57bec 100644 --- a/harbour/contrib/xhb/xhbcomp.prg +++ b/harbour/contrib/xhb/xhbcomp.prg @@ -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 diff --git a/harbour/contrib/xhb/xhbmsgs.c b/harbour/contrib/xhb/xhbmsgs.c index 0fffca89d1..692b895bb5 100644 --- a/harbour/contrib/xhb/xhbmsgs.c +++ b/harbour/contrib/xhb/xhbmsgs.c @@ -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