mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-18 08:43:03 +00:00
(yylineno, yyoutname): Remove static vars, replacing
them with auto vars. Switch to new escape scheme, where @ is the escape character uniformly. Abort if a stray escape character is found. Avoid unbounded input buffer when parsing non-escaped text.
This commit is contained in:
@@ -30,30 +30,46 @@
|
|||||||
|
|
||||||
int skel_lex (void);
|
int skel_lex (void);
|
||||||
|
|
||||||
static int yylineno = 1;
|
|
||||||
static char *yyoutname = NULL;
|
|
||||||
|
|
||||||
%}
|
%}
|
||||||
%%
|
%%
|
||||||
/* This is an approximation, but we don't need more. */
|
|
||||||
^"#output \""[^\"]+\"\n {
|
|
||||||
yytext[yyleng - 2] = '\0';
|
|
||||||
XFREE (yyoutname);
|
|
||||||
yyoutname = xstrdup (yytext + strlen ("#output \""));
|
|
||||||
yyout = xfopen (yyoutname, "w");
|
|
||||||
yylineno = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
"@<:@" fputc ('[', yyout);
|
%{
|
||||||
"@:>@" fputc (']', yyout);
|
int lineno IF_LINT (= 0);
|
||||||
|
char *outname = NULL;
|
||||||
|
%}
|
||||||
|
|
||||||
"__oline__" fprintf (yyout, "%d", yylineno+1);
|
"@output ".*\n {
|
||||||
"__ofile__" fprintf (yyout, "%s", quotearg_style (escape_quoting_style, yyoutname));
|
char const *filename = yytext + sizeof "@output " - 1;
|
||||||
[^@_\n]+ ECHO;
|
yytext[yyleng - 1] = '\0';
|
||||||
\n+ yylineno += yyleng; ECHO;
|
|
||||||
. ECHO;
|
|
||||||
|
|
||||||
<<EOF>> xfclose (yyout); free (yyoutname); return EOF;
|
if (*filename == '@')
|
||||||
|
{
|
||||||
|
if (strcmp (filename, "@output_header_name@") == 0)
|
||||||
|
filename = spec_defines_file;
|
||||||
|
else if (strcmp (filename, "@output_parser_name@") == 0)
|
||||||
|
filename = parser_file_name;
|
||||||
|
else
|
||||||
|
abort ();
|
||||||
|
}
|
||||||
|
|
||||||
|
XFREE (outname);
|
||||||
|
outname = xstrdup (filename);
|
||||||
|
yyout = xfopen (outname, "w");
|
||||||
|
lineno = 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
"@@" fputc ('@', yyout);
|
||||||
|
"@{" fputc ('[', yyout);
|
||||||
|
"@}" fputc (']', yyout);
|
||||||
|
|
||||||
|
"@oline@" fprintf (yyout, "%d", lineno);
|
||||||
|
"@ofile@" fputs (quotearg_style (c_quoting_style, outname), yyout);
|
||||||
|
|
||||||
|
"@" abort ();
|
||||||
|
\n lineno++; ECHO;
|
||||||
|
. ECHO;
|
||||||
|
|
||||||
|
<<EOF>> xfclose (yyout); free (outname); return EOF;
|
||||||
%%
|
%%
|
||||||
|
|
||||||
/*------------------------.
|
/*------------------------.
|
||||||
|
|||||||
Reference in New Issue
Block a user