]> git.saurik.com Git - bison.git/blame - src/output.c
portability: fix several issues with M4 subprocess.
[bison.git] / src / output.c
CommitLineData
a932883e 1/* Output the generated parsing program for Bison.
87ceef73 2
219c26ea
JD
3 Copyright (C) 1984, 1986, 1989, 1992, 2000-2010 Free Software
4 Foundation, Inc.
c3e23647 5
9ee3c97b 6 This file is part of Bison, the GNU Compiler Compiler.
c3e23647 7
f16b0819
PE
8 This program is free software: you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation, either version 3 of the License, or
11 (at your option) any later version.
c3e23647 12
f16b0819
PE
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c3e23647 17
9ee3c97b 18 You should have received a copy of the GNU General Public License
f16b0819 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c3e23647 20
2cec9080 21#include <config.h>
c3e23647 22#include "system.h"
21fd22d6 23
1266b636 24#include <assert.h>
3b2942e6 25#include <configmake.h>
21fd22d6
PE
26#include <error.h>
27#include <get-errno.h>
22cc8d81 28#include <pipe.h>
21fd22d6 29#include <quotearg.h>
21fd22d6 30#include <timevar.h>
22cc8d81 31#include <wait-process.h>
21fd22d6
PE
32
33#include "complain.h"
c3e23647 34#include "files.h"
21fd22d6 35#include "getargs.h"
c3e23647 36#include "gram.h"
21fd22d6 37#include "muscle_tab.h"
6c89f1c1 38#include "output.h"
a70083a3 39#include "reader.h"
e9071366 40#include "scan-code.h" /* max_left_semantic_context */
04098407 41#include "scan-skel.h"
ad949da9 42#include "symtab.h"
c6f1a33c 43#include "tables.h"
be2a1a68 44
1266b636 45# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array))
12b0043a 46
f87685c3 47static struct obstack format_obstack;
c3e23647 48
133c20e2 49
5372019f
AD
50/*-------------------------------------------------------------------.
51| Create a function NAME which associates to the muscle NAME the |
52| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of |
53| TYPE), and to the muscle NAME_max, the max value of the |
54| TABLE_DATA. |
55`-------------------------------------------------------------------*/
62a3e4f0 56
62a3e4f0 57
5372019f 58#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \
5fbb0954 59 \
5372019f 60static void \
9e0876fb 61Name (char const *name, \
5fbb0954
AD
62 Type *table_data, \
63 Type first, \
64 int begin, \
65 int end) \
66{ \
12b0043a 67 Type min = first; \
0c2d3f4c 68 Type max = first; \
87ceef73
PE
69 long int lmin; \
70 long int lmax; \
5fbb0954
AD
71 int i; \
72 int j = 1; \
73 \
5372019f 74 obstack_fgrow1 (&format_obstack, "%6d", first); \
5fbb0954
AD
75 for (i = begin; i < end; ++i) \
76 { \
5372019f 77 obstack_1grow (&format_obstack, ','); \
5fbb0954
AD
78 if (j >= 10) \
79 { \
5372019f 80 obstack_sgrow (&format_obstack, "\n "); \
5fbb0954
AD
81 j = 1; \
82 } \
83 else \
84 ++j; \
5372019f 85 obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \
12b0043a
AD
86 if (table_data[i] < min) \
87 min = table_data[i]; \
88 if (max < table_data[i]) \
5fbb0954
AD
89 max = table_data[i]; \
90 } \
5372019f
AD
91 obstack_1grow (&format_obstack, 0); \
92 muscle_insert (name, obstack_finish (&format_obstack)); \
5fbb0954 93 \
87ceef73
PE
94 lmin = min; \
95 lmax = max; \
12b0043a
AD
96 /* Build `NAME_min' and `NAME_max' in the obstack. */ \
97 obstack_fgrow1 (&format_obstack, "%s_min", name); \
98 obstack_1grow (&format_obstack, 0); \
87ceef73 99 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \
5372019f
AD
100 obstack_fgrow1 (&format_obstack, "%s_max", name); \
101 obstack_1grow (&format_obstack, 0); \
87ceef73 102 MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax); \
62a3e4f0
AD
103}
104
5372019f 105GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int)
12b0043a 106GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int)
21fd22d6
PE
107GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_number)
108GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number)
109GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number)
110GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number)
111GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number)
c3e23647
RS
112
113
05ac60f3
PE
114/*--------------------------------------------------------------------.
115| Print to OUT a representation of STRING escaped both for C and M4. |
116`--------------------------------------------------------------------*/
3813e141
PE
117
118static void
05ac60f3 119escaped_output (FILE *out, char const *string)
3813e141
PE
120{
121 char const *p;
2f4f028d 122 fprintf (out, "[[");
3813e141 123
05ac60f3 124 for (p = quotearg_style (c_quoting_style, string); *p; p++)
3813e141
PE
125 switch (*p)
126 {
127 case '$': fputs ("$][", out); break;
128 case '@': fputs ("@@", out); break;
129 case '[': fputs ("@{", out); break;
130 case ']': fputs ("@}", out); break;
131 default: fputc (*p, out); break;
132 }
133
2f4f028d 134 fprintf (out, "]]");
3813e141
PE
135}
136
137
39912f52
AD
138/*------------------------------------------------------------------.
139| Prepare the muscles related to the symbols: translate, tname, and |
140| toknum. |
141`------------------------------------------------------------------*/
b0940840 142
4a120d45 143static void
39912f52 144prepare_symbols (void)
c3e23647 145{
141f5793 146 MUSCLE_INSERT_BOOL ("token_table", token_table_flag);
39912f52
AD
147 MUSCLE_INSERT_INT ("tokens_number", ntokens);
148 MUSCLE_INSERT_INT ("nterms_number", nvars);
149 MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number);
150 MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number);
151
a49aecd5 152 muscle_insert_symbol_number_table ("translate",
fc5734fe
AD
153 token_translations,
154 token_translations[0],
155 1, max_user_token_number + 1);
c3e23647 156
39912f52 157 /* tname -- token names. */
b0940840
AD
158 {
159 int i;
d423d460
AD
160 /* We assume that the table will be output starting at column 2. */
161 int j = 2;
1cfe6375
JD
162 struct quoting_options *qo = clone_quoting_options (0);
163 set_quoting_style (qo, c_quoting_style);
164 set_quoting_flags (qo, QA_SPLIT_TRIGRAPHS);
b0940840
AD
165 for (i = 0; i < nsyms; i++)
166 {
1cfe6375 167 char *cp = quotearg_alloc (symbols[i]->tag, -1, qo);
d423d460
AD
168 /* Width of the next token, including the two quotes, the
169 comma and the space. */
21fd22d6 170 int width = strlen (cp) + 2;
b0940840 171
21fd22d6 172 if (j + width > 75)
b0940840 173 {
d423d460
AD
174 obstack_sgrow (&format_obstack, "\n ");
175 j = 1;
b0940840
AD
176 }
177
d423d460
AD
178 if (i)
179 obstack_1grow (&format_obstack, ' ');
3813e141 180 MUSCLE_OBSTACK_SGROW (&format_obstack, cp);
1cfe6375 181 free (cp);
d423d460 182 obstack_1grow (&format_obstack, ',');
21fd22d6 183 j += width;
b0940840 184 }
1cfe6375 185 free (qo);
8e1687ae 186 obstack_sgrow (&format_obstack, " ]b4_null[");
c3e23647 187
b0940840
AD
188 /* Finish table and store. */
189 obstack_1grow (&format_obstack, 0);
190 muscle_insert ("tname", obstack_finish (&format_obstack));
191 }
192
12b0043a 193 /* Output YYTOKNUM. */
b2ed6e58
AD
194 {
195 int i;
da2a7671 196 int *values = xnmalloc (ntokens, sizeof *values);
3650b4b8 197 for (i = 0; i < ntokens; ++i)
b0940840 198 values[i] = symbols[i]->user_token_number;
12b0043a 199 muscle_insert_int_table ("toknum", values,
3650b4b8 200 values[0], 1, ntokens);
b0940840 201 free (values);
b2ed6e58 202 }
b0940840 203}
b2ed6e58 204
b0940840
AD
205
206/*-------------------------------------------------------------.
207| Prepare the muscles related to the rules: rhs, prhs, r1, r2, |
95612cfa 208| rline, dprec, merger. |
b0940840
AD
209`-------------------------------------------------------------*/
210
211static void
212prepare_rules (void)
213{
21fd22d6 214 rule_number r;
5df5f6d5 215 unsigned int i = 0;
da2a7671
PE
216 item_number *rhs = xnmalloc (nritems, sizeof *rhs);
217 unsigned int *prhs = xnmalloc (nrules, sizeof *prhs);
218 unsigned int *rline = xnmalloc (nrules, sizeof *rline);
219 symbol_number *r1 = xnmalloc (nrules, sizeof *r1);
220 unsigned int *r2 = xnmalloc (nrules, sizeof *r2);
f6fbd3da
PE
221 int *dprec = xnmalloc (nrules, sizeof *dprec);
222 int *merger = xnmalloc (nrules, sizeof *merger);
4b3d3a8e
AD
223
224 for (r = 0; r < nrules; ++r)
b0940840 225 {
21fd22d6 226 item_number *rhsp = NULL;
b0940840
AD
227 /* Index of rule R in RHS. */
228 prhs[r] = i;
229 /* RHS of the rule R. */
230 for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp)
231 rhs[i++] = *rhsp;
232 /* LHS of the rule R. */
233 r1[r] = rules[r].lhs->number;
234 /* Length of rule R's RHS. */
235 r2[r] = i - prhs[r];
236 /* Separator in RHS. */
237 rhs[i++] = -1;
238 /* Line where rule was defined. */
2073702c 239 rline[r] = rules[r].location.start.line;
95612cfa 240 /* Dynamic precedence (GLR). */
676385e2 241 dprec[r] = rules[r].dprec;
95612cfa 242 /* Merger-function index (GLR). */
676385e2 243 merger[r] = rules[r].merger;
b0940840 244 }
4f82b42a 245 aver (i == nritems);
b0940840 246
5372019f 247 muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems);
4b3d3a8e
AD
248 muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules);
249 muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules);
250 muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules);
251 muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules);
f6fbd3da
PE
252 muscle_insert_int_table ("dprec", dprec, 0, 0, nrules);
253 muscle_insert_int_table ("merger", merger, 0, 0, nrules);
796d61fb 254
39912f52 255 MUSCLE_INSERT_INT ("rules_number", nrules);
25005f6a 256 MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context);
39912f52 257
b0940840
AD
258 free (rhs);
259 free (prhs);
5df5f6d5
AD
260 free (rline);
261 free (r1);
b0940840 262 free (r2);
676385e2
PH
263 free (dprec);
264 free (merger);
c3e23647
RS
265}
266
b0940840
AD
267/*--------------------------------------------.
268| Prepare the muscles related to the states. |
269`--------------------------------------------*/
c3e23647 270
4a120d45 271static void
b0940840 272prepare_states (void)
c3e23647 273{
21fd22d6 274 state_number i;
da2a7671 275 symbol_number *values = xnmalloc (nstates, sizeof *values);
9703cc49 276 for (i = 0; i < nstates; ++i)
29e88316 277 values[i] = states[i]->accessing_symbol;
a49aecd5 278 muscle_insert_symbol_number_table ("stos", values,
d57650a5 279 0, 1, nstates);
87ceef73 280 free (values);
39912f52
AD
281
282 MUSCLE_INSERT_INT ("last", high);
283 MUSCLE_INSERT_INT ("final_state_number", final_state->number);
284 MUSCLE_INSERT_INT ("states_number", nstates);
c3e23647
RS
285}
286
287
c3e23647 288
bb33f19a
PE
289/*---------------------------------.
290| Output the user actions to OUT. |
291`---------------------------------*/
12b0043a 292
4a120d45 293static void
c6f1a33c 294user_actions_output (FILE *out)
3f96f4dc 295{
21fd22d6 296 rule_number r;
dafdc66f 297
8e1687ae 298 fputs ("m4_define([b4_actions], \n[", out);
4b3d3a8e 299 for (r = 0; r < nrules; ++r)
9222837b 300 if (rules[r].action)
3f96f4dc 301 {
8e1687ae 302 fprintf (out, "b4_case(%d, [b4_syncline(%d, ", r + 1,
2073702c 303 rules[r].action_location.start.line);
05ac60f3 304 escaped_output (out, rules[r].action_location.start.file);
8e1687ae 305 fprintf (out, ")\n[ %s]])\n\n", rules[r].action);
3f96f4dc 306 }
8e1687ae 307 fputs ("])\n\n", out);
3f96f4dc
AD
308}
309
676385e2
PH
310/*--------------------------------------.
311| Output the merge functions to OUT. |
312`--------------------------------------*/
313
41442480 314static void
676385e2
PH
315merger_output (FILE *out)
316{
317 int n;
318 merger_list* p;
319
320 fputs ("m4_define([b4_mergers], \n[[", out);
e0e5bf84 321 for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next)
676385e2 322 {
e0e5bf84 323 if (p->type[0] == '\0')
16caa4f4 324 fprintf (out, " case %d: *yy0 = %s (*yy0, *yy1); break;\n",
676385e2
PH
325 n, p->name);
326 else
16caa4f4 327 fprintf (out, " case %d: yy0->%s = %s (*yy0, *yy1); break;\n",
676385e2
PH
328 n, p->type, p->name);
329 }
330 fputs ("]])\n\n", out);
331}
3f96f4dc 332
ae7453f2
AD
333/*--------------------------------------.
334| Output the tokens definition to OUT. |
335`--------------------------------------*/
091e20bb 336
c6f1a33c 337static void
be2a1a68 338token_definitions_output (FILE *out)
091e20bb
AD
339{
340 int i;
d0829076 341 char const *sep = "";
dafdc66f
AD
342
343 fputs ("m4_define([b4_tokens], \n[", out);
091e20bb
AD
344 for (i = 0; i < ntokens; ++i)
345 {
21fd22d6
PE
346 symbol *sym = symbols[i];
347 int number = sym->user_token_number;
091e20bb 348
b87f8b21
AD
349 /* At this stage, if there are literal aliases, they are part of
350 SYMBOLS, so we should not find symbols which are the aliases
351 here. */
4f82b42a 352 aver (number != USER_NUMBER_ALIAS);
b87f8b21 353
091e20bb 354 /* Skip error token. */
21fd22d6 355 if (sym == errtoken)
091e20bb 356 continue;
b87f8b21
AD
357
358 /* If this string has an alias, then it is necessarily the alias
359 which is to be output. */
21fd22d6
PE
360 if (sym->alias)
361 sym = sym->alias;
b87f8b21
AD
362
363 /* Don't output literal chars or strings (when defined only as a
364 string). Note that must be done after the alias resolution:
365 think about `%token 'f' "f"'. */
21fd22d6 366 if (sym->tag[0] == '\'' || sym->tag[0] == '\"')
b87f8b21 367 continue;
091e20bb
AD
368
369 /* Don't #define nonliteral tokens whose names contain periods
370 or '$' (as does the default value of the EOF token). */
21fd22d6 371 if (strchr (sym->tag, '.') || strchr (sym->tag, '$'))
091e20bb
AD
372 continue;
373
05ac60f3 374 fprintf (out, "%s[[[%s]], %d]",
d0829076
PE
375 sep, sym->tag, number);
376 sep = ",\n";
091e20bb 377 }
dafdc66f 378 fputs ("])\n\n", out);
091e20bb
AD
379}
380
381
95021767
JD
382/*---------------------------------------------------.
383| Output the symbol destructors or printers to OUT. |
384`---------------------------------------------------*/
9280d3ef
AD
385
386static void
95021767
JD
387symbol_code_props_output (FILE *out, char const *what,
388 code_props const *(*get)(symbol const *))
9280d3ef
AD
389{
390 int i;
d0829076 391 char const *sep = "";
9280d3ef 392
95021767
JD
393 fputs ("m4_define([b4_symbol_", out);
394 fputs (what, out);
395 fputs ("], \n[", out);
9280d3ef 396 for (i = 0; i < nsyms; ++i)
95021767
JD
397 {
398 symbol *sym = symbols[i];
399 char const *code = (*get) (sym)->code;
400 if (code)
401 {
402 location loc = (*get) (sym)->location;
403 /* Filename, lineno,
404 Symbol-name, Symbol-number,
405 code, optional typename. */
406 fprintf (out, "%s[", sep);
407 sep = ",\n";
408 escaped_output (out, loc.start.file);
409 fprintf (out, ", %d, ", loc.start.line);
410 escaped_output (out, sym->tag);
411 fprintf (out, ", %d, [[%s]]", sym->number, code);
412 if (sym->type_name)
413 fprintf (out, ", [[%s]]", sym->type_name);
414 fputc (']', out);
415 }
416 }
366eea36
AD
417 fputs ("])\n\n", out);
418}
419
420
4a120d45 421static void
c6f1a33c 422prepare_actions (void)
6c89f1c1 423{
c6f1a33c 424 /* Figure out the actions for the specified state, indexed by
742e4900 425 lookahead token type. */
bbb5bcc6 426
c6f1a33c
AD
427 muscle_insert_rule_number_table ("defact", yydefact,
428 yydefact[0], 1, nstates);
6c89f1c1 429
c6f1a33c
AD
430 /* Figure out what to do after reducing with each rule, depending on
431 the saved state from before the beginning of parsing the data
432 that matched this rule. */
d57650a5
AD
433 muscle_insert_state_number_table ("defgoto", yydefgoto,
434 yydefgoto[0], 1, nsyms - ntokens);
12b0043a 435
12b0043a 436
12b0043a
AD
437 /* Output PACT. */
438 muscle_insert_base_table ("pact", base,
5372019f 439 base[0], 1, nstates);
12b0043a 440 MUSCLE_INSERT_INT ("pact_ninf", base_ninf);
c3e23647 441
12b0043a
AD
442 /* Output PGOTO. */
443 muscle_insert_base_table ("pgoto", base,
5372019f 444 base[nstates], nstates + 1, nvectors);
c3e23647 445
12b0043a
AD
446 muscle_insert_base_table ("table", table,
447 table[0], 1, high + 1);
448 MUSCLE_INSERT_INT ("table_ninf", table_ninf);
676385e2 449
12b0043a
AD
450 muscle_insert_base_table ("check", check,
451 check[0], 1, high + 1);
c3e23647 452
ea99527d
AD
453 /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus
454 YYPACT) so that in states with unresolved conflicts, the default
455 reduction is not used in the conflicted entries, so that there is
456 a place to put a conflict pointer.
457
458 This means that YYCONFLP and YYCONFL are nonsense for a non-GLR
459 parser, so we could avoid accidents by not writing them out in
460 that case. Nevertheless, it seems even better to be able to use
461 the GLR skeletons even without the non-deterministic tables. */
462 muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table,
39912f52 463 conflict_table[0], 1, high + 1);
ea99527d 464 muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list,
da2a7671 465 0, 1, conflict_list_cnt);
6c89f1c1 466}
c3e23647 467
652def80 468\f
1239777d
AD
469/*---------------------------.
470| Call the skeleton parser. |
471`---------------------------*/
c3e23647 472
4a120d45 473static void
1239777d 474output_skeleton (void)
9b3add5b 475{
573312ac
PE
476 FILE *in;
477 FILE *out;
478 int filter_fd[2];
b9ad39c1 479 char const *argv[10];
573312ac
PE
480 pid_t pid;
481
a9fc7990 482 /* Compute the names of the package data dir and skeleton files. */
573312ac 483 char const m4sugar[] = "m4sugar/m4sugar.m4";
90b9908d 484 char const m4bison[] = "bison.m4";
2fd4e131 485 char *full_m4sugar;
90b9908d 486 char *full_m4bison;
eecf08fe 487 char *full_skeleton;
573312ac
PE
488 char const *p;
489 char const *m4 = (p = getenv ("M4")) ? p : M4;
d4bd2295 490 char const *pkgdatadir = compute_pkgdatadir ();
573312ac
PE
491 size_t skeleton_size = strlen (skeleton) + 1;
492 size_t pkgdatadirlen = strlen (pkgdatadir);
493 while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/')
494 pkgdatadirlen--;
eecf08fe
PE
495 full_skeleton = xmalloc (pkgdatadirlen + 1
496 + (skeleton_size < sizeof m4sugar
497 ? sizeof m4sugar : skeleton_size));
a7867f53 498 strncpy (full_skeleton, pkgdatadir, pkgdatadirlen);
eecf08fe
PE
499 full_skeleton[pkgdatadirlen] = '/';
500 strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar);
501 full_m4sugar = xstrdup (full_skeleton);
90b9908d
PB
502 strcpy (full_skeleton + pkgdatadirlen + 1, m4bison);
503 full_m4bison = xstrdup (full_skeleton);
a7867f53
JD
504 if (strchr (skeleton, '/'))
505 strcpy (full_skeleton, skeleton);
506 else
507 strcpy (full_skeleton + pkgdatadirlen + 1, skeleton);
a9fc7990
JD
508
509 /* Test whether m4sugar.m4 is readable, to check for proper
510 installation. A faulty installation can cause deadlock, so a
511 cheap sanity check is worthwhile. */
2fd4e131 512 xfclose (xfopen (full_m4sugar, "r"));
573312ac
PE
513
514 /* Create an m4 subprocess connected to us via two pipes. */
515
516 if (trace_flag & trace_tools)
90b9908d 517 fprintf (stderr, "running: %s %s - %s %s\n",
a9fc7990 518 m4, full_m4sugar, full_m4bison, full_skeleton);
573312ac 519
a9fc7990
JD
520 /* Some future version of GNU M4 (most likely 1.6) may treat the -dV in a
521 position-dependent manner. Keep it as the first argument so that all
522 files are traced.
573312ac 523
a9fc7990
JD
524 See the thread starting at
525 <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
526 for details. */
527 {
528 int i = 0;
529 argv[i++] = m4;
b9ad39c1
EB
530
531 /* When POSIXLY_CORRECT is set, GNU M4 1.6 and later disable GNU
532 extensions, which Bison's skeletons depend on. With older M4,
533 it has no effect. M4 1.4.12 added a -g/--gnu command-line
534 option to make it explicit that a program wants GNU M4
535 extensions even when POSIXLY_CORRECT is set.
536
537 See the thread starting at
538 <http://lists.gnu.org/archive/html/bug-bison/2008-07/msg00000.html>
539 for details. */
540 if (*M4_GNU_OPTION)
541 argv[i++] = M4_GNU_OPTION;
542
d67c52e8
EB
543 argv[i++] = "-I";
544 argv[i++] = pkgdatadir;
a9fc7990
JD
545 if (trace_flag & trace_m4)
546 argv[i++] = "-dV";
547 argv[i++] = full_m4sugar;
548 argv[i++] = "-";
549 argv[i++] = full_m4bison;
550 argv[i++] = full_skeleton;
551 argv[i++] = NULL;
1266b636 552 assert (i <= ARRAY_CARDINALITY (argv));
a9fc7990 553 }
a9fc7990 554
22cc8d81
JD
555 /* The ugly cast is because gnulib gets the const-ness wrong. */
556 pid = create_pipe_bidi ("m4", m4, (char **)(void*)argv, false, true,
557 true, filter_fd);
2fd4e131 558 free (full_m4sugar);
a9fc7990 559 free (full_m4bison);
eecf08fe 560 free (full_skeleton);
573312ac 561
22cc8d81 562 out = fdopen (filter_fd[1], "w");
573312ac 563 if (! out)
04098407
PE
564 error (EXIT_FAILURE, get_errno (),
565 "fdopen");
573312ac
PE
566
567 /* Output the definitions of all the muscles. */
381fb12e
AD
568 fputs ("m4_init()\n", out);
569
c6f1a33c 570 user_actions_output (out);
676385e2 571 merger_output (out);
381fb12e 572 token_definitions_output (out);
95021767
JD
573 symbol_code_props_output (out, "destructors", &symbol_destructor_get);
574 symbol_code_props_output (out, "printers", &symbol_printer_get);
be2a1a68 575
381fb12e 576 muscles_m4_output (out);
381fb12e 577 xfclose (out);
be2a1a68 578
573312ac 579 /* Read and process m4's output. */
1509d42f 580 timevar_push (TV_M4);
22cc8d81 581 in = fdopen (filter_fd[0], "r");
573312ac 582 if (! in)
04098407
PE
583 error (EXIT_FAILURE, get_errno (),
584 "fdopen");
573312ac 585 scan_skel (in);
22cc8d81
JD
586 /* scan_skel should have read all of M4's output. Otherwise, when we
587 close the pipe, we risk letting M4 report a broken-pipe to the
588 Bison user. */
589 aver (feof (in));
573312ac 590 xfclose (in);
22cc8d81 591 wait_subprocess (pid, "m4", false, false, true, true, NULL);
1509d42f 592 timevar_pop (TV_M4);
26f609ff
RA
593}
594
595static void
596prepare (void)
597{
945e396c
JD
598 /* BISON_USE_PUSH_FOR_PULL is for the test suite and should not be documented
599 for the user. */
600 char const *use_push_for_pull_env = getenv ("BISON_USE_PUSH_FOR_PULL");
601 bool use_push_for_pull_flag = false;
602 if (use_push_for_pull_env != NULL
603 && use_push_for_pull_env[0] != '\0'
604 && 0 != strcmp (use_push_for_pull_env, "0"))
605 use_push_for_pull_flag = true;
606
7db2ed2d 607 /* Flags. */
327afc7c 608 MUSCLE_INSERT_BOOL ("debug_flag", debug_flag);
d0829076 609 MUSCLE_INSERT_BOOL ("defines_flag", defines_flag);
327afc7c 610 MUSCLE_INSERT_BOOL ("error_verbose_flag", error_verbose);
90b9908d 611 MUSCLE_INSERT_BOOL ("glr_flag", glr_parser);
d0829076 612 MUSCLE_INSERT_BOOL ("locations_flag", locations_flag);
90b9908d 613 MUSCLE_INSERT_BOOL ("nondeterministic_flag", nondeterministic_parser);
d0829076 614 MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag);
ddc8ede1 615 MUSCLE_INSERT_BOOL ("tag_seen_flag", tag_seen);
95021767 616 MUSCLE_INSERT_BOOL ("use_push_for_pull_flag", use_push_for_pull_flag);
b931235e 617 MUSCLE_INSERT_BOOL ("yacc_flag", yacc_flag);
11d82f03 618
573a6cd3 619 /* File names. */
90b9908d
PB
620 if (spec_name_prefix)
621 MUSCLE_INSERT_STRING ("prefix", spec_name_prefix);
622
bd9d212b
JD
623 MUSCLE_INSERT_STRING ("file_name_all_but_ext", all_but_ext);
624
2b81e969
AD
625#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
626 DEFINE (dir_prefix);
627 DEFINE (parser_file_name);
628 DEFINE (spec_defines_file);
629 DEFINE (spec_file_prefix);
630 DEFINE (spec_graph_file);
631 DEFINE (spec_name_prefix);
632 DEFINE (spec_outfile);
633 DEFINE (spec_verbose_file);
634#undef DEFINE
b85810ae 635
0e021770
PE
636 /* Find the right skeleton file, and add muscles about the skeletons. */
637 if (skeleton)
638 MUSCLE_INSERT_C_STRING ("skeleton", skeleton);
639 else
640 skeleton = language->skeleton;
381fb12e 641
0e021770 642 /* About the skeletons. */
cf147260 643 {
bd9d212b
JD
644 /* b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs
645 would never be expanded. Hopefully no one has M4-special characters in
646 his Bison installation path. */
d4bd2295 647 MUSCLE_INSERT_STRING_RAW ("pkgdatadir", compute_pkgdatadir ());
cf147260 648 }
26f609ff 649}
c3e23647 650
93ede233 651
6c89f1c1
AD
652/*----------------------------------------------------------.
653| Output the parsing tables and the parser code to ftable. |
654`----------------------------------------------------------*/
c3e23647 655
6c89f1c1
AD
656void
657output (void)
658{
f87685c3 659 obstack_init (&format_obstack);
dd60faec 660
39912f52 661 prepare_symbols ();
b0940840
AD
662 prepare_rules ();
663 prepare_states ();
536545f3 664 prepare_actions ();
342b8b6e 665
26f609ff 666 prepare ();
652def80 667
9b3add5b
RA
668 /* Process the selected skeleton file. */
669 output_skeleton ();
670
f499b062 671 obstack_free (&format_obstack, NULL);
c3e23647 672}
d4bd2295
JD
673
674char const *
675compute_pkgdatadir (void)
676{
677 char const *pkgdatadir = getenv ("BISON_PKGDATADIR");
678 return pkgdatadir ? pkgdatadir : PKGDATADIR;
679}