|
|
1.1 root 1:
2: # line 1 "config.y"
3: typedef union {
4: char *str;
5: int val;
6: struct file_list *file;
7: struct idlst *lst;
8: } YYSTYPE;
9: # define AND 257
10: # define ANY 258
11: # define ARGS 259
12: # define AT 260
13: # define COMMA 261
14: # define CONFIG 262
15: # define CONTROLLER 263
16: # define CPU 264
17: # define CSR 265
18: # define DEVICE 266
19: # define DISK 267
20: # define DRIVE 268
21: # define DST 269
22: # define DUMPS 270
23: # define EQUALS 271
24: # define FLAGS 272
25: # define HZ 273
26: # define IDENT 274
27: # define MACHINE 275
28: # define MAJOR 276
29: # define MASTER 277
30: # define MAXUSERS 278
31: # define MBA 279
32: # define MINOR 280
33: # define MINUS 281
34: # define NEXUS 282
35: # define ON 283
36: # define OPTIONS 284
37: # define PRIORITY 285
38: # define PSEUDO_DEVICE 286
39: # define ROOT 287
40: # define SEMICOLON 288
41: # define SIZE 289
42: # define SLAVE 290
43: # define SWAP 291
44: # define TIMEZONE 292
45: # define TRACE 293
46: # define UBA 294
47: # define VBA 295
48: # define VECTOR 296
49: # define ID 297
50: # define NUMBER 298
51: # define FPNUMBER 299
52:
53: # line 66 "config.y"
54:
55: /* config.y 1.18 83/05/18 */
56:
57: #include "config.h"
58: #include <ctype.h>
59: #include <stdio.h>
60:
61: struct device cur;
62: struct device *curp = 0;
63: char *temp_id;
64: char *val_id;
65: char *malloc();
66:
67: #define yyclearin yychar = -1
68: #define yyerrok yyerrflag = 0
69: extern int yychar;
70: extern short yyerrflag;
71: #ifndef YYMAXDEPTH
72: #define YYMAXDEPTH 150
73: #endif
74: YYSTYPE yylval, yyval;
75: # define YYERRCODE 256
76:
77: # line 460 "config.y"
78:
79:
80: yyerror(s)
81: char *s;
82: {
83:
84: fprintf(stderr, "config: line %d: %s\n", yyline, s);
85: }
86:
87: /*
88: * return the passed string in a new space
89: */
90: char *
91: ns(str)
92: register char *str;
93: {
94: register char *cp;
95:
96: cp = malloc((unsigned)(strlen(str)+1));
97: (void) strcpy(cp, str);
98: return (cp);
99: }
100:
101: /*
102: * add a device to the list of devices
103: */
104: newdev(dp)
105: register struct device *dp;
106: {
107: register struct device *np;
108:
109: np = (struct device *) malloc(sizeof *np);
110: *np = *dp;
111: if (curp == 0)
112: dtab = np;
113: else
114: curp->d_next = np;
115: curp = np;
116: }
117:
118: /*
119: * note that a configuration should be made
120: */
121: mkconf(sysname)
122: char *sysname;
123: {
124: register struct file_list *fl, **flp;
125:
126: fl = (struct file_list *) malloc(sizeof *fl);
127: fl->f_type = SYSTEMSPEC;
128: fl->f_needs = sysname;
129: fl->f_rootdev = NODEV;
130: fl->f_argdev = NODEV;
131: fl->f_dumpdev = NODEV;
132: fl->f_fn = 0;
133: fl->f_next = 0;
134: for (flp = confp; *flp; flp = &(*flp)->f_next)
135: ;
136: *flp = fl;
137: confp = flp;
138: }
139:
140: struct file_list *
141: newswap()
142: {
143: struct file_list *fl = (struct file_list *)malloc(sizeof (*fl));
144:
145: fl->f_type = SWAPSPEC;
146: fl->f_next = 0;
147: fl->f_swapdev = NODEV;
148: fl->f_swapsize = 0;
149: fl->f_needs = 0;
150: fl->f_fn = 0;
151: return (fl);
152: }
153:
154: /*
155: * Add a swap device to the system's configuration
156: */
157: mkswap(system, fl, size)
158: struct file_list *system, *fl;
159: int size;
160: {
161: register struct file_list **flp;
162: char *cp, name[80];
163:
164: if (system == 0 || system->f_type != SYSTEMSPEC) {
165: yyerror("\"swap\" spec precedes \"config\" specification");
166: return;
167: }
168: if (size < 0) {
169: yyerror("illegal swap partition size");
170: return;
171: }
172: /*
173: * Append swap description to the end of the list.
174: */
175: flp = &system->f_next;
176: for (; *flp && (*flp)->f_type == SWAPSPEC; flp = &(*flp)->f_next)
177: ;
178: fl->f_next = *flp;
179: *flp = fl;
180: /*
181: * If first swap device for this system,
182: * set up f_fn field to insure swap
183: * files are created with unique names.
184: */
185: if (system->f_fn)
186: return;
187: if (eq(fl->f_fn, "generic"))
188: system->f_fn = ns(fl->f_fn);
189: else
190: system->f_fn = ns(system->f_needs);
191: }
192:
193: /*
194: * find the pointer to connect to the given device and number.
195: * returns 0 if no such device and prints an error message
196: */
197: struct device *
198: connect(dev, num)
199: register char *dev;
200: register int num;
201: {
202: register struct device *dp;
203: struct device *huhcon();
204:
205: if (num == QUES)
206: return (huhcon(dev));
207: for (dp = dtab; dp != 0; dp = dp->d_next) {
208: if ((num != dp->d_unit) || !eq(dev, dp->d_name))
209: continue;
210: if (dp->d_type != CONTROLLER && dp->d_type != MASTER) {
211: yyerror(sprintf(errbuf,
212: "%s connected to non-controller", dev));
213: return (0);
214: }
215: return (dp);
216: }
217: yyerror(sprintf(errbuf, "%s %d not defined", dev, num));
218: return (0);
219: }
220:
221: /*
222: * connect to an unspecific thing
223: */
224: struct device *
225: huhcon(dev)
226: register char *dev;
227: {
228: register struct device *dp, *dcp;
229: struct device rdev;
230: int oldtype;
231:
232: /*
233: * First make certain that there are some of these to wildcard on
234: */
235: for (dp = dtab; dp != 0; dp = dp->d_next)
236: if (eq(dp->d_name, dev))
237: break;
238: if (dp == 0) {
239: yyerror(sprintf(errbuf, "no %s's to wildcard", dev));
240: return (0);
241: }
242: oldtype = dp->d_type;
243: dcp = dp->d_conn;
244: /*
245: * Now see if there is already a wildcard entry for this device
246: * (e.g. Search for a "uba ?")
247: */
248: for (; dp != 0; dp = dp->d_next)
249: if (eq(dev, dp->d_name) && dp->d_unit == -1)
250: break;
251: /*
252: * If there isn't, make one because everything needs to be connected
253: * to something.
254: */
255: if (dp == 0) {
256: dp = &rdev;
257: init_dev(dp);
258: dp->d_unit = QUES;
259: dp->d_name = ns(dev);
260: dp->d_type = oldtype;
261: newdev(dp);
262: dp = curp;
263: /*
264: * Connect it to the same thing that other similar things are
265: * connected to, but make sure it is a wildcard unit
266: * (e.g. up connected to sc ?, here we make connect sc? to a
267: * uba?). If other things like this are on the NEXUS or
268: * if they aren't connected to anything, then make the same
269: * connection, else call ourself to connect to another
270: * unspecific device.
271: */
272: if (dcp == TO_NEXUS || dcp == 0)
273: dp->d_conn = dcp;
274: else
275: dp->d_conn = connect(dcp->d_name, QUES);
276: }
277: return (dp);
278: }
279:
280: init_dev(dp)
281: register struct device *dp;
282: {
283:
284: dp->d_name = "OHNO!!!";
285: dp->d_type = DEVICE;
286: dp->d_conn = 0;
287: dp->d_vec = 0;
288: dp->d_addr = dp->d_pri = dp->d_flags = dp->d_dk = 0;
289: dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
290: }
291:
292: /*
293: * make certain that this is a reasonable type of thing to connect to a nexus
294: */
295: check_nexus(dev, num)
296: register struct device *dev;
297: int num;
298: {
299:
300: switch (machine) {
301:
302: case MACHINE_VAX:
303: if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba"))
304: yyerror("only uba's and mba's should be connected to the nexus");
305: if (num != QUES)
306: yyerror("can't give specific nexus numbers");
307: break;
308:
309: case MACHINE_TAHOE:
310: if (!eq(dev->d_name, "vba"))
311: yyerror("only vba's should be connected to the nexus");
312: break;
313:
314: case MACHINE_SUN:
315: if (!eq(dev->d_name, "mb"))
316: yyerror("only mb's should be connected to the nexus");
317: break;
318: }
319: }
320:
321: /*
322: * Check the timezone to make certain it is sensible
323: */
324:
325: check_tz()
326: {
327: if (abs(timezone) > 12 * 60)
328: yyerror("timezone is unreasonable");
329: else
330: hadtz = 1;
331: }
332:
333: /*
334: * Check system specification and apply defaulting
335: * rules on root, argument, dump, and swap devices.
336: */
337: checksystemspec(fl)
338: register struct file_list *fl;
339: {
340: char buf[BUFSIZ];
341: register struct file_list *swap;
342: int generic;
343:
344: if (fl == 0 || fl->f_type != SYSTEMSPEC) {
345: yyerror("internal error, bad system specification");
346: exit(1);
347: }
348: swap = fl->f_next;
349: generic = swap && swap->f_type == SWAPSPEC && eq(swap->f_fn, "generic");
350: if (fl->f_rootdev == NODEV && !generic) {
351: yyerror("no root device specified");
352: exit(1);
353: }
354: /*
355: * Default swap area to be in 'b' partition of root's
356: * device. If root specified to be other than on 'a'
357: * partition, give warning, something probably amiss.
358: */
359: if (swap == 0 || swap->f_type != SWAPSPEC) {
360: dev_t dev;
361:
362: swap = newswap();
363: dev = fl->f_rootdev;
364: if (minor(dev) & 07) {
365: sprintf(buf,
366: "Warning, swap defaulted to 'b' partition with root on '%c' partition",
367: (minor(dev) & 07) + 'a');
368: yyerror(buf);
369: }
370: swap->f_swapdev =
371: makedev(major(dev), (minor(dev) &~ 07) | ('b' - 'a'));
372: swap->f_fn = devtoname(swap->f_swapdev);
373: mkswap(fl, swap, 0);
374: }
375: /*
376: * Make sure a generic swap isn't specified, along with
377: * other stuff (user must really be confused).
378: */
379: if (generic) {
380: if (fl->f_rootdev != NODEV)
381: yyerror("root device specified with generic swap");
382: if (fl->f_argdev != NODEV)
383: yyerror("arg device specified with generic swap");
384: if (fl->f_dumpdev != NODEV)
385: yyerror("dump device specified with generic swap");
386: return;
387: }
388: /*
389: * Default argument device and check for oddball arrangements.
390: */
391: if (fl->f_argdev == NODEV)
392: fl->f_argdev = swap->f_swapdev;
393: if (fl->f_argdev != swap->f_swapdev)
394: yyerror("Warning, arg device different than primary swap");
395: /*
396: * Default dump device and warn if place is not a
397: * swap area or the argument device partition.
398: */
399: if (fl->f_dumpdev == NODEV)
400: fl->f_dumpdev = swap->f_swapdev;
401: if (fl->f_dumpdev != swap->f_swapdev && fl->f_dumpdev != fl->f_argdev) {
402: struct file_list *p = swap->f_next;
403:
404: for (; p && p->f_type == SWAPSPEC; p = p->f_next)
405: if (fl->f_dumpdev == p->f_swapdev)
406: return;
407: sprintf(buf, "Warning, orphaned dump device, %s",
408: "do you know what you're doing");
409: yyerror(buf);
410: }
411: }
412:
413: /*
414: * Verify all devices specified in the system specification
415: * are present in the device specifications.
416: */
417: verifysystemspecs()
418: {
419: register struct file_list *fl;
420: dev_t checked[50], *verifyswap();
421: register dev_t *pchecked = checked;
422:
423: for (fl = conf_list; fl; fl = fl->f_next) {
424: if (fl->f_type != SYSTEMSPEC)
425: continue;
426: if (!finddev(fl->f_rootdev))
427: deverror(fl->f_needs, "root");
428: *pchecked++ = fl->f_rootdev;
429: pchecked = verifyswap(fl->f_next, checked, pchecked);
430: #define samedev(dev1, dev2) \
431: ((minor(dev1) &~ 07) != (minor(dev2) &~ 07))
432: if (!alreadychecked(fl->f_dumpdev, checked, pchecked)) {
433: if (!finddev(fl->f_dumpdev))
434: deverror(fl->f_needs, "dump");
435: *pchecked++ = fl->f_dumpdev;
436: }
437: if (!alreadychecked(fl->f_argdev, checked, pchecked)) {
438: if (!finddev(fl->f_argdev))
439: deverror(fl->f_needs, "arg");
440: *pchecked++ = fl->f_argdev;
441: }
442: }
443: }
444:
445: /*
446: * Do as above, but for swap devices.
447: */
448: dev_t *
449: verifyswap(fl, checked, pchecked)
450: register struct file_list *fl;
451: dev_t checked[];
452: register dev_t *pchecked;
453: {
454:
455: for (;fl && fl->f_type == SWAPSPEC; fl = fl->f_next) {
456: if (eq(fl->f_fn, "generic"))
457: continue;
458: if (alreadychecked(fl->f_swapdev, checked, pchecked))
459: continue;
460: if (!finddev(fl->f_swapdev))
461: fprintf(stderr,
462: "config: swap device %s not configured", fl->f_fn);
463: *pchecked++ = fl->f_swapdev;
464: }
465: return (pchecked);
466: }
467:
468: /*
469: * Has a device already been checked
470: * for it's existence in the configuration?
471: */
472: alreadychecked(dev, list, last)
473: dev_t dev, list[];
474: register dev_t *last;
475: {
476: register dev_t *p;
477:
478: for (p = list; p < last; p++)
479: if (samedev(*p, dev))
480: return (1);
481: return (0);
482: }
483:
484: deverror(systemname, devtype)
485: char *systemname, *devtype;
486: {
487:
488: fprintf(stderr, "config: %s: %s device not configured\n",
489: systemname, devtype);
490: }
491:
492: /*
493: * Look for the device in the list of
494: * configured hardware devices. Must
495: * take into account stuff wildcarded.
496: */
497: finddev(dev)
498: dev_t dev;
499: {
500:
501: /* punt on this right now */
502: return (1);
503: }
504: short yyexca[] ={
505: -1, 1,
506: 0, -1,
507: -2, 0,
508: };
509: # define YYNPROD 93
510: # define YYLAST 208
511: short yyact[]={
512:
513: 8, 73, 74, 94, 95, 142, 23, 12, 15, 63,
514: 9, 11, 86, 139, 106, 137, 44, 19, 17, 14,
515: 136, 10, 21, 135, 61, 62, 63, 64, 16, 134,
516: 13, 132, 7, 42, 43, 35, 20, 6, 131, 127,
517: 126, 61, 62, 125, 64, 83, 124, 118, 97, 96,
518: 91, 87, 45, 41, 140, 35, 82, 55, 40, 120,
519: 130, 27, 121, 26, 25, 24, 123, 77, 54, 141,
520: 70, 99, 98, 72, 71, 69, 59, 128, 101, 105,
521: 116, 38, 60, 76, 122, 53, 104, 81, 47, 52,
522: 103, 57, 119, 28, 34, 36, 39, 29, 84, 58,
523: 100, 51, 50, 56, 30, 31, 32, 49, 48, 46,
524: 22, 33, 18, 37, 5, 4, 68, 3, 2, 1,
525: 102, 110, 65, 66, 67, 107, 113, 129, 93, 0,
526: 0, 0, 0, 0, 0, 75, 0, 78, 79, 80,
527: 0, 0, 85, 0, 0, 0, 0, 0, 0, 39,
528: 0, 92, 0, 88, 89, 90, 0, 0, 0, 0,
529: 0, 0, 117, 0, 0, 109, 112, 115, 0, 108,
530: 111, 114, 0, 0, 0, 0, 0, 0, 0, 0,
531: 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
532: 0, 0, 0, 0, 0, 0, 0, 117, 133, 0,
533: 0, 0, 0, 0, 0, 0, 0, 138 };
534: short yypact[]={
535:
536: -1000,-1000,-256,-1000,-223,-224,-225,-1000,-227,-1000,
537: -1000,-1000,-1000,-1000,-242,-242,-242,-239,-1000,-245,
538: -265,-246,-202,-242,-1000,-1000,-1000,-1000,-184,-253,
539: -184,-184,-184,-253,-1000,-1000,-1000,-186,-1000,-201,
540: -1000,-1000,-195,-196,-297,-1000,-202,-1000,-1000,-1000,
541: -1000,-1000,-216,-216,-216,-216,-1000,-240,-1000,-270,
542: -247,-1000,-1000,-1000,-1000,-240,-240,-240,-248,-242,
543: -294,-249,-250,-197,-198,-1000,-262,-1000,-262,-262,
544: -262,-1000,-242,-251,-206,-252,-255,-1000,-1000,-1000,
545: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-258,-259,
546: -180,-1000,-229,-1000,-1000,-260,-267,-1000,-1000,-1000,
547: -1000,-1000,-1000,-1000,-1000,-1000,-1000,-242,-1000,-1000,
548: -269,-275,-278,-283,-1000,-1000,-1000,-1000,-262,-1000,
549: -285,-243,-211,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
550: -1000,-293,-1000 };
551: short yypgo[]={
552:
553: 0, 79, 128, 82, 80, 127, 90, 86, 126, 125,
554: 121, 120, 119, 118, 117, 115, 114, 113, 112, 110,
555: 109, 88, 108, 107, 102, 101, 83, 100, 78, 81,
556: 93, 91, 87, 97, 99, 98, 92 };
557: short yyr1[]={
558:
559: 0, 12, 13, 13, 14, 14, 14, 14, 14, 16,
560: 16, 16, 16, 16, 16, 16, 16, 16, 16, 16,
561: 16, 16, 16, 16, 16, 16, 16, 16, 18, 19,
562: 20, 20, 21, 21, 21, 21, 22, 27, 27, 28,
563: 11, 11, 23, 9, 9, 24, 10, 10, 25, 8,
564: 8, 7, 26, 26, 5, 5, 6, 6, 6, 17,
565: 17, 29, 29, 2, 2, 1, 3, 3, 3, 3,
566: 15, 15, 15, 15, 15, 15, 30, 33, 31, 31,
567: 34, 34, 35, 35, 36, 36, 36, 36, 32, 32,
568: 32, 4, 4 };
569: short yyr2[]={
570:
571: 0, 1, 2, 0, 2, 2, 2, 1, 2, 2,
572: 2, 2, 2, 1, 2, 2, 4, 3, 2, 4,
573: 3, 3, 5, 4, 3, 5, 4, 2, 2, 2,
574: 2, 1, 1, 1, 1, 1, 3, 3, 1, 2,
575: 1, 1, 3, 1, 1, 3, 1, 1, 3, 1,
576: 1, 4, 1, 0, 2, 0, 1, 2, 3, 3,
577: 1, 1, 3, 1, 1, 1, 1, 1, 1, 1,
578: 4, 4, 4, 4, 3, 4, 3, 0, 2, 0,
579: 3, 3, 2, 0, 2, 2, 2, 2, 2, 2,
580: 0, 1, 2 };
581: short yychk[]={
582:
583: -1000, -12, -13, -14, -15, -16, 293, 288, 256, 266,
584: 277, 267, 263, 286, 275, 264, 284, 274, -18, 273,
585: 292, 278, -19, 262, 288, 288, 288, 288, -30, -33,
586: -30, -30, -30, -33, -1, 297, -1, -17, -29, -1,
587: 297, 298, 298, 299, 281, 298, -20, -21, -22, -23,
588: -24, -25, 291, 287, 270, 259, -1, -31, -34, 260,
589: -3, 294, 295, 279, 297, -31, -31, -31, -3, 261,
590: 271, 269, 269, 298, 299, -21, -26, 283, -26, -26,
591: -26, -32, 296, 285, -35, -3, 282, 298, -32, -32,
592: -32, 298, -29, -2, 297, 298, 298, 298, 269, 269,
593: -27, -28, -11, -6, -7, -1, 276, -9, -6, -7,
594: -10, -6, -7, -8, -6, -7, -4, -1, 298, -36,
595: 265, 268, 290, 272, 298, 298, 298, 298, 257, -5,
596: 289, 298, 298, -4, 298, 298, 298, 298, -28, 298,
597: 297, 280, 298 };
598: short yydef[]={
599:
600: 3, -2, 1, 2, 0, 0, 0, 7, 0, 77,
601: 77, 77, 77, 77, 0, 0, 0, 0, 13, 0,
602: 0, 0, 0, 0, 4, 5, 6, 8, 79, 0,
603: 79, 79, 79, 0, 9, 65, 10, 11, 60, 61,
604: 12, 14, 15, 18, 0, 27, 28, 31, 32, 33,
605: 34, 35, 53, 53, 53, 53, 29, 90, 83, 0,
606: 0, 66, 67, 68, 69, 90, 90, 90, 74, 0,
607: 0, 17, 20, 21, 24, 30, 0, 52, 0, 0,
608: 0, 70, 0, 0, 78, 0, 0, 76, 71, 72,
609: 73, 75, 59, 62, 63, 64, 16, 19, 23, 26,
610: 36, 38, 55, 40, 41, 56, 0, 42, 43, 44,
611: 45, 46, 47, 48, 49, 50, 88, 91, 89, 82,
612: 0, 0, 0, 0, 80, 81, 22, 25, 0, 39,
613: 0, 57, 0, 92, 84, 85, 86, 87, 37, 54,
614: 58, 0, 51 };
615: #ifndef lint
616: static char yaccpar_sccsid[] = "@(#)yaccpar 4.1 (Berkeley) 2/11/83";
617: #endif not lint
618:
619: #
620: # define YYFLAG -1000
621: # define YYERROR goto yyerrlab
622: # define YYACCEPT return(0)
623: # define YYABORT return(1)
624:
625: /* parser for yacc output */
626:
627: #ifdef YYDEBUG
628: int yydebug = 0; /* 1 for debugging */
629: #endif
630: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
631: int yychar = -1; /* current input token number */
632: int yynerrs = 0; /* number of errors */
633: short yyerrflag = 0; /* error recovery flag */
634:
635: yyparse() {
636:
637: short yys[YYMAXDEPTH];
638: short yyj, yym;
639: register YYSTYPE *yypvt;
640: register short yystate, *yyps, yyn;
641: register YYSTYPE *yypv;
642: register short *yyxi;
643:
644: yystate = 0;
645: yychar = -1;
646: yynerrs = 0;
647: yyerrflag = 0;
648: yyps= &yys[-1];
649: yypv= &yyv[-1];
650:
651: yystack: /* put a state and value onto the stack */
652:
653: #ifdef YYDEBUG
654: if( yydebug ) printf( "state %d, char 0%o\n", yystate, yychar );
655: #endif
656: if( ++yyps> &yys[YYMAXDEPTH] ) { yyerror( "yacc stack overflow" ); return(1); }
657: *yyps = yystate;
658: ++yypv;
659: *yypv = yyval;
660:
661: yynewstate:
662:
663: yyn = yypact[yystate];
664:
665: if( yyn<= YYFLAG ) goto yydefault; /* simple state */
666:
667: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar=0;
668: if( (yyn += yychar)<0 || yyn >= YYLAST ) goto yydefault;
669:
670: if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
671: yychar = -1;
672: yyval = yylval;
673: yystate = yyn;
674: if( yyerrflag > 0 ) --yyerrflag;
675: goto yystack;
676: }
677:
678: yydefault:
679: /* default state action */
680:
681: if( (yyn=yydef[yystate]) == -2 ) {
682: if( yychar<0 ) if( (yychar=yylex())<0 ) yychar = 0;
683: /* look through exception table */
684:
685: for( yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate) ; yyxi += 2 ) ; /* VOID */
686:
687: while( *(yyxi+=2) >= 0 ){
688: if( *yyxi == yychar ) break;
689: }
690: if( (yyn = yyxi[1]) < 0 ) return(0); /* accept */
691: }
692:
693: if( yyn == 0 ){ /* error */
694: /* error ... attempt to resume parsing */
695:
696: switch( yyerrflag ){
697:
698: case 0: /* brand new error */
699:
700: yyerror( "syntax error" );
701: yyerrlab:
702: ++yynerrs;
703:
704: case 1:
705: case 2: /* incompletely recovered error ... try again */
706:
707: yyerrflag = 3;
708:
709: /* find a state where "error" is a legal shift action */
710:
711: while ( yyps >= yys ) {
712: yyn = yypact[*yyps] + YYERRCODE;
713: if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
714: yystate = yyact[yyn]; /* simulate a shift of "error" */
715: goto yystack;
716: }
717: yyn = yypact[*yyps];
718:
719: /* the current yyps has no shift onn "error", pop stack */
720:
721: #ifdef YYDEBUG
722: if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
723: #endif
724: --yyps;
725: --yypv;
726: }
727:
728: /* there is no state on the stack with an error shift ... abort */
729:
730: yyabort:
731: return(1);
732:
733:
734: case 3: /* no shift yet; clobber input char */
735:
736: #ifdef YYDEBUG
737: if( yydebug ) printf( "error recovery discards char %d\n", yychar );
738: #endif
739:
740: if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
741: yychar = -1;
742: goto yynewstate; /* try again in the same state */
743:
744: }
745:
746: }
747:
748: /* reduction by production yyn */
749:
750: #ifdef YYDEBUG
751: if( yydebug ) printf("reduce %d\n",yyn);
752: #endif
753: yyps -= yyr2[yyn];
754: yypvt = yypv;
755: yypv -= yyr2[yyn];
756: yyval = yypv[1];
757: yym=yyn;
758: /* consult goto table to find next state */
759: yyn = yyr1[yyn];
760: yyj = yypgo[yyn] + *yyps + 1;
761: if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
762: switch(yym){
763:
764: case 1:
765: # line 83 "config.y"
766: { verifysystemspecs(); } break;
767: case 4:
768: # line 94 "config.y"
769: { newdev(&cur); } break;
770: case 6:
771: # line 98 "config.y"
772: { do_trace = !do_trace; } break;
773: case 9:
774: # line 106 "config.y"
775: {
776: if (!strcmp(yypvt[-0].str, "vax")) {
777: machine = MACHINE_VAX;
778: machinename = "vax";
779: } else if (!strcmp(yypvt[-0].str, "sun")) {
780: machine = MACHINE_SUN;
781: machinename = "sun";
782: } else if (!strcmp(yypvt[-0].str, "tahoe")) {
783: machine = MACHINE_TAHOE;
784: machinename = "tahoe";
785: } else
786: yyerror("Unknown machine type");
787: } break;
788: case 10:
789: # line 120 "config.y"
790: {
791: struct cputype *cp =
792: (struct cputype *)malloc(sizeof (struct cputype));
793: cp->cpu_name = ns(yypvt[-0].str);
794: cp->cpu_next = cputype;
795: cputype = cp;
796: free(temp_id);
797: } break;
798: case 12:
799: # line 131 "config.y"
800: { ident = ns(yypvt[-0].str); } break;
801: case 14:
802: # line 135 "config.y"
803: { hz = yypvt[-0].val; } break;
804: case 15:
805: # line 137 "config.y"
806: { timezone = 60 * yypvt[-0].val; check_tz(); } break;
807: case 16:
808: # line 139 "config.y"
809: { timezone = 60 * yypvt[-2].val; dst = yypvt[-0].val; check_tz(); } break;
810: case 17:
811: # line 141 "config.y"
812: { timezone = 60 * yypvt[-1].val; dst = 1; check_tz(); } break;
813: case 18:
814: # line 143 "config.y"
815: { timezone = yypvt[-0].val; check_tz(); } break;
816: case 19:
817: # line 145 "config.y"
818: { timezone = yypvt[-2].val; dst = yypvt[-0].val; check_tz(); } break;
819: case 20:
820: # line 147 "config.y"
821: { timezone = yypvt[-1].val; dst = 1; check_tz(); } break;
822: case 21:
823: # line 149 "config.y"
824: { timezone = -60 * yypvt[-0].val; check_tz(); } break;
825: case 22:
826: # line 151 "config.y"
827: { timezone = -60 * yypvt[-2].val; dst = yypvt[-0].val; check_tz(); } break;
828: case 23:
829: # line 153 "config.y"
830: { timezone = -60 * yypvt[-1].val; dst = 1; check_tz(); } break;
831: case 24:
832: # line 155 "config.y"
833: { timezone = -yypvt[-0].val; check_tz(); } break;
834: case 25:
835: # line 157 "config.y"
836: { timezone = -yypvt[-2].val; dst = yypvt[-0].val; check_tz(); } break;
837: case 26:
838: # line 159 "config.y"
839: { timezone = -yypvt[-1].val; dst = 1; check_tz(); } break;
840: case 27:
841: # line 161 "config.y"
842: { maxusers = yypvt[-0].val; } break;
843: case 28:
844: # line 165 "config.y"
845: { checksystemspec(*confp); } break;
846: case 29:
847: # line 170 "config.y"
848: { mkconf(yypvt[-0].str); } break;
849: case 39:
850: # line 196 "config.y"
851: { mkswap(*confp, yypvt[-1].file, yypvt[-0].val); } break;
852: case 40:
853: # line 201 "config.y"
854: {
855: struct file_list *fl = newswap();
856:
857: if (eq(yypvt[-0].str, "generic"))
858: fl->f_fn = yypvt[-0].str;
859: else {
860: fl->f_swapdev = nametodev(yypvt[-0].str, 0, 'b');
861: fl->f_fn = devtoname(fl->f_swapdev);
862: }
863: yyval.file = fl;
864: } break;
865: case 41:
866: # line 213 "config.y"
867: {
868: struct file_list *fl = newswap();
869:
870: fl->f_swapdev = yypvt[-0].val;
871: fl->f_fn = devtoname(yypvt[-0].val);
872: yyval.file = fl;
873: } break;
874: case 42:
875: # line 224 "config.y"
876: {
877: struct file_list *fl = *confp;
878:
879: if (fl && fl->f_rootdev != NODEV)
880: yyerror("extraneous root device specification");
881: else
882: fl->f_rootdev = yypvt[-0].val;
883: } break;
884: case 43:
885: # line 236 "config.y"
886: { yyval.val = nametodev(yypvt[-0].str, 0, 'a'); } break;
887: case 45:
888: # line 242 "config.y"
889: {
890: struct file_list *fl = *confp;
891:
892: if (fl && fl->f_dumpdev != NODEV)
893: yyerror("extraneous dump device specification");
894: else
895: fl->f_dumpdev = yypvt[-0].val;
896: } break;
897: case 46:
898: # line 255 "config.y"
899: { yyval.val = nametodev(yypvt[-0].str, 0, 'b'); } break;
900: case 48:
901: # line 261 "config.y"
902: {
903: struct file_list *fl = *confp;
904:
905: if (fl && fl->f_argdev != NODEV)
906: yyerror("extraneous arg device specification");
907: else
908: fl->f_argdev = yypvt[-0].val;
909: } break;
910: case 49:
911: # line 273 "config.y"
912: { yyval.val = nametodev(yypvt[-0].str, 0, 'b'); } break;
913: case 51:
914: # line 279 "config.y"
915: { yyval.val = makedev(yypvt[-2].val, yypvt[-0].val); } break;
916: case 54:
917: # line 289 "config.y"
918: { yyval.val = yypvt[-0].val; } break;
919: case 55:
920: # line 291 "config.y"
921: { yyval.val = 0; } break;
922: case 56:
923: # line 296 "config.y"
924: { yyval.str = yypvt[-0].str; } break;
925: case 57:
926: # line 298 "config.y"
927: {
928: char buf[80];
929:
930: (void) sprintf(buf, "%s%d", yypvt[-1].str, yypvt[-0].val);
931: yyval.str = ns(buf); free(yypvt[-1].str);
932: } break;
933: case 58:
934: # line 305 "config.y"
935: {
936: char buf[80];
937:
938: (void) sprintf(buf, "%s%d%s", yypvt[-2].str, yypvt[-1].val, yypvt[-0].str);
939: yyval.str = ns(buf); free(yypvt[-2].str);
940: } break;
941: case 61:
942: # line 321 "config.y"
943: {
944: struct opt *op = (struct opt *)malloc(sizeof (struct opt));
945: op->op_name = ns(yypvt[-0].str);
946: op->op_next = opt;
947: op->op_value = 0;
948: opt = op;
949: free(temp_id);
950: } break;
951: case 62:
952: # line 330 "config.y"
953: {
954: struct opt *op = (struct opt *)malloc(sizeof (struct opt));
955: op->op_name = ns(yypvt[-2].str);
956: op->op_next = opt;
957: op->op_value = ns(yypvt[-0].str);
958: opt = op;
959: free(temp_id);
960: free(val_id);
961: } break;
962: case 63:
963: # line 342 "config.y"
964: { yyval.str = val_id = ns(yypvt[-0].str); } break;
965: case 64:
966: # line 344 "config.y"
967: { char nb[16]; yyval.str = val_id = ns(sprintf(nb, "%d", yypvt[-0].val)); } break;
968: case 65:
969: # line 349 "config.y"
970: { yyval.str = temp_id = ns(yypvt[-0].str); } break;
971: case 66:
972: # line 354 "config.y"
973: { yyval.str = ns("uba"); } break;
974: case 67:
975: # line 356 "config.y"
976: { yyval.str = ns("vba"); } break;
977: case 68:
978: # line 358 "config.y"
979: { yyval.str = ns("mba"); } break;
980: case 69:
981: # line 360 "config.y"
982: { yyval.str = ns(yypvt[-0].str); } break;
983: case 70:
984: # line 365 "config.y"
985: { cur.d_type = DEVICE; } break;
986: case 71:
987: # line 367 "config.y"
988: { cur.d_type = MASTER; } break;
989: case 72:
990: # line 369 "config.y"
991: { cur.d_dk = 1; cur.d_type = DEVICE; } break;
992: case 73:
993: # line 371 "config.y"
994: { cur.d_type = CONTROLLER; } break;
995: case 74:
996: # line 373 "config.y"
997: {
998: cur.d_name = yypvt[-0].str;
999: cur.d_type = PSEUDO_DEVICE;
1000: } break;
1001: case 75:
1002: # line 378 "config.y"
1003: {
1004: cur.d_name = yypvt[-1].str;
1005: cur.d_type = PSEUDO_DEVICE;
1006: cur.d_slave = yypvt[-0].val;
1007: } break;
1008: case 76:
1009: # line 386 "config.y"
1010: {
1011: cur.d_name = yypvt[-1].str;
1012: if (eq(yypvt[-1].str, "mba"))
1013: seen_mba = 1;
1014: else if (eq(yypvt[-1].str, "uba"))
1015: seen_uba = 1;
1016: else if (eq(yypvt[-1].str, "vba"))
1017: seen_vba = 1;
1018: cur.d_unit = yypvt[-0].val;
1019: } break;
1020: case 77:
1021: # line 399 "config.y"
1022: { init_dev(&cur); } break;
1023: case 80:
1024: # line 409 "config.y"
1025: {
1026: if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba"))
1027: yyerror(sprintf(errbuf,
1028: "%s must be connected to a nexus", cur.d_name));
1029: cur.d_conn = connect(yypvt[-1].str, yypvt[-0].val);
1030: } break;
1031: case 81:
1032: # line 416 "config.y"
1033: { check_nexus(&cur, yypvt[-0].val); cur.d_conn = TO_NEXUS; } break;
1034: case 84:
1035: # line 426 "config.y"
1036: { cur.d_addr = yypvt[-0].val; } break;
1037: case 85:
1038: # line 428 "config.y"
1039: { cur.d_drive = yypvt[-0].val; } break;
1040: case 86:
1041: # line 430 "config.y"
1042: {
1043: if (cur.d_conn != 0 && cur.d_conn != TO_NEXUS &&
1044: cur.d_conn->d_type == MASTER)
1045: cur.d_slave = yypvt[-0].val;
1046: else
1047: yyerror("can't specify slave--not to master");
1048: } break;
1049: case 87:
1050: # line 438 "config.y"
1051: { cur.d_flags = yypvt[-0].val; } break;
1052: case 88:
1053: # line 442 "config.y"
1054: { cur.d_vec = yypvt[-0].lst; } break;
1055: case 89:
1056: # line 444 "config.y"
1057: { cur.d_pri = yypvt[-0].val; } break;
1058: case 91:
1059: # line 450 "config.y"
1060: {
1061: struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
1062: a->id = yypvt[-0].str; a->id_next = 0; yyval.lst = a;
1063: } break;
1064: case 92:
1065: # line 454 "config.y"
1066:
1067: {
1068: struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
1069: a->id = yypvt[-1].str; a->id_next = yypvt[-0].lst; yyval.lst = a;
1070: } break;
1071: }
1072: goto yystack; /* stack new state and value */
1073:
1074: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.