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