2005-07-05 Paul Eggert <eggert@cs.ucla.edu>
+ * data/glr.c (yyFail): Drastically simplify; since the format argument
+ never had any % directives, we can simply pass it to yyerror.
+ (yyparse): Use "t a; a=b;" rather than "t a = b;" when a will
+ be modified later, as that is the usual style in glr.c.
+ Problems reported by Paul Hilfinger.
+
Rewrite GLR parser to catch more buffer overrun, storage exhaustion,
and size overflow errors.
* data/glr.c: Include <stdio.h> etc. after user prolog, not before,
static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[);
static void
-yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yyformat, ...)
+yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yymsg)
{
yystack->yyerrflag = 1;
- if (yyformat != NULL)
- {
- char yysmallbuf[1024];
- char const *yymsg = yysmallbuf;
- char *yybigbuf = NULL;
- int yymsglen;
- va_list yyap;
-
- va_start (yyap, yyformat);
- yymsglen = vsnprintf (yysmallbuf, sizeof yysmallbuf, yyformat, yyap);
- va_end (yyap);
-
- if (yymsglen < 0)
- yymsg = "message is too long to be printed";
- else if (sizeof yysmallbuf <= yymsglen && yymsglen < YYSIZEMAX)
- {
- size_t yybigsize = yymsglen;
- yybigsize++;
- yymsg = yybigbuf = YYMALLOC (yybigsize);
-
- va_start (yyap, yyformat);
- vsnprintf (yybigbuf, yybigsize, yyformat, yyap);
- va_end (yyap);
- }
-
- yyerror (]b4_yyerror_args[yymsg);
- YYFREE (yybigbuf);
- }
+ if (yymsg != NULL)
+ yyerror (]b4_yyerror_args[yymsg);
longjmp (yystack->yyexception_buffer, 1);
}
]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[
{
- yySymbol yytoken = YYEMPTY;
+ yySymbol yytoken;
yyGLRStack yystack;
size_t yyposn;
]b4_pure_if(
YYDPRINTF ((stderr, "Starting parse\n"));
+ yytoken = YYEMPTY;
+
if (setjmp (yystack.yyexception_buffer) != 0)
goto yyDone;