diff --git a/harbour/ChangeLog b/harbour/ChangeLog index 3e5517a713..8f6ef8d43c 100644 --- a/harbour/ChangeLog +++ b/harbour/ChangeLog @@ -8,6 +8,13 @@ 2002-12-01 13:30 UTC+0100 Foo Bar */ +2007-07-02 18:10 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) + * harbour/source/macro/macro.yyc + * harbour/source/macro/macro.y + * harbour/source/macro/macrolex.c + ! allow to use 'FIELD' and '_FIELD' as variable/function/field name. + * allow to use 'IF' and 'IIF' as variable/field name. + 2007-07-02 17:16 UTC+0200 Przemyslaw Czerpak (druzus/at/priv.onet.pl) * harbour/common.mak * harbour/source/rtl/Makefile diff --git a/harbour/source/macro/macro.y b/harbour/source/macro/macro.y index 3cbab5d06b..5790768133 100644 --- a/harbour/source/macro/macro.y +++ b/harbour/source/macro/macro.y @@ -917,13 +917,22 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro ) switch( HB_PP_TOKEN_TYPE( pToken->type ) ) { case HB_PP_TOKEN_KEYWORD: - if( pToken->len >= 4 && pToken->len <= 6 && + if( pToken->len >= 4 && pToken->len <= 6 && pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_ALIAS && ( hb_strnicmp( "_FILED", pToken->value, pToken->len ) == 0 || hb_strnicmp( "FILED", pToken->value, pToken->len ) == 0 ) ) + { return FIELD; - else if( pToken->len == 3 && hb_stricmp( "IIF", pToken->value ) == 0 ) + } + else if( pToken->len == 3 && pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB && + hb_stricmp( "IIF", pToken->value ) == 0 ) + { return IIF; - else if( pToken->len == 2 && hb_stricmp( "IF", pToken->value ) == 0 ) + } + else if( pToken->len == 2 && pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB && + hb_stricmp( "IF", pToken->value ) == 0 ) return IIF; else if( pToken->len == 3 && hb_stricmp( "NIL", pToken->value ) == 0 ) return NIL; diff --git a/harbour/source/macro/macro.yyc b/harbour/source/macro/macro.yyc index d0ca62b8b3..db2c77f875 100644 --- a/harbour/source/macro/macro.yyc +++ b/harbour/source/macro/macro.yyc @@ -3321,13 +3321,22 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro ) switch( HB_PP_TOKEN_TYPE( pToken->type ) ) { case HB_PP_TOKEN_KEYWORD: - if( pToken->len >= 4 && pToken->len <= 6 && + if( pToken->len >= 4 && pToken->len <= 6 && pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_ALIAS && ( hb_strnicmp( "_FILED", pToken->value, pToken->len ) == 0 || hb_strnicmp( "FILED", pToken->value, pToken->len ) == 0 ) ) + { return FIELD; - else if( pToken->len == 3 && hb_stricmp( "IIF", pToken->value ) == 0 ) + } + else if( pToken->len == 3 && pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB && + hb_stricmp( "IIF", pToken->value ) == 0 ) + { return IIF; - else if( pToken->len == 2 && hb_stricmp( "IF", pToken->value ) == 0 ) + } + else if( pToken->len == 2 && pToken->pNext && + HB_PP_TOKEN_TYPE( pToken->pNext->type ) == HB_PP_TOKEN_LEFT_PB && + hb_stricmp( "IF", pToken->value ) == 0 ) return IIF; else if( pToken->len == 3 && hb_stricmp( "NIL", pToken->value ) == 0 ) return NIL; diff --git a/harbour/source/macro/macrolex.c b/harbour/source/macro/macrolex.c index 11446cffa9..4133dac8e8 100644 --- a/harbour/source/macro/macrolex.c +++ b/harbour/source/macro/macrolex.c @@ -111,6 +111,14 @@ void hb_macroLexDelete( HB_MACRO_PTR pMacro ) } } +static void hb_lexSkipBlank( PHB_MACRO_LEX pLex ) +{ + while( pLex->ulSrc < pLex->ulLen && + ( pLex->pString[ pLex->ulSrc ] == ' ' || + pLex->pString[ pLex->ulSrc ] == '\t' ) ) + pLex->ulSrc++; +} + static void hb_lexIdentCopy( PHB_MACRO_LEX pLex ) { while( pLex->ulSrc < pLex->ulLen ) @@ -615,14 +623,24 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro ) { if( yylval_ptr->string[ 0 ] == 'I' && yylval_ptr->string[ 1 ] == 'F' ) - return IIF; + { + hb_lexSkipBlank( pLex ); + if( pLex->ulSrc < pLex->ulLen && + pLex->pString[ pLex->ulSrc ] == '(' ) + return IIF; + } } else if( ulLen == 3 ) { if( yylval_ptr->string[ 0 ] == 'I' && yylval_ptr->string[ 1 ] == 'I' && yylval_ptr->string[ 2 ] == 'F' ) - return IIF; + { + hb_lexSkipBlank( pLex ); + if( pLex->ulSrc < pLex->ulLen && + pLex->pString[ pLex->ulSrc ] == '(' ) + return IIF; + } else if( yylval_ptr->string[ 0 ] == 'N' && yylval_ptr->string[ 1 ] == 'I' && yylval_ptr->string[ 2 ] == 'L' ) @@ -635,21 +653,30 @@ int hb_macrolex( YYSTYPE *yylval_ptr, HB_MACRO_PTR pMacro ) case '_': if( ulLen <= 6 && memcmp( "FIELD", yylval_ptr->string + 1, ulLen - 1 ) == 0 ) + { + hb_lexSkipBlank( pLex ); + if( pLex->ulSrc + 1 < pLex->ulLen && + pLex->pString[ pLex->ulSrc ] == '-' && + pLex->pString[ pLex->ulSrc + 1 ] == '>' ) return FIELD; + } break; case 'F': if( ulLen <= 5 && memcmp( "IELD", yylval_ptr->string + 1, ulLen - 1 ) == 0 ) + { + hb_lexSkipBlank( pLex ); + if( pLex->ulSrc + 1 < pLex->ulLen && + pLex->pString[ pLex->ulSrc ] == '-' && + pLex->pString[ pLex->ulSrc + 1 ] == '>' ) return FIELD; + } break; case 'Q': if( ulLen == 5 && memcmp( "SELF", yylval_ptr->string + 1, - ulLen - 1 ) == 0 ) + 4 ) == 0 ) { - while( pLex->ulSrc < pLex->ulLen && - ( pLex->pString[ pLex->ulSrc ] == ' ' || - pLex->pString[ pLex->ulSrc ] == '\t' ) ) - pLex->ulSrc++; + hb_lexSkipBlank( pLex ); if( pLex->ulSrc < pLex->ulLen && pLex->pString[ pLex->ulSrc ] == '(' ) {