static char sccsid
[] = "@(#)n4.c 2.1 (CWI) 85/07/18";
* number registers, conversion, arithmetic
int falsef
= 0; /* on if inside false branch of if */
#define NHASH(i) ((i>>6)^i)&0177
struct numtab
*nhash
[128]; /* 128 == the 0177 on line above */
if ((i
= cbits(ii
= getach())) == '+')
break; /*-Tterm used in nroff*/
*pbp
++ = (i
>> BYTE
) & BYTEMASK
;
i
= hyalg
; /* "Dialect" register (jaap) */
if ((j
= findr(i
)) == -1)
i
= numtab
[j
].val
= (numtab
[j
].val
+numtab
[j
].inc
*f
);
setn1(i
, nform
, (tchar
) 0);
if (numbufp
>= &numbuf
[16])
/* insert into input number i, in format form, with size-font bits bits */
register struct numtab
*p
;
for (p
=numtab
; p
< &numtab
[NN
]; p
++)
for (p
=numtab
; p
< &numtab
[NN
]; p
++) {
register struct numtab
*rp
;
register struct numtab
*p
;
register struct numtab
**lp
;
lp
= &nhash
[NHASH(rp
->r
)];
register struct numtab
*p
;
for (p
= nhash
[h
]; p
; p
= p
->link
)
for (p
= numtab
; p
< &numtab
[NN
]; p
++) {
errprint("too many number registers (%d).", NN
);
usedr(i
) /* returns -1 if nr i has never been used */
register struct numtab
*p
;
for (p
= nhash
[NHASH(i
)]; p
; p
= p
->link
)
if ((j
= i
/ 10) || (nform
> 0))
return(k
+ (*f
)((i
% 10 + '0') | nrbits
));
return((*f
)('0' | nrbits
));
return(roman0(i
, f
, "ixcmz", "vldw"));
return(roman0(i
, f
, "IXCMZ", "VLDW"));
roman0(i
, f
, onesp
, fivesp
)
k
= roman0(i
/ 10, f
, onesp
+ 1, fivesp
+ 1);
k
+= (*f
)(*onesp
| nrbits
);
return(k
+= (*f
)(i
| nrbits
));
k
+= (*f
)(*fivesp
| nrbits
);
k
+= (*f
)(*onesp
| nrbits
);
return((*f
)('0' | nrbits
));
return(k
+ (*f
)((i
% 26 + nform
) | nrbits
));
errprint("divide by zero.");
if ((acc
> 0) && (i
> 0))
if ((acc
> 0) || (i
> 0))
if (cbits(ii
= getch()) != '=')
if (cbits(ii
= getch()) == '=')
if (cbits(ii
= getch()) == '=')
if (cbits(i
= getch()) == '(')
neg
= abs
= field
= digits
= 0;
while (i
>= '0' && i
<= '9') {
acc
= 10 * acc
+ i
- '0';
i
= j
= 1; /* should this be related to HOR?? */
case 'v': /*VSs - vert spacing*/
i
= 1; /*Same as Ems in NROFF*/
case 'c': /*Centimeters*/
/* if INCH is too big, this will overflow */
if ((field
!= digits
) && (digits
> 0))
register struct numtab
*p
;
while (!skip() && (i
= getrq()) ) {
p
->r
= p
->val
= p
->inc
= p
->fmt
= 0;
if ((i
= findr(getrq())) == -1)
j
= inumb(&numtab
[i
].val
);
if (skip() || !(i
= getrq()) || skip())
if (!isalpha(cbits(j
))) {
while ((j
= cbits(getch())) >= '0' && j
<= '9')
numtab
[findr(i
)].fmt
= k
& BYTEMASK
;
setaf() /* return format of number register */
if (numtab
[i
].fmt
> 20) /* it was probably a, A, i or I */
for (j
= (numtab
[i
].fmt
? numtab
[i
].fmt
: 1); j
; j
--)
if ((j
= cbits(ii
= getch())) == '+')
res
= dfactd
= dfact
= 1;
/* better as i = ((n + (m/2))/m)*m */
if ((n
- m
* i
) > (m
/ 2))