Annotation of researchv10no/cmd/sno/sno4.c, revision 1.1.1.1

1.1       root        1: /*     @(#)sno4.c      1.1     */
                      2: #include "sno.h"
                      3: /*
                      4:  * sno4
                      5:  */
                      6: 
                      7: 
                      8: struct node *
                      9: and (ptr)
                     10:        struct node *ptr;
                     11: {
                     12:        register struct node *a, *p;
                     13: 
                     14:        p = ptr;
                     15:        a = p->p1;
                     16:        if (p->typ == 0) {
                     17:                switch (a->typ) {
                     18:                case0:
                     19:                case 0:
                     20:                        a->typ = 1;
                     21:                case 1:
                     22:                        goto l1;
                     23:                case 3:
                     24:                        fflush (stdout);
                     25:                        return (syspit());
                     26:                case 5:
                     27:                        a = a->p2->p1;
                     28:                        goto l1;
                     29:                case 6:
                     30:                        return (binstr (nfree()));
                     31:                }
                     32:                writes ("attempt to take an illegal value");
                     33:                goto case0;
                     34:        l1:
                     35:                a = copy (a->p2);
                     36:        }
                     37:        return (a);
                     38: }
                     39: 
                     40: struct node *
                     41: eval (e, t)
                     42:        struct node *e;
                     43: {
                     44:        struct node *list, *a2, *a3, *a4, *a3base;
                     45:        register struct node *a1, *stack, *op;
                     46: 
                     47:        if (rfail == 1)
                     48:                return (0);
                     49:        stack = 0;
                     50:        list = e;
                     51:        goto l1;
                     52: advanc:
                     53:        list = list->p1;
                     54: l1:
                     55:        switch (list->typ) {
                     56:                default:
                     57:                case 0:
                     58:                if (t == 1) {
                     59:                        a1 = and (stack);
                     60:                        goto e1;
                     61:                }
                     62:                if (stack->typ == 1)
                     63:                        writes ("attempt to store in a value");
                     64:                a1 = stack->p1;
                     65:        e1:
                     66:                stack = pop (stack);
                     67:                if (stack)
                     68:                        writes ("phase error");
                     69:                return (a1);
                     70:        case 12:
                     71:                a1 = and (stack);
                     72:                stack->p1 = look (a1);
                     73:                delete (a1);
                     74:                stack->typ = 0;
                     75:                goto advanc;
                     76:        case 13:
                     77:                if (stack->typ)
                     78:                        writes ("illegal function");
                     79:                a1 = stack->p1;
                     80:                if (a1->typ!=5)
                     81:                        writes ("illegal function");
                     82:                a1 = a1->p2;
                     83:                op = a1->p1;
                     84:                a3base = a3 = salloc();
                     85:                a3->p2 = op->p2;
                     86:                op->p2 = 0;
                     87:                a1 = a1->p2;
                     88:                a2 = list->p2;
                     89:        f1:
                     90:                if (a1!=0 && a2!=0)
                     91:                        goto f2;
                     92:                if (a1!=a2)
                     93:                        writes ("parameters do not match");
                     94:                op = op->p1;
                     95:                goto f3;
                     96:        f2:
                     97:                a3->p1 = a4 = salloc();
                     98:                a3 = a4;
                     99:                a3->p2 = and (a1);
                    100:                assign (a1->p1, eval (a2->p2, 1));/* recursive */
                    101:                a1 = a1->p2;
                    102:                a2 = a2->p1;
                    103:                goto f1;
                    104:        f3:
                    105:                op = execute (op); /* recursive */
                    106:                if (op)
                    107:                        goto f3;
                    108:                a1 = stack->p1->p2;
                    109:                op = a1->p1;
                    110:                a3 = a3base;
                    111:                stack->p1 = op->p2;
                    112:                stack->typ = 1;
                    113:                op->p2 = a3->p2;
                    114:        f4:
                    115:                a4 = a3->p1;
                    116:                sfree (a3);
                    117:                a3 = a4;
                    118:                a1 = a1->p2;
                    119:                if (a1 == 0)
                    120:                        goto advanc;
                    121:                assign (a1->p1, a3->p2);
                    122:                goto f4;
                    123:        case 11:
                    124:        case 10:
                    125:        case 9:
                    126:        case 8:
                    127:        case 7:
                    128:                a1 = and (stack);
                    129:                stack = pop (stack);
                    130:                a2 = and (stack);
                    131:                a3 = doop (list->typ, a2, a1);
                    132:                delete (a1);
                    133:                delete (a2);
                    134:                stack->p1 = a3;
                    135:                stack->typ = 1;
                    136:                goto advanc;
                    137:        case 15:
                    138:                a1 = copy (list->p2);
                    139:                a2 = (struct node *) 1;
                    140:                goto l3;
                    141:        case 14:
                    142:                a1 = list->p2;
                    143:                a2 = 0;
                    144:        l3:
                    145:                stack = push (stack);
                    146:                stack->p1 = a1;
                    147:                stack->typ = (int) a2;
                    148:                goto advanc;
                    149:        }
                    150: }
                    151: 
                    152: struct node *
                    153: doop (op, arg1, arg2)
                    154:        struct node *arg1, *arg2;
                    155: {
                    156:        register struct node *a1, *a2;
                    157: 
                    158:        a1 = arg1;
                    159:        a2 = arg2;
                    160:        switch (op) {
                    161: 
                    162:        case 11:
                    163:                return (div (a1, a2));
                    164:        case 10:
                    165:                return (mult (a1, a2));
                    166:        case 8:
                    167:                return (add (a1, a2));
                    168:        case 9:
                    169:                return (sub (a1, a2));
                    170:        case 7:
                    171:                return (cat (a1, a2));
                    172:        }
                    173:        return (0);
                    174: }
                    175: 
                    176: struct node *
                    177: execute (e)
                    178:        struct node *e;
                    179: {
                    180:        register struct node *r, *b, *c;
                    181:        struct node *m, *ca, *d, *a;
                    182: 
                    183:        r = e->p2;
                    184:        lc = e->ch;
                    185:        switch (e->typ) {
                    186:        case 0: /*  r g */
                    187:                a = r->p1;
                    188:                delete (eval (r->p2, 1));
                    189:                goto xsuc;
                    190:        case 1: /*  r m g */
                    191:                m = r->p1;
                    192:                a = m->p1;
                    193:                b = eval (r->p2, 1);
                    194:                c = search (m, b);
                    195:                delete (b);
                    196:                if (c == 0)
                    197:                        goto xfail;
                    198:                sfree (c);
                    199:                goto xsuc;
                    200:        case 2: /*  r a g */
                    201:                ca = r->p1;
                    202:                a = ca->p1;
                    203:                b = eval (r->p2, 0);
                    204:                assign (b, eval (ca->p2, 1));
                    205:                goto xsuc;
                    206:        case 3: /*  r m a g */
                    207:                m = r->p1;
                    208:                ca = m->p1;
                    209:                a = ca->p1;
                    210:                b = eval (r->p2, 0);
                    211:                d = search (m, b->p2);
                    212:                if (d == 0)
                    213:                        goto xfail;
                    214:                c = eval (ca->p2, 1);
                    215:                if (d->p1 == 0) {
                    216:                        sfree (d);
                    217:                        assign (b, cat (c, b->p2));
                    218:                        delete (c);
                    219:                        goto xsuc;
                    220:                }
                    221:                if (d->p2 == b->p2->p2) {
                    222:                        assign (b, c);
                    223:                        sfree (d);
                    224:                        goto xsuc;
                    225:                }
                    226:                (r=salloc())->p1 = d->p2->p1;
                    227:                r->p2 = b->p2->p2;
                    228:                assign (b, cat (c, r));
                    229:                sfree (d);
                    230:                sfree (r);
                    231:                delete (c);
                    232:                goto xsuc;
                    233:        }
                    234: xsuc:
                    235:        if (rfail)
                    236:                goto xfail;
                    237:        b = a->p1;
                    238:        goto xboth;
                    239: xfail:
                    240:        rfail = 0;
                    241:        b = a->p2;
                    242: xboth:
                    243:        if (b == 0) {
                    244:                return (e->p1);
                    245:        }
                    246:        b = eval (b, 0);
                    247:        if (b == lookret)
                    248:                return (0);
                    249:        if (b == lookfret) {
                    250:                rfail = 1;
                    251:                return (0);
                    252:        }
                    253:        if (b->typ!=2)
                    254:                writes ("attempt to transfer to non-label");
                    255:        return (b->p2);
                    256: }
                    257: 
                    258: assign (adr, val)
                    259:        struct node *adr, *val;
                    260: {
                    261:        register struct node *a, *addr, *value;
                    262: 
                    263:        addr = adr;
                    264:        value = val;
                    265:        if (rfail == 1) {
                    266:                delete (value);
                    267:                return;
                    268:        }
                    269:        switch (addr->typ) {
                    270:        default:
                    271:                writes ("attempt to make an illegal assignment");
                    272:        case 0:
                    273:                addr->typ = 1;
                    274:        case 1:
                    275:                delete (addr->p2);
                    276:                addr->p2 = value;
                    277:                return;
                    278:        case 4:
                    279:                sysput (value);
                    280:                return;
                    281:        case 5:
                    282:                a = addr->p2->p1;
                    283:                delete (a->p2);
                    284:                a->p2 = value;
                    285:                return;
                    286:        }
                    287: }

unix.superglobalmegacorp.com

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