glcpp: Refactor HASH_IF and HASH_ELIF expansion to reuse code.

This commit is contained in:
Kenneth Graunke
2010-08-04 16:10:03 -07:00
parent 046bef2357
commit 16b4eed59a
2 changed files with 142 additions and 144 deletions

View File

@@ -175,6 +175,9 @@ _active_list_pop (active_list_t *list);
int int
_active_list_contains (active_list_t *list, const char *identifier); _active_list_contains (active_list_t *list, const char *identifier);
static void
_glcpp_parser_expand_if (glcpp_parser_t *parser, int type, token_list_t *list);
static void static void
_glcpp_parser_expand_token_list (glcpp_parser_t *parser, _glcpp_parser_expand_token_list (glcpp_parser_t *parser,
token_list_t *list); token_list_t *list);
@@ -208,7 +211,7 @@ add_builtin_define(glcpp_parser_t *parser, const char *name, int value);
/* Line 189 of yacc.c */ /* Line 189 of yacc.c */
#line 212 "glcpp/glcpp-parse.c" #line 215 "glcpp/glcpp-parse.c"
/* Enabling traces. */ /* Enabling traces. */
#ifndef YYDEBUG #ifndef YYDEBUG
@@ -296,7 +299,7 @@ typedef struct YYLTYPE
/* Line 264 of yacc.c */ /* Line 264 of yacc.c */
#line 300 "glcpp/glcpp-parse.c" #line 303 "glcpp/glcpp-parse.c"
#ifdef short #ifdef short
# undef short # undef short
@@ -620,17 +623,17 @@ static const yytype_int8 yyrhs[] =
/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ /* YYRLINE[YYN] -- source line where rule number YYN was defined. */
static const yytype_uint16 yyrline[] = static const yytype_uint16 yyrline[] =
{ {
0, 169, 169, 171, 175, 178, 183, 184, 188, 191, 0, 172, 172, 174, 178, 181, 186, 187, 191, 194,
197, 200, 203, 206, 214, 226, 231, 236, 248, 259, 200, 203, 206, 209, 217, 220, 225, 230, 233, 244,
262, 265, 274, 278, 287, 292, 293, 296, 299, 302, 247, 250, 259, 263, 272, 277, 278, 281, 284, 287,
305, 308, 311, 314, 317, 320, 323, 326, 329, 332, 290, 293, 296, 299, 302, 305, 308, 311, 314, 317,
335, 338, 341, 344, 347, 350, 353, 356, 359, 365, 320, 323, 326, 329, 332, 335, 338, 341, 344, 350,
370, 378, 379, 383, 389, 390, 393, 395, 402, 406, 355, 363, 364, 368, 374, 375, 378, 380, 387, 391,
410, 415, 421, 429, 435, 443, 447, 451, 455, 459, 395, 400, 406, 414, 420, 428, 432, 436, 440, 444,
466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460,
476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470,
486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480,
496 481
}; };
#endif #endif
@@ -1781,7 +1784,7 @@ yyreduce:
case 4: case 4:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 175 "glcpp/glcpp-parse.y" #line 178 "glcpp/glcpp-parse.y"
{ {
glcpp_print(parser->output, "\n"); glcpp_print(parser->output, "\n");
;} ;}
@@ -1790,7 +1793,7 @@ yyreduce:
case 5: case 5:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 178 "glcpp/glcpp-parse.y" #line 181 "glcpp/glcpp-parse.y"
{ {
_glcpp_parser_print_expanded_token_list (parser, (yyvsp[(1) - (1)].token_list)); _glcpp_parser_print_expanded_token_list (parser, (yyvsp[(1) - (1)].token_list));
glcpp_print(parser->output, "\n"); glcpp_print(parser->output, "\n");
@@ -1801,7 +1804,7 @@ yyreduce:
case 8: case 8:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 188 "glcpp/glcpp-parse.y" #line 191 "glcpp/glcpp-parse.y"
{ {
_glcpp_parser_skip_stack_push_if (parser, & (yylsp[(1) - (3)]), (yyvsp[(2) - (3)].ival)); _glcpp_parser_skip_stack_push_if (parser, & (yylsp[(1) - (3)]), (yyvsp[(2) - (3)].ival));
;} ;}
@@ -1810,7 +1813,7 @@ yyreduce:
case 9: case 9:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 191 "glcpp/glcpp-parse.y" #line 194 "glcpp/glcpp-parse.y"
{ {
_glcpp_parser_skip_stack_change_if (parser, & (yylsp[(1) - (3)]), "elif", (yyvsp[(2) - (3)].ival)); _glcpp_parser_skip_stack_change_if (parser, & (yylsp[(1) - (3)]), "elif", (yyvsp[(2) - (3)].ival));
;} ;}
@@ -1819,7 +1822,7 @@ yyreduce:
case 10: case 10:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 197 "glcpp/glcpp-parse.y" #line 200 "glcpp/glcpp-parse.y"
{ {
_define_object_macro (parser, & (yylsp[(2) - (4)]), (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].token_list)); _define_object_macro (parser, & (yylsp[(2) - (4)]), (yyvsp[(2) - (4)].str), (yyvsp[(3) - (4)].token_list));
;} ;}
@@ -1828,7 +1831,7 @@ yyreduce:
case 11: case 11:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 200 "glcpp/glcpp-parse.y" #line 203 "glcpp/glcpp-parse.y"
{ {
_define_function_macro (parser, & (yylsp[(2) - (6)]), (yyvsp[(2) - (6)].str), NULL, (yyvsp[(5) - (6)].token_list)); _define_function_macro (parser, & (yylsp[(2) - (6)]), (yyvsp[(2) - (6)].str), NULL, (yyvsp[(5) - (6)].token_list));
;} ;}
@@ -1837,7 +1840,7 @@ yyreduce:
case 12: case 12:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 203 "glcpp/glcpp-parse.y" #line 206 "glcpp/glcpp-parse.y"
{ {
_define_function_macro (parser, & (yylsp[(2) - (7)]), (yyvsp[(2) - (7)].str), (yyvsp[(4) - (7)].string_list), (yyvsp[(6) - (7)].token_list)); _define_function_macro (parser, & (yylsp[(2) - (7)]), (yyvsp[(2) - (7)].str), (yyvsp[(4) - (7)].string_list), (yyvsp[(6) - (7)].token_list));
;} ;}
@@ -1846,7 +1849,7 @@ yyreduce:
case 13: case 13:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 206 "glcpp/glcpp-parse.y" #line 209 "glcpp/glcpp-parse.y"
{ {
macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (3)].str)); macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (3)].str));
if (macro) { if (macro) {
@@ -1860,25 +1863,16 @@ yyreduce:
case 14: case 14:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 214 "glcpp/glcpp-parse.y" #line 217 "glcpp/glcpp-parse.y"
{ {
token_list_t *expanded; _glcpp_parser_expand_if (parser, IF_EXPANDED, (yyvsp[(2) - (3)].token_list));
token_t *token;
expanded = _token_list_create (parser);
token = _token_create_ival (parser, IF_EXPANDED, IF_EXPANDED);
_token_list_append (expanded, token);
talloc_unlink (parser, token);
_glcpp_parser_expand_token_list (parser, (yyvsp[(2) - (3)].token_list));
_token_list_append_list (expanded, (yyvsp[(2) - (3)].token_list));
glcpp_parser_lex_from (parser, expanded);
;} ;}
break; break;
case 15: case 15:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 226 "glcpp/glcpp-parse.y" #line 220 "glcpp/glcpp-parse.y"
{ {
macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (4)].str)); macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (4)].str));
talloc_free ((yyvsp[(2) - (4)].str)); talloc_free ((yyvsp[(2) - (4)].str));
@@ -1889,7 +1883,7 @@ yyreduce:
case 16: case 16:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 231 "glcpp/glcpp-parse.y" #line 225 "glcpp/glcpp-parse.y"
{ {
macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (4)].str)); macro_t *macro = hash_table_find (parser->defines, (yyvsp[(2) - (4)].str));
talloc_free ((yyvsp[(2) - (4)].str)); talloc_free ((yyvsp[(2) - (4)].str));
@@ -1900,25 +1894,16 @@ yyreduce:
case 17: case 17:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 236 "glcpp/glcpp-parse.y" #line 230 "glcpp/glcpp-parse.y"
{ {
token_list_t *expanded; _glcpp_parser_expand_if (parser, ELIF_EXPANDED, (yyvsp[(2) - (3)].token_list));
token_t *token;
expanded = _token_list_create (parser);
token = _token_create_ival (parser, ELIF_EXPANDED, ELIF_EXPANDED);
_token_list_append (expanded, token);
talloc_unlink (parser, token);
_glcpp_parser_expand_token_list (parser, (yyvsp[(2) - (3)].token_list));
_token_list_append_list (expanded, (yyvsp[(2) - (3)].token_list));
glcpp_parser_lex_from (parser, expanded);
;} ;}
break; break;
case 18: case 18:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 248 "glcpp/glcpp-parse.y" #line 233 "glcpp/glcpp-parse.y"
{ {
/* #elif without an expression results in a warning if the /* #elif without an expression results in a warning if the
* condition doesn't matter (we just handled #if 1 or such) * condition doesn't matter (we just handled #if 1 or such)
@@ -1935,7 +1920,7 @@ yyreduce:
case 19: case 19:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 259 "glcpp/glcpp-parse.y" #line 244 "glcpp/glcpp-parse.y"
{ {
_glcpp_parser_skip_stack_change_if (parser, & (yylsp[(1) - (2)]), "else", 1); _glcpp_parser_skip_stack_change_if (parser, & (yylsp[(1) - (2)]), "else", 1);
;} ;}
@@ -1944,7 +1929,7 @@ yyreduce:
case 20: case 20:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 262 "glcpp/glcpp-parse.y" #line 247 "glcpp/glcpp-parse.y"
{ {
_glcpp_parser_skip_stack_pop (parser, & (yylsp[(1) - (2)])); _glcpp_parser_skip_stack_pop (parser, & (yylsp[(1) - (2)]));
;} ;}
@@ -1953,7 +1938,7 @@ yyreduce:
case 21: case 21:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 265 "glcpp/glcpp-parse.y" #line 250 "glcpp/glcpp-parse.y"
{ {
macro_t *macro = hash_table_find (parser->defines, "__VERSION__"); macro_t *macro = hash_table_find (parser->defines, "__VERSION__");
if (macro) { if (macro) {
@@ -1968,7 +1953,7 @@ yyreduce:
case 23: case 23:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 278 "glcpp/glcpp-parse.y" #line 263 "glcpp/glcpp-parse.y"
{ {
if (strlen ((yyvsp[(1) - (1)].str)) >= 3 && strncmp ((yyvsp[(1) - (1)].str), "0x", 2) == 0) { if (strlen ((yyvsp[(1) - (1)].str)) >= 3 && strncmp ((yyvsp[(1) - (1)].str), "0x", 2) == 0) {
(yyval.ival) = strtoll ((yyvsp[(1) - (1)].str) + 2, NULL, 16); (yyval.ival) = strtoll ((yyvsp[(1) - (1)].str) + 2, NULL, 16);
@@ -1983,7 +1968,7 @@ yyreduce:
case 24: case 24:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 287 "glcpp/glcpp-parse.y" #line 272 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (1)].ival); (yyval.ival) = (yyvsp[(1) - (1)].ival);
;} ;}
@@ -1992,7 +1977,7 @@ yyreduce:
case 26: case 26:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 293 "glcpp/glcpp-parse.y" #line 278 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) || (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) || (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2001,7 +1986,7 @@ yyreduce:
case 27: case 27:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 296 "glcpp/glcpp-parse.y" #line 281 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) && (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) && (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2010,7 +1995,7 @@ yyreduce:
case 28: case 28:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 299 "glcpp/glcpp-parse.y" #line 284 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) | (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) | (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2019,7 +2004,7 @@ yyreduce:
case 29: case 29:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 302 "glcpp/glcpp-parse.y" #line 287 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) ^ (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) ^ (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2028,7 +2013,7 @@ yyreduce:
case 30: case 30:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 305 "glcpp/glcpp-parse.y" #line 290 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) & (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) & (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2037,7 +2022,7 @@ yyreduce:
case 31: case 31:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 308 "glcpp/glcpp-parse.y" #line 293 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) != (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) != (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2046,7 +2031,7 @@ yyreduce:
case 32: case 32:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 311 "glcpp/glcpp-parse.y" #line 296 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) == (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) == (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2055,7 +2040,7 @@ yyreduce:
case 33: case 33:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 314 "glcpp/glcpp-parse.y" #line 299 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) >= (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) >= (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2064,7 +2049,7 @@ yyreduce:
case 34: case 34:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 317 "glcpp/glcpp-parse.y" #line 302 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) <= (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) <= (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2073,7 +2058,7 @@ yyreduce:
case 35: case 35:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 320 "glcpp/glcpp-parse.y" #line 305 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) > (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) > (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2082,7 +2067,7 @@ yyreduce:
case 36: case 36:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 323 "glcpp/glcpp-parse.y" #line 308 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) < (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) < (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2091,7 +2076,7 @@ yyreduce:
case 37: case 37:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 326 "glcpp/glcpp-parse.y" #line 311 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) >> (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) >> (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2100,7 +2085,7 @@ yyreduce:
case 38: case 38:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 329 "glcpp/glcpp-parse.y" #line 314 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) << (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) << (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2109,7 +2094,7 @@ yyreduce:
case 39: case 39:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 332 "glcpp/glcpp-parse.y" #line 317 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) - (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) - (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2118,7 +2103,7 @@ yyreduce:
case 40: case 40:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 335 "glcpp/glcpp-parse.y" #line 320 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) + (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) + (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2127,7 +2112,7 @@ yyreduce:
case 41: case 41:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 338 "glcpp/glcpp-parse.y" #line 323 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) % (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) % (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2136,7 +2121,7 @@ yyreduce:
case 42: case 42:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 341 "glcpp/glcpp-parse.y" #line 326 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) / (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) / (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2145,7 +2130,7 @@ yyreduce:
case 43: case 43:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 344 "glcpp/glcpp-parse.y" #line 329 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(1) - (3)].ival) * (yyvsp[(3) - (3)].ival); (yyval.ival) = (yyvsp[(1) - (3)].ival) * (yyvsp[(3) - (3)].ival);
;} ;}
@@ -2154,7 +2139,7 @@ yyreduce:
case 44: case 44:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 347 "glcpp/glcpp-parse.y" #line 332 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = ! (yyvsp[(2) - (2)].ival); (yyval.ival) = ! (yyvsp[(2) - (2)].ival);
;} ;}
@@ -2163,7 +2148,7 @@ yyreduce:
case 45: case 45:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 350 "glcpp/glcpp-parse.y" #line 335 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = ~ (yyvsp[(2) - (2)].ival); (yyval.ival) = ~ (yyvsp[(2) - (2)].ival);
;} ;}
@@ -2172,7 +2157,7 @@ yyreduce:
case 46: case 46:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 353 "glcpp/glcpp-parse.y" #line 338 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = - (yyvsp[(2) - (2)].ival); (yyval.ival) = - (yyvsp[(2) - (2)].ival);
;} ;}
@@ -2181,7 +2166,7 @@ yyreduce:
case 47: case 47:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 356 "glcpp/glcpp-parse.y" #line 341 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = + (yyvsp[(2) - (2)].ival); (yyval.ival) = + (yyvsp[(2) - (2)].ival);
;} ;}
@@ -2190,7 +2175,7 @@ yyreduce:
case 48: case 48:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 359 "glcpp/glcpp-parse.y" #line 344 "glcpp/glcpp-parse.y"
{ {
(yyval.ival) = (yyvsp[(2) - (3)].ival); (yyval.ival) = (yyvsp[(2) - (3)].ival);
;} ;}
@@ -2199,7 +2184,7 @@ yyreduce:
case 49: case 49:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 365 "glcpp/glcpp-parse.y" #line 350 "glcpp/glcpp-parse.y"
{ {
(yyval.string_list) = _string_list_create (parser); (yyval.string_list) = _string_list_create (parser);
_string_list_append_item ((yyval.string_list), (yyvsp[(1) - (1)].str)); _string_list_append_item ((yyval.string_list), (yyvsp[(1) - (1)].str));
@@ -2210,7 +2195,7 @@ yyreduce:
case 50: case 50:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 370 "glcpp/glcpp-parse.y" #line 355 "glcpp/glcpp-parse.y"
{ {
(yyval.string_list) = (yyvsp[(1) - (3)].string_list); (yyval.string_list) = (yyvsp[(1) - (3)].string_list);
_string_list_append_item ((yyval.string_list), (yyvsp[(3) - (3)].str)); _string_list_append_item ((yyval.string_list), (yyvsp[(3) - (3)].str));
@@ -2221,14 +2206,14 @@ yyreduce:
case 51: case 51:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 378 "glcpp/glcpp-parse.y" #line 363 "glcpp/glcpp-parse.y"
{ (yyval.token_list) = NULL; ;} { (yyval.token_list) = NULL; ;}
break; break;
case 53: case 53:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 383 "glcpp/glcpp-parse.y" #line 368 "glcpp/glcpp-parse.y"
{ {
yyerror (& (yylsp[(1) - (2)]), parser, "Invalid tokens after #"); yyerror (& (yylsp[(1) - (2)]), parser, "Invalid tokens after #");
;} ;}
@@ -2237,14 +2222,14 @@ yyreduce:
case 54: case 54:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 389 "glcpp/glcpp-parse.y" #line 374 "glcpp/glcpp-parse.y"
{ (yyval.token_list) = NULL; ;} { (yyval.token_list) = NULL; ;}
break; break;
case 57: case 57:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 395 "glcpp/glcpp-parse.y" #line 380 "glcpp/glcpp-parse.y"
{ {
glcpp_warning(&(yylsp[(1) - (1)]), parser, "extra tokens at end of directive"); glcpp_warning(&(yylsp[(1) - (1)]), parser, "extra tokens at end of directive");
;} ;}
@@ -2253,7 +2238,7 @@ yyreduce:
case 58: case 58:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 402 "glcpp/glcpp-parse.y" #line 387 "glcpp/glcpp-parse.y"
{ {
int v = hash_table_find (parser->defines, (yyvsp[(2) - (2)].str)) ? 1 : 0; int v = hash_table_find (parser->defines, (yyvsp[(2) - (2)].str)) ? 1 : 0;
(yyval.token) = _token_create_ival (parser, INTEGER, v); (yyval.token) = _token_create_ival (parser, INTEGER, v);
@@ -2263,7 +2248,7 @@ yyreduce:
case 59: case 59:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 406 "glcpp/glcpp-parse.y" #line 391 "glcpp/glcpp-parse.y"
{ {
int v = hash_table_find (parser->defines, (yyvsp[(3) - (4)].str)) ? 1 : 0; int v = hash_table_find (parser->defines, (yyvsp[(3) - (4)].str)) ? 1 : 0;
(yyval.token) = _token_create_ival (parser, INTEGER, v); (yyval.token) = _token_create_ival (parser, INTEGER, v);
@@ -2273,7 +2258,7 @@ yyreduce:
case 61: case 61:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 415 "glcpp/glcpp-parse.y" #line 400 "glcpp/glcpp-parse.y"
{ {
parser->space_tokens = 1; parser->space_tokens = 1;
(yyval.token_list) = _token_list_create (parser); (yyval.token_list) = _token_list_create (parser);
@@ -2285,7 +2270,7 @@ yyreduce:
case 62: case 62:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 421 "glcpp/glcpp-parse.y" #line 406 "glcpp/glcpp-parse.y"
{ {
(yyval.token_list) = (yyvsp[(1) - (2)].token_list); (yyval.token_list) = (yyvsp[(1) - (2)].token_list);
_token_list_append ((yyval.token_list), (yyvsp[(2) - (2)].token)); _token_list_append ((yyval.token_list), (yyvsp[(2) - (2)].token));
@@ -2296,7 +2281,7 @@ yyreduce:
case 63: case 63:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 429 "glcpp/glcpp-parse.y" #line 414 "glcpp/glcpp-parse.y"
{ {
parser->space_tokens = 1; parser->space_tokens = 1;
(yyval.token_list) = _token_list_create (parser); (yyval.token_list) = _token_list_create (parser);
@@ -2308,7 +2293,7 @@ yyreduce:
case 64: case 64:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 435 "glcpp/glcpp-parse.y" #line 420 "glcpp/glcpp-parse.y"
{ {
(yyval.token_list) = (yyvsp[(1) - (2)].token_list); (yyval.token_list) = (yyvsp[(1) - (2)].token_list);
_token_list_append ((yyval.token_list), (yyvsp[(2) - (2)].token)); _token_list_append ((yyval.token_list), (yyvsp[(2) - (2)].token));
@@ -2319,7 +2304,7 @@ yyreduce:
case 65: case 65:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 443 "glcpp/glcpp-parse.y" #line 428 "glcpp/glcpp-parse.y"
{ {
(yyval.token) = _token_create_str (parser, IDENTIFIER, (yyvsp[(1) - (1)].str)); (yyval.token) = _token_create_str (parser, IDENTIFIER, (yyvsp[(1) - (1)].str));
(yyval.token)->location = yylloc; (yyval.token)->location = yylloc;
@@ -2329,7 +2314,7 @@ yyreduce:
case 66: case 66:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 447 "glcpp/glcpp-parse.y" #line 432 "glcpp/glcpp-parse.y"
{ {
(yyval.token) = _token_create_str (parser, INTEGER_STRING, (yyvsp[(1) - (1)].str)); (yyval.token) = _token_create_str (parser, INTEGER_STRING, (yyvsp[(1) - (1)].str));
(yyval.token)->location = yylloc; (yyval.token)->location = yylloc;
@@ -2339,7 +2324,7 @@ yyreduce:
case 67: case 67:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 451 "glcpp/glcpp-parse.y" #line 436 "glcpp/glcpp-parse.y"
{ {
(yyval.token) = _token_create_ival (parser, (yyvsp[(1) - (1)].ival), (yyvsp[(1) - (1)].ival)); (yyval.token) = _token_create_ival (parser, (yyvsp[(1) - (1)].ival), (yyvsp[(1) - (1)].ival));
(yyval.token)->location = yylloc; (yyval.token)->location = yylloc;
@@ -2349,7 +2334,7 @@ yyreduce:
case 68: case 68:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 455 "glcpp/glcpp-parse.y" #line 440 "glcpp/glcpp-parse.y"
{ {
(yyval.token) = _token_create_str (parser, OTHER, (yyvsp[(1) - (1)].str)); (yyval.token) = _token_create_str (parser, OTHER, (yyvsp[(1) - (1)].str));
(yyval.token)->location = yylloc; (yyval.token)->location = yylloc;
@@ -2359,7 +2344,7 @@ yyreduce:
case 69: case 69:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 459 "glcpp/glcpp-parse.y" #line 444 "glcpp/glcpp-parse.y"
{ {
(yyval.token) = _token_create_ival (parser, SPACE, SPACE); (yyval.token) = _token_create_ival (parser, SPACE, SPACE);
(yyval.token)->location = yylloc; (yyval.token)->location = yylloc;
@@ -2369,224 +2354,224 @@ yyreduce:
case 70: case 70:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 466 "glcpp/glcpp-parse.y" #line 451 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '['; ;} { (yyval.ival) = '['; ;}
break; break;
case 71: case 71:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 467 "glcpp/glcpp-parse.y" #line 452 "glcpp/glcpp-parse.y"
{ (yyval.ival) = ']'; ;} { (yyval.ival) = ']'; ;}
break; break;
case 72: case 72:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 468 "glcpp/glcpp-parse.y" #line 453 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '('; ;} { (yyval.ival) = '('; ;}
break; break;
case 73: case 73:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 469 "glcpp/glcpp-parse.y" #line 454 "glcpp/glcpp-parse.y"
{ (yyval.ival) = ')'; ;} { (yyval.ival) = ')'; ;}
break; break;
case 74: case 74:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 470 "glcpp/glcpp-parse.y" #line 455 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '{'; ;} { (yyval.ival) = '{'; ;}
break; break;
case 75: case 75:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 471 "glcpp/glcpp-parse.y" #line 456 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '}'; ;} { (yyval.ival) = '}'; ;}
break; break;
case 76: case 76:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 472 "glcpp/glcpp-parse.y" #line 457 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '.'; ;} { (yyval.ival) = '.'; ;}
break; break;
case 77: case 77:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 473 "glcpp/glcpp-parse.y" #line 458 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '&'; ;} { (yyval.ival) = '&'; ;}
break; break;
case 78: case 78:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 474 "glcpp/glcpp-parse.y" #line 459 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '*'; ;} { (yyval.ival) = '*'; ;}
break; break;
case 79: case 79:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 475 "glcpp/glcpp-parse.y" #line 460 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '+'; ;} { (yyval.ival) = '+'; ;}
break; break;
case 80: case 80:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 476 "glcpp/glcpp-parse.y" #line 461 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '-'; ;} { (yyval.ival) = '-'; ;}
break; break;
case 81: case 81:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 477 "glcpp/glcpp-parse.y" #line 462 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '~'; ;} { (yyval.ival) = '~'; ;}
break; break;
case 82: case 82:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 478 "glcpp/glcpp-parse.y" #line 463 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '!'; ;} { (yyval.ival) = '!'; ;}
break; break;
case 83: case 83:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 479 "glcpp/glcpp-parse.y" #line 464 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '/'; ;} { (yyval.ival) = '/'; ;}
break; break;
case 84: case 84:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 480 "glcpp/glcpp-parse.y" #line 465 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '%'; ;} { (yyval.ival) = '%'; ;}
break; break;
case 85: case 85:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 481 "glcpp/glcpp-parse.y" #line 466 "glcpp/glcpp-parse.y"
{ (yyval.ival) = LEFT_SHIFT; ;} { (yyval.ival) = LEFT_SHIFT; ;}
break; break;
case 86: case 86:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 482 "glcpp/glcpp-parse.y" #line 467 "glcpp/glcpp-parse.y"
{ (yyval.ival) = RIGHT_SHIFT; ;} { (yyval.ival) = RIGHT_SHIFT; ;}
break; break;
case 87: case 87:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 483 "glcpp/glcpp-parse.y" #line 468 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '<'; ;} { (yyval.ival) = '<'; ;}
break; break;
case 88: case 88:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 484 "glcpp/glcpp-parse.y" #line 469 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '>'; ;} { (yyval.ival) = '>'; ;}
break; break;
case 89: case 89:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 485 "glcpp/glcpp-parse.y" #line 470 "glcpp/glcpp-parse.y"
{ (yyval.ival) = LESS_OR_EQUAL; ;} { (yyval.ival) = LESS_OR_EQUAL; ;}
break; break;
case 90: case 90:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 486 "glcpp/glcpp-parse.y" #line 471 "glcpp/glcpp-parse.y"
{ (yyval.ival) = GREATER_OR_EQUAL; ;} { (yyval.ival) = GREATER_OR_EQUAL; ;}
break; break;
case 91: case 91:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 487 "glcpp/glcpp-parse.y" #line 472 "glcpp/glcpp-parse.y"
{ (yyval.ival) = EQUAL; ;} { (yyval.ival) = EQUAL; ;}
break; break;
case 92: case 92:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 488 "glcpp/glcpp-parse.y" #line 473 "glcpp/glcpp-parse.y"
{ (yyval.ival) = NOT_EQUAL; ;} { (yyval.ival) = NOT_EQUAL; ;}
break; break;
case 93: case 93:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 489 "glcpp/glcpp-parse.y" #line 474 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '^'; ;} { (yyval.ival) = '^'; ;}
break; break;
case 94: case 94:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 490 "glcpp/glcpp-parse.y" #line 475 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '|'; ;} { (yyval.ival) = '|'; ;}
break; break;
case 95: case 95:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 491 "glcpp/glcpp-parse.y" #line 476 "glcpp/glcpp-parse.y"
{ (yyval.ival) = AND; ;} { (yyval.ival) = AND; ;}
break; break;
case 96: case 96:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 492 "glcpp/glcpp-parse.y" #line 477 "glcpp/glcpp-parse.y"
{ (yyval.ival) = OR; ;} { (yyval.ival) = OR; ;}
break; break;
case 97: case 97:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 493 "glcpp/glcpp-parse.y" #line 478 "glcpp/glcpp-parse.y"
{ (yyval.ival) = ';'; ;} { (yyval.ival) = ';'; ;}
break; break;
case 98: case 98:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 494 "glcpp/glcpp-parse.y" #line 479 "glcpp/glcpp-parse.y"
{ (yyval.ival) = ','; ;} { (yyval.ival) = ','; ;}
break; break;
case 99: case 99:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 495 "glcpp/glcpp-parse.y" #line 480 "glcpp/glcpp-parse.y"
{ (yyval.ival) = '='; ;} { (yyval.ival) = '='; ;}
break; break;
case 100: case 100:
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 496 "glcpp/glcpp-parse.y" #line 481 "glcpp/glcpp-parse.y"
{ (yyval.ival) = PASTE; ;} { (yyval.ival) = PASTE; ;}
break; break;
/* Line 1464 of yacc.c */ /* Line 1464 of yacc.c */
#line 2590 "glcpp/glcpp-parse.c" #line 2575 "glcpp/glcpp-parse.c"
default: break; default: break;
} }
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc); YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
@@ -2805,7 +2790,7 @@ yyreturn:
/* Line 1684 of yacc.c */ /* Line 1684 of yacc.c */
#line 499 "glcpp/glcpp-parse.y" #line 484 "glcpp/glcpp-parse.y"
string_list_t * string_list_t *
@@ -3397,6 +3382,20 @@ _token_list_create_with_one_space (void *ctx)
return list; return list;
} }
static void
_glcpp_parser_expand_if (glcpp_parser_t *parser, int type, token_list_t *list)
{
token_list_t *expanded;
token_t *token;
expanded = _token_list_create (parser);
token = _token_create_ival (parser, type, type);
_token_list_append (expanded, token);
_glcpp_parser_expand_token_list (parser, list);
_token_list_append_list (expanded, list);
glcpp_parser_lex_from (parser, expanded);
}
/* This is a helper function that's essentially part of the /* This is a helper function that's essentially part of the
* implementation of _glcpp_parser_expand_node. It shouldn't be called * implementation of _glcpp_parser_expand_node. It shouldn't be called
* except for by that function. * except for by that function.

View File

@@ -105,6 +105,9 @@ _active_list_pop (active_list_t *list);
int int
_active_list_contains (active_list_t *list, const char *identifier); _active_list_contains (active_list_t *list, const char *identifier);
static void
_glcpp_parser_expand_if (glcpp_parser_t *parser, int type, token_list_t *list);
static void static void
_glcpp_parser_expand_token_list (glcpp_parser_t *parser, _glcpp_parser_expand_token_list (glcpp_parser_t *parser,
token_list_t *list); token_list_t *list);
@@ -212,16 +215,7 @@ control_line:
talloc_free ($2); talloc_free ($2);
} }
| HASH_IF conditional_tokens NEWLINE { | HASH_IF conditional_tokens NEWLINE {
token_list_t *expanded; _glcpp_parser_expand_if (parser, IF_EXPANDED, $2);
token_t *token;
expanded = _token_list_create (parser);
token = _token_create_ival (parser, IF_EXPANDED, IF_EXPANDED);
_token_list_append (expanded, token);
talloc_unlink (parser, token);
_glcpp_parser_expand_token_list (parser, $2);
_token_list_append_list (expanded, $2);
glcpp_parser_lex_from (parser, expanded);
} }
| HASH_IFDEF IDENTIFIER junk NEWLINE { | HASH_IFDEF IDENTIFIER junk NEWLINE {
macro_t *macro = hash_table_find (parser->defines, $2); macro_t *macro = hash_table_find (parser->defines, $2);
@@ -234,16 +228,7 @@ control_line:
_glcpp_parser_skip_stack_push_if (parser, & @1, macro == NULL); _glcpp_parser_skip_stack_push_if (parser, & @1, macro == NULL);
} }
| HASH_ELIF conditional_tokens NEWLINE { | HASH_ELIF conditional_tokens NEWLINE {
token_list_t *expanded; _glcpp_parser_expand_if (parser, ELIF_EXPANDED, $2);
token_t *token;
expanded = _token_list_create (parser);
token = _token_create_ival (parser, ELIF_EXPANDED, ELIF_EXPANDED);
_token_list_append (expanded, token);
talloc_unlink (parser, token);
_glcpp_parser_expand_token_list (parser, $2);
_token_list_append_list (expanded, $2);
glcpp_parser_lex_from (parser, expanded);
} }
| HASH_ELIF NEWLINE { | HASH_ELIF NEWLINE {
/* #elif without an expression results in a warning if the /* #elif without an expression results in a warning if the
@@ -1087,6 +1072,20 @@ _token_list_create_with_one_space (void *ctx)
return list; return list;
} }
static void
_glcpp_parser_expand_if (glcpp_parser_t *parser, int type, token_list_t *list)
{
token_list_t *expanded;
token_t *token;
expanded = _token_list_create (parser);
token = _token_create_ival (parser, type, type);
_token_list_append (expanded, token);
_glcpp_parser_expand_token_list (parser, list);
_token_list_append_list (expanded, list);
glcpp_parser_lex_from (parser, expanded);
}
/* This is a helper function that's essentially part of the /* This is a helper function that's essentially part of the
* implementation of _glcpp_parser_expand_node. It shouldn't be called * implementation of _glcpp_parser_expand_node. It shouldn't be called
* except for by that function. * except for by that function.