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