Blame


1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <ctype.h>
5 564ca709 2004-04-19 devnull #include <mach.h>
6 564ca709 2004-04-19 devnull #define Extern extern
7 564ca709 2004-04-19 devnull #include "acid.h"
8 564ca709 2004-04-19 devnull
9 e637c944 2004-04-20 devnull static int fsize[256];
10 e637c944 2004-04-20 devnull
11 e637c944 2004-04-20 devnull static void
12 e637c944 2004-04-20 devnull initfsize(void)
13 564ca709 2004-04-19 devnull {
14 e637c944 2004-04-20 devnull fsize['A'] = 4;
15 e637c944 2004-04-20 devnull fsize['B'] = 4;
16 e637c944 2004-04-20 devnull fsize['C'] = 1;
17 e637c944 2004-04-20 devnull fsize['D'] = 4;
18 e637c944 2004-04-20 devnull fsize['F'] = 8;
19 e637c944 2004-04-20 devnull fsize['G'] = 8;
20 e637c944 2004-04-20 devnull fsize['O'] = 4;
21 e637c944 2004-04-20 devnull fsize['Q'] = 4;
22 e637c944 2004-04-20 devnull fsize['R'] = 4;
23 e637c944 2004-04-20 devnull fsize['S'] = 4;
24 e637c944 2004-04-20 devnull fsize['U'] = 4;
25 e637c944 2004-04-20 devnull fsize['V'] = 8;
26 e637c944 2004-04-20 devnull fsize['X'] = 4;
27 e637c944 2004-04-20 devnull fsize['Y'] = 8;
28 e637c944 2004-04-20 devnull fsize['W'] = 8;
29 e637c944 2004-04-20 devnull fsize['Z'] = 8;
30 e637c944 2004-04-20 devnull fsize['a'] = 4;
31 e637c944 2004-04-20 devnull fsize['b'] = 1;
32 e637c944 2004-04-20 devnull fsize['c'] = 1;
33 e637c944 2004-04-20 devnull fsize['d'] = 2;
34 e637c944 2004-04-20 devnull fsize['f'] = 4;
35 e637c944 2004-04-20 devnull fsize['g'] = 4;
36 e637c944 2004-04-20 devnull fsize['o'] = 2;
37 e637c944 2004-04-20 devnull fsize['q'] = 2;
38 e637c944 2004-04-20 devnull fsize['r'] = 2;
39 e637c944 2004-04-20 devnull fsize['s'] = 4;
40 e637c944 2004-04-20 devnull fsize['u'] = 2;
41 e637c944 2004-04-20 devnull fsize['x'] = 2;
42 a0f1e21f 2004-04-20 devnull }
43 564ca709 2004-04-19 devnull
44 564ca709 2004-04-19 devnull int
45 564ca709 2004-04-19 devnull fmtsize(Value *v)
46 564ca709 2004-04-19 devnull {
47 564ca709 2004-04-19 devnull int ret;
48 564ca709 2004-04-19 devnull
49 564ca709 2004-04-19 devnull switch(v->store.fmt) {
50 564ca709 2004-04-19 devnull default:
51 564ca709 2004-04-19 devnull return fsize[(unsigned char)v->store.fmt];
52 564ca709 2004-04-19 devnull case 'i':
53 564ca709 2004-04-19 devnull case 'I':
54 564ca709 2004-04-19 devnull if(v->type != TINT || mach == 0)
55 564ca709 2004-04-19 devnull error("no size for i fmt pointer ++/--");
56 564ca709 2004-04-19 devnull ret = (*mach->instsize)(symmap, v->store.u.ival);
57 564ca709 2004-04-19 devnull if(ret < 0) {
58 564ca709 2004-04-19 devnull ret = (*mach->instsize)(symmap, v->store.u.ival);
59 564ca709 2004-04-19 devnull if(ret < 0)
60 564ca709 2004-04-19 devnull error("%r");
61 564ca709 2004-04-19 devnull }
62 564ca709 2004-04-19 devnull return ret;
63 564ca709 2004-04-19 devnull }
64 564ca709 2004-04-19 devnull }
65 564ca709 2004-04-19 devnull
66 564ca709 2004-04-19 devnull void
67 564ca709 2004-04-19 devnull chklval(Node *lp)
68 564ca709 2004-04-19 devnull {
69 564ca709 2004-04-19 devnull if(lp->op != ONAME)
70 564ca709 2004-04-19 devnull error("need l-value");
71 564ca709 2004-04-19 devnull }
72 564ca709 2004-04-19 devnull
73 564ca709 2004-04-19 devnull void
74 564ca709 2004-04-19 devnull olist(Node *n, Node *res)
75 564ca709 2004-04-19 devnull {
76 564ca709 2004-04-19 devnull expr(n->left, res);
77 564ca709 2004-04-19 devnull expr(n->right, res);
78 564ca709 2004-04-19 devnull }
79 564ca709 2004-04-19 devnull
80 564ca709 2004-04-19 devnull void
81 564ca709 2004-04-19 devnull oeval(Node *n, Node *res)
82 564ca709 2004-04-19 devnull {
83 564ca709 2004-04-19 devnull expr(n->left, res);
84 564ca709 2004-04-19 devnull if(res->type != TCODE)
85 564ca709 2004-04-19 devnull error("bad type for eval");
86 564ca709 2004-04-19 devnull expr(res->store.u.cc, res);
87 564ca709 2004-04-19 devnull }
88 564ca709 2004-04-19 devnull
89 564ca709 2004-04-19 devnull void
90 564ca709 2004-04-19 devnull ocast(Node *n, Node *res)
91 564ca709 2004-04-19 devnull {
92 564ca709 2004-04-19 devnull if(n->sym->lt == 0)
93 564ca709 2004-04-19 devnull error("%s is not a complex type", n->sym->name);
94 564ca709 2004-04-19 devnull
95 564ca709 2004-04-19 devnull expr(n->left, res);
96 564ca709 2004-04-19 devnull res->store.comt = n->sym->lt;
97 564ca709 2004-04-19 devnull res->store.fmt = 'a';
98 564ca709 2004-04-19 devnull }
99 564ca709 2004-04-19 devnull
100 564ca709 2004-04-19 devnull void
101 564ca709 2004-04-19 devnull oindm(Node *n, Node *res)
102 564ca709 2004-04-19 devnull {
103 564ca709 2004-04-19 devnull Map *m;
104 564ca709 2004-04-19 devnull Node l;
105 564ca709 2004-04-19 devnull
106 564ca709 2004-04-19 devnull m = cormap;
107 564ca709 2004-04-19 devnull if(m == 0)
108 564ca709 2004-04-19 devnull m = symmap;
109 564ca709 2004-04-19 devnull expr(n->left, &l);
110 564ca709 2004-04-19 devnull if(l.type != TINT)
111 564ca709 2004-04-19 devnull error("bad type for *");
112 564ca709 2004-04-19 devnull if(m == 0)
113 564ca709 2004-04-19 devnull error("no map for *");
114 564ca709 2004-04-19 devnull indir(m, l.store.u.ival, l.store.fmt, res);
115 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
116 564ca709 2004-04-19 devnull }
117 564ca709 2004-04-19 devnull
118 564ca709 2004-04-19 devnull void
119 564ca709 2004-04-19 devnull oindc(Node *n, Node *res)
120 564ca709 2004-04-19 devnull {
121 564ca709 2004-04-19 devnull Map *m;
122 564ca709 2004-04-19 devnull Node l;
123 564ca709 2004-04-19 devnull
124 564ca709 2004-04-19 devnull m = symmap;
125 564ca709 2004-04-19 devnull if(m == 0)
126 564ca709 2004-04-19 devnull m = cormap;
127 564ca709 2004-04-19 devnull expr(n->left, &l);
128 564ca709 2004-04-19 devnull if(l.type != TINT)
129 564ca709 2004-04-19 devnull error("bad type for @");
130 564ca709 2004-04-19 devnull if(m == 0)
131 564ca709 2004-04-19 devnull error("no map for @");
132 564ca709 2004-04-19 devnull indir(m, l.store.u.ival, l.store.fmt, res);
133 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
134 564ca709 2004-04-19 devnull }
135 564ca709 2004-04-19 devnull
136 564ca709 2004-04-19 devnull void
137 564ca709 2004-04-19 devnull oframe(Node *n, Node *res)
138 564ca709 2004-04-19 devnull {
139 564ca709 2004-04-19 devnull char *p;
140 564ca709 2004-04-19 devnull Node *lp;
141 564ca709 2004-04-19 devnull ulong ival;
142 564ca709 2004-04-19 devnull Frtype *f;
143 564ca709 2004-04-19 devnull
144 564ca709 2004-04-19 devnull p = n->sym->name;
145 564ca709 2004-04-19 devnull while(*p && *p == '$')
146 564ca709 2004-04-19 devnull p++;
147 564ca709 2004-04-19 devnull lp = n->left;
148 564ca709 2004-04-19 devnull if(localaddr(cormap, correg, p, lp->sym->name, &ival) < 0)
149 564ca709 2004-04-19 devnull error("colon: %r");
150 564ca709 2004-04-19 devnull
151 564ca709 2004-04-19 devnull res->store.u.ival = ival;
152 564ca709 2004-04-19 devnull res->op = OCONST;
153 564ca709 2004-04-19 devnull res->store.fmt = 'X';
154 564ca709 2004-04-19 devnull res->type = TINT;
155 564ca709 2004-04-19 devnull
156 564ca709 2004-04-19 devnull /* Try and set comt */
157 564ca709 2004-04-19 devnull for(f = n->sym->local; f; f = f->next) {
158 564ca709 2004-04-19 devnull if(f->var == lp->sym) {
159 564ca709 2004-04-19 devnull res->store.comt = f->type;
160 564ca709 2004-04-19 devnull res->store.fmt = 'a';
161 564ca709 2004-04-19 devnull break;
162 564ca709 2004-04-19 devnull }
163 564ca709 2004-04-19 devnull }
164 564ca709 2004-04-19 devnull }
165 564ca709 2004-04-19 devnull
166 564ca709 2004-04-19 devnull void
167 564ca709 2004-04-19 devnull oindex(Node *n, Node *res)
168 564ca709 2004-04-19 devnull {
169 564ca709 2004-04-19 devnull Node l, r;
170 564ca709 2004-04-19 devnull
171 564ca709 2004-04-19 devnull expr(n->left, &l);
172 564ca709 2004-04-19 devnull expr(n->right, &r);
173 564ca709 2004-04-19 devnull
174 564ca709 2004-04-19 devnull if(r.type != TINT)
175 564ca709 2004-04-19 devnull error("bad type for []");
176 564ca709 2004-04-19 devnull
177 564ca709 2004-04-19 devnull switch(l.type) {
178 564ca709 2004-04-19 devnull default:
179 564ca709 2004-04-19 devnull error("lhs[] has bad type");
180 564ca709 2004-04-19 devnull case TINT:
181 564ca709 2004-04-19 devnull indir(cormap, l.store.u.ival+(r.store.u.ival*fsize[(unsigned char)l.store.fmt]), l.store.fmt, res);
182 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
183 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
184 564ca709 2004-04-19 devnull break;
185 564ca709 2004-04-19 devnull case TLIST:
186 564ca709 2004-04-19 devnull nthelem(l.store.u.l, r.store.u.ival, res);
187 564ca709 2004-04-19 devnull break;
188 564ca709 2004-04-19 devnull case TSTRING:
189 564ca709 2004-04-19 devnull res->store.u.ival = 0;
190 564ca709 2004-04-19 devnull if(r.store.u.ival >= 0 && r.store.u.ival < l.store.u.string->len) {
191 564ca709 2004-04-19 devnull int xx8; /* to get around bug in vc */
192 564ca709 2004-04-19 devnull xx8 = r.store.u.ival;
193 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.string->string[xx8];
194 564ca709 2004-04-19 devnull }
195 564ca709 2004-04-19 devnull res->op = OCONST;
196 564ca709 2004-04-19 devnull res->type = TINT;
197 564ca709 2004-04-19 devnull res->store.fmt = 'c';
198 564ca709 2004-04-19 devnull break;
199 564ca709 2004-04-19 devnull }
200 564ca709 2004-04-19 devnull }
201 564ca709 2004-04-19 devnull
202 564ca709 2004-04-19 devnull void
203 564ca709 2004-04-19 devnull oappend(Node *n, Node *res)
204 564ca709 2004-04-19 devnull {
205 564ca709 2004-04-19 devnull Node r, l;
206 564ca709 2004-04-19 devnull
207 564ca709 2004-04-19 devnull expr(n->left, &l);
208 564ca709 2004-04-19 devnull expr(n->right, &r);
209 564ca709 2004-04-19 devnull if(l.type != TLIST)
210 564ca709 2004-04-19 devnull error("must append to list");
211 564ca709 2004-04-19 devnull append(res, &l, &r);
212 564ca709 2004-04-19 devnull }
213 564ca709 2004-04-19 devnull
214 564ca709 2004-04-19 devnull void
215 564ca709 2004-04-19 devnull odelete(Node *n, Node *res)
216 564ca709 2004-04-19 devnull {
217 564ca709 2004-04-19 devnull Node l, r;
218 564ca709 2004-04-19 devnull
219 564ca709 2004-04-19 devnull expr(n->left, &l);
220 564ca709 2004-04-19 devnull expr(n->right, &r);
221 564ca709 2004-04-19 devnull if(l.type != TLIST)
222 564ca709 2004-04-19 devnull error("must delete from list");
223 564ca709 2004-04-19 devnull if(r.type != TINT)
224 564ca709 2004-04-19 devnull error("delete index must be integer");
225 564ca709 2004-04-19 devnull
226 564ca709 2004-04-19 devnull delete(l.store.u.l, r.store.u.ival, res);
227 564ca709 2004-04-19 devnull }
228 564ca709 2004-04-19 devnull
229 564ca709 2004-04-19 devnull void
230 564ca709 2004-04-19 devnull ohead(Node *n, Node *res)
231 564ca709 2004-04-19 devnull {
232 564ca709 2004-04-19 devnull Node l;
233 564ca709 2004-04-19 devnull
234 564ca709 2004-04-19 devnull expr(n->left, &l);
235 564ca709 2004-04-19 devnull if(l.type != TLIST)
236 564ca709 2004-04-19 devnull error("head needs list");
237 564ca709 2004-04-19 devnull res->op = OCONST;
238 564ca709 2004-04-19 devnull if(l.store.u.l) {
239 564ca709 2004-04-19 devnull res->type = l.store.u.l->type;
240 564ca709 2004-04-19 devnull res->store = l.store.u.l->store;
241 564ca709 2004-04-19 devnull }
242 564ca709 2004-04-19 devnull else {
243 564ca709 2004-04-19 devnull res->type = TLIST;
244 564ca709 2004-04-19 devnull res->store.u.l = 0;
245 564ca709 2004-04-19 devnull }
246 564ca709 2004-04-19 devnull }
247 564ca709 2004-04-19 devnull
248 564ca709 2004-04-19 devnull void
249 564ca709 2004-04-19 devnull otail(Node *n, Node *res)
250 564ca709 2004-04-19 devnull {
251 564ca709 2004-04-19 devnull Node l;
252 564ca709 2004-04-19 devnull
253 564ca709 2004-04-19 devnull expr(n->left, &l);
254 564ca709 2004-04-19 devnull if(l.type != TLIST)
255 564ca709 2004-04-19 devnull error("tail needs list");
256 564ca709 2004-04-19 devnull res->op = OCONST;
257 564ca709 2004-04-19 devnull res->type = TLIST;
258 564ca709 2004-04-19 devnull if(l.store.u.l)
259 564ca709 2004-04-19 devnull res->store.u.l = l.store.u.l->next;
260 564ca709 2004-04-19 devnull else
261 564ca709 2004-04-19 devnull res->store.u.l = 0;
262 564ca709 2004-04-19 devnull }
263 564ca709 2004-04-19 devnull
264 564ca709 2004-04-19 devnull void
265 564ca709 2004-04-19 devnull oconst(Node *n, Node *res)
266 564ca709 2004-04-19 devnull {
267 564ca709 2004-04-19 devnull res->op = OCONST;
268 564ca709 2004-04-19 devnull res->type = n->type;
269 564ca709 2004-04-19 devnull res->store = n->store;
270 564ca709 2004-04-19 devnull res->store.comt = n->store.comt;
271 564ca709 2004-04-19 devnull }
272 564ca709 2004-04-19 devnull
273 564ca709 2004-04-19 devnull void
274 564ca709 2004-04-19 devnull oname(Node *n, Node *res)
275 564ca709 2004-04-19 devnull {
276 564ca709 2004-04-19 devnull Value *v;
277 564ca709 2004-04-19 devnull
278 564ca709 2004-04-19 devnull v = n->sym->v;
279 564ca709 2004-04-19 devnull if(v->set == 0)
280 564ca709 2004-04-19 devnull error("%s used but not set", n->sym->name);
281 564ca709 2004-04-19 devnull res->op = OCONST;
282 564ca709 2004-04-19 devnull res->type = v->type;
283 564ca709 2004-04-19 devnull res->store = v->store;
284 564ca709 2004-04-19 devnull res->store.comt = v->store.comt;
285 564ca709 2004-04-19 devnull }
286 564ca709 2004-04-19 devnull
287 564ca709 2004-04-19 devnull void
288 564ca709 2004-04-19 devnull octruct(Node *n, Node *res)
289 564ca709 2004-04-19 devnull {
290 564ca709 2004-04-19 devnull res->op = OCONST;
291 564ca709 2004-04-19 devnull res->type = TLIST;
292 564ca709 2004-04-19 devnull res->store.u.l = construct(n->left);
293 564ca709 2004-04-19 devnull }
294 564ca709 2004-04-19 devnull
295 564ca709 2004-04-19 devnull void
296 564ca709 2004-04-19 devnull oasgn(Node *n, Node *res)
297 564ca709 2004-04-19 devnull {
298 564ca709 2004-04-19 devnull Node *lp, r;
299 564ca709 2004-04-19 devnull Value *v;
300 564ca709 2004-04-19 devnull
301 564ca709 2004-04-19 devnull lp = n->left;
302 564ca709 2004-04-19 devnull switch(lp->op) {
303 564ca709 2004-04-19 devnull case OINDM:
304 564ca709 2004-04-19 devnull windir(cormap, lp->left, n->right, res);
305 564ca709 2004-04-19 devnull break;
306 564ca709 2004-04-19 devnull case OINDC:
307 564ca709 2004-04-19 devnull windir(symmap, lp->left, n->right, res);
308 564ca709 2004-04-19 devnull break;
309 564ca709 2004-04-19 devnull default:
310 564ca709 2004-04-19 devnull chklval(lp);
311 564ca709 2004-04-19 devnull v = lp->sym->v;
312 564ca709 2004-04-19 devnull expr(n->right, &r);
313 564ca709 2004-04-19 devnull v->set = 1;
314 564ca709 2004-04-19 devnull v->type = r.type;
315 564ca709 2004-04-19 devnull v->store = r.store;
316 564ca709 2004-04-19 devnull res->op = OCONST;
317 564ca709 2004-04-19 devnull res->type = v->type;
318 564ca709 2004-04-19 devnull res->store = v->store;
319 564ca709 2004-04-19 devnull res->store.comt = v->store.comt;
320 564ca709 2004-04-19 devnull }
321 564ca709 2004-04-19 devnull }
322 564ca709 2004-04-19 devnull
323 564ca709 2004-04-19 devnull void
324 564ca709 2004-04-19 devnull oadd(Node *n, Node *res)
325 564ca709 2004-04-19 devnull {
326 564ca709 2004-04-19 devnull Node l, r;
327 564ca709 2004-04-19 devnull
328 564ca709 2004-04-19 devnull expr(n->left, &l);
329 564ca709 2004-04-19 devnull expr(n->right, &r);
330 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
331 564ca709 2004-04-19 devnull res->op = OCONST;
332 564ca709 2004-04-19 devnull res->type = TFLOAT;
333 564ca709 2004-04-19 devnull switch(l.type) {
334 564ca709 2004-04-19 devnull default:
335 564ca709 2004-04-19 devnull error("bad lhs type +");
336 564ca709 2004-04-19 devnull case TINT:
337 564ca709 2004-04-19 devnull switch(r.type) {
338 564ca709 2004-04-19 devnull case TINT:
339 564ca709 2004-04-19 devnull res->type = TINT;
340 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival+r.store.u.ival;
341 564ca709 2004-04-19 devnull break;
342 564ca709 2004-04-19 devnull case TFLOAT:
343 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival+r.store.u.fval;
344 564ca709 2004-04-19 devnull break;
345 564ca709 2004-04-19 devnull default:
346 564ca709 2004-04-19 devnull error("bad rhs type +");
347 564ca709 2004-04-19 devnull }
348 564ca709 2004-04-19 devnull break;
349 564ca709 2004-04-19 devnull case TFLOAT:
350 564ca709 2004-04-19 devnull switch(r.type) {
351 564ca709 2004-04-19 devnull case TINT:
352 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval+r.store.u.ival;
353 564ca709 2004-04-19 devnull break;
354 564ca709 2004-04-19 devnull case TFLOAT:
355 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval+r.store.u.fval;
356 564ca709 2004-04-19 devnull break;
357 564ca709 2004-04-19 devnull default:
358 564ca709 2004-04-19 devnull error("bad rhs type +");
359 564ca709 2004-04-19 devnull }
360 564ca709 2004-04-19 devnull break;
361 564ca709 2004-04-19 devnull case TSTRING:
362 564ca709 2004-04-19 devnull if(r.type == TSTRING) {
363 564ca709 2004-04-19 devnull res->type = TSTRING;
364 564ca709 2004-04-19 devnull res->store.fmt = 's';
365 564ca709 2004-04-19 devnull res->store.u.string = stradd(l.store.u.string, r.store.u.string);
366 564ca709 2004-04-19 devnull break;
367 564ca709 2004-04-19 devnull }
368 564ca709 2004-04-19 devnull error("bad rhs for +");
369 564ca709 2004-04-19 devnull case TLIST:
370 564ca709 2004-04-19 devnull res->type = TLIST;
371 564ca709 2004-04-19 devnull switch(r.type) {
372 564ca709 2004-04-19 devnull case TLIST:
373 564ca709 2004-04-19 devnull res->store.u.l = addlist(l.store.u.l, r.store.u.l);
374 564ca709 2004-04-19 devnull break;
375 564ca709 2004-04-19 devnull default:
376 564ca709 2004-04-19 devnull r.left = 0;
377 564ca709 2004-04-19 devnull r.right = 0;
378 564ca709 2004-04-19 devnull res->store.u.l = addlist(l.store.u.l, construct(&r));
379 564ca709 2004-04-19 devnull break;
380 564ca709 2004-04-19 devnull }
381 564ca709 2004-04-19 devnull }
382 564ca709 2004-04-19 devnull }
383 564ca709 2004-04-19 devnull
384 564ca709 2004-04-19 devnull void
385 564ca709 2004-04-19 devnull osub(Node *n, Node *res)
386 564ca709 2004-04-19 devnull {
387 564ca709 2004-04-19 devnull Node l, r;
388 564ca709 2004-04-19 devnull
389 564ca709 2004-04-19 devnull expr(n->left, &l);
390 564ca709 2004-04-19 devnull expr(n->right, &r);
391 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
392 564ca709 2004-04-19 devnull res->op = OCONST;
393 564ca709 2004-04-19 devnull res->type = TFLOAT;
394 564ca709 2004-04-19 devnull switch(l.type) {
395 564ca709 2004-04-19 devnull default:
396 564ca709 2004-04-19 devnull error("bad lhs type -");
397 564ca709 2004-04-19 devnull case TINT:
398 564ca709 2004-04-19 devnull switch(r.type) {
399 564ca709 2004-04-19 devnull case TINT:
400 564ca709 2004-04-19 devnull res->type = TINT;
401 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival-r.store.u.ival;
402 564ca709 2004-04-19 devnull break;
403 564ca709 2004-04-19 devnull case TFLOAT:
404 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival-r.store.u.fval;
405 564ca709 2004-04-19 devnull break;
406 564ca709 2004-04-19 devnull default:
407 564ca709 2004-04-19 devnull error("bad rhs type -");
408 564ca709 2004-04-19 devnull }
409 564ca709 2004-04-19 devnull break;
410 564ca709 2004-04-19 devnull case TFLOAT:
411 564ca709 2004-04-19 devnull switch(r.type) {
412 564ca709 2004-04-19 devnull case TINT:
413 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval-r.store.u.ival;
414 564ca709 2004-04-19 devnull break;
415 564ca709 2004-04-19 devnull case TFLOAT:
416 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval-r.store.u.fval;
417 564ca709 2004-04-19 devnull break;
418 564ca709 2004-04-19 devnull default:
419 564ca709 2004-04-19 devnull error("bad rhs type -");
420 564ca709 2004-04-19 devnull }
421 564ca709 2004-04-19 devnull break;
422 564ca709 2004-04-19 devnull }
423 564ca709 2004-04-19 devnull }
424 564ca709 2004-04-19 devnull
425 564ca709 2004-04-19 devnull void
426 564ca709 2004-04-19 devnull omul(Node *n, Node *res)
427 564ca709 2004-04-19 devnull {
428 564ca709 2004-04-19 devnull Node l, r;
429 564ca709 2004-04-19 devnull
430 564ca709 2004-04-19 devnull expr(n->left, &l);
431 564ca709 2004-04-19 devnull expr(n->right, &r);
432 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
433 564ca709 2004-04-19 devnull res->op = OCONST;
434 564ca709 2004-04-19 devnull res->type = TFLOAT;
435 564ca709 2004-04-19 devnull switch(l.type) {
436 564ca709 2004-04-19 devnull default:
437 564ca709 2004-04-19 devnull error("bad lhs type *");
438 564ca709 2004-04-19 devnull case TINT:
439 564ca709 2004-04-19 devnull switch(r.type) {
440 564ca709 2004-04-19 devnull case TINT:
441 564ca709 2004-04-19 devnull res->type = TINT;
442 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival*r.store.u.ival;
443 564ca709 2004-04-19 devnull break;
444 564ca709 2004-04-19 devnull case TFLOAT:
445 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival*r.store.u.fval;
446 564ca709 2004-04-19 devnull break;
447 564ca709 2004-04-19 devnull default:
448 564ca709 2004-04-19 devnull error("bad rhs type *");
449 564ca709 2004-04-19 devnull }
450 564ca709 2004-04-19 devnull break;
451 564ca709 2004-04-19 devnull case TFLOAT:
452 564ca709 2004-04-19 devnull switch(r.type) {
453 564ca709 2004-04-19 devnull case TINT:
454 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval*r.store.u.ival;
455 564ca709 2004-04-19 devnull break;
456 564ca709 2004-04-19 devnull case TFLOAT:
457 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval*r.store.u.fval;
458 564ca709 2004-04-19 devnull break;
459 564ca709 2004-04-19 devnull default:
460 564ca709 2004-04-19 devnull error("bad rhs type *");
461 564ca709 2004-04-19 devnull }
462 564ca709 2004-04-19 devnull break;
463 564ca709 2004-04-19 devnull }
464 564ca709 2004-04-19 devnull }
465 564ca709 2004-04-19 devnull
466 564ca709 2004-04-19 devnull void
467 564ca709 2004-04-19 devnull odiv(Node *n, Node *res)
468 564ca709 2004-04-19 devnull {
469 564ca709 2004-04-19 devnull Node l, r;
470 564ca709 2004-04-19 devnull
471 564ca709 2004-04-19 devnull expr(n->left, &l);
472 564ca709 2004-04-19 devnull expr(n->right, &r);
473 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
474 564ca709 2004-04-19 devnull res->op = OCONST;
475 564ca709 2004-04-19 devnull res->type = TFLOAT;
476 564ca709 2004-04-19 devnull switch(l.type) {
477 564ca709 2004-04-19 devnull default:
478 564ca709 2004-04-19 devnull error("bad lhs type /");
479 564ca709 2004-04-19 devnull case TINT:
480 564ca709 2004-04-19 devnull switch(r.type) {
481 564ca709 2004-04-19 devnull case TINT:
482 564ca709 2004-04-19 devnull res->type = TINT;
483 564ca709 2004-04-19 devnull if(r.store.u.ival == 0)
484 564ca709 2004-04-19 devnull error("zero divide");
485 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival/r.store.u.ival;
486 564ca709 2004-04-19 devnull break;
487 564ca709 2004-04-19 devnull case TFLOAT:
488 564ca709 2004-04-19 devnull if(r.store.u.fval == 0)
489 564ca709 2004-04-19 devnull error("zero divide");
490 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival/r.store.u.fval;
491 564ca709 2004-04-19 devnull break;
492 564ca709 2004-04-19 devnull default:
493 564ca709 2004-04-19 devnull error("bad rhs type /");
494 564ca709 2004-04-19 devnull }
495 564ca709 2004-04-19 devnull break;
496 564ca709 2004-04-19 devnull case TFLOAT:
497 564ca709 2004-04-19 devnull switch(r.type) {
498 564ca709 2004-04-19 devnull case TINT:
499 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval/r.store.u.ival;
500 564ca709 2004-04-19 devnull break;
501 564ca709 2004-04-19 devnull case TFLOAT:
502 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval/r.store.u.fval;
503 564ca709 2004-04-19 devnull break;
504 564ca709 2004-04-19 devnull default:
505 564ca709 2004-04-19 devnull error("bad rhs type /");
506 564ca709 2004-04-19 devnull }
507 564ca709 2004-04-19 devnull break;
508 564ca709 2004-04-19 devnull }
509 564ca709 2004-04-19 devnull }
510 564ca709 2004-04-19 devnull
511 564ca709 2004-04-19 devnull void
512 564ca709 2004-04-19 devnull omod(Node *n, Node *res)
513 564ca709 2004-04-19 devnull {
514 564ca709 2004-04-19 devnull Node l, r;
515 564ca709 2004-04-19 devnull
516 564ca709 2004-04-19 devnull expr(n->left, &l);
517 564ca709 2004-04-19 devnull expr(n->right, &r);
518 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
519 564ca709 2004-04-19 devnull res->op = OCONST;
520 564ca709 2004-04-19 devnull res->type = TINT;
521 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
522 564ca709 2004-04-19 devnull error("bad expr type %");
523 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival%r.store.u.ival;
524 564ca709 2004-04-19 devnull }
525 564ca709 2004-04-19 devnull
526 564ca709 2004-04-19 devnull void
527 564ca709 2004-04-19 devnull olsh(Node *n, Node *res)
528 564ca709 2004-04-19 devnull {
529 564ca709 2004-04-19 devnull Node l, r;
530 564ca709 2004-04-19 devnull
531 564ca709 2004-04-19 devnull expr(n->left, &l);
532 564ca709 2004-04-19 devnull expr(n->right, &r);
533 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
534 564ca709 2004-04-19 devnull res->op = OCONST;
535 564ca709 2004-04-19 devnull res->type = TINT;
536 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
537 564ca709 2004-04-19 devnull error("bad expr type <<");
538 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival<<r.store.u.ival;
539 564ca709 2004-04-19 devnull }
540 564ca709 2004-04-19 devnull
541 564ca709 2004-04-19 devnull void
542 564ca709 2004-04-19 devnull orsh(Node *n, Node *res)
543 564ca709 2004-04-19 devnull {
544 564ca709 2004-04-19 devnull Node l, r;
545 564ca709 2004-04-19 devnull
546 564ca709 2004-04-19 devnull expr(n->left, &l);
547 564ca709 2004-04-19 devnull expr(n->right, &r);
548 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
549 564ca709 2004-04-19 devnull res->op = OCONST;
550 564ca709 2004-04-19 devnull res->type = TINT;
551 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
552 564ca709 2004-04-19 devnull error("bad expr type >>");
553 564ca709 2004-04-19 devnull res->store.u.ival = (unsigned)l.store.u.ival>>r.store.u.ival;
554 564ca709 2004-04-19 devnull }
555 564ca709 2004-04-19 devnull
556 564ca709 2004-04-19 devnull void
557 564ca709 2004-04-19 devnull olt(Node *n, Node *res)
558 564ca709 2004-04-19 devnull {
559 564ca709 2004-04-19 devnull Node l, r;
560 564ca709 2004-04-19 devnull
561 564ca709 2004-04-19 devnull expr(n->left, &l);
562 564ca709 2004-04-19 devnull expr(n->right, &r);
563 564ca709 2004-04-19 devnull
564 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
565 564ca709 2004-04-19 devnull res->op = OCONST;
566 564ca709 2004-04-19 devnull res->type = TINT;
567 564ca709 2004-04-19 devnull switch(l.type) {
568 564ca709 2004-04-19 devnull default:
569 564ca709 2004-04-19 devnull error("bad lhs type <");
570 564ca709 2004-04-19 devnull case TINT:
571 564ca709 2004-04-19 devnull switch(r.type) {
572 564ca709 2004-04-19 devnull case TINT:
573 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival < r.store.u.ival;
574 564ca709 2004-04-19 devnull break;
575 564ca709 2004-04-19 devnull case TFLOAT:
576 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival < r.store.u.fval;
577 564ca709 2004-04-19 devnull break;
578 564ca709 2004-04-19 devnull default:
579 564ca709 2004-04-19 devnull error("bad rhs type <");
580 564ca709 2004-04-19 devnull }
581 564ca709 2004-04-19 devnull break;
582 564ca709 2004-04-19 devnull case TFLOAT:
583 564ca709 2004-04-19 devnull switch(r.type) {
584 564ca709 2004-04-19 devnull case TINT:
585 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval < r.store.u.ival;
586 564ca709 2004-04-19 devnull break;
587 564ca709 2004-04-19 devnull case TFLOAT:
588 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval < r.store.u.fval;
589 564ca709 2004-04-19 devnull break;
590 564ca709 2004-04-19 devnull default:
591 564ca709 2004-04-19 devnull error("bad rhs type <");
592 564ca709 2004-04-19 devnull }
593 564ca709 2004-04-19 devnull break;
594 564ca709 2004-04-19 devnull }
595 564ca709 2004-04-19 devnull }
596 564ca709 2004-04-19 devnull
597 564ca709 2004-04-19 devnull void
598 564ca709 2004-04-19 devnull ogt(Node *n, Node *res)
599 564ca709 2004-04-19 devnull {
600 564ca709 2004-04-19 devnull Node l, r;
601 564ca709 2004-04-19 devnull
602 564ca709 2004-04-19 devnull expr(n->left, &l);
603 564ca709 2004-04-19 devnull expr(n->right, &r);
604 564ca709 2004-04-19 devnull res->store.fmt = 'D';
605 564ca709 2004-04-19 devnull res->op = OCONST;
606 564ca709 2004-04-19 devnull res->type = TINT;
607 564ca709 2004-04-19 devnull switch(l.type) {
608 564ca709 2004-04-19 devnull default:
609 564ca709 2004-04-19 devnull error("bad lhs type >");
610 564ca709 2004-04-19 devnull case TINT:
611 564ca709 2004-04-19 devnull switch(r.type) {
612 564ca709 2004-04-19 devnull case TINT:
613 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival > r.store.u.ival;
614 564ca709 2004-04-19 devnull break;
615 564ca709 2004-04-19 devnull case TFLOAT:
616 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival > r.store.u.fval;
617 564ca709 2004-04-19 devnull break;
618 564ca709 2004-04-19 devnull default:
619 564ca709 2004-04-19 devnull error("bad rhs type >");
620 564ca709 2004-04-19 devnull }
621 564ca709 2004-04-19 devnull break;
622 564ca709 2004-04-19 devnull case TFLOAT:
623 564ca709 2004-04-19 devnull switch(r.type) {
624 564ca709 2004-04-19 devnull case TINT:
625 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval > r.store.u.ival;
626 564ca709 2004-04-19 devnull break;
627 564ca709 2004-04-19 devnull case TFLOAT:
628 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval > r.store.u.fval;
629 564ca709 2004-04-19 devnull break;
630 564ca709 2004-04-19 devnull default:
631 564ca709 2004-04-19 devnull error("bad rhs type >");
632 564ca709 2004-04-19 devnull }
633 564ca709 2004-04-19 devnull break;
634 564ca709 2004-04-19 devnull }
635 564ca709 2004-04-19 devnull }
636 564ca709 2004-04-19 devnull
637 564ca709 2004-04-19 devnull void
638 564ca709 2004-04-19 devnull oleq(Node *n, Node *res)
639 564ca709 2004-04-19 devnull {
640 564ca709 2004-04-19 devnull Node l, r;
641 564ca709 2004-04-19 devnull
642 564ca709 2004-04-19 devnull expr(n->left, &l);
643 564ca709 2004-04-19 devnull expr(n->right, &r);
644 564ca709 2004-04-19 devnull res->store.fmt = 'D';
645 564ca709 2004-04-19 devnull res->op = OCONST;
646 564ca709 2004-04-19 devnull res->type = TINT;
647 564ca709 2004-04-19 devnull switch(l.type) {
648 564ca709 2004-04-19 devnull default:
649 564ca709 2004-04-19 devnull error("bad expr type <=");
650 564ca709 2004-04-19 devnull case TINT:
651 564ca709 2004-04-19 devnull switch(r.type) {
652 564ca709 2004-04-19 devnull case TINT:
653 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival <= r.store.u.ival;
654 564ca709 2004-04-19 devnull break;
655 564ca709 2004-04-19 devnull case TFLOAT:
656 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival <= r.store.u.fval;
657 564ca709 2004-04-19 devnull break;
658 564ca709 2004-04-19 devnull default:
659 564ca709 2004-04-19 devnull error("bad expr type <=");
660 564ca709 2004-04-19 devnull }
661 564ca709 2004-04-19 devnull break;
662 564ca709 2004-04-19 devnull case TFLOAT:
663 564ca709 2004-04-19 devnull switch(r.type) {
664 564ca709 2004-04-19 devnull case TINT:
665 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval <= r.store.u.ival;
666 564ca709 2004-04-19 devnull break;
667 564ca709 2004-04-19 devnull case TFLOAT:
668 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval <= r.store.u.fval;
669 564ca709 2004-04-19 devnull break;
670 564ca709 2004-04-19 devnull default:
671 564ca709 2004-04-19 devnull error("bad expr type <=");
672 564ca709 2004-04-19 devnull }
673 564ca709 2004-04-19 devnull break;
674 564ca709 2004-04-19 devnull }
675 564ca709 2004-04-19 devnull }
676 564ca709 2004-04-19 devnull
677 564ca709 2004-04-19 devnull void
678 564ca709 2004-04-19 devnull ogeq(Node *n, Node *res)
679 564ca709 2004-04-19 devnull {
680 564ca709 2004-04-19 devnull Node l, r;
681 564ca709 2004-04-19 devnull
682 564ca709 2004-04-19 devnull expr(n->left, &l);
683 564ca709 2004-04-19 devnull expr(n->right, &r);
684 564ca709 2004-04-19 devnull res->store.fmt = 'D';
685 564ca709 2004-04-19 devnull res->op = OCONST;
686 564ca709 2004-04-19 devnull res->type = TINT;
687 564ca709 2004-04-19 devnull switch(l.type) {
688 564ca709 2004-04-19 devnull default:
689 564ca709 2004-04-19 devnull error("bad lhs type >=");
690 564ca709 2004-04-19 devnull case TINT:
691 564ca709 2004-04-19 devnull switch(r.type) {
692 564ca709 2004-04-19 devnull case TINT:
693 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival >= r.store.u.ival;
694 564ca709 2004-04-19 devnull break;
695 564ca709 2004-04-19 devnull case TFLOAT:
696 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival >= r.store.u.fval;
697 564ca709 2004-04-19 devnull break;
698 564ca709 2004-04-19 devnull default:
699 564ca709 2004-04-19 devnull error("bad rhs type >=");
700 564ca709 2004-04-19 devnull }
701 564ca709 2004-04-19 devnull break;
702 564ca709 2004-04-19 devnull case TFLOAT:
703 564ca709 2004-04-19 devnull switch(r.type) {
704 564ca709 2004-04-19 devnull case TINT:
705 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval >= r.store.u.ival;
706 564ca709 2004-04-19 devnull break;
707 564ca709 2004-04-19 devnull case TFLOAT:
708 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval >= r.store.u.fval;
709 564ca709 2004-04-19 devnull break;
710 564ca709 2004-04-19 devnull default:
711 564ca709 2004-04-19 devnull error("bad rhs type >=");
712 564ca709 2004-04-19 devnull }
713 564ca709 2004-04-19 devnull break;
714 564ca709 2004-04-19 devnull }
715 564ca709 2004-04-19 devnull }
716 564ca709 2004-04-19 devnull
717 564ca709 2004-04-19 devnull void
718 564ca709 2004-04-19 devnull oeq(Node *n, Node *res)
719 564ca709 2004-04-19 devnull {
720 564ca709 2004-04-19 devnull Node l, r;
721 564ca709 2004-04-19 devnull
722 564ca709 2004-04-19 devnull expr(n->left, &l);
723 564ca709 2004-04-19 devnull expr(n->right, &r);
724 564ca709 2004-04-19 devnull res->store.fmt = 'D';
725 564ca709 2004-04-19 devnull res->op = OCONST;
726 564ca709 2004-04-19 devnull res->type = TINT;
727 564ca709 2004-04-19 devnull res->store.u.ival = 0;
728 564ca709 2004-04-19 devnull switch(l.type) {
729 564ca709 2004-04-19 devnull default:
730 564ca709 2004-04-19 devnull break;
731 564ca709 2004-04-19 devnull case TINT:
732 564ca709 2004-04-19 devnull switch(r.type) {
733 564ca709 2004-04-19 devnull case TINT:
734 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival == r.store.u.ival;
735 564ca709 2004-04-19 devnull break;
736 564ca709 2004-04-19 devnull case TFLOAT:
737 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival == r.store.u.fval;
738 564ca709 2004-04-19 devnull break;
739 564ca709 2004-04-19 devnull default:
740 564ca709 2004-04-19 devnull break;
741 564ca709 2004-04-19 devnull }
742 564ca709 2004-04-19 devnull break;
743 564ca709 2004-04-19 devnull case TFLOAT:
744 564ca709 2004-04-19 devnull switch(r.type) {
745 564ca709 2004-04-19 devnull case TINT:
746 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval == r.store.u.ival;
747 564ca709 2004-04-19 devnull break;
748 564ca709 2004-04-19 devnull case TFLOAT:
749 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval == r.store.u.fval;
750 564ca709 2004-04-19 devnull break;
751 564ca709 2004-04-19 devnull default:
752 564ca709 2004-04-19 devnull break;
753 564ca709 2004-04-19 devnull }
754 564ca709 2004-04-19 devnull break;
755 564ca709 2004-04-19 devnull case TSTRING:
756 564ca709 2004-04-19 devnull if(r.type == TSTRING) {
757 564ca709 2004-04-19 devnull res->store.u.ival = scmp(r.store.u.string, l.store.u.string);
758 564ca709 2004-04-19 devnull break;
759 564ca709 2004-04-19 devnull }
760 564ca709 2004-04-19 devnull break;
761 564ca709 2004-04-19 devnull case TLIST:
762 564ca709 2004-04-19 devnull if(r.type == TLIST) {
763 564ca709 2004-04-19 devnull res->store.u.ival = listcmp(l.store.u.l, r.store.u.l);
764 564ca709 2004-04-19 devnull break;
765 564ca709 2004-04-19 devnull }
766 564ca709 2004-04-19 devnull break;
767 564ca709 2004-04-19 devnull }
768 564ca709 2004-04-19 devnull if(n->op == ONEQ)
769 564ca709 2004-04-19 devnull res->store.u.ival = !res->store.u.ival;
770 564ca709 2004-04-19 devnull }
771 564ca709 2004-04-19 devnull
772 564ca709 2004-04-19 devnull
773 564ca709 2004-04-19 devnull void
774 564ca709 2004-04-19 devnull oland(Node *n, Node *res)
775 564ca709 2004-04-19 devnull {
776 564ca709 2004-04-19 devnull Node l, r;
777 564ca709 2004-04-19 devnull
778 564ca709 2004-04-19 devnull expr(n->left, &l);
779 564ca709 2004-04-19 devnull expr(n->right, &r);
780 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
781 564ca709 2004-04-19 devnull res->op = OCONST;
782 564ca709 2004-04-19 devnull res->type = TINT;
783 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
784 564ca709 2004-04-19 devnull error("bad expr type &");
785 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival&r.store.u.ival;
786 564ca709 2004-04-19 devnull }
787 564ca709 2004-04-19 devnull
788 564ca709 2004-04-19 devnull void
789 564ca709 2004-04-19 devnull oxor(Node *n, Node *res)
790 564ca709 2004-04-19 devnull {
791 564ca709 2004-04-19 devnull Node l, r;
792 564ca709 2004-04-19 devnull
793 564ca709 2004-04-19 devnull expr(n->left, &l);
794 564ca709 2004-04-19 devnull expr(n->right, &r);
795 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
796 564ca709 2004-04-19 devnull res->op = OCONST;
797 564ca709 2004-04-19 devnull res->type = TINT;
798 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
799 564ca709 2004-04-19 devnull error("bad expr type ^");
800 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival^r.store.u.ival;
801 564ca709 2004-04-19 devnull }
802 564ca709 2004-04-19 devnull
803 564ca709 2004-04-19 devnull void
804 564ca709 2004-04-19 devnull olor(Node *n, Node *res)
805 564ca709 2004-04-19 devnull {
806 564ca709 2004-04-19 devnull Node l, r;
807 564ca709 2004-04-19 devnull
808 564ca709 2004-04-19 devnull expr(n->left, &l);
809 564ca709 2004-04-19 devnull expr(n->right, &r);
810 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
811 564ca709 2004-04-19 devnull res->op = OCONST;
812 564ca709 2004-04-19 devnull res->type = TINT;
813 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
814 564ca709 2004-04-19 devnull error("bad expr type |");
815 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival|r.store.u.ival;
816 564ca709 2004-04-19 devnull }
817 564ca709 2004-04-19 devnull
818 564ca709 2004-04-19 devnull void
819 564ca709 2004-04-19 devnull ocand(Node *n, Node *res)
820 564ca709 2004-04-19 devnull {
821 564ca709 2004-04-19 devnull Node l, r;
822 564ca709 2004-04-19 devnull
823 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
824 564ca709 2004-04-19 devnull res->op = OCONST;
825 564ca709 2004-04-19 devnull res->type = TINT;
826 564ca709 2004-04-19 devnull res->store.u.ival = 0;
827 564ca709 2004-04-19 devnull expr(n->left, &l);
828 564ca709 2004-04-19 devnull if(bool(&l) == 0)
829 564ca709 2004-04-19 devnull return;
830 564ca709 2004-04-19 devnull expr(n->right, &r);
831 564ca709 2004-04-19 devnull if(bool(&r) == 0)
832 564ca709 2004-04-19 devnull return;
833 564ca709 2004-04-19 devnull res->store.u.ival = 1;
834 564ca709 2004-04-19 devnull }
835 564ca709 2004-04-19 devnull
836 564ca709 2004-04-19 devnull void
837 564ca709 2004-04-19 devnull onot(Node *n, Node *res)
838 564ca709 2004-04-19 devnull {
839 564ca709 2004-04-19 devnull Node l;
840 564ca709 2004-04-19 devnull
841 564ca709 2004-04-19 devnull res->op = OCONST;
842 564ca709 2004-04-19 devnull res->type = TINT;
843 564ca709 2004-04-19 devnull res->store.u.ival = 0;
844 564ca709 2004-04-19 devnull expr(n->left, &l);
845 564ca709 2004-04-19 devnull if(bool(&l) == 0)
846 564ca709 2004-04-19 devnull res->store.u.ival = 1;
847 564ca709 2004-04-19 devnull }
848 564ca709 2004-04-19 devnull
849 564ca709 2004-04-19 devnull void
850 564ca709 2004-04-19 devnull ocor(Node *n, Node *res)
851 564ca709 2004-04-19 devnull {
852 564ca709 2004-04-19 devnull Node l, r;
853 564ca709 2004-04-19 devnull
854 564ca709 2004-04-19 devnull res->op = OCONST;
855 564ca709 2004-04-19 devnull res->type = TINT;
856 564ca709 2004-04-19 devnull res->store.u.ival = 0;
857 564ca709 2004-04-19 devnull expr(n->left, &l);
858 564ca709 2004-04-19 devnull if(bool(&l)) {
859 564ca709 2004-04-19 devnull res->store.u.ival = 1;
860 564ca709 2004-04-19 devnull return;
861 564ca709 2004-04-19 devnull }
862 564ca709 2004-04-19 devnull expr(n->right, &r);
863 564ca709 2004-04-19 devnull if(bool(&r)) {
864 564ca709 2004-04-19 devnull res->store.u.ival = 1;
865 564ca709 2004-04-19 devnull return;
866 564ca709 2004-04-19 devnull }
867 564ca709 2004-04-19 devnull }
868 564ca709 2004-04-19 devnull
869 564ca709 2004-04-19 devnull void
870 564ca709 2004-04-19 devnull oeinc(Node *n, Node *res)
871 564ca709 2004-04-19 devnull {
872 564ca709 2004-04-19 devnull Value *v;
873 564ca709 2004-04-19 devnull
874 564ca709 2004-04-19 devnull chklval(n->left);
875 564ca709 2004-04-19 devnull v = n->left->sym->v;
876 564ca709 2004-04-19 devnull res->op = OCONST;
877 564ca709 2004-04-19 devnull res->type = v->type;
878 564ca709 2004-04-19 devnull switch(v->type) {
879 564ca709 2004-04-19 devnull case TINT:
880 564ca709 2004-04-19 devnull if(n->op == OEDEC)
881 564ca709 2004-04-19 devnull v->store.u.ival -= fmtsize(v);
882 564ca709 2004-04-19 devnull else
883 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
884 564ca709 2004-04-19 devnull break;
885 564ca709 2004-04-19 devnull case TFLOAT:
886 564ca709 2004-04-19 devnull if(n->op == OEDEC)
887 564ca709 2004-04-19 devnull v->store.u.fval--;
888 564ca709 2004-04-19 devnull else
889 564ca709 2004-04-19 devnull v->store.u.fval++;
890 564ca709 2004-04-19 devnull break;
891 564ca709 2004-04-19 devnull default:
892 564ca709 2004-04-19 devnull error("bad type for pre --/++");
893 564ca709 2004-04-19 devnull }
894 564ca709 2004-04-19 devnull res->store = v->store;
895 564ca709 2004-04-19 devnull }
896 564ca709 2004-04-19 devnull
897 564ca709 2004-04-19 devnull void
898 564ca709 2004-04-19 devnull opinc(Node *n, Node *res)
899 564ca709 2004-04-19 devnull {
900 564ca709 2004-04-19 devnull Value *v;
901 564ca709 2004-04-19 devnull
902 564ca709 2004-04-19 devnull chklval(n->left);
903 564ca709 2004-04-19 devnull v = n->left->sym->v;
904 564ca709 2004-04-19 devnull res->op = OCONST;
905 564ca709 2004-04-19 devnull res->type = v->type;
906 564ca709 2004-04-19 devnull res->store = v->store;
907 564ca709 2004-04-19 devnull switch(v->type) {
908 564ca709 2004-04-19 devnull case TINT:
909 564ca709 2004-04-19 devnull if(n->op == OPDEC)
910 564ca709 2004-04-19 devnull v->store.u.ival -= fmtsize(v);
911 564ca709 2004-04-19 devnull else
912 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
913 564ca709 2004-04-19 devnull break;
914 564ca709 2004-04-19 devnull case TFLOAT:
915 564ca709 2004-04-19 devnull if(n->op == OPDEC)
916 564ca709 2004-04-19 devnull v->store.u.fval--;
917 564ca709 2004-04-19 devnull else
918 564ca709 2004-04-19 devnull v->store.u.fval++;
919 564ca709 2004-04-19 devnull break;
920 564ca709 2004-04-19 devnull default:
921 564ca709 2004-04-19 devnull error("bad type for post --/++");
922 564ca709 2004-04-19 devnull }
923 564ca709 2004-04-19 devnull }
924 564ca709 2004-04-19 devnull
925 564ca709 2004-04-19 devnull void
926 564ca709 2004-04-19 devnull ocall(Node *n, Node *res)
927 564ca709 2004-04-19 devnull {
928 564ca709 2004-04-19 devnull Lsym *s;
929 564ca709 2004-04-19 devnull Rplace *rsav;
930 564ca709 2004-04-19 devnull
931 564ca709 2004-04-19 devnull res->op = OCONST; /* Default return value */
932 564ca709 2004-04-19 devnull res->type = TLIST;
933 564ca709 2004-04-19 devnull res->store.u.l = 0;
934 564ca709 2004-04-19 devnull
935 564ca709 2004-04-19 devnull chklval(n->left);
936 564ca709 2004-04-19 devnull s = n->left->sym;
937 564ca709 2004-04-19 devnull
938 564ca709 2004-04-19 devnull if(n->builtin && !s->builtin){
939 564ca709 2004-04-19 devnull error("no builtin %s", s->name);
940 564ca709 2004-04-19 devnull return;
941 564ca709 2004-04-19 devnull }
942 564ca709 2004-04-19 devnull if(s->builtin && (n->builtin || s->proc == 0)) {
943 564ca709 2004-04-19 devnull (*s->builtin)(res, n->right);
944 564ca709 2004-04-19 devnull return;
945 564ca709 2004-04-19 devnull }
946 564ca709 2004-04-19 devnull if(s->proc == 0)
947 564ca709 2004-04-19 devnull error("no function %s", s->name);
948 564ca709 2004-04-19 devnull
949 564ca709 2004-04-19 devnull rsav = ret;
950 564ca709 2004-04-19 devnull call(s->name, n->right, s->proc->left, s->proc->right, res);
951 564ca709 2004-04-19 devnull ret = rsav;
952 564ca709 2004-04-19 devnull }
953 564ca709 2004-04-19 devnull
954 564ca709 2004-04-19 devnull void
955 564ca709 2004-04-19 devnull ofmt(Node *n, Node *res)
956 564ca709 2004-04-19 devnull {
957 564ca709 2004-04-19 devnull expr(n->left, res);
958 564ca709 2004-04-19 devnull res->store.fmt = n->right->store.u.ival;
959 564ca709 2004-04-19 devnull }
960 564ca709 2004-04-19 devnull
961 564ca709 2004-04-19 devnull void
962 564ca709 2004-04-19 devnull owhat(Node *n, Node *res)
963 564ca709 2004-04-19 devnull {
964 564ca709 2004-04-19 devnull res->op = OCONST; /* Default return value */
965 564ca709 2004-04-19 devnull res->type = TLIST;
966 564ca709 2004-04-19 devnull res->store.u.l = 0;
967 564ca709 2004-04-19 devnull whatis(n->sym);
968 564ca709 2004-04-19 devnull }
969 564ca709 2004-04-19 devnull
970 e637c944 2004-04-20 devnull void (*expop[NUMO])(Node*, Node*);
971 e637c944 2004-04-20 devnull
972 e637c944 2004-04-20 devnull static void
973 e637c944 2004-04-20 devnull initexpop(void)
974 564ca709 2004-04-19 devnull {
975 e637c944 2004-04-20 devnull expop[ONAME] = oname;
976 e637c944 2004-04-20 devnull expop[OCONST] = oconst;
977 e637c944 2004-04-20 devnull expop[OMUL] = omul;
978 e637c944 2004-04-20 devnull expop[ODIV] = odiv;
979 e637c944 2004-04-20 devnull expop[OMOD] = omod;
980 e637c944 2004-04-20 devnull expop[OADD] = oadd;
981 e637c944 2004-04-20 devnull expop[OSUB] = osub;
982 e637c944 2004-04-20 devnull expop[ORSH] = orsh;
983 e637c944 2004-04-20 devnull expop[OLSH] = olsh;
984 e637c944 2004-04-20 devnull expop[OLT] = olt;
985 e637c944 2004-04-20 devnull expop[OGT] = ogt;
986 e637c944 2004-04-20 devnull expop[OLEQ] = oleq;
987 e637c944 2004-04-20 devnull expop[OGEQ] = ogeq;
988 e637c944 2004-04-20 devnull expop[OEQ] = oeq;
989 e637c944 2004-04-20 devnull expop[ONEQ] = oeq;
990 e637c944 2004-04-20 devnull expop[OLAND] = oland;
991 e637c944 2004-04-20 devnull expop[OXOR] = oxor;
992 e637c944 2004-04-20 devnull expop[OLOR] = olor;
993 e637c944 2004-04-20 devnull expop[OCAND] = ocand;
994 e637c944 2004-04-20 devnull expop[OCOR] = ocor;
995 e637c944 2004-04-20 devnull expop[OASGN] = oasgn;
996 e637c944 2004-04-20 devnull expop[OINDM] = oindm;
997 e637c944 2004-04-20 devnull expop[OEDEC] = oeinc;
998 e637c944 2004-04-20 devnull expop[OEINC] = oeinc;
999 e637c944 2004-04-20 devnull expop[OPINC] = opinc;
1000 e637c944 2004-04-20 devnull expop[OPDEC] = opinc;
1001 e637c944 2004-04-20 devnull expop[ONOT] = onot;
1002 e637c944 2004-04-20 devnull expop[OIF] = 0;
1003 e637c944 2004-04-20 devnull expop[ODO] = 0;
1004 e637c944 2004-04-20 devnull expop[OLIST] = olist;
1005 e637c944 2004-04-20 devnull expop[OCALL] = ocall;
1006 e637c944 2004-04-20 devnull expop[OCTRUCT] = octruct;
1007 e637c944 2004-04-20 devnull expop[OWHILE] =0;
1008 e637c944 2004-04-20 devnull expop[OELSE] = 0;
1009 e637c944 2004-04-20 devnull expop[OHEAD] = ohead;
1010 e637c944 2004-04-20 devnull expop[OTAIL] = otail;
1011 e637c944 2004-04-20 devnull expop[OAPPEND] = oappend;
1012 e637c944 2004-04-20 devnull expop[ORET] = 0;
1013 e637c944 2004-04-20 devnull expop[OINDEX] =oindex;
1014 e637c944 2004-04-20 devnull expop[OINDC] = oindc;
1015 e637c944 2004-04-20 devnull expop[ODOT] = odot;
1016 e637c944 2004-04-20 devnull expop[OLOCAL] =0;
1017 e637c944 2004-04-20 devnull expop[OFRAME] = oframe;
1018 e637c944 2004-04-20 devnull expop[OCOMPLEX] =0;
1019 e637c944 2004-04-20 devnull expop[ODELETE] = odelete;
1020 e637c944 2004-04-20 devnull expop[OCAST] = ocast;
1021 e637c944 2004-04-20 devnull expop[OFMT] = ofmt;
1022 e637c944 2004-04-20 devnull expop[OEVAL] = oeval;
1023 e637c944 2004-04-20 devnull expop[OWHAT] = owhat;
1024 a0f1e21f 2004-04-20 devnull }
1025 e637c944 2004-04-20 devnull
1026 e637c944 2004-04-20 devnull void
1027 e637c944 2004-04-20 devnull initexpr(void)
1028 e637c944 2004-04-20 devnull {
1029 e637c944 2004-04-20 devnull initfsize();
1030 e637c944 2004-04-20 devnull initexpop();
1031 e637c944 2004-04-20 devnull }
1032 e637c944 2004-04-20 devnull