X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/4896ede89ca060e3673e90fcd4a36f76517905c7..efbc95a7e4fcba4363372df34f183d7db89a85a6:/src/output.c diff --git a/src/output.c b/src/output.c index 37b15cfb..2b6842d7 100644 --- a/src/output.c +++ b/src/output.c @@ -1,6 +1,6 @@ /* Output the generated parsing program for Bison. - Copyright (C) 1984, 1986, 1989, 1992, 2000-2012 Free Software + Copyright (C) 1984, 1986, 1989, 1992, 2000-2013 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -23,7 +23,6 @@ #include #include -#include #include #include #include @@ -43,8 +42,6 @@ #include "symtab.h" #include "tables.h" -# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) - static struct obstack format_obstack; @@ -72,7 +69,7 @@ Name (char const *name, \ int i; \ int j = 1; \ \ - obstack_fgrow1 (&format_obstack, "%6d", first); \ + obstack_printf (&format_obstack, "%6d", first); \ for (i = begin; i < end; ++i) \ { \ obstack_1grow (&format_obstack, ','); \ @@ -83,24 +80,21 @@ Name (char const *name, \ } \ else \ ++j; \ - obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \ + obstack_printf (&format_obstack, "%6d", table_data[i]); \ if (table_data[i] < min) \ min = table_data[i]; \ if (max < table_data[i]) \ max = table_data[i]; \ } \ - obstack_1grow (&format_obstack, 0); \ - muscle_insert (name, obstack_finish (&format_obstack)); \ + muscle_insert (name, obstack_finish0 (&format_obstack)); \ \ lmin = min; \ lmax = max; \ /* Build `NAME_min' and `NAME_max' in the obstack. */ \ - obstack_fgrow1 (&format_obstack, "%s_min", name); \ - obstack_1grow (&format_obstack, 0); \ - MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \ - obstack_fgrow1 (&format_obstack, "%s_max", name); \ - obstack_1grow (&format_obstack, 0); \ - MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax); \ + obstack_printf (&format_obstack, "%s_min", name); \ + MUSCLE_INSERT_LONG_INT (obstack_finish0 (&format_obstack), lmin); \ + obstack_printf (&format_obstack, "%s_max", name); \ + MUSCLE_INSERT_LONG_INT (obstack_finish0 (&format_obstack), lmax); \ } GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int) @@ -111,29 +105,39 @@ GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number) GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number) -/*--------------------------------------------------------------------. -| Print to OUT a representation of STRING escaped both for C and M4. | -`--------------------------------------------------------------------*/ +/*----------------------------------------------------------------. +| Print to OUT a representation of CP quoted and escaped for M4. | +`----------------------------------------------------------------*/ static void -escaped_output (FILE *out, char const *string) +quoted_output (FILE *out, char const *cp) { - char const *p; fprintf (out, "[["); - for (p = quotearg_style (c_quoting_style, string); *p; p++) - switch (*p) + for (; *cp; cp++) + switch (*cp) { case '$': fputs ("$][", out); break; case '@': fputs ("@@", out); break; case '[': fputs ("@{", out); break; case ']': fputs ("@}", out); break; - default: fputc (*p, out); break; + default: fputc (*cp, out); break; } fprintf (out, "]]"); } +/*----------------------------------------------------------------. +| Print to OUT a representation of STRING quoted and escaped both | +| for C and M4. | +`----------------------------------------------------------------*/ + +static void +string_output (FILE *out, char const *string) +{ + quoted_output (out, quotearg_style (c_quoting_style, string)); +} + /*------------------------------------------------------------------. | Prepare the muscles related to the symbols: translate, tname, and | @@ -143,7 +147,6 @@ escaped_output (FILE *out, char const *string) static void prepare_symbols (void) { - MUSCLE_INSERT_BOOL ("token_table", token_table_flag); MUSCLE_INSERT_INT ("tokens_number", ntokens); MUSCLE_INSERT_INT ("nterms_number", nvars); MUSCLE_INSERT_INT ("symbols_number", nsyms); @@ -178,7 +181,7 @@ prepare_symbols (void) if (i) obstack_1grow (&format_obstack, ' '); - MUSCLE_OBSTACK_SGROW (&format_obstack, cp); + obstack_escape (&format_obstack, cp); free (cp); obstack_1grow (&format_obstack, ','); j += width; @@ -187,8 +190,7 @@ prepare_symbols (void) obstack_sgrow (&format_obstack, " ]b4_null["); /* Finish table and store. */ - obstack_1grow (&format_obstack, 0); - muscle_insert ("tname", obstack_finish (&format_obstack)); + muscle_insert ("tname", obstack_finish0 (&format_obstack)); } /* Output YYTOKNUM. */ @@ -282,10 +284,10 @@ prepare_states (void) static int symbol_type_name_cmp (const symbol **lhs, const symbol **rhs) { - int res = UNIQSTR_CMP((*lhs)->type_name, (*rhs)->type_name); - if (res) - return res; - return (*lhs)->number - (*rhs)->number; + int res = uniqstr_cmp ((*lhs)->type_name, (*rhs)->type_name); + if (!res) + res = (*lhs)->number - (*rhs)->number; + return res; } @@ -316,7 +318,7 @@ type_names_output (FILE *out) fputs ("m4_define([b4_type_names],\n[", out); for (i = 0; i < nsyms; /* nothing */) { - // The index of the first symbol of the current type-name. + /* The index of the first symbol of the current type-name. */ int i0 = i; fputs (i ? ",\n[" : "[", out); for (; i < nsyms && syms[i]->type_name == syms[i0]->type_name; ++i) @@ -359,7 +361,7 @@ user_actions_output (FILE *out) fprintf (out, "b4_%scase(%d, [b4_syncline(%d, ", rules[r].is_predicate ? "predicate_" : "", r + 1, rules[r].action_location.start.line); - escaped_output (out, rules[r].action_location.start.file); + string_output (out, rules[r].action_location.start.file); fprintf (out, ")\n[ %s]])\n\n", rules[r].action); } fputs ("])\n\n", out); @@ -403,21 +405,26 @@ prepare_symbol_definitions (void) const char *key; const char *value; -#define SET_KEY(Entry) \ - obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", i, Entry); \ - obstack_1grow (&format_obstack, 0); \ - key = obstack_finish (&format_obstack); +#define SET_KEY(Entry) \ + obstack_printf (&format_obstack, "symbol(%d, %s)", \ + i, Entry); \ + key = obstack_finish0 (&format_obstack); + +#define SET_KEY2(Entry, Suffix) \ + obstack_printf (&format_obstack, "symbol(%d, %s_%s)", \ + i, Entry, Suffix); \ + key = obstack_finish0 (&format_obstack); - // Whether the symbol has an identifier. + /* Whether the symbol has an identifier. */ value = symbol_id_get (sym); SET_KEY("has_id"); MUSCLE_INSERT_INT (key, !!value); - // Its identifier. + /* Its identifier. */ SET_KEY("id"); MUSCLE_INSERT_STRING (key, value ? value : ""); - // Its tag. Typically for documentation purpose. + /* Its tag. Typically for documentation purpose. */ SET_KEY("tag"); MUSCLE_INSERT_STRING (key, sym->tag); @@ -437,67 +444,35 @@ prepare_symbol_definitions (void) SET_KEY("type"); MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); -#define CODE_PROP(PropName) \ - do { \ - code_props const *p = symbol_ ## PropName ## _get (sym); \ - SET_KEY("has_" #PropName); \ - MUSCLE_INSERT_INT (key, !!p->code); \ - \ - if (p->code) \ - { \ - SET_KEY(#PropName "_file"); \ - MUSCLE_INSERT_STRING (key, p->location.start.file); \ - \ - SET_KEY(#PropName "_line"); \ - MUSCLE_INSERT_INT (key, p->location.start.line); \ - \ - SET_KEY(#PropName); \ - MUSCLE_INSERT_STRING_RAW (key, p->code); \ - } \ - } while (0) - - CODE_PROP(destructor); - CODE_PROP(printer); -#undef CODE_PROP + { + int j; + for (j = 0; j < CODE_PROPS_SIZE; ++j) + { + /* "printer", not "%printer". */ + char const *pname = code_props_type_string (j) + 1; + code_props const *p = symbol_code_props_get (sym, j); + SET_KEY2("has", pname); + MUSCLE_INSERT_INT (key, !!p->code); + + if (p->code) + { + SET_KEY2(pname, "file"); + MUSCLE_INSERT_STRING (key, p->location.start.file); + + SET_KEY2(pname, "line"); + MUSCLE_INSERT_INT (key, p->location.start.line); + + SET_KEY(pname); + MUSCLE_INSERT_STRING_RAW (key, p->code); + } + } + } +#undef SET_KEY2 #undef SET_KEY } } -/*--------------------------------------. -| Output the tokens definition to OUT. | -`--------------------------------------*/ - -static void -token_definitions_output (FILE *out) -{ - int i; - char const *sep = ""; - - fputs ("m4_define([b4_tokens], \n[", out); - for (i = 0; i < ntokens; ++i) - { - symbol *sym = symbols[i]; - int number = sym->user_token_number; - uniqstr id = symbol_id_get (sym); - - /* At this stage, if there are literal string aliases, they are - part of SYMBOLS, so we should not find their aliased symbols - here. */ - aver (number != USER_NUMBER_HAS_STRING_ALIAS); - - /* Skip error token and tokens without identifier. */ - if (sym != errtoken && id) - { - fprintf (out, "%s[[[%s]], %d]", - sep, id, number); - sep = ",\n"; - } - } - fputs ("])\n\n", out); -} - - static void prepare_actions (void) { @@ -556,10 +531,9 @@ muscles_output (FILE *out) fputs ("m4_init()\n", out); merger_output (out); symbol_numbers_output (out); - token_definitions_output (out); type_names_output (out); user_actions_output (out); - // Must be last. + /* Must be last. */ muscles_m4_output (out); } @@ -571,7 +545,6 @@ static void output_skeleton (void) { int filter_fd[2]; - char const *argv[10]; pid_t pid; /* Compute the names of the package data dir and skeleton files. */ @@ -580,8 +553,8 @@ output_skeleton (void) char *m4sugar = xconcatenated_filename (datadir, "m4sugar/m4sugar.m4", NULL); char *m4bison = xconcatenated_filename (datadir, "bison.m4", NULL); char *skel = (IS_PATH_WITH_DIR (skeleton) - ? xstrdup (skeleton) - : xconcatenated_filename (datadir, skeleton, NULL)); + ? xstrdup (skeleton) + : xconcatenated_filename (datadir, skeleton, NULL)); /* Test whether m4sugar.m4 is readable, to check for proper installation. A faulty installation can cause deadlock, so a @@ -602,6 +575,7 @@ output_skeleton (void) for details. */ { + char const *argv[10]; int i = 0; argv[i++] = m4; @@ -627,11 +601,12 @@ output_skeleton (void) argv[i++] = skel; argv[i++] = NULL; aver (i <= ARRAY_CARDINALITY (argv)); + + /* The ugly cast is because gnulib gets the const-ness wrong. */ + pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true, + true, filter_fd); } - /* The ugly cast is because gnulib gets the const-ness wrong. */ - pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true, - true, filter_fd); free (m4sugar); free (m4bison); free (skel); @@ -639,10 +614,7 @@ output_skeleton (void) if (trace_flag & trace_muscles) muscles_output (stderr); { - FILE *out = fdopen (filter_fd[1], "w"); - if (! out) - error (EXIT_FAILURE, get_errno (), - "fdopen"); + FILE *out = xfdopen (filter_fd[1], "w"); muscles_output (out); xfclose (out); } @@ -650,10 +622,7 @@ output_skeleton (void) /* Read and process m4's output. */ timevar_push (TV_M4); { - FILE *in = fdopen (filter_fd[0], "r"); - if (! in) - error (EXIT_FAILURE, get_errno (), - "fdopen"); + FILE *in = xfdopen (filter_fd[0], "r"); scan_skel (in); /* scan_skel should have read all of M4's output. Otherwise, when we close the pipe, we risk letting M4 report a broken-pipe to the @@ -679,6 +648,7 @@ prepare (void) MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser); MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen); + MUSCLE_INSERT_BOOL ("token_table_flag", token_table_flag); MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag); MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);