X-Git-Url: https://git.saurik.com/bison.git/blobdiff_plain/342b8b6e2156e923797745af2da2596e3086ccd5..e9f87b5b7df2e328d2e4196d276c0d96594c906b:/src/files.c diff --git a/src/files.c b/src/files.c index 7e29c4c6..2e817b1e 100644 --- a/src/files.c +++ b/src/files.c @@ -23,41 +23,50 @@ #include "getargs.h" #include "files.h" #include "gram.h" +#include "error.h" #include "complain.h" FILE *finput = NULL; struct obstack action_obstack; struct obstack attrs_obstack; -struct obstack table_obstack; -struct obstack defines_obstack; -struct obstack guard_obstack; struct obstack output_obstack; +/* Initializing some values below (such SPEC_NAME_PREFIX to `yy') is + tempting, but don't do that: for the time being our handling of the + %directive vs --option leaves precedence to the options by deciding + that if a %directive sets a variable which is really set (i.e., not + NULL), then the %directive is ignored. As a result, %name-prefix, + for instance, will not be honored. */ + char *spec_outfile = NULL; /* for -o. */ char *spec_file_prefix = NULL; /* for -b. */ -char *spec_name_prefix = NULL; /* for -p. */ +const char *spec_name_prefix = NULL; /* for -p. */ char *spec_verbose_file = NULL; /* for --verbose. */ char *spec_graph_file = NULL; /* for -g. */ char *spec_defines_file = NULL; /* for --defines. */ +char *parser_file_name = NULL; char *infile = NULL; char *attrsfile = NULL; static char *base_name = NULL; -static char *short_base_name = NULL; +char *short_base_name = 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; + +/* Should we insert '.tab' in yacc-compatible parsers? */ +int tab_extension = 0; /*--------------------------. | Is SUFFIX ending STRING? | `--------------------------*/ -static int +int strsuffix (const char *string, const char *suffix) { size_t string_len = strlen (string); @@ -74,7 +83,7 @@ strsuffix (const char *string, const char *suffix) | STRING1, and STRING2. | `-----------------------------------------------------------------*/ -static char * +char* stringappend (const char *string1, const char *string2) { size_t len = strlen (string1) + strlen (string2); @@ -86,26 +95,36 @@ stringappend (const char *string1, const char *string2) } -/*---------------------------------------------------------------. -| Computes the macro name used to avoid double inclusion in the | -| header of the parser and store it in header_macro_name. | -`---------------------------------------------------------------*/ +/*-----------------------------------------------------------------. +| 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). | +`-----------------------------------------------------------------*/ -static char * +char * compute_header_macro (void) { + const char *prefix = "BISON_"; char *macro_name, *cp; if (spec_defines_file) - macro_name = xstrdup (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 (base_name) + strlen (header_extension) + 1); - - stpcpy (macro_name, base_name); - strcat (macro_name, header_extension); + cp = stpcpy (macro_name, prefix); + cp = stpcpy (cp, base_name); + cp = stpcpy (cp, header_extension); } for (cp = macro_name; *cp; ++cp) @@ -154,38 +173,6 @@ xfclose (FILE *ptr) return result; } -/*--------------------------------------------------. -| Save the content of the obstack OBS in FILENAME. | -`--------------------------------------------------*/ - -static void -obstack_save (struct obstack *obs, const char *filename) -{ - FILE *out = xfopen (filename, "w"); - size_t size = obstack_object_size (obs); - fwrite (obstack_finish (obs), 1, size, out); - xfclose (out); -} - -/*---------------------------------------------------------------------. -| Output double inclusion protection macros and saves defines_obstack | -`---------------------------------------------------------------------*/ - -static void -defines_obstack_save (const char *filename) -{ - FILE *out = xfopen (filename, "w"); - size_t size = obstack_object_size (&defines_obstack); - char *macro_name = compute_header_macro (); - - fprintf (out, "#ifndef %s\n", macro_name); - fprintf (out, "# define %s\n\n", macro_name); - fwrite (obstack_finish (&defines_obstack), 1, size, out); - fprintf (out, "\n#endif /* not %s */\n", macro_name); - - free (macro_name); - xfclose (out); -} /*------------------------------------------------------------------. | Return the path to the skeleton which locaction might be given in | @@ -201,9 +188,9 @@ skeleton_find (const char *envvar, const char *skeleton_name) if (!res) { /* Skeleton file name without path */ - const char *skel_name = strrchr(skeleton_name, '/'); + const char *skel_name = strrchr (skeleton_name, '/'); if (!skel_name) - skel_name = strrchr(skeleton_name, '\\'); + skel_name = strrchr (skeleton_name, '\\'); if (!skel_name) skel_name = skeleton_name; else @@ -350,6 +337,11 @@ compute_base_names (void) short_base_length -= 4; short_base_name = strndup (spec_outfile, short_base_length); + /* FIXME: This is a quick and dirty way for me to find out if we + should .tab or not, using the computations above. */ + if (strcmp (base_name, short_base_name)) + tab_extension = 1; + return; } @@ -376,6 +368,10 @@ compute_base_names (void) if (ext_index) compute_exts_from_gf (infile + ext_index); + /* It seems that when only a prefix is given, '.tab' should always be + used. */ + tab_extension = 1; + return; } @@ -409,6 +405,9 @@ compute_base_names (void) strlen (short_base_name) + strlen (EXT_TAB) + 1); stpcpy (stpcpy (base_name, short_base_name), EXT_TAB); + /* By default, Bison should insert '.tab' were needed. */ + tab_extension = 1; + return; } } @@ -422,6 +421,9 @@ compute_output_file_names (void) { compute_base_names (); + parser_file_name = + spec_outfile ? spec_outfile : stringappend (base_name, src_extension); + /* If not yet done. */ if (!src_extension) src_extension = ".c"; @@ -442,81 +444,4 @@ compute_output_file_names (void) #ifndef MSDOS attrsfile = stringappend (attrsfile, header_extension); #endif /* MSDOS */ - -} - -/*-----------------------------------------------------------------. -| Open the input file. Look for the skeletons. Find the names of | -| the output files. Prepare the obstacks. | -`-----------------------------------------------------------------*/ - -void -open_files (void) -{ - finput = xfopen (infile, "r"); - - /* Initialize the obstacks. */ - obstack_init (&action_obstack); - obstack_init (&attrs_obstack); - obstack_init (&table_obstack); - obstack_init (&defines_obstack); - obstack_init (&guard_obstack); - obstack_init (&output_obstack); -} - - - -/*-----------------------. -| Close the open file.. | -`-----------------------*/ - -void -close_files (void) -{ - xfclose (finput); -} - -/*---------------------------. -| Produce the output files. | -`---------------------------*/ - -void -output_files (void) -{ - /* Output the main file. */ - if (spec_outfile) - obstack_save (&table_obstack, spec_outfile); - else - obstack_save (&table_obstack, stringappend (base_name, src_extension)); - obstack_free (&table_obstack, NULL); - - /* Output the header file if wanted. */ - if (defines_flag) - defines_obstack_save (spec_defines_file); - obstack_free (&defines_obstack, NULL); - -#if 0 - /* Seems to be invalid now --akim. */ - - /* If we output only the table, dump the actions in ACTFILE. */ - if (no_parser_flag) - obstack_save (&action_obstack, stringappend (short_base_name, ".act")); - obstack_free (&action_obstack, NULL); -#endif - - /* If we produced a semantic parser ATTRS_OBSTACK must be dumped - into its own file, ATTTRSFILE. */ - if (semantic_parser) - { - char *temp_name; - - obstack_save (&attrs_obstack, attrsfile); - obstack_free (&attrs_obstack, NULL); - temp_name = stringappend (short_base_name, EXT_GUARD_C); -#ifndef MSDOS - temp_name = stringappend (temp_name, src_extension); -#endif /* MSDOS */ - obstack_save (&guard_obstack, temp_name); - obstack_free (&guard_obstack, NULL); - } }