From 01c55fa2c1bf6bc027499c3d60a670c1056d85b5 Mon Sep 17 00:00:00 2001 From: Przemyslaw Czerpak Date: Thu, 1 Mar 2007 00:57:25 +0000 Subject: [PATCH] 2007-03-01 01:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbclass.ch * cleaned scope error message * harbour/include/hbpp.h * harbour/source/pp/ppcore.c * added hack for accepting expressions which start with ':' character as regular/list match markers --- harbour/ChangeLog | 9 ++++++ harbour/include/hbclass.ch | 15 +++------- harbour/include/hbpp.h | 32 ++++++++++++++-------- harbour/source/pp/ppcore.c | 56 ++++++++++++++++++++++++++++---------- 4 files changed, 74 insertions(+), 38 deletions(-) diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 8bb484a78a..fac280d0e0 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,15 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-03-01 01:55 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/include/hbclass.ch + * cleaned scope error message + + * harbour/include/hbpp.h + * harbour/source/pp/ppcore.c + * added hack for accepting expressions which start with ':' character + as regular/list match markers + 2007-02-28 08:10 UTC+0100 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/include/hbpp.h * harbour/source/compiler/complex.c diff --git a/harbour/include/hbclass.ch b/harbour/include/hbclass.ch index f483a3289c..61638e2106 100644 --- a/harbour/include/hbclass.ch +++ b/harbour/include/hbclass.ch @@ -181,7 +181,7 @@ #ifdef HB_CLS_NO_OO_ERR #xtranslate __HB_CLS_ERR([]) => #else - #xtranslate __HB_CLS_ERR([]) => ;#error [ ] ; #undef _DUMMY_DEF_ + #xtranslate __HB_CLS_ERR([]) => ;#error [ ] ; #line #endif #xtranslate __HB_CLS_VARERR() => __HB_CLS_ERR( Invalid instance variable name: ) @@ -229,7 +229,7 @@ DECLARE HBClass ; iif( , HB_OO_CLSTP_EXPORTED , ; iif( , HB_OO_CLSTP_PROTECTED, ; iif( , HB_OO_CLSTP_HIDDEN, nScope ) ) ) */ -#xtranslate __HB_CLS_SCOPE( ) => __HB_CLS_ERR( Can not use multiple scope qualifiers! ) +#xtranslate __HB_CLS_SCOPE( ) => ) __HB_CLS_ERR( Can not use multiple scope qualifiers! ) #xtranslate __HB_CLS_SCOPE( .T., .F., .F. ) => HB_OO_CLSTP_EXPORTED #xtranslate __HB_CLS_SCOPE( .F., .T., .F. ) => HB_OO_CLSTP_PROTECTED #xtranslate __HB_CLS_SCOPE( .F., .F., .T. ) => HB_OO_CLSTP_HIDDEN @@ -266,16 +266,9 @@ DECLARE HBClass ; static __HB_CLS_MTHNAME ;; local Self AS CLASS := QSelf() AS CLASS -#ifdef __XHARBOUR__ - #xcommand __HB_CLS_DECLARE_METHOD => ; - #xcommand METHOD \ \[(\[\])] CLASS _CLASS_IMPLEMENTATION_ => ; - DECLARED METHOD \ \[(\)] CLASS ;; - #undef _DUMMY_DEF_ -#else - #xcommand __HB_CLS_DECLARE_METHOD => ; - #xcommand METHOD \ \[(\[\])] CLASS _CLASS_IMPLEMENTATION_ => ; +#xcommand __HB_CLS_DECLARE_METHOD => ; + #xcommand METHOD \ \[(\[\])] CLASS _CLASS_IMPLEMENTATION_ => ; DECLARED METHOD \ \[(\)] CLASS -#endif #xcommand METHOD CLASS _CLASS_IMPLEMENTATION_ => ; __HB_CLS_ERR( Method not declared or declaration mismatch in class: ) ;; diff --git a/harbour/include/hbpp.h b/harbour/include/hbpp.h index 9fdca34b65..db44684076 100644 --- a/harbour/include/hbpp.h +++ b/harbour/include/hbpp.h @@ -4,7 +4,7 @@ /* * Harbour Project source code: - * + * * * Copyright 2006 Przemyslaw Czerpak * www - http://www.harbour-project.org @@ -198,6 +198,9 @@ typedef HB_PP_SWITCH_FUNC * PHB_PP_SWITCH_FUNC; #define HB_PP_TOKEN_MOD 84 #define HB_PP_TOKEN_POWER 85 #define HB_PP_TOKEN_EPSILON 86 +#define HB_PP_TOKEN_SHIFTL 87 +#define HB_PP_TOKEN_SHIFTR 88 +#define HB_PP_TOKEN_BITXOR 89 #define HB_PP_TOKEN_TYPE(t) ( (t) & 0xff ) /* bitfields */ @@ -266,19 +269,24 @@ typedef HB_PP_SWITCH_FUNC * PHB_PP_SWITCH_FUNC; HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_RIGHT_SB || \ HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_RIGHT_CB ) -#define HB_PP_TOKEN_NEEDLEFT(t) ( HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_ASSIGN || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_PLUSEQ || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_MINUSEQ || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_MULTEQ || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_DIVEQ || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_MODEQ || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_EXPEQ || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_EQUAL || \ - HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_EQ ) - #define HB_PP_TOKEN_ISNEUTRAL(t) ( HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_DEC || \ HB_PP_TOKEN_TYPE(t) == HB_PP_TOKEN_INC ) +#define HB_PP_TOKEN_NEEDLEFT(t) ( HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_ASSIGN || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_PLUSEQ || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_MINUSEQ || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_MULTEQ || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_DIVEQ || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_MODEQ || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_EXPEQ || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_EQUAL || \ + HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_EQ || \ + ( HB_PP_TOKEN_TYPE((t)->type) == HB_PP_TOKEN_SEND && \ + (t)->spaces == 0 && (t)->pNext && \ + ( HB_PP_TOKEN_TYPE((t)->pNext->type) == HB_PP_TOKEN_KEYWORD || \ + HB_PP_TOKEN_TYPE((t)->pNext->type) == HB_PP_TOKEN_MACROVAR || \ + HB_PP_TOKEN_TYPE((t)->pNext->type) == HB_PP_TOKEN_MACROTEXT ) ) ) + /* I do not want to replicate exactly Clipper PP behavior and check if expression is valid. it's wrong and causes that potentially valid expressions are not @@ -340,7 +348,7 @@ typedef HB_PP_SWITCH_FUNC * PHB_PP_SWITCH_FUNC; HB_PP_TOKEN_ISEXPVAL( (t)->pNext->type ) ) ) #ifdef HB_C52_STRICT -/* Clipper supports quoting by [] for 1-st token in the line so we +/* Clipper supports quoting by [] for 1-st token in the line so we are checking for HB_PP_TOKEN_NUL in this macro */ #define HB_PP_TOKEN_CANQUOTE(t) ( HB_PP_TOKEN_TYPE(t) != HB_PP_TOKEN_NUL && \ HB_PP_TOKEN_TYPE(t) != HB_PP_TOKEN_KEYWORD && \ diff --git a/harbour/source/pp/ppcore.c b/harbour/source/pp/ppcore.c index 18c43a40f0..ddf95b9b5b 100644 --- a/harbour/source/pp/ppcore.c +++ b/harbour/source/pp/ppcore.c @@ -144,7 +144,7 @@ static char * hb_pp_szErrors[] = }; -static const HB_PP_OPERATOR s_operators[] = +static const HB_PP_OPERATOR s_operators[] = { { ".NOT.", 5, "!" , HB_PP_TOKEN_NOT | HB_PP_TOKEN_STATIC }, { ".AND.", 5, ".AND.", HB_PP_TOKEN_AND | HB_PP_TOKEN_STATIC }, @@ -169,6 +169,11 @@ static const HB_PP_OPERATOR s_operators[] = { "!=" , 2, "<>" , HB_PP_TOKEN_NE | HB_PP_TOKEN_STATIC }, { "<>" , 2, "<>" , HB_PP_TOKEN_NE | HB_PP_TOKEN_STATIC }, { "->" , 2, "->" , HB_PP_TOKEN_ALIAS | HB_PP_TOKEN_STATIC }, +#ifdef __XHARBOUR__ + { "<<" , 2, "<<" , HB_PP_TOKEN_SHIFTL | HB_PP_TOKEN_STATIC }, + { ">>" , 2, ">>" , HB_PP_TOKEN_SHIFTR | HB_PP_TOKEN_STATIC }, + { "^^" , 2, "^^" , HB_PP_TOKEN_BITXOR | HB_PP_TOKEN_STATIC }, +#endif { "@" , 1, "@" , HB_PP_TOKEN_REFERENCE | HB_PP_TOKEN_STATIC }, { "(" , 1, "(" , HB_PP_TOKEN_LEFT_PB | HB_PP_TOKEN_STATIC }, { ")" , 1, ")" , HB_PP_TOKEN_RIGHT_PB | HB_PP_TOKEN_STATIC }, @@ -884,7 +889,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState ) snprintf( szFunc, sizeof( szFunc ), "HB_INLINE_%03d", ++pState->iInLineCount ); if( pInLinePtr && * pInLinePtr ) hb_pp_tokenSetValue( *pInLinePtr, szFunc, strlen( szFunc ) ); - pState->pInLineFunc( pState->cargo, szFunc, + pState->pInLineFunc( pState->cargo, szFunc, hb_membufPtr( pState->pStreamBuffer ), hb_membufLen( pState->pStreamBuffer ), pState->iDumpLine ); @@ -1051,7 +1056,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState ) while( ++ul < ulLen && HB_PP_ISNEXTIDCHAR( pBuffer[ ul ] ) ); /* - * In Clipper note can be used only as 1-st token and after + * In Clipper note can be used only as 1-st token and after * statement separator ';' it does not work like a single line * comment. */ @@ -1229,7 +1234,7 @@ static void hb_pp_getLine( PHB_PP_STATE pState ) } while( ( pState->pFile->pLineBuf ? pState->pFile->ulLineBufLen != 0 : !pState->pFile->fEof ) && - ( pState->fCanNextLine || + ( pState->fCanNextLine || ( pState->iStreamDump && pState->iStreamDump != HB_PP_STREAM_CLIPPER ) ) ); if( pState->iStreamDump ) @@ -1383,7 +1388,7 @@ static BOOL hb_pp_tokenEqual( PHB_PP_TOKEN pToken, PHB_PP_TOKEN pMatch, USHORT mode ) { return pToken == pMatch || - ( mode != HB_PP_CMP_ADDR && + ( mode != HB_PP_CMP_ADDR && HB_PP_TOKEN_TYPE( pToken->type ) == HB_PP_TOKEN_TYPE( pMatch->type ) && ( pToken->len == pMatch->len || ( mode == HB_PP_CMP_DBASE && pMatch->len > 4 && @@ -1868,7 +1873,7 @@ static BOOL hb_pp_pragmaOperatorNew( PHB_PP_STATE pState, PHB_PP_TOKEN pToken ) pState->pOperators, sizeof( HB_PP_OPERATOR ) * ( pState->iOperators + 1 ) ); else - pState->pOperators = ( PHB_PP_OPERATOR ) hb_xgrab( + pState->pOperators = ( PHB_PP_OPERATOR ) hb_xgrab( sizeof( HB_PP_OPERATOR ) * ( pState->iOperators + 1 ) ); pOperator = &pState->pOperators[ pState->iOperators++ ]; pOperator->name = hb_strndup( pBuffer, ulLen ); @@ -2093,7 +2098,7 @@ static void hb_pp_pragmaNew( PHB_PP_STATE pState, PHB_PP_TOKEN pToken ) } else if( hb_pp_tokenValueCmp( pToken, "EXITSEVERITY", HB_PP_CMP_DBASE ) ) { - pValue = hb_pp_pragmaGetLogical( pToken->pNext, &iValue ); + pValue = hb_pp_pragmaGetInt( pToken->pNext, &iValue ); if( pValue ) fError = hb_pp_setCompilerSwitch( pState, "es", iValue ); else @@ -2156,7 +2161,7 @@ static void hb_pp_pragmaNew( PHB_PP_STATE pState, PHB_PP_TOKEN pToken ) } else if( hb_pp_tokenValueCmp( pToken, "WARNINGLEVEL", HB_PP_CMP_DBASE ) ) { - pValue = hb_pp_pragmaGetLogical( pToken->pNext, &iValue ); + pValue = hb_pp_pragmaGetInt( pToken->pNext, &iValue ); if( pValue ) fError = hb_pp_setCompilerSwitch( pState, "w", iValue ); else @@ -3051,7 +3056,7 @@ static BOOL hb_pp_tokenSkipExp( PHB_PP_TOKEN * pTokenPtr, PHB_PP_TOKEN pStop, static BOOL hb_pp_tokenCanStartExp( PHB_PP_TOKEN pToken ) { - if( !HB_PP_TOKEN_NEEDLEFT( pToken->type ) ) + if( !HB_PP_TOKEN_NEEDLEFT( pToken ) ) { if( HB_PP_TOKEN_TYPE( pToken->type ) != HB_PP_TOKEN_LEFT_SB ) return TRUE; @@ -3442,7 +3447,7 @@ static PHB_PP_TOKEN * hb_pp_matchResultLstAdd( PHB_PP_STATE pState, } else { - /* leading spaces calculation in Clipper is broken when + /* leading spaces calculation in Clipper is broken when separate tokens are stringified, it can be quite easy checked that it will interact with translation done just before - spaces are partially inherited. @@ -3890,8 +3895,8 @@ static PHB_PP_TOKEN hb_pp_calcPrecedence( PHB_PP_TOKEN pToken, } break; case HB_PP_TOKEN_AMPERSAND: - /* It will not work because && will be stripped as comment */ *piNextPrec = HB_PP_PREC_BIT; + /* It will not work because && will be stripped as comment */ if( pNext && HB_PP_TOKEN_TYPE( pNext->type ) == HB_PP_TOKEN_AMPERSAND && pNext->spaces == 0 ) { @@ -3903,6 +3908,12 @@ static PHB_PP_TOKEN hb_pp_calcPrecedence( PHB_PP_TOKEN pToken, *piNextPrec = HB_PP_PREC_BIT; break; + case HB_PP_TOKEN_BITXOR: + case HB_PP_TOKEN_SHIFTL: + case HB_PP_TOKEN_SHIFTR: + *piNextPrec = HB_PP_PREC_BIT; + break; + /* math plus/minus */ case HB_PP_TOKEN_PLUS: case HB_PP_TOKEN_MINUS: @@ -3963,8 +3974,15 @@ static HB_LONG hb_pp_calcOperation( HB_LONG lValueLeft, HB_LONG lValueRight, lValueLeft &= lValueRight; break; case HB_PP_TOKEN_POWER: + case HB_PP_TOKEN_BITXOR: lValueLeft ^= lValueRight; break; + case HB_PP_TOKEN_SHIFTL: + lValueLeft <<= lValueRight; + break; + case HB_PP_TOKEN_SHIFTR: + lValueLeft >>= lValueRight; + break; case HB_PP_TOKEN_PLUS: lValueLeft += lValueRight; @@ -4653,9 +4671,17 @@ void hb_pp_initDynDefines( PHB_PP_STATE pState ) hb_pp_addDefine( pState, szDefine, szResult ); #endif - /* __HARBOUR__ */ +#if defined( __HARBOUR__ ) || defined( __XHARBOUR__ ) snprintf( szResult, sizeof( szResult ), "%05d", HB_MAX( ( HB_VER_MAJOR << 8 ) | HB_VER_MINOR, 1 ) ); +#ifdef __HARBOUR__ + /* __HARBOUR__ */ hb_pp_addDefine( pState, "__HARBOUR__", szResult ); +#endif +#ifdef __XHARBOUR__ + /* __XHARBOUR__ */ + hb_pp_addDefine( pState, "__XHARBOUR__", szResult ); +#endif +#endif /* __DATE__ */ hb_dateToday( &iYear, &iMonth, &iDay ); @@ -4876,7 +4902,7 @@ void hb_pp_addDefine( PHB_PP_STATE pState, char * szDefName, char * szDefValue ) { hb_pp_tokenListFree( &pMatch ); hb_pp_tokenListFree( &pResult ); - } + } else { hb_pp_defineAdd( pState, HB_PP_CMP_CASE, 0, NULL, pMatch, pResult ); @@ -4957,7 +4983,7 @@ char * hb_pp_nextLine( PHB_PP_STATE pState, ULONG * pulLen ) /* only single command in one call */ if( !pState->pTokenOut->pNext ) break; - ltype = pState->iLastType; + ltype = HB_PP_TOKEN_TYPE( pToken->type ); } if( fError ) pState->fError = TRUE; @@ -5003,7 +5029,7 @@ char * hb_pp_parseLine( PHB_PP_STATE pState, char * pLine, ULONG * pulLen ) if( pState->fError ) fError = TRUE; hb_pp_tokenStr( pToken, pState->pOutputBuffer, TRUE, TRUE, ltype ); - ltype = pState->iLastType; + ltype = HB_PP_TOKEN_TYPE( pToken->type ); } if( fError ) pState->fError = TRUE;