X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/19c50364f38b72dcd7bf67a998db3c815b7b6a94..b99357cde6568644e1b562965cf9fb3ba65af3a6:/src/files.c diff --git a/src/files.c b/src/files.c index 32a4a8d5..eefa188d 100644 --- a/src/files.c +++ b/src/files.c @@ -27,25 +27,24 @@ #include "complain.h" FILE *finput = NULL; -FILE *foutput = NULL; -FILE *fguard = NULL; struct obstack action_obstack; struct obstack attrs_obstack; struct obstack table_obstack; struct obstack defines_obstack; +struct obstack guard_obstack; +struct obstack output_obstack; -/* File name specified with -o for the output file, or 0 if no -o. */ -char *spec_outfile; +char *spec_outfile; /* for -o. */ +char *spec_file_prefix; /* for -b. */ +char *spec_name_prefix; /* for -p. */ char *infile; char *attrsfile; -char *guardfile; -static char *outfile; -static char *defsfile; -static char *tabfile; -static char *actfile; +static char *base_name; +static char *short_base_name; + /*--------------------------. | Is SUFFIX ending STRING? | @@ -164,7 +163,7 @@ skeleton_find (const char *envvar, const char *skeleton) /* FIXME: Should use xstrndup. */ static void -base_names (char **base_name, char **short_base_name) +compute_base_names (void) { size_t base_length; size_t short_base_length; @@ -186,12 +185,12 @@ base_names (char **base_name, char **short_base_name) base_length = strlen (spec_outfile); if (strsuffix (spec_outfile, ".c")) base_length -= 2; + base_name = strndup (spec_outfile, base_length); /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c". */ short_base_length = base_length; - if (strsuffix (spec_outfile, ".tab") || strsuffix (spec_outfile, "_tab")) + if (strsuffix (base_name, ".tab") || strsuffix (base_name, "_tab")) short_base_length -= 4; - *base_name = strndup (spec_outfile, base_length); - *short_base_name = strndup (spec_outfile, short_base_length); + short_base_name = strndup (spec_outfile, short_base_length); return; } @@ -205,11 +204,11 @@ base_names (char **base_name, char **short_base_name) #ifdef MSDOS strlwr (spec_file_prefix); #endif /* MSDOS */ - *short_base_name = xstrdup (spec_file_prefix); + short_base_name = xstrdup (spec_file_prefix); - *base_name = XMALLOC (char, - strlen (*short_base_name) + strlen (EXT_TAB) + 1); - stpcpy (stpcpy (*base_name, *short_base_name), EXT_TAB); + base_name = XMALLOC (char, + strlen (short_base_name) + strlen (EXT_TAB) + 1); + stpcpy (stpcpy (base_name, short_base_name), EXT_TAB); return; } @@ -228,11 +227,11 @@ base_names (char **base_name, char **short_base_name) if (strsuffix (name_base, ".y")) base_length -= 2; short_base_length = base_length; - *short_base_name = strndup (name_base, short_base_length); + short_base_name = strndup (name_base, short_base_length); - *base_name = XMALLOC (char, - strlen (*short_base_name) + strlen (EXT_TAB) + 1); - stpcpy (stpcpy (*base_name, *short_base_name), EXT_TAB); + base_name = XMALLOC (char, + strlen (short_base_name) + strlen (EXT_TAB) + 1); + stpcpy (stpcpy (base_name, short_base_name), EXT_TAB); return; } @@ -246,46 +245,15 @@ base_names (char **base_name, char **short_base_name) void open_files (void) { - char *base_name; - char *short_base_name; - - base_names (&base_name, &short_base_name); - finput = xfopen (infile, "r"); - if (verbose_flag) - { - /* We used to use just .out if spec_name_prefix (-p) was used, - but that conflicts with Posix. */ - outfile = stringappend (base_name, EXT_OUTPUT); - foutput = xfopen (outfile, "w"); - } - - if (no_parser_flag) - { - /* use permanent name for actions file */ - actfile = stringappend (short_base_name, ".act"); - } - - if (defines_flag) - { - defsfile = stringappend (base_name, ".h"); - } - - /* These are opened by `done' or `open_extra_files', if at all */ - if (spec_outfile) - tabfile = spec_outfile; - else - tabfile = stringappend (base_name, ".c"); - - attrsfile = stringappend (short_base_name, EXT_STYPE_H); - guardfile = stringappend (short_base_name, EXT_GUARD_C); - /* Initialize the obstacks. */ obstack_init (&action_obstack); obstack_init (&attrs_obstack); obstack_init (&table_obstack); obstack_init (&defines_obstack); + obstack_init (&guard_obstack); + obstack_init (&output_obstack); } @@ -297,24 +265,36 @@ open_files (void) void output_files (void) { - xfclose (fguard); xfclose (finput); - xfclose (foutput); + + compute_base_names (); + attrsfile = stringappend (short_base_name, EXT_STYPE_H); /* Output the main file. */ - obstack_save (&table_obstack, tabfile); + if (spec_outfile) + obstack_save (&table_obstack, spec_outfile); + else + obstack_save (&table_obstack, stringappend (base_name, ".c")); /* Output the header file if wanted. */ if (defines_flag) - obstack_save (&defines_obstack, defsfile); + obstack_save (&defines_obstack, stringappend (base_name, ".h")); - /* If we output only the table, dump the actions in ACTFILE. - */ + /* If we output only the table, dump the actions in ACTFILE. */ if (no_parser_flag) - obstack_save (&action_obstack, actfile); + obstack_save (&action_obstack, stringappend (short_base_name, ".act")); /* If we produced a semantic parser ATTRS_OBSTACK must be dumped into its own file, ATTTRSFILE. */ if (semantic_parser) - obstack_save (&attrs_obstack, attrsfile); + { + obstack_save (&attrs_obstack, attrsfile); + obstack_save (&guard_obstack, + stringappend (short_base_name, EXT_GUARD_C)); + } + + if (verbose_flag) + /* We used to use just .out if spec_name_prefix (-p) was used, but + that conflicts with Posix. */ + obstack_save (&output_obstack, stringappend (short_base_name, EXT_OUTPUT)); }