X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/fdbcd8e28930c6a1e6d4f80636c7b4e21a575489..b0f98b1016367bf4515ce3d0da5eaa99615d9293:/src/files.c?ds=sidebyside diff --git a/src/files.c b/src/files.c index 1e084f6e..02cf0ddc 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, 2001, 2002 + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of Bison, the GNU Compiler Compiler. @@ -28,12 +28,10 @@ #include "complain.h" /* From basename.c. Almost a lie, as it returns a char *. */ -const char *base_name PARAMS ((char const *name)); +const char *base_name (char const *name); FILE *finput = NULL; -struct obstack action_obstack; -struct obstack output_obstack; struct obstack pre_prologue_obstack; struct obstack post_prologue_obstack; @@ -52,17 +50,14 @@ char *spec_graph_file = NULL; /* for -g. */ char *spec_defines_file = NULL; /* for --defines. */ char *parser_file_name = NULL; -char *infile = NULL; +struniq_t grammar_file = NULL; +struniq_t 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). */ @@ -101,49 +96,6 @@ stringappend (const char *string1, const char *string2) return res; } - -/*-----------------------------------------------------------------. -| Computes the macro name used to avoid double inclusion in the | -| header of the parser and store it in header_macro_name. Be sure | -| to produce valid CPP names (don't start with digit, remain | -| alphanumerical + underscore). | -`-----------------------------------------------------------------*/ - -char * -compute_header_macro (void) -{ - const char *prefix = "BISON_"; - char *macro_name, *cp; - - if (spec_defines_file) - { - macro_name = XMALLOC (char, - strlen (prefix) + - strlen (spec_defines_file) + 1); - cp = stpcpy (macro_name, prefix); - cp = stpcpy (cp, spec_defines_file); - } - else - { - macro_name = XMALLOC (char, - strlen (prefix) + - strlen (full_base_name) + - strlen (header_extension) + 1); - cp = stpcpy (macro_name, prefix); - cp = stpcpy (cp, full_base_name); - cp = stpcpy (cp, header_extension); - } - - for (cp = macro_name; *cp; ++cp) - if (islower (*cp)) - *cp = toupper (*cp); - else if (!isalnum (*cp)) - *cp = '_'; - - return macro_name; -} - - /*-----------------------------------------------------------------. | Try to open file NAME with mode MODE, and print an error message | | if fails. | @@ -156,7 +108,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, errno, _("cannot open file `%s'"), name); return ptr; } @@ -165,72 +117,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; - - result = fclose (ptr); - if (result == EOF) - error (2, errno, _("cannot close file")); - - return result; -} - - -/*------------------------------------------------------------------. -| Return the path to the skeleton which locaction might be given in | -| ENVVAR, otherwise return SKELETON_NAME. | -`------------------------------------------------------------------*/ - -const char * -skeleton_find (const char *envvar, const char *skeleton_name) -{ - const char *res = getenv (envvar); - -#if defined (MSDOS) || defined (_WIN32) - const char *cp = getenv ("INIT"); - if (!res) - { - /* Skeleton file name without path */ - const char *skel_name = strrchr (skeleton_name, '/'); - if (!skel_name) - skel_name = strrchr (skeleton_name, '\\'); - if (!skel_name) - skel_name = skeleton_name; - else - ++skel_name; + return; - /* File doesn't exist in current directory; try in INIT directory. */ - if (cp) - { - res = XMALLOC (char, strlen (cp) + strlen (skel_name) + 2); - sprintf (res, "%s%c%s", cp, '\\', skel_name); - } - else if (access (skel_name, 4) == 0) /* Look in current dir. */ - res = skel_name; - else - { - /* Look in program locations dir. */ - extern char *program_name; - cp = strrchr(program_name, '\\'); - if (!cp) - return skeleton_name; - else - ++cp; - res = XMALLOC (char, cp - program_name + strlen (skel_name) + 1); - strncpy (res, program_name, cp - program_name); - strcpy (res + (cp - program_name), skel_name); - } - } -#endif /* defined (MSDOS) || defined (_WIN32) */ - if (!res) - res = skeleton_name; + if (ferror (ptr)) + error (EXIT_FAILURE, 0, _("I/O error")); - return res; + if (fclose (ptr) != 0) + error (EXIT_FAILURE, errno, _("cannot close file")); } @@ -358,10 +255,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); } @@ -386,23 +279,20 @@ compute_base_names (void) else { /* Otherwise, the short base name is computed from the input - grammar: `foo.yy' => `foo'. */ - filename_split (infile, &base, &tab, &ext); + grammar: `foo/bar.yy' => `bar'. */ + filename_split (grammar_file, &base, &tab, &ext); short_base_name = - xstrndup (infile, - (strlen (infile) - (ext ? strlen (ext) : 0))); + 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); /* 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); }