X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/6687da3425189eb988f527931cec4d4cfb5fd32e..0bfe22b6d523a359fb2ac8892c6acf85342b54f6:/src/output.c diff --git a/src/output.c b/src/output.c index 26a6e7fe..5eafb2e3 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. @@ -69,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, ','); \ @@ -80,57 +80,63 @@ 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); \ + /* Build 'NAME_min' and 'NAME_max' in the obstack. */ \ + 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) -GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int) -GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_number) -GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number) -GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number) -GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number) +GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_unsigned_int_table, unsigned int) +GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_int_table, int) +GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_base_table, base_number) +GENERATE_MUSCLE_INSERT_TABLE (muscle_insert_rule_number_table, rule_number) +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 | @@ -174,7 +180,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; @@ -183,8 +189,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. */ @@ -221,7 +226,7 @@ prepare_rules (void) /* LHS of the rule R. */ r1[r] = rules[r].lhs->number; /* Length of rule R's RHS. */ - r2[r] = rule_rhs_length(&rules[r]); + r2[r] = rule_rhs_length (&rules[r]); /* Line where rule was defined. */ rline[r] = rules[r].location.start.line; /* Dynamic precedence (GLR). */ @@ -278,10 +283,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; } @@ -312,7 +317,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) @@ -355,7 +360,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); @@ -400,44 +405,42 @@ prepare_symbol_definitions (void) const char *value; #define SET_KEY(Entry) \ - obstack_fgrow2 (&format_obstack, "symbol(%d, %s)", \ + obstack_printf (&format_obstack, "symbol(%d, %s)", \ i, Entry); \ - obstack_1grow (&format_obstack, 0); \ - key = obstack_finish (&format_obstack); + key = obstack_finish0 (&format_obstack); #define SET_KEY2(Entry, Suffix) \ - obstack_fgrow3 (&format_obstack, "symbol(%d, %s_%s)", \ + obstack_printf (&format_obstack, "symbol(%d, %s_%s)", \ i, Entry, Suffix); \ - obstack_1grow (&format_obstack, 0); \ - key = obstack_finish (&format_obstack); + 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"); + SET_KEY ("has_id"); MUSCLE_INSERT_INT (key, !!value); - // Its identifier. - SET_KEY("id"); + /* Its identifier. */ + SET_KEY ("id"); MUSCLE_INSERT_STRING (key, value ? value : ""); - // Its tag. Typically for documentation purpose. - SET_KEY("tag"); + /* Its tag. Typically for documentation purpose. */ + SET_KEY ("tag"); MUSCLE_INSERT_STRING (key, sym->tag); - SET_KEY("user_number"); + SET_KEY ("user_number"); MUSCLE_INSERT_INT (key, sym->user_token_number); - SET_KEY("is_token"); + SET_KEY ("is_token"); MUSCLE_INSERT_INT (key, i < ntokens && sym != errtoken && sym != undeftoken); - SET_KEY("number"); + SET_KEY ("number"); MUSCLE_INSERT_INT (key, sym->number); - SET_KEY("has_type"); + SET_KEY ("has_type"); MUSCLE_INSERT_INT (key, !!sym->type_name); - SET_KEY("type"); + SET_KEY ("type"); MUSCLE_INSERT_STRING (key, sym->type_name ? sym->type_name : ""); { @@ -447,18 +450,18 @@ prepare_symbol_definitions (void) /* "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); + SET_KEY2 ("has", pname); MUSCLE_INSERT_INT (key, !!p->code); if (p->code) { - SET_KEY2(pname, "file"); + SET_KEY2 (pname, "file"); MUSCLE_INSERT_STRING (key, p->location.start.file); - SET_KEY2(pname, "line"); + SET_KEY2 (pname, "line"); MUSCLE_INSERT_INT (key, p->location.start.line); - SET_KEY(pname); + SET_KEY (pname); MUSCLE_INSERT_STRING_RAW (key, p->code); } } @@ -529,7 +532,7 @@ muscles_output (FILE *out) symbol_numbers_output (out); type_names_output (out); user_actions_output (out); - // Must be last. + /* Must be last. */ muscles_m4_output (out); }