diff options
Diffstat (limited to '')
-rw-r--r-- | src/interfaces/ecpg/preproc/pgc.c | 453 |
1 files changed, 252 insertions, 201 deletions
diff --git a/src/interfaces/ecpg/preproc/pgc.c b/src/interfaces/ecpg/preproc/pgc.c index 7008e1f..7ba6c68 100644 --- a/src/interfaces/ecpg/preproc/pgc.c +++ b/src/interfaces/ecpg/preproc/pgc.c @@ -1796,7 +1796,14 @@ char *token_start; static int state_before_str_start; static int state_before_str_stop; -struct _yy_buffer +/* + * State for handling include files and macro expansion. We use a new + * flex input buffer for each level of include or macro, and create a + * struct _yy_buffer to remember the previous level. There is not a struct + * for the currently active input source; that state is kept in the global + * variables YY_CURRENT_BUFFER, yylineno, and input_filename. + */ +static struct _yy_buffer { YY_BUFFER_STATE buffer; long lineno; @@ -1804,8 +1811,6 @@ struct _yy_buffer struct _yy_buffer *next; } *yy_buffer = NULL; -static char *old; - /* * Vars for handling ifdef/elif/endif constructs. preproc_tos is the current * nesting depth of such constructs, and stacked_if_value[preproc_tos] is the @@ -1831,7 +1836,7 @@ static struct _if_value bool else_branch; } stacked_if_value[MAX_NESTED_IF]; -#line 1835 "pgc.c" +#line 1840 "pgc.c" #define YY_NO_INPUT 1 /* * OK, here is a short description of lex/flex rules behavior. @@ -1992,7 +1997,7 @@ static struct _if_value /* and then the other commands starting with "i", we have to add these * separately because the cppline production would match on "include" too */ -#line 1996 "pgc.c" +#line 2001 "pgc.c" #define INITIAL 0 #define xb 1 @@ -2230,16 +2235,18 @@ YY_DECL } { -#line 443 "pgc.l" +#line 448 "pgc.l" -#line 447 "pgc.l" +#line 452 "pgc.l" /* code to execute during start of each call of yylex() */ + char *newdefsymbol = NULL; + token_start = NULL; -#line 2243 "pgc.c" +#line 2250 "pgc.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { @@ -2305,7 +2312,7 @@ do_action: /* This label is used only to access EOF actions. */ case 1: /* rule 1 can match eol */ YY_RULE_SETUP -#line 452 "pgc.l" +#line 459 "pgc.l" { /* ignore */ } @@ -2314,7 +2321,7 @@ YY_RULE_SETUP case 2: YY_RULE_SETUP -#line 458 "pgc.l" +#line 465 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2329,7 +2336,7 @@ YY_RULE_SETUP case 3: YY_RULE_SETUP -#line 470 "pgc.l" +#line 477 "pgc.l" { if (state_before_str_start == SQL) { @@ -2346,7 +2353,7 @@ YY_RULE_SETUP YY_BREAK case 4: YY_RULE_SETUP -#line 484 "pgc.l" +#line 491 "pgc.l" { if (state_before_str_start == SQL) { @@ -2373,27 +2380,27 @@ YY_RULE_SETUP case 5: /* rule 5 can match eol */ YY_RULE_SETUP -#line 507 "pgc.l" +#line 514 "pgc.l" { ECHO; } YY_BREAK case 6: YY_RULE_SETUP -#line 511 "pgc.l" +#line 518 "pgc.l" { ECHO; } YY_BREAK case 7: YY_RULE_SETUP -#line 515 "pgc.l" +#line 522 "pgc.l" { ECHO; } YY_BREAK case YY_STATE_EOF(xc): -#line 519 "pgc.l" +#line 526 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated /* comment"); } @@ -2402,7 +2409,7 @@ case YY_STATE_EOF(xc): case 8: YY_RULE_SETUP -#line 525 "pgc.l" +#line 532 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2413,22 +2420,22 @@ YY_RULE_SETUP /* <SQL> */ case 9: /* rule 9 can match eol */ -#line 534 "pgc.l" +#line 541 "pgc.l" case 10: /* rule 10 can match eol */ YY_RULE_SETUP -#line 534 "pgc.l" +#line 541 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case YY_STATE_EOF(xb): -#line 537 "pgc.l" +#line 544 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated bit string literal"); } YY_BREAK case 11: YY_RULE_SETUP -#line 539 "pgc.l" +#line 546 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2437,12 +2444,12 @@ YY_RULE_SETUP } YY_BREAK case YY_STATE_EOF(xh): -#line 545 "pgc.l" +#line 552 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated hexadecimal string literal"); } YY_BREAK case 12: YY_RULE_SETUP -#line 547 "pgc.l" +#line 554 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2453,7 +2460,7 @@ YY_RULE_SETUP case 13: YY_RULE_SETUP -#line 555 "pgc.l" +#line 562 "pgc.l" { /* National character. * Transfer it as-is to the backend. @@ -2466,7 +2473,7 @@ YY_RULE_SETUP YY_BREAK case 14: YY_RULE_SETUP -#line 565 "pgc.l" +#line 572 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2476,7 +2483,7 @@ YY_RULE_SETUP YY_BREAK case 15: YY_RULE_SETUP -#line 571 "pgc.l" +#line 578 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2486,7 +2493,7 @@ YY_RULE_SETUP YY_BREAK case 16: YY_RULE_SETUP -#line 577 "pgc.l" +#line 584 "pgc.l" { token_start = yytext; state_before_str_start = YYSTATE; @@ -2497,7 +2504,7 @@ YY_RULE_SETUP /* <SQL> */ case 17: YY_RULE_SETUP -#line 585 "pgc.l" +#line 592 "pgc.l" { /* * When we are scanning a quoted string and see an end @@ -2514,7 +2521,7 @@ YY_RULE_SETUP case 18: /* rule 18 can match eol */ YY_RULE_SETUP -#line 597 "pgc.l" +#line 604 "pgc.l" { /* * Found a quote continuation, so return to the in-quote @@ -2526,13 +2533,13 @@ YY_RULE_SETUP YY_BREAK case 19: /* rule 19 can match eol */ -#line 606 "pgc.l" +#line 613 "pgc.l" case 20: /* rule 20 can match eol */ -#line 607 "pgc.l" +#line 614 "pgc.l" YY_RULE_SETUP case YY_STATE_EOF(xqs): -#line 607 "pgc.l" +#line 614 "pgc.l" { /* * Failed to see a quote continuation. Throw back @@ -2575,31 +2582,31 @@ case YY_STATE_EOF(xqs): YY_BREAK case 21: YY_RULE_SETUP -#line 647 "pgc.l" +#line 654 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 22: YY_RULE_SETUP -#line 648 "pgc.l" +#line 655 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 23: /* rule 23 can match eol */ YY_RULE_SETUP -#line 649 "pgc.l" +#line 656 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 24: /* rule 24 can match eol */ YY_RULE_SETUP -#line 650 "pgc.l" +#line 657 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 25: YY_RULE_SETUP -#line 653 "pgc.l" +#line 660 "pgc.l" { addlit(yytext, yyleng); } @@ -2607,28 +2614,28 @@ YY_RULE_SETUP case 26: /* rule 26 can match eol */ YY_RULE_SETUP -#line 656 "pgc.l" +#line 663 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 27: YY_RULE_SETUP -#line 659 "pgc.l" +#line 666 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 28: YY_RULE_SETUP -#line 662 "pgc.l" +#line 669 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 29: YY_RULE_SETUP -#line 665 "pgc.l" +#line 672 "pgc.l" { /* This is only needed for \ just before EOF */ addlitchar(yytext[0]); @@ -2639,13 +2646,13 @@ case YY_STATE_EOF(xqc): case YY_STATE_EOF(xe): case YY_STATE_EOF(xn): case YY_STATE_EOF(xus): -#line 669 "pgc.l" +#line 676 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated quoted string"); } YY_BREAK case 30: YY_RULE_SETUP -#line 672 "pgc.l" +#line 679 "pgc.l" { token_start = yytext; if (dolqstart) @@ -2658,7 +2665,7 @@ YY_RULE_SETUP YY_BREAK case 31: YY_RULE_SETUP -#line 681 "pgc.l" +#line 688 "pgc.l" { /* throw back all but the initial "$" */ yyless(1); @@ -2669,7 +2676,7 @@ YY_RULE_SETUP /* <SQL> */ case 32: YY_RULE_SETUP -#line 689 "pgc.l" +#line 696 "pgc.l" { if (strcmp(yytext, dolqstart) == 0) { @@ -2695,34 +2702,34 @@ YY_RULE_SETUP case 33: /* rule 33 can match eol */ YY_RULE_SETUP -#line 710 "pgc.l" +#line 717 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 34: YY_RULE_SETUP -#line 713 "pgc.l" +#line 720 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 35: YY_RULE_SETUP -#line 716 "pgc.l" +#line 723 "pgc.l" { /* single quote or dollar sign */ addlitchar(yytext[0]); } YY_BREAK case YY_STATE_EOF(xdolq): -#line 720 "pgc.l" +#line 727 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated dollar-quoted string"); } YY_BREAK case 36: YY_RULE_SETUP -#line 723 "pgc.l" +#line 730 "pgc.l" { state_before_str_start = YYSTATE; BEGIN(xd); @@ -2731,7 +2738,7 @@ YY_RULE_SETUP YY_BREAK case 37: YY_RULE_SETUP -#line 728 "pgc.l" +#line 735 "pgc.l" { state_before_str_start = YYSTATE; BEGIN(xui); @@ -2741,7 +2748,7 @@ YY_RULE_SETUP /* <SQL> */ case 38: YY_RULE_SETUP -#line 735 "pgc.l" +#line 742 "pgc.l" { BEGIN(state_before_str_start); if (literallen == 0) @@ -2760,7 +2767,7 @@ YY_RULE_SETUP YY_BREAK case 39: YY_RULE_SETUP -#line 750 "pgc.l" +#line 757 "pgc.l" { BEGIN(state_before_str_start); base_yylval.str = mm_strdup(literalbuf); @@ -2769,7 +2776,7 @@ YY_RULE_SETUP YY_BREAK case 40: YY_RULE_SETUP -#line 755 "pgc.l" +#line 762 "pgc.l" { BEGIN(state_before_str_start); if (literallen == 0) @@ -2781,7 +2788,7 @@ YY_RULE_SETUP YY_BREAK case 41: YY_RULE_SETUP -#line 763 "pgc.l" +#line 770 "pgc.l" { addlit(yytext, yyleng); } @@ -2789,19 +2796,19 @@ YY_RULE_SETUP case 42: /* rule 42 can match eol */ YY_RULE_SETUP -#line 766 "pgc.l" +#line 773 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case YY_STATE_EOF(xd): case YY_STATE_EOF(xui): -#line 769 "pgc.l" +#line 776 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated quoted identifier"); } YY_BREAK case 43: YY_RULE_SETUP -#line 770 "pgc.l" +#line 777 "pgc.l" { state_before_str_start = YYSTATE; BEGIN(xdc); @@ -2811,61 +2818,61 @@ YY_RULE_SETUP case 44: /* rule 44 can match eol */ YY_RULE_SETUP -#line 775 "pgc.l" +#line 782 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case YY_STATE_EOF(xdc): -#line 778 "pgc.l" +#line 785 "pgc.l" { mmfatal(PARSE_ERROR, "unterminated quoted string"); } YY_BREAK case 45: YY_RULE_SETUP -#line 781 "pgc.l" +#line 788 "pgc.l" { return TYPECAST; } YY_BREAK case 46: YY_RULE_SETUP -#line 785 "pgc.l" +#line 792 "pgc.l" { return DOT_DOT; } YY_BREAK case 47: YY_RULE_SETUP -#line 789 "pgc.l" +#line 796 "pgc.l" { return COLON_EQUALS; } YY_BREAK case 48: YY_RULE_SETUP -#line 793 "pgc.l" +#line 800 "pgc.l" { return EQUALS_GREATER; } YY_BREAK case 49: YY_RULE_SETUP -#line 797 "pgc.l" +#line 804 "pgc.l" { return LESS_EQUALS; } YY_BREAK case 50: YY_RULE_SETUP -#line 801 "pgc.l" +#line 808 "pgc.l" { return GREATER_EQUALS; } YY_BREAK case 51: YY_RULE_SETUP -#line 805 "pgc.l" +#line 812 "pgc.l" { /* We accept both "<>" and "!=" as meaning NOT_EQUALS */ return NOT_EQUALS; @@ -2873,7 +2880,7 @@ YY_RULE_SETUP YY_BREAK case 52: YY_RULE_SETUP -#line 810 "pgc.l" +#line 817 "pgc.l" { /* We accept both "<>" and "!=" as meaning NOT_EQUALS */ return NOT_EQUALS; @@ -2881,7 +2888,7 @@ YY_RULE_SETUP YY_BREAK case 53: YY_RULE_SETUP -#line 815 "pgc.l" +#line 822 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -2894,7 +2901,7 @@ YY_RULE_SETUP YY_BREAK case 54: YY_RULE_SETUP -#line 825 "pgc.l" +#line 832 "pgc.l" { /* * We may find a ';' inside a structure @@ -2908,7 +2915,7 @@ YY_RULE_SETUP YY_BREAK case 55: YY_RULE_SETUP -#line 836 "pgc.l" +#line 843 "pgc.l" { /* * Check for embedded slash-star or dash-dash; those @@ -3008,7 +3015,7 @@ YY_RULE_SETUP YY_BREAK case 56: YY_RULE_SETUP -#line 933 "pgc.l" +#line 940 "pgc.l" { base_yylval.ival = atol(yytext+1); return PARAM; @@ -3016,14 +3023,14 @@ YY_RULE_SETUP YY_BREAK case 57: YY_RULE_SETUP -#line 937 "pgc.l" +#line 944 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after parameter"); } YY_BREAK case 58: YY_RULE_SETUP -#line 941 "pgc.l" +#line 948 "pgc.l" { base_yylval.str = mm_strdup(yytext); return IP; @@ -3033,21 +3040,21 @@ YY_RULE_SETUP case 59: YY_RULE_SETUP -#line 948 "pgc.l" +#line 955 "pgc.l" { return process_integer_literal(yytext, &base_yylval, 10); } YY_BREAK case 60: YY_RULE_SETUP -#line 951 "pgc.l" +#line 958 "pgc.l" { return process_integer_literal(yytext, &base_yylval, 16); } YY_BREAK case 61: YY_RULE_SETUP -#line 954 "pgc.l" +#line 961 "pgc.l" { base_yylval.str = mm_strdup(yytext); return FCONST; @@ -3055,7 +3062,7 @@ YY_RULE_SETUP YY_BREAK case 62: YY_RULE_SETUP -#line 958 "pgc.l" +#line 965 "pgc.l" { /* throw back the .., and treat as integer */ yyless(yyleng - 2); @@ -3064,7 +3071,7 @@ YY_RULE_SETUP YY_BREAK case 63: YY_RULE_SETUP -#line 963 "pgc.l" +#line 970 "pgc.l" { base_yylval.str = mm_strdup(yytext); return FCONST; @@ -3072,7 +3079,7 @@ YY_RULE_SETUP YY_BREAK case 64: YY_RULE_SETUP -#line 967 "pgc.l" +#line 974 "pgc.l" { /* * throw back the [Ee][+-], and figure out whether what @@ -3086,14 +3093,14 @@ YY_RULE_SETUP case 65: YY_RULE_SETUP -#line 978 "pgc.l" +#line 985 "pgc.l" { return process_integer_literal(yytext, &base_yylval, 8); } YY_BREAK case 66: YY_RULE_SETUP -#line 981 "pgc.l" +#line 988 "pgc.l" { return process_integer_literal(yytext, &base_yylval, 2); } @@ -3104,42 +3111,42 @@ YY_RULE_SETUP */ case 67: YY_RULE_SETUP -#line 989 "pgc.l" +#line 996 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } YY_BREAK case 68: YY_RULE_SETUP -#line 992 "pgc.l" +#line 999 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } YY_BREAK case 69: YY_RULE_SETUP -#line 995 "pgc.l" +#line 1002 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } YY_BREAK case 70: YY_RULE_SETUP -#line 998 "pgc.l" +#line 1005 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } YY_BREAK case 71: YY_RULE_SETUP -#line 1001 "pgc.l" +#line 1008 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } YY_BREAK case 72: YY_RULE_SETUP -#line 1004 "pgc.l" +#line 1011 "pgc.l" { mmfatal(PARSE_ERROR, "trailing junk after numeric literal"); } @@ -3147,7 +3154,7 @@ YY_RULE_SETUP case 73: /* rule 73 can match eol */ YY_RULE_SETUP -#line 1008 "pgc.l" +#line 1015 "pgc.l" { base_yylval.str = mm_strdup(yytext+1); return CVARIABLE; @@ -3155,8 +3162,9 @@ YY_RULE_SETUP YY_BREAK case 74: YY_RULE_SETUP -#line 1013 "pgc.l" +#line 1020 "pgc.l" { + /* First check to see if it's a define symbol to expand */ if (!isdefine()) { int kwvalue; @@ -3195,7 +3203,7 @@ YY_RULE_SETUP YY_BREAK case 75: YY_RULE_SETUP -#line 1050 "pgc.l" +#line 1058 "pgc.l" { return yytext[0]; } @@ -3207,12 +3215,12 @@ YY_RULE_SETUP case 76: /* rule 76 can match eol */ YY_RULE_SETUP -#line 1059 "pgc.l" +#line 1067 "pgc.l" { BEGIN(SQL); return SQL_START; } YY_BREAK case 77: YY_RULE_SETUP -#line 1060 "pgc.l" +#line 1068 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3227,13 +3235,13 @@ YY_RULE_SETUP case 78: /* rule 78 can match eol */ YY_RULE_SETUP -#line 1070 "pgc.l" +#line 1078 "pgc.l" { ECHO; } YY_BREAK case 79: /* rule 79 can match eol */ YY_RULE_SETUP -#line 1071 "pgc.l" +#line 1079 "pgc.l" { if (system_includes) { @@ -3250,7 +3258,7 @@ YY_RULE_SETUP case 80: /* rule 80 can match eol */ YY_RULE_SETUP -#line 1083 "pgc.l" +#line 1091 "pgc.l" { if (system_includes) { @@ -3267,7 +3275,7 @@ YY_RULE_SETUP case 81: /* rule 81 can match eol */ YY_RULE_SETUP -#line 1095 "pgc.l" +#line 1103 "pgc.l" { base_yylval.str = mm_strdup(yytext); return CPP_LINE; @@ -3275,7 +3283,7 @@ YY_RULE_SETUP YY_BREAK case 82: YY_RULE_SETUP -#line 1099 "pgc.l" +#line 1107 "pgc.l" { /* * Try to detect a function name: @@ -3307,185 +3315,185 @@ YY_RULE_SETUP YY_BREAK case 83: YY_RULE_SETUP -#line 1127 "pgc.l" +#line 1135 "pgc.l" { mmerror(PARSE_ERROR, ET_ERROR, "nested /* ... */ comments"); } YY_BREAK case 84: YY_RULE_SETUP -#line 1128 "pgc.l" +#line 1136 "pgc.l" { return ':'; } YY_BREAK case 85: YY_RULE_SETUP -#line 1129 "pgc.l" +#line 1137 "pgc.l" { return ';'; } YY_BREAK case 86: YY_RULE_SETUP -#line 1130 "pgc.l" +#line 1138 "pgc.l" { return ','; } YY_BREAK case 87: YY_RULE_SETUP -#line 1131 "pgc.l" +#line 1139 "pgc.l" { return '*'; } YY_BREAK case 88: YY_RULE_SETUP -#line 1132 "pgc.l" +#line 1140 "pgc.l" { return '%'; } YY_BREAK case 89: YY_RULE_SETUP -#line 1133 "pgc.l" +#line 1141 "pgc.l" { return '/'; } YY_BREAK case 90: YY_RULE_SETUP -#line 1134 "pgc.l" +#line 1142 "pgc.l" { return '+'; } YY_BREAK case 91: YY_RULE_SETUP -#line 1135 "pgc.l" +#line 1143 "pgc.l" { return '-'; } YY_BREAK case 92: YY_RULE_SETUP -#line 1136 "pgc.l" +#line 1144 "pgc.l" { parenths_open++; return '('; } YY_BREAK case 93: YY_RULE_SETUP -#line 1137 "pgc.l" +#line 1145 "pgc.l" { parenths_open--; return ')'; } YY_BREAK case 94: /* rule 94 can match eol */ YY_RULE_SETUP -#line 1138 "pgc.l" +#line 1146 "pgc.l" { ECHO; } YY_BREAK case 95: YY_RULE_SETUP -#line 1139 "pgc.l" +#line 1147 "pgc.l" { return '{'; } YY_BREAK case 96: YY_RULE_SETUP -#line 1140 "pgc.l" +#line 1148 "pgc.l" { return '}'; } YY_BREAK case 97: YY_RULE_SETUP -#line 1141 "pgc.l" +#line 1149 "pgc.l" { return '['; } YY_BREAK case 98: YY_RULE_SETUP -#line 1142 "pgc.l" +#line 1150 "pgc.l" { return ']'; } YY_BREAK case 99: YY_RULE_SETUP -#line 1143 "pgc.l" +#line 1151 "pgc.l" { return '='; } YY_BREAK case 100: YY_RULE_SETUP -#line 1144 "pgc.l" +#line 1152 "pgc.l" { return S_MEMBER; } YY_BREAK case 101: YY_RULE_SETUP -#line 1145 "pgc.l" +#line 1153 "pgc.l" { return S_RSHIFT; } YY_BREAK case 102: YY_RULE_SETUP -#line 1146 "pgc.l" +#line 1154 "pgc.l" { return S_LSHIFT; } YY_BREAK case 103: YY_RULE_SETUP -#line 1147 "pgc.l" +#line 1155 "pgc.l" { return S_OR; } YY_BREAK case 104: YY_RULE_SETUP -#line 1148 "pgc.l" +#line 1156 "pgc.l" { return S_AND; } YY_BREAK case 105: YY_RULE_SETUP -#line 1149 "pgc.l" +#line 1157 "pgc.l" { return S_INC; } YY_BREAK case 106: YY_RULE_SETUP -#line 1150 "pgc.l" +#line 1158 "pgc.l" { return S_DEC; } YY_BREAK case 107: YY_RULE_SETUP -#line 1151 "pgc.l" +#line 1159 "pgc.l" { return S_EQUAL; } YY_BREAK case 108: YY_RULE_SETUP -#line 1152 "pgc.l" +#line 1160 "pgc.l" { return S_NEQUAL; } YY_BREAK case 109: YY_RULE_SETUP -#line 1153 "pgc.l" +#line 1161 "pgc.l" { return S_ADD; } YY_BREAK case 110: YY_RULE_SETUP -#line 1154 "pgc.l" +#line 1162 "pgc.l" { return S_SUB; } YY_BREAK case 111: YY_RULE_SETUP -#line 1155 "pgc.l" +#line 1163 "pgc.l" { return S_MUL; } YY_BREAK case 112: YY_RULE_SETUP -#line 1156 "pgc.l" +#line 1164 "pgc.l" { return S_DIV; } YY_BREAK case 113: YY_RULE_SETUP -#line 1157 "pgc.l" +#line 1165 "pgc.l" { return S_MOD; } YY_BREAK case 114: YY_RULE_SETUP -#line 1158 "pgc.l" +#line 1166 "pgc.l" { return S_MEMPOINT; } YY_BREAK case 115: YY_RULE_SETUP -#line 1159 "pgc.l" +#line 1167 "pgc.l" { return S_DOTPOINT; } YY_BREAK case 116: YY_RULE_SETUP -#line 1160 "pgc.l" +#line 1168 "pgc.l" { return S_ANYTHING; } YY_BREAK case 117: /* rule 117 can match eol */ YY_RULE_SETUP -#line 1161 "pgc.l" +#line 1169 "pgc.l" { BEGIN(def_ident); } YY_BREAK case 118: /* rule 118 can match eol */ YY_RULE_SETUP -#line 1162 "pgc.l" +#line 1170 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3502,13 +3510,13 @@ YY_RULE_SETUP case 119: /* rule 119 can match eol */ YY_RULE_SETUP -#line 1174 "pgc.l" +#line 1182 "pgc.l" { BEGIN(undef); } YY_BREAK case 120: /* rule 120 can match eol */ YY_RULE_SETUP -#line 1175 "pgc.l" +#line 1183 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3525,7 +3533,7 @@ YY_RULE_SETUP case 121: /* rule 121 can match eol */ YY_RULE_SETUP -#line 1187 "pgc.l" +#line 1195 "pgc.l" { struct _defines *ptr, *ptr2 = NULL; int i; @@ -3541,17 +3549,23 @@ YY_RULE_SETUP yytext[i+1] = '\0'; - for (ptr = defines; ptr != NULL; ptr2 = ptr, ptr = ptr->next) + /* Find and unset any matching define; should be only 1 */ + for (ptr = defines; ptr; ptr2 = ptr, ptr = ptr->next) { - if (strcmp(yytext, ptr->olddef) == 0) + if (strcmp(yytext, ptr->name) == 0) { - if (ptr2 == NULL) - defines = ptr->next; - else - ptr2->next = ptr->next; - free(ptr->newdef); - free(ptr->olddef); - free(ptr); + free(ptr->value); + ptr->value = NULL; + /* We cannot forget it if there's a cmdvalue */ + if (ptr->cmdvalue == NULL) + { + if (ptr2 == NULL) + defines = ptr->next; + else + ptr2->next = ptr->next; + free(ptr->name); + free(ptr); + } break; } } @@ -3562,7 +3576,7 @@ YY_RULE_SETUP case 122: /* rule 122 can match eol */ YY_RULE_SETUP -#line 1219 "pgc.l" +#line 1233 "pgc.l" { mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL UNDEF command"); yyterminate(); @@ -3571,13 +3585,13 @@ YY_RULE_SETUP case 123: /* rule 123 can match eol */ YY_RULE_SETUP -#line 1223 "pgc.l" +#line 1237 "pgc.l" { BEGIN(incl); } YY_BREAK case 124: /* rule 124 can match eol */ YY_RULE_SETUP -#line 1224 "pgc.l" +#line 1238 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3594,7 +3608,7 @@ YY_RULE_SETUP case 125: /* rule 125 can match eol */ YY_RULE_SETUP -#line 1236 "pgc.l" +#line 1250 "pgc.l" { if (preproc_tos >= MAX_NESTED_IF-1) mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions"); @@ -3609,7 +3623,7 @@ YY_RULE_SETUP case 126: /* rule 126 can match eol */ YY_RULE_SETUP -#line 1246 "pgc.l" +#line 1260 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3633,7 +3647,7 @@ YY_RULE_SETUP case 127: /* rule 127 can match eol */ YY_RULE_SETUP -#line 1265 "pgc.l" +#line 1279 "pgc.l" { if (preproc_tos >= MAX_NESTED_IF-1) mmfatal(PARSE_ERROR, "too many nested EXEC SQL IFDEF conditions"); @@ -3648,7 +3662,7 @@ YY_RULE_SETUP case 128: /* rule 128 can match eol */ YY_RULE_SETUP -#line 1275 "pgc.l" +#line 1289 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3672,7 +3686,7 @@ YY_RULE_SETUP case 129: /* rule 129 can match eol */ YY_RULE_SETUP -#line 1294 "pgc.l" +#line 1308 "pgc.l" { if (preproc_tos == 0) mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\""); @@ -3685,7 +3699,7 @@ YY_RULE_SETUP case 130: /* rule 130 can match eol */ YY_RULE_SETUP -#line 1302 "pgc.l" +#line 1316 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3707,7 +3721,7 @@ YY_RULE_SETUP case 131: /* rule 131 can match eol */ YY_RULE_SETUP -#line 1320 "pgc.l" +#line 1334 "pgc.l" { /* only exec sql endif pops the stack, so take care of duplicated 'else' */ if (preproc_tos == 0) mmfatal(PARSE_ERROR, "missing matching \"EXEC SQL IFDEF\" / \"EXEC SQL IFNDEF\""); @@ -3731,7 +3745,7 @@ YY_RULE_SETUP case 132: /* rule 132 can match eol */ YY_RULE_SETUP -#line 1339 "pgc.l" +#line 1353 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3764,7 +3778,7 @@ YY_RULE_SETUP case 133: /* rule 133 can match eol */ YY_RULE_SETUP -#line 1367 "pgc.l" +#line 1381 "pgc.l" { if (preproc_tos == 0) mmfatal(PARSE_ERROR, "unmatched EXEC SQL ENDIF"); @@ -3780,7 +3794,7 @@ YY_RULE_SETUP case 134: /* rule 134 can match eol */ YY_RULE_SETUP -#line 1378 "pgc.l" +#line 1392 "pgc.l" { /* are we simulating Informix? */ if (INFORMIX_MODE) @@ -3804,13 +3818,13 @@ YY_RULE_SETUP YY_BREAK case 135: YY_RULE_SETUP -#line 1399 "pgc.l" +#line 1413 "pgc.l" { /* ignore */ } YY_BREAK case 136: /* rule 136 can match eol */ YY_RULE_SETUP -#line 1401 "pgc.l" +#line 1415 "pgc.l" { { struct _defines *defptr; @@ -3827,11 +3841,17 @@ YY_RULE_SETUP ; yytext[i+1] = '\0'; - for (defptr = defines; - defptr != NULL && - strcmp(yytext, defptr->olddef) != 0; - defptr = defptr->next) - /* skip */ ; + /* Does a definition exist? */ + for (defptr = defines; defptr; defptr = defptr->next) + { + if (strcmp(yytext, defptr->name) == 0) + { + /* Found it, but is it currently undefined? */ + if (defptr->value == NULL) + defptr = NULL; /* pretend it's not found */ + break; + } + } this_active = (defptr ? ifcond : !ifcond); stacked_if_value[preproc_tos].active = @@ -3850,7 +3870,7 @@ YY_RULE_SETUP case 137: /* rule 137 can match eol */ YY_RULE_SETUP -#line 1437 "pgc.l" +#line 1457 "pgc.l" { mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL IFDEF command"); yyterminate(); @@ -3858,9 +3878,9 @@ YY_RULE_SETUP YY_BREAK case 138: YY_RULE_SETUP -#line 1441 "pgc.l" +#line 1461 "pgc.l" { - old = mm_strdup(yytext); + newdefsymbol = mm_strdup(yytext); BEGIN(def); startlit(); } @@ -3868,7 +3888,7 @@ YY_RULE_SETUP case 139: /* rule 139 can match eol */ YY_RULE_SETUP -#line 1446 "pgc.l" +#line 1466 "pgc.l" { mmfatal(PARSE_ERROR, "missing identifier in EXEC SQL DEFINE command"); yyterminate(); @@ -3877,28 +3897,33 @@ YY_RULE_SETUP case 140: /* rule 140 can match eol */ YY_RULE_SETUP -#line 1450 "pgc.l" +#line 1470 "pgc.l" { - struct _defines *ptr, *this; + struct _defines *ptr; + /* Does it already exist? */ for (ptr = defines; ptr != NULL; ptr = ptr->next) { - if (strcmp(old, ptr->olddef) == 0) - { - free(ptr->newdef); - ptr->newdef = mm_strdup(literalbuf); - } + if (strcmp(newdefsymbol, ptr->name) == 0) + { + free(ptr->value); + ptr->value = mm_strdup(literalbuf); + /* Don't leak newdefsymbol */ + free(newdefsymbol); + break; + } } if (ptr == NULL) { - this = (struct _defines *) mm_alloc(sizeof(struct _defines)); - - /* initial definition */ - this->olddef = old; - this->newdef = mm_strdup(literalbuf); - this->next = defines; - this->used = NULL; - defines = this; + /* Not present, make a new entry */ + ptr = (struct _defines *) mm_alloc(sizeof(struct _defines)); + + ptr->name = newdefsymbol; + ptr->value = mm_strdup(literalbuf); + ptr->cmdvalue = NULL; + ptr->used = NULL; + ptr->next = defines; + defines = ptr; } BEGIN(C); @@ -3907,31 +3932,31 @@ YY_RULE_SETUP case 141: /* rule 141 can match eol */ YY_RULE_SETUP -#line 1475 "pgc.l" +#line 1500 "pgc.l" { addlit(yytext, yyleng); } YY_BREAK case 142: /* rule 142 can match eol */ YY_RULE_SETUP -#line 1476 "pgc.l" +#line 1501 "pgc.l" { parse_include(); } YY_BREAK case 143: /* rule 143 can match eol */ YY_RULE_SETUP -#line 1477 "pgc.l" +#line 1502 "pgc.l" { parse_include(); } YY_BREAK case 144: /* rule 144 can match eol */ YY_RULE_SETUP -#line 1478 "pgc.l" +#line 1503 "pgc.l" { parse_include(); } YY_BREAK case 145: /* rule 145 can match eol */ YY_RULE_SETUP -#line 1479 "pgc.l" +#line 1504 "pgc.l" { mmfatal(PARSE_ERROR, "syntax error in EXEC SQL INCLUDE command"); yyterminate(); @@ -3946,10 +3971,11 @@ case YY_STATE_EOF(incl): case YY_STATE_EOF(def): case YY_STATE_EOF(def_ident): case YY_STATE_EOF(undef): -#line 1484 "pgc.l" +#line 1509 "pgc.l" { if (yy_buffer == NULL) { + /* No more input */ if (preproc_tos > 0) { preproc_tos = 0; @@ -3959,16 +3985,20 @@ case YY_STATE_EOF(undef): } else { + /* Revert to previous input source */ struct _yy_buffer *yb = yy_buffer; int i; struct _defines *ptr; + /* Check to see if we are exiting a macro value */ for (ptr = defines; ptr; ptr = ptr->next) + { if (ptr->used == yy_buffer) { ptr->used = NULL; - break; + break; /* there can't be multiple matches */ } + } if (yyin != NULL) fclose(yyin); @@ -3996,15 +4026,15 @@ case YY_STATE_EOF(undef): case 146: /* rule 146 can match eol */ YY_RULE_SETUP -#line 1530 "pgc.l" +#line 1560 "pgc.l" { mmfatal(PARSE_ERROR, "internal error: unreachable state; please report this to <%s>", PACKAGE_BUGREPORT); } YY_BREAK case 147: YY_RULE_SETUP -#line 1532 "pgc.l" +#line 1562 "pgc.l" YY_FATAL_ERROR( "flex scanner jammed" ); YY_BREAK -#line 4008 "pgc.c" +#line 4038 "pgc.c" case YY_END_OF_BUFFER: { @@ -5020,7 +5050,7 @@ void yyfree (void * ptr ) #define YYTABLES_NAME "yytables" -#line 1532 "pgc.l" +#line 1562 "pgc.l" /* LCOV_EXCL_STOP */ @@ -5219,15 +5249,24 @@ ecpg_isspace(char ch) return false; } -static bool isdefine(void) +/* + * If yytext matches a define symbol, begin scanning the symbol's value + * and return true + */ +static bool +isdefine(void) { struct _defines *ptr; /* is it a define? */ for (ptr = defines; ptr; ptr = ptr->next) { - if (strcmp(yytext, ptr->olddef) == 0 && ptr->used == NULL) + /* notice we do not match anything being actively expanded */ + if (strcmp(yytext, ptr->name) == 0 && + ptr->value != NULL && + ptr->used == NULL) { + /* Save state associated with the current buffer */ struct _yy_buffer *yb; yb = mm_alloc(sizeof(struct _yy_buffer)); @@ -5236,10 +5275,17 @@ static bool isdefine(void) yb->lineno = yylineno; yb->filename = mm_strdup(input_filename); yb->next = yy_buffer; + yy_buffer = yb; - ptr->used = yy_buffer = yb; + /* Mark symbol as being actively expanded */ + ptr->used = yb; - yy_scan_string(ptr->newdef); + /* + * We use yy_scan_string which will copy the value, so there's + * no need to worry about a possible undef happening while we + * are still scanning it. + */ + yy_scan_string(ptr->value); return true; } } @@ -5247,7 +5293,12 @@ static bool isdefine(void) return false; } -static bool isinformixdefine(void) +/* + * Handle replacement of INFORMIX built-in defines. This works just + * like isdefine() except for the source of the string to scan. + */ +static bool +isinformixdefine(void) { const char *new = NULL; |