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 632 "perly.y" /* PROGRAM */ --- 1283,1288 ---- *************** *** 1361,1372 **** #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab int ! yyparse() { register int yym, yyn, yystate; #if YYDEBUG register char *yys; extern char *getenv(); if (yys = getenv("YYDEBUG")) { --- 1291,1348 ---- #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(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(void) { 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; + #ifndef __cplusplus extern char *getenv(); + #endif + #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 **** --- 1357,1368 ---- 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); } --- 1380,1384 ---- 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]; --- 1390,1413 ---- #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]; --- 1445,1469 ---- #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; --- 1475,1481 ---- #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 --- 1494,1500 ---- 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 --- 1505,1509 ---- #if YYDEBUG if (yydebug) ! fprintf(stderr, "yydebug: state %d, reducing by rule %d (%s)\n", yystate, yyn, yyrule[yyn]); #endif *************** *** 2279,2284 **** #if YYDEBUG if (yydebug) ! printf("yydebug: after reduction, shifting from state 0 to\ ! state %d\n", YYFINAL); #endif yystate = YYFINAL; --- 2294,2300 ---- #if YYDEBUG if (yydebug) ! fprintf(stderr, ! "yydebug: after reduction, shifting from state 0 to state %d\n", ! YYFINAL); #endif yystate = YYFINAL; *************** *** 2294,2298 **** if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! printf("yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); } --- 2310,2314 ---- if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; ! fprintf(stderr, "yydebug: state %d, reading %d (%s)\n", YYFINAL, yychar, yys); } *************** *** 2309,2318 **** #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; --- 2325,2349 ---- #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; *************** *** 2320,2327 **** goto yyloop; yyoverflow: ! yyerror("yacc stack overflow"); yyabort: ! return (1); yyaccept: ! return (0); } --- 2351,2358 ---- goto yyloop; yyoverflow: ! yyerror("Out of memory for yacc stack"); yyabort: ! retval = 1; yyaccept: ! return retval; }