1 c42a1d3d 2006-02-21 devnull #include "a.h"
4 c42a1d3d 2006-02-21 devnull * Section 1 - General Explanation.
7 c42a1d3d 2006-02-21 devnull /* 1.3 - Numerical parameter input. */
8 c42a1d3d 2006-02-21 devnull char *units = "icPmnpuvx";
10 c42a1d3d 2006-02-21 devnull scale2units(char c)
14 c42a1d3d 2006-02-21 devnull switch(c){
15 c42a1d3d 2006-02-21 devnull case 'i': /* inch */
16 c42a1d3d 2006-02-21 devnull return UPI;
17 c42a1d3d 2006-02-21 devnull case 'c': /* centimeter */
18 c42a1d3d 2006-02-21 devnull return 0.3937008 * UPI;
19 c42a1d3d 2006-02-21 devnull case 'P': /* pica = 1/6 inch */
20 c42a1d3d 2006-02-21 devnull return UPI / 6;
21 c42a1d3d 2006-02-21 devnull case 'm': /* em = S points */
22 c42a1d3d 2006-02-21 devnull return UPI / 72.0 * getnr(L(".s"));
23 c42a1d3d 2006-02-21 devnull case 'n': /* en = em/2 */
24 c42a1d3d 2006-02-21 devnull return UPI / 72.0 * getnr(L(".s")) / 2;
25 c42a1d3d 2006-02-21 devnull case 'p': /* point = 1/72 inch */
26 c42a1d3d 2006-02-21 devnull return UPI / 72;
27 c42a1d3d 2006-02-21 devnull case 'u': /* basic unit */
28 c42a1d3d 2006-02-21 devnull return 1;
29 c42a1d3d 2006-02-21 devnull case 'v': /* vertical line space V */
30 c42a1d3d 2006-02-21 devnull x = getnr(L(".v"));
31 c42a1d3d 2006-02-21 devnull if(x == 0)
32 c42a1d3d 2006-02-21 devnull x = 12 * UPI / 72;
33 c42a1d3d 2006-02-21 devnull return x;
34 c42a1d3d 2006-02-21 devnull case 'x': /* pixel (htmlroff addition) */
35 c42a1d3d 2006-02-21 devnull return UPX;
37 c42a1d3d 2006-02-21 devnull return 1;
41 c42a1d3d 2006-02-21 devnull /* 1.4 - Numerical expressions. */
42 c42a1d3d 2006-02-21 devnull int eval0(Rune**, int, int);
44 c42a1d3d 2006-02-21 devnull eval(Rune *s)
46 c42a1d3d 2006-02-21 devnull return eval0(&s, 1, 1);
49 c42a1d3d 2006-02-21 devnull runestrtol(Rune *a, Rune **p)
54 c42a1d3d 2006-02-21 devnull while('0' <= *a && *a <= '9'){
55 c42a1d3d 2006-02-21 devnull n = n*10 + *a-'0';
59 c42a1d3d 2006-02-21 devnull return n;
63 c42a1d3d 2006-02-21 devnull evalscale(Rune *s, int c)
65 c42a1d3d 2006-02-21 devnull return eval0(&s, scale2units(c), 1);
69 c42a1d3d 2006-02-21 devnull eval0(Rune **pline, int scale, int recur)
73 c42a1d3d 2006-02-21 devnull double f, p10;
74 c42a1d3d 2006-02-21 devnull int x, y;
77 c42a1d3d 2006-02-21 devnull p = *pline;
78 c42a1d3d 2006-02-21 devnull while(*p == '-'){
79 c42a1d3d 2006-02-21 devnull neg = 1 - neg;
82 c42a1d3d 2006-02-21 devnull if(*p == '('){
84 c42a1d3d 2006-02-21 devnull x = eval0(&p, scale, 1);
85 c42a1d3d 2006-02-21 devnull if (*p != ')'){
86 c42a1d3d 2006-02-21 devnull *pline = p;
87 c42a1d3d 2006-02-21 devnull return x;
91 c42a1d3d 2006-02-21 devnull f = runestrtol(p, &p);
92 c42a1d3d 2006-02-21 devnull if(*p == '.'){
93 c42a1d3d 2006-02-21 devnull p10 = 1.0;
95 c42a1d3d 2006-02-21 devnull while('0' <= *p && *p <= '9'){
96 c42a1d3d 2006-02-21 devnull p10 /= 10;
97 c42a1d3d 2006-02-21 devnull f += p10*(*p++ - '0');
100 c42a1d3d 2006-02-21 devnull if(*p && strchr(units, *p)){
101 c42a1d3d 2006-02-21 devnull if(scale)
102 c42a1d3d 2006-02-21 devnull f *= scale2units(*p);
104 c42a1d3d 2006-02-21 devnull }else if(scale)
105 c42a1d3d 2006-02-21 devnull f *= scale;
110 c42a1d3d 2006-02-21 devnull if(!recur){
111 c42a1d3d 2006-02-21 devnull *pline = p;
112 c42a1d3d 2006-02-21 devnull return x;
115 c42a1d3d 2006-02-21 devnull while(*p){
116 c42a1d3d 2006-02-21 devnull switch(*p++) {
117 c42a1d3d 2006-02-21 devnull case '+':
118 c42a1d3d 2006-02-21 devnull x += eval0(&p, scale, 0);
119 c42a1d3d 2006-02-21 devnull continue;
120 c42a1d3d 2006-02-21 devnull case '-':
121 c42a1d3d 2006-02-21 devnull x -= eval0(&p, scale, 0);
122 c42a1d3d 2006-02-21 devnull continue;
123 c42a1d3d 2006-02-21 devnull case '*':
124 c42a1d3d 2006-02-21 devnull x *= eval0(&p, scale, 0);
125 c42a1d3d 2006-02-21 devnull continue;
126 c42a1d3d 2006-02-21 devnull case '/':
127 c42a1d3d 2006-02-21 devnull y = eval0(&p, scale, 0);
128 c42a1d3d 2006-02-21 devnull if (y == 0) {
129 c42a1d3d 2006-02-21 devnull fprint(2, "%L: divide by zero %S\n", p);
133 c42a1d3d 2006-02-21 devnull continue;
134 c42a1d3d 2006-02-21 devnull case '%':
135 c42a1d3d 2006-02-21 devnull y = eval0(&p, scale, 0);
136 c42a1d3d 2006-02-21 devnull if (!y) {
137 c42a1d3d 2006-02-21 devnull fprint(2, "%L: modulo by zero %S\n", p);
141 c42a1d3d 2006-02-21 devnull continue;
142 c42a1d3d 2006-02-21 devnull case '<':
143 c42a1d3d 2006-02-21 devnull if (*p == '=') {
145 c42a1d3d 2006-02-21 devnull x = x <= eval0(&p, scale, 0);
146 c42a1d3d 2006-02-21 devnull continue;
148 c42a1d3d 2006-02-21 devnull x = x < eval0(&p, scale, 0);
149 c42a1d3d 2006-02-21 devnull continue;
150 c42a1d3d 2006-02-21 devnull case '>':
151 c42a1d3d 2006-02-21 devnull if (*p == '=') {
153 c42a1d3d 2006-02-21 devnull x = x >= eval0(&p, scale, 0);
154 c42a1d3d 2006-02-21 devnull continue;
156 c42a1d3d 2006-02-21 devnull x = x > eval0(&p, scale, 0);
157 c42a1d3d 2006-02-21 devnull continue;
158 c42a1d3d 2006-02-21 devnull case '=':
159 c42a1d3d 2006-02-21 devnull if (*p == '=')
161 c42a1d3d 2006-02-21 devnull x = x == eval0(&p, scale, 0);
162 c42a1d3d 2006-02-21 devnull continue;
163 c42a1d3d 2006-02-21 devnull case '&':
164 c42a1d3d 2006-02-21 devnull x &= eval0(&p, scale, 0);
165 c42a1d3d 2006-02-21 devnull continue;
166 c42a1d3d 2006-02-21 devnull case ':':
167 c42a1d3d 2006-02-21 devnull x |= eval0(&p, scale, 0);
168 c42a1d3d 2006-02-21 devnull continue;
171 c42a1d3d 2006-02-21 devnull *pline = p;
172 c42a1d3d 2006-02-21 devnull return x;
176 c42a1d3d 2006-02-21 devnull t1init(void)
180 c42a1d3d 2006-02-21 devnull tm = *localtime(time(0));
181 c42a1d3d 2006-02-21 devnull nr(L("dw"), tm.wday+1);
182 c42a1d3d 2006-02-21 devnull nr(L("dy"), tm.mday);
183 c42a1d3d 2006-02-21 devnull nr(L("mo"), tm.mon);
184 c42a1d3d 2006-02-21 devnull nr(L("yr"), tm.year%100);