Annotation of researchv10no/cmd/config/config.y, revision 1.1

1.1     ! root        1: %union {
        !             2:        int i;
        !             3:        char *cp;
        !             4:        struct idlst *idlst;
        !             5: }
        !             6: %token CPU IDENT CONFIG ANY DEVICE UBA MBA NEXUS CSR DRIVE VECTOR OPTIONS
        !             7: %token CONTROLLER PSEUDO_DEVICE FLAGS ID SEMICOLON NUMBER FPNUMBER TRACE
        !             8: %token DISK SLAVE AT HZ TIMEZONE DST MAXUSERS MASTER MAKEFILE COMMA MINUS
        !             9: %type <cp> Save_id ID Dev
        !            10: %type <i> NUMBER FPNUMBER
        !            11: %type <idlst> Id_list
        !            12: %{
        !            13: /*     config.y        1.11    81/05/22        */
        !            14: #include "config.h"
        !            15: #include <stdio.h>
        !            16:        struct device cur;
        !            17:        struct device *curp = NULL;
        !            18:        char *temp_id;
        !            19: %}
        !            20: %%
        !            21: Configuration:
        !            22:        Many_specs
        !            23:        ;
        !            24: 
        !            25: Many_specs:
        !            26:        Many_specs Spec
        !            27:        |
        !            28:        ;
        !            29: 
        !            30: Spec:
        !            31:        Device_spec SEMICOLON  = { newdev(&cur); } |
        !            32:        Config_spec SEMICOLON |
        !            33:        TRACE SEMICOLON = { do_trace = ! do_trace; } |
        !            34:        SEMICOLON |
        !            35:        error SEMICOLON
        !            36:        ;
        !            37: 
        !            38: Config_spec:
        !            39:        CPU Save_id = {
        !            40:                    struct cputype *cp = (struct cputype *)malloc(sizeof (struct cputype));
        !            41:                    cp->cpu_name = ns($2);
        !            42:                    cp->cpu_next = cputype;
        !            43:                    cputype = cp;
        !            44:                    free(temp_id);
        !            45:                    } |
        !            46:        OPTIONS Opt_list |
        !            47:        IDENT ID { ident = ns($2); } |
        !            48:        CONFIG Save_id ID = { mkconf(temp_id, $3); free(temp_id); } |
        !            49:        HZ NUMBER = {
        !            50:                yyerror("HZ specification obsolete; delete");
        !            51:                hz = 60;
        !            52:                } |
        !            53:        TIMEZONE NUMBER = { timezone = 60 * $2; check_tz(); } |
        !            54:        TIMEZONE NUMBER DST = { timezone = 60 * $2; dst = 1; check_tz(); } |
        !            55:        TIMEZONE FPNUMBER = { timezone = $2; check_tz(); } |
        !            56:        TIMEZONE FPNUMBER DST = { timezone = $2; dst = 1; check_tz(); } |
        !            57:        MINUS TIMEZONE NUMBER =
        !            58:            { timezone = -60 * $3; check_tz(); } |
        !            59:        MINUS TIMEZONE NUMBER DST =
        !            60:            { timezone = -60 * $3; dst = 1; check_tz(); } |
        !            61:        MINUS TIMEZONE FPNUMBER =
        !            62:            { timezone = -$3; check_tz(); } |
        !            63:        MINUS TIMEZONE FPNUMBER DST =
        !            64:            { timezone = -$3; dst = 1; check_tz(); } |
        !            65:        MAKEFILE ID =
        !            66:            { mkfile = ns($2); } |
        !            67:        MAXUSERS NUMBER = { maxusers = $2; }
        !            68:        ;
        !            69: 
        !            70: Opt_list:
        !            71:        Opt_list COMMA Option |
        !            72:        Option
        !            73:        ;
        !            74: 
        !            75: Option:
        !            76:        Save_id = {
        !            77:                    struct opt *op = (struct opt *)malloc(sizeof (struct opt));
        !            78:                    op->op_name = ns($1);
        !            79:                    op->op_next = opt;
        !            80:                    opt = op;
        !            81:                    free(temp_id);
        !            82:        }
        !            83:        ;
        !            84: 
        !            85: Save_id:
        !            86:        ID = { $$ = temp_id = ns($1); }
        !            87:        ;
        !            88: 
        !            89: Dev:
        !            90:        UBA  = { $$ = ns("uba"); } |
        !            91:        MBA  = { $$ = ns("mba"); } |
        !            92:        ID = { $$ = ns($1); }
        !            93:        ;
        !            94: 
        !            95: Device_spec:
        !            96:        DEVICE Dev_name Dev_info Int_spec = {  cur.d_type = DEVICE; } |
        !            97:        MASTER Dev_name Dev_info Int_spec = {  cur.d_type = MASTER; } |
        !            98:        DISK Dev_name Dev_info Int_spec =
        !            99:                                {  cur.d_dk = 1; cur.d_type = DEVICE; } |
        !           100:        CONTROLLER Dev_name Dev_info Int_spec = {  cur.d_type = CONTROLLER; } |
        !           101:        PSEUDO_DEVICE Init_dev Dev =
        !           102:                        { cur.d_name = $3; cur.d_type = PSEUDO_DEVICE; } |
        !           103:        PSEUDO_DEVICE Init_dev Dev NUMBER =
        !           104:                        { cur.d_name = $3; cur.d_type = PSEUDO_DEVICE;
        !           105:                          cur.d_count = $4; }
        !           106:        ;
        !           107: 
        !           108: Dev_name:
        !           109:        Init_dev Dev NUMBER =   {
        !           110:                        cur.d_name = $2;
        !           111:                        if (eq($2, "mba"))
        !           112:                            seen_mba = TRUE;
        !           113:                        else if (eq($2, "uba"))
        !           114:                            seen_uba = TRUE;
        !           115:                        cur.d_unit = $3;
        !           116:                }
        !           117:        ;
        !           118: 
        !           119: Init_dev:
        !           120:        = { init_dev(&cur); }
        !           121:        ;
        !           122: 
        !           123: Dev_info:
        !           124:        Con_info Info_list
        !           125:        |
        !           126:        ;
        !           127: 
        !           128: Con_info:
        !           129:        AT Dev NUMBER = {
        !           130:                if (eq(cur.d_name, "mba") || eq(cur.d_name, "uba")) {
        !           131:                        sprintf(errbuf,
        !           132:                                "%s must be connected to a nexus", cur.d_name);
        !           133:                        yyerror(errbuf);
        !           134:                }
        !           135:                cur.d_conn = connect($2, $3);
        !           136:        } |
        !           137:        AT NEXUS NUMBER = { check_nexus(&cur, $3); cur.d_conn = TO_NEXUS; }
        !           138:        ;
        !           139:     
        !           140: Info_list:
        !           141:        Info_list Info
        !           142:        |
        !           143:        ;
        !           144: 
        !           145: Info:
        !           146:        CSR NUMBER = { cur.d_addr = $2; } |
        !           147:        DRIVE NUMBER = { cur.d_drive = $2; } |
        !           148:        SLAVE NUMBER =
        !           149:        {
        !           150:                if (cur.d_conn != NULL && cur.d_conn != TO_NEXUS
        !           151:                    && cur.d_conn->d_type == MASTER)
        !           152:                        cur.d_slave = $2;
        !           153:                else
        !           154:                        yyerror("can't specify slave--not to master");
        !           155:        } |
        !           156:        FLAGS NUMBER = { cur.d_flags = $2; }
        !           157:        ;
        !           158: 
        !           159: Int_spec:
        !           160:        VECTOR Id_list = { cur.d_vec = $2; } | ;
        !           161: 
        !           162: Id_list:
        !           163:        Save_id =
        !           164:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
        !           165:              a->id = $1; a->id_next = 0; $$ = a; } |
        !           166:        Save_id Id_list =
        !           167:            { struct idlst *a = (struct idlst *)malloc(sizeof(struct idlst));
        !           168:              a->id = $1; a->id_next = $2; $$ = a; } ;
        !           169: %%
        !           170: 
        !           171: yyerror(s)
        !           172: char *s;
        !           173: {
        !           174:        fprintf(stderr, "config: %s at line %d\n", s, yyline);
        !           175: }
        !           176: 
        !           177: /*
        !           178:  * ns:
        !           179:  *     Return the passed string in a new space
        !           180:  */
        !           181: 
        !           182: char *
        !           183: ns(str)
        !           184: register char *str;
        !           185: {
        !           186:        register char *cp;
        !           187: 
        !           188:        cp = malloc(strlen(str)+1);
        !           189:        strcpy(cp, str);
        !           190:        return cp;
        !           191: }
        !           192: 
        !           193: /*
        !           194:  * newdev
        !           195:  *     Add a device to the list
        !           196:  */
        !           197: 
        !           198: newdev(dp)
        !           199: register struct device *dp;
        !           200: {
        !           201:        register struct device *np;
        !           202: 
        !           203:        np = (struct device *) malloc(sizeof *np);
        !           204:        *np = *dp;
        !           205:        if (curp == NULL)
        !           206:                dtab = np;
        !           207:        else
        !           208:                curp->d_next = np;
        !           209:        curp = np;
        !           210: }
        !           211: 
        !           212: /*
        !           213:  * mkconf
        !           214:  *     Note that a configuration should be made
        !           215:  */
        !           216: 
        !           217: mkconf(dev, sysname)
        !           218: char *dev, *sysname;
        !           219: {
        !           220:        register struct file_list *fl;
        !           221: 
        !           222:        fl = (struct file_list *) malloc(sizeof *fl);
        !           223:        fl->f_fn = ns(dev);
        !           224:        fl->f_needs = ns(sysname);
        !           225:        if (confp == NULL)
        !           226:            conf_list = fl;
        !           227:        else
        !           228:            confp->f_next = fl;
        !           229:        confp = fl;
        !           230: }
        !           231: 
        !           232: /*
        !           233:  * Connect:
        !           234:  *     Find the pointer to connect to the given device and number.
        !           235:  *     returns NULL if no such device and prints an error message
        !           236:  */
        !           237: 
        !           238: struct device *connect(dev, num)
        !           239: register char *dev;
        !           240: register int num;
        !           241: {
        !           242:        register struct device *dp;
        !           243:        struct device *huhcon();
        !           244: 
        !           245:        if (num == QUES)
        !           246:            return huhcon(dev);
        !           247:        for (dp = dtab; dp != NULL; dp = dp->d_next)
        !           248:                if ((num == dp->d_unit) && eq(dev, dp->d_name))
        !           249:                    if (dp->d_type != CONTROLLER && dp->d_type != MASTER)
        !           250:                    {
        !           251:                        sprintf(errbuf, "%s connected to non-controller", dev);
        !           252:                        yyerror(errbuf);
        !           253:                        return NULL;
        !           254:                    }
        !           255:                    else
        !           256:                        return dp;
        !           257:        sprintf(errbuf, "%s %d not defined", dev, num);
        !           258:        yyerror(errbuf);
        !           259:        return NULL;
        !           260: }
        !           261: 
        !           262: /*
        !           263:  * huhcon
        !           264:  *     Connect to an unspecific thing
        !           265:  */
        !           266: 
        !           267: struct device *huhcon(dev)
        !           268: register char *dev;
        !           269: {
        !           270:     register struct device *dp, *dcp;
        !           271:     struct device rdev;
        !           272:     int oldtype;
        !           273: 
        !           274:     /*
        !           275:      * First make certain that there are some of these to wildcard on
        !           276:      */
        !           277:     for (dp = dtab; dp != NULL; dp = dp->d_next)
        !           278:        if (eq(dp->d_name, dev))
        !           279:            break;
        !           280:     if (dp == NULL)
        !           281:     {
        !           282:        sprintf(errbuf, "no %s's to wildcard", dev);
        !           283:        yyerror(errbuf);
        !           284:        return NULL;
        !           285:     }
        !           286:     oldtype = dp->d_type;
        !           287:     dcp = dp->d_conn;
        !           288:     /*
        !           289:      * Now see if there is already a wildcard entry for this device
        !           290:      * (e.g. Search for a "uba ?")
        !           291:      */
        !           292:     for (; dp != NULL; dp = dp->d_next)
        !           293:        if (eq(dev, dp->d_name) && dp->d_unit == -1)
        !           294:            break;
        !           295:     /*
        !           296:      * If there isn't, make one becuase everything needs to be connected
        !           297:      * to something.
        !           298:      */
        !           299:     if (dp == NULL)
        !           300:     {
        !           301:        dp = &rdev;
        !           302:        init_dev(dp);
        !           303:        dp->d_unit = QUES;
        !           304:        dp->d_name = ns(dev);
        !           305:        dp->d_type = oldtype;
        !           306:        newdev(dp);
        !           307:        dp = curp;
        !           308:        /*
        !           309:         * Connect it to the same thing that other similar things are
        !           310:         * connected to, but make sure it is a wildcard unit
        !           311:         * (e.g. up connected to sc ?, here we make connect sc? to a uba?)
        !           312:         * If other things like this are on the NEXUS or if the aren't
        !           313:         * connected to anything, then make the same connection, else
        !           314:         * call ourself to connect to another unspecific device.
        !           315:         */
        !           316:        if (dcp == TO_NEXUS || dcp == NULL)
        !           317:            dp->d_conn = dcp;
        !           318:        else
        !           319:            dp->d_conn = connect(dcp->d_name, QUES);
        !           320:     }
        !           321:     return dp;
        !           322: }
        !           323: 
        !           324: /*
        !           325:  * init_dev:
        !           326:  *     Set up the fields in the current device to their
        !           327:  *     default values.
        !           328:  */
        !           329: 
        !           330: init_dev(dp)
        !           331: register struct device *dp;
        !           332: {
        !           333:     dp->d_name = "OHNO!!!";
        !           334:     dp->d_type = DEVICE;
        !           335:     dp->d_conn = NULL;
        !           336:     dp->d_vec = NULL;
        !           337:     dp->d_addr = dp->d_flags = dp->d_dk = 0;
        !           338:     dp->d_slave = dp->d_drive = dp->d_unit = UNKNOWN;
        !           339:     dp->d_count = 0;
        !           340: }
        !           341: 
        !           342: /*
        !           343:  * Check_nexus:
        !           344:  *     Make certain that this is a reasonable type of thing to put
        !           345:  *     on the nexus.
        !           346:  */
        !           347: 
        !           348: check_nexus(dev, num)
        !           349: register struct device *dev;
        !           350: int num;
        !           351: {
        !           352:     if (!eq(dev->d_name, "uba") && !eq(dev->d_name, "mba"))
        !           353:        yyerror("only uba's and mba's should be connected to the nexus");
        !           354:     if (num != QUES)
        !           355:        yyerror("can't give specific nexus numbers");
        !           356: }
        !           357: 
        !           358: /*
        !           359:  * Check the timezone to make certain it is sensible
        !           360:  */
        !           361: 
        !           362: check_tz()
        !           363: {
        !           364:        if (timezone > 24 * 60)
        !           365:                yyerror("timezone is unreasonable");
        !           366:        else
        !           367:                hadtz = TRUE;
        !           368: }

unix.superglobalmegacorp.com

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