mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-15 07:13:02 +00:00
`bison ', use m4_index instead of m4_substr since chopping up a string containing M4-special characters causes problems here. Fix a couple of bugs related to special characters in user-specified file names, and make it easier for skeletons to compute output file names with the same file name prefix as Bison-computed output file names. * data/glr.cc, data/push.c, data/yacc.c: In @output, use b4_parser_file_name and b4_spec_defines_file instead of @output_parser_name@ and @output_header_name@, which are now redundant. * data/glr.c, data/lalr1.cc: Likewise. Also, in header #include's, use b4_parser_file_name, b4_spec_defines_file, and the new @basename(FILENAME@) instead of @output_parser_name@ and @output_header_name@, which inappropriately escaped the file names as C string literals. * src/files.c (all_but_ext): Remove static qualifier. (compute_output_file_names): Move `free (all_but_ext)' to... (output_file_names_free): ... here since all_but_ext is needed later. * src/files.h (all_but_ext): Extern. * src/muscle_tab.h (MUSCLE_INSERT_STRING_RAW): New macro that does exactly what MUSCLE_INSERT_STRING used to do. (MUSCLE_INSERT_STRING): Use MUSCLE_OBSTACK_SGROW so that M4-special characters are escaped properly. * src/output.c (prepare): Define muscle file_name_all_but_ext as all_but_ext. For pkgdatadir muscle, maintain previous functionality by using MUSCLE_INSERT_STRING_RAW instead of MUSCLE_INSERT_STRING. The problem is that b4_pkgdatadir is used inside m4_include in the skeletons, so digraphs would never be expanded. Hopefully no one has M4-special characters in his Bison installation path. * src/scan-skel.l: Don't parse @output_header_name@ and @output_parser_name@ anymore since they're now redundant. In @output, use decode_at_digraphs. Parse a new @basename command that invokes last_component. (decode_at_digraphs): New. (BASE_QPUTS): Remove unused. * tests/output.at (AT_CHECK_OUTPUT_FILE_NAME): New macro. (Output file name): New tests.
145 lines
3.4 KiB
C
145 lines
3.4 KiB
C
/* Scan Bison Skeletons. -*- C -*-
|
|
|
|
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006 Free Software
|
|
Foundation, Inc.
|
|
|
|
This file is part of Bison, the GNU Compiler Compiler.
|
|
|
|
Bison is free software; you can redistribute it and/or modify it
|
|
under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2, or (at your option)
|
|
any later version.
|
|
|
|
Bison is distributed in the hope that it will be useful, but
|
|
WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with Bison; see the file COPYING. If not, write to the Free
|
|
Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
|
02110-1301, USA. */
|
|
|
|
%option nodefault noyywrap nounput never-interactive debug
|
|
%option prefix="skel_" outfile="lex.yy.c"
|
|
|
|
%{
|
|
/* Work around a bug in flex 2.5.31. See Debian bug 333231
|
|
<http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=333231>. */
|
|
#undef skel_wrap
|
|
#define skel_wrap() 1
|
|
|
|
#define FLEX_NO_OBSTACK
|
|
#define FLEX_PREFIX(Id) skel_ ## Id
|
|
#include "flex-scanner.h"
|
|
|
|
#include <dirname.h>
|
|
#include <error.h>
|
|
#include <quotearg.h>
|
|
|
|
#include "complain.h"
|
|
#include "getargs.h"
|
|
#include "files.h"
|
|
#include "scan-skel.h"
|
|
|
|
int skel_lex (void);
|
|
|
|
#define QPUTS(String) \
|
|
fputs (quotearg_style (c_quoting_style, String), yyout)
|
|
|
|
static char *decode_at_digraphs (char *in);
|
|
%}
|
|
%%
|
|
|
|
%{
|
|
int lineno IF_LINT (= 0);
|
|
char *outname = NULL;
|
|
%}
|
|
|
|
"@output ".*\n {
|
|
char *file_name = yytext + sizeof "@output " - 1;
|
|
yytext[yyleng - 1] = '\0';
|
|
if (outname)
|
|
{
|
|
free (outname);
|
|
xfclose (yyout);
|
|
}
|
|
outname = decode_at_digraphs (file_name);
|
|
output_file_name_check (outname);
|
|
yyout = xfopen (outname, "w");
|
|
lineno = 1;
|
|
}
|
|
|
|
"@@" fputc ('@', yyout);
|
|
"@{" fputc ('[', yyout);
|
|
"@}" fputc (']', yyout);
|
|
|
|
"@oline@" fprintf (yyout, "%d", lineno + 1);
|
|
"@ofile@" QPUTS (outname);
|
|
"@dir_prefix@" QPUTS (dir_prefix);
|
|
|
|
"@basename(".*"@)" {
|
|
char *file_name = yytext + sizeof "@basename " - 1;
|
|
yytext[yyleng - 2] = '\0';
|
|
file_name = decode_at_digraphs (file_name);
|
|
fputs (last_component (file_name), yyout);
|
|
free (file_name);
|
|
}
|
|
|
|
/* This pattern must not match more than the previous @ patterns. */
|
|
@[^{}@\n]* fatal ("invalid @ in skeleton: %s", yytext);
|
|
\n lineno++; ECHO;
|
|
[^@\n]+ ECHO;
|
|
|
|
<<EOF>> {
|
|
if (outname)
|
|
{
|
|
free (outname);
|
|
xfclose (yyout);
|
|
}
|
|
return EOF;
|
|
}
|
|
%%
|
|
|
|
/*------------------------.
|
|
| Scan a Bison skeleton. |
|
|
`------------------------*/
|
|
|
|
void
|
|
scan_skel (FILE *in)
|
|
{
|
|
skel_in = in;
|
|
skel__flex_debug = trace_flag & trace_skeleton;
|
|
skel_lex ();
|
|
/* Reclaim Flex's buffers. */
|
|
yylex_destroy ();
|
|
}
|
|
|
|
static char *
|
|
decode_at_digraphs (char *in)
|
|
{
|
|
char *out_start = xnmalloc (strlen (in)+1, sizeof *out_start);
|
|
char *out;
|
|
for (out = out_start; *in != '\0'; ++in, ++out)
|
|
{
|
|
if (*in == '@')
|
|
{
|
|
switch (*++in)
|
|
{
|
|
case '@': *out = '@'; break;
|
|
case '{': *out = '['; break;
|
|
case '}': *out = ']'; break;
|
|
default:
|
|
if (*in != '\0')
|
|
in[1] = '\0';
|
|
fatal ("invalid @ in skeleton: %s", in-1);
|
|
break;
|
|
}
|
|
}
|
|
else
|
|
*out = *in;
|
|
}
|
|
*out = '\0';
|
|
return out_start;
|
|
}
|