Annotation of researchv10no/cmd/PDP11/11c/c02.c, revision 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.