mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 16:23:04 +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>
|
2005-10-02 Juan Manuel Guerrero <juan.guerrero@gmx.de>
|
||||||
|
|
||||||
* lib/subpipe.c: New function end_of_output_subpipe() added
|
* 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
|
]b4_epilogue
|
||||||
dnl
|
dnl
|
||||||
@output stack.hh
|
@output b4_dir_prefix[]stack.hh
|
||||||
b4_copyright([stack handling for Bison C++ parsers], [2002, 2003, 2004, 2005])[
|
b4_copyright([stack handling for Bison C++ parsers], [2002, 2003, 2004, 2005])[
|
||||||
|
|
||||||
#ifndef BISON_STACK_HH
|
#ifndef BISON_STACK_HH
|
||||||
|
|||||||
101
src/files.c
101
src/files.c
@@ -29,16 +29,12 @@
|
|||||||
#include <xstrndup.h>
|
#include <xstrndup.h>
|
||||||
|
|
||||||
#include "complain.h"
|
#include "complain.h"
|
||||||
|
#include "dirname.h"
|
||||||
#include "files.h"
|
#include "files.h"
|
||||||
#include "getargs.h"
|
#include "getargs.h"
|
||||||
#include "gram.h"
|
#include "gram.h"
|
||||||
#include "stdio-safer.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 pre_prologue_obstack;
|
||||||
struct obstack post_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,
|
NULL), then the %directive is ignored. As a result, %name-prefix,
|
||||||
for instance, will not be honored. */
|
for instance, will not be honored. */
|
||||||
|
|
||||||
char *spec_outfile = NULL; /* for -o. */
|
char const *spec_outfile = NULL; /* for -o. */
|
||||||
char *spec_file_prefix = NULL; /* for -b. */
|
char const *spec_file_prefix = NULL; /* for -b. */
|
||||||
const char *spec_name_prefix = NULL; /* for -p. */
|
char const *spec_name_prefix = NULL; /* for -p. */
|
||||||
char *spec_verbose_file = NULL; /* for --verbose. */
|
char const *spec_verbose_file = NULL; /* for --verbose. */
|
||||||
char *spec_graph_file = NULL; /* for -g. */
|
char const *spec_graph_file = NULL; /* for -g. */
|
||||||
char *spec_defines_file = NULL; /* for --defines. */
|
char const *spec_defines_file = NULL; /* for --defines. */
|
||||||
char *parser_file_name = NULL;
|
char const *parser_file_name;
|
||||||
|
|
||||||
uniqstr grammar_file = NULL;
|
uniqstr grammar_file = NULL;
|
||||||
uniqstr current_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. */
|
If --output=dir/foo.tab.c was specified, DIR_PREFIX is `dir/',
|
||||||
char *short_base_name = NULL;
|
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). */
|
/* C source file extension (the parser source). */
|
||||||
static char const *src_extension = NULL;
|
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.
|
/* Replace all characters FROM by TO in the string IN.
|
||||||
and returns a new allocated string. */
|
and returns a new allocated string. */
|
||||||
@@ -218,29 +229,27 @@ file_name_split (const char *file_name,
|
|||||||
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
compute_base_names (void)
|
compute_file_name_parts (void)
|
||||||
{
|
{
|
||||||
const char *base, *tab, *ext;
|
const char *base, *tab, *ext;
|
||||||
|
|
||||||
/* If --output=foo.c was specified (SPEC_OUTFILE == foo.c),
|
/* Compute ALL_BUT_EXT and ALL_BUT_TAB_EXT from SPEC_OUTFILE
|
||||||
FULL_BASE_NAME and SHORT_BASE_NAME are `foo'.
|
or GRAMMAR_FILE.
|
||||||
|
|
||||||
If --output=foo.tab.c was specified, FULL_BASE_NAME is `foo.tab'
|
|
||||||
and SHORT_BASE_NAME is `foo'.
|
|
||||||
|
|
||||||
The precise -o name will be used for FTABLE. For other output
|
The precise -o name will be used for FTABLE. For other output
|
||||||
files, remove the ".c" or ".tab.c" suffix. */
|
files, remove the ".c" or ".tab.c" suffix. */
|
||||||
if (spec_outfile)
|
if (spec_outfile)
|
||||||
{
|
{
|
||||||
file_name_split (spec_outfile, &base, &tab, &ext);
|
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. */
|
/* ALL_BUT_EXT goes up the EXT, excluding it. */
|
||||||
full_base_name =
|
all_but_ext =
|
||||||
xstrndup (spec_outfile,
|
xstrndup (spec_outfile,
|
||||||
(strlen (spec_outfile) - (ext ? strlen (ext) : 0)));
|
(strlen (spec_outfile) - (ext ? strlen (ext) : 0)));
|
||||||
|
|
||||||
/* The short base name goes up to TAB, excluding it. */
|
/* ALL_BUT_TAB_EXT goes up to TAB, excluding it. */
|
||||||
short_base_name =
|
all_but_tab_ext =
|
||||||
xstrndup (spec_outfile,
|
xstrndup (spec_outfile,
|
||||||
(strlen (spec_outfile)
|
(strlen (spec_outfile)
|
||||||
- (tab ? strlen (tab) : (ext ? strlen (ext) : 0))));
|
- (tab ? strlen (tab) : (ext ? strlen (ext) : 0))));
|
||||||
@@ -248,40 +257,36 @@ compute_base_names (void)
|
|||||||
if (ext)
|
if (ext)
|
||||||
compute_exts_from_src (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
|
else
|
||||||
{
|
{
|
||||||
|
file_name_split (grammar_file, &base, &tab, &ext);
|
||||||
|
|
||||||
if (spec_file_prefix)
|
if (spec_file_prefix)
|
||||||
{
|
{
|
||||||
/* If --file-prefix=foo was specified, SHORT_BASE_NAME =
|
/* If --file-prefix=foo was specified, ALL_BUT_TAB_EXT =
|
||||||
`foo'. */
|
`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)
|
else if (yacc_flag)
|
||||||
{
|
{
|
||||||
/* If --yacc, then the output is `y.tab.c'. */
|
/* If --yacc, then the output is `y.tab.c'. */
|
||||||
short_base_name = xstrdup ("y");
|
dir_prefix = "";
|
||||||
|
all_but_tab_ext = "y";
|
||||||
}
|
}
|
||||||
else
|
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'. */
|
grammar: `foo/bar.yy' => `bar'. */
|
||||||
file_name_split (grammar_file, &base, &tab, &ext);
|
dir_prefix = "";
|
||||||
short_base_name =
|
all_but_tab_ext =
|
||||||
xstrndup (base,
|
xstrndup (base,
|
||||||
(strlen (base) - (ext ? strlen (ext) : 0)));
|
(strlen (base) - (ext ? strlen (ext) : 0)));
|
||||||
}
|
}
|
||||||
|
|
||||||
full_base_name = xmalloc (strlen (short_base_name)
|
all_but_ext = concat2 (all_but_tab_ext, TAB_EXT);
|
||||||
+ strlen (TAB_EXT) + 1);
|
|
||||||
stpcpy (stpcpy (full_base_name, short_base_name), TAB_EXT);
|
|
||||||
|
|
||||||
/* Compute the extensions from the grammar file name. */
|
/* Compute the extensions from the grammar file name. */
|
||||||
file_name_split (grammar_file, &base, &tab, &ext);
|
|
||||||
if (ext && !yacc_flag)
|
if (ext && !yacc_flag)
|
||||||
compute_exts_from_gf (ext);
|
compute_exts_from_gf (ext);
|
||||||
}
|
}
|
||||||
@@ -299,7 +304,7 @@ compute_output_file_names (void)
|
|||||||
int j;
|
int j;
|
||||||
int names = 0;
|
int names = 0;
|
||||||
|
|
||||||
compute_base_names ();
|
compute_file_name_parts ();
|
||||||
|
|
||||||
/* If not yet done. */
|
/* If not yet done. */
|
||||||
if (!src_extension)
|
if (!src_extension)
|
||||||
@@ -308,25 +313,25 @@ compute_output_file_names (void)
|
|||||||
header_extension = ".h";
|
header_extension = ".h";
|
||||||
|
|
||||||
name[names++] = parser_file_name =
|
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 (defines_flag)
|
||||||
{
|
{
|
||||||
if (! spec_defines_file)
|
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;
|
name[names++] = spec_defines_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (graph_flag)
|
if (graph_flag)
|
||||||
{
|
{
|
||||||
if (! spec_graph_file)
|
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;
|
name[names++] = spec_graph_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (report_flag)
|
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;
|
name[names++] = spec_verbose_file;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
19
src/files.h
19
src/files.h
@@ -24,28 +24,28 @@
|
|||||||
# include "uniqstr.h"
|
# include "uniqstr.h"
|
||||||
|
|
||||||
/* File name specified with -o for the output file, or 0 if no -o. */
|
/* 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.) */
|
/* 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. */
|
/* Symbol prefix specified with -p, or 0 if no -p. */
|
||||||
extern const char *spec_name_prefix;
|
extern const char *spec_name_prefix;
|
||||||
|
|
||||||
/* File name prefix specified with -b, or 0 if no -b. */
|
/* File name prefix specified with -b, or 0 if no -b. */
|
||||||
extern char *spec_file_prefix;
|
extern char const *spec_file_prefix;
|
||||||
|
|
||||||
/* --verbose. */
|
/* --verbose. */
|
||||||
extern char *spec_verbose_file;
|
extern char const *spec_verbose_file;
|
||||||
|
|
||||||
/* File name specified for the output VCG graph. */
|
/* File name specified for the output VCG graph. */
|
||||||
extern char *spec_graph_file;
|
extern char const *spec_graph_file;
|
||||||
|
|
||||||
/* File name specified with --defines. */
|
/* File name specified with --defines. */
|
||||||
extern char *spec_defines_file;
|
extern char const *spec_defines_file;
|
||||||
|
|
||||||
/* Read grammar specifications. */
|
/* Directory prefix of output file names. */
|
||||||
extern FILE *finput;
|
extern char const *dir_prefix;
|
||||||
|
|
||||||
|
|
||||||
/* If semantic parser, output a .h file that defines YYSTYPE... */
|
/* 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);
|
FILE *xfopen (const char *name, const char *mode);
|
||||||
void xfclose (FILE *ptr);
|
void xfclose (FILE *ptr);
|
||||||
|
|
||||||
/* Prefix used to generate output file names. */
|
|
||||||
extern char *short_base_name;
|
|
||||||
|
|
||||||
#endif /* !FILES_H_ */
|
#endif /* !FILES_H_ */
|
||||||
|
|||||||
10
src/output.c
10
src/output.c
@@ -601,6 +601,16 @@ prepare (void)
|
|||||||
|
|
||||||
/* File names. */
|
/* File names. */
|
||||||
MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy");
|
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. */
|
/* User Code. */
|
||||||
obstack_1grow (&pre_prologue_obstack, 0);
|
obstack_1grow (&pre_prologue_obstack, 0);
|
||||||
|
|||||||
@@ -474,8 +474,7 @@ reader (void)
|
|||||||
obstack_init (&pre_prologue_obstack);
|
obstack_init (&pre_prologue_obstack);
|
||||||
obstack_init (&post_prologue_obstack);
|
obstack_init (&post_prologue_obstack);
|
||||||
|
|
||||||
finput = xfopen (grammar_file, "r");
|
gram_in = xfopen (grammar_file, "r");
|
||||||
gram_in = finput;
|
|
||||||
|
|
||||||
gram__flex_debug = trace_flag & trace_scan;
|
gram__flex_debug = trace_flag & trace_scan;
|
||||||
gram_debug = trace_flag & trace_parse;
|
gram_debug = trace_flag & trace_parse;
|
||||||
@@ -523,7 +522,7 @@ reader (void)
|
|||||||
if (! (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars))
|
if (! (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars))
|
||||||
abort ();
|
abort ();
|
||||||
|
|
||||||
xfclose (finput);
|
xfclose (gram_in);
|
||||||
|
|
||||||
/* Assign the symbols their symbol numbers. Write #defines for the
|
/* Assign the symbols their symbol numbers. Write #defines for the
|
||||||
token symbols into FDEFINES if requested. */
|
token symbols into FDEFINES if requested. */
|
||||||
|
|||||||
@@ -74,6 +74,7 @@
|
|||||||
|
|
||||||
"@oline@" fprintf (yyout, "%d", lineno + 1);
|
"@oline@" fprintf (yyout, "%d", lineno + 1);
|
||||||
"@ofile@" QPUTS (outname);
|
"@ofile@" QPUTS (outname);
|
||||||
|
"@dir_prefix@" QPUTS (dir_prefix);
|
||||||
"@output_parser_name@" QPUTS (parser_file_name);
|
"@output_parser_name@" QPUTS (parser_file_name);
|
||||||
"@output_header_name@" QPUTS (spec_defines_file);
|
"@output_header_name@" QPUTS (spec_defines_file);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user