Annotation of 41BSD/cmd/apl/a4.c, revision 1.1.1.1

1.1       root        1: #include "apl.h"
                      2: 
                      3: ex_asgn()
                      4: {
                      5:        register struct nlist *p;
                      6:        register struct item *q;
                      7: 
                      8:        p = sp[-1];
                      9:        if(p->type == QD) {
                     10:                pop();
                     11:                ex_print();
                     12:                return;
                     13:        }
                     14:        if(p->type == QC) {
                     15:                pop();
                     16:                ex_plot();
                     17:                return;
                     18:        }
                     19:        if(p->type != LV)
                     20:                error("asgn lv");
                     21:        if(p->use != 0 && p->use != DA)
                     22:                error("asgn var");
                     23:        sp--;
                     24:        q = fetch1();
                     25:        erase(p);
                     26:        p->use = DA;
                     27:        p->itemp = q;
                     28:        sp[-1] = p;
                     29: }
                     30: 
                     31: ex_elid()
                     32: {
                     33: 
                     34:        push(newdat(EL,0,0));
                     35: }
                     36: 
                     37: ex_index()
                     38: {
                     39:        register struct item *p;
                     40:        struct item *q;
                     41:        register i, j;
                     42:        int f, n, lv;
                     43: 
                     44:        n = *pcp++;
                     45:        f = *pcp;
                     46:        p = sp[-1];
                     47:        if(f == ASGN) {
                     48:                pcp++;
                     49:                if(p->type != LV)
                     50:                        error("indexed assign value");
                     51:                if(p->use != DA)
                     52:                        fetch1(); /* error("used before set"); */
                     53:                q = p->itemp;
                     54:        } else
                     55:                q = fetch1();
                     56:        if(q->rank != n)
                     57:                error("subscript C");
                     58:        idx.rank = 0;
                     59:        for(i=0; i<n; i++) {
                     60:                p = sp[-i-2];
                     61:                if(p->type == EL) {
                     62:                        idx.dim[idx.rank++] =
                     63:                                q->dim[i];
                     64:                        continue;
                     65:                }
                     66:                p = fetch(p);
                     67:                sp[-i-2] = p;
                     68:                for(j=0; j<p->rank; j++)
                     69:                        idx.dim[idx.rank++] =
                     70:                                p->dim[j];
                     71:        }
                     72:        size();
                     73:        if(f == ASGN) {
                     74:                p = fetch(sp[-n-2]);
                     75:                sp[-n-2] = p;
                     76:                if(p->size > 1) {
                     77:                        if(idx.size != p->size)
                     78:                                error("assign C");
                     79:                        f = 1; /* v[i] <- v */
                     80:                } else {
                     81:                        datum = getdat(p);
                     82:                        f = 2; /* v[i] <- s */
                     83:                }
                     84:                ex_elid();
                     85:        } else {
                     86:                p = newdat(q->type, idx.rank, idx.size);
                     87:                copy(IN, idx.dim, p->dim, idx.rank);
                     88:                push(p);
                     89:                f = 0; /* v[i] */
                     90:        }
                     91:        bidx(q);
                     92:        index1(0, f);
                     93:        if(f == 0) {
                     94:                p = sp[-1];
                     95:                sp--;
                     96:                for(i=0; i<=n; i++)
                     97:                        pop();
                     98:                push(p);
                     99:        } else {
                    100:                sp -= 2;
                    101:                for(i=0; i<n; i++)
                    102:                        pop();
                    103:        }
                    104: }
                    105: 
                    106: index1(i, f)
                    107: {
                    108:        register struct item *p;
                    109:        register j, k;
                    110: 
                    111:        if(i >= idx.rank)
                    112:        switch(f) {
                    113: 
                    114:        case 0:
                    115:                p = sp[-2];
                    116:                p->index = access();
                    117:                putdat(sp[-1], getdat(p));
                    118:                return;
                    119: 
                    120:        case 1:
                    121:                datum = getdat(sp[-idx.rank-3]);
                    122: 
                    123:        case 2:
                    124:                p = sp[-2]->itemp;
                    125:                p->index = access();
                    126:                putdat(p, datum);
                    127:                return;
                    128:        }
                    129:        p = sp[-i-3];
                    130:        if(p->type == EL) {
                    131:                for(j=0; j<idx.dim[i]; j++) {
                    132:                        idx.idx[i] = j;
                    133:                        index1(i+1, f);
                    134:                }
                    135:                return;
                    136:        }
                    137:        p->index = 0;
                    138:        for(j=0; j<p->size; j++) {
                    139:                k = fix(getdat(p)) - thread.iorg;
                    140:                if(k < 0 || k > idx.dim[i])
                    141:                        error("subscript X");
                    142:                idx.idx[i] = k;
                    143:                index1(i+1, f);
                    144:        }
                    145: }

unix.superglobalmegacorp.com

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