X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/76290368d48b584808a120dfbd415be93aef04f6..9ca7f077a0a5ecdd00c5945c7a7bd3cf46e23c13:/src/output.c
diff --git a/src/output.c b/src/output.c
index 70be1b9d..1a1d7b3a 100644
--- a/src/output.c
+++ b/src/output.c
@@ -1,24 +1,22 @@
/* Output the generated parsing program for Bison.
Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004,
- 2005, 2006 Free Software Foundation, Inc.
+ 2005, 2006, 2007 Free Software Foundation, Inc.
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,13 +371,13 @@ token_definitions_output (FILE *out)
}
-/*----------------------------------------------------.
-| Output the symbol destructors and printers to OUT. |
-`----------------------------------------------------*/
+/*---------------------------------------------------.
+| Output the symbol destructors or printers to OUT. |
+`---------------------------------------------------*/
static void
symbol_code_props_output (FILE *out, char const *what,
- code_props (*get)(symbol *))
+ code_props const *(*get)(symbol const *))
{
int i;
char const *sep = "";
@@ -390,10 +388,10 @@ symbol_code_props_output (FILE *out, char const *what,
for (i = 0; i < nsyms; ++i)
{
symbol *sym = symbols[i];
- char const *code = code_props_code_get ((*get) (sym));
+ char const *code = (*get) (sym)->code;
if (code)
{
- location loc = code_props_location_get ((*get) (sym));
+ location loc = (*get) (sym)->location;
/* Filename, lineno,
Symbol-name, Symbol-number,
code, optional typename. */
@@ -484,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] == '/')
@@ -492,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. */
@@ -536,9 +537,6 @@ output_skeleton (void)
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. */
@@ -557,6 +555,15 @@ output_skeleton (void)
static void
prepare (void)
{
+ /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented
+ for the user. */
+ char const *use_push_for_pull_env = getenv ("BISON_USE_PUSH_FOR_PULL");
+ bool use_push_for_pull_flag = false;
+ if (use_push_for_pull_env != NULL
+ && use_push_for_pull_env[0] != '\0'
+ && 0 != strcmp (use_push_for_pull_env, "0"))
+ use_push_for_pull_flag = true;
+
/* Flags. */
MUSCLE_INSERT_BOOL ("debug_flag", debug_flag);
MUSCLE_INSERT_BOOL ("defines_flag", defines_flag);
@@ -564,16 +571,17 @@ 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 ("pure_flag", pure_parser);
- 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. */
if (spec_name_prefix)
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
+ MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext);
+
#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
DEFINE (dir_prefix);
DEFINE (parser_file_name);
@@ -585,26 +593,18 @@ 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. */
- if (!skeleton)
- {
- if (glr_parser || nondeterministic_parser)
- skeleton = "glr.c";
- else
- skeleton = "yacc.c";
- }
+ /* Find the right skeleton file, and add muscles about the skeletons. */
+ if (skeleton)
+ MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
+ else
+ skeleton = language->skeleton;
- /* About the skeletons. */
+ /* About the skeletons. */
{
- char const *pkgdatadir = getenv ("BISON_PKGDATADIR");
- MUSCLE_INSERT_STRING ("pkgdatadir", pkgdatadir ? pkgdatadir : PKGDATADIR);
- MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
+ /* 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", compute_pkgdatadir ());
}
}
@@ -629,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;
}