X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/234a3be30308bdf67bda1fe67fce08f3cc55e749..20e8e5cadf2f68d6e90aff9f862023c1ad5f0960:/src/files.c?ds=inline diff --git a/src/files.c b/src/files.c index 8ecb1f9f..721f1e5e 100644 --- a/src/files.c +++ b/src/files.c @@ -1,5 +1,5 @@ /* 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. @@ -34,21 +34,22 @@ struct obstack table_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). */ -static char *src_extension; +const char *src_extension = NULL; /* Header file extension (if option ``-d'' is specified). */ -static char *header_extension; +const char *header_extension = NULL; /*--------------------------. @@ -135,11 +136,11 @@ obstack_save (struct obstack *obs, const char *filename) /*------------------------------------------------------------------. | Return the path to the skeleton which locaction might be given in | -| ENVVAR, otherwise return SKELETON. | +| ENVVAR, otherwise return SKELETON_NAME. | `------------------------------------------------------------------*/ const char * -skeleton_find (const char *envvar, const char *skeleton) +skeleton_find (const char *envvar, const char *skeleton_name) { 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"))) { - 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) - res = skeleton; + res = skeleton_name; return res; } @@ -165,14 +166,14 @@ skeleton_find (const char *envvar, const char *skeleton) | 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; - + 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); } -/* 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. */ -static int +static int get_extension_index(const char *filename) { int len; len = strlen (filename); - + 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) { - 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) { - 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. */ @@ -232,10 +243,6 @@ compute_base_names (void) 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'. @@ -252,9 +259,9 @@ compute_base_names (void) #endif /* MSDOS */ /* BASE_LENGTH includes ".tab" but not ".c". */ base_length = strlen (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; @@ -263,7 +270,7 @@ compute_base_names (void) 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; @@ -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); - + 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; @@ -342,6 +349,7 @@ open_files (void) 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 (); + /* 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); -#endif /* MSDOS */ +#endif /* MSDOS */ /* 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)); + + if (graph_flag) + obstack_save (&graph_obstack, stringappend (short_base_name, ".vcg")); }