|
|
1.1 ! root 1: #include <stdio.h> ! 2: #include <signal.h> ! 3: #include "dc.h" ! 4: #define LASTFUN 026 ! 5: main(argc,argv) ! 6: int argc; ! 7: char *argv[]; ! 8: { ! 9: init(argc,argv); ! 10: commnds(); ! 11: } ! 12: commnds(){ ! 13: register int c; ! 14: register struct blk *p,*q; ! 15: long l; ! 16: int sign; ! 17: struct blk **ptr,*s,*t; ! 18: struct sym *sp; ! 19: int sk,sk1,sk2; ! 20: int n,d; ! 21: ! 22: while(1){ ! 23: if(((c = readc())>='0' && c <= '9')|| (c>='A' && c <='F') || c == '.'){ ! 24: unreadc(c); ! 25: p = readin(); ! 26: pushp(p); ! 27: continue; ! 28: } ! 29: switch(c){ ! 30: case ' ': ! 31: case '\n': ! 32: case 0377: ! 33: case EOF: ! 34: continue; ! 35: case 'Y': ! 36: sdump("stk",*stkptr); ! 37: printf("all %ld rel %ld headmor %ld\n",all,rel,headmor); ! 38: printf("nbytes %ld\n",nbytes); ! 39: continue; ! 40: case '_': ! 41: p = readin(); ! 42: savk = sunputc(p); ! 43: chsign(p); ! 44: sputc(p,savk); ! 45: pushp(p); ! 46: continue; ! 47: case '-': ! 48: subt(); ! 49: continue; ! 50: case '+': ! 51: if(eqk() != 0)continue; ! 52: binop('+'); ! 53: continue; ! 54: case '*': ! 55: arg1 = pop(); ! 56: EMPTY; ! 57: arg2 = pop(); ! 58: EMPTYR(arg1); ! 59: sk1 = sunputc(arg1); ! 60: sk2 = sunputc(arg2); ! 61: binop('*'); ! 62: p = pop(); ! 63: sunputc(p); ! 64: savk = sk1+sk2; ! 65: if(savk>k && savk>sk1 && savk>sk2){ ! 66: sk = sk1; ! 67: if(sk<sk2)sk = sk2; ! 68: if(sk<k)sk = k; ! 69: p = removc(p,savk-sk); ! 70: savk = sk; ! 71: } ! 72: sputc(p,savk); ! 73: pushp(p); ! 74: continue; ! 75: case '/': ! 76: casediv: ! 77: if(dscale() != 0)continue; ! 78: binop('/'); ! 79: if(irem != 0)release(irem); ! 80: release(rem); ! 81: continue; ! 82: case '%': ! 83: if(dscale() != 0)continue; ! 84: binop('/'); ! 85: p = pop(); ! 86: release(p); ! 87: if(irem == 0){ ! 88: sputc(rem,skr+k); ! 89: pushp(rem); ! 90: continue; ! 91: } ! 92: p = add0(rem,skd-(skr+k)); ! 93: q = add(p,irem); ! 94: release(p); ! 95: release(irem); ! 96: sputc(q,skd); ! 97: pushp(q); ! 98: continue; ! 99: case 'v': ! 100: p = pop(); ! 101: EMPTY; ! 102: savk = sunputc(p); ! 103: if(length(p) == 0){ ! 104: sputc(p,savk); ! 105: pushp(p); ! 106: continue; ! 107: } ! 108: if((c = sbackc(p))<0){ ! 109: error("sqrt of neg number\n"); ! 110: } ! 111: if(k<savk)n = savk; ! 112: else{ ! 113: n = k*2-savk; ! 114: savk = k; ! 115: } ! 116: arg1 = add0(p,n); ! 117: arg2 = sqrt(arg1); ! 118: sputc(arg2,savk); ! 119: pushp(arg2); ! 120: continue; ! 121: case '^': ! 122: neg = 0; ! 123: arg1 = pop(); ! 124: EMPTY; ! 125: if(sunputc(arg1) != 0)error("exp not an integer\n"); ! 126: arg2 = pop(); ! 127: EMPTYR(arg1); ! 128: if(sfbeg(arg1) == 0 && sbackc(arg1)<0){ ! 129: neg++; ! 130: chsign(arg1); ! 131: } ! 132: if(length(arg1)>=3){ ! 133: error("exp too big\n"); ! 134: } ! 135: savk = sunputc(arg2); ! 136: p = exp(arg2,arg1); ! 137: release(arg2); ! 138: rewind(arg1); ! 139: c = sgetc(arg1); ! 140: if(c == EOF)c = 0; ! 141: else if(sfeof(arg1) == 0) ! 142: c = sgetc(arg1)*100 + c; ! 143: d = c*savk; ! 144: release(arg1); ! 145: if(neg == 0){ ! 146: if(k>=savk)n = k; ! 147: else n = savk; ! 148: if(n<d){ ! 149: q = removc(p,d-n); ! 150: sputc(q,n); ! 151: pushp(q); ! 152: } ! 153: else { ! 154: sputc(p,d); ! 155: pushp(p); ! 156: } ! 157: } ! 158: else { ! 159: sputc(p,d); ! 160: pushp(p); ! 161: } ! 162: if(neg == 0)continue; ! 163: p = pop(); ! 164: q = salloc(2); ! 165: sputc(q,1); ! 166: sputc(q,0); ! 167: pushp(q); ! 168: pushp(p); ! 169: goto casediv; ! 170: case 'z': ! 171: p = salloc(2); ! 172: n = stkptr - stkbeg; ! 173: if(n >= 100){ ! 174: sputc(p,n/100); ! 175: n %= 100; ! 176: } ! 177: sputc(p,n); ! 178: sputc(p,0); ! 179: pushp(p); ! 180: continue; ! 181: case 'Z': ! 182: p = pop(); ! 183: EMPTY; ! 184: n = (length(p)-1)<<1; ! 185: fsfile(p); ! 186: sbackc(p); ! 187: if(sfbeg(p) == 0){ ! 188: if((c = sbackc(p))<0){ ! 189: n -= 2; ! 190: if(sfbeg(p) == 1)n += 1; ! 191: else { ! 192: if((c = sbackc(p)) == 0)n += 1; ! 193: else if(c > 90)n -= 1; ! 194: } ! 195: } ! 196: else if(c < 10) n -= 1; ! 197: } ! 198: release(p); ! 199: q = salloc(1); ! 200: if(n >= 100){ ! 201: sputc(q,n%100); ! 202: n /= 100; ! 203: } ! 204: sputc(q,n); ! 205: sputc(q,0); ! 206: pushp(q); ! 207: continue; ! 208: case 'i': ! 209: p = pop(); ! 210: EMPTY; ! 211: p = scalint(p); ! 212: release(inbas); ! 213: inbas = p; ! 214: continue; ! 215: case 'I': ! 216: p = copy(inbas,length(inbas)+1); ! 217: sputc(p,0); ! 218: pushp(p); ! 219: continue; ! 220: case 'o': ! 221: p = pop(); ! 222: EMPTY; ! 223: p = scalint(p); ! 224: sign = 0; ! 225: n = length(p); ! 226: q = copy(p,n); ! 227: fsfile(q); ! 228: l = c = sbackc(q); ! 229: if(n != 1){ ! 230: if(c<0){ ! 231: sign = 1; ! 232: chsign(q); ! 233: n = length(q); ! 234: fsfile(q); ! 235: l = c = sbackc(q); ! 236: } ! 237: if(n != 1){ ! 238: while(sfbeg(q) == 0)l = l*100+sbackc(q); ! 239: } ! 240: } ! 241: logo = log2(l); ! 242: obase = l; ! 243: release(basptr); ! 244: if(sign == 1)obase = -l; ! 245: basptr = p; ! 246: outdit = bigot; ! 247: if(n == 1 && sign == 0){ ! 248: if(c <= 16){ ! 249: outdit = hexot; ! 250: fw = 1; ! 251: fw1 = 0; ! 252: ll = 70; ! 253: release(q); ! 254: continue; ! 255: } ! 256: } ! 257: n = 0; ! 258: if(sign == 1)n++; ! 259: p = salloc(1); ! 260: sputc(p,-1); ! 261: t = add(p,q); ! 262: n += length(t)*2; ! 263: fsfile(t); ! 264: if((c = sbackc(t))>9)n++; ! 265: release(t); ! 266: release(q); ! 267: release(p); ! 268: fw = n; ! 269: fw1 = n-1; ! 270: ll = 70; ! 271: if(fw>=ll)continue; ! 272: ll = (70/fw)*fw; ! 273: continue; ! 274: case 'O': ! 275: p = copy(basptr,length(basptr)+1); ! 276: sputc(p,0); ! 277: pushp(p); ! 278: continue; ! 279: case '[': ! 280: n = 0; ! 281: p = salloc(0); ! 282: while(1){ ! 283: if((c = readc()) == ']'){ ! 284: if(n == 0)break; ! 285: n--; ! 286: } ! 287: sputc(p,c); ! 288: if(c == '[')n++; ! 289: } ! 290: pushp(p); ! 291: continue; ! 292: case 'k': ! 293: p = pop(); ! 294: EMPTY; ! 295: p = scalint(p); ! 296: if(length(p)>1){ ! 297: error("scale too big\n"); ! 298: } ! 299: rewind(p); ! 300: k = sfeof(p)?0:sgetc(p); ! 301: release(scalptr); ! 302: scalptr = p; ! 303: continue; ! 304: case 'K': ! 305: p = copy(scalptr,length(scalptr)+1); ! 306: sputc(p,0); ! 307: pushp(p); ! 308: continue; ! 309: case 'X': ! 310: p = pop(); ! 311: EMPTY; ! 312: fsfile(p); ! 313: n = sbackc(p); ! 314: release(p); ! 315: p = salloc(2); ! 316: sputc(p,n); ! 317: sputc(p,0); ! 318: pushp(p); ! 319: continue; ! 320: case 'Q': ! 321: p = pop(); ! 322: EMPTY; ! 323: if(length(p)>2){ ! 324: error("Q?\n"); ! 325: } ! 326: rewind(p); ! 327: if((c = sgetc(p))<0){ ! 328: error("neg Q\n"); ! 329: } ! 330: release(p); ! 331: while(c-- > 0){ ! 332: if(readptr == &readstk[0]){ ! 333: error("readstk?\n"); ! 334: } ! 335: if(*readptr != 0)release(*readptr); ! 336: readptr--; ! 337: } ! 338: continue; ! 339: case 'q': ! 340: if(readptr <= &readstk[1])exit(0); ! 341: if(*readptr != 0)release(*readptr); ! 342: readptr--; ! 343: if(*readptr != 0)release(*readptr); ! 344: readptr--; ! 345: continue; ! 346: case 'f': ! 347: if(stkptr == &stack[0])printf("empty stack\n"); ! 348: else { ! 349: for(ptr = stkptr; ptr > &stack[0];){ ! 350: print(*ptr--); ! 351: } ! 352: } ! 353: continue; ! 354: case 'p': ! 355: if(stkptr == &stack[0])printf("empty stack\n"); ! 356: else{ ! 357: print(*stkptr); ! 358: } ! 359: continue; ! 360: case 'P': ! 361: p = pop(); ! 362: EMPTY; ! 363: sputc(p,0); ! 364: printf("%s",p->beg); ! 365: release(p); ! 366: continue; ! 367: case 'd': ! 368: if(stkptr == &stack[0]){ ! 369: printf("empty stack\n"); ! 370: continue; ! 371: } ! 372: q = *stkptr; ! 373: n = length(q); ! 374: p = copy(*stkptr,n); ! 375: pushp(p); ! 376: continue; ! 377: case 'c': ! 378: while(stkerr == 0){ ! 379: p = pop(); ! 380: if(stkerr == 0)release(p); ! 381: } ! 382: continue; ! 383: case 'S': ! 384: if(stkptr == &stack[0]){ ! 385: error("save: args\n"); ! 386: } ! 387: c = readc() & 0377; ! 388: sptr = stable[c]; ! 389: sp = stable[c] = sfree; ! 390: sfree = sfree->next; ! 391: if(sfree == 0)goto sempty; ! 392: sp->next = sptr; ! 393: p = pop(); ! 394: EMPTY; ! 395: if(c >= ARRAYST){ ! 396: q = copy(p,length(p)+PTRSZ); ! 397: for(n = 0;n < PTRSZ;n++){ ! 398: sputc(q,0); ! 399: } ! 400: release(p); ! 401: p = q; ! 402: } ! 403: sp->val = p; ! 404: continue; ! 405: sempty: ! 406: error("symbol table overflow\n"); ! 407: case 's': ! 408: if(stkptr == &stack[0]){ ! 409: error("save:args\n"); ! 410: } ! 411: c = readc() & 0377; ! 412: sptr = stable[c]; ! 413: if(sptr != 0){ ! 414: p = sptr->val; ! 415: if(c >= ARRAYST){ ! 416: rewind(p); ! 417: while(sfeof(p) == 0)release(getwd(p)); ! 418: } ! 419: release(p); ! 420: } ! 421: else{ ! 422: sptr = stable[c] = sfree; ! 423: sfree = sfree->next; ! 424: if(sfree == 0)goto sempty; ! 425: sptr->next = 0; ! 426: } ! 427: p = pop(); ! 428: sptr->val = p; ! 429: continue; ! 430: case 'l': ! 431: load(); ! 432: continue; ! 433: case 'L': ! 434: c = readc() & 0377; ! 435: sptr = stable[c]; ! 436: if(sptr == 0){ ! 437: error("L?\n"); ! 438: } ! 439: stable[c] = sptr->next; ! 440: sptr->next = sfree; ! 441: sfree = sptr; ! 442: p = sptr->val; ! 443: if(c >= ARRAYST){ ! 444: rewind(p); ! 445: while(sfeof(p) == 0){ ! 446: q = getwd(p); ! 447: if(q != 0)release(q); ! 448: } ! 449: } ! 450: pushp(p); ! 451: continue; ! 452: case ':': ! 453: p = pop(); ! 454: EMPTY; ! 455: q = scalint(p); ! 456: fsfile(q); ! 457: c = 0; ! 458: if((sfbeg(q) == 0) && ((c = sbackc(q))<0)){ ! 459: error("neg index\n"); ! 460: } ! 461: if(length(q)>2){ ! 462: error("index too big\n"); ! 463: } ! 464: if(sfbeg(q) == 0)c = c*100+sbackc(q); ! 465: if(c >= MAXIND){ ! 466: error("index too big\n"); ! 467: } ! 468: release(q); ! 469: n = readc() & 0377; ! 470: sptr = stable[n]; ! 471: if(sptr == 0){ ! 472: sptr = stable[n] = sfree; ! 473: sfree = sfree->next; ! 474: if(sfree == 0)goto sempty; ! 475: sptr->next = 0; ! 476: p = salloc((c+PTRSZ)*PTRSZ); ! 477: zero(p); ! 478: } ! 479: else{ ! 480: p = sptr->val; ! 481: if(length(p)-PTRSZ < c*PTRSZ){ ! 482: q = copy(p,(c+PTRSZ)*PTRSZ); ! 483: release(p); ! 484: p = q; ! 485: } ! 486: } ! 487: seekc(p,c*PTRSZ); ! 488: q = lookwd(p); ! 489: if (q!=NULL) release(q); ! 490: s = pop(); ! 491: EMPTY; ! 492: salterwd(p,s); ! 493: sptr->val = p; ! 494: continue; ! 495: case ';': ! 496: p = pop(); ! 497: EMPTY; ! 498: q = scalint(p); ! 499: fsfile(q); ! 500: c = 0; ! 501: if((sfbeg(q) == 0) && ((c = sbackc(q))<0)){ ! 502: error("neg index\n"); ! 503: } ! 504: if(length(q)>2){ ! 505: error("index too big\n"); ! 506: } ! 507: if(sfbeg(q) == 0)c = c*100+sbackc(q); ! 508: if(c >= MAXIND){ ! 509: error("index too big\n"); ! 510: } ! 511: release(q); ! 512: n = readc() & 0377; ! 513: sptr = stable[n]; ! 514: if(sptr != 0){ ! 515: p = sptr->val; ! 516: if(length(p)-PTRSZ >= c*PTRSZ){ ! 517: seekc(p,c*PTRSZ); ! 518: s = getwd(p); ! 519: if(s != 0){ ! 520: q = copy(s,length(s)); ! 521: pushp(q); ! 522: continue; ! 523: } ! 524: } ! 525: } ! 526: q = salloc(PTRSZ); ! 527: putwd(q, (struct blk *)0); ! 528: pushp(q); ! 529: continue; ! 530: case 'x': ! 531: execute: ! 532: p = pop(); ! 533: EMPTY; ! 534: if((readptr != &readstk[0]) && (*readptr != 0)){ ! 535: if((*readptr)->rd == (*readptr)->wt) ! 536: release(*readptr); ! 537: else{ ! 538: if(readptr++ == &readstk[RDSKSZ]){ ! 539: error("nesting depth\n"); ! 540: } ! 541: } ! 542: } ! 543: else readptr++; ! 544: *readptr = p; ! 545: if(p != 0)rewind(p); ! 546: else{ ! 547: if((c = readc()) != '\n')unreadc(c); ! 548: } ! 549: continue; ! 550: case '?': ! 551: if(++readptr == &readstk[RDSKSZ]){ ! 552: error("nesting depth\n"); ! 553: } ! 554: *readptr = 0; ! 555: fsave = curfile; ! 556: curfile = stdin; ! 557: while((c = readc()) == '!')command(); ! 558: p = salloc(0); ! 559: sputc(p,c); ! 560: while((c = readc()) != '\n'){ ! 561: sputc(p,c); ! 562: if(c == '\\')sputc(p,readc()); ! 563: } ! 564: curfile = fsave; ! 565: *readptr = p; ! 566: continue; ! 567: case '!': ! 568: if(command() == 1)goto execute; ! 569: continue; ! 570: case '<': ! 571: case '>': ! 572: case '=': ! 573: if(cond(c) == 1)goto execute; ! 574: continue; ! 575: default: ! 576: printf("%o is unimplemented\n",c); ! 577: } ! 578: } ! 579: } ! 580: struct blk * ! 581: div(ddivd,ddivr) ! 582: struct blk *ddivd,*ddivr; ! 583: { ! 584: int divsign,remsign,offset,divcarry; ! 585: int carry, dig,magic,d,dd; ! 586: long c,td,cc; ! 587: struct blk *ps; ! 588: register struct blk *p,*divd,*divr; ! 589: ! 590: rem = 0; ! 591: p = salloc(0); ! 592: if(length(ddivr) == 0){ ! 593: pushp(ddivr); ! 594: printf("divide by 0\n"); ! 595: return(p); ! 596: } ! 597: divsign = remsign = 0; ! 598: divr = ddivr; ! 599: fsfile(divr); ! 600: if(sbackc(divr) == -1){ ! 601: divr = copy(ddivr,length(ddivr)); ! 602: chsign(divr); ! 603: divsign = ~divsign; ! 604: } ! 605: divd = copy(ddivd,length(ddivd)); ! 606: fsfile(divd); ! 607: if(sfbeg(divd) == 0 && sbackc(divd) == -1){ ! 608: chsign(divd); ! 609: divsign = ~divsign; ! 610: remsign = ~remsign; ! 611: } ! 612: offset = length(divd) - length(divr); ! 613: if(offset < 0)goto ddone; ! 614: seekc(p,offset+1); ! 615: sputc(divd,0); ! 616: magic = 0; ! 617: fsfile(divr); ! 618: c = sbackc(divr); ! 619: if(c < 10)magic++; ! 620: c = c * 100 + (sfbeg(divr)?0:sbackc(divr)); ! 621: if(magic>0){ ! 622: c = (c * 100 +(sfbeg(divr)?0:sbackc(divr)))*2; ! 623: c /= 25; ! 624: } ! 625: while(offset >= 0){ ! 626: fsfile(divd); ! 627: td = sbackc(divd) * 100; ! 628: dd = sfbeg(divd)?0:sbackc(divd); ! 629: td = (td + dd) * 100; ! 630: dd = sfbeg(divd)?0:sbackc(divd); ! 631: td = td + dd; ! 632: cc = c; ! 633: if(offset == 0)td++; ! 634: else cc++; ! 635: if(magic != 0)td = td<<3; ! 636: dig = td/cc; ! 637: rewind(divr); ! 638: rewind(divxyz); ! 639: carry = 0; ! 640: while(sfeof(divr) == 0){ ! 641: d = sgetc(divr)*dig+carry; ! 642: carry = d / 100; ! 643: salterc(divxyz,d%100); ! 644: } ! 645: salterc(divxyz,carry); ! 646: rewind(divxyz); ! 647: seekc(divd,offset); ! 648: carry = 0; ! 649: while(sfeof(divd) == 0){ ! 650: d = slookc(divd); ! 651: d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry; ! 652: carry = 0; ! 653: if(d < 0){ ! 654: d += 100; ! 655: carry = 1; ! 656: } ! 657: salterc(divd,d); ! 658: } ! 659: divcarry = carry; ! 660: sbackc(p); ! 661: salterc(p,dig); ! 662: sbackc(p); ! 663: fsfile(divd); ! 664: if(((d=sbackc(divd)) != 0) && !divcarry){ ! 665: d = sbackc(divd) + 100; ! 666: salterc(divd,d); ! 667: } ! 668: if(--offset >= 0)divd->wt--; ! 669: } ! 670: if(divcarry != 0){ ! 671: salterc(p,dig-1); ! 672: salterc(divd,-1); ! 673: ps = add(divr,divd); ! 674: release(divd); ! 675: divd = ps; ! 676: } ! 677: ! 678: rewind(p); ! 679: divcarry = 0; ! 680: while(sfeof(p) == 0){ ! 681: d = slookc(p)+divcarry; ! 682: divcarry = 0; ! 683: if(d >= 100){ ! 684: d -= 100; ! 685: divcarry = 1; ! 686: } ! 687: salterc(p,d); ! 688: } ! 689: if(divcarry != 0)salterc(p,divcarry); ! 690: fsfile(p); ! 691: while(sfbeg(p) == 0){ ! 692: if(sbackc(p) == 0)truncate(p); ! 693: else break; ! 694: } ! 695: if(divsign < 0)chsign(p); ! 696: fsfile(divd); ! 697: while(sfbeg(divd) == 0){ ! 698: if(sbackc(divd) == 0)truncate(divd); ! 699: else break; ! 700: } ! 701: ddone: ! 702: if(remsign<0)chsign(divd); ! 703: if(divr != ddivr)release(divr); ! 704: rem = divd; ! 705: return(p); ! 706: } ! 707: dscale(){ ! 708: register struct blk *dd,*dr; ! 709: register struct blk *r; ! 710: int c; ! 711: ! 712: dr = pop(); ! 713: EMPTYS; ! 714: dd = pop(); ! 715: EMPTYSR(dr); ! 716: fsfile(dd); ! 717: skd = sunputc(dd); ! 718: fsfile(dr); ! 719: skr = sunputc(dr); ! 720: if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)){ ! 721: sputc(dr,skr); ! 722: pushp(dr); ! 723: printf("divide by 0\n"); ! 724: return(1); ! 725: } ! 726: c = k-skd+skr; ! 727: if(c < 0)r = removr(dd,-c); ! 728: else { ! 729: r = add0(dd,c); ! 730: irem = 0; ! 731: } ! 732: arg1 = r; ! 733: arg2 = dr; ! 734: savk = k; ! 735: return(0); ! 736: } ! 737: struct blk * ! 738: removr(p,n) ! 739: struct blk *p; ! 740: { ! 741: int nn; ! 742: register struct blk *q,*s,*r; ! 743: ! 744: rewind(p); ! 745: nn = (n+1)/2; ! 746: q = salloc(nn); ! 747: while(n>1){ ! 748: sputc(q,sgetc(p)); ! 749: n -= 2; ! 750: } ! 751: r = salloc(2); ! 752: while(sfeof(p) == 0)sputc(r,sgetc(p)); ! 753: release(p); ! 754: if(n == 1){ ! 755: s = div(r,tenptr); ! 756: release(r); ! 757: rewind(rem); ! 758: if(sfeof(rem) == 0)sputc(q,sgetc(rem)); ! 759: release(rem); ! 760: irem = q; ! 761: return(s); ! 762: } ! 763: irem = q; ! 764: return(r); ! 765: } ! 766: struct blk * ! 767: sqrt(p) ! 768: struct blk *p; ! 769: { ! 770: struct blk *t; ! 771: struct blk *r,*q,*s; ! 772: int c,n,nn; ! 773: ! 774: n = length(p); ! 775: fsfile(p); ! 776: c = sbackc(p); ! 777: if((n&1) != 1)c = c*100+(sfbeg(p)?0:sbackc(p)); ! 778: n = (n+1)>>1; ! 779: r = salloc(n); ! 780: zero(r); ! 781: seekc(r,n); ! 782: nn=1; ! 783: while((c -= nn)>=0)nn+=2; ! 784: c=(nn+1)>>1; ! 785: fsfile(r); ! 786: sbackc(r); ! 787: if(c>=100){ ! 788: c -= 100; ! 789: salterc(r,c); ! 790: sputc(r,1); ! 791: } ! 792: else salterc(r,c); ! 793: while(1){ ! 794: q = div(p,r); ! 795: s = add(q,r); ! 796: release(q); ! 797: release(rem); ! 798: q = div(s,sqtemp); ! 799: release(s); ! 800: release(rem); ! 801: s = copy(r,length(r)); ! 802: chsign(s); ! 803: t = add(s,q); ! 804: release(s); ! 805: fsfile(t); ! 806: nn = sfbeg(t)?0:sbackc(t); ! 807: if(nn>=0)break; ! 808: release(r); ! 809: release(t); ! 810: r = q; ! 811: } ! 812: release(t); ! 813: release(q); ! 814: release(p); ! 815: return(r); ! 816: } ! 817: struct blk * ! 818: exp(base,ex) ! 819: struct blk *base,*ex; ! 820: { ! 821: register struct blk *r,*e,*p; ! 822: struct blk *e1,*t,*cp; ! 823: int temp,c,n; ! 824: r = salloc(1); ! 825: sputc(r,1); ! 826: p = copy(base,length(base)); ! 827: e = copy(ex,length(ex)); ! 828: fsfile(e); ! 829: if(sfbeg(e) != 0)goto edone; ! 830: temp=0; ! 831: c = sbackc(e); ! 832: if(c<0){ ! 833: temp++; ! 834: chsign(e); ! 835: } ! 836: while(length(e) != 0){ ! 837: e1=div(e,sqtemp); ! 838: release(e); ! 839: e = e1; ! 840: n = length(rem); ! 841: release(rem); ! 842: if(n != 0){ ! 843: e1=mult(p,r); ! 844: release(r); ! 845: r = e1; ! 846: } ! 847: t = copy(p,length(p)); ! 848: cp = mult(p,t); ! 849: release(p); ! 850: release(t); ! 851: p = cp; ! 852: } ! 853: if(temp != 0){ ! 854: if((c = length(base)) == 0){ ! 855: goto edone; ! 856: } ! 857: if(c>1)create(r); ! 858: else{ ! 859: rewind(base); ! 860: if((c = sgetc(base))<=1){ ! 861: create(r); ! 862: sputc(r,c); ! 863: } ! 864: else create(r); ! 865: } ! 866: } ! 867: edone: ! 868: release(p); ! 869: release(e); ! 870: return(r); ! 871: } ! 872: init(argc,argv) ! 873: int argc; ! 874: char *argv[]; ! 875: { ! 876: register struct sym *sp; ! 877: ! 878: if (signal(SIGINT, SIG_IGN) != SIG_IGN) ! 879: signal(SIGINT,onintr); ! 880: setbuf(stdout,(char *)NULL); ! 881: svargc = --argc; ! 882: svargv = argv; ! 883: while(svargc>0 && svargv[1][0] == '-'){ ! 884: switch(svargv[1][1]){ ! 885: default: ! 886: dbg=1; ! 887: } ! 888: svargc--; ! 889: svargv++; ! 890: } ! 891: ifile=1; ! 892: if(svargc<=0)curfile = stdin; ! 893: else if((curfile = fopen(svargv[1],"r")) == NULL){ ! 894: printf("can't open file %s\n",svargv[1]); ! 895: exit(1); ! 896: } ! 897: dummy = malloc(1); ! 898: scalptr = salloc(1); ! 899: sputc(scalptr,0); ! 900: basptr = salloc(1); ! 901: sputc(basptr,10); ! 902: obase=10; ! 903: log10=log2(10L); ! 904: ll=70; ! 905: fw=1; ! 906: fw1=0; ! 907: tenptr = salloc(1); ! 908: sputc(tenptr,10); ! 909: obase=10; ! 910: inbas = salloc(1); ! 911: sputc(inbas,10); ! 912: sqtemp = salloc(1); ! 913: sputc(sqtemp,2); ! 914: chptr = salloc(0); ! 915: strptr = salloc(0); ! 916: divxyz = salloc(0); ! 917: stkbeg = stkptr = &stack[0]; ! 918: stkend = &stack[STKSZ]; ! 919: stkerr = 0; ! 920: readptr = &readstk[0]; ! 921: k=0; ! 922: sp = sptr = &symlst[0]; ! 923: while(sptr < &symlst[TBLSZ]){ ! 924: sptr->next = ++sp; ! 925: sptr++; ! 926: } ! 927: sptr->next=0; ! 928: sfree = &symlst[0]; ! 929: return; ! 930: } ! 931: onintr(){ ! 932: ! 933: signal(SIGINT,onintr); ! 934: while(readptr != &readstk[0]){ ! 935: if(*readptr != 0){release(*readptr);} ! 936: readptr--; ! 937: } ! 938: curfile = stdin; ! 939: commnds(); ! 940: } ! 941: pushp(p) ! 942: struct blk *p; ! 943: { ! 944: if(stkptr == stkend){ ! 945: printf("out of stack space\n"); ! 946: return; ! 947: } ! 948: stkerr=0; ! 949: *++stkptr = p; ! 950: return; ! 951: } ! 952: struct blk * ! 953: pop(){ ! 954: if(stkptr == stack){ ! 955: stkerr=1; ! 956: return(0); ! 957: } ! 958: return(*stkptr--); ! 959: } ! 960: struct blk * ! 961: readin(){ ! 962: register struct blk *p,*q; ! 963: int dp,dpct; ! 964: register int c; ! 965: ! 966: dp = dpct=0; ! 967: p = salloc(0); ! 968: while(1){ ! 969: c = readc(); ! 970: switch(c){ ! 971: case '.': ! 972: if(dp != 0) ! 973: goto gotnum; ! 974: dp++; ! 975: continue; ! 976: case '\\': ! 977: readc(); ! 978: continue; ! 979: default: ! 980: if(c >= 'A' && c <= 'F')c = c - 'A' + 10; ! 981: else if(c >= '0' && c <= '9')c -= '0'; ! 982: else goto gotnum; ! 983: if(dp != 0){ ! 984: if(dpct >= 99)continue; ! 985: dpct++; ! 986: } ! 987: create(chptr); ! 988: if(c != 0)sputc(chptr,c); ! 989: q = mult(p,inbas); ! 990: release(p); ! 991: p = add(chptr,q); ! 992: release(q); ! 993: } ! 994: } ! 995: gotnum: ! 996: unreadc(c); ! 997: if(dp == 0){ ! 998: sputc(p,0); ! 999: return(p); ! 1000: } ! 1001: else{ ! 1002: q = scale(p,dpct); ! 1003: return(q); ! 1004: } ! 1005: } ! 1006: struct blk * ! 1007: add0(p,ct) ! 1008: int ct; ! 1009: struct blk *p; ! 1010: { ! 1011: /* returns pointer to struct with ct 0's & p */ ! 1012: register struct blk *q,*t; ! 1013: ! 1014: q = salloc(length(p)+(ct+1)/2); ! 1015: while(ct>1){ ! 1016: sputc(q,0); ! 1017: ct -= 2; ! 1018: } ! 1019: rewind(p); ! 1020: while(sfeof(p) == 0){ ! 1021: sputc(q,sgetc(p)); ! 1022: } ! 1023: release(p); ! 1024: if(ct == 1){ ! 1025: t = mult(tenptr,q); ! 1026: release(q); ! 1027: return(t); ! 1028: } ! 1029: return(q); ! 1030: } ! 1031: struct blk * ! 1032: mult(p,q) ! 1033: struct blk *p,*q; ! 1034: { ! 1035: register struct blk *mp,*mq,*mr; ! 1036: int sign,offset,carry; ! 1037: int cq,cp,mt,mcr; ! 1038: ! 1039: offset = sign = 0; ! 1040: fsfile(p); ! 1041: mp = p; ! 1042: if(sfbeg(p) == 0){ ! 1043: if(sbackc(p)<0){ ! 1044: mp = copy(p,length(p)); ! 1045: chsign(mp); ! 1046: sign = ~sign; ! 1047: } ! 1048: } ! 1049: fsfile(q); ! 1050: mq = q; ! 1051: if(sfbeg(q) == 0){ ! 1052: if(sbackc(q)<0){ ! 1053: mq = copy(q,length(q)); ! 1054: chsign(mq); ! 1055: sign = ~sign; ! 1056: } ! 1057: } ! 1058: mr = salloc(length(mp)+length(mq)); ! 1059: zero(mr); ! 1060: rewind(mq); ! 1061: while(sfeof(mq) == 0){ ! 1062: cq = sgetc(mq); ! 1063: rewind(mp); ! 1064: rewind(mr); ! 1065: mr->rd += offset; ! 1066: carry=0; ! 1067: while(sfeof(mp) == 0){ ! 1068: cp = sgetc(mp); ! 1069: mcr = sfeof(mr)?0:slookc(mr); ! 1070: mt = cp*cq + carry + mcr; ! 1071: carry = mt/100; ! 1072: salterc(mr,mt%100); ! 1073: } ! 1074: offset++; ! 1075: if(carry != 0){ ! 1076: mcr = sfeof(mr)?0:slookc(mr); ! 1077: salterc(mr,mcr+carry); ! 1078: } ! 1079: } ! 1080: if(sign < 0){ ! 1081: chsign(mr); ! 1082: } ! 1083: if(mp != p)release(mp); ! 1084: if(mq != q)release(mq); ! 1085: return(mr); ! 1086: } ! 1087: chsign(p) ! 1088: struct blk *p; ! 1089: { ! 1090: register int carry; ! 1091: register char ct; ! 1092: ! 1093: carry=0; ! 1094: rewind(p); ! 1095: while(sfeof(p) == 0){ ! 1096: ct=100-slookc(p)-carry; ! 1097: carry=1; ! 1098: if(ct>=100){ ! 1099: ct -= 100; ! 1100: carry=0; ! 1101: } ! 1102: salterc(p,ct); ! 1103: } ! 1104: if(carry != 0){ ! 1105: sputc(p,-1); ! 1106: fsfile(p); ! 1107: sbackc(p); ! 1108: ct = sbackc(p); ! 1109: if(ct == 99){ ! 1110: truncate(p); ! 1111: sputc(p,-1); ! 1112: } ! 1113: } ! 1114: else{ ! 1115: fsfile(p); ! 1116: ct = sbackc(p); ! 1117: if(ct == 0)truncate(p); ! 1118: } ! 1119: return; ! 1120: } ! 1121: readc(){ ! 1122: loop: ! 1123: if((readptr != &readstk[0]) && (*readptr != 0)){ ! 1124: if(sfeof(*readptr) == 0)return(lastchar = sgetc(*readptr)); ! 1125: release(*readptr); ! 1126: readptr--; ! 1127: goto loop; ! 1128: } ! 1129: lastchar = getc(curfile); ! 1130: if(lastchar != EOF)return(lastchar); ! 1131: if(readptr != &readptr[0]){ ! 1132: readptr--; ! 1133: if(*readptr == 0)curfile = stdin; ! 1134: goto loop; ! 1135: } ! 1136: if(curfile != stdin){ ! 1137: fclose(curfile); ! 1138: curfile = stdin; ! 1139: goto loop; ! 1140: } ! 1141: exit(0); ! 1142: } ! 1143: unreadc(c) ! 1144: char c; ! 1145: { ! 1146: ! 1147: if((readptr != &readstk[0]) && (*readptr != 0)){ ! 1148: sungetc(*readptr,c); ! 1149: } ! 1150: else ungetc(c,curfile); ! 1151: return; ! 1152: } ! 1153: binop(c) ! 1154: char c; ! 1155: { ! 1156: register struct blk *r; ! 1157: ! 1158: switch(c){ ! 1159: case '+': ! 1160: r = add(arg1,arg2); ! 1161: break; ! 1162: case '*': ! 1163: r = mult(arg1,arg2); ! 1164: break; ! 1165: case '/': ! 1166: r = div(arg1,arg2); ! 1167: break; ! 1168: } ! 1169: release(arg1); ! 1170: release(arg2); ! 1171: sputc(r,savk); ! 1172: pushp(r); ! 1173: return; ! 1174: } ! 1175: print(hptr) ! 1176: struct blk *hptr; ! 1177: { ! 1178: int sc; ! 1179: register struct blk *p,*q,*dec; ! 1180: int dig,dout,ct; ! 1181: ! 1182: rewind(hptr); ! 1183: while(sfeof(hptr) == 0){ ! 1184: if(sgetc(hptr)>99){ ! 1185: rewind(hptr); ! 1186: while(sfeof(hptr) == 0){ ! 1187: printf("%c",sgetc(hptr)); ! 1188: } ! 1189: printf("\n"); ! 1190: return; ! 1191: } ! 1192: } ! 1193: fsfile(hptr); ! 1194: sc = sbackc(hptr); ! 1195: if(sfbeg(hptr) != 0){ ! 1196: printf("0\n"); ! 1197: return; ! 1198: } ! 1199: count = ll; ! 1200: p = copy(hptr,length(hptr)); ! 1201: sunputc(p); ! 1202: fsfile(p); ! 1203: if(sbackc(p)<0){ ! 1204: chsign(p); ! 1205: OUTC('-'); ! 1206: } ! 1207: if((obase == 0) || (obase == -1)){ ! 1208: oneot(p,sc,'d'); ! 1209: return; ! 1210: } ! 1211: if(obase == 1){ ! 1212: oneot(p,sc,'1'); ! 1213: return; ! 1214: } ! 1215: if(obase == 10){ ! 1216: tenot(p,sc); ! 1217: return; ! 1218: } ! 1219: create(strptr); ! 1220: dig = log10*sc; ! 1221: dout = ((dig/10) + dig) /logo; ! 1222: dec = getdec(p,sc); ! 1223: p = removc(p,sc); ! 1224: while(length(p) != 0){ ! 1225: q = div(p,basptr); ! 1226: release(p); ! 1227: p = q; ! 1228: (*outdit)(rem,0); ! 1229: } ! 1230: release(p); ! 1231: fsfile(strptr); ! 1232: while(sfbeg(strptr) == 0)OUTC(sbackc(strptr)); ! 1233: if(sc == 0){ ! 1234: release(dec); ! 1235: printf("\n"); ! 1236: return; ! 1237: } ! 1238: create(strptr); ! 1239: OUTC('.'); ! 1240: ct=0; ! 1241: do{ ! 1242: q = mult(basptr,dec); ! 1243: release(dec); ! 1244: dec = getdec(q,sc); ! 1245: p = removc(q,sc); ! 1246: (*outdit)(p,1); ! 1247: }while(++ct < dout); ! 1248: release(dec); ! 1249: rewind(strptr); ! 1250: while(sfeof(strptr) == 0)OUTC(sgetc(strptr)); ! 1251: printf("\n"); ! 1252: return; ! 1253: } ! 1254: ! 1255: struct blk * ! 1256: getdec(p,sc) ! 1257: struct blk *p; ! 1258: { ! 1259: int cc; ! 1260: register struct blk *q,*t,*s; ! 1261: ! 1262: rewind(p); ! 1263: if(length(p)*2 < sc){ ! 1264: q = copy(p,length(p)); ! 1265: return(q); ! 1266: } ! 1267: q = salloc(length(p)); ! 1268: while(sc >= 1){ ! 1269: sputc(q,sgetc(p)); ! 1270: sc -= 2; ! 1271: } ! 1272: if(sc != 0){ ! 1273: t = mult(q,tenptr); ! 1274: s = salloc(cc = length(q)); ! 1275: release(q); ! 1276: rewind(t); ! 1277: while(cc-- > 0)sputc(s,sgetc(t)); ! 1278: sputc(s,0); ! 1279: release(t); ! 1280: t = div(s,tenptr); ! 1281: release(s); ! 1282: release(rem); ! 1283: return(t); ! 1284: } ! 1285: return(q); ! 1286: } ! 1287: tenot(p,sc) ! 1288: struct blk *p; ! 1289: { ! 1290: register int c,f; ! 1291: ! 1292: fsfile(p); ! 1293: f=0; ! 1294: while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)){ ! 1295: c = sbackc(p); ! 1296: if((c<10) && (f == 1))printf("0%d",c); ! 1297: else printf("%d",c); ! 1298: f=1; ! 1299: TEST2; ! 1300: } ! 1301: if(sc == 0){ ! 1302: printf("\n"); ! 1303: release(p); ! 1304: return; ! 1305: } ! 1306: if((p->rd-p->beg)*2 > sc){ ! 1307: c = sbackc(p); ! 1308: printf("%d.",c/10); ! 1309: TEST2; ! 1310: OUTC(c%10 +'0'); ! 1311: sc--; ! 1312: } ! 1313: else { ! 1314: OUTC('.'); ! 1315: } ! 1316: if(sc > (p->rd-p->beg)*2){ ! 1317: while(sc>(p->rd-p->beg)*2){ ! 1318: OUTC('0'); ! 1319: sc--; ! 1320: } ! 1321: } ! 1322: while(sc > 1){ ! 1323: c = sbackc(p); ! 1324: if(c<10)printf("0%d",c); ! 1325: else printf("%d",c); ! 1326: sc -= 2; ! 1327: TEST2; ! 1328: } ! 1329: if(sc == 1){ ! 1330: OUTC(sbackc(p)/10 +'0'); ! 1331: } ! 1332: printf("\n"); ! 1333: release(p); ! 1334: return; ! 1335: } ! 1336: oneot(p,sc,ch) ! 1337: struct blk *p; ! 1338: char ch; ! 1339: { ! 1340: register struct blk *q; ! 1341: ! 1342: q = removc(p,sc); ! 1343: create(strptr); ! 1344: sputc(strptr,-1); ! 1345: while(length(q)>0){ ! 1346: p = add(strptr,q); ! 1347: release(q); ! 1348: q = p; ! 1349: OUTC(ch); ! 1350: } ! 1351: release(q); ! 1352: printf("\n"); ! 1353: return; ! 1354: } ! 1355: hexot(p,flg) ! 1356: struct blk *p; ! 1357: { ! 1358: register int c; ! 1359: rewind(p); ! 1360: if(sfeof(p) != 0){ ! 1361: sputc(strptr,'0'); ! 1362: release(p); ! 1363: return; ! 1364: } ! 1365: c = sgetc(p); ! 1366: release(p); ! 1367: if(c >= 16){ ! 1368: printf("hex digit > 16"); ! 1369: return; ! 1370: } ! 1371: sputc(strptr,c<10?c+'0':c-10+'A'); ! 1372: return; ! 1373: } ! 1374: bigot(p,flg) ! 1375: struct blk *p; ! 1376: { ! 1377: register struct blk *t,*q; ! 1378: register int l; ! 1379: int neg; ! 1380: ! 1381: if(flg == 1)t = salloc(0); ! 1382: else{ ! 1383: t = strptr; ! 1384: l = length(strptr)+fw-1; ! 1385: } ! 1386: neg=0; ! 1387: if(length(p) != 0){ ! 1388: fsfile(p); ! 1389: if(sbackc(p)<0){ ! 1390: neg=1; ! 1391: chsign(p); ! 1392: } ! 1393: while(length(p) != 0){ ! 1394: q = div(p,tenptr); ! 1395: release(p); ! 1396: p = q; ! 1397: rewind(rem); ! 1398: sputc(t,sfeof(rem)?'0':sgetc(rem)+'0'); ! 1399: release(rem); ! 1400: } ! 1401: } ! 1402: release(p); ! 1403: if(flg == 1){ ! 1404: l = fw1-length(t); ! 1405: if(neg != 0){ ! 1406: l--; ! 1407: sputc(strptr,'-'); ! 1408: } ! 1409: fsfile(t); ! 1410: while(l-- > 0)sputc(strptr,'0'); ! 1411: while(sfbeg(t) == 0)sputc(strptr,sbackc(t)); ! 1412: release(t); ! 1413: } ! 1414: else{ ! 1415: l -= length(strptr); ! 1416: while(l-- > 0)sputc(strptr,'0'); ! 1417: if(neg != 0){ ! 1418: sunputc(strptr); ! 1419: sputc(strptr,'-'); ! 1420: } ! 1421: } ! 1422: sputc(strptr,' '); ! 1423: return; ! 1424: } ! 1425: struct blk * ! 1426: add(a1,a2) ! 1427: struct blk *a1,*a2; ! 1428: { ! 1429: register struct blk *p; ! 1430: register int carry,n; ! 1431: int size; ! 1432: int c,n1,n2; ! 1433: ! 1434: size = length(a1)>length(a2)?length(a1):length(a2); ! 1435: p = salloc(size); ! 1436: rewind(a1); ! 1437: rewind(a2); ! 1438: carry=0; ! 1439: while(--size >= 0){ ! 1440: n1 = sfeof(a1)?0:sgetc(a1); ! 1441: n2 = sfeof(a2)?0:sgetc(a2); ! 1442: n = n1 + n2 + carry; ! 1443: if(n>=100){ ! 1444: carry=1; ! 1445: n -= 100; ! 1446: } ! 1447: else if(n<0){ ! 1448: carry = -1; ! 1449: n += 100; ! 1450: } ! 1451: else carry = 0; ! 1452: sputc(p,n); ! 1453: } ! 1454: if(carry != 0)sputc(p,carry); ! 1455: fsfile(p); ! 1456: if(sfbeg(p) == 0){ ! 1457: while(sfbeg(p) == 0 && (c = sbackc(p)) == 0); ! 1458: if(c != 0)salterc(p,c); ! 1459: truncate(p); ! 1460: } ! 1461: fsfile(p); ! 1462: if(sfbeg(p) == 0 && sbackc(p) == -1){ ! 1463: while((c = sbackc(p)) == 99){ ! 1464: if(c == EOF)break; ! 1465: } ! 1466: sgetc(p); ! 1467: salterc(p,-1); ! 1468: truncate(p); ! 1469: } ! 1470: return(p); ! 1471: } ! 1472: eqk(){ ! 1473: register struct blk *p,*q; ! 1474: register int skp; ! 1475: int skq; ! 1476: ! 1477: p = pop(); ! 1478: EMPTYS; ! 1479: q = pop(); ! 1480: EMPTYSR(p); ! 1481: skp = sunputc(p); ! 1482: skq = sunputc(q); ! 1483: if(skp == skq){ ! 1484: arg1=p; ! 1485: arg2=q; ! 1486: savk = skp; ! 1487: return(0); ! 1488: } ! 1489: else if(skp < skq){ ! 1490: savk = skq; ! 1491: p = add0(p,skq-skp); ! 1492: } ! 1493: else { ! 1494: savk = skp; ! 1495: q = add0(q,skp-skq); ! 1496: } ! 1497: arg1=p; ! 1498: arg2=q; ! 1499: return(0); ! 1500: } ! 1501: struct blk * ! 1502: removc(p,n) ! 1503: struct blk *p; ! 1504: { ! 1505: register struct blk *q,*r; ! 1506: ! 1507: rewind(p); ! 1508: while(n>1){ ! 1509: sgetc(p); ! 1510: n -= 2; ! 1511: } ! 1512: q = salloc(2); ! 1513: while(sfeof(p) == 0)sputc(q,sgetc(p)); ! 1514: if(n == 1){ ! 1515: r = div(q,tenptr); ! 1516: release(q); ! 1517: release(rem); ! 1518: q = r; ! 1519: } ! 1520: release(p); ! 1521: return(q); ! 1522: } ! 1523: struct blk * ! 1524: scalint(p) ! 1525: struct blk *p; ! 1526: { ! 1527: register int n; ! 1528: n = sunputc(p); ! 1529: p = removc(p,n); ! 1530: return(p); ! 1531: } ! 1532: struct blk * ! 1533: scale(p,n) ! 1534: struct blk *p; ! 1535: { ! 1536: register struct blk *q,*s,*t; ! 1537: ! 1538: t = add0(p,n); ! 1539: q = salloc(1); ! 1540: sputc(q,n); ! 1541: s = exp(inbas,q); ! 1542: release(q); ! 1543: q = div(t,s); ! 1544: release(t); ! 1545: release(s); ! 1546: release(rem); ! 1547: sputc(q,n); ! 1548: return(q); ! 1549: } ! 1550: subt(){ ! 1551: arg1=pop(); ! 1552: EMPTYS; ! 1553: savk = sunputc(arg1); ! 1554: chsign(arg1); ! 1555: sputc(arg1,savk); ! 1556: pushp(arg1); ! 1557: if(eqk() != 0)return(1); ! 1558: binop('+'); ! 1559: return(0); ! 1560: } ! 1561: command(){ ! 1562: int c; ! 1563: char line[100],*sl; ! 1564: register (*savint)(),pid,rpid; ! 1565: int retcode; ! 1566: ! 1567: switch(c = readc()){ ! 1568: case '<': ! 1569: return(cond(NL)); ! 1570: case '>': ! 1571: return(cond(NG)); ! 1572: case '=': ! 1573: return(cond(NE)); ! 1574: default: ! 1575: sl = line; ! 1576: *sl++ = c; ! 1577: while((c = readc()) != '\n')*sl++ = c; ! 1578: *sl = 0; ! 1579: if((pid = fork()) == 0){ ! 1580: execl("/bin/sh","sh","-c",line,0); ! 1581: exit(0100); ! 1582: } ! 1583: savint = signal(SIGINT, SIG_IGN); ! 1584: while((rpid = wait(&retcode)) != pid && rpid != -1); ! 1585: signal(SIGINT,savint); ! 1586: printf("!\n"); ! 1587: return(0); ! 1588: } ! 1589: } ! 1590: cond(c) ! 1591: char c; ! 1592: { ! 1593: register struct blk *p; ! 1594: register char cc; ! 1595: ! 1596: if(subt() != 0)return(1); ! 1597: p = pop(); ! 1598: sunputc(p); ! 1599: if(length(p) == 0){ ! 1600: release(p); ! 1601: if(c == '<' || c == '>' || c == NE){ ! 1602: readc(); ! 1603: return(0); ! 1604: } ! 1605: load(); ! 1606: return(1); ! 1607: } ! 1608: else { ! 1609: if(c == '='){ ! 1610: release(p); ! 1611: readc(); ! 1612: return(0); ! 1613: } ! 1614: } ! 1615: if(c == NE){ ! 1616: release(p); ! 1617: load(); ! 1618: return(1); ! 1619: } ! 1620: fsfile(p); ! 1621: cc = sbackc(p); ! 1622: release(p); ! 1623: if((cc<0 && (c == '<' || c == NG)) || ! 1624: (cc >0) && (c == '>' || c == NL)){ ! 1625: readc(); ! 1626: return(0); ! 1627: } ! 1628: load(); ! 1629: return(1); ! 1630: } ! 1631: load(){ ! 1632: register int c; ! 1633: register struct blk *p,*q; ! 1634: struct blk *t,*s; ! 1635: c = readc() & 0377; ! 1636: sptr = stable[c]; ! 1637: if(sptr != 0){ ! 1638: p = sptr->val; ! 1639: if(c >= ARRAYST){ ! 1640: q = salloc(length(p)); ! 1641: rewind(p); ! 1642: while(sfeof(p) == 0){ ! 1643: s = getwd(p); ! 1644: if(s == 0){putwd(q, (struct blk *)NULL);} ! 1645: else{ ! 1646: t = copy(s,length(s)); ! 1647: putwd(q,t); ! 1648: } ! 1649: } ! 1650: pushp(q); ! 1651: } ! 1652: else{ ! 1653: q = copy(p,length(p)); ! 1654: pushp(q); ! 1655: } ! 1656: } ! 1657: else{ ! 1658: q = salloc(1); ! 1659: if(c <= LASTFUN){ ! 1660: printf("function %c undefined\n",c+'a'-1); ! 1661: sputc(q,'c'); ! 1662: sputc(q,'0'); ! 1663: sputc(q,' '); ! 1664: sputc(q,'1'); ! 1665: sputc(q,'Q'); ! 1666: } ! 1667: else sputc(q,0); ! 1668: pushp(q); ! 1669: } ! 1670: return; ! 1671: } ! 1672: log2(n) ! 1673: long n; ! 1674: { ! 1675: register int i; ! 1676: ! 1677: if(n == 0)return(0); ! 1678: i=31; ! 1679: if(n<0)return(i); ! 1680: while((n= n<<1) >0)i--; ! 1681: return(--i); ! 1682: } ! 1683: ! 1684: struct blk * ! 1685: salloc(size) ! 1686: int size; ! 1687: { ! 1688: register struct blk *hdr; ! 1689: register char *ptr; ! 1690: all++; ! 1691: nbytes += size; ! 1692: ptr = malloc((unsigned)size); ! 1693: if(ptr == 0){ ! 1694: garbage("salloc"); ! 1695: if((ptr = malloc((unsigned)size)) == 0) ! 1696: ospace("salloc"); ! 1697: } ! 1698: if((hdr = hfree) == 0)hdr = morehd(); ! 1699: hfree = (struct blk *)hdr->rd; ! 1700: hdr->rd = hdr->wt = hdr->beg = ptr; ! 1701: hdr->last = ptr+size; ! 1702: return(hdr); ! 1703: } ! 1704: struct blk * ! 1705: morehd(){ ! 1706: register struct blk *h,*kk; ! 1707: headmor++; ! 1708: nbytes += HEADSZ; ! 1709: hfree = h = (struct blk *)malloc(HEADSZ); ! 1710: if(hfree == 0){ ! 1711: garbage("morehd"); ! 1712: if((hfree = h = (struct blk *)malloc(HEADSZ)) == 0) ! 1713: ospace("headers"); ! 1714: } ! 1715: kk = h; ! 1716: while(h<hfree+(HEADSZ/BLK))(h++)->rd = (char *)++kk; ! 1717: (--h)->rd=0; ! 1718: return(hfree); ! 1719: } ! 1720: /* ! 1721: sunputc(hptr) ! 1722: struct blk *hptr; ! 1723: { ! 1724: hptr->wt--; ! 1725: hptr->rd = hptr->wt; ! 1726: return(*hptr->wt); ! 1727: } ! 1728: */ ! 1729: struct blk * ! 1730: copy(hptr,size) ! 1731: struct blk *hptr; ! 1732: int size; ! 1733: { ! 1734: register struct blk *hdr; ! 1735: register unsigned sz; ! 1736: register char *ptr; ! 1737: ! 1738: all++; ! 1739: nbytes += size; ! 1740: sz = length(hptr); ! 1741: ptr = nalloc(hptr->beg, (unsigned)size); ! 1742: if(ptr == 0){ ! 1743: garbage("copy"); ! 1744: if((ptr = nalloc(hptr->beg, (unsigned)size)) == NULL){ ! 1745: printf("copy size %d\n",size); ! 1746: ospace("copy"); ! 1747: } ! 1748: } ! 1749: if((hdr = hfree) == 0)hdr = morehd(); ! 1750: hfree = (struct blk *)hdr->rd; ! 1751: hdr->rd = hdr->beg = ptr; ! 1752: hdr->last = ptr+size; ! 1753: hdr->wt = ptr+sz; ! 1754: ptr = hdr->wt; ! 1755: while(ptr<hdr->last)*ptr++ = '\0'; ! 1756: return(hdr); ! 1757: } ! 1758: sdump(s1,hptr) ! 1759: char *s1; ! 1760: struct blk *hptr; ! 1761: { ! 1762: char *p; ! 1763: printf("%s %o rd %o wt %o beg %o last %o\n",s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last); ! 1764: p = hptr->beg; ! 1765: while(p < hptr->wt)printf("%d ",*p++); ! 1766: printf("\n"); ! 1767: } ! 1768: seekc(hptr,n) ! 1769: struct blk *hptr; ! 1770: { ! 1771: register char *nn,*p; ! 1772: ! 1773: nn = hptr->beg+n; ! 1774: if(nn > hptr->last){ ! 1775: nbytes += nn - hptr->last; ! 1776: free(hptr->beg); ! 1777: p = realloc(hptr->beg, (unsigned)n); ! 1778: if(p == 0){ ! 1779: hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg)); ! 1780: garbage("seekc"); ! 1781: if((p = realloc(hptr->beg, (unsigned)n)) == 0) ! 1782: ospace("seekc"); ! 1783: } ! 1784: hptr->beg = p; ! 1785: hptr->wt = hptr->last = hptr->rd = p+n; ! 1786: return; ! 1787: } ! 1788: hptr->rd = nn; ! 1789: if(nn>hptr->wt)hptr->wt = nn; ! 1790: return; ! 1791: } ! 1792: salterwd(hptr,n) ! 1793: struct wblk *hptr; ! 1794: struct blk *n; ! 1795: { ! 1796: if(hptr->rdw == hptr->lastw)more(hptr); ! 1797: *hptr->rdw++ = n; ! 1798: if(hptr->rdw > hptr->wtw)hptr->wtw = hptr->rdw; ! 1799: return; ! 1800: } ! 1801: more(hptr) ! 1802: struct blk *hptr; ! 1803: { ! 1804: register unsigned size; ! 1805: register char *p; ! 1806: ! 1807: if((size=(hptr->last-hptr->beg)*2) == 0)size=1; ! 1808: nbytes += size/2; ! 1809: free(hptr->beg); ! 1810: p = realloc(hptr->beg, (unsigned)size); ! 1811: if(p == 0){ ! 1812: hptr->beg = realloc(hptr->beg, (unsigned)(hptr->last-hptr->beg)); ! 1813: garbage("more"); ! 1814: if((p = realloc(hptr->beg,size)) == 0) ! 1815: ospace("more"); ! 1816: } ! 1817: hptr->rd = hptr->rd-hptr->beg+p; ! 1818: hptr->wt = hptr->wt-hptr->beg+p; ! 1819: hptr->beg = p; ! 1820: hptr->last = p+size; ! 1821: return; ! 1822: } ! 1823: ospace(s) ! 1824: char *s; ! 1825: { ! 1826: printf("out of space: %s\n",s); ! 1827: printf("all %ld rel %ld headmor %ld\n",all,rel,headmor); ! 1828: printf("nbytes %ld\n",nbytes); ! 1829: sdump("stk",*stkptr); ! 1830: abort(); ! 1831: } ! 1832: garbage(s) ! 1833: char *s; ! 1834: { ! 1835: int i; ! 1836: struct blk *p, *q; ! 1837: struct sym *tmps; ! 1838: int ct; ! 1839: ! 1840: /* printf("got to garbage %s\n",s); */ ! 1841: for(i=0;i<TBLSZ;i++){ ! 1842: tmps = stable[i]; ! 1843: if(tmps != 0){ ! 1844: if(i < ARRAYST){ ! 1845: do { ! 1846: p = tmps->val; ! 1847: if(((int)p->beg & 01) != 0){ ! 1848: printf("string %o\n",i); ! 1849: sdump("odd beg",p); ! 1850: } ! 1851: redef(p); ! 1852: tmps = tmps->next; ! 1853: } while(tmps != 0); ! 1854: continue; ! 1855: } ! 1856: else { ! 1857: do { ! 1858: p = tmps->val; ! 1859: rewind(p); ! 1860: ct = 0; ! 1861: while((q = getwd(p)) != NULL){ ! 1862: ct++; ! 1863: if(q != 0){ ! 1864: if(((int)q->beg & 01) != 0){ ! 1865: printf("array %o elt %d odd\n",i-ARRAYST,ct); ! 1866: printf("tmps %o p %o\n",tmps,p); ! 1867: sdump("elt",q); ! 1868: } ! 1869: redef(q); ! 1870: } ! 1871: } ! 1872: tmps = tmps->next; ! 1873: } while(tmps != 0); ! 1874: } ! 1875: } ! 1876: } ! 1877: } ! 1878: redef(p) ! 1879: struct blk *p; ! 1880: { ! 1881: register offset; ! 1882: register char *newp; ! 1883: ! 1884: if ((int)p->beg&01) { ! 1885: printf("odd ptr %o hdr %o\n",p->beg,p); ! 1886: ospace("redef-bad"); ! 1887: } ! 1888: free(p->beg); ! 1889: free(dummy); ! 1890: dummy = malloc(1); ! 1891: if(dummy == NULL)ospace("dummy"); ! 1892: newp = realloc(p->beg, (unsigned)(p->last-p->beg)); ! 1893: if(newp == NULL)ospace("redef"); ! 1894: offset = newp - p->beg; ! 1895: p->beg = newp; ! 1896: p->rd += offset; ! 1897: p->wt += offset; ! 1898: p->last += offset; ! 1899: } ! 1900: ! 1901: release(p) ! 1902: register struct blk *p; ! 1903: { ! 1904: rel++; ! 1905: nbytes -= p->last - p->beg; ! 1906: p->rd = (char *)hfree; ! 1907: hfree = p; ! 1908: free(p->beg); ! 1909: } ! 1910: ! 1911: struct blk * ! 1912: getwd(p) ! 1913: struct blk *p; ! 1914: { ! 1915: register struct wblk *wp; ! 1916: ! 1917: wp = (struct wblk *)p; ! 1918: if (wp->rdw == wp->wtw) ! 1919: return(NULL); ! 1920: return(*wp->rdw++); ! 1921: } ! 1922: ! 1923: putwd(p, c) ! 1924: struct blk *p, *c; ! 1925: { ! 1926: register struct wblk *wp; ! 1927: ! 1928: wp = (struct wblk *)p; ! 1929: if (wp->wtw == wp->lastw) ! 1930: more(p); ! 1931: *wp->wtw++ = c; ! 1932: } ! 1933: ! 1934: struct blk * ! 1935: lookwd(p) ! 1936: struct blk *p; ! 1937: { ! 1938: register struct wblk *wp; ! 1939: ! 1940: wp = (struct wblk *)p; ! 1941: if (wp->rdw == wp->wtw) ! 1942: return(NULL); ! 1943: return(*wp->rdw); ! 1944: } ! 1945: char * ! 1946: nalloc(p,nbytes) ! 1947: register char *p; ! 1948: unsigned nbytes; ! 1949: { ! 1950: char *malloc(); ! 1951: register char *q, *r; ! 1952: q = r = malloc(nbytes); ! 1953: if(q==0) ! 1954: return(0); ! 1955: while(nbytes--) ! 1956: *q++ = *p++; ! 1957: return(r); ! 1958: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.