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