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

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

unix.superglobalmegacorp.com

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