X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/28126202a52cda40411bc33ed795ceb4cfdd302d..ccdc1577ef7fb32a5e30cb655337e7cd42b98987:/src/output.c?ds=sidebyside diff --git a/src/output.c b/src/output.c index cbe6d401..d6560970 100644 --- a/src/output.c +++ b/src/output.c @@ -21,8 +21,9 @@ #include #include "system.h" +#include #include -#include +#include #include #include #include @@ -41,8 +42,6 @@ #include "symtab.h" #include "tables.h" -# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) - static struct obstack format_obstack; @@ -141,7 +140,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); @@ -401,9 +399,16 @@ 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); \ +#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_KEY2(Entry, Suffix) \ + obstack_fgrow3 (&format_obstack, "symbol(%d, %s_%s)", \ + i, Entry, Suffix); \ + obstack_1grow (&format_obstack, 0); \ key = obstack_finish (&format_obstack); // Whether the symbol has an identifier. @@ -435,28 +440,30 @@ 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 } } @@ -568,48 +575,28 @@ muscles_output (FILE *out) static void output_skeleton (void) { - FILE *in; int filter_fd[2]; - char const *argv[10]; pid_t pid; /* Compute the names of the package data dir and skeleton files. */ - char const m4sugar[] = "m4sugar/m4sugar.m4"; - char const m4bison[] = "bison.m4"; - char *full_m4sugar; - char *full_m4bison; - char *full_skeleton; - char const *p; - char const *m4 = (p = getenv ("M4")) ? p : M4; - char const *pkgdatadir = compute_pkgdatadir (); - size_t skeleton_size = strlen (skeleton) + 1; - size_t pkgdatadirlen = strlen (pkgdatadir); - while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/') - pkgdatadirlen--; - full_skeleton = xmalloc (pkgdatadirlen + 1 - + (skeleton_size < sizeof m4sugar - ? sizeof m4sugar : skeleton_size)); - 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); - if (mbschr (skeleton, '/')) - strcpy (full_skeleton, skeleton); - else - strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); + char const *m4 = (m4 = getenv ("M4")) ? m4 : M4; + char const *datadir = pkgdatadir (); + 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)); /* Test whether m4sugar.m4 is readable, to check for proper installation. A faulty installation can cause deadlock, so a cheap sanity check is worthwhile. */ - xfclose (xfopen (full_m4sugar, "r")); + xfclose (xfopen (m4sugar, "r")); /* Create an m4 subprocess connected to us via two pipes. */ if (trace_flag & trace_tools) fprintf (stderr, "running: %s %s - %s %s\n", - m4, full_m4sugar, full_m4bison, full_skeleton); + m4, m4sugar, m4bison, skel); /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a position-dependent manner. Keep it as the first argument so that all @@ -619,6 +606,7 @@ output_skeleton (void) for details. */ { + char const *argv[10]; int i = 0; argv[i++] = m4; @@ -635,47 +623,44 @@ output_skeleton (void) argv[i++] = M4_GNU_OPTION; argv[i++] = "-I"; - argv[i++] = pkgdatadir; + argv[i++] = datadir; if (trace_flag & trace_m4) argv[i++] = "-dV"; - argv[i++] = full_m4sugar; + argv[i++] = m4sugar; argv[i++] = "-"; - argv[i++] = full_m4bison; - argv[i++] = full_skeleton; + argv[i++] = m4bison; + 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 (full_m4sugar); - free (full_m4bison); - free (full_skeleton); + free (m4sugar); + free (m4bison); + free (skel); 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); } /* Read and process m4's output. */ timevar_push (TV_M4); - in = fdopen (filter_fd[0], "r"); - if (! in) - error (EXIT_FAILURE, get_errno (), - "fdopen"); - 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 - Bison user. */ - aver (feof (in)); - xfclose (in); + { + 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 + Bison user. */ + aver (feof (in)); + xfclose (in); + } wait_subprocess (pid, "m4", false, false, true, true, NULL); timevar_pop (TV_M4); } @@ -683,10 +668,10 @@ 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. */ + /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be + documented for the user. */ char const *cp = getenv ("BISON_USE_PUSH_FOR_PULL"); - bool use_push_for_pull_flag = cp && *cp && STRNEQ (cp, "0"); + bool use_push_for_pull_flag = cp && *cp && strtol (cp, 0, 10); /* Flags. */ MUSCLE_INSERT_BOOL ("defines_flag", defines_flag); @@ -694,6 +679,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); @@ -725,7 +711,7 @@ prepare (void) /* 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 ()); + MUSCLE_INSERT_STRING_RAW ("pkgdatadir", pkgdatadir ()); } } @@ -754,8 +740,8 @@ output (void) } char const * -compute_pkgdatadir (void) +pkgdatadir (void) { - char const *pkgdatadir = getenv ("BISON_PKGDATADIR"); - return pkgdatadir ? pkgdatadir : PKGDATADIR; + char const *cp = getenv ("BISON_PKGDATADIR"); + return cp ? cp : PKGDATADIR; }