|
|
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.