|
|
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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.