#ifndef lint static char const yyrcsid[] = "$FreeBSD: src/usr.bin/yacc/skeleton.c,v 1.28 2000/01/17 02:04:06 bde Exp $"; #endif #include <stdlib.h> #define YYBYACC 1 #define YYMAJOR 1 #define YYMINOR 9 #define YYLEX yylex() #define YYEMPTY -1 #define yyclearin (yychar=(YYEMPTY)) #define yyerrok (yyerrflag=0) #define YYRECOVERING() (yyerrflag!=0) static int yygrowstack(); #define YYPREFIX "yy" #line 84 "jamgram.y" #include "jam.h" #include "lists.h" #include "parse.h" #include "scan.h" #include "compile.h" #include "newstr.h" # define F0 (LIST *(*)(PARSE *, LOL *))0 # define P0 (PARSE *)0 # define S0 (char *)0 # define pappend( l,r ) parse_make( compile_append,l,r,P0,S0,S0,0 ) # define pfor( s,l,r ) parse_make( compile_foreach,l,r,P0,s,S0,0 ) # define pif( l,r,t ) parse_make( compile_if,l,r,t,S0,S0,0 ) # define pincl( l ) parse_make( compile_include,l,P0,P0,S0,S0,0 ) # define plist( s ) parse_make( compile_list,P0,P0,P0,s,S0,0 ) # define plocal( l,r,t ) parse_make( compile_local,l,r,t,S0,S0,0 ) # define pnull() parse_make( compile_null,P0,P0,P0,S0,S0,0 ) # define prule( s,p ) parse_make( compile_rule,p,P0,P0,s,S0,0 ) # define prules( l,r ) parse_make( compile_rules,l,r,P0,S0,S0,0 ) # define pset( l,r,a ) parse_make( compile_set,l,r,P0,S0,S0,a ) # define pset1( l,r,t,a ) parse_make( compile_settings,l,r,t,S0,S0,a ) # define psetc( s,p ) parse_make( compile_setcomp,p,P0,P0,s,S0,0 ) # define psete( s,l,s1,f ) parse_make( compile_setexec,l,P0,P0,s,s1,f ) # define pswitch( l,r ) parse_make( compile_switch,l,r,P0,S0,S0,0 ) # define pnode( l,r ) parse_make( F0,l,r,P0,S0,S0,0 ) # define pcnode( c,l,r ) parse_make( F0,l,r,P0,S0,S0,c ) # define psnode( s,l ) parse_make( F0,l,P0,P0,s,S0,0 ) #line 49 "y.tab.c" #define YYERRCODE 256 #define _BANG 257 #define _BANG_EQUALS 258 #define _AMPERAMPER 259 #define _LPAREN 260 #define _RPAREN 261 #define _PLUS_EQUALS 262 #define _COLON 263 #define _SEMIC 264 #define _LANGLE 265 #define _LANGLE_EQUALS 266 #define _EQUALS 267 #define _RANGLE 268 #define _RANGLE_EQUALS 269 #define _QUESTION_EQUALS 270 #define _LBRACKET 271 #define _RBRACKET 272 #define ACTIONS 273 #define BIND 274 #define CASE 275 #define DEFAULT 276 #define ELSE 277 #define EXISTING 278 #define FOR 279 #define IF 280 #define IGNORE 281 #define IN 282 #define INCLUDE 283 #define LOCAL 284 #define ON 285 #define PIECEMEAL 286 #define QUIETLY 287 #define RETURN 288 #define RULE 289 #define SWITCH 290 #define TOGETHER 291 #define UPDATED 292 #define _LBRACE 293 #define _BARBAR 294 #define _RBRACE 295 #define ARG 296 #define STRING 297 const short yylhs[] = { -1, 0, 0, 2, 2, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 12, 13, 3, 7, 7, 7, 7, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 8, 8, 14, 5, 5, 4, 15, 15, 6, 6, 10, 10, 16, 16, 16, 16, 16, 16, 11, 11, }; const short yylen[] = { 2, 0, 1, 0, 1, 1, 2, 4, 6, 3, 3, 3, 4, 6, 3, 7, 5, 5, 7, 3, 0, 0, 9, 1, 1, 1, 2, 1, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 0, 2, 4, 1, 3, 1, 0, 2, 1, 4, 0, 2, 1, 1, 1, 1, 1, 1, 0, 2, }; const short yydefred[] = { 0, 0, 49, 0, 0, 45, 45, 45, 0, 45, 0, 0, 0, 2, 0, 0, 45, 0, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, 0, 6, 24, 23, 25, 0, 45, 45, 0, 56, 53, 55, 54, 52, 51, 0, 50, 45, 35, 0, 0, 0, 0, 0, 0, 0, 45, 0, 0, 0, 10, 46, 0, 45, 14, 19, 0, 9, 45, 11, 26, 0, 0, 48, 45, 0, 0, 38, 29, 30, 31, 28, 32, 33, 34, 36, 0, 0, 7, 0, 0, 0, 0, 43, 45, 12, 58, 20, 0, 0, 0, 0, 16, 40, 0, 0, 0, 0, 8, 0, 13, 21, 15, 18, 41, 0, 22, }; const short yydgoto[] = { 12, 30, 31, 14, 32, 33, 15, 40, 94, 23, 17, 78, 108, 118, 95, 25, 49, }; const short yysindex[] = { -160, -273, 0, -271, -236, 0, 0, 0, -270, 0, -160, 0, 0, 0, -160, -158, 0, -114, -255, -236, -236, 0, -106, -254, -226, -265, -216, -221, -139, -244, 0, -245, -209, -205, 0, 0, 0, 0, -212, 0, 0, -202, 0, 0, 0, 0, 0, 0, -194, 0, 0, 0, -241, -265, -265, -265, -265, -265, -265, 0, -236, -160, -236, 0, 0, -160, 0, 0, 0, -190, 0, 0, 0, 0, -145, -173, 0, 0, -200, -199, 0, 0, 0, 0, 0, 0, 0, 0, 0, -198, -161, 0, -164, -193, -189, -190, 0, 0, 0, 0, 0, -160, -172, -160, -149, 0, 0, -162, -182, -179, -139, 0, -160, 0, 0, 0, 0, 0, -169, 0, }; const short yyrindex[] = { 135, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, -175, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, -249, 0, 0, -186, 0, 0, 0, 0, 0, 0, -242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -157, 0, 0, 0, 4, 0, 0, 0, -153, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, -247, 0, 0, 0, 0, -153, 0, 0, 0, 0, 0, -157, 1, 4, 0, 0, 0, 0, 0, 0, 0, 0, -258, 0, 0, 0, 0, 0, 0, 0, }; const short yygindex[] = { 0, 19, -29, -28, 2, -14, 9, 65, 48, -4, 0, 0, 0, 0, 0, 0, 0, }; #define YYTABLESIZE 299 const short yytable[] = { 68, 17, 41, 5, 3, 60, 1, 24, 26, 27, 27, 29, 27, 22, 37, 51, 52, 3, 60, 13, 80, 19, 42, 16, 20, 18, 28, 50, 22, 22, 42, 21, 89, 34, 64, 1, 91, 3, 63, 61, 62, 74, 75, 67, 27, 27, 37, 37, 65, 69, 70, 66, 79, 62, 71, 73, 88, 96, 90, 72, 21, 87, 81, 82, 83, 84, 85, 86, 92, 22, 76, 22, 109, 44, 111, 44, 44, 44, 44, 99, 77, 44, 116, 117, 44, 93, 44, 47, 45, 45, 44, 98, 47, 100, 101, 47, 45, 102, 60, 107, 103, 47, 113, 104, 35, 110, 105, 44, 44, 36, 47, 1, 37, 2, 112, 114, 115, 35, 38, 3, 4, 45, 36, 5, 6, 37, 119, 39, 7, 8, 9, 38, 1, 10, 2, 1, 11, 57, 3, 97, 3, 4, 39, 106, 5, 0, 0, 0, 0, 7, 8, 9, 53, 0, 10, 0, 0, 11, 0, 54, 55, 56, 57, 58, 42, 0, 0, 43, 0, 0, 0, 0, 44, 45, 0, 0, 59, 46, 47, 0, 0, 0, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 0, 17, 0, 17, 0, 5, 3, 17, 17, 0, 0, 17, 17, 0, 0, 0, 17, 17, 17, 0, 0, 17, 0, 17, 17, 5, 3, }; const short yycheck[] = { 28, 0, 16, 0, 0, 259, 271, 5, 6, 7, 259, 9, 261, 4, 261, 19, 20, 275, 259, 0, 261, 257, 264, 296, 260, 296, 296, 282, 19, 20, 272, 296, 61, 14, 25, 271, 65, 295, 264, 293, 294, 39, 40, 264, 293, 294, 293, 294, 264, 293, 295, 267, 50, 294, 263, 267, 60, 71, 62, 264, 296, 59, 53, 54, 55, 56, 57, 58, 66, 60, 272, 62, 101, 259, 103, 261, 262, 263, 264, 77, 274, 267, 110, 112, 270, 275, 272, 262, 263, 264, 276, 264, 267, 293, 293, 270, 271, 295, 259, 97, 264, 276, 264, 296, 262, 277, 295, 293, 294, 267, 285, 271, 270, 273, 263, 297, 295, 262, 276, 279, 280, 296, 267, 283, 284, 270, 295, 285, 288, 289, 290, 276, 271, 293, 273, 0, 296, 293, 295, 74, 279, 280, 295, 95, 283, -1, -1, -1, -1, 288, 289, 290, 258, -1, 293, -1, -1, 296, -1, 265, 266, 267, 268, 269, 278, -1, -1, 281, -1, -1, -1, -1, 286, 287, -1, -1, 282, 291, 292, -1, -1, -1, 296, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 271, -1, 273, -1, 275, -1, 275, 275, 279, 280, -1, -1, 283, 284, -1, -1, -1, 288, 289, 290, -1, -1, 293, -1, 295, 296, 295, 295, }; #define YYFINAL 12 #ifndef YYDEBUG #define YYDEBUG 0 #endif #define YYMAXTOKEN 297 #if YYDEBUG const char * const yyname[] = { "end-of-file",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,"_BANG","_BANG_EQUALS", "_AMPERAMPER","_LPAREN","_RPAREN","_PLUS_EQUALS","_COLON","_SEMIC","_LANGLE", "_LANGLE_EQUALS","_EQUALS","_RANGLE","_RANGLE_EQUALS","_QUESTION_EQUALS", "_LBRACKET","_RBRACKET","ACTIONS","BIND","CASE","DEFAULT","ELSE","EXISTING", "FOR","IF","IGNORE","IN","INCLUDE","LOCAL","ON","PIECEMEAL","QUIETLY","RETURN", "RULE","SWITCH","TOGETHER","UPDATED","_LBRACE","_BARBAR","_RBRACE","ARG", "STRING", }; const char * const yyrule[] = { "$accept : run", "run :", "run : rules", "block :", "block : rules", "rules : rule", "rules : rule rules", "rules : LOCAL list _SEMIC block", "rules : LOCAL list _EQUALS list _SEMIC block", "rule : _LBRACE block _RBRACE", "rule : INCLUDE list _SEMIC", "rule : ARG lol _SEMIC", "rule : arg assign list _SEMIC", "rule : arg ON list assign list _SEMIC", "rule : RETURN list _SEMIC", "rule : FOR ARG IN list _LBRACE block _RBRACE", "rule : SWITCH list _LBRACE cases _RBRACE", "rule : IF cond _LBRACE block _RBRACE", "rule : IF cond _LBRACE block _RBRACE ELSE rule", "rule : RULE ARG rule", "$$1 :", "$$2 :", "rule : ACTIONS eflags ARG bindlist _LBRACE $$1 STRING $$2 _RBRACE", "assign : _EQUALS", "assign : _PLUS_EQUALS", "assign : _QUESTION_EQUALS", "assign : DEFAULT _EQUALS", "cond : arg", "cond : arg _EQUALS arg", "cond : arg _BANG_EQUALS arg", "cond : arg _LANGLE arg", "cond : arg _LANGLE_EQUALS arg", "cond : arg _RANGLE arg", "cond : arg _RANGLE_EQUALS arg", "cond : arg IN list", "cond : _BANG cond", "cond : cond _AMPERAMPER cond", "cond : cond _BARBAR cond", "cond : _LPAREN cond _RPAREN", "cases :", "cases : case cases", "case : CASE ARG _COLON block", "lol : list", "lol : list _COLON lol", "list : listp", "listp :", "listp : listp arg", "arg : ARG", "arg : _LBRACKET ARG lol _RBRACKET", "eflags :", "eflags : eflags eflag", "eflag : UPDATED", "eflag : TOGETHER", "eflag : IGNORE", "eflag : QUIETLY", "eflag : PIECEMEAL", "eflag : EXISTING", "bindlist :", "bindlist : BIND list", }; #endif #ifndef YYSTYPE typedef int YYSTYPE; #endif #if YYDEBUG #include <stdio.h> #endif #ifdef YYSTACKSIZE #undef YYMAXDEPTH #define YYMAXDEPTH YYSTACKSIZE #else #ifdef YYMAXDEPTH #define YYSTACKSIZE YYMAXDEPTH #else #define YYSTACKSIZE 10000 #define YYMAXDEPTH 10000 #endif #endif #define YYINITSTACKSIZE 200 int yydebug; int yynerrs; int yyerrflag; int yychar; short *yyssp; YYSTYPE *yyvsp; YYSTYPE yyval; YYSTYPE yylval; short *yyss; short *yysslim; YYSTYPE *yyvs; int yystacksize; /* allocate initial stack or double stack size, up to YYMAXDEPTH */ static int yygrowstack() { int newsize, i; short *newss; YYSTYPE *newvs; if ((newsize = yystacksize) == 0) newsize = YYINITSTACKSIZE; else if (newsize >= YYMAXDEPTH) return -1; else if ((newsize *= 2) > YYMAXDEPTH) newsize = YYMAXDEPTH; i = yyssp - yyss; newss = yyss ? (short *)realloc(yyss, newsize * sizeof *newss) : (short *)malloc(newsize * sizeof *newss); if (newss == NULL) return -1; yyss = newss; yyssp = newss + i; newvs = yyvs ? (YYSTYPE *)realloc(yyvs, newsize * sizeof *newvs) : (YYSTYPE *)malloc(newsize * sizeof *newvs); if (newvs == NULL) return -1; yyvs = newvs; yyvsp = newvs + i; yystacksize = newsize; yysslim = yyss + newsize - 1; return 0; } #define YYABORT goto yyabort #define YYREJECT goto yyabort #define YYACCEPT goto yyaccept #define YYERROR goto yyerrlab #ifndef YYPARSE_PARAM #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG void #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG #define YYPARSE_PARAM_DECL #endif /* ANSI-C/C++ */ #else /* YYPARSE_PARAM */ #ifndef YYPARSE_PARAM_TYPE #define YYPARSE_PARAM_TYPE void * #endif #if defined(__cplusplus) || __STDC__ #define YYPARSE_PARAM_ARG YYPARSE_PARAM_TYPE YYPARSE_PARAM #define YYPARSE_PARAM_DECL #else /* ! ANSI-C/C++ */ #define YYPARSE_PARAM_ARG YYPARSE_PARAM #define YYPARSE_PARAM_DECL YYPARSE_PARAM_TYPE YYPARSE_PARAM; #endif /* ANSI-C/C++ */ #endif /* ! YYPARSE_PARAM */ int yyparse (YYPARSE_PARAM_ARG) YYPARSE_PARAM_DECL { register int yym, yyn, yystate; #if YYDEBUG register const char *yys; if ((yys = getenv("YYDEBUG"))) { yyn = *yys; if (yyn >= '0' && yyn <= '9') yydebug = yyn - '0'; } #endif yynerrs = 0; yyerrflag = 0; yychar = (-1); if (yyss == NULL && yygrowstack()) goto yyoverflow; yyssp = yyss; yyvsp = yyvs; *yyssp = yystate = 0; yyloop: if ((yyn = yydefred[yystate])) goto yyreduce; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif } if ((yyn = yysindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, shifting to state %d\n", YYPREFIX, yystate, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; yychar = (-1); if (yyerrflag > 0) --yyerrflag; goto yyloop; } if ((yyn = yyrindex[yystate]) && (yyn += yychar) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yychar) { yyn = yytable[yyn]; goto yyreduce; } if (yyerrflag) goto yyinrecovery; #if defined(lint) || defined(__GNUC__) goto yynewerror; #endif yynewerror: yyerror("syntax error"); #if defined(lint) || defined(__GNUC__) goto yyerrlab; #endif yyerrlab: ++yynerrs; yyinrecovery: if (yyerrflag < 3) { yyerrflag = 3; for (;;) { if ((yyn = yysindex[*yyssp]) && (yyn += YYERRCODE) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == YYERRCODE) { #if YYDEBUG if (yydebug) printf("%sdebug: state %d, error recovery shifting\ to state %d\n", YYPREFIX, *yyssp, yytable[yyn]); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate = yytable[yyn]; *++yyvsp = yylval; goto yyloop; } else { #if YYDEBUG if (yydebug) printf("%sdebug: error recovery discarding state %d\n", YYPREFIX, *yyssp); #endif if (yyssp <= yyss) goto yyabort; --yyssp; --yyvsp; } } } else { if (yychar == 0) goto yyabort; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, error recovery discards token %d (%s)\n", YYPREFIX, yystate, yychar, yys); } #endif yychar = (-1); goto yyloop; } yyreduce: #if YYDEBUG if (yydebug) printf("%sdebug: state %d, reducing by rule %d (%s)\n", YYPREFIX, yystate, yyn, yyrule[yyn]); #endif yym = yylen[yyn]; yyval = yyvsp[1-yym]; switch (yyn) { case 2: #line 122 "jamgram.y" { parse_save( yyvsp[0].parse ); } break; case 3: #line 133 "jamgram.y" { yyval.parse = pnull(); } break; case 4: #line 135 "jamgram.y" { yyval.parse = yyvsp[0].parse; } break; case 5: #line 139 "jamgram.y" { yyval.parse = yyvsp[0].parse; } break; case 6: #line 141 "jamgram.y" { yyval.parse = prules( yyvsp[-1].parse, yyvsp[0].parse ); } break; case 7: #line 143 "jamgram.y" { yyval.parse = plocal( yyvsp[-2].parse, pnull(), yyvsp[0].parse ); } break; case 8: #line 145 "jamgram.y" { yyval.parse = plocal( yyvsp[-4].parse, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 9: #line 149 "jamgram.y" { yyval.parse = yyvsp[-1].parse; } break; case 10: #line 151 "jamgram.y" { yyval.parse = pincl( yyvsp[-1].parse ); } break; case 11: #line 153 "jamgram.y" { yyval.parse = prule( yyvsp[-2].string, yyvsp[-1].parse ); } break; case 12: #line 155 "jamgram.y" { yyval.parse = pset( yyvsp[-3].parse, yyvsp[-1].parse, yyvsp[-2].number ); } break; case 13: #line 157 "jamgram.y" { yyval.parse = pset1( yyvsp[-5].parse, yyvsp[-3].parse, yyvsp[-1].parse, yyvsp[-2].number ); } break; case 14: #line 159 "jamgram.y" { yyval.parse = yyvsp[-1].parse; } break; case 15: #line 161 "jamgram.y" { yyval.parse = pfor( yyvsp[-5].string, yyvsp[-3].parse, yyvsp[-1].parse ); } break; case 16: #line 163 "jamgram.y" { yyval.parse = pswitch( yyvsp[-3].parse, yyvsp[-1].parse ); } break; case 17: #line 165 "jamgram.y" { yyval.parse = pif( yyvsp[-3].parse, yyvsp[-1].parse, pnull() ); } break; case 18: #line 167 "jamgram.y" { yyval.parse = pif( yyvsp[-5].parse, yyvsp[-3].parse, yyvsp[0].parse ); } break; case 19: #line 169 "jamgram.y" { yyval.parse = psetc( yyvsp[-1].string, yyvsp[0].parse ); } break; case 20: #line 171 "jamgram.y" { yymode( SCAN_STRING ); } break; case 21: #line 173 "jamgram.y" { yymode( SCAN_NORMAL ); } break; case 22: #line 175 "jamgram.y" { yyval.parse = psete( yyvsp[-6].string,yyvsp[-5].parse,yyvsp[-2].string,yyvsp[-7].number ); } break; case 23: #line 183 "jamgram.y" { yyval.number = ASSIGN_SET; } break; case 24: #line 185 "jamgram.y" { yyval.number = ASSIGN_APPEND; } break; case 25: #line 187 "jamgram.y" { yyval.number = ASSIGN_DEFAULT; } break; case 26: #line 189 "jamgram.y" { yyval.number = ASSIGN_DEFAULT; } break; case 27: #line 197 "jamgram.y" { yyval.parse = pcnode( COND_EXISTS, yyvsp[0].parse, pnull() ); } break; case 28: #line 199 "jamgram.y" { yyval.parse = pcnode( COND_EQUALS, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 29: #line 201 "jamgram.y" { yyval.parse = pcnode( COND_NOTEQ, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 30: #line 203 "jamgram.y" { yyval.parse = pcnode( COND_LESS, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 31: #line 205 "jamgram.y" { yyval.parse = pcnode( COND_LESSEQ, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 32: #line 207 "jamgram.y" { yyval.parse = pcnode( COND_MORE, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 33: #line 209 "jamgram.y" { yyval.parse = pcnode( COND_MOREEQ, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 34: #line 211 "jamgram.y" { yyval.parse = pcnode( COND_IN, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 35: #line 213 "jamgram.y" { yyval.parse = pcnode( COND_NOT, yyvsp[0].parse, P0 ); } break; case 36: #line 215 "jamgram.y" { yyval.parse = pcnode( COND_AND, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 37: #line 217 "jamgram.y" { yyval.parse = pcnode( COND_OR, yyvsp[-2].parse, yyvsp[0].parse ); } break; case 38: #line 219 "jamgram.y" { yyval.parse = yyvsp[-1].parse; } break; case 39: #line 229 "jamgram.y" { yyval.parse = P0; } break; case 40: #line 231 "jamgram.y" { yyval.parse = pnode( yyvsp[-1].parse, yyvsp[0].parse ); } break; case 41: #line 235 "jamgram.y" { yyval.parse = psnode( yyvsp[-2].string, yyvsp[0].parse ); } break; case 42: #line 244 "jamgram.y" { yyval.parse = pnode( P0, yyvsp[0].parse ); } break; case 43: #line 246 "jamgram.y" { yyval.parse = pnode( yyvsp[0].parse, yyvsp[-2].parse ); } break; case 44: #line 256 "jamgram.y" { yyval.parse = yyvsp[0].parse; yymode( SCAN_NORMAL ); } break; case 45: #line 260 "jamgram.y" { yyval.parse = pnull(); yymode( SCAN_PUNCT ); } break; case 46: #line 262 "jamgram.y" { yyval.parse = pappend( yyvsp[-1].parse, yyvsp[0].parse ); } break; case 47: #line 266 "jamgram.y" { yyval.parse = plist( yyvsp[0].string ); } break; case 48: #line 268 "jamgram.y" { yyval.parse = prule( yyvsp[-2].string, yyvsp[-1].parse ); } break; case 49: #line 278 "jamgram.y" { yyval.number = 0; } break; case 50: #line 280 "jamgram.y" { yyval.number = yyvsp[-1].number | yyvsp[0].number; } break; case 51: #line 284 "jamgram.y" { yyval.number = EXEC_UPDATED; } break; case 52: #line 286 "jamgram.y" { yyval.number = EXEC_TOGETHER; } break; case 53: #line 288 "jamgram.y" { yyval.number = EXEC_IGNORE; } break; case 54: #line 290 "jamgram.y" { yyval.number = EXEC_QUIETLY; } break; case 55: #line 292 "jamgram.y" { yyval.number = EXEC_PIECEMEAL; } break; case 56: #line 294 "jamgram.y" { yyval.number = EXEC_EXISTING; } break; case 57: #line 303 "jamgram.y" { yyval.parse = pnull(); } break; case 58: #line 305 "jamgram.y" { yyval.parse = yyvsp[0].parse; } break; #line 758 "y.tab.c" } yyssp -= yym; yystate = *yyssp; yyvsp -= yym; yym = yylhs[yyn]; if (yystate == 0 && yym == 0) { #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state 0 to\ state %d\n", YYPREFIX, YYFINAL); #endif yystate = YYFINAL; *++yyssp = YYFINAL; *++yyvsp = yyval; if (yychar < 0) { if ((yychar = yylex()) < 0) yychar = 0; #if YYDEBUG if (yydebug) { yys = 0; if (yychar <= YYMAXTOKEN) yys = yyname[yychar]; if (!yys) yys = "illegal-symbol"; printf("%sdebug: state %d, reading %d (%s)\n", YYPREFIX, YYFINAL, yychar, yys); } #endif } if (yychar == 0) goto yyaccept; goto yyloop; } if ((yyn = yygindex[yym]) && (yyn += yystate) >= 0 && yyn <= YYTABLESIZE && yycheck[yyn] == yystate) yystate = yytable[yyn]; else yystate = yydgoto[yym]; #if YYDEBUG if (yydebug) printf("%sdebug: after reduction, shifting from state %d \ to state %d\n", YYPREFIX, *yyssp, yystate); #endif if (yyssp >= yysslim && yygrowstack()) { goto yyoverflow; } *++yyssp = yystate; *++yyvsp = yyval; goto yyloop; yyoverflow: yyerror("yacc stack overflow"); yyabort: return (1); yyaccept: return (0); }
# | Change | User | Description | Committed | |
---|---|---|---|---|---|
#4 | 1270 | Matt Armstrong | In prep for publishing all my patches to jam. | ||
#3 | 1088 | Matt Armstrong | Merge in changes from upstream. | ||
#2 | 293 | Matt Armstrong |
Fix a crash bug in jam by adding reference counting to the PARSE struct. The bug occurs when a rule re-defines itself. This can only happen by using the include statement, as follows. JamfileA: ---------------------------------------------------- rule DoInclude { ECHO JamfileA DoInclude $(<) start ; include $(<) ; ECHO JamfileA DoInclude $(<) end ; } DoInclude JambileB ; ---------------------------------------------------- JamfileB: ---------------------------------------------------- rule DoInclude { ECHO JamfileB DoInclude ; } DoInclude JambileC ; ---------------------------------------------------- With these two jamfiles you can reproduce the crash bug by running "jam -fJamfileA". If that doesn't work, change parse_free() such that it memsets PARSE struct being freed to something bogus like 0x03 and try again (or use Purify and watch the free memory read warnings). The problem is that compile_setcomp() just frees the PARSE without regard for the possibility that it might be executing. In the case above, JamfileA's DoInclude is re-defined by JamfileB while it is still being executed. The simple fix is to just have compile_setcomp() not free the PARSE. This would introduce a memory leak for every re-defined rule. My fix introduces reference counting of the PARSE struct. A PARSE is allocated with a reference count of 1 and when it goes to 0 it is freed. Every place that was a parse_free() is now a parse_decref(). In addition, compile_rules() increments the reference count of its PARSE around the calls to its left and right functions. Perhaps there a better fix! |
||
#1 | 289 | Matt Armstrong | Initial branch. |