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