13e12c5d1SDavid du Colombier #include <u.h> 23e12c5d1SDavid du Colombier #include <libc.h> 33e12c5d1SDavid du Colombier #include <bio.h> 43e12c5d1SDavid du Colombier 53e12c5d1SDavid du Colombier #define FATAL 0 63e12c5d1SDavid du Colombier #define NFATAL 1 73e12c5d1SDavid du Colombier #define BLK sizeof(Blk) 83e12c5d1SDavid du Colombier #define PTRSZ sizeof(int*) 93e12c5d1SDavid du Colombier #define HEADSZ 1024 103e12c5d1SDavid du Colombier #define STKSZ 100 113e12c5d1SDavid du Colombier #define RDSKSZ 100 123e12c5d1SDavid du Colombier #define TBLSZ 256 133e12c5d1SDavid du Colombier #define ARRAYST 0241 143e12c5d1SDavid du Colombier #define MAXIND 2048 153e12c5d1SDavid du Colombier #define NL 1 163e12c5d1SDavid du Colombier #define NG 2 173e12c5d1SDavid du Colombier #define NE 3 183e12c5d1SDavid du Colombier #define length(p) ((p)->wt-(p)->beg) 193e12c5d1SDavid du Colombier #define rewind(p) (p)->rd=(p)->beg 203e12c5d1SDavid du Colombier #define create(p) (p)->rd = (p)->wt = (p)->beg 213e12c5d1SDavid du Colombier #define fsfile(p) (p)->rd = (p)->wt 223e12c5d1SDavid du Colombier #define truncate(p) (p)->wt = (p)->rd 233e12c5d1SDavid du Colombier #define sfeof(p) (((p)->rd==(p)->wt)?1:0) 243e12c5d1SDavid du Colombier #define sfbeg(p) (((p)->rd==(p)->beg)?1:0) 253e12c5d1SDavid du Colombier #define sungetc(p,c) *(--(p)->rd)=c 263e12c5d1SDavid du Colombier #define sgetc(p) (((p)->rd==(p)->wt)?-1:*(p)->rd++) 27bd389b36SDavid du Colombier #define skipc(p) {if((p)->rd<(p)->wt)(p)->rd++;} 283e12c5d1SDavid du Colombier #define slookc(p) (((p)->rd==(p)->wt)?-1:*(p)->rd) 293e12c5d1SDavid du Colombier #define sbackc(p) (((p)->rd==(p)->beg)?-1:*(--(p)->rd)) 303e12c5d1SDavid du Colombier #define backc(p) {if((p)->rd>(p)->beg) --(p)->rd;} 313e12c5d1SDavid du Colombier #define sputc(p,c) {if((p)->wt==(p)->last)more(p);\ 323e12c5d1SDavid du Colombier *(p)->wt++ = c; } 333e12c5d1SDavid du Colombier #define salterc(p,c) {if((p)->rd==(p)->last)more(p);\ 343e12c5d1SDavid du Colombier *(p)->rd++ = c;\ 353e12c5d1SDavid du Colombier if((p)->rd>(p)->wt)(p)->wt=(p)->rd;} 363e12c5d1SDavid du Colombier #define sunputc(p) (*((p)->rd = --(p)->wt)) 373e12c5d1SDavid du Colombier #define sclobber(p) ((p)->rd = --(p)->wt) 383e12c5d1SDavid du Colombier #define zero(p) for(pp=(p)->beg;pp<(p)->last;)\ 393e12c5d1SDavid du Colombier *pp++='\0' 403e12c5d1SDavid du Colombier #define OUTC(x) {Bputc(&bout,x); if(--count == 0){Bprint(&bout,"\\\n"); count=ll;} } 413e12c5d1SDavid du Colombier #define TEST2 {if((count -= 2) <=0){Bprint(&bout,"\\\n");count=ll;}} 423e12c5d1SDavid du Colombier #define EMPTY if(stkerr != 0){Bprint(&bout,"stack empty\n"); continue; } 433e12c5d1SDavid du Colombier #define EMPTYR(x) if(stkerr!=0){pushp(x);Bprint(&bout,"stack empty\n");continue;} 443e12c5d1SDavid du Colombier #define EMPTYS if(stkerr != 0){Bprint(&bout,"stack empty\n"); return(1);} 453e12c5d1SDavid du Colombier #define EMPTYSR(x) if(stkerr !=0){Bprint(&bout,"stack empty\n");pushp(x);return(1);} 463e12c5d1SDavid du Colombier #define error(p) {Bprint(&bout,p); continue; } 473e12c5d1SDavid du Colombier #define errorrt(p) {Bprint(&bout,p); return(1); } 483e12c5d1SDavid du Colombier #define LASTFUN 026 493e12c5d1SDavid du Colombier 503e12c5d1SDavid du Colombier #define signal(a,b) 0 513e12c5d1SDavid du Colombier #define SIG_IGN 0 523e12c5d1SDavid du Colombier 533e12c5d1SDavid du Colombier typedef struct Blk Blk; 543e12c5d1SDavid du Colombier struct Blk 553e12c5d1SDavid du Colombier { 563e12c5d1SDavid du Colombier char *rd; 573e12c5d1SDavid du Colombier char *wt; 583e12c5d1SDavid du Colombier char *beg; 593e12c5d1SDavid du Colombier char *last; 603e12c5d1SDavid du Colombier }; 613e12c5d1SDavid du Colombier typedef struct Sym Sym; 623e12c5d1SDavid du Colombier struct Sym 633e12c5d1SDavid du Colombier { 643e12c5d1SDavid du Colombier Sym *next; 653e12c5d1SDavid du Colombier Blk *val; 663e12c5d1SDavid du Colombier }; 673e12c5d1SDavid du Colombier typedef struct Wblk Wblk; 683e12c5d1SDavid du Colombier struct Wblk 693e12c5d1SDavid du Colombier { 703e12c5d1SDavid du Colombier Blk **rdw; 713e12c5d1SDavid du Colombier Blk **wtw; 723e12c5d1SDavid du Colombier Blk **begw; 733e12c5d1SDavid du Colombier Blk **lastw; 743e12c5d1SDavid du Colombier }; 753e12c5d1SDavid du Colombier 763e12c5d1SDavid du Colombier Biobuf *curfile, *fsave; 773e12c5d1SDavid du Colombier Blk *arg1, *arg2; 783e12c5d1SDavid du Colombier uchar savk; 793e12c5d1SDavid du Colombier int dbg; 803e12c5d1SDavid du Colombier int ifile; 813e12c5d1SDavid du Colombier Blk *scalptr, *basptr, *tenptr, *inbas; 823e12c5d1SDavid du Colombier Blk *sqtemp, *chptr, *strptr, *divxyz; 833e12c5d1SDavid du Colombier Blk *stack[STKSZ]; 843e12c5d1SDavid du Colombier Blk **stkptr,**stkbeg; 853e12c5d1SDavid du Colombier Blk **stkend; 863e12c5d1SDavid du Colombier Blk *hfree; 873e12c5d1SDavid du Colombier int stkerr; 883e12c5d1SDavid du Colombier int lastchar; 893e12c5d1SDavid du Colombier Blk *readstk[RDSKSZ]; 903e12c5d1SDavid du Colombier Blk **readptr; 913e12c5d1SDavid du Colombier Blk *rem; 923e12c5d1SDavid du Colombier int k; 933e12c5d1SDavid du Colombier Blk *irem; 943e12c5d1SDavid du Colombier int skd,skr; 953e12c5d1SDavid du Colombier int neg; 963e12c5d1SDavid du Colombier Sym symlst[TBLSZ]; 973e12c5d1SDavid du Colombier Sym *stable[TBLSZ]; 983e12c5d1SDavid du Colombier Sym *sptr, *sfree; 993e12c5d1SDavid du Colombier long rel; 1003e12c5d1SDavid du Colombier long nbytes; 1013e12c5d1SDavid du Colombier long all; 1023e12c5d1SDavid du Colombier long headmor; 1033e12c5d1SDavid du Colombier long obase; 1043e12c5d1SDavid du Colombier int fw,fw1,ll; 1053e12c5d1SDavid du Colombier void (*outdit)(Blk *p, int flg); 1063e12c5d1SDavid du Colombier int logo; 1073e12c5d1SDavid du Colombier int logten; 1083e12c5d1SDavid du Colombier int count; 1093e12c5d1SDavid du Colombier char *pp; 1103e12c5d1SDavid du Colombier char *dummy; 1113e12c5d1SDavid du Colombier long longest, maxsize, active; 1123e12c5d1SDavid du Colombier int lall, lrel, lcopy, lmore, lbytes; 1133e12c5d1SDavid du Colombier int inside; 1143e12c5d1SDavid du Colombier Biobuf bin; 1153e12c5d1SDavid du Colombier Biobuf bout; 1163e12c5d1SDavid du Colombier 1173e12c5d1SDavid du Colombier void main(int argc, char *argv[]); 1183e12c5d1SDavid du Colombier void commnds(void); 1193e12c5d1SDavid du Colombier Blk* readin(void); 1203e12c5d1SDavid du Colombier Blk* div(Blk *ddivd, Blk *ddivr); 1213e12c5d1SDavid du Colombier int dscale(void); 1223e12c5d1SDavid du Colombier Blk* removr(Blk *p, int n); 1233e12c5d1SDavid du Colombier Blk* dcsqrt(Blk *p); 1243e12c5d1SDavid du Colombier void init(int argc, char *argv[]); 1253e12c5d1SDavid du Colombier void onintr(void); 1263e12c5d1SDavid du Colombier void pushp(Blk *p); 1273e12c5d1SDavid du Colombier Blk* pop(void); 1283e12c5d1SDavid du Colombier Blk* readin(void); 1293e12c5d1SDavid du Colombier Blk* add0(Blk *p, int ct); 1303e12c5d1SDavid du Colombier Blk* mult(Blk *p, Blk *q); 1313e12c5d1SDavid du Colombier void chsign(Blk *p); 1323e12c5d1SDavid du Colombier int readc(void); 1333e12c5d1SDavid du Colombier void unreadc(char c); 1343e12c5d1SDavid du Colombier void binop(char c); 1353e12c5d1SDavid du Colombier void dcprint(Blk *hptr); 1363e12c5d1SDavid du Colombier Blk* dcexp(Blk *base, Blk *ex); 1373e12c5d1SDavid du Colombier Blk* getdec(Blk *p, int sc); 1383e12c5d1SDavid du Colombier void tenot(Blk *p, int sc); 1393e12c5d1SDavid du Colombier void oneot(Blk *p, int sc, char ch); 1403e12c5d1SDavid du Colombier void hexot(Blk *p, int flg); 1413e12c5d1SDavid du Colombier void bigot(Blk *p, int flg); 1423e12c5d1SDavid du Colombier Blk* add(Blk *a1, Blk *a2); 1433e12c5d1SDavid du Colombier int eqk(void); 1443e12c5d1SDavid du Colombier Blk* removc(Blk *p, int n); 1453e12c5d1SDavid du Colombier Blk* scalint(Blk *p); 1463e12c5d1SDavid du Colombier Blk* scale(Blk *p, int n); 1473e12c5d1SDavid du Colombier int subt(void); 1483e12c5d1SDavid du Colombier int command(void); 1493e12c5d1SDavid du Colombier int cond(char c); 1503e12c5d1SDavid du Colombier void load(void); 1513e12c5d1SDavid du Colombier int log2(long n); 1523e12c5d1SDavid du Colombier Blk* salloc(int size); 1533e12c5d1SDavid du Colombier Blk* morehd(void); 1543e12c5d1SDavid du Colombier Blk* copy(Blk *hptr, int size); 1553e12c5d1SDavid du Colombier void sdump(char *s1, Blk *hptr); 1563e12c5d1SDavid du Colombier void seekc(Blk *hptr, int n); 1573e12c5d1SDavid du Colombier void salterwd(Blk *hptr, Blk *n); 1583e12c5d1SDavid du Colombier void more(Blk *hptr); 1593e12c5d1SDavid du Colombier void ospace(char *s); 1603e12c5d1SDavid du Colombier void garbage(char *s); 1613e12c5d1SDavid du Colombier void release(Blk *p); 1623e12c5d1SDavid du Colombier Blk* dcgetwd(Blk *p); 1633e12c5d1SDavid du Colombier void putwd(Blk *p, Blk *c); 1643e12c5d1SDavid du Colombier Blk* lookwd(Blk *p); 1653e12c5d1SDavid du Colombier char* nalloc(char *p, unsigned nbytes); 1663e12c5d1SDavid du Colombier 167*219b2ee8SDavid du Colombier /********debug only**/ 1683e12c5d1SDavid du Colombier void 1693e12c5d1SDavid du Colombier tpr(char *cp, Blk *bp) 1703e12c5d1SDavid du Colombier { 1713e12c5d1SDavid du Colombier print("%s-> ", cp); 1723e12c5d1SDavid du Colombier print("beg: %x rd: %x wt: %x last: %x\n", bp->beg, bp->rd, 1733e12c5d1SDavid du Colombier bp->wt, bp->last); 1743e12c5d1SDavid du Colombier for (cp = bp->beg; cp != bp->wt; cp++) { 1753e12c5d1SDavid du Colombier print("%d", *cp); 1763e12c5d1SDavid du Colombier if (cp != bp->wt-1) 1773e12c5d1SDavid du Colombier print("/"); 1783e12c5d1SDavid du Colombier } 1793e12c5d1SDavid du Colombier print("\n"); 1803e12c5d1SDavid du Colombier } 181*219b2ee8SDavid du Colombier /************/ 1823e12c5d1SDavid du Colombier 1833e12c5d1SDavid du Colombier void 1843e12c5d1SDavid du Colombier main(int argc, char *argv[]) 1853e12c5d1SDavid du Colombier { 1863e12c5d1SDavid du Colombier Binit(&bin, 0, OREAD); 1873e12c5d1SDavid du Colombier Binit(&bout, 1, OWRITE); 1883e12c5d1SDavid du Colombier init(argc,argv); 1893e12c5d1SDavid du Colombier commnds(); 1903e12c5d1SDavid du Colombier exits(0); 1913e12c5d1SDavid du Colombier } 1923e12c5d1SDavid du Colombier 1933e12c5d1SDavid du Colombier void 1943e12c5d1SDavid du Colombier commnds(void) 1953e12c5d1SDavid du Colombier { 1963e12c5d1SDavid du Colombier Blk *p, *q, **ptr, *s, *t; 1973e12c5d1SDavid du Colombier long l; 1983e12c5d1SDavid du Colombier Sym *sp; 1993e12c5d1SDavid du Colombier int sk, sk1, sk2, c, sign, n, d; 2003e12c5d1SDavid du Colombier 2013e12c5d1SDavid du Colombier while(1) { 2023e12c5d1SDavid du Colombier Bflush(&bout); 2033e12c5d1SDavid du Colombier if(((c = readc())>='0' && c <= '9') || 2043e12c5d1SDavid du Colombier (c>='A' && c <='F') || c == '.') { 2053e12c5d1SDavid du Colombier unreadc(c); 2063e12c5d1SDavid du Colombier p = readin(); 2073e12c5d1SDavid du Colombier pushp(p); 2083e12c5d1SDavid du Colombier continue; 2093e12c5d1SDavid du Colombier } 2103e12c5d1SDavid du Colombier switch(c) { 2113e12c5d1SDavid du Colombier case ' ': 2123e12c5d1SDavid du Colombier case '\n': 2133e12c5d1SDavid du Colombier case -1: 2143e12c5d1SDavid du Colombier continue; 2153e12c5d1SDavid du Colombier case 'Y': 2163e12c5d1SDavid du Colombier sdump("stk",*stkptr); 2173e12c5d1SDavid du Colombier Bprint(&bout, "all %ld rel %ld headmor %ld\n",all,rel,headmor); 2183e12c5d1SDavid du Colombier Bprint(&bout, "nbytes %ld\n",nbytes); 2193e12c5d1SDavid du Colombier Bprint(&bout, "longest %ld active %ld maxsize %ld\n", longest, 2203e12c5d1SDavid du Colombier active, maxsize); 2213e12c5d1SDavid du Colombier Bprint(&bout, "new all %d rel %d copy %d more %d lbytes %d\n", 2223e12c5d1SDavid du Colombier lall, lrel, lcopy, lmore, lbytes); 2233e12c5d1SDavid du Colombier lall = lrel = lcopy = lmore = lbytes = 0; 2243e12c5d1SDavid du Colombier continue; 2253e12c5d1SDavid du Colombier case '_': 2263e12c5d1SDavid du Colombier p = readin(); 2273e12c5d1SDavid du Colombier savk = sunputc(p); 2283e12c5d1SDavid du Colombier chsign(p); 2293e12c5d1SDavid du Colombier sputc(p,savk); 2303e12c5d1SDavid du Colombier pushp(p); 2313e12c5d1SDavid du Colombier continue; 2323e12c5d1SDavid du Colombier case '-': 2333e12c5d1SDavid du Colombier subt(); 2343e12c5d1SDavid du Colombier continue; 2353e12c5d1SDavid du Colombier case '+': 2363e12c5d1SDavid du Colombier if(eqk() != 0) 2373e12c5d1SDavid du Colombier continue; 2383e12c5d1SDavid du Colombier binop('+'); 2393e12c5d1SDavid du Colombier continue; 2403e12c5d1SDavid du Colombier case '*': 2413e12c5d1SDavid du Colombier arg1 = pop(); 2423e12c5d1SDavid du Colombier EMPTY; 2433e12c5d1SDavid du Colombier arg2 = pop(); 2443e12c5d1SDavid du Colombier EMPTYR(arg1); 2453e12c5d1SDavid du Colombier sk1 = sunputc(arg1); 2463e12c5d1SDavid du Colombier sk2 = sunputc(arg2); 2473e12c5d1SDavid du Colombier savk = sk1+sk2; 2483e12c5d1SDavid du Colombier binop('*'); 2493e12c5d1SDavid du Colombier p = pop(); 2503e12c5d1SDavid du Colombier if(savk>k && savk>sk1 && savk>sk2) { 251*219b2ee8SDavid du Colombier sclobber(p); 2523e12c5d1SDavid du Colombier sk = sk1; 2533e12c5d1SDavid du Colombier if(sk<sk2) 2543e12c5d1SDavid du Colombier sk = sk2; 2553e12c5d1SDavid du Colombier if(sk<k) 2563e12c5d1SDavid du Colombier sk = k; 2573e12c5d1SDavid du Colombier p = removc(p,savk-sk); 2583e12c5d1SDavid du Colombier savk = sk; 2593e12c5d1SDavid du Colombier sputc(p,savk); 2603e12c5d1SDavid du Colombier } 2613e12c5d1SDavid du Colombier pushp(p); 2623e12c5d1SDavid du Colombier continue; 2633e12c5d1SDavid du Colombier case '/': 2643e12c5d1SDavid du Colombier casediv: 2653e12c5d1SDavid du Colombier if(dscale() != 0) 2663e12c5d1SDavid du Colombier continue; 2673e12c5d1SDavid du Colombier binop('/'); 2683e12c5d1SDavid du Colombier if(irem != 0) 2693e12c5d1SDavid du Colombier release(irem); 2703e12c5d1SDavid du Colombier release(rem); 2713e12c5d1SDavid du Colombier continue; 2723e12c5d1SDavid du Colombier case '%': 2733e12c5d1SDavid du Colombier if(dscale() != 0) 2743e12c5d1SDavid du Colombier continue; 2753e12c5d1SDavid du Colombier binop('/'); 2763e12c5d1SDavid du Colombier p = pop(); 2773e12c5d1SDavid du Colombier release(p); 2783e12c5d1SDavid du Colombier if(irem == 0) { 2793e12c5d1SDavid du Colombier sputc(rem,skr+k); 2803e12c5d1SDavid du Colombier pushp(rem); 2813e12c5d1SDavid du Colombier continue; 2823e12c5d1SDavid du Colombier } 2833e12c5d1SDavid du Colombier p = add0(rem,skd-(skr+k)); 2843e12c5d1SDavid du Colombier q = add(p,irem); 2853e12c5d1SDavid du Colombier release(p); 2863e12c5d1SDavid du Colombier release(irem); 2873e12c5d1SDavid du Colombier sputc(q,skd); 2883e12c5d1SDavid du Colombier pushp(q); 2893e12c5d1SDavid du Colombier continue; 2903e12c5d1SDavid du Colombier case 'v': 2913e12c5d1SDavid du Colombier p = pop(); 2923e12c5d1SDavid du Colombier EMPTY; 2933e12c5d1SDavid du Colombier savk = sunputc(p); 2943e12c5d1SDavid du Colombier if(length(p) == 0) { 2953e12c5d1SDavid du Colombier sputc(p,savk); 2963e12c5d1SDavid du Colombier pushp(p); 2973e12c5d1SDavid du Colombier continue; 2983e12c5d1SDavid du Colombier } 2993e12c5d1SDavid du Colombier if(sbackc(p)<0) { 3003e12c5d1SDavid du Colombier error("sqrt of neg number\n"); 3013e12c5d1SDavid du Colombier } 3023e12c5d1SDavid du Colombier if(k<savk) 3033e12c5d1SDavid du Colombier n = savk; 3043e12c5d1SDavid du Colombier else { 3053e12c5d1SDavid du Colombier n = k*2-savk; 3063e12c5d1SDavid du Colombier savk = k; 3073e12c5d1SDavid du Colombier } 3083e12c5d1SDavid du Colombier arg1 = add0(p,n); 3093e12c5d1SDavid du Colombier arg2 = dcsqrt(arg1); 3103e12c5d1SDavid du Colombier sputc(arg2,savk); 3113e12c5d1SDavid du Colombier pushp(arg2); 3123e12c5d1SDavid du Colombier continue; 3133e12c5d1SDavid du Colombier 3143e12c5d1SDavid du Colombier case '^': 3153e12c5d1SDavid du Colombier neg = 0; 3163e12c5d1SDavid du Colombier arg1 = pop(); 3173e12c5d1SDavid du Colombier EMPTY; 3183e12c5d1SDavid du Colombier if(sunputc(arg1) != 0) 3193e12c5d1SDavid du Colombier error("exp not an integer\n"); 3203e12c5d1SDavid du Colombier arg2 = pop(); 3213e12c5d1SDavid du Colombier EMPTYR(arg1); 3223e12c5d1SDavid du Colombier if(sfbeg(arg1) == 0 && sbackc(arg1)<0) { 3233e12c5d1SDavid du Colombier neg++; 3243e12c5d1SDavid du Colombier chsign(arg1); 3253e12c5d1SDavid du Colombier } 3263e12c5d1SDavid du Colombier if(length(arg1)>=3) { 3273e12c5d1SDavid du Colombier error("exp too big\n"); 3283e12c5d1SDavid du Colombier } 3293e12c5d1SDavid du Colombier savk = sunputc(arg2); 3303e12c5d1SDavid du Colombier p = dcexp(arg2,arg1); 3313e12c5d1SDavid du Colombier release(arg2); 3323e12c5d1SDavid du Colombier rewind(arg1); 3333e12c5d1SDavid du Colombier c = sgetc(arg1); 3343e12c5d1SDavid du Colombier if(c == -1) 3353e12c5d1SDavid du Colombier c = 0; 3363e12c5d1SDavid du Colombier else 3373e12c5d1SDavid du Colombier if(sfeof(arg1) == 0) 3383e12c5d1SDavid du Colombier c = sgetc(arg1)*100 + c; 3393e12c5d1SDavid du Colombier d = c*savk; 3403e12c5d1SDavid du Colombier release(arg1); 3413e12c5d1SDavid du Colombier /* if(neg == 0) { removed to fix -exp bug*/ 3423e12c5d1SDavid du Colombier if(k>=savk) 3433e12c5d1SDavid du Colombier n = k; 3443e12c5d1SDavid du Colombier else 3453e12c5d1SDavid du Colombier n = savk; 3463e12c5d1SDavid du Colombier if(n<d) { 3473e12c5d1SDavid du Colombier q = removc(p,d-n); 3483e12c5d1SDavid du Colombier sputc(q,n); 3493e12c5d1SDavid du Colombier pushp(q); 3503e12c5d1SDavid du Colombier } else { 3513e12c5d1SDavid du Colombier sputc(p,d); 3523e12c5d1SDavid du Colombier pushp(p); 3533e12c5d1SDavid du Colombier } 3543e12c5d1SDavid du Colombier /* } else { this is disaster for exp <-127 */ 3553e12c5d1SDavid du Colombier /* sputc(p,d); */ 3563e12c5d1SDavid du Colombier /* pushp(p); */ 3573e12c5d1SDavid du Colombier /* } */ 3583e12c5d1SDavid du Colombier if(neg == 0) 3593e12c5d1SDavid du Colombier continue; 3603e12c5d1SDavid du Colombier p = pop(); 3613e12c5d1SDavid du Colombier q = salloc(2); 3623e12c5d1SDavid du Colombier sputc(q,1); 3633e12c5d1SDavid du Colombier sputc(q,0); 3643e12c5d1SDavid du Colombier pushp(q); 3653e12c5d1SDavid du Colombier pushp(p); 3663e12c5d1SDavid du Colombier goto casediv; 3673e12c5d1SDavid du Colombier case 'z': 3683e12c5d1SDavid du Colombier p = salloc(2); 3693e12c5d1SDavid du Colombier n = stkptr - stkbeg; 3703e12c5d1SDavid du Colombier if(n >= 100) { 3713e12c5d1SDavid du Colombier sputc(p,n/100); 3723e12c5d1SDavid du Colombier n %= 100; 3733e12c5d1SDavid du Colombier } 3743e12c5d1SDavid du Colombier sputc(p,n); 3753e12c5d1SDavid du Colombier sputc(p,0); 3763e12c5d1SDavid du Colombier pushp(p); 3773e12c5d1SDavid du Colombier continue; 3783e12c5d1SDavid du Colombier case 'Z': 3793e12c5d1SDavid du Colombier p = pop(); 3803e12c5d1SDavid du Colombier EMPTY; 3813e12c5d1SDavid du Colombier n = (length(p)-1)<<1; 3823e12c5d1SDavid du Colombier fsfile(p); 3833e12c5d1SDavid du Colombier backc(p); 3843e12c5d1SDavid du Colombier if(sfbeg(p) == 0) { 3853e12c5d1SDavid du Colombier if((c = sbackc(p))<0) { 3863e12c5d1SDavid du Colombier n -= 2; 3873e12c5d1SDavid du Colombier if(sfbeg(p) == 1) 3883e12c5d1SDavid du Colombier n++; 3893e12c5d1SDavid du Colombier else { 3903e12c5d1SDavid du Colombier if((c = sbackc(p)) == 0) 3913e12c5d1SDavid du Colombier n++; 3923e12c5d1SDavid du Colombier else 3933e12c5d1SDavid du Colombier if(c > 90) 3943e12c5d1SDavid du Colombier n--; 3953e12c5d1SDavid du Colombier } 3963e12c5d1SDavid du Colombier } else 3973e12c5d1SDavid du Colombier if(c < 10) 3983e12c5d1SDavid du Colombier n--; 3993e12c5d1SDavid du Colombier } 4003e12c5d1SDavid du Colombier release(p); 4013e12c5d1SDavid du Colombier q = salloc(1); 4023e12c5d1SDavid du Colombier if(n >= 100) { 4033e12c5d1SDavid du Colombier sputc(q,n%100); 4043e12c5d1SDavid du Colombier n /= 100; 4053e12c5d1SDavid du Colombier } 4063e12c5d1SDavid du Colombier sputc(q,n); 4073e12c5d1SDavid du Colombier sputc(q,0); 4083e12c5d1SDavid du Colombier pushp(q); 4093e12c5d1SDavid du Colombier continue; 4103e12c5d1SDavid du Colombier case 'i': 4113e12c5d1SDavid du Colombier p = pop(); 4123e12c5d1SDavid du Colombier EMPTY; 4133e12c5d1SDavid du Colombier p = scalint(p); 4143e12c5d1SDavid du Colombier release(inbas); 4153e12c5d1SDavid du Colombier inbas = p; 4163e12c5d1SDavid du Colombier continue; 4173e12c5d1SDavid du Colombier case 'I': 4183e12c5d1SDavid du Colombier p = copy(inbas,length(inbas)+1); 4193e12c5d1SDavid du Colombier sputc(p,0); 4203e12c5d1SDavid du Colombier pushp(p); 4213e12c5d1SDavid du Colombier continue; 4223e12c5d1SDavid du Colombier case 'o': 4233e12c5d1SDavid du Colombier p = pop(); 4243e12c5d1SDavid du Colombier EMPTY; 4253e12c5d1SDavid du Colombier p = scalint(p); 4263e12c5d1SDavid du Colombier sign = 0; 4273e12c5d1SDavid du Colombier n = length(p); 4283e12c5d1SDavid du Colombier q = copy(p,n); 4293e12c5d1SDavid du Colombier fsfile(q); 4303e12c5d1SDavid du Colombier l = c = sbackc(q); 4313e12c5d1SDavid du Colombier if(n != 1) { 4323e12c5d1SDavid du Colombier if(c<0) { 4333e12c5d1SDavid du Colombier sign = 1; 4343e12c5d1SDavid du Colombier chsign(q); 4353e12c5d1SDavid du Colombier n = length(q); 4363e12c5d1SDavid du Colombier fsfile(q); 4373e12c5d1SDavid du Colombier l = c = sbackc(q); 4383e12c5d1SDavid du Colombier } 4393e12c5d1SDavid du Colombier if(n != 1) { 4403e12c5d1SDavid du Colombier while(sfbeg(q) == 0) 4413e12c5d1SDavid du Colombier l = l*100+sbackc(q); 4423e12c5d1SDavid du Colombier } 4433e12c5d1SDavid du Colombier } 4443e12c5d1SDavid du Colombier logo = log2(l); 4453e12c5d1SDavid du Colombier obase = l; 4463e12c5d1SDavid du Colombier release(basptr); 4473e12c5d1SDavid du Colombier if(sign == 1) 4483e12c5d1SDavid du Colombier obase = -l; 4493e12c5d1SDavid du Colombier basptr = p; 4503e12c5d1SDavid du Colombier outdit = bigot; 4513e12c5d1SDavid du Colombier if(n == 1 && sign == 0) { 4523e12c5d1SDavid du Colombier if(c <= 16) { 4533e12c5d1SDavid du Colombier outdit = hexot; 4543e12c5d1SDavid du Colombier fw = 1; 4553e12c5d1SDavid du Colombier fw1 = 0; 4563e12c5d1SDavid du Colombier ll = 70; 4573e12c5d1SDavid du Colombier release(q); 4583e12c5d1SDavid du Colombier continue; 4593e12c5d1SDavid du Colombier } 4603e12c5d1SDavid du Colombier } 4613e12c5d1SDavid du Colombier n = 0; 4623e12c5d1SDavid du Colombier if(sign == 1) 4633e12c5d1SDavid du Colombier n++; 4643e12c5d1SDavid du Colombier p = salloc(1); 4653e12c5d1SDavid du Colombier sputc(p,-1); 4663e12c5d1SDavid du Colombier t = add(p,q); 4673e12c5d1SDavid du Colombier n += length(t)*2; 4683e12c5d1SDavid du Colombier fsfile(t); 4693e12c5d1SDavid du Colombier if(sbackc(t)>9) 4703e12c5d1SDavid du Colombier n++; 4713e12c5d1SDavid du Colombier release(t); 4723e12c5d1SDavid du Colombier release(q); 4733e12c5d1SDavid du Colombier release(p); 4743e12c5d1SDavid du Colombier fw = n; 4753e12c5d1SDavid du Colombier fw1 = n-1; 4763e12c5d1SDavid du Colombier ll = 70; 4773e12c5d1SDavid du Colombier if(fw>=ll) 4783e12c5d1SDavid du Colombier continue; 4793e12c5d1SDavid du Colombier ll = (70/fw)*fw; 4803e12c5d1SDavid du Colombier continue; 4813e12c5d1SDavid du Colombier case 'O': 4823e12c5d1SDavid du Colombier p = copy(basptr,length(basptr)+1); 4833e12c5d1SDavid du Colombier sputc(p,0); 4843e12c5d1SDavid du Colombier pushp(p); 4853e12c5d1SDavid du Colombier continue; 4863e12c5d1SDavid du Colombier case '[': 4873e12c5d1SDavid du Colombier n = 0; 4883e12c5d1SDavid du Colombier p = salloc(0); 4893e12c5d1SDavid du Colombier for(;;) { 4903e12c5d1SDavid du Colombier if((c = readc()) == ']') { 4913e12c5d1SDavid du Colombier if(n == 0) 4923e12c5d1SDavid du Colombier break; 4933e12c5d1SDavid du Colombier n--; 4943e12c5d1SDavid du Colombier } 4953e12c5d1SDavid du Colombier sputc(p,c); 4963e12c5d1SDavid du Colombier if(c == '[') 4973e12c5d1SDavid du Colombier n++; 4983e12c5d1SDavid du Colombier } 4993e12c5d1SDavid du Colombier pushp(p); 5003e12c5d1SDavid du Colombier continue; 5013e12c5d1SDavid du Colombier case 'k': 5023e12c5d1SDavid du Colombier p = pop(); 5033e12c5d1SDavid du Colombier EMPTY; 5043e12c5d1SDavid du Colombier p = scalint(p); 5053e12c5d1SDavid du Colombier if(length(p)>1) { 5063e12c5d1SDavid du Colombier error("scale too big\n"); 5073e12c5d1SDavid du Colombier } 5083e12c5d1SDavid du Colombier rewind(p); 5093e12c5d1SDavid du Colombier k = 0; 5103e12c5d1SDavid du Colombier if(!sfeof(p)) 5113e12c5d1SDavid du Colombier k = sgetc(p); 5123e12c5d1SDavid du Colombier release(scalptr); 5133e12c5d1SDavid du Colombier scalptr = p; 5143e12c5d1SDavid du Colombier continue; 5153e12c5d1SDavid du Colombier case 'K': 5163e12c5d1SDavid du Colombier p = copy(scalptr,length(scalptr)+1); 5173e12c5d1SDavid du Colombier sputc(p,0); 5183e12c5d1SDavid du Colombier pushp(p); 5193e12c5d1SDavid du Colombier continue; 5203e12c5d1SDavid du Colombier case 'X': 5213e12c5d1SDavid du Colombier p = pop(); 5223e12c5d1SDavid du Colombier EMPTY; 5233e12c5d1SDavid du Colombier fsfile(p); 5243e12c5d1SDavid du Colombier n = sbackc(p); 5253e12c5d1SDavid du Colombier release(p); 5263e12c5d1SDavid du Colombier p = salloc(2); 5273e12c5d1SDavid du Colombier sputc(p,n); 5283e12c5d1SDavid du Colombier sputc(p,0); 5293e12c5d1SDavid du Colombier pushp(p); 5303e12c5d1SDavid du Colombier continue; 5313e12c5d1SDavid du Colombier case 'Q': 5323e12c5d1SDavid du Colombier p = pop(); 5333e12c5d1SDavid du Colombier EMPTY; 5343e12c5d1SDavid du Colombier if(length(p)>2) { 5353e12c5d1SDavid du Colombier error("Q?\n"); 5363e12c5d1SDavid du Colombier } 5373e12c5d1SDavid du Colombier rewind(p); 5383e12c5d1SDavid du Colombier if((c = sgetc(p))<0) { 5393e12c5d1SDavid du Colombier error("neg Q\n"); 5403e12c5d1SDavid du Colombier } 5413e12c5d1SDavid du Colombier release(p); 5423e12c5d1SDavid du Colombier while(c-- > 0) { 5433e12c5d1SDavid du Colombier if(readptr == &readstk[0]) { 5443e12c5d1SDavid du Colombier error("readstk?\n"); 5453e12c5d1SDavid du Colombier } 5463e12c5d1SDavid du Colombier if(*readptr != 0) 5473e12c5d1SDavid du Colombier release(*readptr); 5483e12c5d1SDavid du Colombier readptr--; 5493e12c5d1SDavid du Colombier } 5503e12c5d1SDavid du Colombier continue; 5513e12c5d1SDavid du Colombier case 'q': 5523e12c5d1SDavid du Colombier if(readptr <= &readstk[1]) 5533e12c5d1SDavid du Colombier exits(0); 5543e12c5d1SDavid du Colombier if(*readptr != 0) 5553e12c5d1SDavid du Colombier release(*readptr); 5563e12c5d1SDavid du Colombier readptr--; 5573e12c5d1SDavid du Colombier if(*readptr != 0) 5583e12c5d1SDavid du Colombier release(*readptr); 5593e12c5d1SDavid du Colombier readptr--; 5603e12c5d1SDavid du Colombier continue; 5613e12c5d1SDavid du Colombier case 'f': 5623e12c5d1SDavid du Colombier if(stkptr == &stack[0]) 5633e12c5d1SDavid du Colombier Bprint(&bout,"empty stack\n"); 5643e12c5d1SDavid du Colombier else { 5653e12c5d1SDavid du Colombier for(ptr = stkptr; ptr > &stack[0];) { 5663e12c5d1SDavid du Colombier dcprint(*ptr--); 5673e12c5d1SDavid du Colombier } 5683e12c5d1SDavid du Colombier } 5693e12c5d1SDavid du Colombier continue; 5703e12c5d1SDavid du Colombier case 'p': 5713e12c5d1SDavid du Colombier if(stkptr == &stack[0]) 5723e12c5d1SDavid du Colombier Bprint(&bout,"empty stack\n"); 5733e12c5d1SDavid du Colombier else { 5743e12c5d1SDavid du Colombier dcprint(*stkptr); 5753e12c5d1SDavid du Colombier } 5763e12c5d1SDavid du Colombier continue; 5773e12c5d1SDavid du Colombier case 'P': 5783e12c5d1SDavid du Colombier p = pop(); 5793e12c5d1SDavid du Colombier EMPTY; 5803e12c5d1SDavid du Colombier sputc(p,0); 5813e12c5d1SDavid du Colombier Bprint(&bout,"%s",p->beg); 5823e12c5d1SDavid du Colombier release(p); 5833e12c5d1SDavid du Colombier continue; 5843e12c5d1SDavid du Colombier case 'd': 5853e12c5d1SDavid du Colombier if(stkptr == &stack[0]) { 5863e12c5d1SDavid du Colombier Bprint(&bout,"empty stack\n"); 5873e12c5d1SDavid du Colombier continue; 5883e12c5d1SDavid du Colombier } 5893e12c5d1SDavid du Colombier q = *stkptr; 5903e12c5d1SDavid du Colombier n = length(q); 5913e12c5d1SDavid du Colombier p = copy(*stkptr,n); 5923e12c5d1SDavid du Colombier pushp(p); 5933e12c5d1SDavid du Colombier continue; 5943e12c5d1SDavid du Colombier case 'c': 5953e12c5d1SDavid du Colombier while(stkerr == 0) { 5963e12c5d1SDavid du Colombier p = pop(); 5973e12c5d1SDavid du Colombier if(stkerr == 0) 5983e12c5d1SDavid du Colombier release(p); 5993e12c5d1SDavid du Colombier } 6003e12c5d1SDavid du Colombier continue; 6013e12c5d1SDavid du Colombier case 'S': 6023e12c5d1SDavid du Colombier if(stkptr == &stack[0]) { 6033e12c5d1SDavid du Colombier error("save: args\n"); 6043e12c5d1SDavid du Colombier } 6053e12c5d1SDavid du Colombier c = readc() & 0377; 6063e12c5d1SDavid du Colombier sptr = stable[c]; 6073e12c5d1SDavid du Colombier sp = stable[c] = sfree; 6083e12c5d1SDavid du Colombier sfree = sfree->next; 6093e12c5d1SDavid du Colombier if(sfree == 0) 6103e12c5d1SDavid du Colombier goto sempty; 6113e12c5d1SDavid du Colombier sp->next = sptr; 6123e12c5d1SDavid du Colombier p = pop(); 6133e12c5d1SDavid du Colombier EMPTY; 6143e12c5d1SDavid du Colombier if(c >= ARRAYST) { 6153e12c5d1SDavid du Colombier q = copy(p,length(p)+PTRSZ); 6163e12c5d1SDavid du Colombier for(n = 0;n < PTRSZ;n++) { 6173e12c5d1SDavid du Colombier sputc(q,0); 6183e12c5d1SDavid du Colombier } 6193e12c5d1SDavid du Colombier release(p); 6203e12c5d1SDavid du Colombier p = q; 6213e12c5d1SDavid du Colombier } 6223e12c5d1SDavid du Colombier sp->val = p; 6233e12c5d1SDavid du Colombier continue; 6243e12c5d1SDavid du Colombier sempty: 6253e12c5d1SDavid du Colombier error("symbol table overflow\n"); 6263e12c5d1SDavid du Colombier case 's': 6273e12c5d1SDavid du Colombier if(stkptr == &stack[0]) { 6283e12c5d1SDavid du Colombier error("save:args\n"); 6293e12c5d1SDavid du Colombier } 6303e12c5d1SDavid du Colombier c = readc() & 0377; 6313e12c5d1SDavid du Colombier sptr = stable[c]; 6323e12c5d1SDavid du Colombier if(sptr != 0) { 6333e12c5d1SDavid du Colombier p = sptr->val; 6343e12c5d1SDavid du Colombier if(c >= ARRAYST) { 6353e12c5d1SDavid du Colombier rewind(p); 6363e12c5d1SDavid du Colombier while(sfeof(p) == 0) 6373e12c5d1SDavid du Colombier release(dcgetwd(p)); 6383e12c5d1SDavid du Colombier } 6393e12c5d1SDavid du Colombier release(p); 6403e12c5d1SDavid du Colombier } else { 6413e12c5d1SDavid du Colombier sptr = stable[c] = sfree; 6423e12c5d1SDavid du Colombier sfree = sfree->next; 6433e12c5d1SDavid du Colombier if(sfree == 0) 6443e12c5d1SDavid du Colombier goto sempty; 6453e12c5d1SDavid du Colombier sptr->next = 0; 6463e12c5d1SDavid du Colombier } 6473e12c5d1SDavid du Colombier p = pop(); 6483e12c5d1SDavid du Colombier sptr->val = p; 6493e12c5d1SDavid du Colombier continue; 6503e12c5d1SDavid du Colombier case 'l': 6513e12c5d1SDavid du Colombier load(); 6523e12c5d1SDavid du Colombier continue; 6533e12c5d1SDavid du Colombier case 'L': 6543e12c5d1SDavid du Colombier c = readc() & 0377; 6553e12c5d1SDavid du Colombier sptr = stable[c]; 6563e12c5d1SDavid du Colombier if(sptr == 0) { 6573e12c5d1SDavid du Colombier error("L?\n"); 6583e12c5d1SDavid du Colombier } 6593e12c5d1SDavid du Colombier stable[c] = sptr->next; 6603e12c5d1SDavid du Colombier sptr->next = sfree; 6613e12c5d1SDavid du Colombier sfree = sptr; 6623e12c5d1SDavid du Colombier p = sptr->val; 6633e12c5d1SDavid du Colombier if(c >= ARRAYST) { 6643e12c5d1SDavid du Colombier rewind(p); 6653e12c5d1SDavid du Colombier while(sfeof(p) == 0) { 6663e12c5d1SDavid du Colombier q = dcgetwd(p); 6673e12c5d1SDavid du Colombier if(q != 0) 6683e12c5d1SDavid du Colombier release(q); 6693e12c5d1SDavid du Colombier } 6703e12c5d1SDavid du Colombier } 6713e12c5d1SDavid du Colombier pushp(p); 6723e12c5d1SDavid du Colombier continue; 6733e12c5d1SDavid du Colombier case ':': 6743e12c5d1SDavid du Colombier p = pop(); 6753e12c5d1SDavid du Colombier EMPTY; 6763e12c5d1SDavid du Colombier q = scalint(p); 6773e12c5d1SDavid du Colombier fsfile(q); 6783e12c5d1SDavid du Colombier c = 0; 6793e12c5d1SDavid du Colombier if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) { 6803e12c5d1SDavid du Colombier error("neg index\n"); 6813e12c5d1SDavid du Colombier } 6823e12c5d1SDavid du Colombier if(length(q)>2) { 6833e12c5d1SDavid du Colombier error("index too big\n"); 6843e12c5d1SDavid du Colombier } 6853e12c5d1SDavid du Colombier if(sfbeg(q) == 0) 6863e12c5d1SDavid du Colombier c = c*100+sbackc(q); 6873e12c5d1SDavid du Colombier if(c >= MAXIND) { 6883e12c5d1SDavid du Colombier error("index too big\n"); 6893e12c5d1SDavid du Colombier } 6903e12c5d1SDavid du Colombier release(q); 6913e12c5d1SDavid du Colombier n = readc() & 0377; 6923e12c5d1SDavid du Colombier sptr = stable[n]; 6933e12c5d1SDavid du Colombier if(sptr == 0) { 6943e12c5d1SDavid du Colombier sptr = stable[n] = sfree; 6953e12c5d1SDavid du Colombier sfree = sfree->next; 6963e12c5d1SDavid du Colombier if(sfree == 0) 6973e12c5d1SDavid du Colombier goto sempty; 6983e12c5d1SDavid du Colombier sptr->next = 0; 6993e12c5d1SDavid du Colombier p = salloc((c+PTRSZ)*PTRSZ); 7003e12c5d1SDavid du Colombier zero(p); 7013e12c5d1SDavid du Colombier } else { 7023e12c5d1SDavid du Colombier p = sptr->val; 7033e12c5d1SDavid du Colombier if(length(p)-PTRSZ < c*PTRSZ) { 7043e12c5d1SDavid du Colombier q = copy(p,(c+PTRSZ)*PTRSZ); 7053e12c5d1SDavid du Colombier release(p); 7063e12c5d1SDavid du Colombier p = q; 7073e12c5d1SDavid du Colombier } 7083e12c5d1SDavid du Colombier } 7093e12c5d1SDavid du Colombier seekc(p,c*PTRSZ); 7103e12c5d1SDavid du Colombier q = lookwd(p); 7113e12c5d1SDavid du Colombier if(q!=0) 7123e12c5d1SDavid du Colombier release(q); 7133e12c5d1SDavid du Colombier s = pop(); 7143e12c5d1SDavid du Colombier EMPTY; 7153e12c5d1SDavid du Colombier salterwd(p, s); 7163e12c5d1SDavid du Colombier sptr->val = p; 7173e12c5d1SDavid du Colombier continue; 7183e12c5d1SDavid du Colombier case ';': 7193e12c5d1SDavid du Colombier p = pop(); 7203e12c5d1SDavid du Colombier EMPTY; 7213e12c5d1SDavid du Colombier q = scalint(p); 7223e12c5d1SDavid du Colombier fsfile(q); 7233e12c5d1SDavid du Colombier c = 0; 7243e12c5d1SDavid du Colombier if((sfbeg(q) == 0) && ((c = sbackc(q))<0)) { 7253e12c5d1SDavid du Colombier error("neg index\n"); 7263e12c5d1SDavid du Colombier } 7273e12c5d1SDavid du Colombier if(length(q)>2) { 7283e12c5d1SDavid du Colombier error("index too big\n"); 7293e12c5d1SDavid du Colombier } 7303e12c5d1SDavid du Colombier if(sfbeg(q) == 0) 7313e12c5d1SDavid du Colombier c = c*100+sbackc(q); 7323e12c5d1SDavid du Colombier if(c >= MAXIND) { 7333e12c5d1SDavid du Colombier error("index too big\n"); 7343e12c5d1SDavid du Colombier } 7353e12c5d1SDavid du Colombier release(q); 7363e12c5d1SDavid du Colombier n = readc() & 0377; 7373e12c5d1SDavid du Colombier sptr = stable[n]; 7383e12c5d1SDavid du Colombier if(sptr != 0){ 7393e12c5d1SDavid du Colombier p = sptr->val; 7403e12c5d1SDavid du Colombier if(length(p)-PTRSZ >= c*PTRSZ) { 7413e12c5d1SDavid du Colombier seekc(p,c*PTRSZ); 7423e12c5d1SDavid du Colombier s = dcgetwd(p); 7433e12c5d1SDavid du Colombier if(s != 0) { 7443e12c5d1SDavid du Colombier q = copy(s,length(s)); 7453e12c5d1SDavid du Colombier pushp(q); 7463e12c5d1SDavid du Colombier continue; 7473e12c5d1SDavid du Colombier } 7483e12c5d1SDavid du Colombier } 7493e12c5d1SDavid du Colombier } 7503e12c5d1SDavid du Colombier q = salloc(1); /*so uninitialized array elt prints as 0*/ 7513e12c5d1SDavid du Colombier sputc(q, 0); 7523e12c5d1SDavid du Colombier pushp(q); 7533e12c5d1SDavid du Colombier continue; 7543e12c5d1SDavid du Colombier case 'x': 7553e12c5d1SDavid du Colombier execute: 7563e12c5d1SDavid du Colombier p = pop(); 7573e12c5d1SDavid du Colombier EMPTY; 7583e12c5d1SDavid du Colombier if((readptr != &readstk[0]) && (*readptr != 0)) { 7593e12c5d1SDavid du Colombier if((*readptr)->rd == (*readptr)->wt) 7603e12c5d1SDavid du Colombier release(*readptr); 7613e12c5d1SDavid du Colombier else { 7623e12c5d1SDavid du Colombier if(readptr++ == &readstk[RDSKSZ]) { 7633e12c5d1SDavid du Colombier error("nesting depth\n"); 7643e12c5d1SDavid du Colombier } 7653e12c5d1SDavid du Colombier } 7663e12c5d1SDavid du Colombier } else 7673e12c5d1SDavid du Colombier readptr++; 7683e12c5d1SDavid du Colombier *readptr = p; 7693e12c5d1SDavid du Colombier if(p != 0) 7703e12c5d1SDavid du Colombier rewind(p); 7713e12c5d1SDavid du Colombier else { 7723e12c5d1SDavid du Colombier if((c = readc()) != '\n') 7733e12c5d1SDavid du Colombier unreadc(c); 7743e12c5d1SDavid du Colombier } 7753e12c5d1SDavid du Colombier continue; 7763e12c5d1SDavid du Colombier case '?': 7773e12c5d1SDavid du Colombier if(++readptr == &readstk[RDSKSZ]) { 7783e12c5d1SDavid du Colombier error("nesting depth\n"); 7793e12c5d1SDavid du Colombier } 7803e12c5d1SDavid du Colombier *readptr = 0; 7813e12c5d1SDavid du Colombier fsave = curfile; 7823e12c5d1SDavid du Colombier curfile = &bin; 7833e12c5d1SDavid du Colombier while((c = readc()) == '!') 7843e12c5d1SDavid du Colombier command(); 7853e12c5d1SDavid du Colombier p = salloc(0); 7863e12c5d1SDavid du Colombier sputc(p,c); 7873e12c5d1SDavid du Colombier while((c = readc()) != '\n') { 7883e12c5d1SDavid du Colombier sputc(p,c); 7893e12c5d1SDavid du Colombier if(c == '\\') 7903e12c5d1SDavid du Colombier sputc(p,readc()); 7913e12c5d1SDavid du Colombier } 7923e12c5d1SDavid du Colombier curfile = fsave; 7933e12c5d1SDavid du Colombier *readptr = p; 7943e12c5d1SDavid du Colombier continue; 7953e12c5d1SDavid du Colombier case '!': 7963e12c5d1SDavid du Colombier if(command() == 1) 7973e12c5d1SDavid du Colombier goto execute; 7983e12c5d1SDavid du Colombier continue; 7993e12c5d1SDavid du Colombier case '<': 8003e12c5d1SDavid du Colombier case '>': 8013e12c5d1SDavid du Colombier case '=': 8023e12c5d1SDavid du Colombier if(cond(c) == 1) 8033e12c5d1SDavid du Colombier goto execute; 8043e12c5d1SDavid du Colombier continue; 8053e12c5d1SDavid du Colombier default: 8063e12c5d1SDavid du Colombier Bprint(&bout,"%o is unimplemented\n",c); 8073e12c5d1SDavid du Colombier } 8083e12c5d1SDavid du Colombier } 8093e12c5d1SDavid du Colombier } 8103e12c5d1SDavid du Colombier 8113e12c5d1SDavid du Colombier Blk* 8123e12c5d1SDavid du Colombier div(Blk *ddivd, Blk *ddivr) 8133e12c5d1SDavid du Colombier { 8143e12c5d1SDavid du Colombier int divsign, remsign, offset, divcarry, 8153e12c5d1SDavid du Colombier carry, dig, magic, d, dd, under, first; 8163e12c5d1SDavid du Colombier long c, td, cc; 8173e12c5d1SDavid du Colombier Blk *ps, *px, *p, *divd, *divr; 8183e12c5d1SDavid du Colombier 8193e12c5d1SDavid du Colombier dig = 0; 8203e12c5d1SDavid du Colombier under = 0; 8213e12c5d1SDavid du Colombier divcarry = 0; 8223e12c5d1SDavid du Colombier rem = 0; 8233e12c5d1SDavid du Colombier p = salloc(0); 8243e12c5d1SDavid du Colombier if(length(ddivr) == 0) { 8253e12c5d1SDavid du Colombier pushp(ddivr); 8263e12c5d1SDavid du Colombier Bprint(&bout,"divide by 0\n"); 8273e12c5d1SDavid du Colombier return(p); 8283e12c5d1SDavid du Colombier } 8293e12c5d1SDavid du Colombier divsign = remsign = first = 0; 8303e12c5d1SDavid du Colombier divr = ddivr; 8313e12c5d1SDavid du Colombier fsfile(divr); 8323e12c5d1SDavid du Colombier if(sbackc(divr) == -1) { 8333e12c5d1SDavid du Colombier divr = copy(ddivr,length(ddivr)); 8343e12c5d1SDavid du Colombier chsign(divr); 8353e12c5d1SDavid du Colombier divsign = ~divsign; 8363e12c5d1SDavid du Colombier } 8373e12c5d1SDavid du Colombier divd = copy(ddivd,length(ddivd)); 8383e12c5d1SDavid du Colombier fsfile(divd); 8393e12c5d1SDavid du Colombier if(sfbeg(divd) == 0 && sbackc(divd) == -1) { 8403e12c5d1SDavid du Colombier chsign(divd); 8413e12c5d1SDavid du Colombier divsign = ~divsign; 8423e12c5d1SDavid du Colombier remsign = ~remsign; 8433e12c5d1SDavid du Colombier } 8443e12c5d1SDavid du Colombier offset = length(divd) - length(divr); 8453e12c5d1SDavid du Colombier if(offset < 0) 8463e12c5d1SDavid du Colombier goto ddone; 8473e12c5d1SDavid du Colombier seekc(p,offset+1); 8483e12c5d1SDavid du Colombier sputc(divd,0); 8493e12c5d1SDavid du Colombier magic = 0; 8503e12c5d1SDavid du Colombier fsfile(divr); 8513e12c5d1SDavid du Colombier c = sbackc(divr); 8523e12c5d1SDavid du Colombier if(c < 10) 8533e12c5d1SDavid du Colombier magic++; 8543e12c5d1SDavid du Colombier c = c * 100 + (sfbeg(divr)?0:sbackc(divr)); 8553e12c5d1SDavid du Colombier if(magic>0){ 8563e12c5d1SDavid du Colombier c = (c * 100 +(sfbeg(divr)?0:sbackc(divr)))*2; 8573e12c5d1SDavid du Colombier c /= 25; 8583e12c5d1SDavid du Colombier } 8593e12c5d1SDavid du Colombier while(offset >= 0) { 8603e12c5d1SDavid du Colombier first++; 8613e12c5d1SDavid du Colombier fsfile(divd); 8623e12c5d1SDavid du Colombier td = sbackc(divd) * 100; 8633e12c5d1SDavid du Colombier dd = sfbeg(divd)?0:sbackc(divd); 8643e12c5d1SDavid du Colombier td = (td + dd) * 100; 8653e12c5d1SDavid du Colombier dd = sfbeg(divd)?0:sbackc(divd); 8663e12c5d1SDavid du Colombier td = td + dd; 8673e12c5d1SDavid du Colombier cc = c; 8683e12c5d1SDavid du Colombier if(offset == 0) 8693e12c5d1SDavid du Colombier td++; 8703e12c5d1SDavid du Colombier else 8713e12c5d1SDavid du Colombier cc++; 8723e12c5d1SDavid du Colombier if(magic != 0) 8733e12c5d1SDavid du Colombier td = td<<3; 8743e12c5d1SDavid du Colombier dig = td/cc; 8753e12c5d1SDavid du Colombier under=0; 8763e12c5d1SDavid du Colombier if(td%cc < 8 && dig > 0 && magic) { 8773e12c5d1SDavid du Colombier dig--; 8783e12c5d1SDavid du Colombier under=1; 8793e12c5d1SDavid du Colombier } 8803e12c5d1SDavid du Colombier rewind(divr); 8813e12c5d1SDavid du Colombier rewind(divxyz); 8823e12c5d1SDavid du Colombier carry = 0; 8833e12c5d1SDavid du Colombier while(sfeof(divr) == 0) { 8843e12c5d1SDavid du Colombier d = sgetc(divr)*dig+carry; 8853e12c5d1SDavid du Colombier carry = d / 100; 8863e12c5d1SDavid du Colombier salterc(divxyz,d%100); 8873e12c5d1SDavid du Colombier } 8883e12c5d1SDavid du Colombier salterc(divxyz,carry); 8893e12c5d1SDavid du Colombier rewind(divxyz); 8903e12c5d1SDavid du Colombier seekc(divd,offset); 8913e12c5d1SDavid du Colombier carry = 0; 8923e12c5d1SDavid du Colombier while(sfeof(divd) == 0) { 8933e12c5d1SDavid du Colombier d = slookc(divd); 8943e12c5d1SDavid du Colombier d = d-(sfeof(divxyz)?0:sgetc(divxyz))-carry; 8953e12c5d1SDavid du Colombier carry = 0; 8963e12c5d1SDavid du Colombier if(d < 0) { 8973e12c5d1SDavid du Colombier d += 100; 8983e12c5d1SDavid du Colombier carry = 1; 8993e12c5d1SDavid du Colombier } 9003e12c5d1SDavid du Colombier salterc(divd,d); 9013e12c5d1SDavid du Colombier } 9023e12c5d1SDavid du Colombier divcarry = carry; 9033e12c5d1SDavid du Colombier backc(p); 9043e12c5d1SDavid du Colombier salterc(p,dig); 9053e12c5d1SDavid du Colombier backc(p); 9063e12c5d1SDavid du Colombier fsfile(divd); 9073e12c5d1SDavid du Colombier d=sbackc(divd); 9083e12c5d1SDavid du Colombier if((d != 0) && /*!divcarry*/ (offset != 0)) { 9093e12c5d1SDavid du Colombier d = sbackc(divd) + 100; 9103e12c5d1SDavid du Colombier salterc(divd,d); 9113e12c5d1SDavid du Colombier } 9123e12c5d1SDavid du Colombier if(--offset >= 0) 9133e12c5d1SDavid du Colombier divd->wt--; 9143e12c5d1SDavid du Colombier } 9153e12c5d1SDavid du Colombier if(under) { /* undershot last - adjust*/ 9163e12c5d1SDavid du Colombier px = copy(divr,length(divr)); /*11/88 don't corrupt ddivr*/ 9173e12c5d1SDavid du Colombier chsign(px); 9183e12c5d1SDavid du Colombier ps = add(px,divd); 9193e12c5d1SDavid du Colombier fsfile(ps); 9203e12c5d1SDavid du Colombier if(length(ps) > 0 && sbackc(ps) < 0) { 9213e12c5d1SDavid du Colombier release(ps); /*only adjust in really undershot*/ 9223e12c5d1SDavid du Colombier } else { 9233e12c5d1SDavid du Colombier release(divd); 9243e12c5d1SDavid du Colombier salterc(p, dig+1); 9253e12c5d1SDavid du Colombier divd=ps; 9263e12c5d1SDavid du Colombier } 9273e12c5d1SDavid du Colombier } 9283e12c5d1SDavid du Colombier if(divcarry != 0) { 9293e12c5d1SDavid du Colombier salterc(p,dig-1); 9303e12c5d1SDavid du Colombier salterc(divd,-1); 9313e12c5d1SDavid du Colombier ps = add(divr,divd); 9323e12c5d1SDavid du Colombier release(divd); 9333e12c5d1SDavid du Colombier divd = ps; 9343e12c5d1SDavid du Colombier } 9353e12c5d1SDavid du Colombier 9363e12c5d1SDavid du Colombier rewind(p); 9373e12c5d1SDavid du Colombier divcarry = 0; 9383e12c5d1SDavid du Colombier while(sfeof(p) == 0){ 9393e12c5d1SDavid du Colombier d = slookc(p)+divcarry; 9403e12c5d1SDavid du Colombier divcarry = 0; 9413e12c5d1SDavid du Colombier if(d >= 100){ 9423e12c5d1SDavid du Colombier d -= 100; 9433e12c5d1SDavid du Colombier divcarry = 1; 9443e12c5d1SDavid du Colombier } 9453e12c5d1SDavid du Colombier salterc(p,d); 9463e12c5d1SDavid du Colombier } 9473e12c5d1SDavid du Colombier if(divcarry != 0)salterc(p,divcarry); 9483e12c5d1SDavid du Colombier fsfile(p); 9493e12c5d1SDavid du Colombier while(sfbeg(p) == 0) { 9503e12c5d1SDavid du Colombier if(sbackc(p) != 0) 9513e12c5d1SDavid du Colombier break; 9523e12c5d1SDavid du Colombier truncate(p); 9533e12c5d1SDavid du Colombier } 9543e12c5d1SDavid du Colombier if(divsign < 0) 9553e12c5d1SDavid du Colombier chsign(p); 9563e12c5d1SDavid du Colombier fsfile(divd); 9573e12c5d1SDavid du Colombier while(sfbeg(divd) == 0) { 9583e12c5d1SDavid du Colombier if(sbackc(divd) != 0) 9593e12c5d1SDavid du Colombier break; 9603e12c5d1SDavid du Colombier truncate(divd); 9613e12c5d1SDavid du Colombier } 9623e12c5d1SDavid du Colombier ddone: 9633e12c5d1SDavid du Colombier if(remsign<0) 9643e12c5d1SDavid du Colombier chsign(divd); 9653e12c5d1SDavid du Colombier if(divr != ddivr) 9663e12c5d1SDavid du Colombier release(divr); 9673e12c5d1SDavid du Colombier rem = divd; 9683e12c5d1SDavid du Colombier return(p); 9693e12c5d1SDavid du Colombier } 9703e12c5d1SDavid du Colombier 9713e12c5d1SDavid du Colombier int 9723e12c5d1SDavid du Colombier dscale(void) 9733e12c5d1SDavid du Colombier { 9743e12c5d1SDavid du Colombier Blk *dd, *dr, *r; 9753e12c5d1SDavid du Colombier int c; 9763e12c5d1SDavid du Colombier 9773e12c5d1SDavid du Colombier dr = pop(); 9783e12c5d1SDavid du Colombier EMPTYS; 9793e12c5d1SDavid du Colombier dd = pop(); 9803e12c5d1SDavid du Colombier EMPTYSR(dr); 9813e12c5d1SDavid du Colombier fsfile(dd); 9823e12c5d1SDavid du Colombier skd = sunputc(dd); 9833e12c5d1SDavid du Colombier fsfile(dr); 9843e12c5d1SDavid du Colombier skr = sunputc(dr); 9853e12c5d1SDavid du Colombier if(sfbeg(dr) == 1 || (sfbeg(dr) == 0 && sbackc(dr) == 0)) { 9863e12c5d1SDavid du Colombier sputc(dr,skr); 9873e12c5d1SDavid du Colombier pushp(dr); 9883e12c5d1SDavid du Colombier Bprint(&bout,"divide by 0\n"); 9893e12c5d1SDavid du Colombier return(1); 9903e12c5d1SDavid du Colombier } 9913e12c5d1SDavid du Colombier if(sfbeg(dd) == 1 || (sfbeg(dd) == 0 && sbackc(dd) == 0)) { 9923e12c5d1SDavid du Colombier sputc(dd,skd); 9933e12c5d1SDavid du Colombier pushp(dd); 9943e12c5d1SDavid du Colombier return(1); 9953e12c5d1SDavid du Colombier } 9963e12c5d1SDavid du Colombier c = k-skd+skr; 9973e12c5d1SDavid du Colombier if(c < 0) 9983e12c5d1SDavid du Colombier r = removr(dd,-c); 9993e12c5d1SDavid du Colombier else { 10003e12c5d1SDavid du Colombier r = add0(dd,c); 10013e12c5d1SDavid du Colombier irem = 0; 10023e12c5d1SDavid du Colombier } 10033e12c5d1SDavid du Colombier arg1 = r; 10043e12c5d1SDavid du Colombier arg2 = dr; 10053e12c5d1SDavid du Colombier savk = k; 10063e12c5d1SDavid du Colombier return(0); 10073e12c5d1SDavid du Colombier } 10083e12c5d1SDavid du Colombier 10093e12c5d1SDavid du Colombier Blk* 10103e12c5d1SDavid du Colombier removr(Blk *p, int n) 10113e12c5d1SDavid du Colombier { 10123e12c5d1SDavid du Colombier int nn, neg; 10133e12c5d1SDavid du Colombier Blk *q, *s, *r; 10143e12c5d1SDavid du Colombier 10153e12c5d1SDavid du Colombier fsfile(p); 10163e12c5d1SDavid du Colombier neg = sbackc(p); 10173e12c5d1SDavid du Colombier if(neg < 0) 10183e12c5d1SDavid du Colombier chsign(p); 10193e12c5d1SDavid du Colombier rewind(p); 10203e12c5d1SDavid du Colombier nn = (n+1)/2; 10213e12c5d1SDavid du Colombier q = salloc(nn); 10223e12c5d1SDavid du Colombier while(n>1) { 10233e12c5d1SDavid du Colombier sputc(q,sgetc(p)); 10243e12c5d1SDavid du Colombier n -= 2; 10253e12c5d1SDavid du Colombier } 10263e12c5d1SDavid du Colombier r = salloc(2); 10273e12c5d1SDavid du Colombier while(sfeof(p) == 0) 10283e12c5d1SDavid du Colombier sputc(r,sgetc(p)); 10293e12c5d1SDavid du Colombier release(p); 10303e12c5d1SDavid du Colombier if(n == 1){ 10313e12c5d1SDavid du Colombier s = div(r,tenptr); 10323e12c5d1SDavid du Colombier release(r); 10333e12c5d1SDavid du Colombier rewind(rem); 10343e12c5d1SDavid du Colombier if(sfeof(rem) == 0) 10353e12c5d1SDavid du Colombier sputc(q,sgetc(rem)); 10363e12c5d1SDavid du Colombier release(rem); 10373e12c5d1SDavid du Colombier if(neg < 0){ 10383e12c5d1SDavid du Colombier chsign(s); 10393e12c5d1SDavid du Colombier chsign(q); 10403e12c5d1SDavid du Colombier irem = q; 10413e12c5d1SDavid du Colombier return(s); 10423e12c5d1SDavid du Colombier } 10433e12c5d1SDavid du Colombier irem = q; 10443e12c5d1SDavid du Colombier return(s); 10453e12c5d1SDavid du Colombier } 10463e12c5d1SDavid du Colombier if(neg < 0) { 10473e12c5d1SDavid du Colombier chsign(r); 10483e12c5d1SDavid du Colombier chsign(q); 10493e12c5d1SDavid du Colombier irem = q; 10503e12c5d1SDavid du Colombier return(r); 10513e12c5d1SDavid du Colombier } 10523e12c5d1SDavid du Colombier irem = q; 10533e12c5d1SDavid du Colombier return(r); 10543e12c5d1SDavid du Colombier } 10553e12c5d1SDavid du Colombier 10563e12c5d1SDavid du Colombier Blk* 10573e12c5d1SDavid du Colombier dcsqrt(Blk *p) 10583e12c5d1SDavid du Colombier { 10593e12c5d1SDavid du Colombier Blk *t, *r, *q, *s; 10603e12c5d1SDavid du Colombier int c, n, nn; 10613e12c5d1SDavid du Colombier 10623e12c5d1SDavid du Colombier n = length(p); 10633e12c5d1SDavid du Colombier fsfile(p); 10643e12c5d1SDavid du Colombier c = sbackc(p); 10653e12c5d1SDavid du Colombier if((n&1) != 1) 10663e12c5d1SDavid du Colombier c = c*100+(sfbeg(p)?0:sbackc(p)); 10673e12c5d1SDavid du Colombier n = (n+1)>>1; 10683e12c5d1SDavid du Colombier r = salloc(n); 10693e12c5d1SDavid du Colombier zero(r); 10703e12c5d1SDavid du Colombier seekc(r,n); 10713e12c5d1SDavid du Colombier nn=1; 10723e12c5d1SDavid du Colombier while((c -= nn)>=0) 10733e12c5d1SDavid du Colombier nn+=2; 10743e12c5d1SDavid du Colombier c=(nn+1)>>1; 10753e12c5d1SDavid du Colombier fsfile(r); 10763e12c5d1SDavid du Colombier backc(r); 10773e12c5d1SDavid du Colombier if(c>=100) { 10783e12c5d1SDavid du Colombier c -= 100; 10793e12c5d1SDavid du Colombier salterc(r,c); 10803e12c5d1SDavid du Colombier sputc(r,1); 10813e12c5d1SDavid du Colombier } else 10823e12c5d1SDavid du Colombier salterc(r,c); 10833e12c5d1SDavid du Colombier for(;;){ 10843e12c5d1SDavid du Colombier q = div(p,r); 10853e12c5d1SDavid du Colombier s = add(q,r); 10863e12c5d1SDavid du Colombier release(q); 10873e12c5d1SDavid du Colombier release(rem); 10883e12c5d1SDavid du Colombier q = div(s,sqtemp); 10893e12c5d1SDavid du Colombier release(s); 10903e12c5d1SDavid du Colombier release(rem); 10913e12c5d1SDavid du Colombier s = copy(r,length(r)); 10923e12c5d1SDavid du Colombier chsign(s); 10933e12c5d1SDavid du Colombier t = add(s,q); 10943e12c5d1SDavid du Colombier release(s); 10953e12c5d1SDavid du Colombier fsfile(t); 10963e12c5d1SDavid du Colombier nn = sfbeg(t)?0:sbackc(t); 10973e12c5d1SDavid du Colombier if(nn>=0) 10983e12c5d1SDavid du Colombier break; 10993e12c5d1SDavid du Colombier release(r); 11003e12c5d1SDavid du Colombier release(t); 11013e12c5d1SDavid du Colombier r = q; 11023e12c5d1SDavid du Colombier } 11033e12c5d1SDavid du Colombier release(t); 11043e12c5d1SDavid du Colombier release(q); 11053e12c5d1SDavid du Colombier release(p); 11063e12c5d1SDavid du Colombier return(r); 11073e12c5d1SDavid du Colombier } 11083e12c5d1SDavid du Colombier 11093e12c5d1SDavid du Colombier Blk* 11103e12c5d1SDavid du Colombier dcexp(Blk *base, Blk *ex) 11113e12c5d1SDavid du Colombier { 11123e12c5d1SDavid du Colombier Blk *r, *e, *p, *e1, *t, *cp; 11133e12c5d1SDavid du Colombier int temp, c, n; 11143e12c5d1SDavid du Colombier 11153e12c5d1SDavid du Colombier r = salloc(1); 11163e12c5d1SDavid du Colombier sputc(r,1); 11173e12c5d1SDavid du Colombier p = copy(base,length(base)); 11183e12c5d1SDavid du Colombier e = copy(ex,length(ex)); 11193e12c5d1SDavid du Colombier fsfile(e); 11203e12c5d1SDavid du Colombier if(sfbeg(e) != 0) 11213e12c5d1SDavid du Colombier goto edone; 11223e12c5d1SDavid du Colombier temp=0; 11233e12c5d1SDavid du Colombier c = sbackc(e); 11243e12c5d1SDavid du Colombier if(c<0) { 11253e12c5d1SDavid du Colombier temp++; 11263e12c5d1SDavid du Colombier chsign(e); 11273e12c5d1SDavid du Colombier } 11283e12c5d1SDavid du Colombier while(length(e) != 0) { 11293e12c5d1SDavid du Colombier e1=div(e,sqtemp); 11303e12c5d1SDavid du Colombier release(e); 11313e12c5d1SDavid du Colombier e = e1; 11323e12c5d1SDavid du Colombier n = length(rem); 11333e12c5d1SDavid du Colombier release(rem); 11343e12c5d1SDavid du Colombier if(n != 0) { 11353e12c5d1SDavid du Colombier e1=mult(p,r); 11363e12c5d1SDavid du Colombier release(r); 11373e12c5d1SDavid du Colombier r = e1; 11383e12c5d1SDavid du Colombier } 11393e12c5d1SDavid du Colombier t = copy(p,length(p)); 11403e12c5d1SDavid du Colombier cp = mult(p,t); 11413e12c5d1SDavid du Colombier release(p); 11423e12c5d1SDavid du Colombier release(t); 11433e12c5d1SDavid du Colombier p = cp; 11443e12c5d1SDavid du Colombier } 11453e12c5d1SDavid du Colombier if(temp != 0) { 11463e12c5d1SDavid du Colombier if((c = length(base)) == 0) { 11473e12c5d1SDavid du Colombier goto edone; 11483e12c5d1SDavid du Colombier } 11493e12c5d1SDavid du Colombier if(c>1) 11503e12c5d1SDavid du Colombier create(r); 11513e12c5d1SDavid du Colombier else { 11523e12c5d1SDavid du Colombier rewind(base); 11533e12c5d1SDavid du Colombier if((c = sgetc(base))<=1) { 11543e12c5d1SDavid du Colombier create(r); 11553e12c5d1SDavid du Colombier sputc(r,c); 11563e12c5d1SDavid du Colombier } else 11573e12c5d1SDavid du Colombier create(r); 11583e12c5d1SDavid du Colombier } 11593e12c5d1SDavid du Colombier } 11603e12c5d1SDavid du Colombier edone: 11613e12c5d1SDavid du Colombier release(p); 11623e12c5d1SDavid du Colombier release(e); 11633e12c5d1SDavid du Colombier return(r); 11643e12c5d1SDavid du Colombier } 11653e12c5d1SDavid du Colombier 11663e12c5d1SDavid du Colombier void 11673e12c5d1SDavid du Colombier init(int argc, char *argv[]) 11683e12c5d1SDavid du Colombier { 11693e12c5d1SDavid du Colombier Sym *sp; 11703e12c5d1SDavid du Colombier 11713e12c5d1SDavid du Colombier if(signal(SIGINT, SIG_IGN) != SIG_IGN) 11723e12c5d1SDavid du Colombier signal(SIGINT,onintr); 11733e12c5d1SDavid du Colombier ARGBEGIN { 11743e12c5d1SDavid du Colombier default: 11753e12c5d1SDavid du Colombier dbg = 1; 11763e12c5d1SDavid du Colombier break; 11773e12c5d1SDavid du Colombier } ARGEND 11783e12c5d1SDavid du Colombier ifile = 1; 11793e12c5d1SDavid du Colombier curfile = &bin; 11803e12c5d1SDavid du Colombier if(*argv) 11813e12c5d1SDavid du Colombier if((curfile = Bopen(*argv, OREAD)) == 0) { 11823e12c5d1SDavid du Colombier fprint(2,"dc: can't open file %s\n", *argv); 11833e12c5d1SDavid du Colombier exits("open"); 11843e12c5d1SDavid du Colombier } 11853e12c5d1SDavid du Colombier /* dummy = malloc(0); /* prepare for garbage-collection */ 11863e12c5d1SDavid du Colombier scalptr = salloc(1); 11873e12c5d1SDavid du Colombier sputc(scalptr,0); 11883e12c5d1SDavid du Colombier basptr = salloc(1); 11893e12c5d1SDavid du Colombier sputc(basptr,10); 11903e12c5d1SDavid du Colombier obase=10; 11913e12c5d1SDavid du Colombier logten=log2(10L); 11923e12c5d1SDavid du Colombier ll=70; 11933e12c5d1SDavid du Colombier fw=1; 11943e12c5d1SDavid du Colombier fw1=0; 11953e12c5d1SDavid du Colombier tenptr = salloc(1); 11963e12c5d1SDavid du Colombier sputc(tenptr,10); 11973e12c5d1SDavid du Colombier obase=10; 11983e12c5d1SDavid du Colombier inbas = salloc(1); 11993e12c5d1SDavid du Colombier sputc(inbas,10); 12003e12c5d1SDavid du Colombier sqtemp = salloc(1); 12013e12c5d1SDavid du Colombier sputc(sqtemp,2); 12023e12c5d1SDavid du Colombier chptr = salloc(0); 12033e12c5d1SDavid du Colombier strptr = salloc(0); 12043e12c5d1SDavid du Colombier divxyz = salloc(0); 12053e12c5d1SDavid du Colombier stkbeg = stkptr = &stack[0]; 12063e12c5d1SDavid du Colombier stkend = &stack[STKSZ]; 12073e12c5d1SDavid du Colombier stkerr = 0; 12083e12c5d1SDavid du Colombier readptr = &readstk[0]; 12093e12c5d1SDavid du Colombier k=0; 12103e12c5d1SDavid du Colombier sp = sptr = &symlst[0]; 12113e12c5d1SDavid du Colombier while(sptr < &symlst[TBLSZ]) { 12123e12c5d1SDavid du Colombier sptr->next = ++sp; 12133e12c5d1SDavid du Colombier sptr++; 12143e12c5d1SDavid du Colombier } 12153e12c5d1SDavid du Colombier sptr->next=0; 12163e12c5d1SDavid du Colombier sfree = &symlst[0]; 12173e12c5d1SDavid du Colombier } 12183e12c5d1SDavid du Colombier 12193e12c5d1SDavid du Colombier void 12203e12c5d1SDavid du Colombier onintr(void) 12213e12c5d1SDavid du Colombier { 12223e12c5d1SDavid du Colombier 12233e12c5d1SDavid du Colombier signal(SIGINT, onintr); 12243e12c5d1SDavid du Colombier while(readptr != &readstk[0]) { 12253e12c5d1SDavid du Colombier if(*readptr != 0) { 12263e12c5d1SDavid du Colombier release(*readptr); 12273e12c5d1SDavid du Colombier } 12283e12c5d1SDavid du Colombier readptr--; 12293e12c5d1SDavid du Colombier } 12303e12c5d1SDavid du Colombier curfile = &bin; 12313e12c5d1SDavid du Colombier commnds(); 12323e12c5d1SDavid du Colombier } 12333e12c5d1SDavid du Colombier 12343e12c5d1SDavid du Colombier void 12353e12c5d1SDavid du Colombier pushp(Blk *p) 12363e12c5d1SDavid du Colombier { 12373e12c5d1SDavid du Colombier if(stkptr == stkend) { 12383e12c5d1SDavid du Colombier Bprint(&bout,"out of stack space\n"); 12393e12c5d1SDavid du Colombier return; 12403e12c5d1SDavid du Colombier } 12413e12c5d1SDavid du Colombier stkerr=0; 12423e12c5d1SDavid du Colombier *++stkptr = p; 12433e12c5d1SDavid du Colombier return; 12443e12c5d1SDavid du Colombier } 12453e12c5d1SDavid du Colombier 12463e12c5d1SDavid du Colombier Blk* 12473e12c5d1SDavid du Colombier pop(void) 12483e12c5d1SDavid du Colombier { 12493e12c5d1SDavid du Colombier if(stkptr == stack) { 12503e12c5d1SDavid du Colombier stkerr=1; 12513e12c5d1SDavid du Colombier return(0); 12523e12c5d1SDavid du Colombier } 12533e12c5d1SDavid du Colombier return(*stkptr--); 12543e12c5d1SDavid du Colombier } 12553e12c5d1SDavid du Colombier 12563e12c5d1SDavid du Colombier Blk* 12573e12c5d1SDavid du Colombier readin(void) 12583e12c5d1SDavid du Colombier { 12593e12c5d1SDavid du Colombier Blk *p, *q; 12603e12c5d1SDavid du Colombier int dp, dpct, c; 12613e12c5d1SDavid du Colombier 12623e12c5d1SDavid du Colombier dp = dpct=0; 12633e12c5d1SDavid du Colombier p = salloc(0); 12643e12c5d1SDavid du Colombier for(;;){ 12653e12c5d1SDavid du Colombier c = readc(); 12663e12c5d1SDavid du Colombier switch(c) { 12673e12c5d1SDavid du Colombier case '.': 12683e12c5d1SDavid du Colombier if(dp != 0) 12693e12c5d1SDavid du Colombier goto gotnum; 12703e12c5d1SDavid du Colombier dp++; 12713e12c5d1SDavid du Colombier continue; 12723e12c5d1SDavid du Colombier case '\\': 12733e12c5d1SDavid du Colombier readc(); 12743e12c5d1SDavid du Colombier continue; 12753e12c5d1SDavid du Colombier default: 12763e12c5d1SDavid du Colombier if(c >= 'A' && c <= 'F') 12773e12c5d1SDavid du Colombier c = c - 'A' + 10; 12783e12c5d1SDavid du Colombier else 12793e12c5d1SDavid du Colombier if(c >= 'a' && c <= 'f') 12803e12c5d1SDavid du Colombier c = c-'a'+10; 12813e12c5d1SDavid du Colombier else 12823e12c5d1SDavid du Colombier if(c >= '0' && c <= '9') 12833e12c5d1SDavid du Colombier c -= '0'; 12843e12c5d1SDavid du Colombier else 12853e12c5d1SDavid du Colombier goto gotnum; 12863e12c5d1SDavid du Colombier if(dp != 0) { 12873e12c5d1SDavid du Colombier if(dpct >= 99) 12883e12c5d1SDavid du Colombier continue; 12893e12c5d1SDavid du Colombier dpct++; 12903e12c5d1SDavid du Colombier } 12913e12c5d1SDavid du Colombier create(chptr); 12923e12c5d1SDavid du Colombier if(c != 0) 12933e12c5d1SDavid du Colombier sputc(chptr,c); 12943e12c5d1SDavid du Colombier q = mult(p,inbas); 12953e12c5d1SDavid du Colombier release(p); 12963e12c5d1SDavid du Colombier p = add(chptr,q); 12973e12c5d1SDavid du Colombier release(q); 12983e12c5d1SDavid du Colombier } 12993e12c5d1SDavid du Colombier } 13003e12c5d1SDavid du Colombier gotnum: 13013e12c5d1SDavid du Colombier unreadc(c); 13023e12c5d1SDavid du Colombier if(dp == 0) { 13033e12c5d1SDavid du Colombier sputc(p,0); 13043e12c5d1SDavid du Colombier return(p); 13053e12c5d1SDavid du Colombier } else { 13063e12c5d1SDavid du Colombier q = scale(p,dpct); 13073e12c5d1SDavid du Colombier return(q); 13083e12c5d1SDavid du Colombier } 13093e12c5d1SDavid du Colombier } 13103e12c5d1SDavid du Colombier 13113e12c5d1SDavid du Colombier /* 13123e12c5d1SDavid du Colombier * returns pointer to struct with ct 0's & p 13133e12c5d1SDavid du Colombier */ 13143e12c5d1SDavid du Colombier Blk* 13153e12c5d1SDavid du Colombier add0(Blk *p, int ct) 13163e12c5d1SDavid du Colombier { 13173e12c5d1SDavid du Colombier Blk *q, *t; 13183e12c5d1SDavid du Colombier 13193e12c5d1SDavid du Colombier q = salloc(length(p)+(ct+1)/2); 13203e12c5d1SDavid du Colombier while(ct>1) { 13213e12c5d1SDavid du Colombier sputc(q,0); 13223e12c5d1SDavid du Colombier ct -= 2; 13233e12c5d1SDavid du Colombier } 13243e12c5d1SDavid du Colombier rewind(p); 13253e12c5d1SDavid du Colombier while(sfeof(p) == 0) { 13263e12c5d1SDavid du Colombier sputc(q,sgetc(p)); 13273e12c5d1SDavid du Colombier } 13283e12c5d1SDavid du Colombier release(p); 13293e12c5d1SDavid du Colombier if(ct == 1) { 13303e12c5d1SDavid du Colombier t = mult(tenptr,q); 13313e12c5d1SDavid du Colombier release(q); 13323e12c5d1SDavid du Colombier return(t); 13333e12c5d1SDavid du Colombier } 13343e12c5d1SDavid du Colombier return(q); 13353e12c5d1SDavid du Colombier } 13363e12c5d1SDavid du Colombier 13373e12c5d1SDavid du Colombier Blk* 13383e12c5d1SDavid du Colombier mult(Blk *p, Blk *q) 13393e12c5d1SDavid du Colombier { 13403e12c5d1SDavid du Colombier Blk *mp, *mq, *mr; 13413e12c5d1SDavid du Colombier int sign, offset, carry; 13423e12c5d1SDavid du Colombier int cq, cp, mt, mcr; 13433e12c5d1SDavid du Colombier 13443e12c5d1SDavid du Colombier offset = sign = 0; 13453e12c5d1SDavid du Colombier fsfile(p); 13463e12c5d1SDavid du Colombier mp = p; 13473e12c5d1SDavid du Colombier if(sfbeg(p) == 0) { 13483e12c5d1SDavid du Colombier if(sbackc(p)<0) { 13493e12c5d1SDavid du Colombier mp = copy(p,length(p)); 13503e12c5d1SDavid du Colombier chsign(mp); 13513e12c5d1SDavid du Colombier sign = ~sign; 13523e12c5d1SDavid du Colombier } 13533e12c5d1SDavid du Colombier } 13543e12c5d1SDavid du Colombier fsfile(q); 13553e12c5d1SDavid du Colombier mq = q; 13563e12c5d1SDavid du Colombier if(sfbeg(q) == 0){ 13573e12c5d1SDavid du Colombier if(sbackc(q)<0) { 13583e12c5d1SDavid du Colombier mq = copy(q,length(q)); 13593e12c5d1SDavid du Colombier chsign(mq); 13603e12c5d1SDavid du Colombier sign = ~sign; 13613e12c5d1SDavid du Colombier } 13623e12c5d1SDavid du Colombier } 13633e12c5d1SDavid du Colombier mr = salloc(length(mp)+length(mq)); 13643e12c5d1SDavid du Colombier zero(mr); 13653e12c5d1SDavid du Colombier rewind(mq); 13663e12c5d1SDavid du Colombier while(sfeof(mq) == 0) { 13673e12c5d1SDavid du Colombier cq = sgetc(mq); 13683e12c5d1SDavid du Colombier rewind(mp); 13693e12c5d1SDavid du Colombier rewind(mr); 13703e12c5d1SDavid du Colombier mr->rd += offset; 13713e12c5d1SDavid du Colombier carry=0; 13723e12c5d1SDavid du Colombier while(sfeof(mp) == 0) { 13733e12c5d1SDavid du Colombier cp = sgetc(mp); 13743e12c5d1SDavid du Colombier mcr = sfeof(mr)?0:slookc(mr); 13753e12c5d1SDavid du Colombier mt = cp*cq + carry + mcr; 13763e12c5d1SDavid du Colombier carry = mt/100; 13773e12c5d1SDavid du Colombier salterc(mr,mt%100); 13783e12c5d1SDavid du Colombier } 13793e12c5d1SDavid du Colombier offset++; 13803e12c5d1SDavid du Colombier if(carry != 0) { 13813e12c5d1SDavid du Colombier mcr = sfeof(mr)?0:slookc(mr); 13823e12c5d1SDavid du Colombier salterc(mr,mcr+carry); 13833e12c5d1SDavid du Colombier } 13843e12c5d1SDavid du Colombier } 13853e12c5d1SDavid du Colombier if(sign < 0) { 13863e12c5d1SDavid du Colombier chsign(mr); 13873e12c5d1SDavid du Colombier } 13883e12c5d1SDavid du Colombier if(mp != p) 13893e12c5d1SDavid du Colombier release(mp); 13903e12c5d1SDavid du Colombier if(mq != q) 13913e12c5d1SDavid du Colombier release(mq); 13923e12c5d1SDavid du Colombier return(mr); 13933e12c5d1SDavid du Colombier } 13943e12c5d1SDavid du Colombier 13953e12c5d1SDavid du Colombier void 13963e12c5d1SDavid du Colombier chsign(Blk *p) 13973e12c5d1SDavid du Colombier { 13983e12c5d1SDavid du Colombier int carry; 13993e12c5d1SDavid du Colombier char ct; 14003e12c5d1SDavid du Colombier 14013e12c5d1SDavid du Colombier carry=0; 14023e12c5d1SDavid du Colombier rewind(p); 14033e12c5d1SDavid du Colombier while(sfeof(p) == 0) { 14043e12c5d1SDavid du Colombier ct=100-slookc(p)-carry; 14053e12c5d1SDavid du Colombier carry=1; 14063e12c5d1SDavid du Colombier if(ct>=100) { 14073e12c5d1SDavid du Colombier ct -= 100; 14083e12c5d1SDavid du Colombier carry=0; 14093e12c5d1SDavid du Colombier } 14103e12c5d1SDavid du Colombier salterc(p,ct); 14113e12c5d1SDavid du Colombier } 14123e12c5d1SDavid du Colombier if(carry != 0) { 14133e12c5d1SDavid du Colombier sputc(p,-1); 14143e12c5d1SDavid du Colombier fsfile(p); 14153e12c5d1SDavid du Colombier backc(p); 14163e12c5d1SDavid du Colombier ct = sbackc(p); 14173e12c5d1SDavid du Colombier if(ct == 99 /*&& !sfbeg(p)*/) { 14183e12c5d1SDavid du Colombier truncate(p); 14193e12c5d1SDavid du Colombier sputc(p,-1); 14203e12c5d1SDavid du Colombier } 14213e12c5d1SDavid du Colombier } else{ 14223e12c5d1SDavid du Colombier fsfile(p); 14233e12c5d1SDavid du Colombier ct = sbackc(p); 14243e12c5d1SDavid du Colombier if(ct == 0) 14253e12c5d1SDavid du Colombier truncate(p); 14263e12c5d1SDavid du Colombier } 14273e12c5d1SDavid du Colombier return; 14283e12c5d1SDavid du Colombier } 14293e12c5d1SDavid du Colombier 14303e12c5d1SDavid du Colombier int 14313e12c5d1SDavid du Colombier readc(void) 14323e12c5d1SDavid du Colombier { 14333e12c5d1SDavid du Colombier loop: 14343e12c5d1SDavid du Colombier if((readptr != &readstk[0]) && (*readptr != 0)) { 14353e12c5d1SDavid du Colombier if(sfeof(*readptr) == 0) 14363e12c5d1SDavid du Colombier return(lastchar = sgetc(*readptr)); 14373e12c5d1SDavid du Colombier release(*readptr); 14383e12c5d1SDavid du Colombier readptr--; 14393e12c5d1SDavid du Colombier goto loop; 14403e12c5d1SDavid du Colombier } 14413e12c5d1SDavid du Colombier lastchar = Bgetc(curfile); 14423e12c5d1SDavid du Colombier if(lastchar != -1) 14433e12c5d1SDavid du Colombier return(lastchar); 14443e12c5d1SDavid du Colombier if(readptr != &readptr[0]) { 14453e12c5d1SDavid du Colombier readptr--; 14463e12c5d1SDavid du Colombier if(*readptr == 0) 14473e12c5d1SDavid du Colombier curfile = &bin; 14483e12c5d1SDavid du Colombier goto loop; 14493e12c5d1SDavid du Colombier } 14503e12c5d1SDavid du Colombier if(curfile != &bin) { 1451*219b2ee8SDavid du Colombier Bterm(curfile); 14523e12c5d1SDavid du Colombier curfile = &bin; 14533e12c5d1SDavid du Colombier goto loop; 14543e12c5d1SDavid du Colombier } 14553e12c5d1SDavid du Colombier exits(0); 14563e12c5d1SDavid du Colombier return 0; /* shut up ken */ 14573e12c5d1SDavid du Colombier } 14583e12c5d1SDavid du Colombier 14593e12c5d1SDavid du Colombier void 14603e12c5d1SDavid du Colombier unreadc(char c) 14613e12c5d1SDavid du Colombier { 14623e12c5d1SDavid du Colombier 14633e12c5d1SDavid du Colombier if((readptr != &readstk[0]) && (*readptr != 0)) { 14643e12c5d1SDavid du Colombier sungetc(*readptr,c); 14653e12c5d1SDavid du Colombier } else 14663e12c5d1SDavid du Colombier Bungetc(curfile); 14673e12c5d1SDavid du Colombier return; 14683e12c5d1SDavid du Colombier } 14693e12c5d1SDavid du Colombier 14703e12c5d1SDavid du Colombier void 14713e12c5d1SDavid du Colombier binop(char c) 14723e12c5d1SDavid du Colombier { 14733e12c5d1SDavid du Colombier Blk *r; 14743e12c5d1SDavid du Colombier 14753e12c5d1SDavid du Colombier r = 0; 14763e12c5d1SDavid du Colombier switch(c) { 14773e12c5d1SDavid du Colombier case '+': 14783e12c5d1SDavid du Colombier r = add(arg1,arg2); 14793e12c5d1SDavid du Colombier break; 14803e12c5d1SDavid du Colombier case '*': 14813e12c5d1SDavid du Colombier r = mult(arg1,arg2); 14823e12c5d1SDavid du Colombier break; 14833e12c5d1SDavid du Colombier case '/': 14843e12c5d1SDavid du Colombier r = div(arg1,arg2); 14853e12c5d1SDavid du Colombier break; 14863e12c5d1SDavid du Colombier } 14873e12c5d1SDavid du Colombier release(arg1); 14883e12c5d1SDavid du Colombier release(arg2); 14893e12c5d1SDavid du Colombier sputc(r,savk); 14903e12c5d1SDavid du Colombier pushp(r); 14913e12c5d1SDavid du Colombier } 14923e12c5d1SDavid du Colombier 14933e12c5d1SDavid du Colombier void 14943e12c5d1SDavid du Colombier dcprint(Blk *hptr) 14953e12c5d1SDavid du Colombier { 14963e12c5d1SDavid du Colombier Blk *p, *q, *dec; 14973e12c5d1SDavid du Colombier int dig, dout, ct, sc; 14983e12c5d1SDavid du Colombier 14993e12c5d1SDavid du Colombier rewind(hptr); 15003e12c5d1SDavid du Colombier while(sfeof(hptr) == 0) { 15013e12c5d1SDavid du Colombier if(sgetc(hptr)>99) { 15023e12c5d1SDavid du Colombier rewind(hptr); 15033e12c5d1SDavid du Colombier while(sfeof(hptr) == 0) { 15043e12c5d1SDavid du Colombier Bprint(&bout,"%c",sgetc(hptr)); 15053e12c5d1SDavid du Colombier } 15063e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 15073e12c5d1SDavid du Colombier return; 15083e12c5d1SDavid du Colombier } 15093e12c5d1SDavid du Colombier } 15103e12c5d1SDavid du Colombier fsfile(hptr); 15113e12c5d1SDavid du Colombier sc = sbackc(hptr); 15123e12c5d1SDavid du Colombier if(sfbeg(hptr) != 0) { 15133e12c5d1SDavid du Colombier Bprint(&bout,"0\n"); 15143e12c5d1SDavid du Colombier return; 15153e12c5d1SDavid du Colombier } 15163e12c5d1SDavid du Colombier count = ll; 15173e12c5d1SDavid du Colombier p = copy(hptr,length(hptr)); 15183e12c5d1SDavid du Colombier sclobber(p); 15193e12c5d1SDavid du Colombier fsfile(p); 15203e12c5d1SDavid du Colombier if(sbackc(p)<0) { 15213e12c5d1SDavid du Colombier chsign(p); 15223e12c5d1SDavid du Colombier OUTC('-'); 15233e12c5d1SDavid du Colombier } 15243e12c5d1SDavid du Colombier if((obase == 0) || (obase == -1)) { 15253e12c5d1SDavid du Colombier oneot(p,sc,'d'); 15263e12c5d1SDavid du Colombier return; 15273e12c5d1SDavid du Colombier } 15283e12c5d1SDavid du Colombier if(obase == 1) { 15293e12c5d1SDavid du Colombier oneot(p,sc,'1'); 15303e12c5d1SDavid du Colombier return; 15313e12c5d1SDavid du Colombier } 15323e12c5d1SDavid du Colombier if(obase == 10) { 15333e12c5d1SDavid du Colombier tenot(p,sc); 15343e12c5d1SDavid du Colombier return; 15353e12c5d1SDavid du Colombier } 15363e12c5d1SDavid du Colombier create(strptr); 15373e12c5d1SDavid du Colombier dig = logten*sc; 15383e12c5d1SDavid du Colombier dout = ((dig/10) + dig) / logo; 15393e12c5d1SDavid du Colombier dec = getdec(p,sc); 15403e12c5d1SDavid du Colombier p = removc(p,sc); 15413e12c5d1SDavid du Colombier while(length(p) != 0) { 15423e12c5d1SDavid du Colombier q = div(p,basptr); 15433e12c5d1SDavid du Colombier release(p); 15443e12c5d1SDavid du Colombier p = q; 15453e12c5d1SDavid du Colombier (*outdit)(rem,0); 15463e12c5d1SDavid du Colombier } 15473e12c5d1SDavid du Colombier release(p); 15483e12c5d1SDavid du Colombier fsfile(strptr); 15493e12c5d1SDavid du Colombier while(sfbeg(strptr) == 0) 15503e12c5d1SDavid du Colombier OUTC(sbackc(strptr)); 15513e12c5d1SDavid du Colombier if(sc == 0) { 15523e12c5d1SDavid du Colombier release(dec); 15533e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 15543e12c5d1SDavid du Colombier return; 15553e12c5d1SDavid du Colombier } 15563e12c5d1SDavid du Colombier create(strptr); 15573e12c5d1SDavid du Colombier OUTC('.'); 15583e12c5d1SDavid du Colombier ct=0; 15593e12c5d1SDavid du Colombier do { 15603e12c5d1SDavid du Colombier q = mult(basptr,dec); 15613e12c5d1SDavid du Colombier release(dec); 15623e12c5d1SDavid du Colombier dec = getdec(q,sc); 15633e12c5d1SDavid du Colombier p = removc(q,sc); 15643e12c5d1SDavid du Colombier (*outdit)(p,1); 15653e12c5d1SDavid du Colombier } while(++ct < dout); 15663e12c5d1SDavid du Colombier release(dec); 15673e12c5d1SDavid du Colombier rewind(strptr); 15683e12c5d1SDavid du Colombier while(sfeof(strptr) == 0) 15693e12c5d1SDavid du Colombier OUTC(sgetc(strptr)); 15703e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 15713e12c5d1SDavid du Colombier } 15723e12c5d1SDavid du Colombier 15733e12c5d1SDavid du Colombier Blk* 15743e12c5d1SDavid du Colombier getdec(Blk *p, int sc) 15753e12c5d1SDavid du Colombier { 15763e12c5d1SDavid du Colombier int cc; 15773e12c5d1SDavid du Colombier Blk *q, *t, *s; 15783e12c5d1SDavid du Colombier 15793e12c5d1SDavid du Colombier rewind(p); 15803e12c5d1SDavid du Colombier if(length(p)*2 < sc) { 15813e12c5d1SDavid du Colombier q = copy(p,length(p)); 15823e12c5d1SDavid du Colombier return(q); 15833e12c5d1SDavid du Colombier } 15843e12c5d1SDavid du Colombier q = salloc(length(p)); 15853e12c5d1SDavid du Colombier while(sc >= 1) { 15863e12c5d1SDavid du Colombier sputc(q,sgetc(p)); 15873e12c5d1SDavid du Colombier sc -= 2; 15883e12c5d1SDavid du Colombier } 15893e12c5d1SDavid du Colombier if(sc != 0) { 15903e12c5d1SDavid du Colombier t = mult(q,tenptr); 15913e12c5d1SDavid du Colombier s = salloc(cc = length(q)); 15923e12c5d1SDavid du Colombier release(q); 15933e12c5d1SDavid du Colombier rewind(t); 15943e12c5d1SDavid du Colombier while(cc-- > 0) 15953e12c5d1SDavid du Colombier sputc(s,sgetc(t)); 15963e12c5d1SDavid du Colombier sputc(s,0); 15973e12c5d1SDavid du Colombier release(t); 15983e12c5d1SDavid du Colombier t = div(s,tenptr); 15993e12c5d1SDavid du Colombier release(s); 16003e12c5d1SDavid du Colombier release(rem); 16013e12c5d1SDavid du Colombier return(t); 16023e12c5d1SDavid du Colombier } 16033e12c5d1SDavid du Colombier return(q); 16043e12c5d1SDavid du Colombier } 16053e12c5d1SDavid du Colombier 16063e12c5d1SDavid du Colombier void 16073e12c5d1SDavid du Colombier tenot(Blk *p, int sc) 16083e12c5d1SDavid du Colombier { 16093e12c5d1SDavid du Colombier int c, f; 16103e12c5d1SDavid du Colombier 16113e12c5d1SDavid du Colombier fsfile(p); 16123e12c5d1SDavid du Colombier f=0; 16133e12c5d1SDavid du Colombier while((sfbeg(p) == 0) && ((p->rd-p->beg-1)*2 >= sc)) { 16143e12c5d1SDavid du Colombier c = sbackc(p); 16153e12c5d1SDavid du Colombier if((c<10) && (f == 1)) 16163e12c5d1SDavid du Colombier Bprint(&bout,"0%d",c); 16173e12c5d1SDavid du Colombier else 16183e12c5d1SDavid du Colombier Bprint(&bout,"%d",c); 16193e12c5d1SDavid du Colombier f=1; 16203e12c5d1SDavid du Colombier TEST2; 16213e12c5d1SDavid du Colombier } 16223e12c5d1SDavid du Colombier if(sc == 0) { 16233e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 16243e12c5d1SDavid du Colombier release(p); 16253e12c5d1SDavid du Colombier return; 16263e12c5d1SDavid du Colombier } 16273e12c5d1SDavid du Colombier if((p->rd-p->beg)*2 > sc) { 16283e12c5d1SDavid du Colombier c = sbackc(p); 16293e12c5d1SDavid du Colombier Bprint(&bout,"%d.",c/10); 16303e12c5d1SDavid du Colombier TEST2; 16313e12c5d1SDavid du Colombier OUTC(c%10 +'0'); 16323e12c5d1SDavid du Colombier sc--; 16333e12c5d1SDavid du Colombier } else { 16343e12c5d1SDavid du Colombier OUTC('.'); 16353e12c5d1SDavid du Colombier } 16363e12c5d1SDavid du Colombier if(sc > (p->rd-p->beg)*2) { 16373e12c5d1SDavid du Colombier while(sc>(p->rd-p->beg)*2) { 16383e12c5d1SDavid du Colombier OUTC('0'); 16393e12c5d1SDavid du Colombier sc--; 16403e12c5d1SDavid du Colombier } 16413e12c5d1SDavid du Colombier } 16423e12c5d1SDavid du Colombier while(sc > 1) { 16433e12c5d1SDavid du Colombier c = sbackc(p); 16443e12c5d1SDavid du Colombier if(c<10) 16453e12c5d1SDavid du Colombier Bprint(&bout,"0%d",c); 16463e12c5d1SDavid du Colombier else 16473e12c5d1SDavid du Colombier Bprint(&bout,"%d",c); 16483e12c5d1SDavid du Colombier sc -= 2; 16493e12c5d1SDavid du Colombier TEST2; 16503e12c5d1SDavid du Colombier } 16513e12c5d1SDavid du Colombier if(sc == 1) { 16523e12c5d1SDavid du Colombier OUTC(sbackc(p)/10 +'0'); 16533e12c5d1SDavid du Colombier } 16543e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 16553e12c5d1SDavid du Colombier release(p); 16563e12c5d1SDavid du Colombier } 16573e12c5d1SDavid du Colombier 16583e12c5d1SDavid du Colombier void 16593e12c5d1SDavid du Colombier oneot(Blk *p, int sc, char ch) 16603e12c5d1SDavid du Colombier { 16613e12c5d1SDavid du Colombier Blk *q; 16623e12c5d1SDavid du Colombier 16633e12c5d1SDavid du Colombier q = removc(p,sc); 16643e12c5d1SDavid du Colombier create(strptr); 16653e12c5d1SDavid du Colombier sputc(strptr,-1); 16663e12c5d1SDavid du Colombier while(length(q)>0) { 16673e12c5d1SDavid du Colombier p = add(strptr,q); 16683e12c5d1SDavid du Colombier release(q); 16693e12c5d1SDavid du Colombier q = p; 16703e12c5d1SDavid du Colombier OUTC(ch); 16713e12c5d1SDavid du Colombier } 16723e12c5d1SDavid du Colombier release(q); 16733e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 16743e12c5d1SDavid du Colombier } 16753e12c5d1SDavid du Colombier 16763e12c5d1SDavid du Colombier void 16773e12c5d1SDavid du Colombier hexot(Blk *p, int flg) 16783e12c5d1SDavid du Colombier { 16793e12c5d1SDavid du Colombier int c; 16803e12c5d1SDavid du Colombier 16813e12c5d1SDavid du Colombier USED(flg); 16823e12c5d1SDavid du Colombier rewind(p); 16833e12c5d1SDavid du Colombier if(sfeof(p) != 0) { 16843e12c5d1SDavid du Colombier sputc(strptr,'0'); 16853e12c5d1SDavid du Colombier release(p); 16863e12c5d1SDavid du Colombier return; 16873e12c5d1SDavid du Colombier } 16883e12c5d1SDavid du Colombier c = sgetc(p); 16893e12c5d1SDavid du Colombier release(p); 16903e12c5d1SDavid du Colombier if(c >= 16) { 16913e12c5d1SDavid du Colombier Bprint(&bout,"hex digit > 16"); 16923e12c5d1SDavid du Colombier return; 16933e12c5d1SDavid du Colombier } 16943e12c5d1SDavid du Colombier sputc(strptr,c<10?c+'0':c-10+'a'); 16953e12c5d1SDavid du Colombier } 16963e12c5d1SDavid du Colombier 16973e12c5d1SDavid du Colombier void 16983e12c5d1SDavid du Colombier bigot(Blk *p, int flg) 16993e12c5d1SDavid du Colombier { 17003e12c5d1SDavid du Colombier Blk *t, *q; 17013e12c5d1SDavid du Colombier int neg, l; 17023e12c5d1SDavid du Colombier 17033e12c5d1SDavid du Colombier if(flg == 1) { 17043e12c5d1SDavid du Colombier t = salloc(0); 17053e12c5d1SDavid du Colombier l = 0; 17063e12c5d1SDavid du Colombier } else { 17073e12c5d1SDavid du Colombier t = strptr; 17083e12c5d1SDavid du Colombier l = length(strptr)+fw-1; 17093e12c5d1SDavid du Colombier } 17103e12c5d1SDavid du Colombier neg=0; 17113e12c5d1SDavid du Colombier if(length(p) != 0) { 17123e12c5d1SDavid du Colombier fsfile(p); 17133e12c5d1SDavid du Colombier if(sbackc(p)<0) { 17143e12c5d1SDavid du Colombier neg=1; 17153e12c5d1SDavid du Colombier chsign(p); 17163e12c5d1SDavid du Colombier } 17173e12c5d1SDavid du Colombier while(length(p) != 0) { 17183e12c5d1SDavid du Colombier q = div(p,tenptr); 17193e12c5d1SDavid du Colombier release(p); 17203e12c5d1SDavid du Colombier p = q; 17213e12c5d1SDavid du Colombier rewind(rem); 17223e12c5d1SDavid du Colombier sputc(t,sfeof(rem)?'0':sgetc(rem)+'0'); 17233e12c5d1SDavid du Colombier release(rem); 17243e12c5d1SDavid du Colombier } 17253e12c5d1SDavid du Colombier } 17263e12c5d1SDavid du Colombier release(p); 17273e12c5d1SDavid du Colombier if(flg == 1) { 17283e12c5d1SDavid du Colombier l = fw1-length(t); 17293e12c5d1SDavid du Colombier if(neg != 0) { 17303e12c5d1SDavid du Colombier l--; 17313e12c5d1SDavid du Colombier sputc(strptr,'-'); 17323e12c5d1SDavid du Colombier } 17333e12c5d1SDavid du Colombier fsfile(t); 17343e12c5d1SDavid du Colombier while(l-- > 0) 17353e12c5d1SDavid du Colombier sputc(strptr,'0'); 17363e12c5d1SDavid du Colombier while(sfbeg(t) == 0) 17373e12c5d1SDavid du Colombier sputc(strptr,sbackc(t)); 17383e12c5d1SDavid du Colombier release(t); 17393e12c5d1SDavid du Colombier } else { 17403e12c5d1SDavid du Colombier l -= length(strptr); 17413e12c5d1SDavid du Colombier while(l-- > 0) 17423e12c5d1SDavid du Colombier sputc(strptr,'0'); 17433e12c5d1SDavid du Colombier if(neg != 0) { 17443e12c5d1SDavid du Colombier sclobber(strptr); 17453e12c5d1SDavid du Colombier sputc(strptr,'-'); 17463e12c5d1SDavid du Colombier } 17473e12c5d1SDavid du Colombier } 17483e12c5d1SDavid du Colombier sputc(strptr,' '); 17493e12c5d1SDavid du Colombier } 17503e12c5d1SDavid du Colombier 17513e12c5d1SDavid du Colombier Blk* 17523e12c5d1SDavid du Colombier add(Blk *a1, Blk *a2) 17533e12c5d1SDavid du Colombier { 17543e12c5d1SDavid du Colombier Blk *p; 17553e12c5d1SDavid du Colombier int carry, n, size, c, n1, n2; 17563e12c5d1SDavid du Colombier 17573e12c5d1SDavid du Colombier size = length(a1)>length(a2)?length(a1):length(a2); 17583e12c5d1SDavid du Colombier p = salloc(size); 17593e12c5d1SDavid du Colombier rewind(a1); 17603e12c5d1SDavid du Colombier rewind(a2); 17613e12c5d1SDavid du Colombier carry=0; 17623e12c5d1SDavid du Colombier while(--size >= 0) { 17633e12c5d1SDavid du Colombier n1 = sfeof(a1)?0:sgetc(a1); 17643e12c5d1SDavid du Colombier n2 = sfeof(a2)?0:sgetc(a2); 17653e12c5d1SDavid du Colombier n = n1 + n2 + carry; 17663e12c5d1SDavid du Colombier if(n>=100) { 17673e12c5d1SDavid du Colombier carry=1; 17683e12c5d1SDavid du Colombier n -= 100; 17693e12c5d1SDavid du Colombier } else 17703e12c5d1SDavid du Colombier if(n<0) { 17713e12c5d1SDavid du Colombier carry = -1; 17723e12c5d1SDavid du Colombier n += 100; 17733e12c5d1SDavid du Colombier } else 17743e12c5d1SDavid du Colombier carry = 0; 17753e12c5d1SDavid du Colombier sputc(p,n); 17763e12c5d1SDavid du Colombier } 17773e12c5d1SDavid du Colombier if(carry != 0) 17783e12c5d1SDavid du Colombier sputc(p,carry); 17793e12c5d1SDavid du Colombier fsfile(p); 17803e12c5d1SDavid du Colombier if(sfbeg(p) == 0) { 17813e12c5d1SDavid du Colombier c = 0; 17823e12c5d1SDavid du Colombier while(sfbeg(p) == 0 && (c = sbackc(p)) == 0) 17833e12c5d1SDavid du Colombier ; 17843e12c5d1SDavid du Colombier if(c != 0) 17853e12c5d1SDavid du Colombier salterc(p,c); 17863e12c5d1SDavid du Colombier truncate(p); 17873e12c5d1SDavid du Colombier } 17883e12c5d1SDavid du Colombier fsfile(p); 17893e12c5d1SDavid du Colombier if(sfbeg(p) == 0 && sbackc(p) == -1) { 17903e12c5d1SDavid du Colombier while((c = sbackc(p)) == 99) { 17913e12c5d1SDavid du Colombier if(c == -1) 17923e12c5d1SDavid du Colombier break; 17933e12c5d1SDavid du Colombier } 17943e12c5d1SDavid du Colombier skipc(p); 17953e12c5d1SDavid du Colombier salterc(p,-1); 17963e12c5d1SDavid du Colombier truncate(p); 17973e12c5d1SDavid du Colombier } 17983e12c5d1SDavid du Colombier return(p); 17993e12c5d1SDavid du Colombier } 18003e12c5d1SDavid du Colombier 18013e12c5d1SDavid du Colombier int 18023e12c5d1SDavid du Colombier eqk(void) 18033e12c5d1SDavid du Colombier { 18043e12c5d1SDavid du Colombier Blk *p, *q; 18053e12c5d1SDavid du Colombier int skp, skq; 18063e12c5d1SDavid du Colombier 18073e12c5d1SDavid du Colombier p = pop(); 18083e12c5d1SDavid du Colombier EMPTYS; 18093e12c5d1SDavid du Colombier q = pop(); 18103e12c5d1SDavid du Colombier EMPTYSR(p); 18113e12c5d1SDavid du Colombier skp = sunputc(p); 18123e12c5d1SDavid du Colombier skq = sunputc(q); 18133e12c5d1SDavid du Colombier if(skp == skq) { 18143e12c5d1SDavid du Colombier arg1=p; 18153e12c5d1SDavid du Colombier arg2=q; 18163e12c5d1SDavid du Colombier savk = skp; 18173e12c5d1SDavid du Colombier return(0); 18183e12c5d1SDavid du Colombier } 18193e12c5d1SDavid du Colombier if(skp < skq) { 18203e12c5d1SDavid du Colombier savk = skq; 18213e12c5d1SDavid du Colombier p = add0(p,skq-skp); 18223e12c5d1SDavid du Colombier } else { 18233e12c5d1SDavid du Colombier savk = skp; 18243e12c5d1SDavid du Colombier q = add0(q,skp-skq); 18253e12c5d1SDavid du Colombier } 18263e12c5d1SDavid du Colombier arg1=p; 18273e12c5d1SDavid du Colombier arg2=q; 18283e12c5d1SDavid du Colombier return(0); 18293e12c5d1SDavid du Colombier } 18303e12c5d1SDavid du Colombier 18313e12c5d1SDavid du Colombier Blk* 18323e12c5d1SDavid du Colombier removc(Blk *p, int n) 18333e12c5d1SDavid du Colombier { 18343e12c5d1SDavid du Colombier Blk *q, *r; 18353e12c5d1SDavid du Colombier 18363e12c5d1SDavid du Colombier rewind(p); 18373e12c5d1SDavid du Colombier while(n>1) { 18383e12c5d1SDavid du Colombier skipc(p); 18393e12c5d1SDavid du Colombier n -= 2; 18403e12c5d1SDavid du Colombier } 18413e12c5d1SDavid du Colombier q = salloc(2); 18423e12c5d1SDavid du Colombier while(sfeof(p) == 0) 18433e12c5d1SDavid du Colombier sputc(q,sgetc(p)); 18443e12c5d1SDavid du Colombier if(n == 1) { 18453e12c5d1SDavid du Colombier r = div(q,tenptr); 18463e12c5d1SDavid du Colombier release(q); 18473e12c5d1SDavid du Colombier release(rem); 18483e12c5d1SDavid du Colombier q = r; 18493e12c5d1SDavid du Colombier } 18503e12c5d1SDavid du Colombier release(p); 18513e12c5d1SDavid du Colombier return(q); 18523e12c5d1SDavid du Colombier } 18533e12c5d1SDavid du Colombier 18543e12c5d1SDavid du Colombier Blk* 18553e12c5d1SDavid du Colombier scalint(Blk *p) 18563e12c5d1SDavid du Colombier { 18573e12c5d1SDavid du Colombier int n; 18583e12c5d1SDavid du Colombier 18593e12c5d1SDavid du Colombier n = sunputc(p); 18603e12c5d1SDavid du Colombier p = removc(p,n); 18613e12c5d1SDavid du Colombier return(p); 18623e12c5d1SDavid du Colombier } 18633e12c5d1SDavid du Colombier 18643e12c5d1SDavid du Colombier Blk* 18653e12c5d1SDavid du Colombier scale(Blk *p, int n) 18663e12c5d1SDavid du Colombier { 18673e12c5d1SDavid du Colombier Blk *q, *s, *t; 18683e12c5d1SDavid du Colombier 18693e12c5d1SDavid du Colombier t = add0(p,n); 18703e12c5d1SDavid du Colombier q = salloc(1); 18713e12c5d1SDavid du Colombier sputc(q,n); 18723e12c5d1SDavid du Colombier s = dcexp(inbas,q); 18733e12c5d1SDavid du Colombier release(q); 18743e12c5d1SDavid du Colombier q = div(t,s); 18753e12c5d1SDavid du Colombier release(t); 18763e12c5d1SDavid du Colombier release(s); 18773e12c5d1SDavid du Colombier release(rem); 18783e12c5d1SDavid du Colombier sputc(q,n); 18793e12c5d1SDavid du Colombier return(q); 18803e12c5d1SDavid du Colombier } 18813e12c5d1SDavid du Colombier 18823e12c5d1SDavid du Colombier int 18833e12c5d1SDavid du Colombier subt(void) 18843e12c5d1SDavid du Colombier { 18853e12c5d1SDavid du Colombier arg1=pop(); 18863e12c5d1SDavid du Colombier EMPTYS; 18873e12c5d1SDavid du Colombier savk = sunputc(arg1); 18883e12c5d1SDavid du Colombier chsign(arg1); 18893e12c5d1SDavid du Colombier sputc(arg1,savk); 18903e12c5d1SDavid du Colombier pushp(arg1); 18913e12c5d1SDavid du Colombier if(eqk() != 0) 18923e12c5d1SDavid du Colombier return(1); 18933e12c5d1SDavid du Colombier binop('+'); 18943e12c5d1SDavid du Colombier return(0); 18953e12c5d1SDavid du Colombier } 18963e12c5d1SDavid du Colombier 18973e12c5d1SDavid du Colombier int 18983e12c5d1SDavid du Colombier command(void) 18993e12c5d1SDavid du Colombier { 19003e12c5d1SDavid du Colombier char line[100], *sl; 19013e12c5d1SDavid du Colombier int pid, c; 19023e12c5d1SDavid du Colombier Waitmsg retcode; 19033e12c5d1SDavid du Colombier int (*savint)(...); 19043e12c5d1SDavid du Colombier 19053e12c5d1SDavid du Colombier switch(c = readc()) { 19063e12c5d1SDavid du Colombier case '<': 19073e12c5d1SDavid du Colombier return(cond(NL)); 19083e12c5d1SDavid du Colombier case '>': 19093e12c5d1SDavid du Colombier return(cond(NG)); 19103e12c5d1SDavid du Colombier case '=': 19113e12c5d1SDavid du Colombier return(cond(NE)); 19123e12c5d1SDavid du Colombier default: 19133e12c5d1SDavid du Colombier sl = line; 19143e12c5d1SDavid du Colombier *sl++ = c; 19153e12c5d1SDavid du Colombier while((c = readc()) != '\n') 19163e12c5d1SDavid du Colombier *sl++ = c; 19173e12c5d1SDavid du Colombier *sl = 0; 19183e12c5d1SDavid du Colombier if((pid = fork()) == 0) { 19193e12c5d1SDavid du Colombier execl("/bin/sh","sh","-c",line,0); 19203e12c5d1SDavid du Colombier exits("shell"); 19213e12c5d1SDavid du Colombier } 19223e12c5d1SDavid du Colombier savint = signal(SIGINT, SIG_IGN); 19233e12c5d1SDavid du Colombier USED(savint); 19243e12c5d1SDavid du Colombier for(;;) { 19253e12c5d1SDavid du Colombier if(wait(&retcode) < 0) 19263e12c5d1SDavid du Colombier break; 19273e12c5d1SDavid du Colombier if(atoi(retcode.pid) == pid) 19283e12c5d1SDavid du Colombier break; 19293e12c5d1SDavid du Colombier } 19303e12c5d1SDavid du Colombier signal(SIGINT,savint); 19313e12c5d1SDavid du Colombier Bprint(&bout,"!\n"); 19323e12c5d1SDavid du Colombier return(0); 19333e12c5d1SDavid du Colombier } 19343e12c5d1SDavid du Colombier } 19353e12c5d1SDavid du Colombier 19363e12c5d1SDavid du Colombier int 19373e12c5d1SDavid du Colombier cond(char c) 19383e12c5d1SDavid du Colombier { 19393e12c5d1SDavid du Colombier Blk *p; 19403e12c5d1SDavid du Colombier int cc; 19413e12c5d1SDavid du Colombier 19423e12c5d1SDavid du Colombier if(subt() != 0) 19433e12c5d1SDavid du Colombier return(1); 19443e12c5d1SDavid du Colombier p = pop(); 19453e12c5d1SDavid du Colombier sclobber(p); 19463e12c5d1SDavid du Colombier if(length(p) == 0) { 19473e12c5d1SDavid du Colombier release(p); 19483e12c5d1SDavid du Colombier if(c == '<' || c == '>' || c == NE) { 19493e12c5d1SDavid du Colombier readc(); 19503e12c5d1SDavid du Colombier return(0); 19513e12c5d1SDavid du Colombier } 19523e12c5d1SDavid du Colombier load(); 19533e12c5d1SDavid du Colombier return(1); 19543e12c5d1SDavid du Colombier } 19553e12c5d1SDavid du Colombier if(c == '='){ 19563e12c5d1SDavid du Colombier release(p); 19573e12c5d1SDavid du Colombier readc(); 19583e12c5d1SDavid du Colombier return(0); 19593e12c5d1SDavid du Colombier } 19603e12c5d1SDavid du Colombier if(c == NE) { 19613e12c5d1SDavid du Colombier release(p); 19623e12c5d1SDavid du Colombier load(); 19633e12c5d1SDavid du Colombier return(1); 19643e12c5d1SDavid du Colombier } 19653e12c5d1SDavid du Colombier fsfile(p); 19663e12c5d1SDavid du Colombier cc = sbackc(p); 19673e12c5d1SDavid du Colombier release(p); 19683e12c5d1SDavid du Colombier if((cc<0 && (c == '<' || c == NG)) || 19693e12c5d1SDavid du Colombier (cc >0) && (c == '>' || c == NL)) { 19703e12c5d1SDavid du Colombier readc(); 19713e12c5d1SDavid du Colombier return(0); 19723e12c5d1SDavid du Colombier } 19733e12c5d1SDavid du Colombier load(); 19743e12c5d1SDavid du Colombier return(1); 19753e12c5d1SDavid du Colombier } 19763e12c5d1SDavid du Colombier 19773e12c5d1SDavid du Colombier void 19783e12c5d1SDavid du Colombier load(void) 19793e12c5d1SDavid du Colombier { 19803e12c5d1SDavid du Colombier int c; 19813e12c5d1SDavid du Colombier Blk *p, *q, *t, *s; 19823e12c5d1SDavid du Colombier 19833e12c5d1SDavid du Colombier c = readc() & 0377; 19843e12c5d1SDavid du Colombier sptr = stable[c]; 19853e12c5d1SDavid du Colombier if(sptr != 0) { 19863e12c5d1SDavid du Colombier p = sptr->val; 19873e12c5d1SDavid du Colombier if(c >= ARRAYST) { 19883e12c5d1SDavid du Colombier q = salloc(length(p)); 19893e12c5d1SDavid du Colombier rewind(p); 19903e12c5d1SDavid du Colombier while(sfeof(p) == 0) { 19913e12c5d1SDavid du Colombier s = dcgetwd(p); 19923e12c5d1SDavid du Colombier if(s == 0) { 19933e12c5d1SDavid du Colombier putwd(q, (Blk*)0); 19943e12c5d1SDavid du Colombier } else { 19953e12c5d1SDavid du Colombier t = copy(s,length(s)); 19963e12c5d1SDavid du Colombier putwd(q,t); 19973e12c5d1SDavid du Colombier } 19983e12c5d1SDavid du Colombier } 19993e12c5d1SDavid du Colombier pushp(q); 20003e12c5d1SDavid du Colombier } else { 20013e12c5d1SDavid du Colombier q = copy(p,length(p)); 20023e12c5d1SDavid du Colombier pushp(q); 20033e12c5d1SDavid du Colombier } 20043e12c5d1SDavid du Colombier } else { 20053e12c5d1SDavid du Colombier q = salloc(1); 20063e12c5d1SDavid du Colombier if(c <= LASTFUN) { 20073e12c5d1SDavid du Colombier Bprint(&bout,"function %c undefined\n",c+'a'-1); 20083e12c5d1SDavid du Colombier sputc(q,'c'); 20093e12c5d1SDavid du Colombier sputc(q,'0'); 20103e12c5d1SDavid du Colombier sputc(q,' '); 20113e12c5d1SDavid du Colombier sputc(q,'1'); 20123e12c5d1SDavid du Colombier sputc(q,'Q'); 20133e12c5d1SDavid du Colombier } 20143e12c5d1SDavid du Colombier else 20153e12c5d1SDavid du Colombier sputc(q,0); 20163e12c5d1SDavid du Colombier pushp(q); 20173e12c5d1SDavid du Colombier } 20183e12c5d1SDavid du Colombier } 20193e12c5d1SDavid du Colombier 20203e12c5d1SDavid du Colombier int 20213e12c5d1SDavid du Colombier log2(long n) 20223e12c5d1SDavid du Colombier { 20233e12c5d1SDavid du Colombier int i; 20243e12c5d1SDavid du Colombier 20253e12c5d1SDavid du Colombier if(n == 0) 20263e12c5d1SDavid du Colombier return(0); 20273e12c5d1SDavid du Colombier i=31; 20283e12c5d1SDavid du Colombier if(n<0) 20293e12c5d1SDavid du Colombier return(i); 20303e12c5d1SDavid du Colombier while((n= n<<1) >0) 20313e12c5d1SDavid du Colombier i--; 20323e12c5d1SDavid du Colombier return i-1; 20333e12c5d1SDavid du Colombier } 20343e12c5d1SDavid du Colombier 20353e12c5d1SDavid du Colombier Blk* 20363e12c5d1SDavid du Colombier salloc(int size) 20373e12c5d1SDavid du Colombier { 20383e12c5d1SDavid du Colombier Blk *hdr; 20393e12c5d1SDavid du Colombier char *ptr; 20403e12c5d1SDavid du Colombier 20413e12c5d1SDavid du Colombier all++; 20423e12c5d1SDavid du Colombier lall++; 20433e12c5d1SDavid du Colombier if(all - rel > active) 20443e12c5d1SDavid du Colombier active = all - rel; 20453e12c5d1SDavid du Colombier nbytes += size; 20463e12c5d1SDavid du Colombier lbytes += size; 20473e12c5d1SDavid du Colombier if(nbytes >maxsize) 20483e12c5d1SDavid du Colombier maxsize = nbytes; 20493e12c5d1SDavid du Colombier if(size > longest) 20503e12c5d1SDavid du Colombier longest = size; 20513e12c5d1SDavid du Colombier ptr = malloc((unsigned)size); 20523e12c5d1SDavid du Colombier if(ptr == 0){ 20533e12c5d1SDavid du Colombier garbage("salloc"); 20543e12c5d1SDavid du Colombier if((ptr = malloc((unsigned)size)) == 0) 20553e12c5d1SDavid du Colombier ospace("salloc"); 20563e12c5d1SDavid du Colombier } 20573e12c5d1SDavid du Colombier if((hdr = hfree) == 0) 20583e12c5d1SDavid du Colombier hdr = morehd(); 20593e12c5d1SDavid du Colombier hfree = (Blk *)hdr->rd; 20603e12c5d1SDavid du Colombier hdr->rd = hdr->wt = hdr->beg = ptr; 20613e12c5d1SDavid du Colombier hdr->last = ptr+size; 20623e12c5d1SDavid du Colombier return(hdr); 20633e12c5d1SDavid du Colombier } 20643e12c5d1SDavid du Colombier 20653e12c5d1SDavid du Colombier Blk* 20663e12c5d1SDavid du Colombier morehd(void) 20673e12c5d1SDavid du Colombier { 20683e12c5d1SDavid du Colombier Blk *h, *kk; 20693e12c5d1SDavid du Colombier 20703e12c5d1SDavid du Colombier headmor++; 20713e12c5d1SDavid du Colombier nbytes += HEADSZ; 20723e12c5d1SDavid du Colombier hfree = h = (Blk *)malloc(HEADSZ); 20733e12c5d1SDavid du Colombier if(hfree == 0) { 20743e12c5d1SDavid du Colombier garbage("morehd"); 20753e12c5d1SDavid du Colombier if((hfree = h = (Blk*)malloc(HEADSZ)) == 0) 20763e12c5d1SDavid du Colombier ospace("headers"); 20773e12c5d1SDavid du Colombier } 20783e12c5d1SDavid du Colombier kk = h; 20793e12c5d1SDavid du Colombier while(h<hfree+(HEADSZ/BLK)) 20803e12c5d1SDavid du Colombier (h++)->rd = (char*)++kk; 20813e12c5d1SDavid du Colombier (h-1)->rd=0; 20823e12c5d1SDavid du Colombier return(hfree); 20833e12c5d1SDavid du Colombier } 20843e12c5d1SDavid du Colombier 20853e12c5d1SDavid du Colombier Blk* 20863e12c5d1SDavid du Colombier copy(Blk *hptr, int size) 20873e12c5d1SDavid du Colombier { 20883e12c5d1SDavid du Colombier Blk *hdr; 20893e12c5d1SDavid du Colombier unsigned sz; 20903e12c5d1SDavid du Colombier char *ptr; 20913e12c5d1SDavid du Colombier 20923e12c5d1SDavid du Colombier all++; 20933e12c5d1SDavid du Colombier lall++; 20943e12c5d1SDavid du Colombier lcopy++; 20953e12c5d1SDavid du Colombier nbytes += size; 20963e12c5d1SDavid du Colombier lbytes += size; 20973e12c5d1SDavid du Colombier if(size > longest) 20983e12c5d1SDavid du Colombier longest = size; 20993e12c5d1SDavid du Colombier if(size > maxsize) 21003e12c5d1SDavid du Colombier maxsize = size; 21013e12c5d1SDavid du Colombier sz = length(hptr); 21023e12c5d1SDavid du Colombier ptr = nalloc(hptr->beg, size); 21033e12c5d1SDavid du Colombier if(ptr == 0) { 21043e12c5d1SDavid du Colombier garbage("copy"); 21053e12c5d1SDavid du Colombier if((ptr = nalloc(hptr->beg, size)) == 0) { 21063e12c5d1SDavid du Colombier Bprint(&bout,"copy size %d\n",size); 21073e12c5d1SDavid du Colombier ospace("copy"); 21083e12c5d1SDavid du Colombier } 21093e12c5d1SDavid du Colombier } 21103e12c5d1SDavid du Colombier if((hdr = hfree) == 0) 21113e12c5d1SDavid du Colombier hdr = morehd(); 21123e12c5d1SDavid du Colombier hfree = (Blk *)hdr->rd; 21133e12c5d1SDavid du Colombier hdr->rd = hdr->beg = ptr; 21143e12c5d1SDavid du Colombier hdr->last = ptr+size; 21153e12c5d1SDavid du Colombier hdr->wt = ptr+sz; 21163e12c5d1SDavid du Colombier ptr = hdr->wt; 21173e12c5d1SDavid du Colombier while(ptr<hdr->last) 21183e12c5d1SDavid du Colombier *ptr++ = '\0'; 21193e12c5d1SDavid du Colombier return(hdr); 21203e12c5d1SDavid du Colombier } 21213e12c5d1SDavid du Colombier 21223e12c5d1SDavid du Colombier void 21233e12c5d1SDavid du Colombier sdump(char *s1, Blk *hptr) 21243e12c5d1SDavid du Colombier { 21253e12c5d1SDavid du Colombier char *p; 21263e12c5d1SDavid du Colombier 21273e12c5d1SDavid du Colombier Bprint(&bout,"%s %o rd %o wt %o beg %o last %o\n", 21283e12c5d1SDavid du Colombier s1,hptr,hptr->rd,hptr->wt,hptr->beg,hptr->last); 21293e12c5d1SDavid du Colombier p = hptr->beg; 21303e12c5d1SDavid du Colombier while(p < hptr->wt) 21313e12c5d1SDavid du Colombier Bprint(&bout,"%d ",*p++); 21323e12c5d1SDavid du Colombier Bprint(&bout,"\n"); 21333e12c5d1SDavid du Colombier } 21343e12c5d1SDavid du Colombier 21353e12c5d1SDavid du Colombier void 21363e12c5d1SDavid du Colombier seekc(Blk *hptr, int n) 21373e12c5d1SDavid du Colombier { 21383e12c5d1SDavid du Colombier char *nn,*p; 21393e12c5d1SDavid du Colombier 21403e12c5d1SDavid du Colombier nn = hptr->beg+n; 21413e12c5d1SDavid du Colombier if(nn > hptr->last) { 21423e12c5d1SDavid du Colombier nbytes += nn - hptr->last; 21433e12c5d1SDavid du Colombier if(nbytes > maxsize) 21443e12c5d1SDavid du Colombier maxsize = nbytes; 21453e12c5d1SDavid du Colombier lbytes += nn - hptr->last; 21463e12c5d1SDavid du Colombier if(n > longest) 21473e12c5d1SDavid du Colombier longest = n; 21483e12c5d1SDavid du Colombier /* free(hptr->beg); /**/ 21493e12c5d1SDavid du Colombier p = realloc(hptr->beg, n); 21503e12c5d1SDavid du Colombier if(p == 0) { 21513e12c5d1SDavid du Colombier /* hptr->beg = realloc(hptr->beg, hptr->last-hptr->beg); 21523e12c5d1SDavid du Colombier ** garbage("seekc"); 21533e12c5d1SDavid du Colombier ** if((p = realloc(hptr->beg, n)) == 0) 21543e12c5d1SDavid du Colombier */ ospace("seekc"); 21553e12c5d1SDavid du Colombier } 21563e12c5d1SDavid du Colombier hptr->beg = p; 21573e12c5d1SDavid du Colombier hptr->wt = hptr->last = hptr->rd = p+n; 21583e12c5d1SDavid du Colombier return; 21593e12c5d1SDavid du Colombier } 21603e12c5d1SDavid du Colombier hptr->rd = nn; 21613e12c5d1SDavid du Colombier if(nn>hptr->wt) 21623e12c5d1SDavid du Colombier hptr->wt = nn; 21633e12c5d1SDavid du Colombier } 21643e12c5d1SDavid du Colombier 21653e12c5d1SDavid du Colombier void 21663e12c5d1SDavid du Colombier salterwd(Blk *ahptr, Blk *n) 21673e12c5d1SDavid du Colombier { 21683e12c5d1SDavid du Colombier Wblk *hptr; 21693e12c5d1SDavid du Colombier 21703e12c5d1SDavid du Colombier hptr = (Wblk*)ahptr; 21713e12c5d1SDavid du Colombier if(hptr->rdw == hptr->lastw) 21723e12c5d1SDavid du Colombier more(ahptr); 21733e12c5d1SDavid du Colombier *hptr->rdw++ = n; 21743e12c5d1SDavid du Colombier if(hptr->rdw > hptr->wtw) 21753e12c5d1SDavid du Colombier hptr->wtw = hptr->rdw; 21763e12c5d1SDavid du Colombier } 21773e12c5d1SDavid du Colombier 21783e12c5d1SDavid du Colombier void 21793e12c5d1SDavid du Colombier more(Blk *hptr) 21803e12c5d1SDavid du Colombier { 21813e12c5d1SDavid du Colombier unsigned size; 21823e12c5d1SDavid du Colombier char *p; 21833e12c5d1SDavid du Colombier 21843e12c5d1SDavid du Colombier if((size=(hptr->last-hptr->beg)*2) == 0) 21853e12c5d1SDavid du Colombier size=2; 21863e12c5d1SDavid du Colombier nbytes += size/2; 21873e12c5d1SDavid du Colombier if(nbytes > maxsize) 21883e12c5d1SDavid du Colombier maxsize = nbytes; 21893e12c5d1SDavid du Colombier if(size > longest) 21903e12c5d1SDavid du Colombier longest = size; 21913e12c5d1SDavid du Colombier lbytes += size/2; 21923e12c5d1SDavid du Colombier lmore++; 21933e12c5d1SDavid du Colombier /* free(hptr->beg);/**/ 21943e12c5d1SDavid du Colombier p = realloc(hptr->beg, size); 21953e12c5d1SDavid du Colombier 21963e12c5d1SDavid du Colombier if(p == 0) { 21973e12c5d1SDavid du Colombier /* hptr->beg = realloc(hptr->beg, (hptr->last-hptr->beg)); 21983e12c5d1SDavid du Colombier ** garbage("more"); 21993e12c5d1SDavid du Colombier ** if((p = realloc(hptr->beg,size)) == 0) 22003e12c5d1SDavid du Colombier */ ospace("more"); 22013e12c5d1SDavid du Colombier } 22023e12c5d1SDavid du Colombier hptr->rd = p + (hptr->rd - hptr->beg); 22033e12c5d1SDavid du Colombier hptr->wt = p + (hptr->wt - hptr->beg); 22043e12c5d1SDavid du Colombier hptr->beg = p; 22053e12c5d1SDavid du Colombier hptr->last = p+size; 22063e12c5d1SDavid du Colombier } 22073e12c5d1SDavid du Colombier 22083e12c5d1SDavid du Colombier void 22093e12c5d1SDavid du Colombier ospace(char *s) 22103e12c5d1SDavid du Colombier { 22113e12c5d1SDavid du Colombier Bprint(&bout,"out of space: %s\n",s); 22123e12c5d1SDavid du Colombier Bprint(&bout,"all %ld rel %ld headmor %ld\n",all,rel,headmor); 22133e12c5d1SDavid du Colombier Bprint(&bout,"nbytes %ld\n",nbytes); 22143e12c5d1SDavid du Colombier sdump("stk",*stkptr); 22153e12c5d1SDavid du Colombier abort(); 22163e12c5d1SDavid du Colombier } 22173e12c5d1SDavid du Colombier 22183e12c5d1SDavid du Colombier void 22193e12c5d1SDavid du Colombier garbage(char *s) 22203e12c5d1SDavid du Colombier { 22213e12c5d1SDavid du Colombier USED(s); 22223e12c5d1SDavid du Colombier } 22233e12c5d1SDavid du Colombier 22243e12c5d1SDavid du Colombier void 22253e12c5d1SDavid du Colombier release(Blk *p) 22263e12c5d1SDavid du Colombier { 22273e12c5d1SDavid du Colombier rel++; 22283e12c5d1SDavid du Colombier lrel++; 22293e12c5d1SDavid du Colombier nbytes -= p->last - p->beg; 22303e12c5d1SDavid du Colombier p->rd = (char*)hfree; 22313e12c5d1SDavid du Colombier hfree = p; 22323e12c5d1SDavid du Colombier free(p->beg); 22333e12c5d1SDavid du Colombier } 22343e12c5d1SDavid du Colombier 22353e12c5d1SDavid du Colombier Blk* 22363e12c5d1SDavid du Colombier dcgetwd(Blk *p) 22373e12c5d1SDavid du Colombier { 22383e12c5d1SDavid du Colombier Wblk *wp; 22393e12c5d1SDavid du Colombier 22403e12c5d1SDavid du Colombier wp = (Wblk*)p; 22413e12c5d1SDavid du Colombier if(wp->rdw == wp->wtw) 22423e12c5d1SDavid du Colombier return(0); 22433e12c5d1SDavid du Colombier return(*wp->rdw++); 22443e12c5d1SDavid du Colombier } 22453e12c5d1SDavid du Colombier 22463e12c5d1SDavid du Colombier void 22473e12c5d1SDavid du Colombier putwd(Blk *p, Blk *c) 22483e12c5d1SDavid du Colombier { 22493e12c5d1SDavid du Colombier Wblk *wp; 22503e12c5d1SDavid du Colombier 22513e12c5d1SDavid du Colombier wp = (Wblk*)p; 22523e12c5d1SDavid du Colombier if(wp->wtw == wp->lastw) 22533e12c5d1SDavid du Colombier more(p); 22543e12c5d1SDavid du Colombier *wp->wtw++ = c; 22553e12c5d1SDavid du Colombier } 22563e12c5d1SDavid du Colombier 22573e12c5d1SDavid du Colombier Blk* 22583e12c5d1SDavid du Colombier lookwd(Blk *p) 22593e12c5d1SDavid du Colombier { 22603e12c5d1SDavid du Colombier Wblk *wp; 22613e12c5d1SDavid du Colombier 22623e12c5d1SDavid du Colombier wp = (Wblk*)p; 22633e12c5d1SDavid du Colombier if(wp->rdw == wp->wtw) 22643e12c5d1SDavid du Colombier return(0); 22653e12c5d1SDavid du Colombier return(*wp->rdw); 22663e12c5d1SDavid du Colombier } 22673e12c5d1SDavid du Colombier 22683e12c5d1SDavid du Colombier char* 22693e12c5d1SDavid du Colombier nalloc(char *p, unsigned nbytes) 22703e12c5d1SDavid du Colombier { 22713e12c5d1SDavid du Colombier char *q, *r; 22723e12c5d1SDavid du Colombier 22733e12c5d1SDavid du Colombier q = r = malloc(nbytes); 22743e12c5d1SDavid du Colombier if(q==0) 22753e12c5d1SDavid du Colombier return(0); 22763e12c5d1SDavid du Colombier while(nbytes--) 22773e12c5d1SDavid du Colombier *q++ = *p++; 22783e12c5d1SDavid du Colombier return(r); 22793e12c5d1SDavid du Colombier } 2280