Annotation of 43BSD/contrib/apl/src/a4.c, revision 1.1

1.1     ! root        1: static char Sccsid[] = "a4.c @(#)a4.c  1.2     10/5/82 Berkeley ";
        !             2: #include "apl.h"
        !             3: 
        !             4: /*
        !             5:  *     parser generates the following for each  label
        !             6:  *
        !             7:  *     AUTO-name  CONST  NAME-name  LABEL
        !             8:  *
        !             9:  *     (where CONST is the label address)
        !            10:  */
        !            11: ex_label()
        !            12: {
        !            13:        register struct nlist *n;
        !            14: 
        !            15:        ex_asgn();
        !            16:        n = (struct nlist *)sp[-1];
        !            17:        n->itemp->type = LBL;   /* lock out assignments */
        !            18:        sp--;                   /* discard stack */
        !            19: }
        !            20: 
        !            21: 
        !            22: ex_asgn()
        !            23: {
        !            24:        register struct nlist *p;
        !            25:        register struct item *q;
        !            26: 
        !            27:        p = (struct nlist *)sp[-1];
        !            28:        switch(p->type){
        !            29:        case QX:
        !            30:                pop();
        !            31:                p = nlook("Llx");
        !            32:                if(p == 0){
        !            33:                        /*
        !            34:                         * allocate new name:
        !            35:                         */
        !            36:                        for(p=nlist; p->namep; p++) {}
        !            37:                        p->namep = alloc(4);
        !            38:                        copy(CH, "Llx", p->namep, 4);
        !            39:                        p->type = LV;
        !            40:                        p->use = 0;
        !            41:                        p->itemp = newdat(CH, 0, 0);
        !            42:                }
        !            43:                sp++;   /* reset stack */
        !            44:                break;
        !            45:        case QD:
        !            46:                pop();
        !            47:                ex_print();
        !            48:                return;
        !            49:        case QC:
        !            50:                pop();
        !            51:                ex_plot();
        !            52:                return;
        !            53:        case QQ:
        !            54:                pop();
        !            55:                epr0(); /* print w/out '\n'  (in a2.c) */
        !            56:                return;
        !            57:        case LV:
        !            58:                /* The following line checks that it is not the first assignment
        !            59:                 * to the local variable, in which case itemp has not be set yet
        !            60:                 * This used to produce an interesting bug when adress 1 was
        !            61:                 * holding the manifest constant LBL ... just by chance !
        !            62:                 */
        !            63:                if (((struct nlist *)p)->itemp != 0) {
        !            64:                        if(((struct nlist *)p)->itemp->type == LBL)
        !            65:                                error("asgn to label");
        !            66:                }
        !            67:                break;
        !            68:        default:
        !            69:                error("asgn lv");
        !            70:        }
        !            71:        if(p->use != 0 && p->use != DA)
        !            72:                error("asgn var");
        !            73:        sp--;
        !            74:        q = fetch1();
        !            75:        erase(p);
        !            76:        p->use = DA;
        !            77:        ((struct nlist *)p)->itemp = q;
        !            78:        sp[-1] = (struct item *)p;
        !            79: }
        !            80: 
        !            81: ex_elid()
        !            82: {
        !            83: 
        !            84:        *sp++ = newdat(EL, 0, 0);
        !            85: }
        !            86: 
        !            87: ex_index()
        !            88: {
        !            89:        register struct item *p;
        !            90:        struct item *q;
        !            91:        register i, j;
        !            92:        int f, n, lv;
        !            93: 
        !            94:        n = *pcp++;
        !            95:        f = *pcp;
        !            96:        p = sp[-1];
        !            97:        if(f == ASGN) {
        !            98:                pcp++;
        !            99:                if(p->type != LV)
        !           100:                        error("indexed assign value");
        !           101:                if(((struct nlist *)p)->use != DA)
        !           102:                        fetch1(); /* error("used before set"); */
        !           103:                q = ((struct nlist *)p)->itemp;
        !           104:        } else
        !           105:                q = fetch1();
        !           106:        if(q->rank != n)
        !           107:                error("subscript C");
        !           108:        idx.rank = 0;
        !           109:        for(i=0; i<n; i++) {
        !           110:                p = sp[-i-2];
        !           111:                if(p->type == EL) {
        !           112:                        idx.dim[idx.rank++] =
        !           113:                                q->dim[i];
        !           114:                        continue;
        !           115:                }
        !           116:                p = fetch(p);
        !           117:                sp[-i-2] = p;
        !           118:                for(j=0; j<p->rank; j++)
        !           119:                        idx.dim[idx.rank++] =
        !           120:                                p->dim[j];
        !           121:        }
        !           122:        size();
        !           123:        if(f == ASGN) {
        !           124:                p = fetch(sp[-n-2]);
        !           125:                sp[-n-2] = p;
        !           126:                if (p->size > 1) {
        !           127:                        if(idx.size != p->size)
        !           128:                                error("assign C");
        !           129:                        f = 1; /* v[i] <- v */
        !           130:                } else {
        !           131:                        if (idx.size && !p->size)
        !           132:                                error("assign C");
        !           133:                        /* Note -- for idx.size = 0, no assign occurs
        !           134:                         * anyway, so it is safe to set "datum" to 0
        !           135:                         */
        !           136:                        datum = p->size ? getdat(p) : 0;
        !           137:                        f = 2; /* v[i] <- s */
        !           138:                }
        !           139:                ex_elid();
        !           140:        } else {
        !           141:                p = newdat(q->type, idx.rank, idx.size);
        !           142:                copy(IN, idx.dim, p->dim, idx.rank);
        !           143:                *sp++ = p;
        !           144:                f = 0; /* v[i] */
        !           145:        }
        !           146:        bidx(q);
        !           147:        index1(0, f);
        !           148:        if(f == 0) {
        !           149:                p = sp[-1];
        !           150:                sp--;
        !           151:                for(i=0; i<=n; i++)
        !           152:                        pop();
        !           153:                *sp++ = p;
        !           154:        } else {
        !           155:                pop();          /* pop ELID */
        !           156:                sp--;           /* skip over LV */
        !           157:                for(i=0; i<n; i++)
        !           158:                        pop();
        !           159:        }
        !           160: }
        !           161: 
        !           162: index1(i, f)
        !           163: {
        !           164:        register struct item *p;
        !           165:        register j, k;
        !           166: 
        !           167:        if(i >= idx.rank)
        !           168:        switch(f) {
        !           169: 
        !           170:        case 0:
        !           171:                p = sp[-2];
        !           172:                p->index = access();
        !           173:                putdat(sp[-1], getdat(p));
        !           174:                return;
        !           175: 
        !           176:        case 1:
        !           177:                datum = getdat(sp[-idx.rank-3]);
        !           178: 
        !           179:        case 2:
        !           180:                p = ((struct nlist *)sp[-2])->itemp;
        !           181:                p->index = access();
        !           182:                putdat(p, datum);
        !           183:                return;
        !           184:        }
        !           185:        p = sp[-i-3];
        !           186:        if(p->type == EL) {
        !           187:                for(j=0; j<idx.dim[i]; j++) {
        !           188:                        idx.idx[i] = j;
        !           189:                        index1(i+1, f);
        !           190:                }
        !           191:                return;
        !           192:        }
        !           193:        p->index = 0;
        !           194:        for(j=0; j<p->size; j++) {
        !           195:                k = fix(getdat(p)) - thread.iorg;
        !           196:                if(k < 0 || k >= idx.dim[i])
        !           197:                        error("subscript X");
        !           198:                idx.idx[i] = k;
        !           199:                index1(i+1, f);
        !           200:        }
        !           201: }

unix.superglobalmegacorp.com

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