|
|
1.1 ! root 1: ! 2: # line 1 "gram.y" ! 3: #include "defs" ! 4: static char *sccsid = "@(#)gram.y 8th Edition (Bell Labs) 85/05/14"; ! 5: ! 6: # line 6 "gram.y" ! 7: typedef union ! 8: { ! 9: struct shblock *yshblock; ! 10: depblkp ydepblock; ! 11: nameblkp ynameblock; ! 12: } YYSTYPE; ! 13: # define NAME 257 ! 14: # define SHELLINE 258 ! 15: # define START 259 ! 16: # define MACRODEF 260 ! 17: # define COLON 261 ! 18: # define DOUBLECOLON 262 ! 19: # define GREATER 263 ! 20: # define AMPER 264 ! 21: # define AMPERAMPER 265 ! 22: #define yyclearin yychar = -1 ! 23: #define yyerrok yyerrflag = 0 ! 24: extern int yychar; ! 25: extern short yyerrflag; ! 26: #ifndef YYMAXDEPTH ! 27: #define YYMAXDEPTH 150 ! 28: #endif ! 29: YYSTYPE yylval, yyval; ! 30: ! 31: # line 21 "gram.y" ! 32: struct depblock *pp; ! 33: FSTATIC struct shblock *prevshp; ! 34: ! 35: FSTATIC struct nameblock *lefts[NLEFTS]; ! 36: struct nameblock *leftp; ! 37: FSTATIC int nlefts; ! 38: ! 39: struct lineblock *lp, *lpp; ! 40: FSTATIC struct depblock *prevdep; ! 41: FSTATIC int sepc; ! 42: FSTATIC int allnowait; ! 43: ! 44: FSTATIC struct fstack ! 45: { ! 46: FILE *fin; ! 47: char *fname; ! 48: int lineno; ! 49: } filestack[MAXINCLUDE]; ! 50: FSTATIC int ninclude = 0; ! 51: # define YYERRCODE 256 ! 52: ! 53: # line 150 "gram.y" ! 54: ! 55: ! 56: FSTATIC char *zznextc; /* null if need another line; ! 57: otherwise points to next char */ ! 58: FSTATIC int yylineno; ! 59: FSTATIC FILE * fin; ! 60: ! 61: parse(name) ! 62: char *name; ! 63: { ! 64: extern int yylineno; ! 65: FILE *stream; ! 66: extern char *zznextc; ! 67: ! 68: if(name == CHNULL) ! 69: { ! 70: stream = NULL; ! 71: name = "(builtin-rules)"; ! 72: } ! 73: else if(equal(name, "-")) ! 74: { ! 75: stream = stdin; ! 76: name = "(stdin)"; ! 77: } ! 78: else if( (stream = fopen(name, "r")) == NULL) ! 79: return NO; ! 80: filestack[0].fname = copys(name); ! 81: ninclude = 1; ! 82: fin = stream; ! 83: yylineno = 0; ! 84: zznextc = 0; ! 85: ! 86: if( yyparse() ) ! 87: fatal("Description file error"); ! 88: ! 89: if(fin) ! 90: fclose(fin); ! 91: return YES; ! 92: } ! 93: ! 94: ! 95: yylex() ! 96: { ! 97: register char *p; ! 98: register char *q; ! 99: char word[INMAX]; ! 100: ! 101: if(! zznextc ) ! 102: return nextlin() ; ! 103: ! 104: while( isspace(*zznextc) ) ! 105: ++zznextc; ! 106: switch(*zznextc) ! 107: { ! 108: case '\0': ! 109: return nextlin() ; ! 110: ! 111: case '|': ! 112: if(zznextc[1]==':') ! 113: { ! 114: zznextc += 2; ! 115: return DOUBLECOLON; ! 116: } ! 117: break; ! 118: case ':': ! 119: if(*++zznextc == ':') ! 120: { ! 121: ++zznextc; ! 122: return DOUBLECOLON; ! 123: } ! 124: return COLON; ! 125: case '>': ! 126: ++zznextc; ! 127: return GREATER; ! 128: case '&': ! 129: if(*++zznextc == '&') ! 130: { ! 131: ++zznextc; ! 132: return AMPERAMPER; ! 133: } ! 134: return AMPER; ! 135: case ';': ! 136: return retsh(zznextc) ; ! 137: } ! 138: ! 139: p = zznextc; ! 140: q = word; ! 141: ! 142: while( ! ( funny[*p] & TERMINAL) ) ! 143: *q++ = *p++; ! 144: ! 145: if(p != zznextc) ! 146: { ! 147: *q = '\0'; ! 148: if((yylval.ynameblock=srchname(word))==0) ! 149: yylval.ynameblock = makename(word); ! 150: zznextc = p; ! 151: return NAME; ! 152: } ! 153: ! 154: else { ! 155: char junk[100]; ! 156: sprintf(junk, "Bad character %c (octal %o), line %d of file %s", ! 157: *zznextc, *zznextc, yylineno, filestack[ninclude-1].fname); ! 158: fatal(junk); ! 159: } ! 160: return 0; /* never executed */ ! 161: } ! 162: ! 163: ! 164: ! 165: ! 166: ! 167: retsh(q) ! 168: char *q; ! 169: { ! 170: register char *p; ! 171: struct shblock *sp; ! 172: char *copys(); ! 173: ! 174: for(p=q+1 ; *p==' '||*p=='\t' ; ++p) ; ! 175: ! 176: sp = ALLOC(shblock); ! 177: sp->nxtshblock = NULL; ! 178: sp->shbp = (fin ? copys(p) : p ); ! 179: yylval.yshblock = sp; ! 180: zznextc = 0; ! 181: return SHELLINE; ! 182: } ! 183: ! 184: nextlin() ! 185: { ! 186: static char yytext[INMAX]; ! 187: static char *yytextl = yytext+INMAX; ! 188: char *text, templin[INMAX]; ! 189: register char c; ! 190: register char *p, *t; ! 191: char lastch, *lastchp; ! 192: extern char **linesptr; ! 193: int incom; ! 194: int kc; ! 195: ! 196: again: ! 197: ! 198: incom = NO; ! 199: zznextc = 0; ! 200: ! 201: if(fin == NULL) ! 202: { ! 203: if( (text = *linesptr++) == 0) ! 204: return 0; ! 205: ++yylineno; ! 206: } ! 207: ! 208: else { ! 209: for(p = text = yytext ; p<yytextl ; *p++ = kc) ! 210: switch(kc = getc(fin)) ! 211: { ! 212: case '\t': ! 213: if(p == yytext) ! 214: incom = YES; ! 215: break; ! 216: ! 217: case ';': ! 218: incom = YES; ! 219: break; ! 220: ! 221: case '#': ! 222: if(! incom) ! 223: kc = '\0'; ! 224: break; ! 225: ! 226: case '\n': ! 227: ++yylineno; ! 228: if(p==yytext || p[-1]!='\\') ! 229: { ! 230: *p = '\0'; ! 231: goto endloop; ! 232: } ! 233: p[-1] = ' '; ! 234: while( (kc=getc(fin))=='\t' || kc==' ' || kc=='\n') ! 235: if(kc == '\n') ! 236: ++yylineno; ! 237: ! 238: if(kc != EOF) ! 239: break; ! 240: case EOF: ! 241: *p = '\0'; ! 242: if(ninclude > 1) ! 243: { ! 244: register struct fstack *stp; ! 245: fclose(fin); ! 246: --ninclude; ! 247: stp = filestack + ninclude; ! 248: fin = stp->fin; ! 249: yylineno = stp->lineno; ! 250: free(stp->fname); ! 251: goto again; ! 252: } ! 253: return 0; ! 254: } ! 255: ! 256: fatal("line too long"); ! 257: } ! 258: ! 259: endloop: ! 260: ! 261: if((c = text[0]) == '\t') ! 262: return retsh(text) ; ! 263: ! 264: if(isalpha(c) || isdigit(c) || c==' ' || c=='.') ! 265: for(p=text+1; *p!='\0'; ) ! 266: if(*p == ':') ! 267: break; ! 268: else if(*p++ == '=') ! 269: { ! 270: eqsign(text); ! 271: return MACRODEF; ! 272: } ! 273: ! 274: ! 275: if(!strncmp(text, "include", 7) && isinclude(text+7)) ! 276: goto again; ! 277: ! 278: /* substitute for macros on dependency line up to the semicolon if any */ ! 279: ! 280: for(t = yytext ; *t!='\0' && *t!=';' ; ++t) ! 281: ; ! 282: ! 283: lastchp = t; ! 284: lastch = *t; ! 285: *t = '\0'; /* replace the semi with a null so subst will stop */ ! 286: ! 287: subst(yytext, templin); /* Substitute for macros on dependency lines */ ! 288: ! 289: if(lastch) /* copy the stuff after the semicolon */ ! 290: { ! 291: *lastchp = lastch; ! 292: strcat(templin, lastchp); ! 293: } ! 294: ! 295: strcpy(yytext, templin); ! 296: ! 297: for(p = zznextc = text ; *p ; ++p ) ! 298: if(*p!=' ' && *p!='\t') ! 299: return START; ! 300: goto again; ! 301: } ! 302: ! 303: ! 304: ! 305: isinclude(s) ! 306: register char *s; ! 307: { ! 308: register char *t; ! 309: register struct fstack *p; ! 310: ! 311: for(t=s; *t==' ' || *t=='\t' ; ++t) ! 312: ; ! 313: if(t == s) ! 314: return NO; ! 315: ! 316: for(s = t; *s!='\n' && *s!='#' && *s!='\0' ; ++s) ! 317: if(*s == ':') ! 318: return NO; ! 319: *s = '\0'; ! 320: ! 321: if(ninclude >= MAXINCLUDE) ! 322: fatal("include depth exceeded"); ! 323: p = filestack + ninclude; ! 324: p->fin = fin; ! 325: p->lineno = yylineno; ! 326: p->fname = copys(t); ! 327: if( (fin = fopen(t, "r")) == NULL) ! 328: fatal1("Cannot open include file %s", t); ! 329: yylineno = 0; ! 330: ++ninclude; ! 331: return YES; ! 332: } ! 333: ! 334: ! 335: ! 336: yyerror(s) ! 337: char *s; ! 338: { ! 339: char buf[100]; ! 340: ! 341: sprintf(buf, "line %d of file %s: %s", ! 342: yylineno, filestack[ninclude-1].fname, s); ! 343: fatal(buf); ! 344: } ! 345: short yyexca[] ={ ! 346: -1, 1, ! 347: 0, -1, ! 348: -2, 0, ! 349: }; ! 350: # define YYNPROD 22 ! 351: # define YYLAST 21 ! 352: short yyact[]={ ! 353: ! 354: 17, 20, 21, 16, 7, 9, 11, 18, 19, 12, ! 355: 13, 5, 2, 1, 3, 4, 10, 8, 6, 14, ! 356: 15 }; ! 357: short yypact[]={ ! 358: ! 359: -1000,-245,-1000,-253,-1000,-1000,-252,-1000,-255,-1000, ! 360: -257,-263,-1000,-1000,-1000,-256,-1000,-1000,-1000,-1000, ! 361: -1000,-1000 }; ! 362: short yypgo[]={ ! 363: ! 364: 0, 20, 19, 18, 17, 16, 13, 12, 6 }; ! 365: short yyr1[]={ ! 366: ! 367: 0, 6, 6, 7, 7, 7, 7, 3, 3, 4, ! 368: 4, 5, 5, 5, 5, 5, 8, 8, 2, 2, ! 369: 1, 1 }; ! 370: short yyr2[]={ ! 371: ! 372: 0, 0, 2, 1, 1, 4, 1, 1, 2, 0, ! 373: 1, 1, 2, 2, 2, 2, 1, 1, 0, 1, ! 374: 1, 2 }; ! 375: short yychk[]={ ! 376: ! 377: -1000, -6, -7, 259, 260, 256, -3, 257, -4, 257, ! 378: -5, -8, 261, 262, -2, -1, 258, 257, 264, 265, ! 379: 264, 258 }; ! 380: short yydef[]={ ! 381: ! 382: 1, -2, 2, 3, 4, 6, 9, 7, 18, 8, ! 383: 10, 11, 16, 17, 5, 19, 20, 13, 14, 15, ! 384: 12, 21 }; ! 385: #ifndef lint ! 386: static char yaccpar_sccsid[] = "@(#)yaccpar 1.1 85/12/19 SMI"; /* from UCB 4.1 83/02/11 */ ! 387: #endif ! 388: ! 389: # ! 390: # define YYFLAG -1000 ! 391: # define YYERROR goto yyerrlab ! 392: # define YYACCEPT return(0) ! 393: # define YYABORT return(1) ! 394: ! 395: /* parser for yacc output */ ! 396: ! 397: #ifdef YYDEBUG ! 398: int yydebug = 0; /* 1 for debugging */ ! 399: #endif ! 400: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ ! 401: int yychar = -1; /* current input token number */ ! 402: int yynerrs = 0; /* number of errors */ ! 403: short yyerrflag = 0; /* error recovery flag */ ! 404: ! 405: yyparse() { ! 406: ! 407: short yys[YYMAXDEPTH]; ! 408: short yyj, yym; ! 409: register YYSTYPE *yypvt; ! 410: register short yystate, *yyps, yyn; ! 411: register YYSTYPE *yypv; ! 412: register short *yyxi; ! 413: ! 414: yystate = 0; ! 415: yychar = -1; ! 416: yynerrs = 0; ! 417: yyerrflag = 0; ! 418: yyps= &yys[-1]; ! 419: yypv= &yyv[-1]; ! 420: ! 421: yystack: /* put a state and value onto the stack */ ! 422: ! 423: #ifdef YYDEBUG ! 424: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar ); ! 425: #endif ! 426: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); } ! 427: *yyps = yystate; ! 428: ++yypv; ! 429: *yypv = yyval; ! 430: ! 431: yynewstate: ! 432: ! 433: yyn = yypact[yystate]; ! 434: ! 435: if( yyn<= YYFLAG ) goto yydefault; /* simple state */ ! 436: ! 437: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0; ! 438: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault; ! 439: ! 440: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */ ! 441: yychar = -1; ! 442: yyval = yylval; ! 443: yystate = yyn; ! 444: if( yyerrflag > 0 ) --yyerrflag; ! 445: goto yystack; ! 446: } ! 447: ! 448: yydefault: ! 449: /* default state action */ ! 450: ! 451: if( (yyn=yydef[yystate]) == -2 ) { ! 452: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0; ! 453: /* look through exception table */ ! 454: ! 455: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */ ! 456: ! 457: while( *(yyxi+=2) >= 0 ){ ! 458: if( *yyxi == yychar ) break; ! 459: } ! 460: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */ ! 461: } ! 462: ! 463: if( yyn == 0 ){ /* error */ ! 464: /* error ... attempt to resume parsing */ ! 465: ! 466: switch( yyerrflag ){ ! 467: ! 468: case 0: /* brand new error */ ! 469: ! 470: yyerror( "syntax error" ); ! 471: yyerrlab: ! 472: ++yynerrs; ! 473: ! 474: case 1: ! 475: case 2: /* incompletely recovered error ... try again */ ! 476: ! 477: yyerrflag = 3; ! 478: ! 479: /* find a state where "error" is a legal shift action */ ! 480: ! 481: while ( yyps >= yys ) { ! 482: yyn = yypact[*yyps] + YYERRCODE; ! 483: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){ ! 484: yystate = yyact[yyn]; /* simulate a shift of "error" */ ! 485: goto yystack; ! 486: } ! 487: yyn = yypact[*yyps]; ! 488: ! 489: /* the current yyps has no shift onn "error", pop stack */ ! 490: ! 491: #ifdef YYDEBUG ! 492: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] ); ! 493: #endif ! 494: --yyps; ! 495: --yypv; ! 496: } ! 497: ! 498: /* there is no state on the stack with an error shift ... abort */ ! 499: ! 500: yyabort: ! 501: return(1); ! 502: ! 503: ! 504: case 3: /* no shift yet; clobber input char */ ! 505: ! 506: #ifdef YYDEBUG ! 507: if( yydebug ) printf( "error recovery discards char %d\n", yychar ); ! 508: #endif ! 509: ! 510: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */ ! 511: yychar = -1; ! 512: goto yynewstate; /* try again in the same state */ ! 513: ! 514: } ! 515: ! 516: } ! 517: ! 518: /* reduction by production yyn */ ! 519: ! 520: #ifdef YYDEBUG ! 521: if( yydebug ) printf("reduce %d\n",yyn); ! 522: #endif ! 523: yyps -= yyr2[yyn]; ! 524: yypvt = yypv; ! 525: yypv -= yyr2[yyn]; ! 526: yyval = yypv[1]; ! 527: yym=yyn; ! 528: /* consult goto table to find next state */ ! 529: yyn = yyr1[yyn]; ! 530: yyj = yypgo[yyn] + *yyps + 1; ! 531: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]]; ! 532: switch(yym){ ! 533: ! 534: case 5: ! 535: # line 49 "gram.y" ! 536: { ! 537: while( --nlefts >= 0) ! 538: { ! 539: wildp iswild(), wp; ! 540: ! 541: leftp = lefts[nlefts]; ! 542: if(wp = iswild(leftp->namep)) ! 543: { ! 544: leftp->septype = SOMEDEPS; ! 545: if(lastwild) ! 546: lastwild->next = wp; ! 547: else ! 548: firstwild = wp; ! 549: lastwild = wp; ! 550: } ! 551: ! 552: if(leftp->septype == 0) ! 553: leftp->septype = sepc; ! 554: else if(leftp->septype != sepc) ! 555: { ! 556: if(! wp) ! 557: fprintf(stderr, ! 558: "Inconsistent rules lines for `%s'\n", ! 559: leftp->namep); ! 560: } ! 561: else if(sepc==ALLDEPS && leftp->namep[0]!='.' && yypvt[-0].yshblock!=0) ! 562: { ! 563: for(lp=leftp->linep; lp->nxtlineblock; lp=lp->nxtlineblock) ! 564: if(lp->shp) ! 565: fprintf(stderr, ! 566: "Multiple rules lines for `%s'\n", ! 567: leftp->namep); ! 568: } ! 569: ! 570: lp = ALLOC(lineblock); ! 571: lp->nxtlineblock = NULL; ! 572: lp->depp = yypvt[-1].ydepblock; ! 573: lp->shp = yypvt[-0].yshblock; ! 574: if(wp) ! 575: wp->linep = lp; ! 576: ! 577: if(equal(leftp->namep, ".SUFFIXES") && yypvt[-1].ydepblock==0) ! 578: leftp->linep = 0; ! 579: else if(leftp->linep == 0) ! 580: leftp->linep = lp; ! 581: else { ! 582: for(lpp = leftp->linep; lpp->nxtlineblock; ! 583: lpp = lpp->nxtlineblock) ; ! 584: if(sepc==ALLDEPS && leftp->namep[0]=='.') ! 585: lpp->shp = 0; ! 586: lpp->nxtlineblock = lp; ! 587: } ! 588: } ! 589: } break; ! 590: case 7: ! 591: # line 106 "gram.y" ! 592: { lefts[0] = yypvt[-0].ynameblock; nlefts = 1; } break; ! 593: case 8: ! 594: # line 107 "gram.y" ! 595: { lefts[nlefts++] = yypvt[-0].ynameblock; ! 596: if(nlefts>=NLEFTS) fatal("Too many lefts"); } break; ! 597: case 9: ! 598: # line 112 "gram.y" ! 599: { ! 600: char junk[10]; ! 601: sprintf(junk, "%d", yylineno); ! 602: fatal1("Must be a separator on rules line %s", junk); ! 603: } break; ! 604: case 11: ! 605: # line 120 "gram.y" ! 606: { prevdep = 0; yyval.ydepblock = 0; allnowait = NO; } break; ! 607: case 12: ! 608: # line 121 "gram.y" ! 609: { prevdep = 0; yyval.ydepblock = 0; allnowait = YES; } break; ! 610: case 13: ! 611: # line 122 "gram.y" ! 612: { ! 613: pp = ALLOC(depblock); ! 614: pp->nxtdepblock = NULL; ! 615: pp->depname = yypvt[-0].ynameblock; ! 616: pp->nowait = allnowait; ! 617: if(prevdep == 0) yyval.ydepblock = pp; ! 618: else prevdep->nxtdepblock = pp; ! 619: prevdep = pp; ! 620: } break; ! 621: case 14: ! 622: # line 131 "gram.y" ! 623: { if(prevdep) prevdep->nowait = YES; } break; ! 624: case 16: ! 625: # line 135 "gram.y" ! 626: { sepc = ALLDEPS; } break; ! 627: case 17: ! 628: # line 136 "gram.y" ! 629: { sepc = SOMEDEPS; } break; ! 630: case 18: ! 631: # line 139 "gram.y" ! 632: {yyval.yshblock = 0; } break; ! 633: case 19: ! 634: # line 140 "gram.y" ! 635: { yyval.yshblock = yypvt[-0].yshblock; } break; ! 636: case 20: ! 637: # line 143 "gram.y" ! 638: { yyval.yshblock = yypvt[-0].yshblock; prevshp = yypvt[-0].yshblock; } break; ! 639: case 21: ! 640: # line 144 "gram.y" ! 641: { yyval.yshblock = yypvt[-1].yshblock; ! 642: prevshp->nxtshblock = yypvt[-0].yshblock; ! 643: prevshp = yypvt[-0].yshblock; ! 644: } break; ! 645: } ! 646: goto yystack; /* stack new state and value */ ! 647: ! 648: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.