X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/573c1d9ff8aca759e7d01405c809b0318e2edfb2..dc2825ae898c526ea3619450112b2ea44f437151:/src/output.c diff --git a/src/output.c b/src/output.c index 609d9801..b86f4611 100644 --- a/src/output.c +++ b/src/output.c @@ -150,7 +150,7 @@ output_short_or_char_table (struct obstack *oout, if (j >= 10) { - obstack_grow_string (oout, "\n "); + obstack_sgrow (oout, "\n "); j = 1; } else @@ -161,7 +161,7 @@ output_short_or_char_table (struct obstack *oout, obstack_fgrow1 (oout, "%6d", short_table[i]); } - obstack_grow_string (oout, "\n};\n"); + obstack_sgrow (oout, "\n};\n"); } @@ -223,10 +223,18 @@ register YYLTYPE *yylsp;\n\ void output_headers (void) { - char *attrsfile_quoted = quotearg_style (c_quoting_style, attrsfile); + char *attrsfile_quoted = 0; if (semantic_parser) - fprintf (fguard, GUARDSTR, attrsfile_quoted); + { + /* FIXME: This is *buggy*. ATTRSFILE is not computed yet, since + we are waiting for the full input file to have been read to + be sure of the output file name. So basically, here, a SEGV + is guaranteed. OTOH, currently semantic parsers are not + supported. */ + attrsfile_quoted = quotearg_style (c_quoting_style, attrsfile); + obstack_fgrow1 (&guard_obstack, GUARDSTR, attrsfile_quoted); + } if (no_parser_flag) return; @@ -234,12 +242,7 @@ output_headers (void) if (semantic_parser) obstack_fgrow1 (&action_obstack, ACTSTR, attrsfile_quoted); else - obstack_grow_string (&action_obstack, ACTSTR_SIMPLE); - -/* if (semantic_parser) JF moved this below - fprintf(ftable, "#include \"%s\"\n", attrsfile); - fprintf(ftable, "#include \n\n"); -*/ + obstack_sgrow (&action_obstack, ACTSTR_SIMPLE); /* Rename certain symbols if -p was specified. */ if (spec_name_prefix) @@ -270,7 +273,7 @@ void output_trailers (void) { if (semantic_parser) - fprintf (fguard, "\n }\n}\n"); + obstack_sgrow (&guard_obstack, "\n }\n}\n"); obstack_1grow (&action_obstack, '\n'); @@ -278,9 +281,9 @@ output_trailers (void) return; if (semantic_parser) - obstack_grow_string (&action_obstack, " }\n"); + obstack_sgrow (&action_obstack, " }\n"); - obstack_grow_string (&action_obstack, "}\n"); + obstack_sgrow (&action_obstack, "}\n"); } @@ -288,7 +291,7 @@ output_trailers (void) static void output_token_translations (void) { - obstack_grow_string (&table_obstack, "\ + obstack_sgrow (&table_obstack, "\ \n\ /* YYRANSLATE(YYLEX) -- Bison token number corresponding to YYLEX. */\n"); @@ -308,7 +311,7 @@ output_token_translations (void) } else { - obstack_grow_string (&table_obstack, + obstack_sgrow (&table_obstack, "\n#define YYTRANSLATE(x) (x)\n"); } } @@ -321,7 +324,7 @@ output_gram (void) yyprhs and yyrhs are needed only for yydebug. */ /* With the no_parser option, all tables are generated */ if (!semantic_parser && !no_parser_flag) - obstack_grow_string (&table_obstack, "\n#if YYDEBUG != 0\n"); + obstack_sgrow (&table_obstack, "\n#if YYDEBUG != 0\n"); output_short_table (&table_obstack, NULL, "yyprhs", rrhs, 0, 1, nrules + 1); @@ -344,7 +347,7 @@ output_gram (void) } if (!semantic_parser && !no_parser_flag) - obstack_grow_string (&table_obstack, "\n#endif\n"); + obstack_sgrow (&table_obstack, "\n#endif\n"); } @@ -363,7 +366,7 @@ output_rule_data (void) int j; short *short_tab = NULL; - obstack_grow_string (&table_obstack, "\n\ + obstack_sgrow (&table_obstack, "\n\ #if YYDEBUG != 0\n"); output_short_table (&table_obstack, @@ -371,7 +374,7 @@ output_rule_data (void) "yyrline", rline, 0, 1, nrules + 1); - obstack_grow_string (&table_obstack, "#endif\n\n"); + obstack_sgrow (&table_obstack, "#endif\n\n"); if (token_table_flag || no_parser_flag) { @@ -385,11 +388,11 @@ output_rule_data (void) /* Output the table of symbol names. */ if (!token_table_flag && !no_parser_flag) - obstack_grow_string (&table_obstack, + obstack_sgrow (&table_obstack, "\n#if YYDEBUG != 0 || defined YYERROR_VERBOSE\n\n"); - obstack_grow_string (&table_obstack, "\ + obstack_sgrow (&table_obstack, "\ /* YYTNAME[TOKEN_NUM] -- String name of the token TOKEN_NUM. */\n"); - obstack_grow_string (&table_obstack, + obstack_sgrow (&table_obstack, "static const char *const yytname[] =\n{\n "); j = 0; @@ -413,7 +416,7 @@ output_rule_data (void) if (j + strsize > 75) { - obstack_grow_string (&table_obstack, "\n "); + obstack_sgrow (&table_obstack, "\n "); j = 2; } @@ -423,25 +426,25 @@ output_rule_data (void) if (*p == '"' || *p == '\\') obstack_fgrow1 (&table_obstack, "\\%c", *p); else if (*p == '\n') - obstack_grow_string (&table_obstack, "\\n"); + obstack_sgrow (&table_obstack, "\\n"); else if (*p == '\t') - obstack_grow_string (&table_obstack, "\\t"); + obstack_sgrow (&table_obstack, "\\t"); else if (*p == '\b') - obstack_grow_string (&table_obstack, "\\b"); + obstack_sgrow (&table_obstack, "\\b"); else if (*p < 040 || *p >= 0177) obstack_fgrow1 (&table_obstack, "\\%03o", *p); else obstack_1grow (&table_obstack, *p); } - obstack_grow_string (&table_obstack, "\", "); + obstack_sgrow (&table_obstack, "\", "); j += strsize; } /* add a NULL entry to list of tokens */ - obstack_grow_string (&table_obstack, "NULL\n};\n"); + obstack_sgrow (&table_obstack, "NULL\n};\n"); if (!token_table_flag && !no_parser_flag) - obstack_grow_string (&table_obstack, "#endif\n\n"); + obstack_sgrow (&table_obstack, "#endif\n\n"); /* Output YYTOKNUM. */ if (token_table_flag) @@ -1151,17 +1154,19 @@ output_parser (void) int c; FILE *fskel; size_t line; - const char *skeleton = NULL; int actions_dumped = 0; if (pure_parser) - obstack_grow_string (&table_obstack, "#define YYPURE 1\n\n"); + obstack_sgrow (&table_obstack, "#define YYPURE 1\n\n"); /* Loop over lines in the standard parser file. */ - if (semantic_parser) - skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY); - else - skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE); + if (!skeleton) + { + if (semantic_parser) + skeleton = skeleton_find ("BISON_HAIRY", BISON_HAIRY); + else + skeleton = skeleton_find ("BISON_SIMPLE", BISON_SIMPLE); + } fskel = xfopen (skeleton, "r"); /* Set LINE to 2, not 1: `#line LINENUM' -- Here LINENUM is a @@ -1192,13 +1197,13 @@ output_parser (void) if ((c = getc (fskel)) == 'e') line_type = sync_line; else - obstack_grow_string (&table_obstack, "#lin"); + obstack_sgrow (&table_obstack, "#lin"); else - obstack_grow_string (&table_obstack, "#li"); + obstack_sgrow (&table_obstack, "#li"); else - obstack_grow_string (&table_obstack, "#l"); + obstack_sgrow (&table_obstack, "#l"); else - obstack_grow_string (&table_obstack, "#"); + obstack_sgrow (&table_obstack, "#"); } else if (c == '%') { @@ -1214,23 +1219,23 @@ output_parser (void) if ((c = getc (fskel)) == 's') line_type = actions_line; else - obstack_grow_string (&table_obstack, "%% action"); + obstack_sgrow (&table_obstack, "%% action"); else - obstack_grow_string (&table_obstack, "%% actio"); + obstack_sgrow (&table_obstack, "%% actio"); else - obstack_grow_string (&table_obstack, "%% acti"); + obstack_sgrow (&table_obstack, "%% acti"); else - obstack_grow_string (&table_obstack, "%% act"); + obstack_sgrow (&table_obstack, "%% act"); else - obstack_grow_string (&table_obstack, "%% ac"); + obstack_sgrow (&table_obstack, "%% ac"); else - obstack_grow_string (&table_obstack, "%% a"); + obstack_sgrow (&table_obstack, "%% a"); else - obstack_grow_string (&table_obstack, "%% "); + obstack_sgrow (&table_obstack, "%% "); else - obstack_grow_string (&table_obstack, "%%"); + obstack_sgrow (&table_obstack, "%%"); else - obstack_grow_string (&table_obstack, "%"); + obstack_sgrow (&table_obstack, "%"); } switch (line_type) @@ -1322,7 +1327,7 @@ output (void) } reader_output_yylsp (&table_obstack); if (debug_flag) - obstack_grow_string (&table_obstack, "\ + obstack_sgrow (&table_obstack, "\ #ifndef YYDEBUG\n\ # define YYDEBUG 1\n\ #endif\n\ @@ -1333,10 +1338,10 @@ output (void) quotearg_style (c_quoting_style, attrsfile)); if (!no_parser_flag) - obstack_grow_string (&table_obstack, "#include \n\n"); + obstack_sgrow (&table_obstack, "#include \n\n"); /* Make "const" do nothing if not in ANSI C. */ - obstack_grow_string (&table_obstack, "\ + obstack_sgrow (&table_obstack, "\ #ifndef __cplusplus\n\ # ifndef __STDC__\n\ # define const\n\