--- bison/src/files.c Thu Jan 18 15:47:08 2001 +++ bison-1.29/src/files.c Wed Aug 1 13:22:15 2001 @@ -45,6 +45,11 @@ static char *base_name; static char *short_base_name; +/* C source file extension (the parser source). */ +static char *src_extension; +/* Header file extension (if option ``-d'' is specified). */ +static char *header_extension; + /*--------------------------. | Is SUFFIX ending STRING? | @@ -156,9 +161,68 @@ } -/*----------------------------------------. -| Compute BASE_NAME and SHORT_BASE_NAME. | -`----------------------------------------*/ +/*----------------------------------------------------------------. +| 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. */ +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++) + if (*in == from) + *out = to; + else + *out = *in; + *out = 0; + return (temp); +} + +/* Gets the extension index in FILENAME. Returns 0 if fails to + find an extension. */ +static int +get_extension_index(const char *filename) +{ + int len; + + len = strlen (filename); + + if (filename[len-- - 1] == '.') + return (0); + + while ((len > 0) && (filename[len - 1] != '.')) + if (filename[len - 1] == '/') + return (0); + else + len--; + + return (len - 1); +} + +/* Computes extensions from the grammar file extension. */ +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'); +} + +/* 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'); +} /* FIXME: Should use xstrndup. */ @@ -167,6 +231,11 @@ { 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'. @@ -183,8 +252,18 @@ #endif /* MSDOS */ /* BASE_LENGTH includes ".tab" but not ".c". */ base_length = strlen (spec_outfile); - if (strsuffix (spec_outfile, ".c")) - base_length -= 2; + + ext_index = get_extension_index (spec_outfile); + /* 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; + if (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; @@ -205,7 +284,6 @@ strlwr (spec_file_prefix); #endif /* MSDOS */ short_base_name = xstrdup (spec_file_prefix); - base_name = XMALLOC (char, strlen (short_base_name) + strlen (EXT_TAB) + 1); stpcpy (stpcpy (base_name, short_base_name), EXT_TAB); @@ -224,8 +302,18 @@ /* BASE_LENGTH gets length of BASE_NAME, sans ".y" suffix if any. */ base_length = strlen (name_base); - if (strsuffix (name_base, ".y")) - base_length -= 2; + + ext_index = get_extension_index (name_base); + /* 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; + if (ext_index) + { + base_length -= strlen (name_base + ext_index); + compute_exts_from_gf(name_base + ext_index); + } + short_base_length = base_length; short_base_name = strndup (name_base, short_base_length); @@ -268,17 +356,21 @@ xfclose (finput); compute_base_names (); + attrsfile = stringappend (short_base_name, EXT_STYPE_H); +#ifndef MSDOS + stringappend (attrsfile, header_extension); +#endif /* MSDOS */ /* Output the main file. */ if (spec_outfile) obstack_save (&table_obstack, spec_outfile); else - obstack_save (&table_obstack, stringappend (base_name, ".c")); + obstack_save (&table_obstack, stringappend (base_name, src_extension)); /* Output the header file if wanted. */ if (defines_flag) - obstack_save (&defines_obstack, stringappend (base_name, ".h")); + obstack_save (&defines_obstack, stringappend (base_name, header_extension)); /* If we output only the table, dump the actions in ACTFILE. */ if (no_parser_flag) @@ -288,9 +380,14 @@ into its own file, ATTTRSFILE. */ if (semantic_parser) { + char *temp_name; + obstack_save (&attrs_obstack, attrsfile); - obstack_save (&guard_obstack, - stringappend (short_base_name, EXT_GUARD_C)); + 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); } if (verbose_flag) --- bison/src/system.h Wed Dec 20 18:21:14 2000 +++ bison-1.29/src/system.h Sat Jul 21 15:24:05 2001 @@ -209,8 +209,8 @@ /* VMS. */ # define EXT_TAB "_tab" # define EXT_OUTPUT ".output" -# define EXT_STYPE_H "_stype.h" -# define EXT_GUARD_C "_guard.c" +# define EXT_STYPE_H "_stype" +# define EXT_GUARD_C "_guard" #else /* ! VMS */ # ifdef MSDOS /* MS DOS. */ @@ -222,8 +222,8 @@ /* Standard. */ # define EXT_TAB ".tab" # define EXT_OUTPUT ".output" -# define EXT_STYPE_H ".stype.h" -# define EXT_GUARD_C ".guard.c" +# define EXT_STYPE_H ".stype" +# define EXT_GUARD_C ".guard" # endif /* ! MSDOS */ #endif /* ! VMS */ --- bison/doc/bison.texinfo Wed Jul 18 11:52:34 2001 +++ bison-1.29/doc/bison.texinfo Wed Jul 25 18:06:59 2001 @@ -2112,6 +2112,7 @@ C-language function that recognizes correct instances of the grammar. The Bison grammar input file conventionally has a name ending in @samp{.y}. address@hidden, ,Invoking Bison}. @menu * Grammar Outline:: Overall layout of the grammar file. @@ -4925,7 +4926,26 @@ @samp{.y}. The parser file's name is made by replacing the @samp{.y} with @samp{.tab.c}. Thus, the @samp{bison foo.y} filename yields @file{foo.tab.c}, and the @samp{bison hack/foo.y} filename yields address@hidden/address@hidden address@hidden/foo.tab.c}. It's is also possible, in case you are writting +C++ code instead of C in your grammar file, to name it @file{foo.ypp} +or @file{foo.y++}. Then, the output files will take an extention like +the given one as input (repectively @file{foo.tab.cpp} and @file{foo.tab.c++}). +This feature takes effect with all options that manipulate filenames like address@hidden or @samp{-d}. + +For example : + address@hidden +bison -d @var{infile.yxx} address@hidden example +will produce @file{infile.tab.cxx} and @file{infile.tab.hxx}. and + address@hidden +bison -d @var{infile.y} -o @var{output.c++} address@hidden example +will produce @file{output.c++} and @file{outfile.h++}. + address@hidden @menu * Bison Options:: All the options described in detail, --- bison/doc/bison.1 Wed Jul 18 11:52:34 2001 +++ bison-1.29/doc/bison.1 Sat Jul 21 19:12:00 2001 @@ -71,13 +71,22 @@ .IR yacc , the generated files do not have fixed names, but instead use the prefix of the input file. +Moreover, if you need to put +.IR C++ +code in the input file, you can end his name by a C++-like extension +(.ypp or .y++), then bison will follow your extension to name the +output file (.cpp or .c++). For instance, a grammar description file named -.B parse.y +.B parse.yxx would produce the generated parser in a file named -.BR parse.tab.c , +.BR parse.tab.cxx , instead of .IR yacc 's -.BR y.tab.c . +.BR y.tab.c +or old +.IR Bison +versions +.BR parse.tab.c . .PP This description of the options that can be given to .I bison --- bison/NEWS Wed Jul 18 11:52:34 2001 +++ bison-1.29/NEWS Thu Jul 26 10:37:08 2001 @@ -1,6 +1,12 @@ Bison News ---------- +Changes in version 1.29: + +* the input and the output files has automatically a similar extension. + +* annoying warnings removed. + Changes in version 1.28a: * Russian translation added. --- bison/ChangeLog Wed Jul 18 16:34:24 2001 +++ bison-1.29/ChangeLog Wed Aug 1 13:24:34 2001 @@ -1,3 +1,28 @@ +2001-07-22 Marc Autret + + * doc/bison.texinfo: Updated. + * doc/bison.1 (mandoc): Updated. + * src/system.h (EXT_GUARD_C, EXT_STYPE_H): Removed .c and .h. + * src/files.c: Support output files extensions computing. + (src_extension): New static variable. + (header_extension): New static variable. + (tr): New function. + (get_extension_index): New function, gets the index of an extension + filename in a string. + (compute_exts_from_gf): New function, computes extensions from the + grammar file extension. + (compute_exts_from_src): New functions, computes extensions from the + C source file extension, file given by ``-o'' option. + (compute_base_names): Updated. + (output_files): Updated. + +2001-07-20 Marc Autret + + * src/output.c: Warning ``assignment discards qualifiers from pointer + target type'' removed. + * src/getargs.h (skeleton): Extern declaration Updated. + * src/getargs.c (skeleton): Variable declared ``const''. + 2001-07-18 Akim Demaille * Makefile.maint, GNUmakefile: New, from Autoconf 2.52.