|
|
1.1 ! root 1: /* @(#)sno1.c 1.2 */ ! 2: #include "sno.h" ! 3: #define INCR 200 ! 4: ! 5: /* ! 6: * Snobol III ! 7: */ ! 8: ! 9: ! 10: int incomp; ! 11: int freesize; ! 12: struct node *lookf; ! 13: struct node *looks; ! 14: struct node *lookend; ! 15: struct node *lookstart; ! 16: struct node *lookdef; ! 17: struct node *lookret; ! 18: struct node *lookfret; ! 19: int cfail; ! 20: int rfail; ! 21: struct node *freelist, *freespace; ! 22: struct node *namelist; ! 23: int lc; ! 24: struct node *schar; ! 25: FILE *fin; ! 26: int xargc; ! 27: char **xargv; ! 28: ! 29: char *malloc(); ! 30: ! 31: struct node * ! 32: init (s, t) ! 33: char *s; ! 34: { ! 35: register struct node *a, *b; ! 36: ! 37: a = strst1 (s); ! 38: b = look (a); ! 39: delete (a); ! 40: b->typ = t; ! 41: return (b); ! 42: } ! 43: ! 44: main (argc, argv) ! 45: char *argv[]; ! 46: { ! 47: register struct node *a, *b, *c; ! 48: static char stdbuf[BUFSIZ]; ! 49: ! 50: setbuf (stdout, stdbuf); ! 51: ncinit (argc, argv); ! 52: lookf = init ("f", 0); ! 53: looks = init ("s", 0); ! 54: lookend = init ("end", 0); ! 55: lookstart = init ("start", 0); ! 56: lookdef = init ("define", 0); ! 57: lookret = init ("return", 0); ! 58: lookfret = init ("freturn", 0); ! 59: init ("syspit", 3); ! 60: init ("syspot", 4); ! 61: incomp = 1; ! 62: a = c = compile(); ! 63: while (lookend->typ != 2) { ! 64: a->p1 = b = compile(); ! 65: a = b; ! 66: } ! 67: cfail = 1; ! 68: a->p1 = 0; ! 69: if (lookstart->typ == 2) ! 70: c = lookstart->p2; ! 71: incomp = 0; ! 72: while (c=execute (c)); ! 73: } ! 74: ! 75: struct node * ! 76: syspit() ! 77: { ! 78: register struct node *b, *c, *d; ! 79: int a; ! 80: char nextchar(); ! 81: ! 82: a = nextchar(); ! 83: if (a == '\n') ! 84: return (0); ! 85: if((a == '*') && incomp){ ! 86: while(nextchar() != '\n') ; ! 87: return 0; ! 88: } ! 89: b = c = salloc(); ! 90: while (a != '\n') { ! 91: c->p1 = d = salloc(); ! 92: c = d; ! 93: c->ch = a; ! 94: if (a == '\0') { ! 95: rfail = 1; ! 96: break; ! 97: } ! 98: a = nextchar(); ! 99: } ! 100: b->p2 = c; ! 101: if (rfail) { ! 102: delete (b); ! 103: b = 0; ! 104: } ! 105: return (b); ! 106: } ! 107: ! 108: syspot (string) ! 109: struct node *string; ! 110: { ! 111: register struct node *a, *b, *s; ! 112: ! 113: s = string; ! 114: if (s!=0) { ! 115: a = s; ! 116: b = s->p2; ! 117: while (a != b) { ! 118: a = a->p1; ! 119: putchar (a->ch); ! 120: } ! 121: } ! 122: putchar ('\n'); ! 123: } ! 124: ! 125: struct node * ! 126: strst1 (s) ! 127: char s[]; ! 128: { ! 129: int c; ! 130: register struct node *e, *f, *d; ! 131: ! 132: d = f = salloc(); ! 133: while ((c = *s++)!='\0') { ! 134: (e=salloc())->ch = c; ! 135: f->p1 = e; ! 136: f = e; ! 137: } ! 138: d->p2 = e; ! 139: return (d); ! 140: } ! 141: ! 142: class (c) ! 143: { ! 144: switch (c) { ! 145: case ')': return (1); ! 146: case '(': return (2); ! 147: case '\t': ! 148: case ' ': return (3); ! 149: case '+': return (4); ! 150: case '-': return (5); ! 151: case '*': return (6); ! 152: case '/': return (7); ! 153: case '$': return (8); ! 154: case '"': ! 155: case '\'': return (9); ! 156: case '=': return (10); ! 157: case ',': return (11); ! 158: } ! 159: return (0); ! 160: } ! 161: ! 162: struct node * ! 163: salloc() ! 164: { ! 165: register struct node *f; ! 166: register char *i; ! 167: ! 168: if (freelist==0) { ! 169: if (--freesize < 0) { ! 170: if ((i=malloc (INCR * sizeof (struct node))) == NULL) { ! 171: puts ("Out of free space"); ! 172: exit (1); ! 173: } ! 174: freesize = INCR - 1; ! 175: freespace = (struct node *) i; ! 176: } ! 177: return (freespace++); ! 178: } ! 179: f = freelist; ! 180: freelist = freelist->p1; ! 181: return (f); ! 182: } ! 183: ! 184: sfree (pointer) ! 185: struct node *pointer; ! 186: { ! 187: pointer->p1 = freelist; ! 188: freelist = pointer; ! 189: } ! 190: ! 191: int ! 192: nfree() ! 193: { ! 194: register int i; ! 195: register struct node *a; ! 196: ! 197: i = freesize; ! 198: a = freelist; ! 199: while (a) { ! 200: a = a->p1; ! 201: i++; ! 202: } ! 203: return (i); ! 204: } ! 205: ! 206: struct node * ! 207: look (string) ! 208: struct node *string; ! 209: { ! 210: register struct node *i, *j, *k; ! 211: ! 212: k = 0; ! 213: i = namelist; ! 214: while (i) { ! 215: j = i->p1; ! 216: if (equal (j->p1, string) == 0) ! 217: return (j); ! 218: i = (k=i)->p2; ! 219: } ! 220: i = salloc(); ! 221: i->p2 = 0; ! 222: if (k) ! 223: k->p2 = i; ! 224: else ! 225: namelist = i; ! 226: j = salloc(); ! 227: i->p1 = j; ! 228: j->p1 = copy (string); ! 229: j->p2 = 0; ! 230: j->typ = 0; ! 231: return (j); ! 232: } ! 233: ! 234: struct node * ! 235: copy (string) ! 236: struct node *string; ! 237: { ! 238: register struct node *j, *l, *m; ! 239: struct node *i, *k; ! 240: ! 241: if (string == 0) ! 242: return (0); ! 243: i = l = salloc(); ! 244: j = string; ! 245: k = string->p2; ! 246: while (j != k) { ! 247: m = salloc(); ! 248: m->ch = (j=j->p1)->ch; ! 249: l->p1 = m; ! 250: l = m; ! 251: } ! 252: i->p2 = l; ! 253: return (i); ! 254: } ! 255: ! 256: int ! 257: equal (string1, string2) ! 258: struct node *string1, *string2; ! 259: { ! 260: register struct node *i, *j, *k; ! 261: struct node *l; ! 262: int n, m; ! 263: ! 264: if (string1==0) { ! 265: if (string2==0) ! 266: return (0); ! 267: return (-1); ! 268: } ! 269: if (string2==0) ! 270: return (1); ! 271: i = string1; ! 272: j = string1->p2; ! 273: k = string2; ! 274: l = string2->p2; ! 275: for (;;) { ! 276: m = (i=i->p1)->ch; ! 277: n = (k=k->p1)->ch; ! 278: if (m>n) ! 279: return (1); ! 280: if (m<n) ! 281: return (-1); ! 282: if (i==j) { ! 283: if (k==l) ! 284: return (0); ! 285: return (-1); ! 286: } ! 287: if (k==l) ! 288: return (1); ! 289: } ! 290: } ! 291: ! 292: int ! 293: strbin (string) ! 294: struct node *string; ! 295: { ! 296: int n, m, sign; ! 297: register struct node *p, *q, *s; ! 298: ! 299: s = string; ! 300: n = 0; ! 301: if (s==0) ! 302: return (0); ! 303: p = s->p1; ! 304: q = s->p2; ! 305: sign = 1; ! 306: if (class (p->ch)==5) { /* minus */ ! 307: sign = -1; ! 308: if (p==q) ! 309: return (0); ! 310: p = p->p1; ! 311: } ! 312: loop: ! 313: m = p->ch - '0'; ! 314: if (m>9 || m<0) ! 315: writes ("bad integer string"); ! 316: n = n * 10 + m; ! 317: if (p==q) ! 318: return (n*sign); ! 319: p = p->p1; ! 320: goto loop; ! 321: } ! 322: ! 323: struct node * ! 324: binstr (binary) ! 325: { ! 326: int n, sign; ! 327: register struct node *m, *p, *q; ! 328: ! 329: n = binary; ! 330: p = salloc(); ! 331: q = salloc(); ! 332: sign = 1; ! 333: if (binary<0) { ! 334: sign = -1; ! 335: n = -binary; ! 336: } ! 337: p->p2 = q; ! 338: loop: ! 339: q->ch = n%10+'0'; ! 340: n = n / 10; ! 341: if (n==0) { ! 342: if (sign<0) { ! 343: m = salloc(); ! 344: m->p1 = q; ! 345: q = m; ! 346: q->ch = '-'; ! 347: } ! 348: p->p1 = q; ! 349: return (p); ! 350: } ! 351: m = salloc(); ! 352: m->p1 = q; ! 353: q = m; ! 354: goto loop; ! 355: } ! 356: ! 357: struct node * ! 358: add (string1, string2) ! 359: register struct node *string1, *string2; ! 360: { ! 361: return (binstr (strbin (string1) + strbin (string2))); ! 362: } ! 363: ! 364: struct node * ! 365: sub (string1, string2) ! 366: register struct node *string1, *string2; ! 367: { ! 368: return (binstr (strbin (string1) - strbin (string2))); ! 369: } ! 370: ! 371: struct node * ! 372: mult (string1, string2) ! 373: register struct node *string1, *string2; ! 374: { ! 375: return (binstr (strbin (string1) * strbin (string2))); ! 376: } ! 377: ! 378: struct node * ! 379: div (string1, string2) ! 380: register struct node *string1, *string2; ! 381: { ! 382: return (binstr (strbin (string1) / strbin (string2))); ! 383: } ! 384: ! 385: struct node * ! 386: cat (string1, string2) ! 387: struct node *string1, *string2; ! 388: { ! 389: register struct node *a, *b; ! 390: ! 391: if (string1==0) ! 392: return (copy (string2)); ! 393: if (string2==0) ! 394: return (copy (string1)); ! 395: a = copy (string1); ! 396: b = copy (string2); ! 397: a->p2->p1 = b->p1; ! 398: a->p2 = b->p2; ! 399: sfree (b); ! 400: return (a); ! 401: } ! 402: ! 403: struct node * ! 404: dcat (a,b) ! 405: struct node *a, *b; ! 406: { ! 407: register struct node *c; ! 408: ! 409: c = cat (a,b); ! 410: delete (a); ! 411: delete (b); ! 412: return (c); ! 413: } ! 414: ! 415: delete (string) ! 416: struct node *string; ! 417: { ! 418: register struct node *a, *b, *c; ! 419: ! 420: if (string==0) ! 421: return; ! 422: a = string; ! 423: b = string->p2; ! 424: while (a != b) { ! 425: c = a->p1; ! 426: sfree (a); ! 427: a = c; ! 428: } ! 429: sfree (a); ! 430: } ! 431: ! 432: sysput (string) ! 433: struct node *string; ! 434: { ! 435: syspot (string); ! 436: delete (string); ! 437: } ! 438: ! 439: dump() ! 440: { ! 441: dump1 (namelist); ! 442: } ! 443: ! 444: dump1 (base) ! 445: struct node *base; ! 446: { ! 447: register struct node *b, *c, *e; ! 448: struct node *d; ! 449: ! 450: while (base) { ! 451: b = base->p1; ! 452: c = binstr (b->typ); ! 453: d = strst1 (" "); ! 454: e = dcat (c, d); ! 455: sysput (cat (e, b->p1)); ! 456: delete (e); ! 457: if (b->typ==1) { ! 458: c = strst1 (" "); ! 459: sysput (cat (c, b->p2)); ! 460: delete (c); ! 461: } ! 462: base = base->p2; ! 463: } ! 464: } ! 465: ! 466: writes (s) ! 467: char *s; ! 468: { ! 469: sysput (dcat (binstr (lc),dcat (strst1 ("\t"),strst1 (s)))); ! 470: fflush (stdout); ! 471: if (cfail) { ! 472: dump(); ! 473: fflush (stdout); ! 474: exit (1); ! 475: } ! 476: while (sgetc()); ! 477: while (compile()); ! 478: fflush (stdout); ! 479: exit (1); ! 480: } ! 481: ! 482: struct node * ! 483: sgetc() ! 484: { ! 485: register struct node *a; ! 486: static struct node *line; ! 487: static linflg; ! 488: ! 489: while (line==0) { ! 490: line = syspit(); ! 491: if (rfail) { ! 492: cfail++; ! 493: writes ("eof on input"); ! 494: } ! 495: lc++; ! 496: } ! 497: if (linflg) { ! 498: line = 0; ! 499: linflg = 0; ! 500: return (0); ! 501: } ! 502: a = line->p1; ! 503: if (a==line->p2) { ! 504: sfree (line); ! 505: linflg++; ! 506: } else ! 507: line->p1 = a->p1; ! 508: return (a); ! 509: } ! 510: ! 511: ncinit (argc, argv) ! 512: int argc; ! 513: char *argv[]; ! 514: { ! 515: xargc = argc - 1; ! 516: xargv = argv + 1; ! 517: ncswitch(); ! 518: } ! 519: ! 520: ncswitch() ! 521: { ! 522: if (fin && fin != stdin) ! 523: fclose (fin); ! 524: if (xargc > 0) { ! 525: fin = fopen (*xargv, "r"); ! 526: if (fin == NULL) { ! 527: fputs ("Cannot open ", stdout); ! 528: fputs (*xargv, stdout); ! 529: putchar ('\n'); ! 530: exit (1); ! 531: } ! 532: xargv++; ! 533: xargc--; ! 534: } else ! 535: fin = stdin; ! 536: } ! 537: ! 538: char ! 539: nextchar() ! 540: { ! 541: register int a; ! 542: ! 543: a = getc (fin); ! 544: if (a == EOF) { ! 545: while (a == EOF && fin != stdin) { ! 546: ncswitch(); ! 547: a = getc (fin); ! 548: } ! 549: if (a == EOF) ! 550: a = 0; ! 551: } ! 552: return a; ! 553: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.