Annotation of researchv10no/cmd/PDP11/11c/c02.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * C compiler
                      3:  */
                      4: 
                      5: #include "c0.h"
                      6: 
                      7: /*
                      8:  * Process a single external definition
                      9:  */
                     10: extdef()
                     11: {
                     12:        register o;
                     13:        int sclass, scflag;
                     14:        struct nmlist typer;
                     15:        register struct nmlist *ds;
                     16: 
                     17:        if(((o=symbol())==EOFC) || o==SEMI)
                     18:                return;
                     19:        peeksym = o;
                     20:        sclass = 0;
                     21:        blklev = 0;
                     22:        if (getkeywords(&sclass, &typer)==0) {
                     23:                sclass = EXTERN;
                     24:                if (peeksym!=NAME)
                     25:                        goto syntax;
                     26:        }
                     27:        scflag = 0;
                     28:        if (sclass==DEFXTRN) {
                     29:                scflag++;
                     30:                sclass = EXTERN;
                     31:        }
                     32:        if (sclass!=EXTERN && sclass!=STATIC && sclass!=TYPEDEF)
                     33:                error("Illegal storage class");
                     34:        do {
                     35:                defsym = 0;
                     36:                paraml = NULL;
                     37:                parame = NULL;
                     38:                if (sclass==TYPEDEF) {
                     39:                        decl1(TYPEDEF, &typer, 0, (struct nmlist *)NULL);
                     40:                        continue;
                     41:                }
                     42:                decl1(EXTERN, &typer, 0, (struct nmlist *)NULL);
                     43:                if ((ds=defsym)==0)
                     44:                        return;
                     45:                funcsym = ds;
                     46:                if ((ds->htype&XTYPE)==FUNC) {
                     47:                        if ((peeksym=symbol())==LBRACE || peeksym==KEYW
                     48:                         || (peeksym==NAME && csym->hclass==TYPEDEF)) {
                     49:                                funcblk.type = decref(ds->htype);
                     50:                                funcblk.strp = ds->hstrp;
                     51:                                setinit(ds);
                     52:                                outcode("BS", SYMDEF, sclass==EXTERN?ds->name:"");
                     53:                                cfunc();
                     54:                                return;
                     55:                        }
                     56:                        if (paraml)
                     57:                                error("Inappropriate parameters");
                     58:                } else if ((o=symbol())==COMMA || o==SEMI) {
                     59:                        peeksym = o;
                     60:                        o = (length((union tree *)ds)+ALIGN) & ~ALIGN;
                     61:                        if (sclass==STATIC) {
                     62:                                setinit(ds);
                     63:                                outcode("BSBBSBN", SYMDEF, "", BSS, NLABEL, ds->name, SSPACE, o);
                     64:                        } else if (scflag)
                     65:                                outcode("BSN", CSPACE, ds->name, o);
                     66:                } else {
                     67:                        if (o!=ASSIGN) {
                     68:                                error("Declaration syntax");
                     69:                                peeksym = o;
                     70:                        }
                     71:                        setinit(ds);
                     72:                        if (sclass==EXTERN)
                     73:                                outcode("BS", SYMDEF, ds->name);
                     74:                        outcode("BBS", DATA, NLABEL, ds->name);
                     75:                        if (cinit(ds, 1, sclass) & ALIGN)
                     76:                                outcode("B", EVEN);
                     77:                }
                     78:        } while ((o=symbol())==COMMA);
                     79:        if (o==SEMI)
                     80:                return;
                     81: syntax:
                     82:        if (o==RBRACE) {
                     83:                error("Too many }'s");
                     84:                peeksym = 0;
                     85:                return;
                     86:        }
                     87:        error("External definition syntax");
                     88:        errflush(o);
                     89:        statement();
                     90: }
                     91: 
                     92: /*
                     93:  * Process a function definition.
                     94:  */
                     95: cfunc()
                     96: {
                     97:        register char *cb;
                     98:        register sloc;
                     99: 
                    100:        sloc = isn;
                    101:        isn += 2;
                    102:        outcode("BBS", PROG, RLABEL, funcsym->name);
                    103:        if (proflg)
                    104:                outcode("BN", PROFIL, isn++);
                    105:        regvar = 5;
                    106:        autolen = STAUTO;
                    107:        maxauto = STAUTO;
                    108:        blklev = 1;
                    109:        cb = locbase;
                    110:        declist(ARG);
                    111:        outcode("B", SAVE);
                    112:        funchead();
                    113:        branch(sloc);
                    114:        label(sloc+1);
                    115:        retlab = isn++;
                    116:        blklev = 0;
                    117:        if ((peeksym = symbol()) != LBRACE)
                    118:                error("Compound statement required");
                    119:        statement();
                    120:        outcode("BNB", LABEL, retlab, RETRN);
                    121:        label(sloc);
                    122:        outcode("BN", SETSTK, -maxauto);
                    123:        branch(sloc+1);
                    124:        locbase = cb;
                    125: }
                    126: 
                    127: /*
                    128:  * Process the initializers for an external definition.
                    129:  */
                    130: cinit(anp, flex, sclass)
                    131: struct nmlist *anp;
                    132: {
                    133:        struct nmlist np;
                    134:        register nel, ninit;
                    135:        int width, isarray, o, brace, realtype;
                    136:        union tree *s;
                    137: 
                    138:        np = *anp;
                    139:        realtype = np.htype;
                    140:        isarray = 0;
                    141:        if ((realtype&XTYPE) == ARRAY)
                    142:                isarray++;
                    143:        else
                    144:                flex = 0;
                    145:        width = length((union tree *)&np);
                    146:        nel = 1;
                    147:        /*
                    148:         * If it's an array, find the number of elements.
                    149:         * temporarily modify to look like kind of thing it's
                    150:         * an array of.
                    151:         */
                    152:        if (sclass==AUTO)
                    153:                if (isarray || realtype==STRUCT)
                    154:                        error("No auto. aggregate initialization");
                    155:        if (isarray) {
                    156:                np.htype = decref(realtype);
                    157:                np.hsubsp++;
                    158:                if (width==0 && flex==0)
                    159:                        error("0-length row: %.8s", anp->name);
                    160:                o = length((union tree *)&np);
                    161:                nel = (unsigned)width/o;
                    162:                width = o;
                    163:        }
                    164:        brace = 0;
                    165:        if ((peeksym=symbol())==LBRACE && (isarray || np.htype!=STRUCT)) {
                    166:                peeksym = -1;
                    167:                brace++;
                    168:        }
                    169:        ninit = 0;
                    170:        do {
                    171:                if ((o=symbol())==RBRACE)
                    172:                        break;
                    173:                peeksym = o;
                    174:                if (o==STRING && (realtype==ARRAY+CHAR || realtype==ARRAY+UNCHAR)) {
                    175:                        if (sclass==AUTO)
                    176:                                error("No strings in automatic");
                    177:                        peeksym = -1;
                    178:                        putstr(0, flex?10000:nel);
                    179:                        ninit += nchstr;
                    180:                        o = symbol();
                    181:                        break;
                    182:                } else if (np.htype==STRUCT) {
                    183:                        strinit(&np, sclass);
                    184:                } else if ((np.htype&ARRAY)==ARRAY || peeksym==LBRACE)
                    185:                        cinit(&np, 0, sclass);
                    186:                else {
                    187:                        char *st;
                    188:                        initflg++;
                    189:                        st = starttree();
                    190:                        s = tree(0);
                    191:                        initflg = 0;
                    192:                        if (np.hflag&FFIELD)
                    193:                                error("No field initialization");
                    194:                        *cp++ = nblock(&np);
                    195:                        *cp++ = s;
                    196:                        build(ASSIGN);
                    197:                        if (sclass==AUTO||sclass==REG)
                    198:                                rcexpr(*--cp);
                    199:                        else if (sclass==ENUMCON) {
                    200:                                if (s->t.op!=CON)
                    201:                                        error("Illegal enum constant for %.8s", anp->name);
                    202:                                anp->hoffset = s->c.value;
                    203:                        } else
                    204:                                rcexpr(block(INIT,np.htype,(int *)NULL,
                    205:                                  (union str *)NULL, (*--cp)->t.tr2, TNULL));
                    206:                        endtree(st);
                    207:                }
                    208:                ninit++;
                    209:                if ((ninit&077)==0 && sclass==EXTERN)
                    210:                        outcode("BS", SYMDEF, "");
                    211:        } while ((o=symbol())==COMMA && (ninit<nel || brace || flex));
                    212:        if (brace==0 || o!=RBRACE)
                    213:                peeksym = o;
                    214:        /*
                    215:         * If there are too few initializers, allocate
                    216:         * more storage.
                    217:         * If there are too many initializers, extend
                    218:         * the declared size for benefit of "sizeof"
                    219:         */
                    220:        if (ninit<nel && sclass!=AUTO)
                    221:                outcode("BN", SSPACE, (nel-ninit)*width);
                    222:        else if (ninit>nel) {
                    223:                if (flex && nel==0) {
                    224:                        np.hsubsp[-1] = ninit;
                    225:                } else
                    226:                        error("Too many initializers: %.8s", anp->name);
                    227:                nel = ninit;
                    228:        }
                    229:        return(nel*width);
                    230: }
                    231: 
                    232: /*
                    233:  * Initialize a structure
                    234:  */
                    235: strinit(np, sclass)
                    236: struct nmlist *np;
                    237: {
                    238:        static struct nmlist junk;
                    239:        register struct nmlist **mlp;
                    240:        static struct nmlist *zerloc = NULL;
                    241:        register int o, brace;
                    242: 
                    243:        if ((mlp = np->hstrp->S.memlist)==NULL) {
                    244:                mlp = &zerloc;
                    245:                error("Undefined structure initialization");
                    246:        }
                    247:        brace = 0;
                    248:        if ((o = symbol()) == LBRACE)
                    249:                brace++;
                    250:        else
                    251:                peeksym = o;
                    252:        do {
                    253:                if ((o=symbol()) == RBRACE)
                    254:                        break;
                    255:                peeksym = o;
                    256:                if (*mlp==0) {
                    257:                        error("Too many structure initializers");
                    258:                        cinit(&junk, 0, sclass);
                    259:                } else
                    260:                        cinit(*mlp++, 0, sclass);
                    261:                if (*mlp ==  &structhole) {
                    262:                        outcode("B", EVEN);
                    263:                        mlp++;
                    264:                }
                    265:        } while ((o=symbol())==COMMA && (*mlp || brace));
                    266:        if (sclass!=AUTO && sclass!=REG) {
                    267:                if (*mlp)
                    268:                        outcode("BN", SSPACE, np->hstrp->S.ssize - (*mlp)->hoffset);
                    269:                outcode("B", EVEN);
                    270:        }
                    271:        if (o!=RBRACE || brace==0)
                    272:                peeksym = o;
                    273: }
                    274: 
                    275: /*
                    276:  * Mark already initialized
                    277:  */
                    278: setinit(np)
                    279: register struct nmlist *np;
                    280: {
                    281: 
                    282:        if (np->hflag&FINIT)
                    283:                error("%s multiply defined", np->name);
                    284:        np->hflag |= FINIT;
                    285: }
                    286: 
                    287: /*
                    288:  * Process one statement in a function.
                    289:  */
                    290: statement()
                    291: {
                    292:        register o, o1;
                    293:        int sauto, sreg;
                    294: 
                    295: stmt:
                    296:        switch(o=symbol()) {
                    297: 
                    298:        case EOFC:
                    299:                error("Unexpected EOF");
                    300:        case SEMI:
                    301:                return;
                    302: 
                    303:        case LBRACE:
                    304:                sauto = autolen;
                    305:                sreg = regvar;
                    306:                blockhead();
                    307:                while (!eof) {
                    308:                        if ((o=symbol())==RBRACE) {
                    309:                                autolen = sauto;
                    310:                                if (sreg!=regvar)
                    311:                                        outcode("BN", SETREG, sreg);
                    312:                                regvar = sreg;
                    313:                                blkend();
                    314:                                return;
                    315:                        }
                    316:                        peeksym = o;
                    317:                        statement();
                    318:                }
                    319:                error("Missing '}'");
                    320:                return;
                    321: 
                    322:        case KEYW:
                    323:                switch(cval) {
                    324: 
                    325:                case GOTO:
                    326:                        if (o1 = simplegoto())
                    327:                                branch(o1);
                    328:                        else 
                    329:                                dogoto();
                    330:                        goto semi;
                    331: 
                    332:                case RETURN:
                    333:                        doret();
                    334:                        goto semi;
                    335: 
                    336:                case IF: {
                    337:                        register o2;
                    338:                        register union tree *np;
                    339: 
                    340:                        np = pexpr(1);
                    341:                        o2 = 0;
                    342:                        if ((o1=symbol())==KEYW) switch (cval) {
                    343:                        case GOTO:
                    344:                                if (o2=simplegoto())
                    345:                                        goto simpif;
                    346:                                cbranch(np, o2=isn++, 0);
                    347:                                dogoto();
                    348:                                label(o2);
                    349:                                goto hardif;
                    350: 
                    351:                        case RETURN:
                    352:                                if (nextchar()==';') {
                    353:                                        o2 = retlab;
                    354:                                        goto simpif;
                    355:                                }
                    356:                                cbranch(np, o1=isn++, 0);
                    357:                                doret();
                    358:                                label(o1);
                    359:                                o2++;
                    360:                                goto hardif;
                    361: 
                    362:                        case BREAK:
                    363:                                o2 = brklab;
                    364:                                goto simpif;
                    365: 
                    366:                        case CONTIN:
                    367:                                o2 = contlab;
                    368:                        simpif:
                    369:                                chconbrk(o2);
                    370:                                cbranch(np, o2, 1);
                    371:                        hardif:
                    372:                                if ((o=symbol())!=SEMI)
                    373:                                        goto syntax;
                    374:                                if ((o1=symbol())==KEYW && cval==ELSE) 
                    375:                                        goto stmt;
                    376:                                peeksym = o1;
                    377:                                return;
                    378:                        }
                    379:                        peeksym = o1;
                    380:                        cbranch(np, o1=isn++, 0);
                    381:                        statement();
                    382:                        if ((o=symbol())==KEYW && cval==ELSE) {
                    383:                                o2 = isn++;
                    384:                                branch(o2);
                    385:                                label(o1);
                    386:                                statement();
                    387:                                label(o2);
                    388:                                return;
                    389:                        }
                    390:                        peeksym = o;
                    391:                        label(o1);
                    392:                        return;
                    393:                }
                    394: 
                    395:                case WHILE: {
                    396:                        register o2;
                    397:                        o1 = contlab;
                    398:                        o2 = brklab;
                    399:                        label(contlab = isn++);
                    400:                        cbranch(pexpr(1), brklab=isn++, 0);
                    401:                        statement();
                    402:                        branch(contlab);
                    403:                        label(brklab);
                    404:                        contlab = o1;
                    405:                        brklab = o2;
                    406:                        return;
                    407:                }
                    408: 
                    409:                case BREAK:
                    410:                        chconbrk(brklab);
                    411:                        branch(brklab);
                    412:                        goto semi;
                    413: 
                    414:                case CONTIN:
                    415:                        chconbrk(contlab);
                    416:                        branch(contlab);
                    417:                        goto semi;
                    418: 
                    419:                case DO: {
                    420:                        register int o2, o3;
                    421:                        o1 = contlab;
                    422:                        o2 = brklab;
                    423:                        contlab = isn++;
                    424:                        brklab = isn++;
                    425:                        label(o3 = isn++);
                    426:                        statement();
                    427:                        label(contlab);
                    428:                        contlab = o1;
                    429:                        if ((o=symbol())==KEYW && cval==WHILE) {
                    430:                                cbranch(tree(1), o3, 1);
                    431:                                label(brklab);
                    432:                                brklab = o2;
                    433:                                goto semi;
                    434:                        }
                    435:                        goto syntax;
                    436:                }
                    437: 
                    438:                case CASE:
                    439:                        o1 = conexp();
                    440:                        if ((o=symbol())!=COLON)
                    441:                                goto syntax;
                    442:                        if (swp==0) {
                    443:                                error("Case not in switch");
                    444:                                goto stmt;
                    445:                        }
                    446:                        if(swp>=swtab+SWSIZ) {
                    447:                                error("Switch table overflow");
                    448:                        } else {
                    449:                                swp->swlab = isn;
                    450:                                (swp++)->swval = o1;
                    451:                                label(isn++);
                    452:                        }
                    453:                        goto stmt;
                    454: 
                    455:                case SWITCH: {
                    456:                        register union tree *np;
                    457:                        register char *st;
                    458: 
                    459:                        o1 = brklab;
                    460:                        brklab = isn++;
                    461:                        st = starttree();
                    462:                        np = pexpr(0);
                    463:                        chkw(np, -1);
                    464:                        rcexpr(block(RFORCE,0,(int *)NULL,(union str *)NULL,np,TNULL));
                    465:                        endtree(st);
                    466:                        pswitch();
                    467:                        brklab = o1;
                    468:                        return;
                    469:                }
                    470: 
                    471:                case DEFAULT:
                    472:                        if (swp==0)
                    473:                                error("Default not in switch");
                    474:                        if (deflab)
                    475:                                error("More than 1 'default'");
                    476:                        if ((o=symbol())!=COLON)
                    477:                                goto syntax;
                    478:                        label(deflab = isn++);
                    479:                        goto stmt;
                    480: 
                    481:                case FOR: {
                    482:                        register int o2;
                    483:                        o1 = contlab;
                    484:                        o2 = brklab;
                    485:                        contlab = isn++;
                    486:                        brklab = isn++;
                    487:                        if (o=forstmt())
                    488:                                goto syntax;
                    489:                        contlab = o1;
                    490:                        brklab = o2;
                    491:                        return;
                    492:                }
                    493: 
                    494:                case ELSE:
                    495:                        error("Inappropriate 'else'");
                    496:                        statement();
                    497:                        return;
                    498:                }
                    499:                error("Unknown keyword");
                    500:                goto syntax;
                    501: 
                    502:        case NAME: {
                    503:                register struct nmlist *np;
                    504:                if (nextchar()==':') {
                    505:                        peekc = 0;
                    506:                        np = csym;
                    507:                        if (np->hclass>0) {
                    508:                                if (np->hblklev==0) {
                    509:                                        np = pushdecl(np);
                    510:                                        np->hoffset = 0;
                    511:                                } else {
                    512:                                        defsym = np;
                    513:                                        redec();
                    514:                                        goto stmt;
                    515:                                }
                    516:                        }
                    517:                        np->hclass = STATIC;
                    518:                        np->htype = ARRAY;
                    519:                        np->hflag |= FLABL;
                    520:                        if (np->hoffset==0)
                    521:                                np->hoffset = isn++;
                    522:                        label(np->hoffset);
                    523:                        goto stmt;
                    524:                }
                    525:        }
                    526:        }
                    527:        peeksym = o;
                    528:        rcexpr(tree(1));
                    529: 
                    530: semi:
                    531:        if ((o=symbol())==SEMI)
                    532:                return;
                    533: syntax:
                    534:        error("Statement syntax");
                    535:        errflush(o);
                    536: }
                    537: 
                    538: /*
                    539:  * Process a for statement.
                    540:  */
                    541: forstmt()
                    542: {
                    543:        register int o;
                    544:        register union tree *st;
                    545:        register l;
                    546:        char *ss;
                    547: 
                    548:        if ((o=symbol()) != LPARN)
                    549:                return(o);
                    550:        if ((o=symbol()) != SEMI) {             /* init part */
                    551:                peeksym = o;
                    552:                rcexpr(tree(1));
                    553:                if ((o=symbol()) != SEMI)
                    554:                        return(o);
                    555:        }
                    556:        l = isn;
                    557:        isn += 3;
                    558:        branch(l+0);
                    559:        label(l+1);
                    560:        branch(l+2);
                    561:        label(contlab);
                    562:        st = NULL;
                    563:        if ((o=symbol()) != SEMI) {             /* test part */
                    564:                peeksym = o;
                    565:                ss = starttree();
                    566:                st = tree(0);
                    567:                if ((o=symbol()) != SEMI) {
                    568:                        endtree(ss);
                    569:                        return(o);
                    570:                }
                    571:        }
                    572:        if ((o=symbol()) != RPARN) {    /* incr part */
                    573:                peeksym = o;
                    574:                rcexpr(tree(1));
                    575:                if ((o=symbol()) != RPARN) {
                    576:                        if (st)
                    577:                                endtree(ss);
                    578:                        return(o);
                    579:                }
                    580:        }
                    581:        label(l+0);
                    582:        if (st) {
                    583:                cbranch(st, l+1, 1);
                    584:                endtree(ss);
                    585:        } else
                    586:                branch(l+1);
                    587:        branch(brklab);
                    588:        label(l+2);
                    589:        statement();
                    590:        branch(contlab);
                    591:        label(brklab);
                    592:        return(0);
                    593: }
                    594: 
                    595: /*
                    596:  * A parenthesized expression,
                    597:  * as after "if".
                    598:  */
                    599: union tree *
                    600: pexpr(eflag)
                    601: {
                    602:        register o;
                    603:        register union tree *t;
                    604: 
                    605:        if ((o=symbol())!=LPARN)
                    606:                goto syntax;
                    607:        t = tree(eflag);
                    608:        if ((o=symbol())!=RPARN)
                    609:                goto syntax;
                    610:        if (t->t.type==VOID)
                    611:                error("Illegal use of void");
                    612:        return(t);
                    613: syntax:
                    614:        error("Statement syntax");
                    615:        errflush(o);
                    616:        return(0);
                    617: }
                    618: 
                    619: /*
                    620:  * The switch statement, which involves collecting the
                    621:  * constants and labels for the cases.
                    622:  */
                    623: pswitch()
                    624: {
                    625:        register struct swtab *cswp, *sswp;
                    626:        int dl, swlab;
                    627: 
                    628:        cswp = sswp = swp;
                    629:        if (swp==0)
                    630:                cswp = swp = swtab;
                    631:        branch(swlab=isn++);
                    632:        dl = deflab;
                    633:        deflab = 0;
                    634:        statement();
                    635:        branch(brklab);
                    636:        label(swlab);
                    637:        if (deflab==0)
                    638:                deflab = brklab;
                    639:        outcode("BNN", SWIT, deflab, line);
                    640:        for (; cswp < swp; cswp++)
                    641:                outcode("NN", cswp->swlab, cswp->swval);
                    642:        outcode("0");
                    643:        label(brklab);
                    644:        deflab = dl;
                    645:        swp = sswp;
                    646: }
                    647: 
                    648: /*
                    649:  * funchead is called at the start of each function
                    650:  * to process the arguments, which have been linked in a list.
                    651:  * This list is necessary because in
                    652:  * f(a, b) float b; int a; ...
                    653:  * the names are seen before the types.
                    654:  */
                    655: /*
                    656:  * Structure resembling a block for a register variable.
                    657:  */
                    658: struct nmlist  hreg    = { REG, 0, 0, NULL, NULL, 0 };
                    659: struct tnode   areg    = { NAME, 0, NULL, NULL, (union tree *)&hreg};
                    660: funchead()
                    661: {
                    662:        register pl;
                    663:        register struct nmlist *cs;
                    664:        register char *st;
                    665: 
                    666:        pl = STARG;
                    667:        while(paraml) {
                    668:                parame->sparent = NULL;
                    669:                cs = paraml;
                    670:                paraml = &paraml->sparent->P;
                    671:                if (cs->htype==FLOAT)
                    672:                        cs->htype = DOUBLE;
                    673:                cs->hoffset = pl;
                    674:                if ((cs->htype&XTYPE) == ARRAY) {
                    675:                        cs->htype -= (ARRAY-PTR);       /* set ptr */
                    676:                        cs->hsubsp++;           /* pop dims */
                    677:                }
                    678:                pl += rlength((union tree *)cs);
                    679:                if (cs->hclass==AREG && (hreg.hoffset=goodreg(cs))>=0) {
                    680:                        st = starttree();
                    681:                        *cp++ = (union tree *)&areg;
                    682:                        *cp++ = nblock(cs);
                    683:                        areg.type = cs->htype;
                    684:                        areg.strp = cs->hstrp;
                    685:                        cs->hclass = AUTO;
                    686:                        build(ASSIGN);
                    687:                        rcexpr(*--cp);
                    688:                        cs->hoffset = hreg.hoffset;
                    689:                        cs->hclass = REG;
                    690:                        endtree(st);
                    691:                } else
                    692:                        cs->hclass = AUTO;
                    693:                prste(cs);
                    694:        }
                    695:        for (pl=0; pl<HSHSIZ; pl++) {
                    696:                for (cs = hshtab[pl]; cs!=NULL; cs = cs->nextnm) {
                    697:                        if (cs->hclass == ARG || cs->hclass==AREG)
                    698:                                error("Not an argument: %.8s", cs->name);
                    699:                }
                    700:        }
                    701:        outcode("BN", SETREG, regvar);
                    702: }
                    703: 
                    704: blockhead()
                    705: {
                    706:        register r;
                    707: 
                    708:        r = regvar;
                    709:        blklev++;
                    710:        declist(0);
                    711:        if (r != regvar)
                    712:                outcode("BN", SETREG, regvar);
                    713: }
                    714: 
                    715: /*
                    716:  * After the end of a block, delete local
                    717:  * symbols;
                    718:  * Also complain about undefined labels.
                    719:  */
                    720: blkend()
                    721: {
                    722:        register struct nmlist *cs, **lcs;
                    723:        register i;
                    724:        int nnames;
                    725: 
                    726:        blklev--;
                    727:        nnames = 0;
                    728:        for (i=0; i<HSHSIZ; i++) {
                    729:                lcs = &hshtab[i];
                    730:                cs = *lcs;
                    731:                while (cs) {
                    732:                        if (cs->hblklev > blklev
                    733:                         && (((cs->hflag&FLABL)==0 && cs->hclass!=EXTERN) || blklev<=0)) {
                    734:                                if (cs->hclass==0)
                    735:                                        error("%.8s undefined", cs->name);
                    736:                                if (cs->hclass==EXTERN)
                    737:                                        nameconflict(hshtab[i], cs);
                    738:                                *lcs = cs->nextnm;
                    739:                        } else {
                    740:                                lcs = &cs->nextnm;
                    741:                                nnames++;
                    742:                        }
                    743:                        cs = cs->nextnm;
                    744:                }
                    745:        }
                    746: }
                    747: 
                    748: nameconflict(ocs, cs)
                    749: register struct nmlist *ocs, *cs;
                    750: {
                    751: 
                    752:        for (; ocs!=NULL; ocs = ocs->nextnm) 
                    753:                if (ocs!=cs && ocs->hclass==EXTERN && strncmp(cs->name, ocs->name, 7) == 0)
                    754:                        error("names %.8s and %.8s conflict", cs->name, ocs->name);
                    755: }
                    756: 
                    757: /*
                    758:  * write out special definitions of local symbols for
                    759:  * benefit of the debugger.  None of these are used
                    760:  * by the assembler except to save them.
                    761:  */
                    762: prste(cs)
                    763: struct nmlist *cs;
                    764: {
                    765:        register nkind;
                    766: 
                    767:        switch (cs->hclass) {
                    768:        case REG:
                    769:                nkind = RNAME;
                    770:                break;
                    771: 
                    772:        case AUTO:
                    773:                nkind = ANAME;
                    774:                break;
                    775: 
                    776:        case STATIC:
                    777:                nkind = SNAME;
                    778:                break;
                    779: 
                    780:        default:
                    781:                return;
                    782: 
                    783:        }
                    784:        outcode("BSN", nkind, cs->name, cs->hoffset);
                    785: }
                    786: 
                    787: /*
                    788:  * In case of error, skip to the next
                    789:  * statement delimiter.
                    790:  */
                    791: errflush(ao)
                    792: {
                    793:        register o;
                    794: 
                    795:        o = ao;
                    796:        while(o>RBRACE) {       /* ; { } */
                    797:                if (o==STRING)
                    798:                        putstr(0, 0);
                    799:                o = symbol();
                    800:        }
                    801:        peeksym  = o;
                    802: }

unix.superglobalmegacorp.com

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