X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/e63ee1f16c6b8633ed7385d1e7f2531b5dfda8f5..e3aa2baac6a8c0e5eb93b2fcecf74b036b9634b8:/src/files.c diff --git a/src/files.c b/src/files.c index da4c36b1..d081f3e0 100644 --- a/src/files.c +++ b/src/files.c @@ -21,11 +21,14 @@ #include "system.h" -#include "getargs.h" + +#include +#include + +#include "complain.h" #include "files.h" +#include "getargs.h" #include "gram.h" -#include "error.h" -#include "complain.h" /* From basename.c. Almost a lie, as it returns a char *. */ const char *base_name (char const *name); @@ -50,52 +53,32 @@ char *spec_graph_file = NULL; /* for -g. */ char *spec_defines_file = NULL; /* for --defines. */ char *parser_file_name = NULL; -char *infile = NULL; +uniqstr grammar_file = NULL; +uniqstr current_file = NULL; static char *full_base_name = NULL; /* Prefix used to generate output file names. */ char *short_base_name = NULL; -/* Infix used to generate output file names (i.e., `.tab', or `_tab', - or `'). */ -char *output_infix = NULL; - /* C source file extension (the parser source). */ const char *src_extension = NULL; /* Header file extension (if option ``-d'' is specified). */ const char *header_extension = NULL; - -/*--------------------------. -| Is SUFFIX ending STRING? | -`--------------------------*/ - -int -strsuffix (const char *string, const char *suffix) -{ - size_t string_len = strlen (string); - size_t suffix_len = strlen (suffix); - if (suffix_len <= string_len) - return !strcmp (string + string_len - suffix_len, suffix); - else - return 0; -} - - /*-----------------------------------------------------------------. | Return a newly allocated string composed of the concatenation of | -| STRING1, and STRING2. | +| STR1, and STR2. | `-----------------------------------------------------------------*/ -char* -stringappend (const char *string1, const char *string2) +static char * +concat2 (char const *str1, char const *str2) { - size_t len = strlen (string1) + strlen (string2); + size_t len = strlen (str1) + strlen (str2); char *res = XMALLOC (char, len + 1); char *cp; - cp = stpcpy (res, string1); - cp = stpcpy (cp, string2); + cp = stpcpy (res, str1); + cp = stpcpy (cp, str2); return res; } @@ -111,7 +94,7 @@ xfopen (const char *name, const char *mode) ptr = fopen (name, mode); if (!ptr) - error (EXIT_FAILURE, errno, _("cannot open file `%s'"), name); + error (EXIT_FAILURE, get_errno (), _("cannot open file `%s'"), name); return ptr; } @@ -130,7 +113,7 @@ xfclose (FILE *ptr) error (EXIT_FAILURE, 0, _("I/O error")); if (fclose (ptr) != 0) - error (EXIT_FAILURE, errno, _("cannot close file")); + error (EXIT_FAILURE, get_errno (), _("cannot close file")); } @@ -258,10 +241,6 @@ compute_base_names (void) (strlen (spec_outfile) - (tab ? strlen (tab) : (ext ? strlen (ext) : 0)))); - if (tab) - output_infix = xstrndup (tab, - (strlen (tab) - (ext ? strlen (ext) : 0))); - if (ext) compute_exts_from_src (ext); } @@ -287,22 +266,19 @@ compute_base_names (void) { /* Otherwise, the short base name is computed from the input grammar: `foo/bar.yy' => `bar'. */ - filename_split (infile, &base, &tab, &ext); + filename_split (grammar_file, &base, &tab, &ext); short_base_name = xstrndup (base, (strlen (base) - (ext ? strlen (ext) : 0))); } - /* In these cases, always append `.tab'. */ - output_infix = xstrdup (EXT_TAB); - full_base_name = XMALLOC (char, strlen (short_base_name) - + strlen (EXT_TAB) + 1); - stpcpy (stpcpy (full_base_name, short_base_name), EXT_TAB); + + strlen (TAB_EXT) + 1); + stpcpy (stpcpy (full_base_name, short_base_name), TAB_EXT); /* Computes the extensions from the grammar file name. */ - filename_split (infile, &base, &tab, &ext); + filename_split (grammar_file, &base, &tab, &ext); if (ext && !yacc_flag) compute_exts_from_gf (ext); } @@ -324,15 +300,15 @@ compute_output_file_names (void) header_extension = ".h"; parser_file_name = - spec_outfile ? spec_outfile : stringappend (full_base_name, src_extension); + spec_outfile ? spec_outfile : concat2 (full_base_name, src_extension); /* It the defines filename if not given, we create it. */ if (!spec_defines_file) - spec_defines_file = stringappend (full_base_name, header_extension); + spec_defines_file = concat2 (full_base_name, header_extension); /* It the graph filename if not given, we create it. */ if (!spec_graph_file) - spec_graph_file = stringappend (short_base_name, ".vcg"); + spec_graph_file = concat2 (short_base_name, ".vcg"); - spec_verbose_file = stringappend (short_base_name, EXT_OUTPUT); + spec_verbose_file = concat2 (short_base_name, OUTPUT_EXT); }