X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/d8911864c25f5521b28fcf9e17e88436c17c59bd..8b9e021fd1e3b03568d4b2167c47f33ba822a1c8:/src/output.c?ds=sidebyside diff --git a/src/output.c b/src/output.c index f739f0e9..86d9728b 100644 --- a/src/output.c +++ b/src/output.c @@ -1,7 +1,7 @@ /* Output the generated parsing program for Bison. - Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004, - 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc. + Copyright (C) 1984, 1986, 1989, 1992, 2000-2010 Free Software + Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -24,9 +24,10 @@ #include #include #include +#include #include -#include #include +#include #include "complain.h" #include "files.h" @@ -40,6 +41,7 @@ #include "symtab.h" #include "tables.h" +# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) static struct obstack format_obstack; @@ -635,10 +637,12 @@ output_skeleton (void) argv[i++] = full_m4bison; argv[i++] = full_skeleton; argv[i++] = NULL; + aver (i <= ARRAY_CARDINALITY (argv)); } - init_subpipe (); - pid = create_subpipe (argv, 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); @@ -646,7 +650,7 @@ output_skeleton (void) if (trace_flag & trace_muscles) muscles_output (stderr); { - FILE *out = fdopen (filter_fd[0], "w"); + FILE *out = fdopen (filter_fd[1], "w"); if (! out) error (EXIT_FAILURE, get_errno (), "fdopen"); @@ -656,14 +660,17 @@ output_skeleton (void) /* Read and process m4's output. */ timevar_push (TV_M4); - end_of_output_subpipe (pid, filter_fd); - in = fdopen (filter_fd[1], "r"); + 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); - reap_subpipe (pid, m4); + wait_subprocess (pid, "m4", false, false, true, true, NULL); timevar_pop (TV_M4); }