(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:
Paul Eggert
2002-11-12 07:27:51 +00:00
parent ac060e78a3
commit e9683cfd3d

View File

@@ -30,30 +30,46 @@
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);
"__ofile__" fprintf (yyout, "%s", quotearg_style (escape_quoting_style, yyoutname));
[^@_\n]+ ECHO;
\n+ yylineno += yyleng; ECHO;
. ECHO;
"@output ".*\n {
char const *filename = yytext + sizeof "@output " - 1;
yytext[yyleng - 1] = '\0';
<<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;
%%
/*------------------------.