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