mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 04:13:03 +00:00
Akim Demaille <akim@epita.fr>
Make sure -odir/foo.cc creates dir/location.hh etc. * src/files.h (spec_outfile, parser_file_name, spec_name_prefix) (spec_file_prefix, spec_verbose_file, spec_graph_file) (spec_defines_file): Now const. (dir_prefix): New. (short_base_name): Remove. * src/files.c: Adjust. (dirname.h): Include. (base_name): Don't prototype it. (finput): Remove, duplicates gram_in. (full_base_name, short_base_name): Replace by... (all_but_ext, all_but_tab_ext): these. (compute_base_names): Rename as... (compute_file_name_parts): this. Update to compute the new variables, including dir_prefix. Adjust dependencies. * src/output.c (prepare): Output them. * src/reader.c: Adjust to use gram_in, not finput. * src/scan-skel.l (@dir_prefix@): New.
This commit is contained in:
23
ChangeLog
23
ChangeLog
@@ -1,3 +1,26 @@
|
||||
2005-10-02 Paul Eggert <eggert@cs.ucla.edu>,
|
||||
Akim Demaille <akim@epita.fr>
|
||||
|
||||
Make sure -odir/foo.cc creates dir/location.hh etc.
|
||||
* src/files.h (spec_outfile, parser_file_name, spec_name_prefix)
|
||||
(spec_file_prefix, spec_verbose_file, spec_graph_file)
|
||||
(spec_defines_file): Now const.
|
||||
(dir_prefix): New.
|
||||
(short_base_name): Remove.
|
||||
* src/files.c: Adjust.
|
||||
(dirname.h): Include.
|
||||
(base_name): Don't prototype it.
|
||||
(finput): Remove, duplicates gram_in.
|
||||
(full_base_name, short_base_name): Replace by...
|
||||
(all_but_ext, all_but_tab_ext): these.
|
||||
(compute_base_names): Rename as...
|
||||
(compute_file_name_parts): this.
|
||||
Update to compute the new variables, including dir_prefix.
|
||||
Adjust dependencies.
|
||||
* src/output.c (prepare): Output them.
|
||||
* src/reader.c: Adjust to use gram_in, not finput.
|
||||
* src/scan-skel.l (@dir_prefix@): New.
|
||||
|
||||
2005-10-02 Juan Manuel Guerrero <juan.guerrero@gmx.de>
|
||||
|
||||
* lib/subpipe.c: New function end_of_output_subpipe() added
|
||||
|
||||
@@ -1015,7 +1015,7 @@ const yy::]b4_parser_class_name[::token_number_type yy::]b4_parser_class_name[::
|
||||
|
||||
]b4_epilogue
|
||||
dnl
|
||||
@output stack.hh
|
||||
@output b4_dir_prefix[]stack.hh
|
||||
b4_copyright([stack handling for Bison C++ parsers], [2002, 2003, 2004, 2005])[
|
||||
|
||||
#ifndef BISON_STACK_HH
|
||||
|
||||
101
src/files.c
101
src/files.c
@@ -29,16 +29,12 @@
|
||||
#include <xstrndup.h>
|
||||
|
||||
#include "complain.h"
|
||||
#include "dirname.h"
|
||||
#include "files.h"
|
||||
#include "getargs.h"
|
||||
#include "gram.h"
|
||||
#include "stdio-safer.h"
|
||||
|
||||
/* From basename.c. Almost a lie, as it returns a char *. */
|
||||
const char *base_name (char const *name);
|
||||
|
||||
FILE *finput = NULL;
|
||||
|
||||
struct obstack pre_prologue_obstack;
|
||||
struct obstack post_prologue_obstack;
|
||||
|
||||
@@ -49,21 +45,36 @@ struct obstack post_prologue_obstack;
|
||||
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. */
|
||||
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 const *spec_outfile = NULL; /* for -o. */
|
||||
char const *spec_file_prefix = NULL; /* for -b. */
|
||||
char const *spec_name_prefix = NULL; /* for -p. */
|
||||
char const *spec_verbose_file = NULL; /* for --verbose. */
|
||||
char const *spec_graph_file = NULL; /* for -g. */
|
||||
char const *spec_defines_file = NULL; /* for --defines. */
|
||||
char const *parser_file_name;
|
||||
|
||||
uniqstr grammar_file = NULL;
|
||||
uniqstr current_file = NULL;
|
||||
|
||||
static char *full_base_name = NULL;
|
||||
/* If --output=dir/foo.c was specified,
|
||||
DIR_PREFIX is `dir/' and ALL_BUT_EXT and ALL_BUT_TAB_EXT are `dir/foo'.
|
||||
|
||||
/* Prefix used to generate output file names. */
|
||||
char *short_base_name = NULL;
|
||||
If --output=dir/foo.tab.c was specified, DIR_PREFIX is `dir/',
|
||||
ALL_BUT_EXT is `dir/foo.tab', and ALL_BUT_TAB_EXT is `dir/foo'.
|
||||
|
||||
If --output was not specified but --file-prefix=dir/foo was specified,
|
||||
ALL_BUT_EXT = `foo.tab' and ALL_BUT_TAB_EXT = `foo'.
|
||||
|
||||
If neither --output nor --file was specified but the input grammar
|
||||
is name dir/foo.y, ALL_BUT_EXT and ALL_BUT_TAB_EXT are `foo'.
|
||||
|
||||
If neither --output nor --file was specified, DIR_PREFIX is the
|
||||
empty string (meaning the current directory); otherwise it is
|
||||
`dir/'. */
|
||||
|
||||
static char const *all_but_ext;
|
||||
static char const *all_but_tab_ext;
|
||||
char const *dir_prefix;
|
||||
|
||||
/* C source file extension (the parser source). */
|
||||
static char const *src_extension = NULL;
|
||||
@@ -121,9 +132,9 @@ xfclose (FILE *ptr)
|
||||
}
|
||||
|
||||
|
||||
/*---------------------------------------------------------------------.
|
||||
| Compute FULL_BASE_NAME, SHORT_BASE_NAME and output files extensions. |
|
||||
`---------------------------------------------------------------------*/
|
||||
/*------------------------------------------------------------------.
|
||||
| Compute ALL_BUT_EXT, ALL_BUT_TAB_EXT and output files extensions. |
|
||||
`------------------------------------------------------------------*/
|
||||
|
||||
/* Replace all characters FROM by TO in the string IN.
|
||||
and returns a new allocated string. */
|
||||
@@ -218,29 +229,27 @@ file_name_split (const char *file_name,
|
||||
|
||||
|
||||
static void
|
||||
compute_base_names (void)
|
||||
compute_file_name_parts (void)
|
||||
{
|
||||
const char *base, *tab, *ext;
|
||||
|
||||
/* If --output=foo.c was specified (SPEC_OUTFILE == foo.c),
|
||||
FULL_BASE_NAME and SHORT_BASE_NAME are `foo'.
|
||||
|
||||
If --output=foo.tab.c was specified, FULL_BASE_NAME is `foo.tab'
|
||||
and SHORT_BASE_NAME is `foo'.
|
||||
/* Compute ALL_BUT_EXT and ALL_BUT_TAB_EXT from SPEC_OUTFILE
|
||||
or GRAMMAR_FILE.
|
||||
|
||||
The precise -o name will be used for FTABLE. For other output
|
||||
files, remove the ".c" or ".tab.c" suffix. */
|
||||
if (spec_outfile)
|
||||
{
|
||||
file_name_split (spec_outfile, &base, &tab, &ext);
|
||||
dir_prefix = xstrndup (spec_outfile, base - spec_outfile);
|
||||
|
||||
/* The full base name goes up the EXT, excluding it. */
|
||||
full_base_name =
|
||||
/* ALL_BUT_EXT goes up the EXT, excluding it. */
|
||||
all_but_ext =
|
||||
xstrndup (spec_outfile,
|
||||
(strlen (spec_outfile) - (ext ? strlen (ext) : 0)));
|
||||
|
||||
/* The short base name goes up to TAB, excluding it. */
|
||||
short_base_name =
|
||||
/* ALL_BUT_TAB_EXT goes up to TAB, excluding it. */
|
||||
all_but_tab_ext =
|
||||
xstrndup (spec_outfile,
|
||||
(strlen (spec_outfile)
|
||||
- (tab ? strlen (tab) : (ext ? strlen (ext) : 0))));
|
||||
@@ -248,40 +257,36 @@ compute_base_names (void)
|
||||
if (ext)
|
||||
compute_exts_from_src (ext);
|
||||
}
|
||||
|
||||
/* If --file-prefix=foo was specified, FULL_BASE_NAME = `foo.tab'
|
||||
and SHORT_BASE_NAME = `foo'.
|
||||
|
||||
Construct names from it. */
|
||||
else
|
||||
{
|
||||
file_name_split (grammar_file, &base, &tab, &ext);
|
||||
|
||||
if (spec_file_prefix)
|
||||
{
|
||||
/* If --file-prefix=foo was specified, SHORT_BASE_NAME =
|
||||
/* If --file-prefix=foo was specified, ALL_BUT_TAB_EXT =
|
||||
`foo'. */
|
||||
short_base_name = xstrdup (spec_file_prefix);
|
||||
dir_prefix = xstrndup (grammar_file, base - grammar_file);
|
||||
all_but_tab_ext = xstrdup (spec_file_prefix);
|
||||
}
|
||||
else if (yacc_flag)
|
||||
{
|
||||
/* If --yacc, then the output is `y.tab.c'. */
|
||||
short_base_name = xstrdup ("y");
|
||||
dir_prefix = "";
|
||||
all_but_tab_ext = "y";
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Otherwise, the short base name is computed from the input
|
||||
/* Otherwise, ALL_BUT_TAB_EXT is computed from the input
|
||||
grammar: `foo/bar.yy' => `bar'. */
|
||||
file_name_split (grammar_file, &base, &tab, &ext);
|
||||
short_base_name =
|
||||
dir_prefix = "";
|
||||
all_but_tab_ext =
|
||||
xstrndup (base,
|
||||
(strlen (base) - (ext ? strlen (ext) : 0)));
|
||||
}
|
||||
|
||||
full_base_name = xmalloc (strlen (short_base_name)
|
||||
+ strlen (TAB_EXT) + 1);
|
||||
stpcpy (stpcpy (full_base_name, short_base_name), TAB_EXT);
|
||||
all_but_ext = concat2 (all_but_tab_ext, TAB_EXT);
|
||||
|
||||
/* Compute the extensions from the grammar file name. */
|
||||
file_name_split (grammar_file, &base, &tab, &ext);
|
||||
if (ext && !yacc_flag)
|
||||
compute_exts_from_gf (ext);
|
||||
}
|
||||
@@ -299,7 +304,7 @@ compute_output_file_names (void)
|
||||
int j;
|
||||
int names = 0;
|
||||
|
||||
compute_base_names ();
|
||||
compute_file_name_parts ();
|
||||
|
||||
/* If not yet done. */
|
||||
if (!src_extension)
|
||||
@@ -308,25 +313,25 @@ compute_output_file_names (void)
|
||||
header_extension = ".h";
|
||||
|
||||
name[names++] = parser_file_name =
|
||||
spec_outfile ? spec_outfile : concat2 (full_base_name, src_extension);
|
||||
spec_outfile ? spec_outfile : concat2 (all_but_ext, src_extension);
|
||||
|
||||
if (defines_flag)
|
||||
{
|
||||
if (! spec_defines_file)
|
||||
spec_defines_file = concat2 (full_base_name, header_extension);
|
||||
spec_defines_file = concat2 (all_but_ext, header_extension);
|
||||
name[names++] = spec_defines_file;
|
||||
}
|
||||
|
||||
if (graph_flag)
|
||||
{
|
||||
if (! spec_graph_file)
|
||||
spec_graph_file = concat2 (short_base_name, ".vcg");
|
||||
spec_graph_file = concat2 (all_but_tab_ext, ".vcg");
|
||||
name[names++] = spec_graph_file;
|
||||
}
|
||||
|
||||
if (report_flag)
|
||||
{
|
||||
spec_verbose_file = concat2 (short_base_name, OUTPUT_EXT);
|
||||
spec_verbose_file = concat2 (all_but_tab_ext, OUTPUT_EXT);
|
||||
name[names++] = spec_verbose_file;
|
||||
}
|
||||
|
||||
|
||||
19
src/files.h
19
src/files.h
@@ -24,28 +24,28 @@
|
||||
# include "uniqstr.h"
|
||||
|
||||
/* File name specified with -o for the output file, or 0 if no -o. */
|
||||
extern char *spec_outfile;
|
||||
extern char const *spec_outfile;
|
||||
|
||||
/* File name for the parser (i.e., the one above, or its default.) */
|
||||
extern char *parser_file_name;
|
||||
extern char const *parser_file_name;
|
||||
|
||||
/* Symbol prefix specified with -p, or 0 if no -p. */
|
||||
extern const char *spec_name_prefix;
|
||||
|
||||
/* File name prefix specified with -b, or 0 if no -b. */
|
||||
extern char *spec_file_prefix;
|
||||
extern char const *spec_file_prefix;
|
||||
|
||||
/* --verbose. */
|
||||
extern char *spec_verbose_file;
|
||||
extern char const *spec_verbose_file;
|
||||
|
||||
/* File name specified for the output VCG graph. */
|
||||
extern char *spec_graph_file;
|
||||
extern char const *spec_graph_file;
|
||||
|
||||
/* File name specified with --defines. */
|
||||
extern char *spec_defines_file;
|
||||
extern char const *spec_defines_file;
|
||||
|
||||
/* Read grammar specifications. */
|
||||
extern FILE *finput;
|
||||
/* Directory prefix of output file names. */
|
||||
extern char const *dir_prefix;
|
||||
|
||||
|
||||
/* If semantic parser, output a .h file that defines YYSTYPE... */
|
||||
@@ -65,7 +65,4 @@ void compute_output_file_names (void);
|
||||
FILE *xfopen (const char *name, const char *mode);
|
||||
void xfclose (FILE *ptr);
|
||||
|
||||
/* Prefix used to generate output file names. */
|
||||
extern char *short_base_name;
|
||||
|
||||
#endif /* !FILES_H_ */
|
||||
|
||||
10
src/output.c
10
src/output.c
@@ -601,6 +601,16 @@ prepare (void)
|
||||
|
||||
/* File names. */
|
||||
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
|
||||
#define DEFINE(Name) MUSCLE_INSERT_STRING (#Name, Name ? Name : "")
|
||||
DEFINE (dir_prefix);
|
||||
DEFINE (parser_file_name);
|
||||
DEFINE (spec_defines_file);
|
||||
DEFINE (spec_file_prefix);
|
||||
DEFINE (spec_graph_file);
|
||||
DEFINE (spec_name_prefix);
|
||||
DEFINE (spec_outfile);
|
||||
DEFINE (spec_verbose_file);
|
||||
#undef DEFINE
|
||||
|
||||
/* User Code. */
|
||||
obstack_1grow (&pre_prologue_obstack, 0);
|
||||
|
||||
@@ -474,8 +474,7 @@ reader (void)
|
||||
obstack_init (&pre_prologue_obstack);
|
||||
obstack_init (&post_prologue_obstack);
|
||||
|
||||
finput = xfopen (grammar_file, "r");
|
||||
gram_in = finput;
|
||||
gram_in = xfopen (grammar_file, "r");
|
||||
|
||||
gram__flex_debug = trace_flag & trace_scan;
|
||||
gram_debug = trace_flag & trace_parse;
|
||||
@@ -523,7 +522,7 @@ reader (void)
|
||||
if (! (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars))
|
||||
abort ();
|
||||
|
||||
xfclose (finput);
|
||||
xfclose (gram_in);
|
||||
|
||||
/* Assign the symbols their symbol numbers. Write #defines for the
|
||||
token symbols into FDEFINES if requested. */
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
|
||||
"@oline@" fprintf (yyout, "%d", lineno + 1);
|
||||
"@ofile@" QPUTS (outname);
|
||||
"@dir_prefix@" QPUTS (dir_prefix);
|
||||
"@output_parser_name@" QPUTS (parser_file_name);
|
||||
"@output_header_name@" QPUTS (spec_defines_file);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user