Index: perly.c
***************
*** 13,82 ****
}
! #line 29 "perly.y"
! typedef union {
! I32 ival;
! char *pval;
! OP *opval;
! GV *gvval;
! } YYSTYPE;
! #line 23 "y.tab.c"
! #define WORD 257
! #define METHOD 258
! #define FUNCMETH 259
! #define THING 260
! #define PMFUNC 261
! #define PRIVATEREF 262
! #define FUNC0SUB 263
! #define UNIOPSUB 264
! #define LSTOPSUB 265
! #define LABEL 266
! #define FORMAT 267
! #define SUB 268
! #define ANONSUB 269
! #define PACKAGE 270
! #define USE 271
! #define WHILE 272
! #define UNTIL 273
! #define IF 274
! #define UNLESS 275
! #define ELSE 276
! #define ELSIF 277
! #define CONTINUE 278
! #define FOR 279
! #define LOOPEX 280
! #define DOTDOT 281
! #define FUNC0 282
! #define FUNC1 283
! #define FUNC 284
! #define UNIOP 285
! #define LSTOP 286
! #define RELOP 287
! #define EQOP 288
! #define MULOP 289
! #define ADDOP 290
! #define DOLSHARP 291
! #define DO 292
! #define HASHBRACK 293
! #define NOAMP 294
! #define LOCAL 295
! #define MY 296
! #define OROP 297
! #define ANDOP 298
! #define NOTOP 299
! #define ASSIGNOP 300
! #define OROR 301
! #define ANDAND 302
! #define BITOROP 303
! #define BITANDOP 304
! #define SHIFTOP 305
! #define MATCHOP 306
! #define UMINUS 307
! #define REFGEN 308
! #define POWOP 309
! #define PREINC 310
! #define PREDEC 311
! #define POSTINC 312
! #define POSTDEC 313
! #define ARROW 314
#define YYERRCODE 256
short yylhs[] = { -1,
--- 13,17 ----
}
! #line 16 "perly.c"
#define YYERRCODE 256
short yylhs[] = { -1,
***************
*** 1348,1358 ****
int yyerrflag;
int yychar;
- short *yyssp;
- YYSTYPE *yyvsp;
YYSTYPE yyval;
YYSTYPE yylval;
- short yyss[YYSTACKSIZE];
- YYSTYPE yyvs[YYSTACKSIZE];
- #define yystacksize YYSTACKSIZE
#line 631 "perly.y"
/* PROGRAM */
--- 1283,1288 ----
***************
*** 1361,1372 ****
--- 1291,1347 ----
#define YYACCEPT goto yyaccept
#define YYERROR goto yyerrlab
+
+ struct ysv {
+ short* yyss;
+ YYSTYPE* yyvs;
+ int oldyydebug;
+ int oldyynerrs;
+ int oldyyerrflag;
+ int oldyychar;
+ YYSTYPE oldyyval;
+ YYSTYPE oldyylval;
+ };
+
+ void
+ yydestruct(ptr)
+ void* ptr;
+ {
+ struct ysv* ysave = (struct ysv*)ptr;
+ if (ysave->yyss) Safefree(ysave->yyss);
+ if (ysave->yyvs) Safefree(ysave->yyvs);
+ yydebug = ysave->oldyydebug;
+ yynerrs = ysave->oldyynerrs;
+ yyerrflag = ysave->oldyyerrflag;
+ yychar = ysave->oldyychar;
+ yyval = ysave->oldyyval;
+ yylval = ysave->oldyylval;
+ Safefree(ysave);
+ }
+
int
yyparse()
{
register int yym, yyn, yystate;
+ register short *yyssp;
+ register YYSTYPE *yyvsp;
+ short* yyss;
+ YYSTYPE* yyvs;
+ unsigned yystacksize = YYSTACKSIZE;
+ int retval = 0;
#if YYDEBUG
register char *yys;
extern char *getenv();
+ #endif
+
+ struct ysv *ysave = (struct ysv*)safemalloc(sizeof(struct ysv));
+ SAVEDESTRUCTOR(yydestruct, ysave);
+ ysave->oldyydebug = yydebug;
+ ysave->oldyynerrs = yynerrs;
+ ysave->oldyyerrflag = yyerrflag;
+ ysave->oldyychar = yychar;
+ ysave->oldyyval = yyval;
+ ysave->oldyylval = yylval;
+ #if YYDEBUG
if (yys = getenv("YYDEBUG"))
{
***************
*** 1381,1384 ****
--- 1356,1367 ----
yychar = (-1);
+ /*
+ ** Initialize private stacks (yyparse may be called from an action)
+ */
+ ysave->yyss = yyss = (short*)safemalloc(yystacksize*sizeof(short));
+ ysave->yyvs = yyvs = (YYSTYPE*)safemalloc(yystacksize*sizeof(YYSTYPE));
+ if (!yyvs || !yyss)
+ goto yyoverflow;
+
yyssp = yyss;
yyvsp = yyvs;
***************
*** 1396,1400 ****
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! printf("yydebug: state %d, reading %d (%s)\n", yystate,
yychar, yys);
}
--- 1379,1383 ----
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! fprintf(stderr, "yydebug: state %d, reading %d (%s)\n", yystate,
yychar, yys);
}
***************
*** 1406,1415 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: state %d, shifting to state %d\n",
yystate, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
--- 1389,1412 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr, "yydebug: state %d, shifting to state %d\n",
yystate, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! /*
! ** reallocate and recover. Note that pointers
! ** have to be reset, or bad things will happen
! */
! int yyps_index = (yyssp - yyss);
! int yypv_index = (yyvsp - yyvs);
! yystacksize += YYSTACKSIZE;
! ysave->yyvs = yyvs =
! (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
! ysave->yyss = yyss =
! (short*)realloc((char*)yyss,yystacksize * sizeof(short));
! if (!yyvs || !yyss)
! goto yyoverflow;
! yyssp = yyss + yyps_index;
! yyvsp = yyvs + yypv_index;
}
*++yyssp = yystate = yytable[yyn];
***************
*** 1447,1456 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: state %d, error recovery shifting\
! to state %d\n", *yyssp, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! goto yyoverflow;
}
*++yyssp = yystate = yytable[yyn];
--- 1444,1468 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
! "yydebug: state %d, error recovery shifting to state %d\n",
! *yyssp, yytable[yyn]);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! /*
! ** reallocate and recover. Note that pointers
! ** have to be reset, or bad things will happen
! */
! int yyps_index = (yyssp - yyss);
! int yypv_index = (yyvsp - yyvs);
! yystacksize += YYSTACKSIZE;
! ysave->yyvs = yyvs = (YYSTYPE*)realloc((char*)yyvs,
! yystacksize * sizeof(YYSTYPE));
! ysave->yyss = yyss = (short*)realloc((char*)yyss,
! yystacksize * sizeof(short));
! if (!yyvs || !yyss)
! goto yyoverflow;
! yyssp = yyss + yyps_index;
! yyvsp = yyvs + yypv_index;
}
*++yyssp = yystate = yytable[yyn];
***************
*** 1462,1467 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: error recovery discarding state %d\n",
! *yyssp);
#endif
if (yyssp <= yyss) goto yyabort;
--- 1474,1480 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
! "yydebug: error recovery discarding state %d\n",
! *yyssp);
#endif
if (yyssp <= yyss) goto yyabort;
***************
*** 1480,1485 ****
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! printf("yydebug: state %d, error recovery discards token %d (%s)\n",
! yystate, yychar, yys);
}
#endif
--- 1493,1499 ----
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! fprintf(stderr,
! "yydebug: state %d, error recovery discards token %d (%s)\n",
! yystate, yychar, yys);
}
#endif
***************
*** 1490,1494 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: state %d, reducing by rule %d (%s)\n",
yystate, yyn, yyrule[yyn]);
#endif
--- 1504,1508 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr, "yydebug: state %d, reducing by rule %d (%s)\n",
yystate, yyn, yyrule[yyn]);
#endif
***************
*** 2278,2283 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: after reduction, shifting from state 0 to\
! state %d\n", YYFINAL);
#endif
yystate = YYFINAL;
--- 2292,2298 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
! "yydebug: after reduction, shifting from state 0 to state %d\n",
! YYFINAL);
#endif
yystate = YYFINAL;
***************
*** 2293,2297 ****
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! printf("yydebug: state %d, reading %d (%s)\n",
YYFINAL, yychar, yys);
}
--- 2308,2312 ----
if (yychar <= YYMAXTOKEN) yys = yyname[yychar];
if (!yys) yys = "illegal-symbol";
! fprintf(stderr, "yydebug: state %d, reading %d (%s)\n",
YYFINAL, yychar, yys);
}
***************
*** 2308,2317 ****
#if YYDEBUG
if (yydebug)
! printf("yydebug: after reduction, shifting from state %d \
! to state %d\n", *yyssp, yystate);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! goto yyoverflow;
}
*++yyssp = yystate;
--- 2323,2347 ----
#if YYDEBUG
if (yydebug)
! fprintf(stderr,
! "yydebug: after reduction, shifting from state %d to state %d\n",
! *yyssp, yystate);
#endif
if (yyssp >= yyss + yystacksize - 1)
{
! /*
! ** reallocate and recover. Note that pointers
! ** have to be reset, or bad things will happen
! */
! int yyps_index = (yyssp - yyss);
! int yypv_index = (yyvsp - yyvs);
! yystacksize += YYSTACKSIZE;
! ysave->yyvs = yyvs =
! (YYSTYPE*)realloc((char*)yyvs,yystacksize * sizeof(YYSTYPE));
! ysave->yyss = yyss =
! (short*)realloc((char*)yyss,yystacksize * sizeof(short));
! if (!yyvs || !yyss)
! goto yyoverflow;
! yyssp = yyss + yyps_index;
! yyvsp = yyvs + yypv_index;
}
*++yyssp = yystate;
***************
*** 2319,2326 ****
goto yyloop;
yyoverflow:
! yyerror("yacc stack overflow");
yyabort:
! return (1);
yyaccept:
! return (0);
}
--- 2349,2356 ----
goto yyloop;
yyoverflow:
! yyerror("Out of memory for yacc stack");
yyabort:
! retval = 1;
yyaccept:
! return retval;
}