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