123882Sjaap #ifndef lint
2*45669Ssklower static char sccsid[] = "@(#)n4.c	2.2 (CWI) 90/11/30";
323882Sjaap #endif lint
423904Sjaap /*      @(#)n4.c	1.1     */
523882Sjaap #include	<ctype.h>
623882Sjaap #include "tdef.h"
723882Sjaap #ifdef NROFF
823882Sjaap #include "tw.h"
923882Sjaap #endif
1023904Sjaap #include "ext.h"
1123904Sjaap #include <sgtty.h>
1223882Sjaap /*
1323904Sjaap  * troff4.c
1423904Sjaap  *
1523904Sjaap  * number registers, conversion, arithmetic
1623904Sjaap  */
1723882Sjaap 
1823882Sjaap 
1923882Sjaap int	regcnt = NNAMES;
2023882Sjaap int	falsef	= 0;	/* on if inside false branch of if */
2123904Sjaap #define	NHASH(i)	((i>>6)^i)&0177
2223904Sjaap struct	numtab	*nhash[128];	/* 128 == the 0177 on line above */
2323882Sjaap 
setn()2423882Sjaap setn()
2523882Sjaap {
2623882Sjaap 	register i, j;
2723904Sjaap 	register tchar ii;
2823882Sjaap 	int	f;
2923882Sjaap 
3023882Sjaap 	f = nform = 0;
31*45669Ssklower 	lgf++;					/* don;t catch ligatures */
3223882Sjaap 	if ((i = cbits(ii = getach())) == '+')
3323882Sjaap 		f = 1;
3423882Sjaap 	else if (i == '-')
3523882Sjaap 		f = -1;
3623882Sjaap 	else
3723882Sjaap 		ch = ii;
38*45669Ssklower 	lgf--;					/* ok, catch `em again */
3923882Sjaap 	if (falsef)
4023882Sjaap 		f = 0;
4123882Sjaap 	if ((i = getsn()) == 0)
4223882Sjaap 		return;
4323882Sjaap 	if ((i & 0177) == '.')
4423882Sjaap 		switch (i >> BYTE) {
4523882Sjaap 		case 's':
4623882Sjaap 			i = pts;
4723882Sjaap 			break;
4823882Sjaap 		case 'v':
4923882Sjaap 			i = lss;
5023882Sjaap 			break;
5123882Sjaap 		case 'f':
5223882Sjaap 			i = font;
5323882Sjaap 			break;
5423882Sjaap 		case 'p':
5523882Sjaap 			i = pl;
5623882Sjaap 			break;
5723882Sjaap 		case 't':
5823882Sjaap 			i = findt1();
5923882Sjaap 			break;
6023882Sjaap 		case 'o':
6123882Sjaap 			i = po;
6223882Sjaap 			break;
6323882Sjaap 		case 'l':
6423882Sjaap 			i = ll;
6523882Sjaap 			break;
6623882Sjaap 		case 'i':
6723882Sjaap 			i = in;
6823882Sjaap 			break;
6923882Sjaap 		case '$':
7023882Sjaap 			i = frame->nargs;
7123882Sjaap 			break;
7223882Sjaap 		case 'A':
7323882Sjaap 			i = ascii;
7423882Sjaap 			break;
7523882Sjaap 		case 'c':
7623904Sjaap 			i = numtab[CD].val;
7723882Sjaap 			break;
7823882Sjaap 		case 'n':
7923882Sjaap 			i = lastl;
8023882Sjaap 			break;
8123882Sjaap 		case 'a':
8223882Sjaap 			i = ralss;
8323882Sjaap 			break;
8423882Sjaap 		case 'h':
8523882Sjaap 			i = dip->hnl;
8623882Sjaap 			break;
8723882Sjaap 		case 'd':
8823882Sjaap 			if (dip != d)
8923882Sjaap 				i = dip->dnl;
9023882Sjaap 			else
9123904Sjaap 				i = numtab[NL].val;
9223882Sjaap 			break;
9323882Sjaap 		case 'u':
9423882Sjaap 			i = fi;
9523882Sjaap 			break;
9623882Sjaap 		case 'j':
9723882Sjaap 			i = ad + 2 * admod;
9823882Sjaap 			break;
9923882Sjaap 		case 'w':
10023904Sjaap 			i = widthp;
10123882Sjaap 			break;
10223882Sjaap 		case 'x':
10323882Sjaap 			i = nel;
10423882Sjaap 			break;
10523882Sjaap 		case 'y':
10623882Sjaap 			i = un;
10723882Sjaap 			break;
10823882Sjaap 		case 'T':
10923882Sjaap 			i = dotT;
11023882Sjaap 			break; /*-Tterm used in nroff*/
11123882Sjaap 		case 'V':
11223882Sjaap 			i = VERT;
11323882Sjaap 			break;
11423882Sjaap 		case 'H':
11523882Sjaap 			i = HOR;
11623882Sjaap 			break;
11723882Sjaap 		case 'k':
11823882Sjaap 			i = ne;
11923882Sjaap 			break;
12023882Sjaap 		case 'P':
12123882Sjaap 			i = print;
12223882Sjaap 			break;
12323882Sjaap 		case 'L':
12423882Sjaap 			i = ls;
12523882Sjaap 			break;
12623882Sjaap 		case 'R':
12723882Sjaap 			i = NN - regcnt;
12823882Sjaap 			break;
12923882Sjaap 		case 'z':
13023882Sjaap 			i = dip->curd;
13123904Sjaap 			*pbp++ = (i >> BYTE) & BYTEMASK;
13223904Sjaap 			*pbp++ = i & BYTEMASK;
13323882Sjaap 			return;
13423882Sjaap 		case 'b':
13523882Sjaap 			i = bdtab[font];
13623882Sjaap 			break;
13723904Sjaap 		case 'F':
13823904Sjaap 			cpushback(cfname[ifi]);
13923904Sjaap 			return;
14023904Sjaap 		case 'D':
14123904Sjaap 			i = hyalg;	/* "Dialect" register (jaap) */
14223882Sjaap 			break;
14323882Sjaap 		case 'e':
14423904Sjaap 			i = thresh;	/* (jaap) */
14523882Sjaap 			break;
14623882Sjaap 
14723882Sjaap 		default:
14823882Sjaap 			goto s0;
14923882Sjaap 		}
15023882Sjaap 	else {
15123882Sjaap s0:
15223882Sjaap 		if ((j = findr(i)) == -1)
15323882Sjaap 			i = 0;
15423882Sjaap 		else {
15523904Sjaap 			i = numtab[j].val = (numtab[j].val+numtab[j].inc*f);
15623904Sjaap 			nform = numtab[j].fmt;
15723882Sjaap 		}
15823882Sjaap 	}
15923904Sjaap 	setn1(i, nform, (tchar) 0);
16023882Sjaap }
16123882Sjaap 
16223904Sjaap tchar	numbuf[17];
16323904Sjaap tchar	*numbufp;
16423882Sjaap 
wrc(i)16523904Sjaap wrc(i)
16623904Sjaap tchar i;
16723904Sjaap {
16823904Sjaap 	if (numbufp >= &numbuf[16])
16923904Sjaap 		return(0);
17023904Sjaap 	*numbufp++ = i;
17123904Sjaap 	return(1);
17223904Sjaap }
17323904Sjaap 
17423904Sjaap 
17523904Sjaap 
17623904Sjaap /* insert into input number i, in format form, with size-font bits bits */
setn1(i,form,bits)17723904Sjaap setn1(i, form, bits)
17823882Sjaap int	i;
17923904Sjaap tchar bits;
18023882Sjaap {
18123882Sjaap 	extern int	wrc();
18223882Sjaap 
18323904Sjaap 	numbufp = numbuf;
18423904Sjaap 	nrbits = bits;
18523904Sjaap 	nform = form;
18623882Sjaap 	fnumb(i, wrc);
18723904Sjaap 	*numbufp = 0;
18823904Sjaap 	pushback(numbuf);
18923882Sjaap }
19023882Sjaap 
19123882Sjaap 
nrehash()19223904Sjaap nrehash()
19323904Sjaap {
19423904Sjaap 	register struct numtab *p;
19523904Sjaap 	register i;
19623904Sjaap 
19723904Sjaap 	for (i=0; i<128; i++)
19823904Sjaap 		nhash[i] = 0;
19923904Sjaap 	for (p=numtab; p < &numtab[NN]; p++)
20023904Sjaap 		p->link = 0;
20123904Sjaap 	for (p=numtab; p < &numtab[NN]; p++) {
20223904Sjaap 		if (p->r == 0)
20323904Sjaap 			continue;
20423904Sjaap 		i = NHASH(p->r);
20523904Sjaap 		p->link = nhash[i];
20623904Sjaap 		nhash[i] = p;
20723904Sjaap 	}
20823904Sjaap }
20923904Sjaap 
nunhash(rp)21023904Sjaap nunhash(rp)
21123904Sjaap register struct numtab *rp;
21223904Sjaap {
21323904Sjaap 	register struct numtab *p;
21423904Sjaap 	register struct numtab **lp;
21523904Sjaap 
21623904Sjaap 	if (rp->r == 0)
21723904Sjaap 		return;
21823904Sjaap 	lp = &nhash[NHASH(rp->r)];
21923904Sjaap 	p = *lp;
22023904Sjaap 	while (p) {
22123904Sjaap 		if (p == rp) {
22223904Sjaap 			*lp = p->link;
22323904Sjaap 			p->link = 0;
22423904Sjaap 			return;
22523904Sjaap 		}
22623904Sjaap 		lp = &p->link;
22723904Sjaap 		p = p->link;
22823904Sjaap 	}
22923904Sjaap }
23023904Sjaap 
findr(i)23123882Sjaap findr(i)
23223882Sjaap register int	i;
23323882Sjaap {
23423904Sjaap 	register struct numtab *p;
23523904Sjaap 	register h = NHASH(i);
23623882Sjaap 
23723882Sjaap 	if (i == 0)
23823882Sjaap 		return(-1);
23923904Sjaap 	for (p = nhash[h]; p; p = p->link)
24023904Sjaap 		if (i == p->r)
24123904Sjaap 			return(p - numtab);
24223904Sjaap 	for (p = numtab; p < &numtab[NN]; p++) {
24323904Sjaap 		if (p->r == 0) {
24423904Sjaap 			p->r = i;
24523904Sjaap 			p->link = nhash[h];
24623904Sjaap 			nhash[h] = p;
24723882Sjaap 			regcnt++;
24823904Sjaap 			return(p - numtab);
24923882Sjaap 		}
25023882Sjaap 	}
25123904Sjaap 	errprint("too many number registers (%d).", NN);
25223904Sjaap 	done2(04);
25323904Sjaap 	/* NOTREACHED */
25423882Sjaap }
25523882Sjaap 
usedr(i)25623882Sjaap usedr(i)	/* returns -1 if nr i has never been used */
25723882Sjaap register int	i;
25823882Sjaap {
25923904Sjaap 	register struct numtab *p;
26023882Sjaap 
26123882Sjaap 	if (i == 0)
26223882Sjaap 		return(-1);
26323904Sjaap 	for (p = nhash[NHASH(i)]; p; p = p->link)
26423904Sjaap 		if (i == p->r)
26523904Sjaap 			return(p - numtab);
26623904Sjaap 	return -1;
26723882Sjaap }
26823882Sjaap 
26923882Sjaap 
27023882Sjaap fnumb(i, f)
27123904Sjaap register int	i, (*f)();
27223882Sjaap {
27323882Sjaap 	register j;
27423882Sjaap 
27523882Sjaap 	j = 0;
27623882Sjaap 	if (i < 0) {
27723882Sjaap 		j = (*f)('-' | nrbits);
27823882Sjaap 		i = -i;
27923882Sjaap 	}
28023882Sjaap 	switch (nform) {
28123882Sjaap 	default:
28223882Sjaap 	case '1':
28323882Sjaap 	case 0:
28423904Sjaap 		return decml(i, f) + j;
28523904Sjaap 		break;
28623882Sjaap 	case 'i':
28723882Sjaap 	case 'I':
28823904Sjaap 		return roman(i, f) + j;
28923904Sjaap 		break;
29023882Sjaap 	case 'a':
29123882Sjaap 	case 'A':
29223904Sjaap 		return abc(i, f) + j;
29323904Sjaap 		break;
29423882Sjaap 	}
29523882Sjaap }
29623882Sjaap 
29723882Sjaap 
29823882Sjaap decml(i, f)
29923904Sjaap register int	i, (*f)();
30023882Sjaap {
30123882Sjaap 	register j, k;
30223882Sjaap 
30323882Sjaap 	k = 0;
30423882Sjaap 	nform--;
30523882Sjaap 	if ((j = i / 10) || (nform > 0))
30623882Sjaap 		k = decml(j, f);
30723882Sjaap 	return(k + (*f)((i % 10 + '0') | nrbits));
30823882Sjaap }
30923882Sjaap 
31023882Sjaap 
31123882Sjaap roman(i, f)
31223882Sjaap int	i, (*f)();
31323882Sjaap {
31423882Sjaap 
31523882Sjaap 	if (!i)
31623882Sjaap 		return((*f)('0' | nrbits));
31723882Sjaap 	if (nform == 'i')
31823882Sjaap 		return(roman0(i, f, "ixcmz", "vldw"));
31923882Sjaap 	else
32023882Sjaap 		return(roman0(i, f, "IXCMZ", "VLDW"));
32123882Sjaap }
32223882Sjaap 
32323882Sjaap 
32423882Sjaap roman0(i, f, onesp, fivesp)
32523882Sjaap int	i, (*f)();
32623882Sjaap char	*onesp, *fivesp;
32723882Sjaap {
32823882Sjaap 	register q, rem, k;
32923882Sjaap 
33023882Sjaap 	k = 0;
33123882Sjaap 	if (!i)
33223882Sjaap 		return(0);
33323882Sjaap 	k = roman0(i / 10, f, onesp + 1, fivesp + 1);
33423882Sjaap 	q = (i = i % 10) / 5;
33523882Sjaap 	rem = i % 5;
33623882Sjaap 	if (rem == 4) {
33723882Sjaap 		k += (*f)(*onesp | nrbits);
33823882Sjaap 		if (q)
33923882Sjaap 			i = *(onesp + 1);
34023882Sjaap 		else
34123882Sjaap 			i = *fivesp;
34223882Sjaap 		return(k += (*f)(i | nrbits));
34323882Sjaap 	}
34423882Sjaap 	if (q)
34523882Sjaap 		k += (*f)(*fivesp | nrbits);
34623882Sjaap 	while (--rem >= 0)
34723882Sjaap 		k += (*f)(*onesp | nrbits);
34823882Sjaap 	return(k);
34923882Sjaap }
35023882Sjaap 
35123882Sjaap 
35223882Sjaap abc(i, f)
35323882Sjaap int	i, (*f)();
35423882Sjaap {
35523882Sjaap 	if (!i)
35623882Sjaap 		return((*f)('0' | nrbits));
35723882Sjaap 	else
35823882Sjaap 		return(abc0(i - 1, f));
35923882Sjaap }
36023882Sjaap 
36123882Sjaap 
36223882Sjaap abc0(i, f)
36323882Sjaap int	i, (*f)();
36423882Sjaap {
36523882Sjaap 	register j, k;
36623882Sjaap 
36723882Sjaap 	k = 0;
36823882Sjaap 	if (j = i / 26)
36923882Sjaap 		k = abc0(j - 1, f);
37023882Sjaap 	return(k + (*f)((i % 26 + nform) | nrbits));
37123882Sjaap }
37223882Sjaap 
atoi0()37323882Sjaap long	atoi0()
37423882Sjaap {
37523882Sjaap 	register c, k, cnt;
37623904Sjaap 	register tchar ii;
37723882Sjaap 	long	i, acc;
37823882Sjaap 	extern long	ckph();
37923882Sjaap 
38023882Sjaap 	i = 0;
38123882Sjaap 	acc = 0;
38223882Sjaap 	nonumb = 0;
38323882Sjaap 	cnt = -1;
38423882Sjaap a0:
38523882Sjaap 	cnt++;
38623882Sjaap 	ii = getch();
38723882Sjaap 	c = cbits(ii);
38823882Sjaap 	switch (c) {
38923882Sjaap 	default:
39023882Sjaap 		ch = ii;
39123882Sjaap 		if (cnt)
39223882Sjaap 			break;
39323882Sjaap 	case '+':
39423882Sjaap 		i = ckph();
39523882Sjaap 		if (nonumb)
39623882Sjaap 			break;
39723882Sjaap 		acc += i;
39823882Sjaap 		goto a0;
39923882Sjaap 	case '-':
40023882Sjaap 		i = ckph();
40123882Sjaap 		if (nonumb)
40223882Sjaap 			break;
40323882Sjaap 		acc -= i;
40423882Sjaap 		goto a0;
40523882Sjaap 	case '*':
40623882Sjaap 		i = ckph();
40723882Sjaap 		if (nonumb)
40823882Sjaap 			break;
40923882Sjaap 		acc *= i;
41023882Sjaap 		goto a0;
41123882Sjaap 	case '/':
41223882Sjaap 		i = ckph();
41323882Sjaap 		if (nonumb)
41423882Sjaap 			break;
41523882Sjaap 		if (i == 0) {
41623882Sjaap 			flusho();
41723904Sjaap 			errprint("divide by zero.");
41823882Sjaap 			acc = 0;
41923882Sjaap 		} else
42023882Sjaap 			acc /= i;
42123882Sjaap 		goto a0;
42223882Sjaap 	case '%':
42323882Sjaap 		i = ckph();
42423882Sjaap 		if (nonumb)
42523882Sjaap 			break;
42623882Sjaap 		acc %= i;
42723882Sjaap 		goto a0;
42823882Sjaap 	case '&':	/*and*/
42923882Sjaap 		i = ckph();
43023882Sjaap 		if (nonumb)
43123882Sjaap 			break;
43223882Sjaap 		if ((acc > 0) && (i > 0))
43323882Sjaap 			acc = 1;
43423882Sjaap 		else
43523882Sjaap 			acc = 0;
43623882Sjaap 		goto a0;
43723882Sjaap 	case ':':	/*or*/
43823882Sjaap 		i = ckph();
43923882Sjaap 		if (nonumb)
44023882Sjaap 			break;
44123882Sjaap 		if ((acc > 0) || (i > 0))
44223882Sjaap 			acc = 1;
44323882Sjaap 		else
44423882Sjaap 			acc = 0;
44523882Sjaap 		goto a0;
44623882Sjaap 	case '=':
44723882Sjaap 		if (cbits(ii = getch()) != '=')
44823882Sjaap 			ch = ii;
44923882Sjaap 		i = ckph();
45023882Sjaap 		if (nonumb) {
45123882Sjaap 			acc = 0;
45223882Sjaap 			break;
45323882Sjaap 		}
45423882Sjaap 		if (i == acc)
45523882Sjaap 			acc = 1;
45623882Sjaap 		else
45723882Sjaap 			acc = 0;
45823882Sjaap 		goto a0;
45923882Sjaap 	case '>':
46023882Sjaap 		k = 0;
46123882Sjaap 		if (cbits(ii = getch()) == '=')
46223882Sjaap 			k++;
46323882Sjaap 		else
46423882Sjaap 			ch = ii;
46523882Sjaap 		i = ckph();
46623882Sjaap 		if (nonumb) {
46723882Sjaap 			acc = 0;
46823882Sjaap 			break;
46923882Sjaap 		}
47023882Sjaap 		if (acc > (i - k))
47123882Sjaap 			acc = 1;
47223882Sjaap 		else
47323882Sjaap 			acc = 0;
47423882Sjaap 		goto a0;
47523882Sjaap 	case '<':
47623882Sjaap 		k = 0;
47723882Sjaap 		if (cbits(ii = getch()) == '=')
47823882Sjaap 			k++;
47923882Sjaap 		else
48023882Sjaap 			ch = ii;
48123882Sjaap 		i = ckph();
48223882Sjaap 		if (nonumb) {
48323882Sjaap 			acc = 0;
48423882Sjaap 			break;
48523882Sjaap 		}
48623882Sjaap 		if (acc < (i + k))
48723882Sjaap 			acc = 1;
48823882Sjaap 		else
48923882Sjaap 			acc = 0;
49023882Sjaap 		goto a0;
49123882Sjaap 	case ')':
49223882Sjaap 		break;
49323882Sjaap 	case '(':
49423882Sjaap 		acc = atoi0();
49523882Sjaap 		goto a0;
49623882Sjaap 	}
49723882Sjaap 	return(acc);
49823882Sjaap }
49923882Sjaap 
50023882Sjaap 
ckph()50123882Sjaap long	ckph()
50223882Sjaap {
50323904Sjaap 	register tchar i;
50423904Sjaap 	register long	j;
50523882Sjaap 	extern long	atoi0();
50623882Sjaap 	extern long	atoi1();
50723882Sjaap 
50823882Sjaap 	if (cbits(i = getch()) == '(')
50923882Sjaap 		j = atoi0();
51023882Sjaap 	else {
51123904Sjaap 		j = atoi1(i);
51223882Sjaap 	}
51323882Sjaap 	return(j);
51423882Sjaap }
51523882Sjaap 
51623882Sjaap 
atoi1(ii)51723904Sjaap long	atoi1(ii)
51823904Sjaap register tchar ii;
51923882Sjaap {
52023882Sjaap 	register i, j, digits;
52123904Sjaap 	register long	acc;
52223882Sjaap 	int	neg, abs, field;
52323882Sjaap 
52423882Sjaap 	neg = abs = field = digits = 0;
52523882Sjaap 	acc = 0;
52623904Sjaap 	for (;;) {
52723904Sjaap 		i = cbits(ii);
52823904Sjaap 		switch (i) {
52923904Sjaap 		default:
53023904Sjaap 			break;
53123904Sjaap 		case '+':
53223904Sjaap 			ii = getch();
53323904Sjaap 			continue;
53423904Sjaap 		case '-':
53523904Sjaap 			neg = 1;
53623904Sjaap 			ii = getch();
53723904Sjaap 			continue;
53823904Sjaap 		case '|':
53923904Sjaap 			abs = 1 + neg;
54023904Sjaap 			neg = 0;
54123904Sjaap 			ii = getch();
54223904Sjaap 			continue;
54323904Sjaap 		}
54423882Sjaap 		break;
54523882Sjaap 	}
54623882Sjaap a1:
54723904Sjaap 	while (i >= '0' && i <= '9') {
54823882Sjaap 		field++;
54923882Sjaap 		digits++;
55023904Sjaap 		acc = 10 * acc + i - '0';
55123904Sjaap 		ii = getch();
55223904Sjaap 		i = cbits(ii);
55323882Sjaap 	}
55423904Sjaap 	if (i == '.') {
55523882Sjaap 		field++;
55623882Sjaap 		digits = 0;
55723904Sjaap 		ii = getch();
55823904Sjaap 		i = cbits(ii);
55923882Sjaap 		goto a1;
56023882Sjaap 	}
56123904Sjaap 	if (!field) {
56223904Sjaap 		ch = ii;
56323882Sjaap 		goto a2;
56423904Sjaap 	}
56523904Sjaap 	switch (i) {
56623882Sjaap 	case 'u':
56723882Sjaap 		i = j = 1;	/* should this be related to HOR?? */
56823882Sjaap 		break;
56923882Sjaap 	case 'v':	/*VSs - vert spacing*/
57023882Sjaap 		j = lss;
57123882Sjaap 		i = 1;
57223882Sjaap 		break;
57323882Sjaap 	case 'm':	/*Ems*/
57423882Sjaap 		j = EM;
57523882Sjaap 		i = 1;
57623882Sjaap 		break;
57723882Sjaap 	case 'n':	/*Ens*/
57823882Sjaap 		j = EM;
57923882Sjaap #ifndef NROFF
58023882Sjaap 		i = 2;
58123882Sjaap #endif
58223882Sjaap #ifdef NROFF
58323882Sjaap 		i = 1;	/*Same as Ems in NROFF*/
58423882Sjaap #endif
58523882Sjaap 		break;
58623882Sjaap 	case 'p':	/*Points*/
58723882Sjaap 		j = INCH;
58823882Sjaap 		i = 72;
58923882Sjaap 		break;
59023882Sjaap 	case 'i':	/*Inches*/
59123882Sjaap 		j = INCH;
59223882Sjaap 		i = 1;
59323882Sjaap 		break;
59423882Sjaap 	case 'c':	/*Centimeters*/
59523882Sjaap 		/* if INCH is too big, this will overflow */
59623882Sjaap 		j = INCH * 50;
59723882Sjaap 		i = 127;
59823882Sjaap 		break;
59923882Sjaap 	case 'P':	/*Picas*/
60023882Sjaap 		j = INCH;
60123882Sjaap 		i = 6;
60223882Sjaap 		break;
60323882Sjaap 	default:
60423882Sjaap 		j = dfact;
60523882Sjaap 		ch = ii;
60623882Sjaap 		i = dfactd;
60723882Sjaap 	}
60823882Sjaap 	if (neg)
60923882Sjaap 		acc = -acc;
61023882Sjaap 	if (!noscale) {
61123882Sjaap 		acc = (acc * j) / i;
61223882Sjaap 	}
61323882Sjaap 	if ((field != digits) && (digits > 0))
61423882Sjaap 		while (digits--)
61523882Sjaap 			acc /= 10;
61623882Sjaap 	if (abs) {
61723882Sjaap 		if (dip != d)
61823882Sjaap 			j = dip->dnl;
61923882Sjaap 		else
62023904Sjaap 			j = numtab[NL].val;
62123882Sjaap 		if (!vflag) {
62223904Sjaap 			j = numtab[HP].val;
62323882Sjaap 		}
62423882Sjaap 		if (abs == 2)
62523882Sjaap 			j = -j;
62623882Sjaap 		acc -= j;
62723882Sjaap 	}
62823882Sjaap a2:
62923882Sjaap 	nonumb = !field;
63023882Sjaap 	return(acc);
63123882Sjaap }
63223882Sjaap 
63323882Sjaap 
caserr()63423882Sjaap caserr()
63523882Sjaap {
63623882Sjaap 	register i, j;
63723904Sjaap 	register struct numtab *p;
63823882Sjaap 
63923882Sjaap 	lgf++;
64023882Sjaap 	while (!skip() && (i = getrq()) ) {
64123904Sjaap 		j = usedr(i);
64223904Sjaap 		if (j < 0)
64323904Sjaap 			continue;
64423904Sjaap 		p = &numtab[j];
64523904Sjaap 		nunhash(p);
64623904Sjaap 		p->r = p->val = p->inc = p->fmt = 0;
64723904Sjaap 		regcnt--;
64823882Sjaap 	}
64923882Sjaap }
65023882Sjaap 
65123882Sjaap 
casenr()65223882Sjaap casenr()
65323882Sjaap {
65423882Sjaap 	register i, j;
65523882Sjaap 
65623882Sjaap 	lgf++;
65723882Sjaap 	skip();
65823882Sjaap 	if ((i = findr(getrq())) == -1)
65923882Sjaap 		goto rtn;
66023882Sjaap 	skip();
66123904Sjaap 	j = inumb(&numtab[i].val);
66223882Sjaap 	if (nonumb)
66323882Sjaap 		goto rtn;
66423904Sjaap 	numtab[i].val = j;
66523882Sjaap 	skip();
66623882Sjaap 	j = atoi();
66723882Sjaap 	if (nonumb)
66823882Sjaap 		goto rtn;
66923904Sjaap 	numtab[i].inc = j;
67023882Sjaap rtn:
67123882Sjaap 	return;
67223882Sjaap }
67323882Sjaap 
67423882Sjaap 
caseaf()67523882Sjaap caseaf()
67623882Sjaap {
67723882Sjaap 	register i, k;
67823904Sjaap 	register tchar j;
67923882Sjaap 
68023882Sjaap 	lgf++;
68123882Sjaap 	if (skip() || !(i = getrq()) || skip())
68223882Sjaap 		return;
68323882Sjaap 	k = 0;
68423882Sjaap 	j = getch();
68523882Sjaap 	if (!isalpha(cbits(j))) {
68623882Sjaap 		ch = j;
68723882Sjaap 		while ((j = cbits(getch())) >= '0' &&  j <= '9')
68823882Sjaap 			k++;
68923882Sjaap 	}
69023882Sjaap 	if (!k)
69123882Sjaap 		k = j;
69223904Sjaap 	numtab[findr(i)].fmt = k & BYTEMASK;
69323882Sjaap }
69423882Sjaap 
setaf()69523882Sjaap setaf()	/* return format of number register */
69623882Sjaap {
69723882Sjaap 	register int i, j;
69823882Sjaap 
69923882Sjaap 	i = usedr(getsn());
70023882Sjaap 	if (i == -1)
70123882Sjaap 		return;
70223904Sjaap 	if (numtab[i].fmt > 20)	/* it was probably a, A, i or I */
70323904Sjaap 		*pbp++ = numtab[i].fmt;
70423882Sjaap 	else
70523904Sjaap 		for (j = (numtab[i].fmt ? numtab[i].fmt : 1); j; j--)
70623904Sjaap 			*pbp++ = '0';
70723882Sjaap }
70823882Sjaap 
70923882Sjaap 
vnumb(i)71023882Sjaap vnumb(i)
71123882Sjaap int	*i;
71223882Sjaap {
71323882Sjaap 	vflag++;
71423882Sjaap 	dfact = lss;
71523882Sjaap 	res = VERT;
71623882Sjaap 	return(inumb(i));
71723882Sjaap }
71823882Sjaap 
71923882Sjaap 
hnumb(i)72023882Sjaap hnumb(i)
72123882Sjaap int	*i;
72223882Sjaap {
72323882Sjaap 	dfact = EM;
72423882Sjaap 	res = HOR;
72523882Sjaap 	return(inumb(i));
72623882Sjaap }
72723882Sjaap 
72823882Sjaap 
inumb(n)72923882Sjaap inumb(n)
73023882Sjaap int	*n;
73123882Sjaap {
73223882Sjaap 	register i, j, f;
73323904Sjaap 	register tchar ii;
73423882Sjaap 
73523882Sjaap 	f = 0;
73623882Sjaap 	if (n) {
73723882Sjaap 		if ((j = cbits(ii = getch())) == '+')
73823882Sjaap 			f = 1;
73923882Sjaap 		else if (j == '-')
74023882Sjaap 			f = -1;
74123882Sjaap 		else
74223882Sjaap 			ch = ii;
74323882Sjaap 	}
74423882Sjaap 	i = atoi();
74523882Sjaap 	if (n && f)
74623882Sjaap 		i = *n + f * i;
74723882Sjaap 	i = quant(i, res);
74823882Sjaap 	vflag = 0;
74923882Sjaap 	res = dfactd = dfact = 1;
75023882Sjaap 	if (nonumb)
75123882Sjaap 		i = 0;
75223882Sjaap 	return(i);
75323882Sjaap }
75423882Sjaap 
75523882Sjaap 
quant(n,m)75623882Sjaap quant(n, m)
75723882Sjaap int	n, m;
75823882Sjaap {
75923882Sjaap 	register i, neg;
76023882Sjaap 
76123882Sjaap 	neg = 0;
76223882Sjaap 	if (n < 0) {
76323882Sjaap 		neg++;
76423882Sjaap 		n = -n;
76523882Sjaap 	}
76623882Sjaap 	/* better as i = ((n + (m/2))/m)*m */
76723882Sjaap 	i = n / m;
76823882Sjaap 	if ((n - m * i) > (m / 2))
76923882Sjaap 		i += 1;
77023882Sjaap 	i *= m;
77123882Sjaap 	if (neg)
77223882Sjaap 		i = -i;
77323882Sjaap 	return(i);
77423882Sjaap }
77523882Sjaap 
77623882Sjaap 
777