Annotation of cci/usr/src/etc/config/y.tab.c, revision 1.1.1.1

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:        }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.