123882Sjaap #ifndef lint
2*23904Sjaap static char sccsid[] = "@(#)n4.c	2.1 (CWI) 85/07/18";
323882Sjaap #endif lint
4*23904Sjaap /*      @(#)n4.c	1.1     */
523882Sjaap #include	<ctype.h>
623882Sjaap #include "tdef.h"
723882Sjaap #ifdef NROFF
823882Sjaap #include "tw.h"
923882Sjaap #endif
10*23904Sjaap #include "ext.h"
11*23904Sjaap #include <sgtty.h>
1223882Sjaap /*
13*23904Sjaap  * troff4.c
14*23904Sjaap  *
15*23904Sjaap  * number registers, conversion, arithmetic
16*23904Sjaap  */
1723882Sjaap 
1823882Sjaap 
1923882Sjaap int	regcnt = NNAMES;
2023882Sjaap int	falsef	= 0;	/* on if inside false branch of if */
21*23904Sjaap #define	NHASH(i)	((i>>6)^i)&0177
22*23904Sjaap struct	numtab	*nhash[128];	/* 128 == the 0177 on line above */
2323882Sjaap 
setn()2423882Sjaap setn()
2523882Sjaap {
2623882Sjaap 	register i, j;
27*23904Sjaap 	register tchar ii;
2823882Sjaap 	int	f;
2923882Sjaap 
3023882Sjaap 	f = nform = 0;
3123882Sjaap 	if ((i = cbits(ii = getach())) == '+')
3223882Sjaap 		f = 1;
3323882Sjaap 	else if (i == '-')
3423882Sjaap 		f = -1;
3523882Sjaap 	else
3623882Sjaap 		ch = ii;
3723882Sjaap 	if (falsef)
3823882Sjaap 		f = 0;
3923882Sjaap 	if ((i = getsn()) == 0)
4023882Sjaap 		return;
4123882Sjaap 	if ((i & 0177) == '.')
4223882Sjaap 		switch (i >> BYTE) {
4323882Sjaap 		case 's':
4423882Sjaap 			i = pts;
4523882Sjaap 			break;
4623882Sjaap 		case 'v':
4723882Sjaap 			i = lss;
4823882Sjaap 			break;
4923882Sjaap 		case 'f':
5023882Sjaap 			i = font;
5123882Sjaap 			break;
5223882Sjaap 		case 'p':
5323882Sjaap 			i = pl;
5423882Sjaap 			break;
5523882Sjaap 		case 't':
5623882Sjaap 			i = findt1();
5723882Sjaap 			break;
5823882Sjaap 		case 'o':
5923882Sjaap 			i = po;
6023882Sjaap 			break;
6123882Sjaap 		case 'l':
6223882Sjaap 			i = ll;
6323882Sjaap 			break;
6423882Sjaap 		case 'i':
6523882Sjaap 			i = in;
6623882Sjaap 			break;
6723882Sjaap 		case '$':
6823882Sjaap 			i = frame->nargs;
6923882Sjaap 			break;
7023882Sjaap 		case 'A':
7123882Sjaap 			i = ascii;
7223882Sjaap 			break;
7323882Sjaap 		case 'c':
74*23904Sjaap 			i = numtab[CD].val;
7523882Sjaap 			break;
7623882Sjaap 		case 'n':
7723882Sjaap 			i = lastl;
7823882Sjaap 			break;
7923882Sjaap 		case 'a':
8023882Sjaap 			i = ralss;
8123882Sjaap 			break;
8223882Sjaap 		case 'h':
8323882Sjaap 			i = dip->hnl;
8423882Sjaap 			break;
8523882Sjaap 		case 'd':
8623882Sjaap 			if (dip != d)
8723882Sjaap 				i = dip->dnl;
8823882Sjaap 			else
89*23904Sjaap 				i = numtab[NL].val;
9023882Sjaap 			break;
9123882Sjaap 		case 'u':
9223882Sjaap 			i = fi;
9323882Sjaap 			break;
9423882Sjaap 		case 'j':
9523882Sjaap 			i = ad + 2 * admod;
9623882Sjaap 			break;
9723882Sjaap 		case 'w':
98*23904Sjaap 			i = widthp;
9923882Sjaap 			break;
10023882Sjaap 		case 'x':
10123882Sjaap 			i = nel;
10223882Sjaap 			break;
10323882Sjaap 		case 'y':
10423882Sjaap 			i = un;
10523882Sjaap 			break;
10623882Sjaap 		case 'T':
10723882Sjaap 			i = dotT;
10823882Sjaap 			break; /*-Tterm used in nroff*/
10923882Sjaap 		case 'V':
11023882Sjaap 			i = VERT;
11123882Sjaap 			break;
11223882Sjaap 		case 'H':
11323882Sjaap 			i = HOR;
11423882Sjaap 			break;
11523882Sjaap 		case 'k':
11623882Sjaap 			i = ne;
11723882Sjaap 			break;
11823882Sjaap 		case 'P':
11923882Sjaap 			i = print;
12023882Sjaap 			break;
12123882Sjaap 		case 'L':
12223882Sjaap 			i = ls;
12323882Sjaap 			break;
12423882Sjaap 		case 'R':
12523882Sjaap 			i = NN - regcnt;
12623882Sjaap 			break;
12723882Sjaap 		case 'z':
12823882Sjaap 			i = dip->curd;
129*23904Sjaap 			*pbp++ = (i >> BYTE) & BYTEMASK;
130*23904Sjaap 			*pbp++ = i & BYTEMASK;
13123882Sjaap 			return;
13223882Sjaap 		case 'b':
13323882Sjaap 			i = bdtab[font];
13423882Sjaap 			break;
135*23904Sjaap 		case 'F':
136*23904Sjaap 			cpushback(cfname[ifi]);
137*23904Sjaap 			return;
138*23904Sjaap 		case 'D':
139*23904Sjaap 			i = hyalg;	/* "Dialect" register (jaap) */
14023882Sjaap 			break;
14123882Sjaap 		case 'e':
142*23904Sjaap 			i = thresh;	/* (jaap) */
14323882Sjaap 			break;
14423882Sjaap 
14523882Sjaap 		default:
14623882Sjaap 			goto s0;
14723882Sjaap 		}
14823882Sjaap 	else {
14923882Sjaap s0:
15023882Sjaap 		if ((j = findr(i)) == -1)
15123882Sjaap 			i = 0;
15223882Sjaap 		else {
153*23904Sjaap 			i = numtab[j].val = (numtab[j].val+numtab[j].inc*f);
154*23904Sjaap 			nform = numtab[j].fmt;
15523882Sjaap 		}
15623882Sjaap 	}
157*23904Sjaap 	setn1(i, nform, (tchar) 0);
15823882Sjaap }
15923882Sjaap 
160*23904Sjaap tchar	numbuf[17];
161*23904Sjaap tchar	*numbufp;
16223882Sjaap 
wrc(i)163*23904Sjaap wrc(i)
164*23904Sjaap tchar i;
165*23904Sjaap {
166*23904Sjaap 	if (numbufp >= &numbuf[16])
167*23904Sjaap 		return(0);
168*23904Sjaap 	*numbufp++ = i;
169*23904Sjaap 	return(1);
170*23904Sjaap }
171*23904Sjaap 
172*23904Sjaap 
173*23904Sjaap 
174*23904Sjaap /* insert into input number i, in format form, with size-font bits bits */
setn1(i,form,bits)175*23904Sjaap setn1(i, form, bits)
17623882Sjaap int	i;
177*23904Sjaap tchar bits;
17823882Sjaap {
17923882Sjaap 	extern int	wrc();
18023882Sjaap 
181*23904Sjaap 	numbufp = numbuf;
182*23904Sjaap 	nrbits = bits;
183*23904Sjaap 	nform = form;
18423882Sjaap 	fnumb(i, wrc);
185*23904Sjaap 	*numbufp = 0;
186*23904Sjaap 	pushback(numbuf);
18723882Sjaap }
18823882Sjaap 
18923882Sjaap 
nrehash()190*23904Sjaap nrehash()
191*23904Sjaap {
192*23904Sjaap 	register struct numtab *p;
193*23904Sjaap 	register i;
194*23904Sjaap 
195*23904Sjaap 	for (i=0; i<128; i++)
196*23904Sjaap 		nhash[i] = 0;
197*23904Sjaap 	for (p=numtab; p < &numtab[NN]; p++)
198*23904Sjaap 		p->link = 0;
199*23904Sjaap 	for (p=numtab; p < &numtab[NN]; p++) {
200*23904Sjaap 		if (p->r == 0)
201*23904Sjaap 			continue;
202*23904Sjaap 		i = NHASH(p->r);
203*23904Sjaap 		p->link = nhash[i];
204*23904Sjaap 		nhash[i] = p;
205*23904Sjaap 	}
206*23904Sjaap }
207*23904Sjaap 
nunhash(rp)208*23904Sjaap nunhash(rp)
209*23904Sjaap register struct numtab *rp;
210*23904Sjaap {
211*23904Sjaap 	register struct numtab *p;
212*23904Sjaap 	register struct numtab **lp;
213*23904Sjaap 
214*23904Sjaap 	if (rp->r == 0)
215*23904Sjaap 		return;
216*23904Sjaap 	lp = &nhash[NHASH(rp->r)];
217*23904Sjaap 	p = *lp;
218*23904Sjaap 	while (p) {
219*23904Sjaap 		if (p == rp) {
220*23904Sjaap 			*lp = p->link;
221*23904Sjaap 			p->link = 0;
222*23904Sjaap 			return;
223*23904Sjaap 		}
224*23904Sjaap 		lp = &p->link;
225*23904Sjaap 		p = p->link;
226*23904Sjaap 	}
227*23904Sjaap }
228*23904Sjaap 
findr(i)22923882Sjaap findr(i)
23023882Sjaap register int	i;
23123882Sjaap {
232*23904Sjaap 	register struct numtab *p;
233*23904Sjaap 	register h = NHASH(i);
23423882Sjaap 
23523882Sjaap 	if (i == 0)
23623882Sjaap 		return(-1);
237*23904Sjaap 	for (p = nhash[h]; p; p = p->link)
238*23904Sjaap 		if (i == p->r)
239*23904Sjaap 			return(p - numtab);
240*23904Sjaap 	for (p = numtab; p < &numtab[NN]; p++) {
241*23904Sjaap 		if (p->r == 0) {
242*23904Sjaap 			p->r = i;
243*23904Sjaap 			p->link = nhash[h];
244*23904Sjaap 			nhash[h] = p;
24523882Sjaap 			regcnt++;
246*23904Sjaap 			return(p - numtab);
24723882Sjaap 		}
24823882Sjaap 	}
249*23904Sjaap 	errprint("too many number registers (%d).", NN);
250*23904Sjaap 	done2(04);
251*23904Sjaap 	/* NOTREACHED */
25223882Sjaap }
25323882Sjaap 
usedr(i)25423882Sjaap usedr(i)	/* returns -1 if nr i has never been used */
25523882Sjaap register int	i;
25623882Sjaap {
257*23904Sjaap 	register struct numtab *p;
25823882Sjaap 
25923882Sjaap 	if (i == 0)
26023882Sjaap 		return(-1);
261*23904Sjaap 	for (p = nhash[NHASH(i)]; p; p = p->link)
262*23904Sjaap 		if (i == p->r)
263*23904Sjaap 			return(p - numtab);
264*23904Sjaap 	return -1;
26523882Sjaap }
26623882Sjaap 
26723882Sjaap 
26823882Sjaap fnumb(i, f)
269*23904Sjaap register int	i, (*f)();
27023882Sjaap {
27123882Sjaap 	register j;
27223882Sjaap 
27323882Sjaap 	j = 0;
27423882Sjaap 	if (i < 0) {
27523882Sjaap 		j = (*f)('-' | nrbits);
27623882Sjaap 		i = -i;
27723882Sjaap 	}
27823882Sjaap 	switch (nform) {
27923882Sjaap 	default:
28023882Sjaap 	case '1':
28123882Sjaap 	case 0:
282*23904Sjaap 		return decml(i, f) + j;
283*23904Sjaap 		break;
28423882Sjaap 	case 'i':
28523882Sjaap 	case 'I':
286*23904Sjaap 		return roman(i, f) + j;
287*23904Sjaap 		break;
28823882Sjaap 	case 'a':
28923882Sjaap 	case 'A':
290*23904Sjaap 		return abc(i, f) + j;
291*23904Sjaap 		break;
29223882Sjaap 	}
29323882Sjaap }
29423882Sjaap 
29523882Sjaap 
29623882Sjaap decml(i, f)
297*23904Sjaap register int	i, (*f)();
29823882Sjaap {
29923882Sjaap 	register j, k;
30023882Sjaap 
30123882Sjaap 	k = 0;
30223882Sjaap 	nform--;
30323882Sjaap 	if ((j = i / 10) || (nform > 0))
30423882Sjaap 		k = decml(j, f);
30523882Sjaap 	return(k + (*f)((i % 10 + '0') | nrbits));
30623882Sjaap }
30723882Sjaap 
30823882Sjaap 
30923882Sjaap roman(i, f)
31023882Sjaap int	i, (*f)();
31123882Sjaap {
31223882Sjaap 
31323882Sjaap 	if (!i)
31423882Sjaap 		return((*f)('0' | nrbits));
31523882Sjaap 	if (nform == 'i')
31623882Sjaap 		return(roman0(i, f, "ixcmz", "vldw"));
31723882Sjaap 	else
31823882Sjaap 		return(roman0(i, f, "IXCMZ", "VLDW"));
31923882Sjaap }
32023882Sjaap 
32123882Sjaap 
32223882Sjaap roman0(i, f, onesp, fivesp)
32323882Sjaap int	i, (*f)();
32423882Sjaap char	*onesp, *fivesp;
32523882Sjaap {
32623882Sjaap 	register q, rem, k;
32723882Sjaap 
32823882Sjaap 	k = 0;
32923882Sjaap 	if (!i)
33023882Sjaap 		return(0);
33123882Sjaap 	k = roman0(i / 10, f, onesp + 1, fivesp + 1);
33223882Sjaap 	q = (i = i % 10) / 5;
33323882Sjaap 	rem = i % 5;
33423882Sjaap 	if (rem == 4) {
33523882Sjaap 		k += (*f)(*onesp | nrbits);
33623882Sjaap 		if (q)
33723882Sjaap 			i = *(onesp + 1);
33823882Sjaap 		else
33923882Sjaap 			i = *fivesp;
34023882Sjaap 		return(k += (*f)(i | nrbits));
34123882Sjaap 	}
34223882Sjaap 	if (q)
34323882Sjaap 		k += (*f)(*fivesp | nrbits);
34423882Sjaap 	while (--rem >= 0)
34523882Sjaap 		k += (*f)(*onesp | nrbits);
34623882Sjaap 	return(k);
34723882Sjaap }
34823882Sjaap 
34923882Sjaap 
35023882Sjaap abc(i, f)
35123882Sjaap int	i, (*f)();
35223882Sjaap {
35323882Sjaap 	if (!i)
35423882Sjaap 		return((*f)('0' | nrbits));
35523882Sjaap 	else
35623882Sjaap 		return(abc0(i - 1, f));
35723882Sjaap }
35823882Sjaap 
35923882Sjaap 
36023882Sjaap abc0(i, f)
36123882Sjaap int	i, (*f)();
36223882Sjaap {
36323882Sjaap 	register j, k;
36423882Sjaap 
36523882Sjaap 	k = 0;
36623882Sjaap 	if (j = i / 26)
36723882Sjaap 		k = abc0(j - 1, f);
36823882Sjaap 	return(k + (*f)((i % 26 + nform) | nrbits));
36923882Sjaap }
37023882Sjaap 
atoi0()37123882Sjaap long	atoi0()
37223882Sjaap {
37323882Sjaap 	register c, k, cnt;
374*23904Sjaap 	register tchar ii;
37523882Sjaap 	long	i, acc;
37623882Sjaap 	extern long	ckph();
37723882Sjaap 
37823882Sjaap 	i = 0;
37923882Sjaap 	acc = 0;
38023882Sjaap 	nonumb = 0;
38123882Sjaap 	cnt = -1;
38223882Sjaap a0:
38323882Sjaap 	cnt++;
38423882Sjaap 	ii = getch();
38523882Sjaap 	c = cbits(ii);
38623882Sjaap 	switch (c) {
38723882Sjaap 	default:
38823882Sjaap 		ch = ii;
38923882Sjaap 		if (cnt)
39023882Sjaap 			break;
39123882Sjaap 	case '+':
39223882Sjaap 		i = ckph();
39323882Sjaap 		if (nonumb)
39423882Sjaap 			break;
39523882Sjaap 		acc += i;
39623882Sjaap 		goto a0;
39723882Sjaap 	case '-':
39823882Sjaap 		i = ckph();
39923882Sjaap 		if (nonumb)
40023882Sjaap 			break;
40123882Sjaap 		acc -= i;
40223882Sjaap 		goto a0;
40323882Sjaap 	case '*':
40423882Sjaap 		i = ckph();
40523882Sjaap 		if (nonumb)
40623882Sjaap 			break;
40723882Sjaap 		acc *= i;
40823882Sjaap 		goto a0;
40923882Sjaap 	case '/':
41023882Sjaap 		i = ckph();
41123882Sjaap 		if (nonumb)
41223882Sjaap 			break;
41323882Sjaap 		if (i == 0) {
41423882Sjaap 			flusho();
415*23904Sjaap 			errprint("divide by zero.");
41623882Sjaap 			acc = 0;
41723882Sjaap 		} else
41823882Sjaap 			acc /= i;
41923882Sjaap 		goto a0;
42023882Sjaap 	case '%':
42123882Sjaap 		i = ckph();
42223882Sjaap 		if (nonumb)
42323882Sjaap 			break;
42423882Sjaap 		acc %= i;
42523882Sjaap 		goto a0;
42623882Sjaap 	case '&':	/*and*/
42723882Sjaap 		i = ckph();
42823882Sjaap 		if (nonumb)
42923882Sjaap 			break;
43023882Sjaap 		if ((acc > 0) && (i > 0))
43123882Sjaap 			acc = 1;
43223882Sjaap 		else
43323882Sjaap 			acc = 0;
43423882Sjaap 		goto a0;
43523882Sjaap 	case ':':	/*or*/
43623882Sjaap 		i = ckph();
43723882Sjaap 		if (nonumb)
43823882Sjaap 			break;
43923882Sjaap 		if ((acc > 0) || (i > 0))
44023882Sjaap 			acc = 1;
44123882Sjaap 		else
44223882Sjaap 			acc = 0;
44323882Sjaap 		goto a0;
44423882Sjaap 	case '=':
44523882Sjaap 		if (cbits(ii = getch()) != '=')
44623882Sjaap 			ch = ii;
44723882Sjaap 		i = ckph();
44823882Sjaap 		if (nonumb) {
44923882Sjaap 			acc = 0;
45023882Sjaap 			break;
45123882Sjaap 		}
45223882Sjaap 		if (i == acc)
45323882Sjaap 			acc = 1;
45423882Sjaap 		else
45523882Sjaap 			acc = 0;
45623882Sjaap 		goto a0;
45723882Sjaap 	case '>':
45823882Sjaap 		k = 0;
45923882Sjaap 		if (cbits(ii = getch()) == '=')
46023882Sjaap 			k++;
46123882Sjaap 		else
46223882Sjaap 			ch = ii;
46323882Sjaap 		i = ckph();
46423882Sjaap 		if (nonumb) {
46523882Sjaap 			acc = 0;
46623882Sjaap 			break;
46723882Sjaap 		}
46823882Sjaap 		if (acc > (i - k))
46923882Sjaap 			acc = 1;
47023882Sjaap 		else
47123882Sjaap 			acc = 0;
47223882Sjaap 		goto a0;
47323882Sjaap 	case '<':
47423882Sjaap 		k = 0;
47523882Sjaap 		if (cbits(ii = getch()) == '=')
47623882Sjaap 			k++;
47723882Sjaap 		else
47823882Sjaap 			ch = ii;
47923882Sjaap 		i = ckph();
48023882Sjaap 		if (nonumb) {
48123882Sjaap 			acc = 0;
48223882Sjaap 			break;
48323882Sjaap 		}
48423882Sjaap 		if (acc < (i + k))
48523882Sjaap 			acc = 1;
48623882Sjaap 		else
48723882Sjaap 			acc = 0;
48823882Sjaap 		goto a0;
48923882Sjaap 	case ')':
49023882Sjaap 		break;
49123882Sjaap 	case '(':
49223882Sjaap 		acc = atoi0();
49323882Sjaap 		goto a0;
49423882Sjaap 	}
49523882Sjaap 	return(acc);
49623882Sjaap }
49723882Sjaap 
49823882Sjaap 
ckph()49923882Sjaap long	ckph()
50023882Sjaap {
501*23904Sjaap 	register tchar i;
502*23904Sjaap 	register long	j;
50323882Sjaap 	extern long	atoi0();
50423882Sjaap 	extern long	atoi1();
50523882Sjaap 
50623882Sjaap 	if (cbits(i = getch()) == '(')
50723882Sjaap 		j = atoi0();
50823882Sjaap 	else {
509*23904Sjaap 		j = atoi1(i);
51023882Sjaap 	}
51123882Sjaap 	return(j);
51223882Sjaap }
51323882Sjaap 
51423882Sjaap 
atoi1(ii)515*23904Sjaap long	atoi1(ii)
516*23904Sjaap register tchar ii;
51723882Sjaap {
51823882Sjaap 	register i, j, digits;
519*23904Sjaap 	register long	acc;
52023882Sjaap 	int	neg, abs, field;
52123882Sjaap 
52223882Sjaap 	neg = abs = field = digits = 0;
52323882Sjaap 	acc = 0;
524*23904Sjaap 	for (;;) {
525*23904Sjaap 		i = cbits(ii);
526*23904Sjaap 		switch (i) {
527*23904Sjaap 		default:
528*23904Sjaap 			break;
529*23904Sjaap 		case '+':
530*23904Sjaap 			ii = getch();
531*23904Sjaap 			continue;
532*23904Sjaap 		case '-':
533*23904Sjaap 			neg = 1;
534*23904Sjaap 			ii = getch();
535*23904Sjaap 			continue;
536*23904Sjaap 		case '|':
537*23904Sjaap 			abs = 1 + neg;
538*23904Sjaap 			neg = 0;
539*23904Sjaap 			ii = getch();
540*23904Sjaap 			continue;
541*23904Sjaap 		}
54223882Sjaap 		break;
54323882Sjaap 	}
54423882Sjaap a1:
545*23904Sjaap 	while (i >= '0' && i <= '9') {
54623882Sjaap 		field++;
54723882Sjaap 		digits++;
548*23904Sjaap 		acc = 10 * acc + i - '0';
549*23904Sjaap 		ii = getch();
550*23904Sjaap 		i = cbits(ii);
55123882Sjaap 	}
552*23904Sjaap 	if (i == '.') {
55323882Sjaap 		field++;
55423882Sjaap 		digits = 0;
555*23904Sjaap 		ii = getch();
556*23904Sjaap 		i = cbits(ii);
55723882Sjaap 		goto a1;
55823882Sjaap 	}
559*23904Sjaap 	if (!field) {
560*23904Sjaap 		ch = ii;
56123882Sjaap 		goto a2;
562*23904Sjaap 	}
563*23904Sjaap 	switch (i) {
56423882Sjaap 	case 'u':
56523882Sjaap 		i = j = 1;	/* should this be related to HOR?? */
56623882Sjaap 		break;
56723882Sjaap 	case 'v':	/*VSs - vert spacing*/
56823882Sjaap 		j = lss;
56923882Sjaap 		i = 1;
57023882Sjaap 		break;
57123882Sjaap 	case 'm':	/*Ems*/
57223882Sjaap 		j = EM;
57323882Sjaap 		i = 1;
57423882Sjaap 		break;
57523882Sjaap 	case 'n':	/*Ens*/
57623882Sjaap 		j = EM;
57723882Sjaap #ifndef NROFF
57823882Sjaap 		i = 2;
57923882Sjaap #endif
58023882Sjaap #ifdef NROFF
58123882Sjaap 		i = 1;	/*Same as Ems in NROFF*/
58223882Sjaap #endif
58323882Sjaap 		break;
58423882Sjaap 	case 'p':	/*Points*/
58523882Sjaap 		j = INCH;
58623882Sjaap 		i = 72;
58723882Sjaap 		break;
58823882Sjaap 	case 'i':	/*Inches*/
58923882Sjaap 		j = INCH;
59023882Sjaap 		i = 1;
59123882Sjaap 		break;
59223882Sjaap 	case 'c':	/*Centimeters*/
59323882Sjaap 		/* if INCH is too big, this will overflow */
59423882Sjaap 		j = INCH * 50;
59523882Sjaap 		i = 127;
59623882Sjaap 		break;
59723882Sjaap 	case 'P':	/*Picas*/
59823882Sjaap 		j = INCH;
59923882Sjaap 		i = 6;
60023882Sjaap 		break;
60123882Sjaap 	default:
60223882Sjaap 		j = dfact;
60323882Sjaap 		ch = ii;
60423882Sjaap 		i = dfactd;
60523882Sjaap 	}
60623882Sjaap 	if (neg)
60723882Sjaap 		acc = -acc;
60823882Sjaap 	if (!noscale) {
60923882Sjaap 		acc = (acc * j) / i;
61023882Sjaap 	}
61123882Sjaap 	if ((field != digits) && (digits > 0))
61223882Sjaap 		while (digits--)
61323882Sjaap 			acc /= 10;
61423882Sjaap 	if (abs) {
61523882Sjaap 		if (dip != d)
61623882Sjaap 			j = dip->dnl;
61723882Sjaap 		else
618*23904Sjaap 			j = numtab[NL].val;
61923882Sjaap 		if (!vflag) {
620*23904Sjaap 			j = numtab[HP].val;
62123882Sjaap 		}
62223882Sjaap 		if (abs == 2)
62323882Sjaap 			j = -j;
62423882Sjaap 		acc -= j;
62523882Sjaap 	}
62623882Sjaap a2:
62723882Sjaap 	nonumb = !field;
62823882Sjaap 	return(acc);
62923882Sjaap }
63023882Sjaap 
63123882Sjaap 
caserr()63223882Sjaap caserr()
63323882Sjaap {
63423882Sjaap 	register i, j;
635*23904Sjaap 	register struct numtab *p;
63623882Sjaap 
63723882Sjaap 	lgf++;
63823882Sjaap 	while (!skip() && (i = getrq()) ) {
639*23904Sjaap 		j = usedr(i);
640*23904Sjaap 		if (j < 0)
641*23904Sjaap 			continue;
642*23904Sjaap 		p = &numtab[j];
643*23904Sjaap 		nunhash(p);
644*23904Sjaap 		p->r = p->val = p->inc = p->fmt = 0;
645*23904Sjaap 		regcnt--;
64623882Sjaap 	}
64723882Sjaap }
64823882Sjaap 
64923882Sjaap 
casenr()65023882Sjaap casenr()
65123882Sjaap {
65223882Sjaap 	register i, j;
65323882Sjaap 
65423882Sjaap 	lgf++;
65523882Sjaap 	skip();
65623882Sjaap 	if ((i = findr(getrq())) == -1)
65723882Sjaap 		goto rtn;
65823882Sjaap 	skip();
659*23904Sjaap 	j = inumb(&numtab[i].val);
66023882Sjaap 	if (nonumb)
66123882Sjaap 		goto rtn;
662*23904Sjaap 	numtab[i].val = j;
66323882Sjaap 	skip();
66423882Sjaap 	j = atoi();
66523882Sjaap 	if (nonumb)
66623882Sjaap 		goto rtn;
667*23904Sjaap 	numtab[i].inc = j;
66823882Sjaap rtn:
66923882Sjaap 	return;
67023882Sjaap }
67123882Sjaap 
67223882Sjaap 
caseaf()67323882Sjaap caseaf()
67423882Sjaap {
67523882Sjaap 	register i, k;
676*23904Sjaap 	register tchar j;
67723882Sjaap 
67823882Sjaap 	lgf++;
67923882Sjaap 	if (skip() || !(i = getrq()) || skip())
68023882Sjaap 		return;
68123882Sjaap 	k = 0;
68223882Sjaap 	j = getch();
68323882Sjaap 	if (!isalpha(cbits(j))) {
68423882Sjaap 		ch = j;
68523882Sjaap 		while ((j = cbits(getch())) >= '0' &&  j <= '9')
68623882Sjaap 			k++;
68723882Sjaap 	}
68823882Sjaap 	if (!k)
68923882Sjaap 		k = j;
690*23904Sjaap 	numtab[findr(i)].fmt = k & BYTEMASK;
69123882Sjaap }
69223882Sjaap 
setaf()69323882Sjaap setaf()	/* return format of number register */
69423882Sjaap {
69523882Sjaap 	register int i, j;
69623882Sjaap 
69723882Sjaap 	i = usedr(getsn());
69823882Sjaap 	if (i == -1)
69923882Sjaap 		return;
700*23904Sjaap 	if (numtab[i].fmt > 20)	/* it was probably a, A, i or I */
701*23904Sjaap 		*pbp++ = numtab[i].fmt;
70223882Sjaap 	else
703*23904Sjaap 		for (j = (numtab[i].fmt ? numtab[i].fmt : 1); j; j--)
704*23904Sjaap 			*pbp++ = '0';
70523882Sjaap }
70623882Sjaap 
70723882Sjaap 
vnumb(i)70823882Sjaap vnumb(i)
70923882Sjaap int	*i;
71023882Sjaap {
71123882Sjaap 	vflag++;
71223882Sjaap 	dfact = lss;
71323882Sjaap 	res = VERT;
71423882Sjaap 	return(inumb(i));
71523882Sjaap }
71623882Sjaap 
71723882Sjaap 
hnumb(i)71823882Sjaap hnumb(i)
71923882Sjaap int	*i;
72023882Sjaap {
72123882Sjaap 	dfact = EM;
72223882Sjaap 	res = HOR;
72323882Sjaap 	return(inumb(i));
72423882Sjaap }
72523882Sjaap 
72623882Sjaap 
inumb(n)72723882Sjaap inumb(n)
72823882Sjaap int	*n;
72923882Sjaap {
73023882Sjaap 	register i, j, f;
731*23904Sjaap 	register tchar ii;
73223882Sjaap 
73323882Sjaap 	f = 0;
73423882Sjaap 	if (n) {
73523882Sjaap 		if ((j = cbits(ii = getch())) == '+')
73623882Sjaap 			f = 1;
73723882Sjaap 		else if (j == '-')
73823882Sjaap 			f = -1;
73923882Sjaap 		else
74023882Sjaap 			ch = ii;
74123882Sjaap 	}
74223882Sjaap 	i = atoi();
74323882Sjaap 	if (n && f)
74423882Sjaap 		i = *n + f * i;
74523882Sjaap 	i = quant(i, res);
74623882Sjaap 	vflag = 0;
74723882Sjaap 	res = dfactd = dfact = 1;
74823882Sjaap 	if (nonumb)
74923882Sjaap 		i = 0;
75023882Sjaap 	return(i);
75123882Sjaap }
75223882Sjaap 
75323882Sjaap 
quant(n,m)75423882Sjaap quant(n, m)
75523882Sjaap int	n, m;
75623882Sjaap {
75723882Sjaap 	register i, neg;
75823882Sjaap 
75923882Sjaap 	neg = 0;
76023882Sjaap 	if (n < 0) {
76123882Sjaap 		neg++;
76223882Sjaap 		n = -n;
76323882Sjaap 	}
76423882Sjaap 	/* better as i = ((n + (m/2))/m)*m */
76523882Sjaap 	i = n / m;
76623882Sjaap 	if ((n - m * i) > (m / 2))
76723882Sjaap 		i += 1;
76823882Sjaap 	i *= m;
76923882Sjaap 	if (neg)
77023882Sjaap 		i = -i;
77123882Sjaap 	return(i);
77223882Sjaap }
77323882Sjaap 
77423882Sjaap 
775