Blame


1 5cedca1b 2004-05-15 devnull /*
2 5cedca1b 2004-05-15 devnull * troff4.c
3 5cedca1b 2004-05-15 devnull *
4 5cedca1b 2004-05-15 devnull * number registers, conversion, arithmetic
5 5cedca1b 2004-05-15 devnull */
6 5cedca1b 2004-05-15 devnull
7 5cedca1b 2004-05-15 devnull #include "tdef.h"
8 5cedca1b 2004-05-15 devnull #include "fns.h"
9 5cedca1b 2004-05-15 devnull #include "ext.h"
10 5cedca1b 2004-05-15 devnull
11 5cedca1b 2004-05-15 devnull
12 5cedca1b 2004-05-15 devnull int regcnt = NNAMES;
13 5cedca1b 2004-05-15 devnull int falsef = 0; /* on if inside false branch of if */
14 5cedca1b 2004-05-15 devnull
15 5cedca1b 2004-05-15 devnull #define NHASHSIZE 128 /* must be 2**n */
16 5cedca1b 2004-05-15 devnull #define NHASH(i) ((i>>6)^i) & (NHASHSIZE-1)
17 5cedca1b 2004-05-15 devnull Numtab *nhash[NHASHSIZE];
18 5cedca1b 2004-05-15 devnull
19 5cedca1b 2004-05-15 devnull Numtab *numtabp = NULL;
20 5cedca1b 2004-05-15 devnull #define NDELTA 400
21 5cedca1b 2004-05-15 devnull int ncnt = 0;
22 5cedca1b 2004-05-15 devnull
23 5cedca1b 2004-05-15 devnull void setn(void)
24 5cedca1b 2004-05-15 devnull {
25 5cedca1b 2004-05-15 devnull int i, j, f;
26 5cedca1b 2004-05-15 devnull Tchar ii;
27 5cedca1b 2004-05-15 devnull Uchar *p;
28 5cedca1b 2004-05-15 devnull char buf[NTM]; /* for \n(.S */
29 5cedca1b 2004-05-15 devnull
30 5cedca1b 2004-05-15 devnull f = nform = 0;
31 5cedca1b 2004-05-15 devnull if ((i = cbits(ii = getach())) == '+')
32 5cedca1b 2004-05-15 devnull f = 1;
33 5cedca1b 2004-05-15 devnull else if (i == '-')
34 5cedca1b 2004-05-15 devnull f = -1;
35 5cedca1b 2004-05-15 devnull else if (ii) /* don't put it back if it's already back (thanks to jaap) */
36 5cedca1b 2004-05-15 devnull ch = ii;
37 5cedca1b 2004-05-15 devnull if (falsef)
38 5cedca1b 2004-05-15 devnull f = 0;
39 5cedca1b 2004-05-15 devnull if ((i = getsn()) == 0)
40 5cedca1b 2004-05-15 devnull return;
41 5cedca1b 2004-05-15 devnull p = unpair(i);
42 5cedca1b 2004-05-15 devnull if (p[0] == '.')
43 5cedca1b 2004-05-15 devnull switch (p[1]) {
44 5cedca1b 2004-05-15 devnull case 's':
45 5cedca1b 2004-05-15 devnull i = pts;
46 5cedca1b 2004-05-15 devnull break;
47 5cedca1b 2004-05-15 devnull case 'v':
48 5cedca1b 2004-05-15 devnull i = lss;
49 5cedca1b 2004-05-15 devnull break;
50 5cedca1b 2004-05-15 devnull case 'f':
51 5cedca1b 2004-05-15 devnull i = font;
52 5cedca1b 2004-05-15 devnull break;
53 5cedca1b 2004-05-15 devnull case 'p':
54 5cedca1b 2004-05-15 devnull i = pl;
55 5cedca1b 2004-05-15 devnull break;
56 5cedca1b 2004-05-15 devnull case 't':
57 5cedca1b 2004-05-15 devnull i = findt1();
58 5cedca1b 2004-05-15 devnull break;
59 5cedca1b 2004-05-15 devnull case 'o':
60 5cedca1b 2004-05-15 devnull i = po;
61 5cedca1b 2004-05-15 devnull break;
62 5cedca1b 2004-05-15 devnull case 'l':
63 5cedca1b 2004-05-15 devnull i = ll;
64 5cedca1b 2004-05-15 devnull break;
65 5cedca1b 2004-05-15 devnull case 'i':
66 5cedca1b 2004-05-15 devnull i = in;
67 5cedca1b 2004-05-15 devnull break;
68 5cedca1b 2004-05-15 devnull case '$':
69 5cedca1b 2004-05-15 devnull i = frame->nargs;
70 5cedca1b 2004-05-15 devnull break;
71 5cedca1b 2004-05-15 devnull case 'A':
72 5cedca1b 2004-05-15 devnull i = ascii;
73 5cedca1b 2004-05-15 devnull break;
74 5cedca1b 2004-05-15 devnull case 'c':
75 5cedca1b 2004-05-15 devnull i = numtabp[CD].val;
76 5cedca1b 2004-05-15 devnull break;
77 5cedca1b 2004-05-15 devnull case 'n':
78 5cedca1b 2004-05-15 devnull i = lastl;
79 5cedca1b 2004-05-15 devnull break;
80 5cedca1b 2004-05-15 devnull case 'a':
81 5cedca1b 2004-05-15 devnull i = ralss;
82 5cedca1b 2004-05-15 devnull break;
83 5cedca1b 2004-05-15 devnull case 'h':
84 5cedca1b 2004-05-15 devnull i = dip->hnl;
85 5cedca1b 2004-05-15 devnull break;
86 5cedca1b 2004-05-15 devnull case 'd':
87 5cedca1b 2004-05-15 devnull if (dip != d)
88 5cedca1b 2004-05-15 devnull i = dip->dnl;
89 5cedca1b 2004-05-15 devnull else
90 5cedca1b 2004-05-15 devnull i = numtabp[NL].val;
91 5cedca1b 2004-05-15 devnull break;
92 5cedca1b 2004-05-15 devnull case 'u':
93 5cedca1b 2004-05-15 devnull i = fi;
94 5cedca1b 2004-05-15 devnull break;
95 5cedca1b 2004-05-15 devnull case 'j':
96 5cedca1b 2004-05-15 devnull i = ad + 2 * admod;
97 5cedca1b 2004-05-15 devnull break;
98 5cedca1b 2004-05-15 devnull case 'w':
99 5cedca1b 2004-05-15 devnull i = widthp;
100 5cedca1b 2004-05-15 devnull break;
101 5cedca1b 2004-05-15 devnull case 'x':
102 5cedca1b 2004-05-15 devnull i = nel;
103 5cedca1b 2004-05-15 devnull break;
104 5cedca1b 2004-05-15 devnull case 'y':
105 5cedca1b 2004-05-15 devnull i = un;
106 5cedca1b 2004-05-15 devnull break;
107 5cedca1b 2004-05-15 devnull case 'T':
108 5cedca1b 2004-05-15 devnull i = dotT;
109 5cedca1b 2004-05-15 devnull break; /* -Tterm used in nroff */
110 5cedca1b 2004-05-15 devnull case 'V':
111 5cedca1b 2004-05-15 devnull i = VERT;
112 5cedca1b 2004-05-15 devnull break;
113 5cedca1b 2004-05-15 devnull case 'H':
114 5cedca1b 2004-05-15 devnull i = HOR;
115 5cedca1b 2004-05-15 devnull break;
116 5cedca1b 2004-05-15 devnull case 'k':
117 5cedca1b 2004-05-15 devnull i = ne;
118 5cedca1b 2004-05-15 devnull break;
119 5cedca1b 2004-05-15 devnull case 'P':
120 5cedca1b 2004-05-15 devnull i = print;
121 5cedca1b 2004-05-15 devnull break;
122 5cedca1b 2004-05-15 devnull case 'L':
123 5cedca1b 2004-05-15 devnull i = ls;
124 5cedca1b 2004-05-15 devnull break;
125 5cedca1b 2004-05-15 devnull case 'R': /* maximal # of regs that can be addressed */
126 fa325e9b 2020-01-10 cross i = 255*256 - regcnt;
127 5cedca1b 2004-05-15 devnull break;
128 5cedca1b 2004-05-15 devnull case 'z':
129 5cedca1b 2004-05-15 devnull p = unpair(dip->curd);
130 5cedca1b 2004-05-15 devnull *pbp++ = p[1]; /* watch order */
131 5cedca1b 2004-05-15 devnull *pbp++ = p[0];
132 5cedca1b 2004-05-15 devnull return;
133 5cedca1b 2004-05-15 devnull case 'b':
134 5cedca1b 2004-05-15 devnull i = bdtab[font];
135 5cedca1b 2004-05-15 devnull break;
136 5cedca1b 2004-05-15 devnull case 'F':
137 5cedca1b 2004-05-15 devnull cpushback(cfname[ifi]);
138 5cedca1b 2004-05-15 devnull return;
139 5cedca1b 2004-05-15 devnull case 'S':
140 fa325e9b 2020-01-10 cross buf[0] = j = 0;
141 5cedca1b 2004-05-15 devnull for( i = 0; tabtab[i] != 0 && i < NTAB; i++) {
142 5cedca1b 2004-05-15 devnull if (i > 0)
143 5cedca1b 2004-05-15 devnull buf[j++] = ' ';
144 c5561c23 2004-05-16 devnull sprintf(&buf[j], "%ld", tabtab[i] & TABMASK);
145 5cedca1b 2004-05-15 devnull j = strlen(buf);
146 5cedca1b 2004-05-15 devnull if ( tabtab[i] & RTAB)
147 5cedca1b 2004-05-15 devnull sprintf(&buf[j], "uR");
148 5cedca1b 2004-05-15 devnull else if (tabtab[i] & CTAB)
149 5cedca1b 2004-05-15 devnull sprintf(&buf[j], "uC");
150 5cedca1b 2004-05-15 devnull else
151 5cedca1b 2004-05-15 devnull sprintf(&buf[j], "uL");
152 5cedca1b 2004-05-15 devnull j += 2;
153 5cedca1b 2004-05-15 devnull }
154 5cedca1b 2004-05-15 devnull cpushback(buf);
155 5cedca1b 2004-05-15 devnull return;
156 5cedca1b 2004-05-15 devnull default:
157 5cedca1b 2004-05-15 devnull goto s0;
158 5cedca1b 2004-05-15 devnull }
159 5cedca1b 2004-05-15 devnull else {
160 5cedca1b 2004-05-15 devnull s0:
161 5cedca1b 2004-05-15 devnull if ((j = findr(i)) == -1)
162 5cedca1b 2004-05-15 devnull i = 0;
163 5cedca1b 2004-05-15 devnull else {
164 5cedca1b 2004-05-15 devnull i = numtabp[j].val = numtabp[j].val + numtabp[j].inc * f;
165 5cedca1b 2004-05-15 devnull nform = numtabp[j].fmt;
166 5cedca1b 2004-05-15 devnull }
167 5cedca1b 2004-05-15 devnull }
168 5cedca1b 2004-05-15 devnull setn1(i, nform, (Tchar) 0);
169 5cedca1b 2004-05-15 devnull }
170 5cedca1b 2004-05-15 devnull
171 5cedca1b 2004-05-15 devnull Tchar numbuf[25];
172 5cedca1b 2004-05-15 devnull Tchar *numbufp;
173 5cedca1b 2004-05-15 devnull
174 5cedca1b 2004-05-15 devnull int wrc(Tchar i)
175 5cedca1b 2004-05-15 devnull {
176 5cedca1b 2004-05-15 devnull if (numbufp >= &numbuf[24])
177 5cedca1b 2004-05-15 devnull return(0);
178 5cedca1b 2004-05-15 devnull *numbufp++ = i;
179 5cedca1b 2004-05-15 devnull return(1);
180 5cedca1b 2004-05-15 devnull }
181 5cedca1b 2004-05-15 devnull
182 5cedca1b 2004-05-15 devnull
183 5cedca1b 2004-05-15 devnull
184 5cedca1b 2004-05-15 devnull /* insert into input number i, in format form, with size-font bits bits */
185 5cedca1b 2004-05-15 devnull void setn1(int i, int form, Tchar bits)
186 5cedca1b 2004-05-15 devnull {
187 5cedca1b 2004-05-15 devnull numbufp = numbuf;
188 5cedca1b 2004-05-15 devnull nrbits = bits;
189 5cedca1b 2004-05-15 devnull nform = form;
190 5cedca1b 2004-05-15 devnull fnumb(i, wrc);
191 5cedca1b 2004-05-15 devnull *numbufp = 0;
192 5cedca1b 2004-05-15 devnull pushback(numbuf);
193 5cedca1b 2004-05-15 devnull }
194 5cedca1b 2004-05-15 devnull
195 5cedca1b 2004-05-15 devnull void prnumtab(Numtab *p)
196 5cedca1b 2004-05-15 devnull {
197 5cedca1b 2004-05-15 devnull int i;
198 5cedca1b 2004-05-15 devnull for (i = 0; i < ncnt; i++)
199 5cedca1b 2004-05-15 devnull if (p)
200 5cedca1b 2004-05-15 devnull if (p[i].r != 0)
201 5cedca1b 2004-05-15 devnull fprintf(stderr, "slot %d, %s, val %d\n", i, unpair(p[i].r), p[i].val);
202 5cedca1b 2004-05-15 devnull else
203 5cedca1b 2004-05-15 devnull fprintf(stderr, "slot %d empty\n", i);
204 5cedca1b 2004-05-15 devnull else
205 5cedca1b 2004-05-15 devnull fprintf(stderr, "slot %d empty\n", i);
206 5cedca1b 2004-05-15 devnull }
207 5cedca1b 2004-05-15 devnull
208 5cedca1b 2004-05-15 devnull void nnspace(void)
209 5cedca1b 2004-05-15 devnull {
210 5cedca1b 2004-05-15 devnull ncnt = sizeof(numtab)/sizeof(Numtab) + NDELTA;
211 5cedca1b 2004-05-15 devnull numtabp = (Numtab *) grow((char *)numtabp, ncnt, sizeof(Numtab));
212 5cedca1b 2004-05-15 devnull if (numtabp == NULL) {
213 5cedca1b 2004-05-15 devnull ERROR "not enough memory for registers (%d)", ncnt WARN;
214 5cedca1b 2004-05-15 devnull exit(1);
215 5cedca1b 2004-05-15 devnull }
216 5cedca1b 2004-05-15 devnull numtabp = (Numtab *) memcpy((char *)numtabp, (char *)numtab,
217 5cedca1b 2004-05-15 devnull sizeof(numtab));
218 5cedca1b 2004-05-15 devnull if (numtabp == NULL) {
219 5cedca1b 2004-05-15 devnull ERROR "Cannot initialize registers" WARN;
220 5cedca1b 2004-05-15 devnull exit(1);
221 5cedca1b 2004-05-15 devnull }
222 5cedca1b 2004-05-15 devnull }
223 5cedca1b 2004-05-15 devnull
224 5cedca1b 2004-05-15 devnull void grownumtab(void)
225 5cedca1b 2004-05-15 devnull {
226 5cedca1b 2004-05-15 devnull ncnt += NDELTA;
227 5cedca1b 2004-05-15 devnull numtabp = (Numtab *) grow((char *) numtabp, ncnt, sizeof(Numtab));
228 5cedca1b 2004-05-15 devnull if (numtabp == NULL) {
229 5cedca1b 2004-05-15 devnull ERROR "Too many number registers (%d)", ncnt WARN;
230 5cedca1b 2004-05-15 devnull done2(04);
231 5cedca1b 2004-05-15 devnull } else {
232 5cedca1b 2004-05-15 devnull memset((char *)(numtabp) + (ncnt - NDELTA) * sizeof(Numtab),
233 5cedca1b 2004-05-15 devnull 0, NDELTA * sizeof(Numtab));
234 5cedca1b 2004-05-15 devnull nrehash();
235 5cedca1b 2004-05-15 devnull }
236 5cedca1b 2004-05-15 devnull }
237 5cedca1b 2004-05-15 devnull
238 5cedca1b 2004-05-15 devnull void nrehash(void)
239 5cedca1b 2004-05-15 devnull {
240 5cedca1b 2004-05-15 devnull Numtab *p;
241 5cedca1b 2004-05-15 devnull int i;
242 5cedca1b 2004-05-15 devnull
243 5cedca1b 2004-05-15 devnull for (i=0; i<NHASHSIZE; i++)
244 5cedca1b 2004-05-15 devnull nhash[i] = 0;
245 5cedca1b 2004-05-15 devnull for (p=numtabp; p < &numtabp[ncnt]; p++)
246 5cedca1b 2004-05-15 devnull p->link = 0;
247 5cedca1b 2004-05-15 devnull for (p=numtabp; p < &numtabp[ncnt]; p++) {
248 5cedca1b 2004-05-15 devnull if (p->r == 0)
249 5cedca1b 2004-05-15 devnull continue;
250 5cedca1b 2004-05-15 devnull i = NHASH(p->r);
251 5cedca1b 2004-05-15 devnull p->link = nhash[i];
252 5cedca1b 2004-05-15 devnull nhash[i] = p;
253 5cedca1b 2004-05-15 devnull }
254 5cedca1b 2004-05-15 devnull }
255 5cedca1b 2004-05-15 devnull
256 5cedca1b 2004-05-15 devnull void nunhash(Numtab *rp)
257 5cedca1b 2004-05-15 devnull {
258 5cedca1b 2004-05-15 devnull Numtab *p;
259 5cedca1b 2004-05-15 devnull Numtab **lp;
260 5cedca1b 2004-05-15 devnull
261 5cedca1b 2004-05-15 devnull if (rp->r == 0)
262 5cedca1b 2004-05-15 devnull return;
263 5cedca1b 2004-05-15 devnull lp = &nhash[NHASH(rp->r)];
264 5cedca1b 2004-05-15 devnull p = *lp;
265 5cedca1b 2004-05-15 devnull while (p) {
266 5cedca1b 2004-05-15 devnull if (p == rp) {
267 5cedca1b 2004-05-15 devnull *lp = p->link;
268 5cedca1b 2004-05-15 devnull p->link = 0;
269 5cedca1b 2004-05-15 devnull return;
270 5cedca1b 2004-05-15 devnull }
271 5cedca1b 2004-05-15 devnull lp = &p->link;
272 5cedca1b 2004-05-15 devnull p = p->link;
273 5cedca1b 2004-05-15 devnull }
274 5cedca1b 2004-05-15 devnull }
275 5cedca1b 2004-05-15 devnull
276 5cedca1b 2004-05-15 devnull int findr(int i)
277 5cedca1b 2004-05-15 devnull {
278 5cedca1b 2004-05-15 devnull Numtab *p;
279 5cedca1b 2004-05-15 devnull int h = NHASH(i);
280 5cedca1b 2004-05-15 devnull
281 5cedca1b 2004-05-15 devnull if (i == 0)
282 5cedca1b 2004-05-15 devnull return(-1);
283 5cedca1b 2004-05-15 devnull a0:
284 5cedca1b 2004-05-15 devnull for (p = nhash[h]; p; p = p->link)
285 5cedca1b 2004-05-15 devnull if (i == p->r)
286 5cedca1b 2004-05-15 devnull return(p - numtabp);
287 5cedca1b 2004-05-15 devnull for (p = numtabp; p < &numtabp[ncnt]; p++) {
288 5cedca1b 2004-05-15 devnull if (p->r == 0) {
289 5cedca1b 2004-05-15 devnull p->r = i;
290 5cedca1b 2004-05-15 devnull p->link = nhash[h];
291 5cedca1b 2004-05-15 devnull nhash[h] = p;
292 5cedca1b 2004-05-15 devnull regcnt++;
293 5cedca1b 2004-05-15 devnull return(p - numtabp);
294 5cedca1b 2004-05-15 devnull }
295 5cedca1b 2004-05-15 devnull }
296 5cedca1b 2004-05-15 devnull grownumtab();
297 5cedca1b 2004-05-15 devnull goto a0;
298 5cedca1b 2004-05-15 devnull }
299 5cedca1b 2004-05-15 devnull
300 5cedca1b 2004-05-15 devnull int usedr(int i) /* returns -1 if nr i has never been used */
301 5cedca1b 2004-05-15 devnull {
302 5cedca1b 2004-05-15 devnull Numtab *p;
303 5cedca1b 2004-05-15 devnull
304 5cedca1b 2004-05-15 devnull if (i == 0)
305 5cedca1b 2004-05-15 devnull return(-1);
306 5cedca1b 2004-05-15 devnull for (p = nhash[NHASH(i)]; p; p = p->link)
307 5cedca1b 2004-05-15 devnull if (i == p->r)
308 5cedca1b 2004-05-15 devnull return(p - numtabp);
309 5cedca1b 2004-05-15 devnull return -1;
310 5cedca1b 2004-05-15 devnull }
311 5cedca1b 2004-05-15 devnull
312 5cedca1b 2004-05-15 devnull
313 5cedca1b 2004-05-15 devnull int fnumb(int i, int (*f)(Tchar))
314 5cedca1b 2004-05-15 devnull {
315 5cedca1b 2004-05-15 devnull int j;
316 5cedca1b 2004-05-15 devnull
317 5cedca1b 2004-05-15 devnull j = 0;
318 5cedca1b 2004-05-15 devnull if (i < 0) {
319 5cedca1b 2004-05-15 devnull j = (*f)('-' | nrbits);
320 5cedca1b 2004-05-15 devnull i = -i;
321 5cedca1b 2004-05-15 devnull }
322 5cedca1b 2004-05-15 devnull switch (nform) {
323 5cedca1b 2004-05-15 devnull default:
324 5cedca1b 2004-05-15 devnull case '1':
325 5cedca1b 2004-05-15 devnull case 0:
326 5cedca1b 2004-05-15 devnull return decml(i, f) + j;
327 5cedca1b 2004-05-15 devnull case 'i':
328 5cedca1b 2004-05-15 devnull case 'I':
329 5cedca1b 2004-05-15 devnull return roman(i, f) + j;
330 5cedca1b 2004-05-15 devnull case 'a':
331 5cedca1b 2004-05-15 devnull case 'A':
332 5cedca1b 2004-05-15 devnull return abc(i, f) + j;
333 5cedca1b 2004-05-15 devnull }
334 5cedca1b 2004-05-15 devnull }
335 5cedca1b 2004-05-15 devnull
336 5cedca1b 2004-05-15 devnull
337 5cedca1b 2004-05-15 devnull int decml(int i, int (*f)(Tchar))
338 5cedca1b 2004-05-15 devnull {
339 5cedca1b 2004-05-15 devnull int j, k;
340 5cedca1b 2004-05-15 devnull
341 5cedca1b 2004-05-15 devnull k = 0;
342 5cedca1b 2004-05-15 devnull nform--;
343 5cedca1b 2004-05-15 devnull if ((j = i / 10) || (nform > 0))
344 5cedca1b 2004-05-15 devnull k = decml(j, f);
345 5cedca1b 2004-05-15 devnull return(k + (*f)((i % 10 + '0') | nrbits));
346 5cedca1b 2004-05-15 devnull }
347 5cedca1b 2004-05-15 devnull
348 5cedca1b 2004-05-15 devnull
349 5cedca1b 2004-05-15 devnull int roman(int i, int (*f)(Tchar))
350 5cedca1b 2004-05-15 devnull {
351 5cedca1b 2004-05-15 devnull
352 5cedca1b 2004-05-15 devnull if (!i)
353 5cedca1b 2004-05-15 devnull return((*f)('0' | nrbits));
354 5cedca1b 2004-05-15 devnull if (nform == 'i')
355 5cedca1b 2004-05-15 devnull return(roman0(i, f, "ixcmz", "vldw"));
356 5cedca1b 2004-05-15 devnull else
357 5cedca1b 2004-05-15 devnull return(roman0(i, f, "IXCMZ", "VLDW"));
358 5cedca1b 2004-05-15 devnull }
359 5cedca1b 2004-05-15 devnull
360 5cedca1b 2004-05-15 devnull
361 5cedca1b 2004-05-15 devnull int roman0(int i, int (*f)(Tchar), char *onesp, char *fivesp)
362 5cedca1b 2004-05-15 devnull {
363 5cedca1b 2004-05-15 devnull int q, rem, k;
364 5cedca1b 2004-05-15 devnull
365 5cedca1b 2004-05-15 devnull if (!i)
366 5cedca1b 2004-05-15 devnull return(0);
367 5cedca1b 2004-05-15 devnull k = roman0(i / 10, f, onesp + 1, fivesp + 1);
368 5cedca1b 2004-05-15 devnull q = (i = i % 10) / 5;
369 5cedca1b 2004-05-15 devnull rem = i % 5;
370 5cedca1b 2004-05-15 devnull if (rem == 4) {
371 5cedca1b 2004-05-15 devnull k += (*f)(*onesp | nrbits);
372 5cedca1b 2004-05-15 devnull if (q)
373 5cedca1b 2004-05-15 devnull i = *(onesp + 1);
374 5cedca1b 2004-05-15 devnull else
375 5cedca1b 2004-05-15 devnull i = *fivesp;
376 5cedca1b 2004-05-15 devnull return(k += (*f)(i | nrbits));
377 5cedca1b 2004-05-15 devnull }
378 5cedca1b 2004-05-15 devnull if (q)
379 5cedca1b 2004-05-15 devnull k += (*f)(*fivesp | nrbits);
380 5cedca1b 2004-05-15 devnull while (--rem >= 0)
381 5cedca1b 2004-05-15 devnull k += (*f)(*onesp | nrbits);
382 5cedca1b 2004-05-15 devnull return(k);
383 5cedca1b 2004-05-15 devnull }
384 5cedca1b 2004-05-15 devnull
385 5cedca1b 2004-05-15 devnull
386 5cedca1b 2004-05-15 devnull int abc(int i, int (*f)(Tchar))
387 5cedca1b 2004-05-15 devnull {
388 5cedca1b 2004-05-15 devnull if (!i)
389 5cedca1b 2004-05-15 devnull return((*f)('0' | nrbits));
390 5cedca1b 2004-05-15 devnull else
391 5cedca1b 2004-05-15 devnull return(abc0(i - 1, f));
392 5cedca1b 2004-05-15 devnull }
393 5cedca1b 2004-05-15 devnull
394 5cedca1b 2004-05-15 devnull
395 5cedca1b 2004-05-15 devnull int abc0(int i, int (*f)(Tchar))
396 5cedca1b 2004-05-15 devnull {
397 5cedca1b 2004-05-15 devnull int j, k;
398 5cedca1b 2004-05-15 devnull
399 5cedca1b 2004-05-15 devnull k = 0;
400 5cedca1b 2004-05-15 devnull if (j = i / 26)
401 5cedca1b 2004-05-15 devnull k = abc0(j - 1, f);
402 5cedca1b 2004-05-15 devnull return(k + (*f)((i % 26 + nform) | nrbits));
403 5cedca1b 2004-05-15 devnull }
404 5cedca1b 2004-05-15 devnull
405 5cedca1b 2004-05-15 devnull long atoi0(void)
406 5cedca1b 2004-05-15 devnull {
407 5cedca1b 2004-05-15 devnull int c, k, cnt;
408 5cedca1b 2004-05-15 devnull Tchar ii;
409 5cedca1b 2004-05-15 devnull long i, acc;
410 5cedca1b 2004-05-15 devnull
411 5cedca1b 2004-05-15 devnull acc = 0;
412 5cedca1b 2004-05-15 devnull nonumb = 0;
413 5cedca1b 2004-05-15 devnull cnt = -1;
414 5cedca1b 2004-05-15 devnull a0:
415 5cedca1b 2004-05-15 devnull cnt++;
416 5cedca1b 2004-05-15 devnull ii = getch();
417 5cedca1b 2004-05-15 devnull c = cbits(ii);
418 5cedca1b 2004-05-15 devnull switch (c) {
419 5cedca1b 2004-05-15 devnull default:
420 5cedca1b 2004-05-15 devnull ch = ii;
421 5cedca1b 2004-05-15 devnull if (cnt)
422 5cedca1b 2004-05-15 devnull break;
423 5cedca1b 2004-05-15 devnull case '+':
424 5cedca1b 2004-05-15 devnull i = ckph();
425 5cedca1b 2004-05-15 devnull if (nonumb)
426 5cedca1b 2004-05-15 devnull break;
427 5cedca1b 2004-05-15 devnull acc += i;
428 5cedca1b 2004-05-15 devnull goto a0;
429 5cedca1b 2004-05-15 devnull case '-':
430 5cedca1b 2004-05-15 devnull i = ckph();
431 5cedca1b 2004-05-15 devnull if (nonumb)
432 5cedca1b 2004-05-15 devnull break;
433 5cedca1b 2004-05-15 devnull acc -= i;
434 5cedca1b 2004-05-15 devnull goto a0;
435 5cedca1b 2004-05-15 devnull case '*':
436 5cedca1b 2004-05-15 devnull i = ckph();
437 5cedca1b 2004-05-15 devnull if (nonumb)
438 5cedca1b 2004-05-15 devnull break;
439 5cedca1b 2004-05-15 devnull acc *= i;
440 5cedca1b 2004-05-15 devnull goto a0;
441 5cedca1b 2004-05-15 devnull case '/':
442 5cedca1b 2004-05-15 devnull i = ckph();
443 5cedca1b 2004-05-15 devnull if (nonumb)
444 5cedca1b 2004-05-15 devnull break;
445 5cedca1b 2004-05-15 devnull if (i == 0) {
446 5cedca1b 2004-05-15 devnull flusho();
447 5cedca1b 2004-05-15 devnull ERROR "divide by zero." WARN;
448 5cedca1b 2004-05-15 devnull acc = 0;
449 5cedca1b 2004-05-15 devnull } else
450 5cedca1b 2004-05-15 devnull acc /= i;
451 5cedca1b 2004-05-15 devnull goto a0;
452 5cedca1b 2004-05-15 devnull case '%':
453 5cedca1b 2004-05-15 devnull i = ckph();
454 5cedca1b 2004-05-15 devnull if (nonumb)
455 5cedca1b 2004-05-15 devnull break;
456 5cedca1b 2004-05-15 devnull acc %= i;
457 5cedca1b 2004-05-15 devnull goto a0;
458 5cedca1b 2004-05-15 devnull case '&': /*and*/
459 5cedca1b 2004-05-15 devnull i = ckph();
460 5cedca1b 2004-05-15 devnull if (nonumb)
461 5cedca1b 2004-05-15 devnull break;
462 5cedca1b 2004-05-15 devnull if ((acc > 0) && (i > 0))
463 5cedca1b 2004-05-15 devnull acc = 1;
464 5cedca1b 2004-05-15 devnull else
465 5cedca1b 2004-05-15 devnull acc = 0;
466 5cedca1b 2004-05-15 devnull goto a0;
467 5cedca1b 2004-05-15 devnull case ':': /*or*/
468 5cedca1b 2004-05-15 devnull i = ckph();
469 5cedca1b 2004-05-15 devnull if (nonumb)
470 5cedca1b 2004-05-15 devnull break;
471 5cedca1b 2004-05-15 devnull if ((acc > 0) || (i > 0))
472 5cedca1b 2004-05-15 devnull acc = 1;
473 5cedca1b 2004-05-15 devnull else
474 5cedca1b 2004-05-15 devnull acc = 0;
475 5cedca1b 2004-05-15 devnull goto a0;
476 5cedca1b 2004-05-15 devnull case '=':
477 5cedca1b 2004-05-15 devnull if (cbits(ii = getch()) != '=')
478 5cedca1b 2004-05-15 devnull ch = ii;
479 5cedca1b 2004-05-15 devnull i = ckph();
480 5cedca1b 2004-05-15 devnull if (nonumb) {
481 5cedca1b 2004-05-15 devnull acc = 0;
482 5cedca1b 2004-05-15 devnull break;
483 5cedca1b 2004-05-15 devnull }
484 5cedca1b 2004-05-15 devnull if (i == acc)
485 5cedca1b 2004-05-15 devnull acc = 1;
486 5cedca1b 2004-05-15 devnull else
487 5cedca1b 2004-05-15 devnull acc = 0;
488 5cedca1b 2004-05-15 devnull goto a0;
489 5cedca1b 2004-05-15 devnull case '>':
490 5cedca1b 2004-05-15 devnull k = 0;
491 5cedca1b 2004-05-15 devnull if (cbits(ii = getch()) == '=')
492 5cedca1b 2004-05-15 devnull k++;
493 5cedca1b 2004-05-15 devnull else
494 5cedca1b 2004-05-15 devnull ch = ii;
495 5cedca1b 2004-05-15 devnull i = ckph();
496 5cedca1b 2004-05-15 devnull if (nonumb) {
497 5cedca1b 2004-05-15 devnull acc = 0;
498 5cedca1b 2004-05-15 devnull break;
499 5cedca1b 2004-05-15 devnull }
500 5cedca1b 2004-05-15 devnull if (acc > (i - k))
501 5cedca1b 2004-05-15 devnull acc = 1;
502 5cedca1b 2004-05-15 devnull else
503 5cedca1b 2004-05-15 devnull acc = 0;
504 5cedca1b 2004-05-15 devnull goto a0;
505 5cedca1b 2004-05-15 devnull case '<':
506 5cedca1b 2004-05-15 devnull k = 0;
507 5cedca1b 2004-05-15 devnull if (cbits(ii = getch()) == '=')
508 5cedca1b 2004-05-15 devnull k++;
509 5cedca1b 2004-05-15 devnull else
510 5cedca1b 2004-05-15 devnull ch = ii;
511 5cedca1b 2004-05-15 devnull i = ckph();
512 5cedca1b 2004-05-15 devnull if (nonumb) {
513 5cedca1b 2004-05-15 devnull acc = 0;
514 5cedca1b 2004-05-15 devnull break;
515 5cedca1b 2004-05-15 devnull }
516 5cedca1b 2004-05-15 devnull if (acc < (i + k))
517 5cedca1b 2004-05-15 devnull acc = 1;
518 5cedca1b 2004-05-15 devnull else
519 5cedca1b 2004-05-15 devnull acc = 0;
520 5cedca1b 2004-05-15 devnull goto a0;
521 5cedca1b 2004-05-15 devnull case ')':
522 5cedca1b 2004-05-15 devnull break;
523 5cedca1b 2004-05-15 devnull case '(':
524 5cedca1b 2004-05-15 devnull acc = atoi0();
525 5cedca1b 2004-05-15 devnull goto a0;
526 5cedca1b 2004-05-15 devnull }
527 5cedca1b 2004-05-15 devnull return(acc);
528 5cedca1b 2004-05-15 devnull }
529 5cedca1b 2004-05-15 devnull
530 5cedca1b 2004-05-15 devnull
531 5cedca1b 2004-05-15 devnull long ckph(void)
532 5cedca1b 2004-05-15 devnull {
533 5cedca1b 2004-05-15 devnull Tchar i;
534 5cedca1b 2004-05-15 devnull long j;
535 5cedca1b 2004-05-15 devnull
536 5cedca1b 2004-05-15 devnull if (cbits(i = getch()) == '(')
537 5cedca1b 2004-05-15 devnull j = atoi0();
538 5cedca1b 2004-05-15 devnull else {
539 5cedca1b 2004-05-15 devnull j = atoi1(i);
540 5cedca1b 2004-05-15 devnull }
541 5cedca1b 2004-05-15 devnull return(j);
542 5cedca1b 2004-05-15 devnull }
543 5cedca1b 2004-05-15 devnull
544 5cedca1b 2004-05-15 devnull
545 5cedca1b 2004-05-15 devnull /*
546 5cedca1b 2004-05-15 devnull * print error about illegal numeric argument;
547 5cedca1b 2004-05-15 devnull */
548 5cedca1b 2004-05-15 devnull void prnumerr(void)
549 5cedca1b 2004-05-15 devnull {
550 5cedca1b 2004-05-15 devnull char err_buf[40];
551 5cedca1b 2004-05-15 devnull static char warn[] = "Numeric argument expected";
552 5cedca1b 2004-05-15 devnull int savcd = numtabp[CD].val;
553 5cedca1b 2004-05-15 devnull
554 5cedca1b 2004-05-15 devnull if (numerr.type == RQERR)
555 5cedca1b 2004-05-15 devnull sprintf(err_buf, "%c%s: %s", nb ? cbits(c2) : cbits(cc),
556 5cedca1b 2004-05-15 devnull unpair(numerr.req), warn);
557 5cedca1b 2004-05-15 devnull else
558 5cedca1b 2004-05-15 devnull sprintf(err_buf, "\\%c'%s': %s", numerr.esc, &numerr.escarg,
559 5cedca1b 2004-05-15 devnull warn);
560 5cedca1b 2004-05-15 devnull if (frame != stk) /* uncertainty correction */
561 5cedca1b 2004-05-15 devnull numtabp[CD].val--;
562 c8d681e8 2008-11-18 rsc ERROR "%s", err_buf WARN;
563 5cedca1b 2004-05-15 devnull numtabp[CD].val = savcd;
564 5cedca1b 2004-05-15 devnull }
565 5cedca1b 2004-05-15 devnull
566 5cedca1b 2004-05-15 devnull
567 5cedca1b 2004-05-15 devnull long atoi1(Tchar ii)
568 5cedca1b 2004-05-15 devnull {
569 5cedca1b 2004-05-15 devnull int i, j, digits;
570 5cedca1b 2004-05-15 devnull double acc; /* this is the only double in troff! */
571 5cedca1b 2004-05-15 devnull int neg, abs, field, decpnt;
572 5cedca1b 2004-05-15 devnull extern int ifnum;
573 5cedca1b 2004-05-15 devnull
574 5cedca1b 2004-05-15 devnull
575 5cedca1b 2004-05-15 devnull neg = abs = field = decpnt = digits = 0;
576 5cedca1b 2004-05-15 devnull acc = 0;
577 5cedca1b 2004-05-15 devnull for (;;) {
578 5cedca1b 2004-05-15 devnull i = cbits(ii);
579 5cedca1b 2004-05-15 devnull switch (i) {
580 5cedca1b 2004-05-15 devnull default:
581 5cedca1b 2004-05-15 devnull break;
582 5cedca1b 2004-05-15 devnull case '+':
583 5cedca1b 2004-05-15 devnull ii = getch();
584 5cedca1b 2004-05-15 devnull continue;
585 5cedca1b 2004-05-15 devnull case '-':
586 5cedca1b 2004-05-15 devnull neg = 1;
587 5cedca1b 2004-05-15 devnull ii = getch();
588 5cedca1b 2004-05-15 devnull continue;
589 5cedca1b 2004-05-15 devnull case '|':
590 5cedca1b 2004-05-15 devnull abs = 1 + neg;
591 5cedca1b 2004-05-15 devnull neg = 0;
592 5cedca1b 2004-05-15 devnull ii = getch();
593 5cedca1b 2004-05-15 devnull continue;
594 5cedca1b 2004-05-15 devnull }
595 5cedca1b 2004-05-15 devnull break;
596 5cedca1b 2004-05-15 devnull }
597 5cedca1b 2004-05-15 devnull a1:
598 5cedca1b 2004-05-15 devnull while (i >= '0' && i <= '9') {
599 5cedca1b 2004-05-15 devnull field++;
600 5cedca1b 2004-05-15 devnull digits++;
601 5cedca1b 2004-05-15 devnull acc = 10 * acc + i - '0';
602 5cedca1b 2004-05-15 devnull ii = getch();
603 5cedca1b 2004-05-15 devnull i = cbits(ii);
604 5cedca1b 2004-05-15 devnull }
605 5cedca1b 2004-05-15 devnull if (i == '.' && !decpnt++) {
606 5cedca1b 2004-05-15 devnull field++;
607 5cedca1b 2004-05-15 devnull digits = 0;
608 5cedca1b 2004-05-15 devnull ii = getch();
609 5cedca1b 2004-05-15 devnull i = cbits(ii);
610 5cedca1b 2004-05-15 devnull goto a1;
611 5cedca1b 2004-05-15 devnull }
612 5cedca1b 2004-05-15 devnull if (!field) {
613 5cedca1b 2004-05-15 devnull ch = ii;
614 5cedca1b 2004-05-15 devnull goto a2;
615 5cedca1b 2004-05-15 devnull }
616 5cedca1b 2004-05-15 devnull switch (i) {
617 5cedca1b 2004-05-15 devnull case 'u':
618 5cedca1b 2004-05-15 devnull i = j = 1; /* should this be related to HOR?? */
619 5cedca1b 2004-05-15 devnull break;
620 5cedca1b 2004-05-15 devnull case 'v': /*VSs - vert spacing*/
621 5cedca1b 2004-05-15 devnull j = lss;
622 5cedca1b 2004-05-15 devnull i = 1;
623 5cedca1b 2004-05-15 devnull break;
624 5cedca1b 2004-05-15 devnull case 'm': /*Ems*/
625 5cedca1b 2004-05-15 devnull j = EM;
626 5cedca1b 2004-05-15 devnull i = 1;
627 5cedca1b 2004-05-15 devnull break;
628 5cedca1b 2004-05-15 devnull case 'n': /*Ens*/
629 5cedca1b 2004-05-15 devnull j = EM;
630 5cedca1b 2004-05-15 devnull if (TROFF)
631 5cedca1b 2004-05-15 devnull i = 2;
632 5cedca1b 2004-05-15 devnull else
633 5cedca1b 2004-05-15 devnull i = 1; /*Same as Ems in NROFF*/
634 5cedca1b 2004-05-15 devnull break;
635 5cedca1b 2004-05-15 devnull case 'p': /*Points*/
636 5cedca1b 2004-05-15 devnull j = INCH;
637 5cedca1b 2004-05-15 devnull i = 72;
638 5cedca1b 2004-05-15 devnull break;
639 5cedca1b 2004-05-15 devnull case 'i': /*Inches*/
640 5cedca1b 2004-05-15 devnull j = INCH;
641 5cedca1b 2004-05-15 devnull i = 1;
642 5cedca1b 2004-05-15 devnull break;
643 5cedca1b 2004-05-15 devnull case 'c': /*Centimeters*/
644 5cedca1b 2004-05-15 devnull /* if INCH is too big, this will overflow */
645 5cedca1b 2004-05-15 devnull j = INCH * 50;
646 5cedca1b 2004-05-15 devnull i = 127;
647 5cedca1b 2004-05-15 devnull break;
648 5cedca1b 2004-05-15 devnull case 'P': /*Picas*/
649 5cedca1b 2004-05-15 devnull j = INCH;
650 5cedca1b 2004-05-15 devnull i = 6;
651 5cedca1b 2004-05-15 devnull break;
652 5cedca1b 2004-05-15 devnull default:
653 5cedca1b 2004-05-15 devnull j = dfact;
654 5cedca1b 2004-05-15 devnull ch = ii;
655 5cedca1b 2004-05-15 devnull i = dfactd;
656 5cedca1b 2004-05-15 devnull }
657 5cedca1b 2004-05-15 devnull if (neg)
658 5cedca1b 2004-05-15 devnull acc = -acc;
659 5cedca1b 2004-05-15 devnull if (!noscale) {
660 5cedca1b 2004-05-15 devnull acc = (acc * j) / i;
661 5cedca1b 2004-05-15 devnull }
662 5cedca1b 2004-05-15 devnull if (field != digits && digits > 0)
663 5cedca1b 2004-05-15 devnull while (digits--)
664 5cedca1b 2004-05-15 devnull acc /= 10;
665 5cedca1b 2004-05-15 devnull if (abs) {
666 5cedca1b 2004-05-15 devnull if (dip != d)
667 5cedca1b 2004-05-15 devnull j = dip->dnl;
668 5cedca1b 2004-05-15 devnull else
669 5cedca1b 2004-05-15 devnull j = numtabp[NL].val;
670 5cedca1b 2004-05-15 devnull if (!vflag) {
671 5cedca1b 2004-05-15 devnull j = numtabp[HP].val;
672 5cedca1b 2004-05-15 devnull }
673 5cedca1b 2004-05-15 devnull if (abs == 2)
674 5cedca1b 2004-05-15 devnull j = -j;
675 5cedca1b 2004-05-15 devnull acc -= j;
676 5cedca1b 2004-05-15 devnull }
677 5cedca1b 2004-05-15 devnull a2:
678 5cedca1b 2004-05-15 devnull nonumb = (!field || field == decpnt);
679 5cedca1b 2004-05-15 devnull if (nonumb && (trace & TRNARGS) && !ismot(ii) && !nlflg && !ifnum) {
680 5cedca1b 2004-05-15 devnull if (cbits(ii) != RIGHT ) /* Too painful to do right */
681 5cedca1b 2004-05-15 devnull prnumerr();
682 5cedca1b 2004-05-15 devnull }
683 5cedca1b 2004-05-15 devnull return(acc);
684 5cedca1b 2004-05-15 devnull }
685 5cedca1b 2004-05-15 devnull
686 5cedca1b 2004-05-15 devnull
687 5cedca1b 2004-05-15 devnull void caserr(void)
688 5cedca1b 2004-05-15 devnull {
689 5cedca1b 2004-05-15 devnull int i, j;
690 5cedca1b 2004-05-15 devnull Numtab *p;
691 5cedca1b 2004-05-15 devnull
692 5cedca1b 2004-05-15 devnull lgf++;
693 5cedca1b 2004-05-15 devnull while (!skip() && (i = getrq()) ) {
694 5cedca1b 2004-05-15 devnull j = usedr(i);
695 5cedca1b 2004-05-15 devnull if (j < 0)
696 5cedca1b 2004-05-15 devnull continue;
697 5cedca1b 2004-05-15 devnull p = &numtabp[j];
698 5cedca1b 2004-05-15 devnull nunhash(p);
699 5cedca1b 2004-05-15 devnull p->r = p->val = p->inc = p->fmt = 0;
700 5cedca1b 2004-05-15 devnull regcnt--;
701 5cedca1b 2004-05-15 devnull }
702 5cedca1b 2004-05-15 devnull }
703 5cedca1b 2004-05-15 devnull
704 5cedca1b 2004-05-15 devnull /*
705 5cedca1b 2004-05-15 devnull * .nr request; if tracing, don't check optional
706 5cedca1b 2004-05-15 devnull * 2nd argument because tbl generates .in 1.5n
707 5cedca1b 2004-05-15 devnull */
708 5cedca1b 2004-05-15 devnull void casenr(void)
709 5cedca1b 2004-05-15 devnull {
710 5cedca1b 2004-05-15 devnull int i, j;
711 5cedca1b 2004-05-15 devnull int savtr = trace;
712 5cedca1b 2004-05-15 devnull
713 5cedca1b 2004-05-15 devnull lgf++;
714 5cedca1b 2004-05-15 devnull skip();
715 5cedca1b 2004-05-15 devnull if ((i = findr(getrq())) == -1)
716 5cedca1b 2004-05-15 devnull goto rtn;
717 5cedca1b 2004-05-15 devnull skip();
718 5cedca1b 2004-05-15 devnull j = inumb(&numtabp[i].val);
719 5cedca1b 2004-05-15 devnull if (nonumb)
720 5cedca1b 2004-05-15 devnull goto rtn;
721 5cedca1b 2004-05-15 devnull numtabp[i].val = j;
722 5cedca1b 2004-05-15 devnull skip();
723 5cedca1b 2004-05-15 devnull trace = 0;
724 5cedca1b 2004-05-15 devnull j = atoi0(); /* BUG??? */
725 5cedca1b 2004-05-15 devnull trace = savtr;
726 5cedca1b 2004-05-15 devnull if (nonumb)
727 5cedca1b 2004-05-15 devnull goto rtn;
728 5cedca1b 2004-05-15 devnull numtabp[i].inc = j;
729 5cedca1b 2004-05-15 devnull rtn:
730 5cedca1b 2004-05-15 devnull return;
731 5cedca1b 2004-05-15 devnull }
732 5cedca1b 2004-05-15 devnull
733 5cedca1b 2004-05-15 devnull void caseaf(void)
734 5cedca1b 2004-05-15 devnull {
735 5cedca1b 2004-05-15 devnull int i, k;
736 5cedca1b 2004-05-15 devnull Tchar j;
737 5cedca1b 2004-05-15 devnull
738 5cedca1b 2004-05-15 devnull lgf++;
739 5cedca1b 2004-05-15 devnull if (skip() || !(i = getrq()) || skip())
740 5cedca1b 2004-05-15 devnull return;
741 5cedca1b 2004-05-15 devnull k = 0;
742 5cedca1b 2004-05-15 devnull j = getch();
743 5cedca1b 2004-05-15 devnull if (!isalpha(cbits(j))) {
744 5cedca1b 2004-05-15 devnull ch = j;
745 5cedca1b 2004-05-15 devnull while ((j = cbits(getch())) >= '0' && j <= '9')
746 5cedca1b 2004-05-15 devnull k++;
747 5cedca1b 2004-05-15 devnull }
748 5cedca1b 2004-05-15 devnull if (!k)
749 5cedca1b 2004-05-15 devnull k = j;
750 5cedca1b 2004-05-15 devnull numtabp[findr(i)].fmt = k; /* was k & BYTEMASK */
751 5cedca1b 2004-05-15 devnull }
752 5cedca1b 2004-05-15 devnull
753 5cedca1b 2004-05-15 devnull void setaf(void) /* return format of number register */
754 5cedca1b 2004-05-15 devnull {
755 5cedca1b 2004-05-15 devnull int i, j;
756 5cedca1b 2004-05-15 devnull
757 5cedca1b 2004-05-15 devnull i = usedr(getsn());
758 5cedca1b 2004-05-15 devnull if (i == -1)
759 5cedca1b 2004-05-15 devnull return;
760 5cedca1b 2004-05-15 devnull if (numtabp[i].fmt > 20) /* it was probably a, A, i or I */
761 5cedca1b 2004-05-15 devnull *pbp++ = numtabp[i].fmt;
762 5cedca1b 2004-05-15 devnull else
763 5cedca1b 2004-05-15 devnull for (j = (numtabp[i].fmt ? numtabp[i].fmt : 1); j; j--)
764 5cedca1b 2004-05-15 devnull *pbp++ = '0';
765 5cedca1b 2004-05-15 devnull }
766 5cedca1b 2004-05-15 devnull
767 5cedca1b 2004-05-15 devnull
768 5cedca1b 2004-05-15 devnull int vnumb(int *i)
769 5cedca1b 2004-05-15 devnull {
770 5cedca1b 2004-05-15 devnull vflag++;
771 5cedca1b 2004-05-15 devnull dfact = lss;
772 5cedca1b 2004-05-15 devnull res = VERT;
773 5cedca1b 2004-05-15 devnull return(inumb(i));
774 5cedca1b 2004-05-15 devnull }
775 5cedca1b 2004-05-15 devnull
776 5cedca1b 2004-05-15 devnull
777 5cedca1b 2004-05-15 devnull int hnumb(int *i)
778 5cedca1b 2004-05-15 devnull {
779 5cedca1b 2004-05-15 devnull dfact = EM;
780 5cedca1b 2004-05-15 devnull res = HOR;
781 5cedca1b 2004-05-15 devnull return(inumb(i));
782 5cedca1b 2004-05-15 devnull }
783 5cedca1b 2004-05-15 devnull
784 5cedca1b 2004-05-15 devnull
785 5cedca1b 2004-05-15 devnull int inumb(int *n)
786 5cedca1b 2004-05-15 devnull {
787 5cedca1b 2004-05-15 devnull int i, j, f;
788 5cedca1b 2004-05-15 devnull Tchar ii;
789 5cedca1b 2004-05-15 devnull
790 5cedca1b 2004-05-15 devnull f = 0;
791 5cedca1b 2004-05-15 devnull if (n) {
792 5cedca1b 2004-05-15 devnull if ((j = cbits(ii = getch())) == '+')
793 5cedca1b 2004-05-15 devnull f = 1;
794 5cedca1b 2004-05-15 devnull else if (j == '-')
795 5cedca1b 2004-05-15 devnull f = -1;
796 5cedca1b 2004-05-15 devnull else
797 5cedca1b 2004-05-15 devnull ch = ii;
798 5cedca1b 2004-05-15 devnull }
799 5cedca1b 2004-05-15 devnull i = atoi0();
800 5cedca1b 2004-05-15 devnull if (n && f)
801 5cedca1b 2004-05-15 devnull i = *n + f * i;
802 5cedca1b 2004-05-15 devnull i = quant(i, res);
803 5cedca1b 2004-05-15 devnull vflag = 0;
804 5cedca1b 2004-05-15 devnull res = dfactd = dfact = 1;
805 5cedca1b 2004-05-15 devnull if (nonumb)
806 5cedca1b 2004-05-15 devnull i = 0;
807 5cedca1b 2004-05-15 devnull return(i);
808 5cedca1b 2004-05-15 devnull }
809 5cedca1b 2004-05-15 devnull
810 5cedca1b 2004-05-15 devnull
811 5cedca1b 2004-05-15 devnull int quant(int n, int m)
812 5cedca1b 2004-05-15 devnull {
813 5cedca1b 2004-05-15 devnull int i, neg;
814 5cedca1b 2004-05-15 devnull
815 5cedca1b 2004-05-15 devnull neg = 0;
816 5cedca1b 2004-05-15 devnull if (n < 0) {
817 5cedca1b 2004-05-15 devnull neg++;
818 5cedca1b 2004-05-15 devnull n = -n;
819 5cedca1b 2004-05-15 devnull }
820 5cedca1b 2004-05-15 devnull /* better as i = ((n + m/2)/m)*m */
821 5cedca1b 2004-05-15 devnull i = n / m;
822 5cedca1b 2004-05-15 devnull if (n - m * i > m / 2)
823 5cedca1b 2004-05-15 devnull i += 1;
824 5cedca1b 2004-05-15 devnull i *= m;
825 5cedca1b 2004-05-15 devnull if (neg)
826 5cedca1b 2004-05-15 devnull i = -i;
827 5cedca1b 2004-05-15 devnull return(i);
828 5cedca1b 2004-05-15 devnull }