Annotation of researchv10dc/cmd/PDP11/11c/c03.c, revision 1.1.1.1

1.1       root        1: /*
                      2:  * C compiler, phase 1
                      3:  * Handles processing of declarations,
                      4:  * except for top-level processing of
                      5:  * externals.
                      6:  */
                      7: 
                      8: #include "c0.h"
                      9: 
                     10: /*
                     11:  * Process a sequence of declaration statements
                     12:  */
                     13: declist(sclass)
                     14: {
                     15:        register sc, offset;
                     16:        struct nmlist typer;
                     17: 
                     18:        offset = 0;
                     19:        sc = sclass;
                     20:        while (getkeywords(&sclass, &typer)) {
                     21:                offset = declare(sclass, &typer, offset);
                     22:                sclass = sc;
                     23:        }
                     24:        return(offset+align(INT, offset, 0));
                     25: }
                     26: 
                     27: /*
                     28:  * Read the keywords introducing a declaration statement
                     29:  * Store back the storage class, and fill in the type
                     30:  * entry, which looks like a hash table entry.
                     31:  */
                     32: getkeywords(scptr, tptr)
                     33: int *scptr;
                     34: struct nmlist *tptr;
                     35: {
                     36:        register skw, tkw, longf;
                     37:        int o, isadecl, ismos, unsignf;
                     38: 
                     39:        isadecl = 0;
                     40:        longf = 0;
                     41:        unsignf = 0;
                     42:        tptr->htype = INT;
                     43:        tptr->hstrp = NULL;
                     44:        tptr->hsubsp = NULL;
                     45:        tkw = -1;
                     46:        skw = *scptr;
                     47:        ismos = skw==MOS||skw==MOU? FMOS: 0;
                     48:        for (;;) {
                     49:                mosflg = isadecl? ismos: 0;
                     50:                o = symbol();
                     51:                if (o==NAME && csym->hclass==TYPEDEF && tkw<0) {
                     52:                        tkw = csym->htype;
                     53:                        tptr->hsubsp = csym->hsubsp;
                     54:                        tptr->hstrp = csym->hstrp;
                     55:                        isadecl++;
                     56:                        continue;
                     57:                }
                     58:                switch (o==KEYW? cval: -1) {
                     59:                case AUTO:
                     60:                case STATIC:
                     61:                case EXTERN:
                     62:                case REG:
                     63:                case TYPEDEF:
                     64:                        if (skw && skw!=cval) {
                     65:                                if (skw==ARG && cval==REG)
                     66:                                        cval = AREG;
                     67:                                else
                     68:                                        error("Conflict in storage class");
                     69:                        }
                     70:                        skw = cval;
                     71:                        break;
                     72:        
                     73:                case UNSIGN:
                     74:                        unsignf++;
                     75:                        break;
                     76: 
                     77:                case LONG:
                     78:                        longf++;
                     79:                        break;
                     80: 
                     81:                case ENUM:
                     82:                        if (longf || unsignf)
                     83:                                error("Perverse modifier on 'enum'");
                     84:                        strdec(ismos, cval);
                     85:                        cval = INT;
                     86:                        goto types;
                     87: 
                     88:                case UNION:
                     89:                case STRUCT:
                     90:                        tptr->hstrp = strdec(ismos, cval);
                     91:                        cval = STRUCT;
                     92:                case INT:
                     93:                case CHAR:
                     94:                case FLOAT:
                     95:                case DOUBLE:
                     96:                case VOID:
                     97:                types:
                     98:                        if (tkw>=0 && (tkw!=INT || cval!=INT))
                     99:                                error("Type clash");
                    100:                        tkw = cval;
                    101:                        if (unscflg && cval==CHAR)
                    102:                                unsignf++;
                    103:                        break;
                    104:        
                    105:                default:
                    106:                        peeksym = o;
                    107:                        if (isadecl==0)
                    108:                                return(0);
                    109:                        if (tkw<0)
                    110:                                tkw = INT;
                    111:                        if (skw==0)
                    112:                                skw = blklev==0? DEFXTRN: AUTO;
                    113:                        if (unsignf) {
                    114:                                if (tkw==INT)
                    115:                                        tkw = UNSIGN;
                    116:                                else if (tkw==CHAR)
                    117:                                        tkw = UNCHAR;
                    118:                                else
                    119:                                        error("Misplaced 'unsigned'");
                    120:                        }
                    121:                        if (longf) {
                    122:                                if (tkw==FLOAT)
                    123:                                        tkw = DOUBLE;
                    124:                                else if (tkw==INT)
                    125:                                        tkw = LONG;
                    126:                                else
                    127:                                        error("Misplaced 'long'");
                    128:                        }
                    129:                        *scptr = skw;
                    130:                        tptr->htype = tkw;
                    131:                        return(1);
                    132:                }
                    133:                isadecl++;
                    134:        }
                    135: }
                    136: 
                    137: /*
                    138:  * Process a structure, union, or enum declaration; a subroutine
                    139:  * of getkeywords.
                    140:  */
                    141: union str *
                    142: strdec(mosf, kind)
                    143: {
                    144:        register elsize, o;
                    145:        register struct nmlist *ssym;
                    146:        int savebits;
                    147:        struct nmlist **savememlist;
                    148:        union str *savesparent;
                    149:        int savenmems;
                    150:        union str *strp;
                    151:        struct nmlist *ds;
                    152:        struct nmlist *mems[NMEMS];
                    153:        struct nmlist typer;
                    154:        int tagkind;
                    155: 
                    156:        if (kind!=ENUM) {
                    157:                tagkind = STRTAG;
                    158:                mosflg = FTAG;
                    159:                if (kind==UNION)
                    160:                        mosflg = FUNION;
                    161:        } else {
                    162:                tagkind = ENUMTAG;
                    163:                mosflg = FENUM;
                    164:        }
                    165:        ssym = 0;
                    166:        if ((o=symbol())==NAME) {
                    167:                ssym = csym;
                    168:                mosflg = mosf;
                    169:                o = symbol();
                    170:                if (o==LBRACE && ssym->hblklev<blklev)
                    171:                        ssym = pushdecl(ssym);
                    172:                if (ssym->hclass && ssym->hclass!=tagkind) {
                    173:                        defsym = ssym;
                    174:                        redec();
                    175:                        ssym = pushdecl(ssym);
                    176:                }
                    177:                if (ssym->hclass==0) {
                    178:                        ssym->hclass = tagkind;
                    179:                        ssym->hstrp = (union str *)Dblock(sizeof(struct SS));
                    180:                        ssym->hstrp->S.ssize = 0;
                    181:                        ssym->hstrp->S.memlist = NULL;
                    182:                }
                    183:                strp = ssym->hstrp;
                    184:        } else {
                    185:                strp = (union str *)Dblock(sizeof(struct SS));
                    186:                strp->S.ssize = 0;
                    187:                strp->S.memlist = NULL;
                    188:        }
                    189:        mosflg = 0;
                    190:        if (o != LBRACE) {
                    191:                if (ssym==0)
                    192:                        goto syntax;
                    193:                if (ssym->hclass!=tagkind)
                    194:                        error("Bad structure/union/enum name");
                    195:                peeksym = o;
                    196:        } else {
                    197:                ds = defsym;
                    198:                mosflg = 0;
                    199:                savebits = bitoffs;
                    200:                savememlist = memlist;
                    201:                savesparent = sparent;
                    202:                savenmems = nmems;
                    203:                memlist = mems;
                    204:                sparent = strp;
                    205:                nmems = 2;
                    206:                bitoffs = 0;
                    207:                if (kind==ENUM) {
                    208:                        typer.htype = INT;
                    209:                        typer.hstrp = strp;
                    210:                        declare(ENUM, &typer, 0);
                    211:                } else
                    212:                        elsize = declist(kind==UNION?MOU:MOS);
                    213:                bitoffs = savebits;
                    214:                defsym = ds;
                    215:                if (strp->S.ssize)
                    216:                        error("%.8s redeclared", ssym->name);
                    217:                strp->S.ssize = elsize;
                    218:                *memlist++ = NULL;
                    219:                strp->S.memlist = (struct nmlist **)Dblock((memlist-mems)*sizeof(*memlist));
                    220:                for (o=0; &mems[o] != memlist; o++)
                    221:                        strp->S.memlist[o] = mems[o];
                    222:                memlist = savememlist;
                    223:                sparent = savesparent;
                    224:                nmems = savenmems;
                    225:                if ((o = symbol()) != RBRACE)
                    226:                        goto syntax;
                    227:        }
                    228:        return(strp);
                    229:    syntax:
                    230:        decsyn(o);
                    231:        return(0);
                    232: }
                    233: 
                    234: /*
                    235:  * Process a comma-separated list of declarators
                    236:  */
                    237: declare(askw, tptr, offset)
                    238: struct nmlist *tptr;
                    239: {
                    240:        register int o;
                    241:        register int skw, isunion;
                    242:        struct nmlist abs, *aptr;
                    243: 
                    244:        skw = askw;
                    245:        isunion = 0;
                    246:        if (skw==MOU) {
                    247:                skw = MOS;
                    248:                isunion++;
                    249:                mosflg = FMOS;
                    250:                if ((peeksym=symbol()) == SEMI) {
                    251:                        o = length((union tree *)tptr);
                    252:                        if (o>offset)
                    253:                                offset = o;
                    254:                }
                    255:        }
                    256:        do {
                    257:                if (skw==ENUM && (peeksym=symbol())==RBRACE) {
                    258:                        o = peeksym;
                    259:                        peeksym = -1;
                    260:                        break;
                    261:                }
                    262:                if (skw == MOS) {
                    263:                        abs.hclass = 0;
                    264:                        abs.hflag = 0;
                    265:                        abs.htype = 0;
                    266:                        abs.hsubsp = 0;
                    267:                        abs.hstrp = 0;
                    268:                        abs.nextnm = 0;
                    269:                        abs.sparent = 0;
                    270:                        abs.hblklev = blklev;
                    271:                        strcpy(abs.name, "<none>");
                    272:                        aptr = &abs;
                    273:                } else
                    274:                        aptr = NULL;
                    275:                o = decl1(skw, tptr, isunion?0:offset, aptr);
                    276:                if (isunion) {
                    277:                        o += align(CHAR, o, 0);
                    278:                        if (o>offset)
                    279:                                offset = o;
                    280:                } else
                    281:                        offset += o;
                    282:        } while ((o=symbol()) == COMMA);
                    283:        if (o==RBRACE) {
                    284:                peeksym = o;
                    285:                o = SEMI;
                    286:        }
                    287:        if (o!=SEMI && (o!=RPARN || skw!=ARG1))
                    288:                decsyn(o);
                    289:        return(offset);
                    290: }
                    291: 
                    292: /*
                    293:  * Process a single declarator
                    294:  */
                    295: decl1(askw, atptr, offset, absname)
                    296: struct nmlist *atptr, *absname;
                    297: {
                    298:        int t1, a, elsize;
                    299:        register int skw;
                    300:        int type;
                    301:        register struct nmlist *dsym;
                    302:        register struct nmlist *tptr;
                    303:        struct tdim dim;
                    304:        int *dp;
                    305:        int isinit;
                    306: 
                    307:        skw = askw;
                    308:        tptr = atptr;
                    309:        mosflg = skw==MOS? FMOS: 0;
                    310:        dim.rank = 0;
                    311:        if (((peeksym=symbol())==SEMI || peeksym==RPARN) && absname==NULL)
                    312:                return(0);
                    313:        /*
                    314:         * Filler field
                    315:         */
                    316:        if (peeksym==COLON && skw==MOS) {
                    317:                peeksym = -1;
                    318:                t1 = conexp();
                    319:                if (t1<0) {
                    320:                        error("Negative field width");
                    321:                        t1 = 0;
                    322:                }
                    323:                elsize = align(tptr->htype, offset, t1);
                    324:                bitoffs += t1;
                    325:                return(elsize);
                    326:        }
                    327:        t1 = getype(&dim, absname);
                    328:        if (t1 == -1)
                    329:                return(0);
                    330:        if (defsym)
                    331:                absname = NULL;
                    332:        if (tptr->hsubsp) {
                    333:                type = tptr->htype;
                    334:                for (a=0; type&XTYPE;) {
                    335:                        if ((type&XTYPE)==ARRAY)
                    336:                                dim.dimens[dim.rank++] = tptr->hsubsp[a++];
                    337:                        type >>= TYLEN;
                    338:                }
                    339:        }
                    340:        type = tptr->htype & ~TYPE;
                    341:        while (t1&XTYPE) {
                    342:                if (type&BIGTYPE) {
                    343:                        typov();
                    344:                        type = t1 = 0;
                    345:                }
                    346:                type = type<<TYLEN | (t1 & XTYPE);
                    347:                t1 >>= TYLEN;
                    348:        }
                    349:        type |= tptr->htype&TYPE;
                    350:        if ((type&XTYPE) == FUNC) {
                    351:                if (skw==AUTO)
                    352:                        skw = EXTERN;
                    353:                if ((skw!=EXTERN && skw!=TYPEDEF) && absname==NULL)
                    354:                        error("Bad func. storage class");
                    355:        }
                    356:        if (defsym)
                    357:                dsym = defsym;
                    358:        else if (absname)
                    359:                dsym = absname;
                    360:        else {
                    361:                error("Name required in declaration");
                    362:                return(0);
                    363:        }
                    364:        if (defsym)
                    365:        if (dsym->hblklev<blklev || dsym->hclass==MOS && skw==MOS) {
                    366:                if (skw==MOS && dsym->sparent==sparent)
                    367:                        redec();
                    368:                defsym = dsym;
                    369:                if (skw==EXTERN) {
                    370:                        for (; dsym!=NULL; dsym = dsym->nextnm) {
                    371:                                if (dsym->hclass==EXTERN
                    372:                                 && strncmp(dsym->name, defsym->name, NCPS)==0) {
                    373:                                        defsym = dsym;
                    374:                                        break;
                    375:                                }
                    376:                        }
                    377:                        dsym = defsym;
                    378:                } else
                    379:                        defsym = dsym = pushdecl(dsym);
                    380:        }
                    381:        if (dim.rank == 0)
                    382:                dsym->hsubsp = NULL;
                    383:        else {
                    384:                dp = (int *)Dblock(dim.rank*sizeof(dim.rank));
                    385:                for (a=0; a<dim.rank; a++) {
                    386:                        if ((t1 = dp[a] = dim.dimens[a])
                    387:                         && (dsym->htype&XTYPE) == ARRAY
                    388:                         && dsym->hsubsp[a] && t1!=dsym->hsubsp[a])
                    389:                                redec();
                    390:                }
                    391:                dsym->hsubsp = dp;
                    392:        }
                    393:        if (!(dsym->hclass==0
                    394:           || ((skw==ARG||skw==AREG) && dsym->hclass==ARG1)
                    395:           || (skw==EXTERN && dsym->hclass==EXTERN && dsym->htype==type))) {
                    396:                redec();
                    397:                goto syntax;
                    398:        }
                    399:        if (dsym->hclass && (dsym->htype&TYPE)==STRUCT && (type&TYPE)==STRUCT)
                    400:                if (dsym->hstrp != tptr->hstrp) {
                    401:                        error("structure redeclaration");
                    402:                }
                    403:        dsym->htype = type;
                    404:        if (tptr->hstrp)
                    405:                dsym->hstrp = tptr->hstrp;
                    406:        if (skw==TYPEDEF) {
                    407:                dsym->hclass = TYPEDEF;
                    408:                return(0);
                    409:        }
                    410:        if (skw==ARG1) {
                    411:                if (paraml==NULL)
                    412:                        paraml = dsym;
                    413:                else
                    414:                        parame->sparent = (union str *)dsym;
                    415:                parame = dsym;
                    416:                dsym->hclass = skw;
                    417:                return(0);
                    418:        }
                    419:        elsize = 0;
                    420:        if (skw==MOS) {
                    421:                elsize = length((union tree *)dsym);
                    422:                if ((peeksym = symbol())==COLON) {
                    423:                        elsize = 0;
                    424:                        peeksym = -1;
                    425:                        t1 = conexp();
                    426:                        a = align(type, offset, t1);
                    427:                        if (dsym->hflag&FFIELD) {
                    428:                                if (dsym->hstrp->F.bitoffs!=bitoffs
                    429:                                 || dsym->hstrp->F.flen!=t1)
                    430:                                        redec();
                    431:                        } else {
                    432:                                dsym->hstrp = (union str *)Dblock(sizeof(struct FS));
                    433:                        }
                    434:                        dsym->hflag |= FFIELD;
                    435:                        dsym->hstrp->F.bitoffs = bitoffs;
                    436:                        dsym->hstrp->F.flen = t1;
                    437:                        bitoffs += t1;
                    438:                } else
                    439:                        a = align(type, offset, 0);
                    440:                elsize += a;
                    441:                offset += a;
                    442:                if (++nmems >= NMEMS) {
                    443:                        error("Too many structure members");
                    444:                        nmems -= NMEMS/2;
                    445:                        memlist -= NMEMS/2;
                    446:                }
                    447:                if (a)
                    448:                        *memlist++ = &structhole;
                    449:                dsym->hoffset = offset;
                    450:                *memlist++ = dsym;
                    451:                dsym->sparent = sparent;
                    452:        }
                    453:        if (skw==REG)
                    454:                if ((dsym->hoffset = goodreg(dsym)) < 0)
                    455:                        skw = AUTO;
                    456:        dsym->hclass = skw;
                    457:        isinit = 0;
                    458:        if ((a=symbol()) == ASSIGN)
                    459:                isinit++;
                    460:        else
                    461:                peeksym = a;
                    462:        if (skw==AUTO) {
                    463:        /*      if (STAUTO < 0) {       */
                    464:                        autolen -= rlength((union tree *)dsym);
                    465:                        dsym->hoffset = autolen;
                    466:                        if (autolen < maxauto)
                    467:                                maxauto = autolen;
                    468:        /*      } else {                        */
                    469:        /*              dsym->hoffset = autolen;        */
                    470:        /*              autolen += rlength(dsym);       */
                    471:        /*              if (autolen > maxauto)          */
                    472:        /*                      maxauto = autolen;      */
                    473:        /*      }                       */
                    474:                if (isinit)
                    475:                        cinit(dsym, 0, AUTO);
                    476:                isinit = 0;
                    477:        } else if (skw==STATIC) {
                    478:                dsym->hoffset = isn;
                    479:                if (isinit) {
                    480:                        outcode("BBN", DATA, LABEL, isn++);
                    481:                        if (cinit(dsym, 1, STATIC) & ALIGN)
                    482:                                outcode("B", EVEN);
                    483:                } else
                    484:                        outcode("BBNBN", BSS, LABEL, isn++, SSPACE,
                    485:                          rlength((union tree *)dsym));
                    486:                outcode("B", PROG);
                    487:                isinit = 0;
                    488:        } else if (skw==REG && isinit) {
                    489:                cinit(dsym, 0, REG);
                    490:                isinit = 0;
                    491:        } else if (skw==ENUM) {
                    492:                if (type!=INT)
                    493:                        error("Illegal enumeration %.8s", dsym->name);
                    494:                dsym->hclass = ENUMCON;
                    495:                dsym->hoffset = offset;
                    496:                if (isinit)
                    497:                        cinit(dsym, 0, ENUMCON);
                    498:                elsize = dsym->hoffset-offset+1;
                    499:                isinit = 0;
                    500:        }
                    501:        if (absname==0)
                    502:                prste(dsym);
                    503:        if (isinit)
                    504:                peeksym = ASSIGN;
                    505: syntax:
                    506:        return(elsize);
                    507: }
                    508: 
                    509: /*
                    510:  * Push down an outer-block declaration
                    511:  * after redeclaration in an inner block.
                    512:  */
                    513: struct nmlist *
                    514: pushdecl(sp)
                    515: register struct nmlist *sp;
                    516: {
                    517:        register struct nmlist *nsp, **hsp;
                    518: 
                    519:        nsp = (struct nmlist *)Dblock(sizeof(struct nmlist));
                    520:        *nsp = *sp;
                    521:        nsp->hclass = 0;
                    522:        nsp->hflag &= FKIND;
                    523:        nsp->htype = 0;
                    524:        nsp->hoffset = 0;
                    525:        nsp->hblklev = blklev;
                    526:        nsp->hstrp = NULL;
                    527:        nsp->hsubsp = NULL;
                    528:        nsp->sparent = NULL;
                    529:        hsp = &hshtab[hash(sp->name)];
                    530:        nsp->nextnm = *hsp;
                    531:        *hsp = nsp;
                    532:        return(nsp);
                    533: }
                    534: 
                    535: /*
                    536:  * Read a declarator and get the implied type
                    537:  */
                    538: getype(dimp, absname)
                    539: register struct tdim *dimp;
                    540: struct nmlist *absname;
                    541: {
                    542:        static struct nmlist argtype;
                    543:        int type;
                    544:        register int o;
                    545:        register struct nmlist *ds;
                    546: 
                    547:        defsym = 0;
                    548:        type = 0;
                    549:        switch(o=symbol()) {
                    550: 
                    551:        case TIMES:
                    552:                type = getype(dimp, absname);
                    553:                if (type==-1)
                    554:                        return(type);
                    555:                if (type&BIGTYPE) {
                    556:                        typov();
                    557:                        type = 0;
                    558:                }
                    559:                return(type<<TYLEN | PTR);
                    560: 
                    561:        case LPARN:
                    562:                if (absname==NULL || nextchar()!=')') {
                    563:                        type = getype(dimp, absname);
                    564:                        if (type==-1)
                    565:                                return(type);
                    566:                        if ((o=symbol()) != RPARN)
                    567:                                goto syntax;
                    568:                        goto getf;
                    569:                }
                    570: 
                    571:        default:
                    572:                peeksym = o;
                    573:                if (absname)
                    574:                        goto getf;
                    575:                break;
                    576: 
                    577:        case NAME:
                    578:                defsym = ds = csym;
                    579:        getf:
                    580:                switch(o=symbol()) {
                    581: 
                    582:                case LPARN:
                    583:                        if (blklev==0) {
                    584:                                blklev++;
                    585:                                ds = defsym;
                    586:                                declare(ARG1, &argtype, 0);
                    587:                                defsym = ds;
                    588:                                blklev--;
                    589:                        } else
                    590:                                if ((o=symbol()) != RPARN)
                    591:                                        goto syntax;
                    592:                        if (type&BIGTYPE) {
                    593:                                typov();
                    594:                                type = 0;
                    595:                        }
                    596:                        type = type<<TYLEN | FUNC;
                    597:                        goto getf;
                    598: 
                    599:                case LBRACK:
                    600:                        if (dimp->rank>=5) {
                    601:                                error("Rank too large");
                    602:                                dimp->rank = 4;
                    603:                        }
                    604:                        if ((o=symbol()) != RBRACK) {
                    605:                                peeksym = o;
                    606:                                ds = defsym;
                    607:                                cval = conexp();
                    608:                                defsym = ds;
                    609:                                if ((o=symbol())!=RBRACK)
                    610:                                        goto syntax;
                    611:                        } else {
                    612:                                if (dimp->rank!=0)
                    613:                                        error("Null dimension");
                    614:                                cval = 0;
                    615:                        }
                    616:                        dimp->dimens[dimp->rank++] = cval;
                    617:                        if (type&BIGTYPE) {
                    618:                                typov();
                    619:                                type = 0;
                    620:                        }
                    621:                        type = type<<TYLEN | ARRAY;
                    622:                        goto getf;
                    623:                }
                    624:                peeksym = o;
                    625:                return(type);
                    626:        }
                    627: syntax:
                    628:        decsyn(o);
                    629:        return(-1);
                    630: }
                    631: 
                    632: /*
                    633:  * More bits required for type than allowed.
                    634:  */
                    635: typov()
                    636: {
                    637:        error("Type is too complicated");
                    638: }
                    639: 
                    640: /*
                    641:  * Enforce alignment restrictions in structures,
                    642:  * including bit-field considerations.
                    643:  */
                    644: align(type, offset, aflen)
                    645: {
                    646:        register a, t, flen;
                    647:        char *ftl;
                    648: 
                    649:        flen = aflen;
                    650:        a = offset;
                    651:        t = type;
                    652:        ftl = "Field too long";
                    653:        if (flen==0) {
                    654:                a += (NBPC+bitoffs-1) / NBPC;
                    655:                bitoffs = 0;
                    656:        }
                    657:        while ((t&XTYPE)==ARRAY)
                    658:                t = decref(t);
                    659:        if (t!=CHAR && t!=UNCHAR) {
                    660:                a = (a+ALIGN) & ~ALIGN;
                    661:                if (a>offset)
                    662:                        bitoffs = 0;
                    663:        }
                    664:        if (flen) {
                    665:                if (type==INT || type==UNSIGN) {
                    666:                        if (flen > NBPW)
                    667:                                error(ftl);
                    668:                        if (flen+bitoffs > NBPW) {
                    669:                                bitoffs = 0;
                    670:                                a += NCPW;
                    671:                        }
                    672:                } else if (type==CHAR || type==UNCHAR) {
                    673:                        if (flen > NBPC)
                    674:                                error(ftl);
                    675:                        if (flen+bitoffs > NBPC) {
                    676:                                bitoffs = 0;
                    677:                                a += 1;
                    678:                        }
                    679:                } else
                    680:                        error("Bad type for field");
                    681:        }
                    682:        return(a-offset);
                    683: }
                    684: 
                    685: /*
                    686:  * Complain about syntax error in declaration
                    687:  */
                    688: decsyn(o)
                    689: {
                    690:        error("Declaration syntax");
                    691:        errflush(o);
                    692: }
                    693: 
                    694: /*
                    695:  * Complain about a redeclaration
                    696:  */
                    697: redec()
                    698: {
                    699:        error("%.8s redeclared", defsym->name);
                    700: }
                    701: 
                    702: /*
                    703:  * Determine if a variable is suitable for storage in
                    704:  * a register; if so return the register number
                    705:  */
                    706: goodreg(hp)
                    707: struct nmlist *hp;
                    708: {
                    709:        int type;
                    710: 
                    711:        type = hp->htype;
                    712:        if ((type!=INT && type!=UNSIGN && (type&XTYPE)==0)
                    713:         || (type&XTYPE)>PTR || regvar<3)
                    714:                return(-1);
                    715:        return(--regvar);
                    716: }

unix.superglobalmegacorp.com

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