Annotation of xinu/con/config.c, revision 1.1.1.1

1.1       root        1: From allegra!vivace!dec Mon Apr 25 20:21:44 1983
                      2: Date: Mon Apr 25 20:18:09 1983
                      3: config:                lex.yy.c y.tab.c
                      4:                cc -o config y.tab.c -ll
                      5: 
                      6: all:           config
                      7: 
                      8: lex.yy.c:      config.l
                      9:                lex config.l
                     10: 
                     11: y.tab.c:       config.y
                     12:                yacc config.y
                     13: 
                     14: install:       config
                     15:                mv config ../sys/config
                     16: 
                     17: clean:
                     18:                rm -f lex.yy.c y.tab.c core
                     19: -------------------------------------------------------------------------------
                     20: A              [a-z_A-Z]
                     21: M              [a-z_A-Z0-9]
                     22:        int skipping;
                     23: %%
                     24: "/*"                   {skipping = 1;}
                     25: "*/"                   {skipping = 0;}
                     26: "%"                    {extern int     brkcount;
                     27:                         if (! skipping)
                     28:                                if (++brkcount == 2)
                     29:                                        return(0); /* end-of-file */
                     30:                                else
                     31:                                        return(DEFBRK);
                     32:                        }
                     33: ":"                    {if (! skipping) return(COLON);}
                     34: 0[0-9]*                        {if (! skipping) return(OCTAL);}
                     35: [1-9][0-9]+            {if (! skipping) return(INTEGER);}
                     36: is                     {if (! skipping) return(IS);}
                     37: on                     {if (! skipping) return(ON);}
                     38: "="                    ;
                     39: "iint"                 {if (! skipping) return(IINT);}
                     40: "-iint"                        {if (! skipping) return(IINT);}
                     41: "oint"                 {if (! skipping) return(OINT);}
                     42: "-oint"                        {if (! skipping) return(OINT);}
                     43: "-csr"                 {if (! skipping) return(CSR);}
                     44: "csr"                  {if (! skipping) return(CSR);}
                     45: "-ivec"                        {if (! skipping) return(IVEC);}
                     46: "ivec"                 {if (! skipping) return(IVEC);}
                     47: "-ovec"                        {if (! skipping) return(OVEC);}
                     48: "ovec"                 {if (! skipping) return(OVEC);}
                     49: "-i"                   {if (! skipping) return(INIT);}
                     50: "i"                    {if (! skipping) return(INIT);}
                     51: "-o"                   {if (! skipping) return(OPEN);}
                     52: "o"                    {if (! skipping) return(OPEN);}
                     53: "-c"                   {if (! skipping) return(CLOSE);}
                     54: "c"                    {if (! skipping) return(CLOSE);}
                     55: "-r"                   {if (! skipping) return(READ);}
                     56: "r"                    {if (! skipping) return(READ);}
                     57: "-g"                   {if (! skipping) return(GETC);}
                     58: "g"                    {if (! skipping) return(GETC);}
                     59: "-p"                   {if (! skipping) return(PUTC);}
                     60: "p"                    {if (! skipping) return(PUTC);}
                     61: "-w"                   {if (! skipping) return(WRITE);}
                     62: "w"                    {if (! skipping) return(WRITE);}
                     63: "-s"                   {if (! skipping) return(SEEK);}
                     64: "s"                    {if (! skipping) return(SEEK);}
                     65: "-n"                   {if (! skipping) return(CNTL);}
                     66: "n"                    {if (! skipping) return(CNTL);}
                     67: [ \t]+                 ;
                     68: "\n"                   {extern int linectr;
                     69:                         linectr++;
                     70:                        }
                     71: {A}{M}*                        {if (! skipping) return(IDENT);}
                     72: .                      {if (! skipping) return(yytext[0]);}
                     73: -------------------------------------------------------------------------------
                     74: %token DEFBRK COLON OCTAL INTEGER IDENT CSR IVEC OVEC IINT OINT
                     75:        INIT OPEN CLOSE READ WRITE SEEK CNTL IS ON GETC PUTC
                     76: %{
                     77: #include <stdio.h>
                     78: 
                     79: #define        NIL     (dvptr)0
                     80: 
                     81: #define        CONFIGC         "../sys/conf.c"         /* name of .c output    */
                     82: #define        CONFIGH         "../h/conf.h"           /* name of .h output    */
                     83: #define        CONFIGIN        "Configuration"         /* name of input file   */
                     84: 
                     85: FILE   *confc;
                     86: FILE   *confh;
                     87: 
                     88: char   *dbstr;
                     89: extern char *malloc();
                     90: int    ndevs = 0;
                     91: int    currname = -1;
                     92: int    currtname = -1;
                     93: int    currdname = -1;
                     94: int    brkcount = 0;
                     95: 
                     96: struct syment  {                       /* symbol table                 */
                     97:        char    *symname;
                     98:        int     symoccurs;
                     99:        } symtab[250];
                    100: 
                    101: int    nsym = 0;
                    102: int    lookup();
                    103: int    linectr = 1;
                    104: char   *doing = "device type declaration";
                    105: char   *s;
                    106: struct dvtype {
                    107:        char            *dvname;        /* device name (not used in types)*/
                    108:        char            *dvtname;       /* type name                    */
                    109:        int             dvtnum;         /* symbol table index of type   */
                    110:        char            *dvdevice;      /* device name                  */
                    111:        int             dvcsr;          /* Control Status Register addr */
                    112:        int             dvivec;         /* input interrupt vector       */
                    113:        int             dvovec;         /* Output interrupt vector      */
                    114:        char            dviint[20];     /* input interrupt routine      */
                    115:        char            dvoint[20];     /* output interrupt routine     */
                    116:        char            dvinit[20];     /* init routine name            */
                    117:        char            dvopen[20];     /* open routine name            */
                    118:        char            dvclose[20];    /* close routine name           */
                    119:        char            dvread[20];     /* read routine name            */
                    120:        char            dvwrite[20];    /* write routine name           */
                    121:        char            dvcntl[20];     /* control routine name         */
                    122:        char            dvseek[20];     /* seek routine name            */
                    123:        char            dvgetc[20];     /* getc routine name            */
                    124:        char            dvputc[20];     /* putc routine name            */
                    125:        int             dvminor;        /* device number 0,1,...        */
                    126:        struct dvtype   *dvnext;        /* next node on the list        */
                    127:        };
                    128: typedef        struct  dvtype  *dvptr;
                    129:        dvptr   ftypes = NIL;           /* linked list of device types  */
                    130:        dvptr   devs = NIL;             /* linked list of device decls. */
                    131:        dvptr   lastdv = NIL;
                    132:        dvptr   currtype = NIL;
                    133: 
                    134: char   *ftout[] = 
                    135:               {"struct\tdevsw\t{\t\t\t/* device table entry */\n",
                    136:                "\tint\tdvnum;\n",
                    137:                "\tint\t(*dvinit)();\n",
                    138:                "\tint\t(*dvopen)();\n",
                    139:                "\tint\t(*dvclose)();\n",
                    140:                "\tint\t(*dvread)();\n",
                    141:                "\tint\t(*dvwrite)();\n",
                    142:                "\tint\t(*dvseek)();\n",
                    143:                "\tint\t(*dvgetc)();\n",
                    144:                "\tint\t(*dvputc)();\n",
                    145:                "\tint\t(*dvcntl)();\n",
                    146:                "\tint\tdvcsr;\n",
                    147:                "\tint\tdvivec;\n",
                    148:                "\tint\tdvovec;\n",
                    149:                "\tint\t(*dviint)();\n",
                    150:                "\tint\t(*dvoint)();\n",
                    151:                "\tchar\t*dvioblk;\n",
                    152:                "\tint\tdvminor;\n",
                    153:                "\t};\n\n",
                    154:                "extern\tstruct\tdevsw devtab[];",
                    155:                "\t\t/* one entry per device */\n\n",
                    156:                NULL};
                    157: %}
                    158: %%
                    159: config.input   :       devicetypes devicedescriptors
                    160:                ;
                    161: devicetypes    :       ftypes DEFBRK
                    162:                                        {doing = "device definitions";}
                    163:                ;
                    164: ftypes         :       /**/
                    165:                |       ftypes ftype
                    166:                ;
                    167: ftype          :       tname device.list
                    168:                ;
                    169: device.list    :       devheader attribute.list
                    170:                |       device.list devheader attribute.list
                    171:                ;
                    172: devheader      :       ON id
                    173:                                        {mktype($2);}
                    174:                ;
                    175: tname          :       id COLON
                    176:                                        {$$ = currtname = cktname($1);}
                    177:                ;
                    178: id             :       IDENT
                    179:                                        {$$ = currname =
                    180:                                         lookup(yytext,yyleng);
                    181:                                        }
                    182:                ;
                    183: attribute.list :       /**/
                    184:                |       attribute.list attribute
                    185:                ;
                    186: attribute      :       CSR number
                    187:                                        {newattr(CSR,$2);}
                    188:                |       IVEC number
                    189:                                        {newattr(IVEC,$2);}
                    190:                |       OVEC number
                    191:                                        {newattr(OVEC,$2);}
                    192:                |       IINT id
                    193:                                        {newattr(IINT,$2);}
                    194:                |       OINT id
                    195:                                        {newattr(OINT,$2);}
                    196:                |       OPEN id
                    197:                                        {newattr(OPEN,$2);}
                    198:                |       CLOSE id
                    199:                                        {newattr(CLOSE,$2);}
                    200:                |       INIT id
                    201:                                        {newattr(INIT,$2);}
                    202:                |       GETC id
                    203:                                        {newattr(GETC,$2);}
                    204:                |       PUTC id
                    205:                                        {newattr(PUTC,$2);}
                    206:                |       READ id
                    207:                                        {newattr(READ,$2);}
                    208:                |       WRITE id
                    209:                                        {newattr(WRITE,$2);}
                    210:                |       SEEK id
                    211:                                        {newattr(SEEK,$2);}
                    212:                |       CNTL id
                    213:                                        {newattr(CNTL,$2);}
                    214:                ;
                    215: number         :       INTEGER
                    216:                                        /* Assume all input is octal */
                    217:                                        /* for now; distinction is   */
                    218:                                        /* made in lexical routines  */
                    219:                                        /* just in case of change    */
                    220: 
                    221:                                        {$$ = otoi(yytext,yyleng);}
                    222:                |       OCTAL
                    223:                                        {$$ = otoi(yytext,yyleng);}
                    224:                ;
                    225: devicedescriptors      :       /**/
                    226:                |       devicedescriptors descriptor
                    227:                ;
                    228: descriptor     :       fspec attribute.list
                    229:                ;
                    230: fspec          :       dname IS id optional.on
                    231:                                        {mkdev($1,$3,$4);}
                    232:                ;
                    233: dname          :       id
                    234:                                        {$$ = currdname = ckdname($1);}
                    235:                ;
                    236: optional.on    :       /**/
                    237:                                        {$$ = 0;}
                    238:                |       ON id
                    239:                                        {$$ = $2;}
                    240:                ;
                    241: %%
                    242: #include "lex.yy.c"
                    243: main(argc, argv)
                    244:        int     argc;
                    245:        char    *argv[];
                    246: {
                    247:        int     n, i, j, l, fcount;
                    248:        dvptr   s;
                    249:        int     verbose = 0;
                    250:        char    *p;
                    251:        char    c;
                    252: 
                    253:        if (argc>1 && (strcmp("-v",argv[1])==0)) {
                    254:                argc--;
                    255:                argv++;
                    256:                verbose++;
                    257:        }
                    258:        if (argc>2) {
                    259:                fprintf(stderr,"use: config [-v] [file]\n");
                    260:                exit(1);
                    261:        }
                    262:        if (verbose)
                    263:                printf("Opening input file...\n");
                    264:        if (argc == 2) {
                    265:                if (freopen(argv[1], "r", stdin) == NULL) {
                    266:                        fprintf(stderr,"Can't open %s\n",argv[1]);
                    267:                        exit(1);
                    268:                }
                    269:        } else {        /* try to open Configuration file */
                    270:                if (freopen(CONFIGIN, "r", stdin) == NULL) {
                    271:                        fprintf(stderr,"Can't open %s\n", CONFIGIN);
                    272:                        exit(1);
                    273:                }
                    274:        }
                    275: 
                    276:        /* Parse the Configuration file */
                    277: 
                    278:        if (verbose)
                    279:                printf("Parsing configuration specs...\n");
                    280:        if ((n=yyparse()) != 0)
                    281:                exit(n);
                    282: 
                    283:        /* write config.h and config.c */
                    284: 
                    285:        if (verbose)
                    286:                printf("Opening output files...\n");
                    287:        if ( (confc=fopen(CONFIGC,"w") ) == NULL) {
                    288:                fprintf(stderr, "Can't write on %s\n", CONFIGC);
                    289:                exit(1);
                    290:        }
                    291: 
                    292:        if ( (confh=fopen(CONFIGH,"w") ) == NULL) {
                    293:                fprintf(stderr, "Can't write on %s\n", CONFIGH);
                    294:                exit(1);
                    295:        }
                    296:        fprintf(confh,
                    297:                "/* conf.h (GENERATED FILE; DO NOT EDIT) */\n");
                    298:        fprintf(confc,
                    299:                "/* conf.c (GENERATED FILE; DO NOT EDIT) */\n");
                    300:        fprintf(confc, "\n#include \"%s\"\n", CONFIGH);
                    301:        fprintf(confh, "\n#define\tNULLPTR\t(char *)0\n");
                    302: 
                    303: 
                    304:        if (verbose)
                    305:                printf("Writing output...\n");
                    306:        fprintf(confh,"\n/* Device table declarations */\n");
                    307:        for (i=0 ; (p=ftout[i])!=NULL ; i++)
                    308:                fprintf(confh, "%s", p);
                    309: 
                    310:        /* write device declarations and definitions; count type refs. */
                    311: 
                    312:        fprintf(confh, "\n/* Device name definitions */\n\n");
                    313:        for (i=0,s=devs; s!=NIL ; s=s->dvnext,i++) {
                    314:                fprintf(confh, "#define\t%-12s%d\t\t\t/* type %-8s */\n",
                    315:                        s->dvname, i, s->dvtname);
                    316:                s->dvminor = symtab[s->dvtnum].symoccurs++;
                    317:        }
                    318: 
                    319:        /* write count of device types */
                    320: 
                    321:        fprintf(confh,"\n/* Control block sizes */\n\n");
                    322:        for (i=0 ; i<nsym ; i++)
                    323:                if (symtab[i].symoccurs > 0) {
                    324:                        fprintf(confh, "#define\tN%s\t%d\n",
                    325:                                symtab[i].symname, symtab[i].symoccurs);
                    326:                }
                    327:        if (ndevs > 0)
                    328:                fprintf(confh, "\n#define\tNDEVS\t%d\n\n", ndevs);
                    329: 
                    330:        /* empty symbol table, collect, and write names of all I/O routines */
                    331: 
                    332:        nsym = 0;
                    333:        for (s=devs; s!=NIL ; s=s->dvnext) {
                    334:                lookup(s->dvinit,strlen(s->dvinit));
                    335:                lookup(s->dvopen,strlen(s->dvopen));
                    336:                lookup(s->dvclose,strlen(s->dvclose));
                    337:                lookup(s->dvread,strlen(s->dvread));
                    338:                lookup(s->dvwrite,strlen(s->dvwrite));
                    339:                lookup(s->dvseek,strlen(s->dvseek));
                    340:                lookup(s->dvcntl,strlen(s->dvcntl));
                    341:                lookup(s->dvgetc,strlen(s->dvgetc));
                    342:                lookup(s->dvputc,strlen(s->dvputc));
                    343:                lookup(s->dviint,strlen(s->dviint));
                    344:                lookup(s->dvoint,strlen(s->dvoint));
                    345:                
                    346:        }
                    347:        fprintf(confh,
                    348:                "/* Declarations of I/O routines referenced */\n\n");
                    349:        for (i=0 ; i<nsym ; i++)
                    350:                fprintf(confh, "extern\tint\t%s();\n", symtab[i].symname);
                    351: 
                    352: 
                    353:        /* produce devtab (giant I/O switch table) */
                    354: 
                    355:        fprintf(confc, "\n/* device independent I/O switch */\n\n");
                    356:        if (ndevs > 0)
                    357:                fprintf(confc, "struct\tdevsw\tdevtab[NDEVS] = {\n");
                    358:        for (fcount=0,s=devs ; s!=NIL ; s=s->dvnext,fcount++) {
                    359:                fprintf(confc, "\n/*  %s */\n", s->dvname, s->dvtname);
                    360:                fprintf(confc, "%d,\n", fcount);
                    361:                fprintf(confc, "%s, %s, %s,\n",
                    362:                        s->dvinit, s->dvopen, s->dvclose);
                    363:                fprintf(confc, "%s, %s, %s,\n",
                    364:                        s->dvread, s->dvwrite, s->dvseek);
                    365:                fprintf(confc, "%s, %s, %s,\n",
                    366:                        s->dvgetc, s->dvputc, s->dvcntl);
                    367:                fprintf(confc, "0%06o, 0%03o, 0%03o,\n",
                    368:                        s->dvcsr, s->dvivec, s->dvovec);
                    369:                fprintf(confc, "%s, %s, NULLPTR, %d",
                    370:                        s->dviint, s->dvoint, s->dvminor);
                    371:                if ( s->dvnext != NIL )
                    372:                        fprintf(confc, ",\n");
                    373:                else
                    374:                        fprintf(confc, "\n\t};");
                    375:        }
                    376: 
                    377:        /* Copy definitions to output */
                    378: 
                    379:        if (brkcount == 2 && verbose)
                    380:                printf("Copying definitions to %s...\n", CONFIGH);
                    381:        if (brkcount == 2 )
                    382:                while ( (c=input()) != 0)       /* lex input routine */
                    383:                        putc(c, confh);
                    384: 
                    385:        /* guarantee conf.c written later than conf.c for make */
                    386: 
                    387:        fclose(confh);
                    388:        fprintf(confc, "\n");
                    389:        fclose(confc);
                    390: 
                    391:        /* finish up and write report for user if requested */
                    392: 
                    393:        if (verbose) {
                    394:            printf("\nConfiguration complete. Number of devs=%d:\n\n",ndevs);
                    395:            for (s=devs; s!=NIL ; s=s->dvnext)
                    396:              printf(
                    397:                "Device %s (on %s) csr=0%-7o, ivec=0%-3o, ovec=0%-3o, minor=%d\n",
                    398:                s->dvname, s->dvdevice, s->dvcsr, s->dvivec, s->dvovec,
                    399:                s->dvminor);
                    400:        }
                    401:        
                    402: 
                    403: }
                    404: 
                    405: 
                    406: yyerror(s)
                    407:        char *s;
                    408: {
                    409:        fprintf(stderr,"Syntax error in %s on line %d\n",
                    410:                doing,linectr);
                    411: }
                    412: 
                    413: 
                    414: /*  lookup  --  lookup a name in the symbol table; return position */
                    415: 
                    416: lookup(str,len)
                    417:        char    *str;
                    418:        int     len;
                    419: {
                    420:        int     i;
                    421:        char    *s;
                    422: 
                    423:        if (len >= 20) {
                    424:                len = 19;
                    425:                fprintf(stderr,"warning: name %s truncated\n",str);
                    426:                }
                    427:        s = malloc(len+1);
                    428:        strncpy(s,str,len);
                    429:        s[len] = '\000';
                    430:        for (i=0 ; i<nsym ; i++)
                    431:                if (strcmp(s,symtab[i].symname) == 0){
                    432:                        return(i);
                    433:                }
                    434:        symtab[nsym].symname = s;
                    435:        symtab[nsym].symoccurs = 0;
                    436:        return(nsym++);
                    437: }
                    438: 
                    439: atoi(str,len)
                    440:        char *str;
                    441:        int len;
                    442: {
                    443:        int i;
                    444:        char c;
                    445: 
                    446:        for (i=0; len > 0 ; len--) {
                    447:                c = *str++;
                    448:                i = 10*i + (c - '0');
                    449:                }
                    450: }
                    451: otoi(str,len)
                    452:        char *str;
                    453:        int len;
                    454: {
                    455:        int i;
                    456:        char c;
                    457: 
                    458:        for (i=0; len > 0 ; len--) {
                    459:                c = *str++;
                    460:                if (c > '7')
                    461:                        fprintf(stderr,"invalid octal digit on line %d\n",
                    462:                                linectr);
                    463:                else
                    464:                        i = 8*i + (c - '0');
                    465:                }
                    466: }
                    467: 
                    468: /* newattr -- add a new attribute spec to current type/device description      */
                    469: 
                    470: newattr(tok,val)
                    471:        int     tok;                    /* token type (attribute type)  */
                    472:        int     val;                    /* symbol number of value       */
                    473: {
                    474:        char    *c;
                    475:        dvptr   s;
                    476: 
                    477:        if (devs == NIL)                /* doing types                  */
                    478:                s = currtype;
                    479:        else
                    480:                s = lastdv;
                    481:        if (val>=0 && val<nsym) {
                    482:                c = symtab[val].symname;
                    483:                if (strlen(c) > 20 ) {
                    484:                        fprintf(stderr,"Internal overflow\n");
                    485:                        exit(1);
                    486:                }
                    487:        } else
                    488:                c = NULL;
                    489: 
                    490:        switch (tok) {
                    491: 
                    492:        case CSR:       s->dvcsr = val;
                    493:                        break;
                    494:        case IVEC:      s->dvivec = val;
                    495:                        break;
                    496:        case OVEC:      s->dvovec = val;
                    497:                        break;
                    498:        case IINT:      strcpy(s->dviint,c);
                    499:                        break;
                    500:        case OINT:      strcpy(s->dvoint,c);
                    501:                        break;
                    502:        case READ:      strcpy(s->dvread,c);
                    503:                        break;
                    504:        case WRITE:     strcpy(s->dvwrite,c);
                    505:                        break;
                    506:        case GETC:      strcpy(s->dvgetc,c);
                    507:                        break;
                    508:        case PUTC:      strcpy(s->dvputc,c);
                    509:                        break;
                    510:        case OPEN:      strcpy(s->dvopen,c);
                    511:                        break;
                    512:        case CLOSE:     strcpy(s->dvclose,c);
                    513:                        break;
                    514:        case INIT:      strcpy(s->dvinit,c);
                    515:                        break;
                    516:        case SEEK:      strcpy(s->dvseek,c);
                    517:                        break;
                    518:        case CNTL:      strcpy(s->dvcntl,c);
                    519:                        break;
                    520:        default:        fprintf(stderr, "Internal error 1\n");
                    521:        }
                    522: }
                    523: 
                    524: /* cktname  --  check type name for duplicates */
                    525: 
                    526: cktname(symid)
                    527:        int symid;
                    528: {
                    529:        dvptr   s;
                    530: extern dvptr   ftypes;
                    531:        char    *name;
                    532: 
                    533:        name = symtab[symid].symname;
                    534:        for (s=ftypes; s!=NIL ; s=s->dvnext) {
                    535:                if (s->dvtname == name) {
                    536:                        fprintf(stderr,"Duplicate type name %s on line %d\n",
                    537:                                name,linectr);
                    538:                        exit(1);
                    539:                        }
                    540:                }
                    541:        return(symid);
                    542: }
                    543: 
                    544: /* mktype  --  make a node in the type list and initialize to defaults */
                    545: 
                    546: mktype(deviceid)
                    547:        int deviceid;
                    548: {
                    549:        dvptr   s,p;
                    550:        char    *tn,*dn;
                    551: 
                    552:        p = NIL;
                    553:        tn = symtab[currtname].symname;
                    554:        dn = symtab[deviceid].symname;
                    555:        for (s = ftypes; s!=NIL ; s=s->dvnext) {
                    556:                if (s->dvtname == tn && s->dvdevice==dn) {
                    557:                   fprintf(stderr,
                    558:                     "Duplicate device %s for type %s on line %d\n",
                    559:                     dn, tn, linectr);
                    560:                   exit(1);
                    561:                }
                    562:                p = s;
                    563:        }
                    564:        currtype = s = (dvptr) malloc( sizeof(struct dvtype));
                    565:        if (ftypes != NIL) {
                    566:                p->dvnext = s;
                    567:        }
                    568:        else {
                    569:                ftypes = s;
                    570:        }
                    571:        initattr(s, currtname, deviceid);
                    572: }
                    573: 
                    574: /* initialize attributes in a type declaration node to typename...     */
                    575: 
                    576: initattr(fstr, tnum, deviceid)
                    577:        dvptr   fstr;
                    578:        int     tnum;
                    579:        int     deviceid;
                    580: {
                    581:        char    *typnam;
                    582: 
                    583:        typnam = symtab[tnum].symname;
                    584:        fstr->dvname = NULL;
                    585:        fstr->dvtname = typnam;
                    586:        fstr->dvtnum = tnum;
                    587:        fstr->dvdevice = symtab[deviceid].symname;
                    588:        fstr->dvcsr = 0;
                    589:        fstr->dvivec = 0;
                    590:        fstr->dvovec = 0;
                    591:        strcpy(fstr->dviint,typnam);
                    592:        strcat(fstr->dviint,"iin");
                    593:        strcpy(fstr->dvoint,typnam);
                    594:        strcat(fstr->dvoint,"oin");
                    595:        strcpy(fstr->dvinit,typnam);
                    596:        strcat(fstr->dvinit,"init");
                    597:        strcpy(fstr->dvopen,typnam);
                    598:        strcat(fstr->dvopen,"open");
                    599:        strcpy(fstr->dvclose,typnam);
                    600:        strcat(fstr->dvclose,"close");
                    601:        strcpy(fstr->dvread,typnam);
                    602:        strcat(fstr->dvread,"read");
                    603:        strcpy(fstr->dvwrite,typnam);
                    604:        strcat(fstr->dvwrite,"write");
                    605:        strcpy(fstr->dvcntl,typnam);
                    606:        strcat(fstr->dvcntl,"control");
                    607:        strcpy(fstr->dvseek,typnam);
                    608:        strcat(fstr->dvseek,"seek");
                    609:        strcpy(fstr->dvgetc,typnam);
                    610:        strcat(fstr->dvgetc,"getc");
                    611:        strcpy(fstr->dvputc,typnam);
                    612:        strcat(fstr->dvputc,"putc");
                    613:        fstr->dvminor = 0;
                    614: }
                    615: 
                    616: /* mkdev  --  make a node on the device list */
                    617: 
                    618: mkdev(nameid, typid, deviceid)
                    619:        int     nameid, typid, deviceid;
                    620: {
                    621:        dvptr   s;
                    622:        char    *devn,*tn,*dn;
                    623:        int     found;
                    624: 
                    625:        s = (dvptr) malloc(sizeof(struct dvtype));
                    626:        s->dvnext = NIL;
                    627:        if (devs == NIL) {
                    628:                devs = s;
                    629:                lastdv = s;
                    630:        } else {
                    631:                lastdv->dvnext = s;
                    632:                lastdv = s;
                    633:        }
                    634:        ndevs++;
                    635:        tn = symtab[typid].symname;
                    636:        devn = symtab[nameid].symname;
                    637:        if (deviceid >= 0)
                    638:                dn = symtab[deviceid].symname;
                    639:        else
                    640:                dn = NULL;
                    641:        found = 0;
                    642:        for (s=ftypes ; s != NULL ; s=s->dvnext)
                    643:                if (s->dvtname == tn && (dn==NULL || s->dvdevice==dn)) {
                    644:                        strdup(lastdv,s,sizeof(struct dvtype));
                    645:                        found=1;
                    646:                        break;
                    647:                }
                    648:        if (found==0) {
                    649:                fprintf(stderr,
                    650:                  "Bad type or device name in declaration of %s on line %d\n",
                    651:                  devn, linectr);
                    652:                exit(1);
                    653:        }
                    654:        lastdv->dvnext = NIL;
                    655:        lastdv->dvname = devn;
                    656: }
                    657: 
                    658: 
                    659: /* chdname  -- check for duplicate device name */
                    660: 
                    661: ckdname(devid)
                    662:        int devid;
                    663: {
                    664:        dvptr   s;
                    665: extern dvptr   devs;
                    666:        char    *name;
                    667: 
                    668:        name = symtab[devid].symname;
                    669:        for (s=devs; s!=NIL ; s=s->dvnext) {
                    670:                if (s->dvname == name) {
                    671:                        fprintf(stderr,"Duplicate device name %s on line %d\n",
                    672:                                name,linectr);
                    673:                        exit(1);
                    674:                        }
                    675:                }
                    676:        return(devid);
                    677: }
                    678: 
                    679: strdup(tostr,fromstr,len)
                    680:        char    *tostr, *fromstr;
                    681:        int     len;
                    682: {
                    683:        for( ; len > 0 ; len--)
                    684:                *tostr++ = *fromstr++;
                    685: }
                    686: -------------------------------------------------------------------------------
                    687: 
                    688: 
                    689: 

unix.superglobalmegacorp.com

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