/* * find a field expression index, this function strips _FIELD->, FIELD->, * alias-> prefixes */ HB_USHORT hb_rddFieldExpIndex( AREAP pArea, const char * szField ) { int n; while( HB_ISSPACE( *szField ) ) ++szField; if( strchr( szField, '>' ) != NULL ) { char szAlias[ HB_RDD_MAX_ALIAS_LEN + 1 ]; int i, j, l; n = 0; if( SELF_ALIAS( pArea, szAlias ) == HB_SUCCESS ) l = ( int ) strlen( szAlias ); else l = 0; /* * strip the _FIELD-> and FIELD-> prefix, it could be nested * so repeat this process until all prefixes will be removed */ do { j = n; i = 0; if( HB_ISFIRSTIDCHAR( szField[ n ] ) ) { ++i; while( HB_ISNEXTIDCHAR( szField[ n + i ] ) ) ++i; if( ! ( ( i == l && hb_strnicmp( &szField[ n ], szAlias, l ) == 0 ) ) && ! ( i >= 4 && i <= 5 && hb_strnicmp( &szField[ n ], "FIELD", i ) == 0 ) && ! ( i >= 4 && i <= 6 && hb_strnicmp( &szField[ n ], "_FIELD", i ) == 0 ) ) { i = 0; } } if( i > 0 ) { i += n; while( HB_ISSPACE( szField[ i ] ) ) i++; if( szField[ i ] == '-' && szField[ i + 1 ] == '>' ) { n = i + 2; while( szField[ n ] == ' ' ) n++; } } } while( n != j ); szField = &szField[ n ]; } return hb_rddFieldIndex( pArea, szField ); }
int hb_macro_yylex( YYSTYPE * yylval_ptr, HB_MACRO_PTR pMacro ) { PHB_MACRO_LEX pLex = ( PHB_MACRO_LEX ) pMacro->pLex; while( pLex->nSrc < pLex->nLen ) { unsigned char ch = ( unsigned char ) pLex->pString[ pLex->nSrc++ ]; switch( ch ) { case ' ': case '\t': break; case '$': case ',': case '|': case '@': case '(': case '{': pLex->quote = HB_TRUE; return ch; case ')': case '}': case ']': pLex->quote = HB_FALSE; return ch; case '#': pLex->quote = HB_TRUE; return NE1; case '!': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return NE2; } return NOT; case '<': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '>' ) { pLex->nSrc++; return NE2; } else if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return LE; } return '<'; case '>': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return GE; } return '>'; case '=': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return EQ; } else if( pLex->pString[ pLex->nSrc ] == '>' && HB_SUPPORT_HARBOUR ) { pLex->nSrc++; return HASHOP; } return '='; case '+': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '+' ) { pLex->nSrc++; return INC; } else if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return PLUSEQ; } return '+'; case '-': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '-' ) { pLex->nSrc++; return DEC; } else if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return MINUSEQ; } else if( pLex->pString[ pLex->nSrc ] == '>' ) { pLex->nSrc++; return ALIASOP; } return '-'; case '*': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '*' ) { pLex->nSrc++; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return EXPEQ; } return POWER; } else if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return MULTEQ; } return '*'; case '/': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return DIVEQ; } return '/'; case '%': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return MODEQ; } return '%'; case '^': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return EXPEQ; } return POWER; case ':': pLex->quote = HB_TRUE; if( pLex->pString[ pLex->nSrc ] == '=' ) { pLex->nSrc++; return INASSIGN; } else if( pLex->pString[ pLex->nSrc ] == ':' ) { yylval_ptr->string = "SELF"; return IDENTIFIER; } return ':'; case '.': pLex->quote = HB_TRUE; if( pLex->nSrc < pLex->nLen && HB_ISDIGIT( pLex->pString[ pLex->nSrc ] ) ) { HB_SIZE ul = pLex->nSrc; while( ++ul < pLex->nLen && HB_ISDIGIT( pLex->pString[ ul ] ) ) {}; ul -= --pLex->nSrc; return hb_lexNumConv( yylval_ptr, pLex, ul ); } if( pLex->nLen - pLex->nSrc >= 4 && pLex->pString[ pLex->nSrc + 3 ] == '.' ) { if( ( pLex->pString[ pLex->nSrc + 0 ] | ( 'a' - 'A' ) ) == 'a' && ( pLex->pString[ pLex->nSrc + 1 ] | ( 'a' - 'A' ) ) == 'n' && ( pLex->pString[ pLex->nSrc + 2 ] | ( 'a' - 'A' ) ) == 'd' ) { pLex->nSrc += 4; return AND; } if( ( pLex->pString[ pLex->nSrc + 0 ] | ( 'a' - 'A' ) ) == 'n' && ( pLex->pString[ pLex->nSrc + 1 ] | ( 'a' - 'A' ) ) == 'o' && ( pLex->pString[ pLex->nSrc + 2 ] | ( 'a' - 'A' ) ) == 't' ) { pLex->nSrc += 4; return NOT; } } if( pLex->nLen - pLex->nSrc >= 3 && pLex->pString[ pLex->nSrc + 2 ] == '.' ) { if( ( pLex->pString[ pLex->nSrc + 0 ] | ( 'a' - 'A' ) ) == 'o' && ( pLex->pString[ pLex->nSrc + 1 ] | ( 'a' - 'A' ) ) == 'r' ) { pLex->nSrc += 3; return OR; } } if( pLex->nLen - pLex->nSrc >= 2 && pLex->pString[ pLex->nSrc + 1 ] == '.' ) { if( ( pLex->pString[ pLex->nSrc ] | ( 'a' - 'A' ) ) == 't' || ( pLex->pString[ pLex->nSrc ] | ( 'a' - 'A' ) ) == 'y' ) { pLex->quote = HB_FALSE; pLex->nSrc += 2; return TRUEVALUE; } if( ( pLex->pString[ pLex->nSrc ] | ( 'a' - 'A' ) ) == 'f' || ( pLex->pString[ pLex->nSrc ] | ( 'a' - 'A' ) ) == 'n' ) { pLex->quote = HB_FALSE; pLex->nSrc += 2; return FALSEVALUE; } if( pLex->pString[ pLex->nSrc ] == '.' ) { pLex->nSrc += 2; return EPSILON; } } return '.'; case '[': if( pLex->quote ) return hb_lexStringCopy( yylval_ptr, pMacro, pLex, ']' ); pLex->quote = HB_TRUE; return '['; case '`': case '\'': return hb_lexStringCopy( yylval_ptr, pMacro, pLex, '\'' ); case '"': return hb_lexStringCopy( yylval_ptr, pMacro, pLex, '"' ); case '&': if( pLex->nSrc < pLex->nLen ) { if( HB_ISFIRSTIDCHAR( pLex->pString[ pLex->nSrc ] ) ) { /* [&<keyword>[.[<nextidchars>]]]+ */ int iParts = 0; pLex->quote = HB_FALSE; yylval_ptr->string = pLex->pDst; pLex->nSrc--; do { ++iParts; *pLex->pDst++ = '&'; pLex->nSrc++; hb_lexIdentCopy( pLex ); if( pLex->pString[ pLex->nSrc ] == '.' ) { ++iParts; *pLex->pDst++ = '.'; pLex->nSrc++; hb_lexIdentCopy( pLex ); } } while( pLex->nLen - pLex->nSrc > 1 && pLex->pString[ pLex->nSrc ] == '&' && HB_ISFIRSTIDCHAR( pLex->pString[ pLex->nSrc + 1 ] ) ); if( iParts == 2 && *( pLex->pDst - 1 ) == '.' ) { pLex->pDst--; iParts = 1; } *pLex->pDst++ = '\0'; if( iParts == 1 ) { yylval_ptr->string++; if( pLex->pDst - yylval_ptr->string > HB_SYMBOL_NAME_LEN + 1 ) ( ( char * ) yylval_ptr->string )[ HB_SYMBOL_NAME_LEN ] = '\0'; return MACROVAR; } return MACROTEXT; } else if( pLex->pString[ pLex->nSrc ] == '\'' || pLex->pString[ pLex->nSrc ] == '"' || pLex->pString[ pLex->nSrc ] == '[' ) hb_macroError( EG_SYNTAX, pMacro ); } pLex->quote = HB_TRUE; return '&'; default: if( HB_ISDIGIT( ch ) ) { HB_SIZE n = pLex->nSrc; pLex->quote = HB_FALSE; if( ch == '0' && n < pLex->nLen ) { if( pLex->pString[ n ] == 'd' || pLex->pString[ n ] == 'D' ) { while( ++n < pLex->nLen && HB_ISDIGIT( pLex->pString[ n ] ) ) {}; if( n - pLex->nSrc == 9 ) { int year, month, day; hb_dateStrGet( pLex->pString + pLex->nSrc + 1, &year, &month, &day ); yylval_ptr->valLong.lNumber = hb_dateEncode( year, month, day ); pLex->nSrc = n; if( yylval_ptr->valLong.lNumber == 0 && ( year != 0 || month != 0 || day != 0 ) ) { hb_macroError( EG_SYNTAX, pMacro ); } return NUM_DATE; } else if( n - pLex->nSrc == 2 && pLex->pString[ pLex->nSrc + 1 ] == '0' ) { yylval_ptr->valLong.lNumber = 0; return NUM_DATE; } n = pLex->nSrc; } else if( pLex->pString[ n ] == 'x' || pLex->pString[ n ] == 'X' ) { while( ++n < pLex->nLen && HB_ISXDIGIT( pLex->pString[ n ] ) ) {}; if( n == pLex->nSrc + 1 ) --n; } else { while( n < pLex->nLen && HB_ISDIGIT( pLex->pString[ n ] ) ) ++n; if( pLex->nLen - n > 1 && pLex->pString[ n ] == '.' && HB_ISDIGIT( pLex->pString[ n + 1 ] ) ) { while( ++n < pLex->nLen && HB_ISDIGIT( pLex->pString[ n ] ) ) {}; } } } else { while( n < pLex->nLen && HB_ISDIGIT( pLex->pString[ n ] ) ) ++n; if( pLex->nLen - n > 1 && pLex->pString[ n ] == '.' && HB_ISDIGIT( pLex->pString[ n + 1 ] ) ) { while( ++n < pLex->nLen && HB_ISDIGIT( pLex->pString[ n ] ) ) {}; } } n -= --pLex->nSrc; return hb_lexNumConv( yylval_ptr, pLex, n ); } else if( HB_ISFIRSTIDCHAR( ch ) ) { HB_SIZE nLen; pLex->quote = HB_FALSE; yylval_ptr->string = pLex->pDst; *pLex->pDst++ = ch - ( ( ch >= 'a' && ch <= 'z' ) ? 'a' - 'A' : 0 ); hb_lexIdentCopy( pLex ); if( pLex->nLen - pLex->nSrc > 1 && pLex->pString[ pLex->nSrc ] == '&' && HB_ISFIRSTIDCHAR( pLex->pString[ pLex->nSrc + 1 ] ) ) { /* [<keyword>][&<keyword>[.[<nextidchars>]]]+ */ do { *pLex->pDst++ = '&'; pLex->nSrc++; hb_lexIdentCopy( pLex ); if( pLex->pString[ pLex->nSrc ] == '.' ) { *pLex->pDst++ = '.'; pLex->nSrc++; hb_lexIdentCopy( pLex ); } } while( pLex->nLen - pLex->nSrc > 1 && pLex->pString[ pLex->nSrc ] == '&' && HB_ISFIRSTIDCHAR( pLex->pString[ pLex->nSrc + 1 ] ) ); *pLex->pDst++ = '\0'; return MACROTEXT; } nLen = pLex->pDst - yylval_ptr->string; *pLex->pDst++ = '\0'; if( nLen == 1 ) { if( pLex->nLen > pLex->nSrc && pLex->pString[ pLex->nSrc ] == '"' ) { switch( yylval_ptr->string[ 0 ] ) { case 'E': pLex->nSrc++; return hb_lexStringExtCopy( yylval_ptr, pMacro, pLex ); case 'T': pLex->nSrc++; return hb_lexTimestampGet( yylval_ptr, pMacro, pLex ); case 'D': pLex->nSrc++; return hb_lexDateGet( yylval_ptr, pMacro, pLex ); } } } else if( nLen == 2 ) { if( yylval_ptr->string[ 0 ] == 'I' && yylval_ptr->string[ 1 ] == 'F' ) { hb_lexSkipBlank( pLex ); if( pLex->nSrc < pLex->nLen && pLex->pString[ pLex->nSrc ] == '(' ) return IIF; } } else if( nLen == 3 ) { if( yylval_ptr->string[ 0 ] == 'I' && yylval_ptr->string[ 1 ] == 'I' && yylval_ptr->string[ 2 ] == 'F' ) { hb_lexSkipBlank( pLex ); if( pLex->nSrc < pLex->nLen && pLex->pString[ pLex->nSrc ] == '(' ) return IIF; } else if( yylval_ptr->string[ 0 ] == 'N' && yylval_ptr->string[ 1 ] == 'I' && yylval_ptr->string[ 2 ] == 'L' ) return NIL; } else /* nLen >= 4 */ { switch( yylval_ptr->string[ 0 ] ) { case '_': if( nLen <= 6 && memcmp( "FIELD", yylval_ptr->string + 1, nLen - 1 ) == 0 ) { hb_lexSkipBlank( pLex ); if( pLex->nSrc + 1 < pLex->nLen && pLex->pString[ pLex->nSrc ] == '-' && pLex->pString[ pLex->nSrc + 1 ] == '>' ) return FIELD; } break; case 'F': if( nLen <= 5 && memcmp( "IELD", yylval_ptr->string + 1, nLen - 1 ) == 0 ) { hb_lexSkipBlank( pLex ); if( pLex->nSrc + 1 < pLex->nLen && pLex->pString[ pLex->nSrc ] == '-' && pLex->pString[ pLex->nSrc + 1 ] == '>' ) return FIELD; } break; case 'Q': if( nLen == 5 && memcmp( "SELF", yylval_ptr->string + 1, 4 ) == 0 ) { hb_lexSkipBlank( pLex ); if( pLex->nSrc < pLex->nLen && pLex->pString[ pLex->nSrc ] == '(' ) { HB_SIZE n = pLex->nSrc; while( ++n < pLex->nLen ) { if( pLex->pString[ n ] == ')' ) { pLex->nSrc = n + 1; return SELF; } else if( pLex->pString[ n ] != ' ' && pLex->pString[ n ] != '\t' ) break; } } } break; } if( pLex->pDst - yylval_ptr->string > HB_SYMBOL_NAME_LEN + 1 ) ( ( char * ) yylval_ptr->string )[ HB_SYMBOL_NAME_LEN ] = '\0'; } return IDENTIFIER; } return ch; } } return 0; }