]> git.saurik.com Git - bison.git/blobdiff - src/files.c
* src/print_graph.c (quote): New.
[bison.git] / src / files.c
index 8ecb1f9ff50b98f9be077be3e9d79efa493b56c0..721f1e5e6bce29ae79fb1867e1cee2b79c817edc 100644 (file)
@@ -1,5 +1,5 @@
 /* Open and close files for bison,
 /* Open and close files for bison,
-   Copyright 1984, 1986, 1989, 1992, 2000 Free Software Foundation, Inc.
+   Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.
 
    This file is part of Bison, the GNU Compiler Compiler.
 
 
    This file is part of Bison, the GNU Compiler Compiler.
 
@@ -34,21 +34,22 @@ struct obstack table_obstack;
 struct obstack defines_obstack;
 struct obstack guard_obstack;
 struct obstack output_obstack;
 struct obstack defines_obstack;
 struct obstack guard_obstack;
 struct obstack output_obstack;
+struct obstack graph_obstack;
 
 
-char *spec_outfile;    /* for -o. */
-char *spec_file_prefix; /* for -b. */
-char *spec_name_prefix; /* for -p. */
+char *spec_outfile = NULL;     /* for -o. */
+char *spec_file_prefix = NULL; /* for -b. */
+char *spec_name_prefix = NULL; /* for -p. */
 
 
-char *infile;
-char *attrsfile;
+char *infile = NULL;
+char *attrsfile = NULL;
 
 
-static char *base_name;
-static char *short_base_name;
+static char *base_name = NULL;
+static char *short_base_name = NULL;
 
 /* C source file extension (the parser source). */
 
 /* C source file extension (the parser source). */
-static char *src_extension;    
+const char *src_extension = NULL;
 /* Header file extension (if option ``-d'' is specified). */
 /* Header file extension (if option ``-d'' is specified). */
-static char *header_extension;
+const char *header_extension = NULL;
 
 \f
 /*--------------------------.
 
 \f
 /*--------------------------.
@@ -135,11 +136,11 @@ obstack_save (struct obstack *obs, const char *filename)
 
 /*------------------------------------------------------------------.
 | Return the path to the skeleton which locaction might be given in |
 
 /*------------------------------------------------------------------.
 | Return the path to the skeleton which locaction might be given in |
-| ENVVAR, otherwise return SKELETON.                                |
+| ENVVAR, otherwise return SKELETON_NAME.                           |
 `------------------------------------------------------------------*/
 
 const char *
 `------------------------------------------------------------------*/
 
 const char *
-skeleton_find (const char *envvar, const char *skeleton)
+skeleton_find (const char *envvar, const char *skeleton_name)
 {
   const char *res = getenv (envvar);
 
 {
   const char *res = getenv (envvar);
 
@@ -149,13 +150,13 @@ skeleton_find (const char *envvar, const char *skeleton)
   /* File doesn't exist in current directory; try in INIT directory.  */
   if (!res && (cp = getenv ("INIT")))
     {
   /* File doesn't exist in current directory; try in INIT directory.  */
   if (!res && (cp = getenv ("INIT")))
     {
-      res = XMALLOC (char, strlen (cp) + strlen (skeleton) + 2);
-      sprintf (res, "%s%c%s", cp, '/', skeleton);
+      res = XMALLOC (char, strlen (cp) + strlen (skeleton_name) + 2);
+      sprintf (res, "%s%c%s", cp, '/', skeleton_name);
     }
 #endif /* !MSDOS */
 
   if (!res)
     }
 #endif /* !MSDOS */
 
   if (!res)
-    res = skeleton;
+    res = skeleton_name;
 
   return res;
 }
 
   return res;
 }
@@ -165,14 +166,14 @@ skeleton_find (const char *envvar, const char *skeleton)
 | Compute BASE_NAME, SHORT_BASE_NAME and output files extensions. |
 `----------------------------------------------------------------*/
 
 | Compute BASE_NAME, SHORT_BASE_NAME and output files extensions. |
 `----------------------------------------------------------------*/
 
-/* Replace all characters FROM by TO in the string IN. 
-   and returns a new allocated string. */  
+/* Replace all characters FROM by TO in the string IN.
+   and returns a new allocated string. */
 static char *
 tr(const char *in, char from, char to)
 {
   char *temp;
   char *out;
 static char *
 tr(const char *in, char from, char to)
 {
   char *temp;
   char *out;
-  
+
   out = XMALLOC (char, strlen (in) + 1);
 
   for (temp = out; *in; in++, out++)
   out = XMALLOC (char, strlen (in) + 1);
 
   for (temp = out; *in; in++, out++)
@@ -184,15 +185,15 @@ tr(const char *in, char from, char to)
   return (temp);
 }
 
   return (temp);
 }
 
-/*  Gets the extension index in FILENAME. Returns 0 if fails to 
+/*  Gets the extension index in FILENAME. Returns 0 if fails to
     find an extension. */
     find an extension. */
-static int 
+static int
 get_extension_index(const char *filename)
 {
   int  len;
 
   len = strlen (filename);
 get_extension_index(const char *filename)
 {
   int  len;
 
   len = strlen (filename);
-  
+
   if (filename[len-- - 1] == '.')
     return (0);
 
   if (filename[len-- - 1] == '.')
     return (0);
 
@@ -209,19 +210,29 @@ get_extension_index(const char *filename)
 static void
 compute_exts_from_gf(const char *ext)
 {
 static void
 compute_exts_from_gf(const char *ext)
 {
-  src_extension = tr(ext, 'y', 'c');
-  src_extension = tr(src_extension, 'Y', 'C');
-  header_extension = tr(ext, 'y', 'h');
-  header_extension = tr(header_extension, 'Y', 'H');
+  if (!src_extension)
+    {
+      src_extension = tr(ext, 'y', 'c');
+      src_extension = tr(src_extension, 'Y', 'C');
+    }
+  if (!header_extension)
+    {
+      header_extension = tr(ext, 'y', 'h');
+      header_extension = tr(header_extension, 'Y', 'H');
+    }
 }
 
 /* Computes extensions from the given c source file extension. */
 static void
 compute_exts_from_src(const char *ext)
 {
 }
 
 /* Computes extensions from the given c source file extension. */
 static void
 compute_exts_from_src(const char *ext)
 {
-  src_extension = xstrdup(ext);
-  header_extension = tr(ext, 'c', 'h');
-  header_extension = tr(header_extension, 'C', 'H');
+  if (!src_extension)
+    src_extension = xstrdup(ext);
+  if (!header_extension)
+    {
+      header_extension = tr(ext, 'c', 'h');
+      header_extension = tr(header_extension, 'C', 'H');
+    }
 }
 
 /* FIXME: Should use xstrndup. */
 }
 
 /* FIXME: Should use xstrndup. */
@@ -232,10 +243,6 @@ compute_base_names (void)
   size_t base_length;
   size_t short_base_length;
   size_t ext_index;
   size_t base_length;
   size_t short_base_length;
   size_t ext_index;
-  
-  /* Set default extensions */
-  src_extension = ".c";
-  header_extension = ".h";
 
   /* If --output=foo.c was specified (SPEC_OUTFILE == foo.c),
      BASE_NAME and SHORT_BASE_NAME are `foo'.
 
   /* If --output=foo.c was specified (SPEC_OUTFILE == foo.c),
      BASE_NAME and SHORT_BASE_NAME are `foo'.
@@ -252,9 +259,9 @@ compute_base_names (void)
 #endif /* MSDOS */
       /* BASE_LENGTH includes ".tab" but not ".c".  */
       base_length = strlen (spec_outfile);
 #endif /* MSDOS */
       /* BASE_LENGTH includes ".tab" but not ".c".  */
       base_length = strlen (spec_outfile);
-      
+
       ext_index = get_extension_index (spec_outfile);
       ext_index = get_extension_index (spec_outfile);
-      /* if the initial segment of extension contains 'c' or a 'C', I assume 
+      /* if the initial segment of extension contains 'c' or a 'C', I assume
         that it is a C or C++ source file */
       if (ext_index)
        ext_index = (strspn(spec_outfile + ext_index + 1, "cC")) ? ext_index : 0;
         that it is a C or C++ source file */
       if (ext_index)
        ext_index = (strspn(spec_outfile + ext_index + 1, "cC")) ? ext_index : 0;
@@ -263,7 +270,7 @@ compute_base_names (void)
          base_length -= strlen (spec_outfile + ext_index);
          compute_exts_from_src(spec_outfile + ext_index);
        }
          base_length -= strlen (spec_outfile + ext_index);
          compute_exts_from_src(spec_outfile + ext_index);
        }
-      
+
       base_name = strndup (spec_outfile, base_length);
       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */
       short_base_length = base_length;
       base_name = strndup (spec_outfile, base_length);
       /* SHORT_BASE_LENGTH includes neither ".tab" nor ".c".  */
       short_base_length = base_length;
@@ -302,9 +309,9 @@ compute_base_names (void)
     /* BASE_LENGTH gets length of BASE_NAME, sans ".y" suffix if any.  */
 
     base_length = strlen (name_base);
     /* BASE_LENGTH gets length of BASE_NAME, sans ".y" suffix if any.  */
 
     base_length = strlen (name_base);
-    
+
     ext_index = get_extension_index (name_base);
     ext_index = get_extension_index (name_base);
-    /* if the initial segment of extension contains a 'y' or a 'Y', I assume 
+    /* if the initial segment of extension contains a 'y' or a 'Y', I assume
        that it is a yacc or bison grammar file */
     if (ext_index)
       ext_index = (strspn(name_base + ext_index + 1, "yY")) ? ext_index : 0;
        that it is a yacc or bison grammar file */
     if (ext_index)
       ext_index = (strspn(name_base + ext_index + 1, "yY")) ? ext_index : 0;
@@ -342,6 +349,7 @@ open_files (void)
   obstack_init (&defines_obstack);
   obstack_init (&guard_obstack);
   obstack_init (&output_obstack);
   obstack_init (&defines_obstack);
   obstack_init (&guard_obstack);
   obstack_init (&output_obstack);
+  obstack_init (&graph_obstack);
 }
 
 
 }
 
 
@@ -357,10 +365,16 @@ output_files (void)
 
   compute_base_names ();
 
 
   compute_base_names ();
 
+  /* Set default extensions */
+  if (!src_extension)
+    src_extension = ".c";
+  if (!header_extension)
+    header_extension = ".h";
+
   attrsfile = stringappend (short_base_name, EXT_STYPE_H);
 #ifndef MSDOS
   stringappend (attrsfile, header_extension);
   attrsfile = stringappend (short_base_name, EXT_STYPE_H);
 #ifndef MSDOS
   stringappend (attrsfile, header_extension);
-#endif /* MSDOS */  
+#endif /* MSDOS */
 
   /* Output the main file.  */
   if (spec_outfile)
 
   /* Output the main file.  */
   if (spec_outfile)
@@ -394,4 +408,7 @@ output_files (void)
     /* 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));
     /* 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));
+
+  if (graph_flag)
+    obstack_save (&graph_obstack, stringappend (short_base_name, ".vcg"));
 }
 }