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