|
|
1.1 ! root 1: # define DEFBRK 257 ! 2: # define COLON 258 ! 3: # define OCTAL 259 ! 4: # define INTEGER 260 ! 5: # define IDENT 261 ! 6: # define CSR 262 ! 7: # define IVEC 263 ! 8: # define OVEC 264 ! 9: # define IINT 265 ! 10: # define OINT 266 ! 11: # define INIT 267 ! 12: # define OPEN 268 ! 13: # define CLOSE 269 ! 14: # define READ 270 ! 15: # define WRITE 271 ! 16: # define SEEK 272 ! 17: # define CNTL 273 ! 18: # define IS 274 ! 19: # define ON 275 ! 20: # define GETC 276 ! 21: # define PUTC 277 ! 22: ! 23: # line 4 "config.y" ! 24: #include <stdio.h> ! 25: ! 26: #define NIL (dvptr)0 ! 27: ! 28: #define CONFIGC "../sys/conf.c" /* name of .c output */ ! 29: #define CONFIGH "../h/conf.h" /* name of .h output */ ! 30: #define DISPCONF "../h/dispconf.h" /* name of dispatcher .h*/ ! 31: #define IODISP "../h/iodisp.h" /* name of dispat loc .h*/ ! 32: #define CONFHREF "<conf.h>" /* how conf.h referenced*/ ! 33: #define CONFIGIN "Configuration" /* name of input file */ ! 34: ! 35: FILE *confc; ! 36: FILE *confh; ! 37: FILE *dispconf; ! 38: FILE *iodisp; ! 39: ! 40: char *dbstr; ! 41: extern char *malloc(); ! 42: int ndevs = 0; ! 43: int currname = -1; ! 44: int currtname = -1; ! 45: int currdname = -1; ! 46: int brkcount = 0; ! 47: ! 48: struct syment { /* symbol table */ ! 49: char *symname; ! 50: int symoccurs; ! 51: } symtab[250]; ! 52: ! 53: int nsym = 0; ! 54: int lookup(); ! 55: int linectr = 1; ! 56: char *doing = "device type declaration"; ! 57: char *s; ! 58: struct dvtype { ! 59: char *dvname; /* device name (not used in types)*/ ! 60: char *dvtname; /* type name */ ! 61: int dvtnum; /* symbol table index of type */ ! 62: char *dvdevice; /* device name */ ! 63: int dvcsr; /* Control Status Register addr */ ! 64: int dvivec; /* input interrupt vector */ ! 65: int dvovec; /* Output interrupt vector */ ! 66: char dviint[20]; /* input interrupt routine */ ! 67: char dvoint[20]; /* output interrupt routine */ ! 68: char dvinit[20]; /* init routine name */ ! 69: char dvopen[20]; /* open routine name */ ! 70: char dvclose[20]; /* close routine name */ ! 71: char dvread[20]; /* read routine name */ ! 72: char dvwrite[20]; /* write routine name */ ! 73: char dvcntl[20]; /* control routine name */ ! 74: char dvseek[20]; /* seek routine name */ ! 75: char dvgetc[20]; /* getc routine name */ ! 76: char dvputc[20]; /* putc routine name */ ! 77: int dvminor; /* device number 0,1,... */ ! 78: struct dvtype *dvnext; /* next node on the list */ ! 79: }; ! 80: typedef struct dvtype *dvptr; ! 81: dvptr ftypes = NIL; /* linked list of device types */ ! 82: dvptr devs = NIL; /* linked list of device decls. */ ! 83: dvptr lastdv = NIL; ! 84: dvptr currtype = NIL; ! 85: ! 86: char *ftout[] = ! 87: {"#ifndef\tASM\n", ! 88: "struct\tdevsw\t{\t\t\t/* device table entry */\n", ! 89: "\tint\tdvnum;\n", ! 90: "\tchar\t*dvname;\n", ! 91: "\tint\t(*dvinit)();\n", ! 92: "\tint\t(*dvopen)();\n", ! 93: "\tint\t(*dvclose)();\n", ! 94: "\tint\t(*dvread)();\n", ! 95: "\tint\t(*dvwrite)();\n", ! 96: "\tint\t(*dvseek)();\n", ! 97: "\tint\t(*dvgetc)();\n", ! 98: "\tint\t(*dvputc)();\n", ! 99: "\tint\t(*dvcntl)();\n", ! 100: "\tint\tdvcsr;\n", ! 101: "\tint\tdvivec;\n", ! 102: "\tint\tdvovec;\n", ! 103: "\tint\t(*dviint)();\n", ! 104: "\tint\t(*dvoint)();\n", ! 105: "\tchar\t*dvioblk;\n", ! 106: "\tint\tdvminor;\n", ! 107: "\t};\n\n", ! 108: "extern\tstruct\tdevsw devtab[];", ! 109: "\t\t/* one entry per device */\n", ! 110: "#endif\n\n", ! 111: NULL}; ! 112: #define yyclearin yychar = -1 ! 113: #define yyerrok yyerrflag = 0 ! 114: extern int yychar; ! 115: extern short yyerrflag; ! 116: #ifndef YYMAXDEPTH ! 117: #define YYMAXDEPTH 150 ! 118: #endif ! 119: #ifndef YYSTYPE ! 120: #define YYSTYPE int ! 121: #endif ! 122: YYSTYPE yylval, yyval; ! 123: # define YYERRCODE 256 ! 124: ! 125: # line 176 "config.y" ! 126: ! 127: #include "lex.yy.c" ! 128: main(argc, argv) ! 129: int argc; ! 130: char *argv[]; ! 131: { ! 132: int n, i, j, l, fcount; ! 133: dvptr s; ! 134: int verbose = 0; ! 135: char *p; ! 136: char c; ! 137: ! 138: if (argc>1 && (strcmp("-v",argv[1])==0)) { ! 139: argc--; ! 140: argv++; ! 141: verbose++; ! 142: } ! 143: if (argc>2) { ! 144: fprintf(stderr,"use: config [-v] [file]\n"); ! 145: exit(1); ! 146: } ! 147: if (verbose) ! 148: printf("Opening input file...\n"); ! 149: if (argc == 2) { ! 150: if (freopen(argv[1], "r", stdin) == NULL) { ! 151: fprintf(stderr,"Can't open %s\n",argv[1]); ! 152: exit(1); ! 153: } ! 154: } else { /* try to open Configuration file */ ! 155: if (freopen(CONFIGIN, "r", stdin) == NULL) { ! 156: fprintf(stderr,"Can't open %s\n", CONFIGIN); ! 157: exit(1); ! 158: } ! 159: } ! 160: ! 161: /* Parse the Configuration file */ ! 162: ! 163: if (verbose) ! 164: printf("Parsing configuration specs...\n"); ! 165: if ((n=yyparse()) != 0) ! 166: exit(n); ! 167: ! 168: /* write config.h and config.c */ ! 169: ! 170: if (verbose) ! 171: printf("Opening output files...\n"); ! 172: if ( (confc=fopen(CONFIGC,"w") ) == NULL) { ! 173: fprintf(stderr, "Can't write on %s\n", CONFIGC); ! 174: exit(1); ! 175: } ! 176: ! 177: if ( (confh=fopen(CONFIGH,"w") ) == NULL) { ! 178: fprintf(stderr, "Can't write on %s\n", CONFIGH); ! 179: exit(1); ! 180: } ! 181: if ( (dispconf=fopen(DISPCONF,"w") ) == NULL) { ! 182: fprintf(stderr, "Can't write on %s\n",DISPCONF); ! 183: exit(1); ! 184: } ! 185: if ( (iodisp=fopen(IODISP,"w") ) == NULL) { ! 186: fprintf(stderr, "Can't write on %s\n",IODISP); ! 187: exit(1); ! 188: } ! 189: fprintf(confh, ! 190: "/* conf.h (GENERATED FILE; DO NOT EDIT) */\n"); ! 191: fprintf(confc, ! 192: "/* conf.c (GENERATED FILE; DO NOT EDIT) */\n"); ! 193: fprintf(dispconf, ! 194: "/* dispconf.h (GENERATED FILE; DO NOT EDIT) */\n"); ! 195: fprintf(iodisp, ! 196: "/* iodisp.h (GENERATED FILE; DO NOT EDIT) */\n"); ! 197: fprintf(confc, "\n#include %s\n", CONFHREF); ! 198: fprintf(confh, "\n#define\tNULLPTR\t(char *)0\n"); ! 199: ! 200: ! 201: if (verbose) ! 202: printf("Writing output...\n"); ! 203: fprintf(confh,"\n/* Device table declarations */\n"); ! 204: for (i=0 ; (p=ftout[i])!=NULL ; i++) ! 205: fprintf(confh, "%s", p); ! 206: fprintf(dispconf,"\n/* vector-to points for each device */\n\n"); ! 207: fprintf(iodisp,"\n/* i/o dispatch vector-to location externs */\n\n"); ! 208: /* write device declarations and definitions; count type refs. */ ! 209: ! 210: fprintf(confh, "\n/* Device name definitions */\n\n"); ! 211: for (i=0,s=devs; s!=NIL ; s=s->dvnext,i++) { ! 212: fprintf(confh, "#define\t%-12s%d\t\t\t/* type %-8s */\n", ! 213: s->dvname, i, s->dvtname); ! 214: s->dvminor = symtab[s->dvtnum].symoccurs++; ! 215: } ! 216: ! 217: /* write count of device types */ ! 218: ! 219: fprintf(confh,"\n/* Control block sizes */\n\n"); ! 220: for (i=0 ; i<nsym ; i++) ! 221: if (symtab[i].symoccurs > 0) { ! 222: fprintf(confh, "#define\tN%s\t%d\n", ! 223: symtab[i].symname, symtab[i].symoccurs); ! 224: } ! 225: if (ndevs > 0) ! 226: fprintf(confh, "\n#define\tNDEVS\t%d\n\n", ndevs); ! 227: ! 228: /* empty symbol table, collect, and write names of all I/O routines */ ! 229: ! 230: nsym = 0; ! 231: for (s=devs; s!=NIL ; s=s->dvnext) { ! 232: lookup(s->dvinit,strlen(s->dvinit)); ! 233: lookup(s->dvopen,strlen(s->dvopen)); ! 234: lookup(s->dvclose,strlen(s->dvclose)); ! 235: lookup(s->dvread,strlen(s->dvread)); ! 236: lookup(s->dvwrite,strlen(s->dvwrite)); ! 237: lookup(s->dvseek,strlen(s->dvseek)); ! 238: lookup(s->dvcntl,strlen(s->dvcntl)); ! 239: lookup(s->dvgetc,strlen(s->dvgetc)); ! 240: lookup(s->dvputc,strlen(s->dvputc)); ! 241: lookup(s->dviint,strlen(s->dviint)); ! 242: lookup(s->dvoint,strlen(s->dvoint)); ! 243: ! 244: } ! 245: fprintf(confh, ! 246: "/* Declarations of I/O routines referenced */\n\n"); ! 247: fprintf(confh, "#ifndef\tASM\n"); ! 248: for (i=0 ; i<nsym ; i++) ! 249: fprintf(confh, "extern\tint\t%s();\n", symtab[i].symname); ! 250: fprintf(confh, "#endif\n"); ! 251: ! 252: ! 253: /* produce devtab (giant I/O switch table) */ ! 254: ! 255: fprintf(confc, "\n/* device independent I/O switch */\n\n"); ! 256: if (ndevs > 0) { ! 257: fprintf(confc, "struct\tdevsw\tdevtab[NDEVS] = {\n"); ! 258: fprintf(confc, "\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n%s\n", ! 259: "/* Format of entries is:", ! 260: "device-number, device-name,", ! 261: "init, open, close,", ! 262: "read, write, seek,", ! 263: "getc, putc, cntl,", ! 264: "device-csr-address, input-vector, output-vector,", ! 265: "iint-handler, oint-handler, control-block, minor-device,", ! 266: "*/"); ! 267: } ! 268: for (fcount=0,s=devs ; s!=NIL ; s=s->dvnext,fcount++) { ! 269: fprintf(confc, "\n/* %s is %s */\n\n",s->dvname,s->dvtname); ! 270: fprintf(confc, "%d, \"%s\",\n", fcount, s->dvname); ! 271: fprintf(confc, "%s, %s, %s,\n", ! 272: s->dvinit, s->dvopen, s->dvclose); ! 273: fprintf(confc, "%s, %s, %s,\n", ! 274: s->dvread, s->dvwrite, s->dvseek); ! 275: fprintf(confc, "%s, %s, %s,\n", ! 276: s->dvgetc, s->dvputc, s->dvcntl); ! 277: fprintf(confc, "0%06o, 0%03o, 0%03o,\n", ! 278: s->dvcsr, s->dvivec, s->dvovec); ! 279: fprintf(confc, "%s, %s, NULLPTR, %d", ! 280: s->dviint, s->dvoint, s->dvminor); ! 281: if ( s->dvnext != NIL ) ! 282: fprintf(confc, ",\n"); ! 283: else ! 284: fprintf(confc, "\n\t};"); ! 285: } ! 286: for (i=0; i<ndevs; i++) { ! 287: fprintf(dispconf,"\t.globl\t_devveci%-1d\n",i); ! 288: fprintf(dispconf,"\t.globl\t_devveco%-1d\n",i); ! 289: fprintf(dispconf,"\t.align\t2\n"); ! 290: fprintf(dispconf,"_devveci%-1d:\n",i); ! 291: fprintf(dispconf,"\tmtpr\t$DISABLE, $IPL\n"); ! 292: fprintf(dispconf,"\tbsbw\tioint\n"); ! 293: fprintf(dispconf,"\t.align\t2\n"); ! 294: fprintf(dispconf,"_devveco%-1d:\n",i); ! 295: fprintf(dispconf,"\tmtpr\t$DISABLE, $IPL\n"); ! 296: fprintf(dispconf,"\tbsbw\tioint\n\n",i); ! 297: fprintf(iodisp, "extern\tint\tdevveci%-1d();\n",i); ! 298: fprintf(iodisp, "extern\tint\tdevveco%-1d();\n",i); ! 299: } ! 300: ! 301: /* Copy definitions to output */ ! 302: ! 303: if (brkcount == 2 && verbose) ! 304: printf("Copying definitions to %s...\n", CONFIGH); ! 305: if (brkcount == 2 ) ! 306: while ( (c=input()) != 0) /* lex input routine */ ! 307: putc(c, confh); ! 308: ! 309: /* guarantee conf.c written later than conf.c for make */ ! 310: ! 311: fclose(confh); ! 312: fprintf(confc, "\n"); ! 313: fclose(confc); ! 314: fclose(dispconf); ! 315: fclose(iodisp); ! 316: ! 317: /* finish up and write report for user if requested */ ! 318: ! 319: if (verbose) { ! 320: printf("\nConfiguration complete. Number of devs=%d:\n\n",ndevs); ! 321: for (s=devs; s!=NIL ; s=s->dvnext) ! 322: printf( ! 323: "Device %s (on %s) csr=0%-7o, ivec=0%-3o, ovec=0%-3o, minor=%d\n", ! 324: s->dvname, s->dvdevice, s->dvcsr, s->dvivec, s->dvovec, ! 325: s->dvminor); ! 326: } ! 327: ! 328: ! 329: } ! 330: ! 331: ! 332: yyerror(s) ! 333: char *s; ! 334: { ! 335: fprintf(stderr,"Syntax error in %s on line %d\n", ! 336: doing,linectr); ! 337: } ! 338: ! 339: ! 340: /* lookup -- lookup a name in the symbol table; return position */ ! 341: ! 342: lookup(str,len) ! 343: char *str; ! 344: int len; ! 345: { ! 346: int i; ! 347: char *s; ! 348: ! 349: if (len >= 20) { ! 350: len = 19; ! 351: fprintf(stderr,"warning: name %s truncated\n",str); ! 352: } ! 353: s = malloc(len+1); ! 354: strncpy(s,str,len); ! 355: s[len] = '\000'; ! 356: for (i=0 ; i<nsym ; i++) ! 357: if (strcmp(s,symtab[i].symname) == 0){ ! 358: return(i); ! 359: } ! 360: symtab[nsym].symname = s; ! 361: symtab[nsym].symoccurs = 0; ! 362: return(nsym++); ! 363: } ! 364: ! 365: atoi(str,len) ! 366: char *str; ! 367: int len; ! 368: { ! 369: int i; ! 370: char c; ! 371: ! 372: for (i=0; len > 0 ; len--) { ! 373: c = *str++; ! 374: i = 10*i + (c - '0'); ! 375: } ! 376: } ! 377: otoi(str,len) ! 378: char *str; ! 379: int len; ! 380: { ! 381: int i; ! 382: char c; ! 383: ! 384: for (i=0; len > 0 ; len--) { ! 385: c = *str++; ! 386: if (c > '7') ! 387: fprintf(stderr,"invalid octal digit on line %d\n", ! 388: linectr); ! 389: else ! 390: i = 8*i + (c - '0'); ! 391: } ! 392: } ! 393: ! 394: /* newattr -- add a new attribute spec to current type/device description */ ! 395: ! 396: newattr(tok,val) ! 397: int tok; /* token type (attribute type) */ ! 398: int val; /* symbol number of value */ ! 399: { ! 400: char *c; ! 401: dvptr s; ! 402: ! 403: if (devs == NIL) /* doing types */ ! 404: s = currtype; ! 405: else ! 406: s = lastdv; ! 407: if (val>=0 && val<nsym) { ! 408: c = symtab[val].symname; ! 409: if (strlen(c) > 20 ) { ! 410: fprintf(stderr,"Internal overflow\n"); ! 411: exit(1); ! 412: } ! 413: } else ! 414: c = NULL; ! 415: ! 416: switch (tok) { ! 417: ! 418: case CSR: s->dvcsr = val; ! 419: break; ! 420: case IVEC: s->dvivec = val; ! 421: break; ! 422: case OVEC: s->dvovec = val; ! 423: break; ! 424: case IINT: strcpy(s->dviint,c); ! 425: break; ! 426: case OINT: strcpy(s->dvoint,c); ! 427: break; ! 428: case READ: strcpy(s->dvread,c); ! 429: break; ! 430: case WRITE: strcpy(s->dvwrite,c); ! 431: break; ! 432: case GETC: strcpy(s->dvgetc,c); ! 433: break; ! 434: case PUTC: strcpy(s->dvputc,c); ! 435: break; ! 436: case OPEN: strcpy(s->dvopen,c); ! 437: break; ! 438: case CLOSE: strcpy(s->dvclose,c); ! 439: break; ! 440: case INIT: strcpy(s->dvinit,c); ! 441: break; ! 442: case SEEK: strcpy(s->dvseek,c); ! 443: break; ! 444: case CNTL: strcpy(s->dvcntl,c); ! 445: break; ! 446: default: fprintf(stderr, "Internal error 1\n"); ! 447: } ! 448: } ! 449: ! 450: /* cktname -- check type name for duplicates */ ! 451: ! 452: cktname(symid) ! 453: int symid; ! 454: { ! 455: dvptr s; ! 456: extern dvptr ftypes; ! 457: char *name; ! 458: ! 459: name = symtab[symid].symname; ! 460: for (s=ftypes; s!=NIL ; s=s->dvnext) { ! 461: if (s->dvtname == name) { ! 462: fprintf(stderr,"Duplicate type name %s on line %d\n", ! 463: name,linectr); ! 464: exit(1); ! 465: } ! 466: } ! 467: return(symid); ! 468: } ! 469: ! 470: /* mktype -- make a node in the type list and initialize to defaults */ ! 471: ! 472: mktype(deviceid) ! 473: int deviceid; ! 474: { ! 475: dvptr s,p; ! 476: char *tn,*dn; ! 477: ! 478: p = NIL; ! 479: tn = symtab[currtname].symname; ! 480: dn = symtab[deviceid].symname; ! 481: for (s = ftypes; s!=NIL ; s=s->dvnext) { ! 482: if (s->dvtname == tn && s->dvdevice==dn) { ! 483: fprintf(stderr, ! 484: "Duplicate device %s for type %s on line %d\n", ! 485: dn, tn, linectr); ! 486: exit(1); ! 487: } ! 488: p = s; ! 489: } ! 490: currtype = s = (dvptr) malloc( sizeof(struct dvtype)); ! 491: if (ftypes != NIL) { ! 492: p->dvnext = s; ! 493: } ! 494: else { ! 495: ftypes = s; ! 496: } ! 497: initattr(s, currtname, deviceid); ! 498: } ! 499: ! 500: /* initialize attributes in a type declaration node to typename... */ ! 501: ! 502: initattr(fstr, tnum, deviceid) ! 503: dvptr fstr; ! 504: int tnum; ! 505: int deviceid; ! 506: { ! 507: char *typnam; ! 508: ! 509: typnam = symtab[tnum].symname; ! 510: fstr->dvname = NULL; ! 511: fstr->dvtname = typnam; ! 512: fstr->dvtnum = tnum; ! 513: fstr->dvdevice = symtab[deviceid].symname; ! 514: fstr->dvcsr = 0; ! 515: fstr->dvivec = 0; ! 516: fstr->dvovec = 0; ! 517: strcpy(fstr->dviint,typnam); ! 518: strcat(fstr->dviint,"iin"); ! 519: strcpy(fstr->dvoint,typnam); ! 520: strcat(fstr->dvoint,"oin"); ! 521: strcpy(fstr->dvinit,typnam); ! 522: strcat(fstr->dvinit,"init"); ! 523: strcpy(fstr->dvopen,typnam); ! 524: strcat(fstr->dvopen,"open"); ! 525: strcpy(fstr->dvclose,typnam); ! 526: strcat(fstr->dvclose,"close"); ! 527: strcpy(fstr->dvread,typnam); ! 528: strcat(fstr->dvread,"read"); ! 529: strcpy(fstr->dvwrite,typnam); ! 530: strcat(fstr->dvwrite,"write"); ! 531: strcpy(fstr->dvcntl,typnam); ! 532: strcat(fstr->dvcntl,"control"); ! 533: strcpy(fstr->dvseek,typnam); ! 534: strcat(fstr->dvseek,"seek"); ! 535: strcpy(fstr->dvgetc,typnam); ! 536: strcat(fstr->dvgetc,"getc"); ! 537: strcpy(fstr->dvputc,typnam); ! 538: strcat(fstr->dvputc,"putc"); ! 539: fstr->dvminor = 0; ! 540: } ! 541: ! 542: /* mkdev -- make a node on the device list */ ! 543: ! 544: mkdev(nameid, typid, deviceid) ! 545: int nameid, typid, deviceid; ! 546: { ! 547: dvptr s; ! 548: char *devn,*tn,*dn; ! 549: int found; ! 550: ! 551: s = (dvptr) malloc(sizeof(struct dvtype)); ! 552: s->dvnext = NIL; ! 553: if (devs == NIL) { ! 554: devs = s; ! 555: lastdv = s; ! 556: } else { ! 557: lastdv->dvnext = s; ! 558: lastdv = s; ! 559: } ! 560: ndevs++; ! 561: tn = symtab[typid].symname; ! 562: devn = symtab[nameid].symname; ! 563: if (deviceid >= 0) ! 564: dn = symtab[deviceid].symname; ! 565: else ! 566: dn = NULL; ! 567: found = 0; ! 568: for (s=ftypes ; s != NULL ; s=s->dvnext) ! 569: if (s->dvtname == tn && (dn==NULL || s->dvdevice==dn)) { ! 570: strdup(lastdv,s,sizeof(struct dvtype)); ! 571: found=1; ! 572: break; ! 573: } ! 574: if (found==0) { ! 575: fprintf(stderr, ! 576: "Bad type or device name in declaration of %s on line %d\n", ! 577: devn, linectr); ! 578: exit(1); ! 579: } ! 580: lastdv->dvnext = NIL; ! 581: lastdv->dvname = devn; ! 582: } ! 583: ! 584: ! 585: /* chdname -- check for duplicate device name */ ! 586: ! 587: ckdname(devid) ! 588: int devid; ! 589: { ! 590: dvptr s; ! 591: extern dvptr devs; ! 592: char *name; ! 593: ! 594: name = symtab[devid].symname; ! 595: for (s=devs; s!=NIL ; s=s->dvnext) { ! 596: if (s->dvname == name) { ! 597: fprintf(stderr,"Duplicate device name %s on line %d\n", ! 598: name,linectr); ! 599: exit(1); ! 600: } ! 601: } ! 602: return(devid); ! 603: } ! 604: ! 605: strdup(tostr,fromstr,len) ! 606: char *tostr, *fromstr; ! 607: int len; ! 608: { ! 609: for( ; len > 0 ; len--) ! 610: *tostr++ = *fromstr++; ! 611: } ! 612: short yyexca[] ={ ! 613: -1, 1, ! 614: 0, -1, ! 615: -2, 0, ! 616: }; ! 617: # define YYNPROD 36 ! 618: # define YYLAST 79 ! 619: short yyact[]={ ! 620: ! 621: 24, 25, 26, 27, 28, 31, 29, 30, 34, 35, ! 622: 36, 37, 57, 19, 32, 33, 16, 5, 9, 17, ! 623: 8, 9, 42, 41, 15, 13, 18, 56, 12, 11, ! 624: 10, 23, 14, 40, 7, 6, 3, 22, 4, 20, ! 625: 38, 2, 21, 1, 0, 0, 0, 39, 45, 46, ! 626: 47, 48, 49, 50, 51, 52, 53, 54, 55, 43, ! 627: 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, ! 628: 0, 0, 0, 0, 0, 0, 0, 0, 58 }; ! 629: short yypact[]={ ! 630: ! 631: -1000,-1000,-1000,-240,-243,-1000,-1000,-259,-239,-1000, ! 632: -1000,-1000,-261,-1000,-259,-1000,-243,-1000,-262,-243, ! 633: -1000,-262,-1000,-1000,-237,-237,-237,-243,-243,-243, ! 634: -243,-243,-243,-243,-243,-243,-243,-243,-263,-262, ! 635: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000, ! 636: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-243,-1000 }; ! 637: short yypgo[]={ ! 638: ! 639: 0, 43, 41, 38, 36, 35, 34, 32, 24, 26, ! 640: 20, 31, 33, 30, 29, 28, 27 }; ! 641: short yyr1[]={ ! 642: ! 643: 0, 1, 2, 4, 4, 5, 7, 7, 8, 6, ! 644: 10, 9, 9, 11, 11, 11, 11, 11, 11, 11, ! 645: 11, 11, 11, 11, 11, 11, 11, 12, 12, 3, ! 646: 3, 13, 14, 15, 16, 16 }; ! 647: short yyr2[]={ ! 648: ! 649: 0, 2, 2, 0, 2, 2, 2, 3, 2, 2, ! 650: 1, 0, 2, 2, 2, 2, 2, 2, 2, 2, ! 651: 2, 2, 2, 2, 2, 2, 2, 1, 1, 0, ! 652: 2, 2, 4, 1, 0, 2 }; ! 653: short yychk[]={ ! 654: ! 655: -1000, -1, -2, -4, -3, 257, -5, -6, -10, 261, ! 656: -13, -14, -15, -10, -7, -8, 275, 258, -9, 274, ! 657: -8, -9, -10, -11, 262, 263, 264, 265, 266, 268, ! 658: 269, 267, 276, 277, 270, 271, 272, 273, -10, -9, ! 659: -12, 260, 259, -12, -12, -10, -10, -10, -10, -10, ! 660: -10, -10, -10, -10, -10, -10, -16, 275, -10 }; ! 661: short yydef[]={ ! 662: ! 663: 3, -2, 29, 0, 1, 2, 4, 0, 0, 10, ! 664: 30, 11, 0, 33, 5, 11, 0, 9, 31, 0, ! 665: 11, 6, 8, 12, 0, 0, 0, 0, 0, 0, ! 666: 0, 0, 0, 0, 0, 0, 0, 0, 34, 7, ! 667: 13, 27, 28, 14, 15, 16, 17, 18, 19, 20, ! 668: 21, 22, 23, 24, 25, 26, 32, 0, 35 }; ! 669: #ifndef lint ! 670: static char yaccpar_sccsid[] = "@(#)yaccpar 4.1 (Berkeley) 2/11/83"; ! 671: #endif not lint ! 672: ! 673: # ! 674: # define YYFLAG -1000 ! 675: # define YYERROR goto yyerrlab ! 676: # define YYACCEPT return(0) ! 677: # define YYABORT return(1) ! 678: ! 679: /* parser for yacc output */ ! 680: ! 681: #ifdef YYDEBUG ! 682: int yydebug = 0; /* 1 for debugging */ ! 683: #endif ! 684: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */ ! 685: int yychar = -1; /* current input token number */ ! 686: int yynerrs = 0; /* number of errors */ ! 687: short yyerrflag = 0; /* error recovery flag */ ! 688: ! 689: yyparse() { ! 690: ! 691: short yys[YYMAXDEPTH]; ! 692: short yyj, yym; ! 693: register YYSTYPE *yypvt; ! 694: register short yystate, *yyps, yyn; ! 695: register YYSTYPE *yypv; ! 696: register short *yyxi; ! 697: ! 698: yystate = 0; ! 699: yychar = -1; ! 700: yynerrs = 0; ! 701: yyerrflag = 0; ! 702: yyps= &yys[-1]; ! 703: yypv= &yyv[-1]; ! 704: ! 705: yystack: /* put a state and value onto the stack */ ! 706: ! 707: #ifdef YYDEBUG ! 708: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar ); ! 709: #endif ! 710: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); } ! 711: *yyps = yystate; ! 712: ++yypv; ! 713: *yypv = yyval; ! 714: ! 715: yynewstate: ! 716: ! 717: yyn = yypact[yystate]; ! 718: ! 719: if( yyn<= YYFLAG ) goto yydefault; /* simple state */ ! 720: ! 721: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0; ! 722: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault; ! 723: ! 724: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */ ! 725: yychar = -1; ! 726: yyval = yylval; ! 727: yystate = yyn; ! 728: if( yyerrflag > 0 ) --yyerrflag; ! 729: goto yystack; ! 730: } ! 731: ! 732: yydefault: ! 733: /* default state action */ ! 734: ! 735: if( (yyn=yydef[yystate]) == -2 ) { ! 736: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0; ! 737: /* look through exception table */ ! 738: ! 739: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */ ! 740: ! 741: while( *(yyxi+=2) >= 0 ){ ! 742: if( *yyxi == yychar ) break; ! 743: } ! 744: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */ ! 745: } ! 746: ! 747: if( yyn == 0 ){ /* error */ ! 748: /* error ... attempt to resume parsing */ ! 749: ! 750: switch( yyerrflag ){ ! 751: ! 752: case 0: /* brand new error */ ! 753: ! 754: yyerror( "syntax error" ); ! 755: yyerrlab: ! 756: ++yynerrs; ! 757: ! 758: case 1: ! 759: case 2: /* incompletely recovered error ... try again */ ! 760: ! 761: yyerrflag = 3; ! 762: ! 763: /* find a state where "error" is a legal shift action */ ! 764: ! 765: while ( yyps >= yys ) { ! 766: yyn = yypact[*yyps] + YYERRCODE; ! 767: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){ ! 768: yystate = yyact[yyn]; /* simulate a shift of "error" */ ! 769: goto yystack; ! 770: } ! 771: yyn = yypact[*yyps]; ! 772: ! 773: /* the current yyps has no shift onn "error", pop stack */ ! 774: ! 775: #ifdef YYDEBUG ! 776: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] ); ! 777: #endif ! 778: --yyps; ! 779: --yypv; ! 780: } ! 781: ! 782: /* there is no state on the stack with an error shift ... abort */ ! 783: ! 784: yyabort: ! 785: return(1); ! 786: ! 787: ! 788: case 3: /* no shift yet; clobber input char */ ! 789: ! 790: #ifdef YYDEBUG ! 791: if( yydebug ) printf( "error recovery discards char %d\n", yychar ); ! 792: #endif ! 793: ! 794: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */ ! 795: yychar = -1; ! 796: goto yynewstate; /* try again in the same state */ ! 797: ! 798: } ! 799: ! 800: } ! 801: ! 802: /* reduction by production yyn */ ! 803: ! 804: #ifdef YYDEBUG ! 805: if( yydebug ) printf("reduce %d\n",yyn); ! 806: #endif ! 807: yyps -= yyr2[yyn]; ! 808: yypvt = yypv; ! 809: yypv -= yyr2[yyn]; ! 810: yyval = yypv[1]; ! 811: yym=yyn; ! 812: /* consult goto table to find next state */ ! 813: yyn = yyr1[yyn]; ! 814: yyj = yypgo[yyn] + *yyps + 1; ! 815: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]]; ! 816: switch(yym){ ! 817: ! 818: case 2: ! 819: # line 97 "config.y" ! 820: {doing = "device definitions";} break; ! 821: case 8: ! 822: # line 108 "config.y" ! 823: {mktype(yypvt[-0]);} break; ! 824: case 9: ! 825: # line 111 "config.y" ! 826: {yyval = currtname = cktname(yypvt[-1]);} break; ! 827: case 10: ! 828: # line 114 "config.y" ! 829: {yyval = currname = ! 830: lookup(yytext,yyleng); ! 831: } break; ! 832: case 13: ! 833: # line 122 "config.y" ! 834: {newattr(CSR,yypvt[-0]);} break; ! 835: case 14: ! 836: # line 124 "config.y" ! 837: {newattr(IVEC,yypvt[-0]);} break; ! 838: case 15: ! 839: # line 126 "config.y" ! 840: {newattr(OVEC,yypvt[-0]);} break; ! 841: case 16: ! 842: # line 128 "config.y" ! 843: {newattr(IINT,yypvt[-0]);} break; ! 844: case 17: ! 845: # line 130 "config.y" ! 846: {newattr(OINT,yypvt[-0]);} break; ! 847: case 18: ! 848: # line 132 "config.y" ! 849: {newattr(OPEN,yypvt[-0]);} break; ! 850: case 19: ! 851: # line 134 "config.y" ! 852: {newattr(CLOSE,yypvt[-0]);} break; ! 853: case 20: ! 854: # line 136 "config.y" ! 855: {newattr(INIT,yypvt[-0]);} break; ! 856: case 21: ! 857: # line 138 "config.y" ! 858: {newattr(GETC,yypvt[-0]);} break; ! 859: case 22: ! 860: # line 140 "config.y" ! 861: {newattr(PUTC,yypvt[-0]);} break; ! 862: case 23: ! 863: # line 142 "config.y" ! 864: {newattr(READ,yypvt[-0]);} break; ! 865: case 24: ! 866: # line 144 "config.y" ! 867: {newattr(WRITE,yypvt[-0]);} break; ! 868: case 25: ! 869: # line 146 "config.y" ! 870: {newattr(SEEK,yypvt[-0]);} break; ! 871: case 26: ! 872: # line 148 "config.y" ! 873: {newattr(CNTL,yypvt[-0]);} break; ! 874: case 27: ! 875: # line 156 "config.y" ! 876: {yyval = otoi(yytext,yyleng);} break; ! 877: case 28: ! 878: # line 158 "config.y" ! 879: {yyval = otoi(yytext,yyleng);} break; ! 880: case 32: ! 881: # line 166 "config.y" ! 882: {mkdev(yypvt[-3],yypvt[-1],yypvt[-0]);} break; ! 883: case 33: ! 884: # line 169 "config.y" ! 885: {yyval = currdname = ckdname(yypvt[-0]);} break; ! 886: case 34: ! 887: # line 172 "config.y" ! 888: {yyval = 0;} break; ! 889: case 35: ! 890: # line 174 "config.y" ! 891: {yyval = yypvt[-0];} break; ! 892: } ! 893: goto yystack; /* stack new state and value */ ! 894: ! 895: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.