X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/945e396c8a4fcaa24f2445766a7098bf3c60f904..9ca7f077a0a5ecdd00c5945c7a7bd3cf46e23c13:/src/output.c diff --git a/src/output.c b/src/output.c index b30fe4b9..1a1d7b3a 100644 --- a/src/output.c +++ b/src/output.c @@ -5,20 +5,18 @@ This file is part of Bison, the GNU Compiler Compiler. - Bison is free software; you can redistribute it and/or modify it - under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2, or (at your option) - any later version. + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. - Bison is distributed in the hope that it will be useful, but - WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - General Public License for more details. + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with Bison; see the file COPYING. If not, write to the Free - Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA - 02110-1301, USA. */ + along with this program. If not, see . */ #include #include "system.h" @@ -373,70 +371,41 @@ token_definitions_output (FILE *out) } -/*---------------------------------------. -| Output the symbol destructors to OUT. | -`---------------------------------------*/ +/*---------------------------------------------------. +| Output the symbol destructors or printers to OUT. | +`---------------------------------------------------*/ static void -symbol_destructors_output (FILE *out) +symbol_code_props_output (FILE *out, char const *what, + code_props const *(*get)(symbol const *)) { int i; char const *sep = ""; - fputs ("m4_define([b4_symbol_destructors], \n[", out); + fputs ("m4_define([b4_symbol_", out); + fputs (what, out); + fputs ("], \n[", out); for (i = 0; i < nsyms; ++i) - if (symbol_destructor_get (symbols[i])) - { - symbol *sym = symbols[i]; - - /* Filename, lineno, - Symbol-name, Symbol-number, - destructor, optional typename. */ - fprintf (out, "%s[", sep); - sep = ",\n"; - escaped_output (out, symbol_destructor_location_get (sym).start.file); - fprintf (out, ", %d, ", - symbol_destructor_location_get (sym).start.line); - escaped_output (out, sym->tag); - fprintf (out, ", %d, [[%s]]", sym->number, - symbol_destructor_get (sym)); - if (sym->type_name) - fprintf (out, ", [[%s]]", sym->type_name); - fputc (']', out); - } - fputs ("])\n\n", out); -} - - -/*------------------------------------. -| Output the symbol printers to OUT. | -`------------------------------------*/ - -static void -symbol_printers_output (FILE *out) -{ - int i; - char const *sep = ""; - - fputs ("m4_define([b4_symbol_printers], \n[", out); - for (i = 0; i < nsyms; ++i) - if (symbol_printer_get (symbols[i])) - { - symbol *sym = symbols[i]; - - /* Filename, lineno, - Symbol-name, Symbol-number, - printer, optional typename. */ - fprintf (out, "%s[", sep); - sep = ",\n"; - escaped_output (out, symbol_printer_location_get (sym).start.file); - fprintf (out, ", %d, ", symbol_printer_location_get (sym).start.line); - escaped_output (out, sym->tag); - fprintf (out, ", %d, [[%s]]", sym->number, symbol_printer_get (sym)); - if (sym->type_name) - fprintf (out, ", [[%s]]", sym->type_name); - fputc (']', out); - } + { + symbol *sym = symbols[i]; + char const *code = (*get) (sym)->code; + if (code) + { + location loc = (*get) (sym)->location; + /* Filename, lineno, + Symbol-name, Symbol-number, + code, optional typename. */ + fprintf (out, "%s[", sep); + sep = ",\n"; + escaped_output (out, loc.start.file); + fprintf (out, ", %d, ", loc.start.line); + escaped_output (out, sym->tag); + fprintf (out, ", %d, [[%s]]", sym->number, code); + if (sym->type_name) + fprintf (out, ", [[%s]]", sym->type_name); + fputc (']', out); + } + } fputs ("])\n\n", out); } @@ -513,7 +482,7 @@ output_skeleton (void) char *full_skeleton; char const *p; char const *m4 = (p = getenv ("M4")) ? p : M4; - char const *pkgdatadir = (p = getenv ("BISON_PKGDATADIR")) ? p : PKGDATADIR; + char const *pkgdatadir = compute_pkgdatadir (); size_t skeleton_size = strlen (skeleton) + 1; size_t pkgdatadirlen = strlen (pkgdatadir); while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/') @@ -521,13 +490,16 @@ output_skeleton (void) full_skeleton = xmalloc (pkgdatadirlen + 1 + (skeleton_size < sizeof m4sugar ? sizeof m4sugar : skeleton_size)); - strcpy (full_skeleton, pkgdatadir); + strncpy (full_skeleton, pkgdatadir, pkgdatadirlen); full_skeleton[pkgdatadirlen] = '/'; strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar); full_m4sugar = xstrdup (full_skeleton); strcpy (full_skeleton + pkgdatadirlen + 1, m4bison); full_m4bison = xstrdup (full_skeleton); - strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); + if (strchr (skeleton, '/')) + strcpy (full_skeleton, skeleton); + else + strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); xfclose (xfopen (full_m4sugar, "r")); /* Create an m4 subprocess connected to us via two pipes. */ @@ -561,13 +533,10 @@ output_skeleton (void) user_actions_output (out); merger_output (out); token_definitions_output (out); - symbol_destructors_output (out); - symbol_printers_output (out); + symbol_code_props_output (out, "destructors", &symbol_destructor_get); + symbol_code_props_output (out, "printers", &symbol_printer_get); muscles_m4_output (out); - - fputs ("m4_wrap([m4_divert_pop(0)])\n", out); - fputs ("m4_divert_push(0)dnl\n", out); xfclose (out); /* Read and process m4's output. */ @@ -602,12 +571,9 @@ prepare (void) MUSCLE_INSERT_BOOL ("glr_flag", glr_parser); MUSCLE_INSERT_BOOL ("locations_flag", locations_flag); MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser); - MUSCLE_INSERT_BOOL ("pull_flag", pull_parser); - MUSCLE_INSERT_BOOL ("pure_flag", pure_parser); - MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag); - MUSCLE_INSERT_BOOL ("push_flag", push_parser); MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen); + MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag); MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag); /* File names. */ @@ -627,12 +593,6 @@ prepare (void) DEFINE (spec_verbose_file); #undef DEFINE - /* User Code. */ - obstack_1grow (&pre_prologue_obstack, 0); - obstack_1grow (&post_prologue_obstack, 0); - muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack)); - muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack)); - /* Find the right skeleton file, and add muscles about the skeletons. */ if (skeleton) MUSCLE_INSERT_C_STRING ("skeleton", skeleton); @@ -641,12 +601,10 @@ prepare (void) /* About the skeletons. */ { - char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs would never be expanded. Hopefully no one has M4-special characters in his Bison installation path. */ - MUSCLE_INSERT_STRING_RAW ("pkgdatadir", - pkgdatadir ? pkgdatadir : PKGDATADIR); + MUSCLE_INSERT_STRING_RAW ("pkgdatadir", compute_pkgdatadir ()); } } @@ -671,6 +629,11 @@ output (void) output_skeleton (); obstack_free (&format_obstack, NULL); - obstack_free (&pre_prologue_obstack, NULL); - obstack_free (&post_prologue_obstack, NULL); +} + +char const * +compute_pkgdatadir (void) +{ + char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); + return pkgdatadir ? pkgdatadir : PKGDATADIR; }