Annotation of 40BSD/cmd/pi/type.c, revision 1.1.1.1

1.1       root        1: /* Copyright (c) 1979 Regents of the University of California */
                      2: 
                      3: static char sccsid[] = "@(#)type.c 1.4 9/4/80";
                      4: 
                      5: #include "whoami.h"
                      6: #include "0.h"
                      7: #include "tree.h"
                      8: #include "objfmt.h"
                      9: 
                     10: /*
                     11:  * Type declaration part
                     12:  */
                     13: typebeg()
                     14: {
                     15: 
                     16: /*
                     17:  * this allows for multiple
                     18:  * declaration parts unless
                     19:  * standard option has been
                     20:  * specified.
                     21:  * If routine segment is being
                     22:  * compiled, do level one processing.
                     23:  */
                     24: 
                     25: #ifndef PI1
                     26:        if (!progseen)
                     27:                level1();
                     28:        if ( parts[ cbn ] & ( VPRT | RPRT ) ) {
                     29:            if ( opt( 's' ) ) {
                     30:                standard();
                     31:            } else {
                     32:                warning();
                     33:            }
                     34:            error("Type declarations should precede var and routine declarations");
                     35:        }
                     36:        if (parts[ cbn ] & TPRT) {
                     37:            if ( opt( 's' ) ) {
                     38:                standard();
                     39:            } else {
                     40:                warning();
                     41:            }
                     42:            error("All types should be declared in one type part");
                     43:        }
                     44:        parts[ cbn ] |= TPRT;
                     45: #endif
                     46:        /*
                     47:         * Forechain is the head of a list of types that
                     48:         * might be self referential.  We chain them up and
                     49:         * process them later.
                     50:         */
                     51:        forechain = NIL;
                     52: #ifdef PI0
                     53:        send(REVTBEG);
                     54: #endif
                     55: }
                     56: 
                     57: type(tline, tid, tdecl)
                     58:        int tline;
                     59:        char *tid;
                     60:        register int *tdecl;
                     61: {
                     62:        register struct nl *np;
                     63: 
                     64:        np = gtype(tdecl);
                     65:        line = tline;
                     66: #ifndef PI0
                     67:        enter(defnl(tid, TYPE, np, 0))->nl_flags |= NMOD;
                     68: #else
                     69:        enter(defnl(tid, TYPE, np, 0));
                     70:        send(REVTYPE, tline, tid, tdecl);
                     71: #endif
                     72: 
                     73: #ifdef PC
                     74:        if (cbn == 1) {
                     75:            stabgtype( tid , line );
                     76:        }
                     77: #endif PC
                     78: 
                     79: #      ifdef PTREE
                     80:            {
                     81:                pPointer Type = TypeDecl( tid , tdecl );
                     82:                pPointer *Types;
                     83: 
                     84:                pSeize( PorFHeader[ nesting ] );
                     85:                Types = &( pDEF( PorFHeader[ nesting ] ).PorFTypes );
                     86:                *Types = ListAppend( *Types , Type );
                     87:                pRelease( PorFHeader[ nesting ] );
                     88:            }
                     89: #      endif
                     90: }
                     91: 
                     92: typeend()
                     93: {
                     94: 
                     95: #ifdef PI0
                     96:        send(REVTEND);
                     97: #endif
                     98:        foredecl();
                     99: }
                    100: 
                    101: /*
                    102:  * Return a type pointer (into the namelist)
                    103:  * from a parse tree for a type, building
                    104:  * namelist entries as needed.
                    105:  */
                    106: struct nl *
                    107: gtype(r)
                    108:        register int *r;
                    109: {
                    110:        register struct nl *np;
                    111:        register char *cp;
                    112:        register int oline, w;
                    113: 
                    114:        if (r == NIL)
                    115:                return (NIL);
                    116:        oline = line;
                    117:        if (r[0] != T_ID)
                    118:                oline = line = r[1];
                    119:        switch (r[0]) {
                    120:                default:
                    121:                        panic("type");
                    122:                case T_TYID:
                    123:                        r++;
                    124:                case T_ID:
                    125:                        np = lookup(r[1]);
                    126:                        if (np == NIL)
                    127:                                break;
                    128:                        if (np->class != TYPE) {
                    129: #ifndef PI1
                    130:                                error("%s is a %s, not a type as required", r[1], classes[np->class]);
                    131: #endif
                    132:                                np = NIL;
                    133:                                break;
                    134:                        }
                    135:                        np = np->type;
                    136:                        break;
                    137:                case T_TYSCAL:
                    138:                        np = tyscal(r);
                    139:                        break;
                    140:                case T_TYRANG:
                    141:                        np = tyrang(r);
                    142:                        break;
                    143:                case T_TYPTR:
                    144:                        np = defnl(0, PTR, 0, 0 );
                    145:                        np -> ptr[0] = r[2];
                    146:                        np->nl_next = forechain;
                    147:                        forechain = np;
                    148:                        break;
                    149:                case T_TYPACK:
                    150:                        np = gtype(r[2]);
                    151:                        break;
                    152:                case T_TYARY:
                    153:                        np = tyary(r);
                    154:                        break;
                    155:                case T_TYREC:
                    156:                        np = tyrec(r[2], 0);
                    157: #                      ifdef PTREE
                    158:                                /*
                    159:                                 * mung T_TYREC[3] to point to the record
                    160:                                 * for RecTCopy
                    161:                                 */
                    162:                            r[3] = np;
                    163: #                      endif
                    164:                        break;
                    165:                case T_TYFILE:
                    166:                        np = gtype(r[2]);
                    167:                        if (np == NIL)
                    168:                                break;
                    169: #ifndef PI1
                    170:                        if (np->nl_flags & NFILES)
                    171:                                error("Files cannot be members of files");
                    172: #endif
                    173:                        np = defnl(0, FILET, np, 0);
                    174:                        np->nl_flags |= NFILES;
                    175:                        break;
                    176:                case T_TYSET:
                    177:                        np = gtype(r[2]);
                    178:                        if (np == NIL)
                    179:                                break;
                    180:                        if (np->type == nl+TDOUBLE) {
                    181: #ifndef PI1
                    182:                                error("Set of real is not allowed");
                    183: #endif
                    184:                                np = NIL;
                    185:                                break;
                    186:                        }
                    187:                        if (np->class != RANGE && np->class != SCAL) {
                    188: #ifndef PI1
                    189:                                error("Set type must be range or scalar, not %s", nameof(np));
                    190: #endif
                    191:                                np = NIL;
                    192:                                break;
                    193:                        }
                    194: #ifndef PI1
                    195:                        if (width(np) > 2)
                    196:                                error("Implementation restriction: sets must be indexed by 16 bit quantities");
                    197: #endif
                    198:                        np = defnl(0, SET, np, 0);
                    199:                        break;
                    200:        }
                    201:        line = oline;
                    202:        w = lwidth(np);
                    203:        if (w >= TOOMUCH) {
                    204:                error("Storage requirement of %s exceeds the implementation limit of %d by %d bytes",
                    205:                        nameof(np), TOOMUCH-1, w-TOOMUCH+1);
                    206:                np = NIL;
                    207:        }
                    208:        return (np);
                    209: }
                    210: 
                    211: /*
                    212:  * Scalar (enumerated) types
                    213:  */
                    214: tyscal(r)
                    215:        int *r;
                    216: {
                    217:        register struct nl *np, *op, *zp;
                    218:        register *v;
                    219:        int i;
                    220: 
                    221:        np = defnl(0, SCAL, 0, 0);
                    222:        np->type = np;
                    223:        v = r[2];
                    224:        if (v == NIL)
                    225:                return (NIL);
                    226:        i = -1;
                    227:        zp = np;
                    228:        for (; v != NIL; v = v[2]) {
                    229:                op = enter(defnl(v[1], CONST, np, ++i));
                    230: #ifndef PI0
                    231:                op->nl_flags |= NMOD;
                    232: #endif
                    233:                op->value[1] = i;
                    234:                zp->chain = op;
                    235:                zp = op;
                    236:        }
                    237:        np->range[1] = i;
                    238:        return (np);
                    239: }
                    240: 
                    241: /*
                    242:  * Declare a subrange.
                    243:  */
                    244: tyrang(r)
                    245:        register int *r;
                    246: {
                    247:        register struct nl *lp, *hp;
                    248:        double high;
                    249:        int c, c1;
                    250: 
                    251:        gconst(r[3]);
                    252:        hp = con.ctype;
                    253:        high = con.crval;
                    254:        gconst(r[2]);
                    255:        lp = con.ctype;
                    256:        if (lp == NIL || hp == NIL)
                    257:                return (NIL);
                    258:        if (norange(lp) || norange(hp))
                    259:                return (NIL);
                    260:        c = classify(lp);
                    261:        c1 = classify(hp);
                    262:        if (c != c1) {
                    263: #ifndef PI1
                    264:                error("Can't mix %ss and %ss in subranges", nameof(lp), nameof(hp));
                    265: #endif
                    266:                return (NIL);
                    267:        }
                    268:        if (c == TSCAL && scalar(lp) != scalar(hp)) {
                    269: #ifndef PI1
                    270:                error("Scalar types must be identical in subranges");
                    271: #endif
                    272:                return (NIL);
                    273:        }
                    274:        if (con.crval > high) {
                    275: #ifndef PI1
                    276:                error("Range lower bound exceeds upper bound");
                    277: #endif
                    278:                return (NIL);
                    279:        }
                    280:        lp = defnl(0, RANGE, hp->type, 0);
                    281:        lp->range[0] = con.crval;
                    282:        lp->range[1] = high;
                    283:        return (lp);
                    284: }
                    285: 
                    286: norange(p)
                    287:        register struct nl *p;
                    288: {
                    289:        if (isa(p, "d")) {
                    290: #ifndef PI1
                    291:                error("Subrange of real is not allowed");
                    292: #endif
                    293:                return (1);
                    294:        }
                    295:        if (isnta(p, "bcsi")) {
                    296: #ifndef PI1
                    297:                error("Subrange bounds must be Boolean, character, integer or scalar, not %s", nameof(p));
                    298: #endif
                    299:                return (1);
                    300:        }
                    301:        return (0);
                    302: }
                    303: 
                    304: /*
                    305:  * Declare arrays and chain together the dimension specification
                    306:  */
                    307: struct nl *
                    308: tyary(r)
                    309:        int *r;
                    310: {
                    311:        struct nl *np;
                    312:        register *tl;
                    313:        register struct nl *tp, *ltp;
                    314:        int i;
                    315: 
                    316:        tp = gtype(r[3]);
                    317:        if (tp == NIL)
                    318:                return (NIL);
                    319:        np = defnl(0, ARRAY, tp, 0);
                    320:        np->nl_flags |= (tp->nl_flags) & NFILES;
                    321:        ltp = np;
                    322:        i = 0;
                    323:        for (tl = r[2]; tl != NIL; tl = tl[2]) {
                    324:                tp = gtype(tl[1]);
                    325:                if (tp == NIL) {
                    326:                        np = NIL;
                    327:                        continue;
                    328:                }
                    329:                if (tp->class == RANGE && tp->type == nl+TDOUBLE) {
                    330: #ifndef PI1
                    331:                        error("Index type for arrays cannot be real");
                    332: #endif
                    333:                        np = NIL;
                    334:                        continue;
                    335:                }
                    336:                if (tp->class != RANGE && tp->class != SCAL) {
                    337: #ifndef PI1
                    338:                        error("Array index type is a %s, not a range or scalar as required", classes[tp->class]);
                    339: #endif
                    340:                        np = NIL;
                    341:                        continue;
                    342:                }
                    343:                if (tp->class == RANGE && bytes(tp->range[0], tp->range[1]) > 2) {
                    344: #ifndef PI1
                    345:                        error("Value of dimension specifier too large or small for this implementation");
                    346: #endif
                    347:                        continue;
                    348:                }
                    349:                tp = nlcopy(tp);
                    350:                i++;
                    351:                ltp->chain = tp;
                    352:                ltp = tp;
                    353:        }
                    354:        if (np != NIL)
                    355:                np->value[0] = i;
                    356:        return (np);
                    357: }
                    358: 
                    359: /*
                    360:  * Delayed processing for pointers to
                    361:  * allow self-referential and mutually
                    362:  * recursive pointer constructs.
                    363:  */
                    364: foredecl()
                    365: {
                    366:        register struct nl *p, *q;
                    367: 
                    368:        for (p = forechain; p != NIL; p = p->nl_next) {
                    369:                if (p->class == PTR && p -> ptr[0] != 0)
                    370:                {
                    371:                        p->type = gtype(p -> ptr[0]);
                    372: #ifndef PI1
                    373:                        if (p->type != NIL && ( ( p->type )->nl_flags & NFILES))
                    374:                                error("Files cannot be members of dynamic structures");
                    375: #endif
                    376: #                      ifdef PTREE
                    377:                        {
                    378:                            if ( pUSE( p -> inTree ).PtrTType == pNIL ) {
                    379:                                pPointer        PtrTo = tCopy( p -> ptr[0] );
                    380: 
                    381:                                pDEF( p -> inTree ).PtrTType = PtrTo;
                    382:                            }
                    383:                        }
                    384: #                      endif
                    385:                        p -> ptr[0] = 0;
                    386:                }
                    387:        }
                    388: }

unix.superglobalmegacorp.com

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