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:
Akim Demaille
2005-10-02 17:44:49 +00:00
parent ad6a9b97e2
commit 2b81e969ea
7 changed files with 98 additions and 63 deletions

View File

@@ -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

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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_ */

View File

@@ -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);

View File

@@ -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. */

View File

@@ -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);