]> git.saurik.com Git - bison.git/blobdiff - src/files.c
(_AT_DATA_CALC_Y, Simple LALR Calculator):
[bison.git] / src / files.c
index dd3ec8180a68eb72f0c143939ac46029300a90f0..d081f3e0d1af8baa82f6e8b27c60365fef29a489 100644 (file)
 
 
 #include "system.h"
-#include "getargs.h"
+
+#include <error.h>
+#include <get-errno.h>
+
+#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;
 \f
-
-/*--------------------------.
-| 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 (2, errno, _("cannot open file `%s'"), name);
+    error (EXIT_FAILURE, get_errno (), _("cannot open file `%s'"), name);
 
   return ptr;
 }
@@ -120,19 +103,17 @@ xfopen (const char *name, const char *mode)
 | Try to close file PTR, and print an error message if fails.  |
 `-------------------------------------------------------------*/
 
-int
+void
 xfclose (FILE *ptr)
 {
-  int result;
-
   if (ptr == NULL)
-    return 0;
+    return;
 
-  result = fclose (ptr);
-  if (result == EOF)
-    error (2, errno, _("cannot close file"));
+  if (ferror (ptr))
+    error (EXIT_FAILURE, 0, _("I/O error"));
 
-  return result;
+  if (fclose (ptr) != 0)
+    error (EXIT_FAILURE, get_errno (), _("cannot close file"));
 }
 \f
 
@@ -260,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);
     }
@@ -289,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);
     }
@@ -326,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);
 }