4 * Section 1 - General Explanation.
7 /* 1.3 - Numerical parameter input. */
8 char *units = "icPmnpuvx";
17 case 'c': /* centimeter */
18 return 0.3937008 * UPI;
19 case 'P': /* pica = 1/6 inch */
21 case 'm': /* em = S points */
22 return UPI / 72.0 * getnr(L(".s"));
23 case 'n': /* en = em/2 */
24 return UPI / 72.0 * getnr(L(".s")) / 2;
25 case 'p': /* point = 1/72 inch */
27 case 'u': /* basic unit */
29 case 'v': /* vertical line space V */
34 case 'x': /* pixel (htmlroff addition) */
41 /* 1.4 - Numerical expressions. */
42 int eval0(Rune**, int, int);
46 return eval0(&s, 1, 1);
49 runestrtol(Rune *a, Rune **p)
54 while('0' <= *a && *a <= '9'){
63 evalscale(Rune *s, int c)
65 return eval0(&s, scale2units(c), 1);
69 eval0(Rune **pline, int scale, int recur)
84 x = eval0(&p, scale, 1);
91 f = runestrtol(p, &p);
95 while('0' <= *p && *p <= '9'){
97 f += p10*(*p++ - '0');
100 if(*p && strchr(units, *p)){
102 f *= scale2units(*p);
118 x += eval0(&p, scale, 0);
121 x -= eval0(&p, scale, 0);
124 x *= eval0(&p, scale, 0);
127 y = eval0(&p, scale, 0);
129 fprint(2, "%L: divide by zero %S\n", p);
135 y = eval0(&p, scale, 0);
137 fprint(2, "%L: modulo by zero %S\n", p);
145 x = x <= eval0(&p, scale, 0);
148 x = x < eval0(&p, scale, 0);
153 x = x >= eval0(&p, scale, 0);
156 x = x > eval0(&p, scale, 0);
161 x = x == eval0(&p, scale, 0);
164 x &= eval0(&p, scale, 0);
167 x |= eval0(&p, scale, 0);
180 tm = *localtime(time(0));
181 nr(L("dw"), tm.wday+1);
182 nr(L("dy"), tm.mday);
184 nr(L("yr"), tm.year%100);