Blame


1 c42a1d3d 2006-02-21 devnull #include "a.h"
2 c42a1d3d 2006-02-21 devnull
3 c42a1d3d 2006-02-21 devnull /*
4 c42a1d3d 2006-02-21 devnull * Section 1 - General Explanation.
5 c42a1d3d 2006-02-21 devnull */
6 c42a1d3d 2006-02-21 devnull
7 c42a1d3d 2006-02-21 devnull /* 1.3 - Numerical parameter input. */
8 c42a1d3d 2006-02-21 devnull char *units = "icPmnpuvx";
9 c42a1d3d 2006-02-21 devnull int
10 c42a1d3d 2006-02-21 devnull scale2units(char c)
11 c42a1d3d 2006-02-21 devnull {
12 c42a1d3d 2006-02-21 devnull int x;
13 c42a1d3d 2006-02-21 devnull
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;
36 c42a1d3d 2006-02-21 devnull default:
37 c42a1d3d 2006-02-21 devnull return 1;
38 c42a1d3d 2006-02-21 devnull }
39 c42a1d3d 2006-02-21 devnull }
40 c42a1d3d 2006-02-21 devnull
41 c42a1d3d 2006-02-21 devnull /* 1.4 - Numerical expressions. */
42 c42a1d3d 2006-02-21 devnull int eval0(Rune**, int, int);
43 c42a1d3d 2006-02-21 devnull int
44 c42a1d3d 2006-02-21 devnull eval(Rune *s)
45 c42a1d3d 2006-02-21 devnull {
46 c42a1d3d 2006-02-21 devnull return eval0(&s, 1, 1);
47 c42a1d3d 2006-02-21 devnull }
48 c42a1d3d 2006-02-21 devnull long
49 c42a1d3d 2006-02-21 devnull runestrtol(Rune *a, Rune **p)
50 c42a1d3d 2006-02-21 devnull {
51 c42a1d3d 2006-02-21 devnull long n;
52 c42a1d3d 2006-02-21 devnull
53 c42a1d3d 2006-02-21 devnull n = 0;
54 c42a1d3d 2006-02-21 devnull while('0' <= *a && *a <= '9'){
55 c42a1d3d 2006-02-21 devnull n = n*10 + *a-'0';
56 c42a1d3d 2006-02-21 devnull a++;
57 c42a1d3d 2006-02-21 devnull }
58 c42a1d3d 2006-02-21 devnull *p = a;
59 c42a1d3d 2006-02-21 devnull return n;
60 c42a1d3d 2006-02-21 devnull }
61 c42a1d3d 2006-02-21 devnull
62 c42a1d3d 2006-02-21 devnull int
63 c42a1d3d 2006-02-21 devnull evalscale(Rune *s, int c)
64 c42a1d3d 2006-02-21 devnull {
65 c42a1d3d 2006-02-21 devnull return eval0(&s, scale2units(c), 1);
66 c42a1d3d 2006-02-21 devnull }
67 c42a1d3d 2006-02-21 devnull
68 c42a1d3d 2006-02-21 devnull int
69 c42a1d3d 2006-02-21 devnull eval0(Rune **pline, int scale, int recur)
70 c42a1d3d 2006-02-21 devnull {
71 c42a1d3d 2006-02-21 devnull Rune *p;
72 c42a1d3d 2006-02-21 devnull int neg;
73 c42a1d3d 2006-02-21 devnull double f, p10;
74 c42a1d3d 2006-02-21 devnull int x, y;
75 c42a1d3d 2006-02-21 devnull
76 c42a1d3d 2006-02-21 devnull neg = 0;
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;
80 c42a1d3d 2006-02-21 devnull p++;
81 c42a1d3d 2006-02-21 devnull }
82 c42a1d3d 2006-02-21 devnull if(*p == '('){
83 c42a1d3d 2006-02-21 devnull 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;
88 c42a1d3d 2006-02-21 devnull }
89 c42a1d3d 2006-02-21 devnull p++;
90 c42a1d3d 2006-02-21 devnull }else{
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;
94 c42a1d3d 2006-02-21 devnull p++;
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');
98 c42a1d3d 2006-02-21 devnull }
99 c42a1d3d 2006-02-21 devnull }
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);
103 c42a1d3d 2006-02-21 devnull p++;
104 c42a1d3d 2006-02-21 devnull }else if(scale)
105 c42a1d3d 2006-02-21 devnull f *= scale;
106 c42a1d3d 2006-02-21 devnull x = f;
107 c42a1d3d 2006-02-21 devnull }
108 c42a1d3d 2006-02-21 devnull if(neg)
109 c42a1d3d 2006-02-21 devnull x = -x;
110 c42a1d3d 2006-02-21 devnull if(!recur){
111 c42a1d3d 2006-02-21 devnull *pline = p;
112 c42a1d3d 2006-02-21 devnull return x;
113 c42a1d3d 2006-02-21 devnull }
114 c42a1d3d 2006-02-21 devnull
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);
130 c42a1d3d 2006-02-21 devnull y = 1;
131 c42a1d3d 2006-02-21 devnull }
132 c42a1d3d 2006-02-21 devnull x /= y;
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);
138 c42a1d3d 2006-02-21 devnull y = 1;
139 c42a1d3d 2006-02-21 devnull }
140 c42a1d3d 2006-02-21 devnull x %= y;
141 c42a1d3d 2006-02-21 devnull continue;
142 c42a1d3d 2006-02-21 devnull case '<':
143 c42a1d3d 2006-02-21 devnull if (*p == '=') {
144 c42a1d3d 2006-02-21 devnull p++;
145 c42a1d3d 2006-02-21 devnull x = x <= eval0(&p, scale, 0);
146 c42a1d3d 2006-02-21 devnull continue;
147 c42a1d3d 2006-02-21 devnull }
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 == '=') {
152 c42a1d3d 2006-02-21 devnull p++;
153 c42a1d3d 2006-02-21 devnull x = x >= eval0(&p, scale, 0);
154 c42a1d3d 2006-02-21 devnull continue;
155 c42a1d3d 2006-02-21 devnull }
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 == '=')
160 c42a1d3d 2006-02-21 devnull 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;
169 c42a1d3d 2006-02-21 devnull }
170 c42a1d3d 2006-02-21 devnull }
171 c42a1d3d 2006-02-21 devnull *pline = p;
172 c42a1d3d 2006-02-21 devnull return x;
173 c42a1d3d 2006-02-21 devnull }
174 c42a1d3d 2006-02-21 devnull
175 c42a1d3d 2006-02-21 devnull void
176 c42a1d3d 2006-02-21 devnull t1init(void)
177 c42a1d3d 2006-02-21 devnull {
178 c42a1d3d 2006-02-21 devnull Tm tm;
179 c42a1d3d 2006-02-21 devnull
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);
185 c42a1d3d 2006-02-21 devnull }
186 c42a1d3d 2006-02-21 devnull