Annotation of researchv9/sys/conf/src/config/y.tab.c, revision 1.1.1.1

1.1       root        1: 
                      2: # line 1 "config.y"
                      3: typedef union  {
                      4:        int i;
                      5:        char *cp;
                      6:        struct idlst *idlst;
                      7: } YYSTYPE;
                      8: # define CPU 257
                      9: # define IDENT 258
                     10: # define CONFIG 259
                     11: # define ANY 260
                     12: # define DEVICE 261
                     13: # define UBA 262
                     14: # define MBA 263
                     15: # define NEXUS 264
                     16: # define CSR 265
                     17: # define DRIVE 266
                     18: # define VECTOR 267
                     19: # define OPTIONS 268
                     20: # define CONTROLLER 269
                     21: # define PSEUDO_DEVICE 270
                     22: # define FLAGS 271
                     23: # define ID 272
                     24: # define SEMICOLON 273
                     25: # define NUMBER 274
                     26: # define FPNUMBER 275
                     27: # define TRACE 276
                     28: # define DISK 277
                     29: # define SLAVE 278
                     30: # define AT 279
                     31: # define HZ 280
                     32: # define TIMEZONE 281
                     33: # define DST 282
                     34: # define MAXUSERS 283
                     35: # define MASTER 284
                     36: # define MAKEFILE 285
                     37: # define COMMA 286
                     38: # define MINUS 287
                     39: # define MACHINE 288
                     40: # define PRIORITY 289
                     41: # define VME16D16 290
                     42: # define VME24D16 291
                     43: # define VME32D16 292
                     44: # define VME16D32 293
                     45: # define VME24D32 294
                     46: # define VME32D32 295
                     47: 
                     48: # line 15 "config.y"
                     49: /*     config.y        1.11    81/05/22        */
                     50: #include "config.h"
                     51: #include <stdio.h>
                     52:        struct device cur;
                     53:        struct device *curp = NULL;
                     54:        char *temp_id;
                     55: #define yyclearin yychar = -1
                     56: #define yyerrok yyerrflag = 0
                     57: extern int yychar;
                     58: extern short yyerrflag;
                     59: #ifndef YYMAXDEPTH
                     60: #define YYMAXDEPTH 150
                     61: #endif
                     62: YYSTYPE yylval, yyval;
                     63: # define YYERRCODE 256
                     64: 
                     65: # line 255 "config.y"
                     66: 
                     67: 
                     68: yyerror(s)
                     69: char *s;
                     70: {
                     71:        fprintf(stderr, "config: %s at line %d\n", s, yyline);
                     72: }
                     73: 
                     74: /*
                     75:  * ns:
                     76:  *     Return the passed string in a new space
                     77:  */
                     78: 
                     79: char *
                     80: ns(str)
                     81: register char *str;
                     82: {
                     83:        register char *cp;
                     84: 
                     85:        cp = malloc(strlen(str)+1);
                     86:        strcpy(cp, str);
                     87:        return cp;
                     88: }
                     89: 
                     90: /*
                     91:  * newdev
                     92:  *     Add a device to the list
                     93:  */
                     94: 
                     95: newdev(dp)
                     96: register struct device *dp;
                     97: {
                     98:        register struct device *np;
                     99: 
                    100:        np = (struct device *) malloc(sizeof *np);
                    101:        *np = *dp;
                    102:        if (curp == NULL)
                    103:                dtab = np;
                    104:        else
                    105:                curp->d_next = np;
                    106:        curp = np;
                    107: }
                    108: 
                    109: /*
                    110:  * mkconf
                    111:  *     Note that a configuration should be made
                    112:  */
                    113: 
                    114: mkconf(dev, sysname)
                    115: char *dev, *sysname;
                    116: {
                    117:        register struct file_list *fl;
                    118: 
                    119:        fl = (struct file_list *) malloc(sizeof *fl);
                    120:        fl->f_fn = ns(dev);
                    121:        fl->f_needs = ns(sysname);
                    122:        if (confp == NULL)
                    123:            conf_list = fl;
                    124:        else
                    125:            confp->f_next = fl;
                    126:        confp = fl;
                    127: }
                    128: 
                    129: /*
                    130:  * Connect:
                    131:  *     Find the pointer to connect to the given device and number.
                    132:  *     returns NULL if no such device and prints an error message
                    133:  */
                    134: 
                    135: struct device *connect(dev, num)
                    136: register char *dev;
                    137: register int num;
                    138: {
                    139:        register struct device *dp;
                    140:        struct device *huhcon();
                    141: 
                    142:        if (num == QUES)
                    143:            return huhcon(dev);
                    144:        for (dp = dtab; dp != NULL; dp = dp->d_next)
                    145:                if ((num == dp->d_unit) && eq(dev, dp->d_name))
                    146:                    if (dp->d_type != CONTROLLER && dp->d_type != MASTER)
                    147:                    {
                    148:                        sprintf(errbuf, "%s connected to non-controller", dev);
                    149:                        yyerror(errbuf);
                    150:                        return NULL;
                    151:                    }
                    152:                    else
                    153:                        return dp;
                    154:        sprintf(errbuf, "%s %d not defined", dev, num);
                    155:        yyerror(errbuf);
                    156:        return NULL;
                    157: }
                    158: 
                    159: /*
                    160:  * huhcon
                    161:  *     Connect to an unspecific thing
                    162:  */
                    163: 
                    164: struct device *huhcon(dev)
                    165: register char *dev;
                    166: {
                    167:     register struct device *dp, *dcp;
                    168:     struct device rdev;
                    169:     int oldtype;
                    170: 
                    171:     /*
                    172:      * First make certain that there are some of these to wildcard on
                    173:      */
                    174:     for (dp = dtab; dp != NULL; dp = dp->d_next)
                    175:        if (eq(dp->d_name, dev))
                    176:            break;
                    177:     if (dp == NULL)
                    178:     {
                    179:        sprintf(errbuf, "no %s's to wildcard", dev);
                    180:        yyerror(errbuf);
                    181:        return NULL;
                    182:     }
                    183:     oldtype = dp->d_type;
                    184:     dcp = dp->d_conn;
                    185:     /*
                    186:      * Now see if there is already a wildcard entry for this device
                    187:      * (e.g. Search for a "uba ?")
                    188:      */
                    189:     for (; dp != NULL; dp = dp->d_next)
                    190:        if (eq(dev, dp->d_name) && dp->d_unit == -1)
                    191:            break;
                    192:     /*
                    193:      * If there isn't, make one becuase everything needs to be connected
                    194:      * to something.
                    195:      */
                    196:     if (dp == NULL)
                    197:     {
                    198:        dp = &rdev;
                    199:        init_dev(dp);
                    200:        dp->d_unit = QUES;
                    201:        dp->d_name = ns(dev);
                    202:        dp->d_type = oldtype;
                    203:        newdev(dp);
                    204:        dp = curp;
                    205:        /*
                    206:         * Connect it to the same thing that other similar things are
                    207:         * connected to, but make sure it is a wildcard unit
                    208:         * (e.g. up connected to sc ?, here we make connect sc? to a uba?)
                    209:         * If other things like this are on the NEXUS or if the aren't
                    210:         * connected to anything, then make the same connection, else
                    211:         * call ourself to connect to another unspecific device.
                    212:         */
                    213:        if (dcp == TO_NEXUS || dcp == NULL)
                    214:            dp->d_conn = dcp;
                    215:        else
                    216:            dp->d_conn = connect(dcp->d_name, QUES);
                    217:     }
                    218:     return dp;
                    219: }
                    220: 
                    221: /*
                    222:  * init_dev:
                    223:  *     Set up the fields in the current device to their
                    224:  *     default values.
                    225:  */
                    226: 
                    227: init_dev(dp)
                    228: register struct device *dp;
                    229: {
                    230:     dp->d_name = "OHNO!!!";
                    231:     dp->d_type = DEVICE;
                    232:     dp->d_conn = NULL;
                    233:     dp->d_vec = NULL;
                    234:     dp->d_addr = UNKNOWN;
                    235:     dp->d_flags = dp->d_dk = 0;
                    236:     dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
                    237:     dp->d_count = 0;
                    238:     dp->d_mach = dp->d_bus = 0;
                    239:     dp->d_pri = 0;
                    240: }
                    241: 
                    242: /*
                    243:  * Check_nexus:
                    244:  *     Make certain that this is a reasonable type of thing to put
                    245:  *     on the nexus.
                    246:  */
                    247: 
                    248: check_nexus(dev, num)
                    249: register struct device *dev;
                    250: int num;
                    251: {
                    252:        switch (machine) {
                    253: 
                    254:        case MACHINE_VAX:
                    255:                if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba"))
                    256:                        yyerror("only uba's and mba's should be connected to the nexus");
                    257:                if (num != QUES)
                    258:                        yyerror("can't give specific nexus numbers");
                    259:                break;
                    260: 
                    261:        case MACHINE_SUN2:
                    262:                if (!eq(dev->d_name, "virtual") &&
                    263:                    !eq(dev->d_name, "obmem") &&
                    264:                    !eq(dev->d_name, "obio") &&
                    265:                    !eq(dev->d_name, "mbmem") &&
                    266:                    !eq(dev->d_name, "mbio") &&
                    267:                    !eq(dev->d_name, "vme16d16") &&
                    268:                    !eq(dev->d_name, "vme24d16")) {
                    269:                        (void)sprintf(errbuf,
                    270:                            "unknown bus type `%s' for nexus connection on %s",
                    271:                            dev->d_name, machinename);
                    272:                        yyerror(errbuf);
                    273:                }
                    274:                break;
                    275: 
                    276:        case MACHINE_SUN3:
                    277:                if (!eq(dev->d_name, "virtual") &&
                    278:                    !eq(dev->d_name, "obmem") &&
                    279:                    !eq(dev->d_name, "obio") &&
                    280:                    !eq(dev->d_name, "vme16d16") &&
                    281:                    !eq(dev->d_name, "vme24d16") &&
                    282:                    !eq(dev->d_name, "vme32d16") &&
                    283:                    !eq(dev->d_name, "vme16d32") &&
                    284:                    !eq(dev->d_name, "vme24d32") &&
                    285:                    !eq(dev->d_name, "vme32d32")) {
                    286:                        (void)sprintf(errbuf,
                    287:                            "unknown bus type `%s' for nexus connection on %s",
                    288:                            dev->d_name, machinename);
                    289:                        yyerror(errbuf);
                    290:                }
                    291:                break;
                    292:        }
                    293: }
                    294: 
                    295: /*
                    296:  * Check the timezone to make certain it is sensible
                    297:  */
                    298: 
                    299: check_tz()
                    300: {
                    301:        if (timezone > 24 * 60)
                    302:                yyerror("timezone is unreasonable");
                    303:        else
                    304:                hadtz = TRUE;
                    305: }
                    306: 
                    307: /*
                    308:  * bi_info gives the magic number used to construct the token for
                    309:  * the autoconf code.  bi_max is the maximum value (across all
                    310:  * machine types for a given architecture) that a given "bus
                    311:  * type" can legally have.
                    312:  */
                    313: struct bus_info {
                    314:        char    *bi_name;
                    315:        u_short bi_info;
                    316:        u_int   bi_max;
                    317: };
                    318: 
                    319: struct bus_info sun2_info[] = {
                    320:        { "virtual",    0x0001, (1<<24)-1 },
                    321:        { "obmem",      0x0002, (1<<23)-1 },
                    322:        { "obio",       0x0004, (1<<23)-1 },
                    323:        { "mbmem",      0x0010, (1<<20)-1 },
                    324:        { "mbio",       0x0020, (1<<16)-1 },
                    325:        { "vme16d16",   0x0100, (1<<16)-1 },
                    326:        { "vme24d16",   0x0200, (1<<24)-(1<<16)-1 },
                    327:        { (char *)0,    0,      0 }
                    328: };
                    329: 
                    330: struct bus_info sun3_info[] = {
                    331:        { "virtual",    0x0001, (1<<32)-1 },
                    332:        { "obmem",      0x0002, (1<<32)-1 },
                    333:        { "obio",       0x0004, (1<<21)-1 },
                    334:        { "vme16d16",   0x0100, (1<<16)-1 },
                    335:        { "vme24d16",   0x0200, (1<<24)-(1<<16)-1 },
                    336:        { "vme32d16",   0x0400, (1<<32)-(1<<24)-1 },
                    337:        { "vme16d32",   0x1000, (1<<16) },
                    338:        { "vme24d32",   0x2000, (1<<24)-(1<<16)-1 },
                    339:        { "vme32d32",   0x4000, (1<<32)-(1<<24)-1 },
                    340:        { (char *)0,    0,      0 }
                    341: };
                    342: 
                    343: bus_encode(addr, dp)
                    344:        u_int addr;
                    345:        register struct device *dp;
                    346: {
                    347:        register char *busname;
                    348:        register struct bus_info *bip;
                    349:        register int num;
                    350: 
                    351:        if (machine == MACHINE_SUN2)
                    352:                bip = sun2_info;
                    353:        else if (machine == MACHINE_SUN3)
                    354:                bip = sun3_info;
                    355:        else {
                    356:                yyerror("bad machine type for bus_encode");
                    357:                exit(1);
                    358:        }
                    359: 
                    360:        if (dp->d_conn == TO_NEXUS || dp->d_conn == 0) {
                    361:                yyerror("bad connection");
                    362:                exit(1);
                    363:        }
                    364: 
                    365:        busname = dp->d_conn->d_name;
                    366:        num = dp->d_conn->d_unit;
                    367: 
                    368:        for (; bip->bi_name != 0; bip++)
                    369:                if (eq(busname, bip->bi_name))
                    370:                        break;
                    371: 
                    372:        if (bip->bi_name == 0) {
                    373:                (void)sprintf(errbuf, "bad bus type '%s' for machine %s",
                    374:                        busname, machinename);
                    375:                yyerror(errbuf);
                    376:        } else if (addr > bip->bi_max) {
                    377:                (void)sprintf(errbuf,
                    378:                        "0x%x exceeds maximum address 0x%x allowed for %s",
                    379:                        addr, bip->bi_max, busname);
                    380:                yyerror(errbuf);
                    381:        } else {
                    382:                dp->d_bus = bip->bi_info;       /* set up bus type info */
                    383:                if (num != QUES)
                    384:                        /*
                    385:                         * Set up cpu type since the connecting
                    386:                         * bus type is not wildcarded.
                    387:                         */
                    388:                        dp->d_mach = num;
                    389:        }
                    390: }
                    391: short yyexca[] ={
                    392: -1, 1,
                    393:        0, -1,
                    394:        -2, 0,
                    395: -1, 2,
                    396:        0, 1,
                    397:        -2, 0,
                    398:        };
                    399: # define YYNPROD 66
                    400: # define YYLAST 168
                    401: short yyact[]={
                    402: 
                    403:    8,  15,  17,  18,  74,   9,  86,  65,  52,  53,
                    404:   77,  85,  16,  12,  13,  84,  68,   7,  60,  45,
                    405:    6,  11,  67, 104,  19,  20,  73,  23,  10,  22,
                    406:   50,  21,  14,  52,  53, 103,  54,  55,  56,  57,
                    407:   58,  59, 102,  60,  91,  92,  69,  70,  43,  44,
                    408:   94, 101,  35,  88,  99,  97,  96,  93,  95,  87,
                    409:   82,  54,  55,  56,  57,  58,  59,  78,  47,  42,
                    410:   27,  26,  25,  24,  35,  66,  46,  40,  74,  72,
                    411:   89,  51,  90,  75,  38,  71,  48,  49,  37,  28,
                    412:   29,   5,   4,   3,   2,  34,  36,  39,   1,  41,
                    413:   30,  31,  32,   0,  33,   0,   0,   0,   0,   0,
                    414:    0,   0,   0,   0,   0,  64,   0,  61,  62,  63,
                    415:    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,
                    416:    0,   0,  76,   0,   0,   0,   0,   0,   0,   0,
                    417:    0,   0,   0, 100,   0,   0,  39,  79,  80,  81,
                    418:   83,   0,   0, 105,   0,   0,   0,   0,   0,   0,
                    419:    0,   0,   0,   0,   0,   0,   0,  98 };
                    420: short yypact[]={
                    421: 
                    422: -1000,-1000,-256,-1000,-200,-201,-202,-1000,-203,-1000,
                    423: -1000,-1000,-1000,-1000,-198,-198,-198,-195,-198,-205,
                    424: -226,-262,-196,-206,-1000,-1000,-1000,-1000,-249,-229,
                    425: -249,-249,-249,-229,-1000,-1000,-1000,-279,-1000,-1000,
                    426: -1000,-197,-1000,-260,-266,-228,-1000,-1000,-263,-1000,
                    427: -254,-207,-1000,-1000,-1000,-1000,-1000,-1000,-1000,-1000,
                    428: -1000,-263,-263,-263,-214,-198,-1000,-1000,-1000,-267,
                    429: -271,-1000,-283,-215,-198,-221,-216,-218,-1000,-1000,
                    430: -1000,-1000,-1000,-1000,-1000,-1000,-219,-189,-1000,-220,
                    431: -1000,-223,-232,-239,-251,-1000,-1000,-1000,-1000,-198,
                    432: -1000,-1000,-1000,-1000,-1000,-1000 };
                    433: short yypgo[]={
                    434: 
                    435:    0,  80,  81,  53,  98,  94,  93,  92,  91,  88,
                    436:   84,  89,  86,  85,  90,  87,  83,  82,  79 };
                    437: short yyr1[]={
                    438: 
                    439:    0,   4,   5,   5,   6,   6,   6,   6,   6,   8,
                    440:    8,   8,   8,   8,   8,   8,   8,   8,   8,   8,
                    441:    8,   8,   8,   8,   8,   9,   9,  10,   1,   2,
                    442:    2,   2,   2,   2,   2,   2,   2,   2,   7,   7,
                    443:    7,   7,   7,   7,  11,  14,  12,  12,  15,  15,
                    444:   16,  16,  17,  17,  17,  17,  13,  13,  13,  13,
                    445:   13,  18,   3,   3,   3,   3 };
                    446: short yyr2[]={
                    447: 
                    448:    0,   1,   2,   0,   2,   2,   2,   1,   2,   2,
                    449:    2,   2,   2,   3,   2,   2,   3,   2,   3,   3,
                    450:    4,   3,   4,   2,   2,   3,   1,   1,   1,   1,
                    451:    1,   1,   1,   1,   1,   1,   1,   1,   4,   4,
                    452:    4,   4,   3,   4,   3,   0,   2,   0,   3,   3,
                    453:    2,   0,   2,   2,   2,   2,   1,   2,   3,   3,
                    454:    0,   2,   1,   2,   2,   3 };
                    455: short yychk[]={
                    456: 
                    457: -1000,  -4,  -5,  -6,  -7,  -8, 276, 273, 256, 261,
                    458:  284, 277, 269, 270, 288, 257, 268, 258, 259, 280,
                    459:  281, 287, 285, 283, 273, 273, 273, 273, -11, -14,
                    460:  -11, -11, -11, -14,  -1, 272,  -1,  -9, -10,  -1,
                    461:  272,  -1, 274, 274, 275, 281, 272, 274, -12, -15,
                    462:  279,  -2, 262, 263, 290, 291, 292, 293, 294, 295,
                    463:  272, -12, -12, -12,  -2, 286, 272, 282, 282, 274,
                    464:  275, -13, -18, 289, 267, -16,  -2, 264, 274, -13,
                    465:  -13, -13, 274, -10, 282, 282, 289, 274,  -3,  -1,
                    466:  -17, 265, 266, 278, 271, 274, 274, 274, -18, 274,
                    467:   -3, 274, 274, 274, 274,  -3 };
                    468: short yydef[]={
                    469: 
                    470:    3,  -2,  -2,   2,   0,   0,   0,   7,   0,  45,
                    471:   45,  45,  45,  45,   0,   0,   0,   0,   0,   0,
                    472:    0,   0,   0,   0,   4,   5,   6,   8,  47,   0,
                    473:   47,  47,  47,   0,   9,  28,  10,  11,  26,  27,
                    474:   12,   0,  14,  15,  17,   0,  23,  24,  60,  51,
                    475:    0,   0,  29,  30,  31,  32,  33,  34,  35,  36,
                    476:   37,  60,  60,  60,  42,   0,  13,  16,  18,  19,
                    477:   21,  38,  56,   0,   0,  46,   0,   0,  44,  39,
                    478:   40,  41,  43,  25,  20,  22,   0,  57,  61,  62,
                    479:   50,   0,   0,   0,   0,  48,  49,  58,  59,  63,
                    480:   64,  52,  53,  54,  55,  65 };
                    481: # ifdef YYDEBUG
                    482: # include "y.debug"
                    483: # endif
                    484: 
                    485: # define YYFLAG -1000
                    486: # define YYERROR goto yyerrlab
                    487: # define YYACCEPT return(0)
                    488: # define YYABORT return(1)
                    489: 
                    490: /*     parser for yacc output  */
                    491: 
                    492: #ifdef YYDEBUG
                    493: int yydebug = 0; /* 1 for debugging */
                    494: #endif
                    495: YYSTYPE yyv[YYMAXDEPTH]; /* where the values are stored */
                    496: int yychar = -1; /* current input token number */
                    497: int yynerrs = 0;  /* number of errors */
                    498: short yyerrflag = 0;  /* error recovery flag */
                    499: 
                    500: yyparse()
                    501: {      short yys[YYMAXDEPTH];
                    502:        int yyj, yym;
                    503:        register YYSTYPE *yypvt;
                    504:        register int yystate, yyn;
                    505:        register short *yyps;
                    506:        register YYSTYPE *yypv;
                    507:        register short *yyxi;
                    508: 
                    509:        yystate = 0;
                    510:        yychar = -1;
                    511:        yynerrs = 0;
                    512:        yyerrflag = 0;
                    513:        yyps= &yys[-1];
                    514:        yypv= &yyv[-1];
                    515: 
                    516: yystack:    /* put a state and value onto the stack */
                    517: #ifdef YYDEBUG
                    518:        if(yydebug >= 3)
                    519:                if(yychar < 0 || yytoknames[yychar] == 0)
                    520:                        printf("char %d in %s", yychar, yystates[yystate]);
                    521:                else
                    522:                        printf("%s in %s", yytoknames[yychar], yystates[yystate]);
                    523: #endif
                    524:        if( ++yyps >= &yys[YYMAXDEPTH] ) { 
                    525:                yyerror( "yacc stack overflow" ); 
                    526:                return(1); 
                    527:        }
                    528:        *yyps = yystate;
                    529:        ++yypv;
                    530:        *yypv = yyval;
                    531: yynewstate:
                    532:        yyn = yypact[yystate];
                    533:        if(yyn <= YYFLAG) goto yydefault; /* simple state */
                    534:        if(yychar<0) {
                    535:                yychar = yylex();
                    536: #ifdef YYDEBUG
                    537:                if(yydebug >= 2) {
                    538:                        if(yychar <= 0)
                    539:                                printf("lex EOF\n");
                    540:                        else if(yytoknames[yychar])
                    541:                                printf("lex %s\n", yytoknames[yychar]);
                    542:                        else
                    543:                                printf("lex (%c)\n", yychar);
                    544:                }
                    545: #endif
                    546:                if(yychar < 0)
                    547:                        yychar = 0;
                    548:        }
                    549:        if((yyn += yychar) < 0 || yyn >= YYLAST)
                    550:                goto yydefault;
                    551:        if( yychk[ yyn=yyact[ yyn ] ] == yychar ){ /* valid shift */
                    552:                yychar = -1;
                    553:                yyval = yylval;
                    554:                yystate = yyn;
                    555:                if( yyerrflag > 0 ) --yyerrflag;
                    556:                goto yystack;
                    557:        }
                    558: yydefault:
                    559:        /* default state action */
                    560:        if( (yyn=yydef[yystate]) == -2 ) {
                    561:                if(yychar < 0) {
                    562:                        yychar = yylex();
                    563: #ifdef YYDEBUG
                    564:                        if(yydebug >= 2)
                    565:                                if(yychar < 0)
                    566:                                        printf("lex EOF\n");
                    567:                                else
                    568:                                        printf("lex %s\n", yytoknames[yychar]);
                    569: #endif
                    570:                        if(yychar < 0)
                    571:                                yychar = 0;
                    572:                }
                    573:                /* look through exception table */
                    574:                for(yyxi=yyexca; (*yyxi!= (-1)) || (yyxi[1]!=yystate);
                    575:                        yyxi += 2 ) ; /* VOID */
                    576:                while( *(yyxi+=2) >= 0 ){
                    577:                        if( *yyxi == yychar ) break;
                    578:                }
                    579:                if( (yyn = yyxi[1]) < 0 ) return(0);   /* accept */
                    580:        }
                    581:        if( yyn == 0 ){ /* error */
                    582:                /* error ... attempt to resume parsing */
                    583:                switch( yyerrflag ){
                    584:                case 0:   /* brand new error */
                    585: #ifdef YYDEBUG
                    586:                        yyerror("syntax error\n%s", yystates[yystate]);
                    587:                        if(yytoknames[yychar])
                    588:                                yyerror("saw %s\n", yytoknames[yychar]);
                    589:                        else if(yychar >= ' ' && yychar < '\177')
                    590:                                yyerror("saw `%c'\n", yychar);
                    591:                        else if(yychar == 0)
                    592:                                yyerror("saw EOF\n");
                    593:                        else
                    594:                                yyerror("saw char 0%o\n", yychar);
                    595: #else
                    596:                        yyerror( "syntax error" );
                    597: #endif
                    598: yyerrlab:
                    599:                        ++yynerrs;
                    600:                case 1:
                    601:                case 2: /* incompletely recovered error ... try again */
                    602:                        yyerrflag = 3;
                    603:                        /* find a state where "error" is a legal shift action */
                    604:                        while ( yyps >= yys ) {
                    605:                                yyn = yypact[*yyps] + YYERRCODE;
                    606:                                if( yyn>= 0 && yyn < YYLAST && yychk[yyact[yyn]] == YYERRCODE ){
                    607:                                        yystate = yyact[yyn];  /* simulate a shift of "error" */
                    608:                                        goto yystack;
                    609:                                }
                    610:                                yyn = yypact[*yyps];
                    611:                                /* the current yyps has no shift onn "error", pop stack */
                    612: #ifdef YYDEBUG
                    613:                                if( yydebug ) printf( "error recovery pops state %d, uncovers %d\n", *yyps, yyps[-1] );
                    614: #endif
                    615:                                --yyps;
                    616:                                --yypv;
                    617:                        }
                    618:                        /* there is no state on the stack with an error shift ... abort */
                    619: yyabort:
                    620:                        return(1);
                    621:                case 3:  /* no shift yet; clobber input char */
                    622: #ifdef YYDEBUG
                    623:                        if( yydebug ) {
                    624:                                printf("error recovery discards ");
                    625:                                if(yytoknames[yychar])
                    626:                                        printf("%s\n", yytoknames[yychar]);
                    627:                                else if(yychar >= ' ' && yychar < '\177')
                    628:                                        printf("`%c'\n", yychar);
                    629:                                else if(yychar == 0)
                    630:                                        printf("EOF\n");
                    631:                                else
                    632:                                        printf("char 0%o\n", yychar);
                    633:                        }
                    634: #endif
                    635:                        if( yychar == 0 ) goto yyabort; /* don't discard EOF, quit */
                    636:                        yychar = -1;
                    637:                        goto yynewstate;   /* try again in the same state */
                    638:                }
                    639:        }
                    640:        /* reduction by production yyn */
                    641: #ifdef YYDEBUG
                    642:        if(yydebug) {   char *s;
                    643:                printf("reduce %d in:\n\t", yyn);
                    644:                for(s = yystates[yystate]; *s; s++) {
                    645:                        putchar(*s);
                    646:                        if(*s == '\n' && *(s+1))
                    647:                                putchar('\t');
                    648:                }
                    649:        }
                    650: #endif
                    651:        yyps -= yyr2[yyn];
                    652:        yypvt = yypv;
                    653:        yypv -= yyr2[yyn];
                    654:        yyval = yypv[1];
                    655:        yym=yyn;
                    656:        /* consult goto table to find next state */
                    657:        yyn = yyr1[yyn];
                    658:        yyj = yypgo[yyn] + *yyps + 1;
                    659:        if( yyj>=YYLAST || yychk[ yystate = yyact[yyj] ] != -yyn ) yystate = yyact[yypgo[yyn]];
                    660:        switch(yym){
                    661:                
                    662: case 4:
                    663: # line 33 "config.y"
                    664:  { newdev(&cur); } break;
                    665: case 6:
                    666: # line 35 "config.y"
                    667:  { do_trace = ! do_trace; } break;
                    668: case 9:
                    669: # line 42 "config.y"
                    670:  {
                    671:                if (eq(yypvt[-0].cp, "vax")) {
                    672:                        machine = MACHINE_VAX;
                    673:                        machinename = "vax";
                    674:                } else if (eq(yypvt[-0].cp, "sun2")) {
                    675:                        machine = MACHINE_SUN2;
                    676:                        machinename = "sun2";
                    677:                } else if (eq(yypvt[-0].cp, "sun3")) {
                    678:                        machine = MACHINE_SUN3;
                    679:                        machinename = "sun3";
                    680:                } else
                    681:                        yyerror("Unknown machine type");
                    682:              } break;
                    683: case 10:
                    684: # line 55 "config.y"
                    685:  {
                    686:                    struct cputype *cp = (struct cputype *)malloc(sizeof (struct cputype));
                    687:                    cp->cpu_name = ns(yypvt[-0].cp);
                    688:                    cp->cpu_next = cputype;
                    689:                    cputype = cp;
                    690:                    free(temp_id);
                    691:                    } break;
                    692: case 12:
                    693: # line 63 "config.y"
                    694: { ident = ns(yypvt[-0].cp); } break;
                    695: case 13:
                    696: # line 64 "config.y"
                    697:  { mkconf(temp_id, yypvt[-0].cp); free(temp_id); } break;
                    698: case 14:
                    699: # line 65 "config.y"
                    700:  {
                    701:                yyerror("HZ specification obsolete; delete");
                    702:                hz = 60;
                    703:                } break;
                    704: case 15:
                    705: # line 69 "config.y"
                    706:  { timezone = 60 * yypvt[-0].i; check_tz(); } break;
                    707: case 16:
                    708: # line 70 "config.y"
                    709:  { timezone = 60 * yypvt[-1].i; dst = 1; check_tz(); } break;
                    710: case 17:
                    711: # line 71 "config.y"
                    712:  { timezone = yypvt[-0].i; check_tz(); } break;
                    713: case 18:
                    714: # line 72 "config.y"
                    715:  { timezone = yypvt[-1].i; dst = 1; check_tz(); } break;
                    716: case 19:
                    717: # line 73 "config.y"
                    718: 
                    719:            { timezone = -60 * yypvt[-0].i; check_tz(); } break;
                    720: case 20:
                    721: # line 75 "config.y"
                    722: 
                    723:            { timezone = -60 * yypvt[-1].i; dst = 1; check_tz(); } break;
                    724: case 21:
                    725: # line 77 "config.y"
                    726: 
                    727:            { timezone = -yypvt[-0].i; check_tz(); } break;
                    728: case 22:
                    729: # line 79 "config.y"
                    730: 
                    731:            { timezone = -yypvt[-1].i; dst = 1; check_tz(); } break;
                    732: case 23:
                    733: # line 81 "config.y"
                    734: 
                    735:            { mkfile = ns(yypvt[-0].cp); } break;
                    736: case 24:
                    737: # line 83 "config.y"
                    738:  { maxusers = yypvt[-0].i; } break;
                    739: case 27:
                    740: # line 92 "config.y"
                    741:  {
                    742:                    struct opt *op = (struct opt *)malloc(sizeof (struct opt));
                    743:                    op->op_name = ns(yypvt[-0].cp);
                    744:                    op->op_next = opt;
                    745:                    opt = op;
                    746:                    free(temp_id);
                    747:        } break;
                    748: case 28:
                    749: # line 102 "config.y"
                    750:  { yyval.cp = temp_id = ns(yypvt[-0].cp); } break;
                    751: case 29:
                    752: # line 107 "config.y"
                    753:  {
                    754:                if (machine != MACHINE_VAX)
                    755:                        yyerror("wrong machine type for uba");
                    756:                yyval.cp = ns("uba");
                    757:                } break;
                    758: case 30:
                    759: # line 113 "config.y"
                    760:  {
                    761:                if (machine != MACHINE_VAX)
                    762:                        yyerror("wrong machine type for mba");
                    763:                yyval.cp = ns("mba");
                    764:                } break;
                    765: case 31:
                    766: # line 119 "config.y"
                    767:  {
                    768:                if (machine != MACHINE_SUN2 && machine != MACHINE_SUN3)
                    769:                        yyerror("wrong machine type for vme16d16");
                    770:                yyval.cp = ns("vme16d16");
                    771:                } break;
                    772: case 32:
                    773: # line 125 "config.y"
                    774:  {
                    775:                if (machine != MACHINE_SUN2 && machine != MACHINE_SUN3)
                    776:                        yyerror("wrong machine type for vme24d16");
                    777:                yyval.cp = ns("vme24d16");
                    778:                } break;
                    779: case 33:
                    780: # line 131 "config.y"
                    781:  {
                    782:                if (machine != MACHINE_SUN3)
                    783:                        yyerror("wrong machine type for vme32d16");
                    784:                yyval.cp = ns("vme32d16");
                    785:                } break;
                    786: case 34:
                    787: # line 137 "config.y"
                    788:  {
                    789:                if (machine != MACHINE_SUN3)
                    790:                        yyerror("wrong machine type for vme16d32");
                    791:                yyval.cp = ns("vme16d32");
                    792:                } break;
                    793: case 35:
                    794: # line 143 "config.y"
                    795:  {
                    796:                if (machine != MACHINE_SUN3)
                    797:                        yyerror("wrong machine type for vme24d32");
                    798:                yyval.cp = ns("vme24d32");
                    799:                } break;
                    800: case 36:
                    801: # line 149 "config.y"
                    802:  {
                    803:                if (machine != MACHINE_SUN3)
                    804:                        yyerror("wrong machine type for vme32d32");
                    805:                yyval.cp = ns("vme32d32");
                    806:                } break;
                    807: case 37:
                    808: # line 154 "config.y"
                    809:  { yyval.cp = ns(yypvt[-0].cp); } break;
                    810: case 38:
                    811: # line 158 "config.y"
                    812:  {  cur.d_type = DEVICE; } break;
                    813: case 39:
                    814: # line 159 "config.y"
                    815:  {  cur.d_type = MASTER; } break;
                    816: case 40:
                    817: # line 160 "config.y"
                    818: 
                    819:                                {  cur.d_dk = 1; cur.d_type = DEVICE; } break;
                    820: case 41:
                    821: # line 162 "config.y"
                    822:  {  cur.d_type = CONTROLLER; } break;
                    823: case 42:
                    824: # line 163 "config.y"
                    825: 
                    826:                        { cur.d_name = yypvt[-0].cp; cur.d_type = PSEUDO_DEVICE; } break;
                    827: case 43:
                    828: # line 165 "config.y"
                    829: 
                    830:                        { cur.d_name = yypvt[-1].cp; cur.d_type = PSEUDO_DEVICE;
                    831:                          cur.d_count = yypvt[-0].i; } break;
                    832: case 44:
                    833: # line 171 "config.y"
                    834:        {
                    835:                        cur.d_name = yypvt[-1].cp;
                    836:                        if (eq(yypvt[-1].cp, "mba"))
                    837:                            seen_mba = TRUE;
                    838:                        else if (eq(yypvt[-1].cp, "uba"))
                    839:                            seen_uba = TRUE;
                    840:                        cur.d_unit = yypvt[-0].i;
                    841:                } break;
                    842: case 45:
                    843: # line 182 "config.y"
                    844:  { init_dev(&cur); } break;
                    845: case 48:
                    846: # line 191 "config.y"
                    847:  {
                    848:                if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) {
                    849:                        sprintf(errbuf,
                    850:                                "%s must be connected to a nexus", cur.d_name);
                    851:                        yyerror(errbuf);
                    852:                }
                    853:                cur.d_conn = connect(yypvt[-1].cp, yypvt[-0].i);
                    854:        } break;
                    855: case 49:
                    856: # line 199 "config.y"
                    857:  { check_nexus(&cur, yypvt[-0].i); cur.d_conn = TO_NEXUS; } break;
                    858: case 52:
                    859: # line 209 "config.y"
                    860: {
                    861:                cur.d_addr = yypvt[-0].i;
                    862:                if (machine == MACHINE_SUN2 || machine == MACHINE_SUN3)
                    863:                        bus_encode(yypvt[-0].i, &cur);
                    864:                } break;
                    865: case 53:
                    866: # line 214 "config.y"
                    867:  { cur.d_drive = yypvt[-0].i; } break;
                    868: case 54:
                    869: # line 215 "config.y"
                    870: 
                    871:        {
                    872:                if (cur.d_conn != NULL && cur.d_conn != TO_NEXUS
                    873:                    && cur.d_conn->d_type == MASTER)
                    874:                        cur.d_slave = yypvt[-0].i;
                    875:                else
                    876:                        yyerror("can't specify slave--not to master");
                    877:        } break;
                    878: case 55:
                    879: # line 223 "config.y"
                    880:  { cur.d_flags = yypvt[-0].i; } break;
                    881: case 56:
                    882: # line 228 "config.y"
                    883:  { cur.d_pri = 0; } break;
                    884: case 57:
                    885: # line 230 "config.y"
                    886:  { cur.d_pri = yypvt[-0].i; } break;
                    887: case 58:
                    888: # line 232 "config.y"
                    889:  { cur.d_pri = yypvt[-0].i; } break;
                    890: case 59:
                    891: # line 234 "config.y"
                    892:  { cur.d_pri = yypvt[-1].i; } break;
                    893: case 61:
                    894: # line 239 "config.y"
                    895:  { cur.d_vec = yypvt[-0].idlst; } break;
                    896: case 62:
                    897: # line 242 "config.y"
                    898: 
                    899:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
                    900:              a->id = yypvt[-0].cp; a->id_next = 0; a->vec = 0; yyval.idlst = a; } break;
                    901: case 63:
                    902: # line 245 "config.y"
                    903: 
                    904:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
                    905:              a->id = yypvt[-1].cp; a->id_next = 0; a->vec = yypvt[-0].i; yyval.idlst = a; } break;
                    906: case 64:
                    907: # line 248 "config.y"
                    908: 
                    909:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
                    910:              a->id = yypvt[-1].cp; a->id_next = yypvt[-0].idlst; a->vec = 0; yyval.idlst = a; } break;
                    911: case 65:
                    912: # line 252 "config.y"
                    913: { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
                    914:              a->id = yypvt[-2].cp; a->id_next = yypvt[-0].idlst; a->vec = yypvt[-1].i; yyval.idlst = a; } break;
                    915:        }
                    916:        goto yystack;  /* stack new state and value */
                    917: }

unix.superglobalmegacorp.com

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