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"
9 e637c944 2004-04-20 devnull static int fsize[256];
11 e637c944 2004-04-20 devnull static void
12 e637c944 2004-04-20 devnull initfsize(void)
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;
45 564ca709 2004-04-19 devnull fmtsize(Value *v)
49 564ca709 2004-04-19 devnull switch(v->store.fmt) {
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");
62 564ca709 2004-04-19 devnull return ret;
67 564ca709 2004-04-19 devnull chklval(Node *lp)
69 564ca709 2004-04-19 devnull if(lp->op != ONAME)
70 564ca709 2004-04-19 devnull error("need l-value");
74 564ca709 2004-04-19 devnull olist(Node *n, Node *res)
76 564ca709 2004-04-19 devnull expr(n->left, res);
77 564ca709 2004-04-19 devnull expr(n->right, res);
81 564ca709 2004-04-19 devnull oeval(Node *n, Node *res)
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);
90 564ca709 2004-04-19 devnull ocast(Node *n, Node *res)
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);
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';
101 564ca709 2004-04-19 devnull oindm(Node *n, Node *res)
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;
119 564ca709 2004-04-19 devnull oindc(Node *n, Node *res)
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;
137 564ca709 2004-04-19 devnull oframe(Node *n, Node *res)
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;
144 564ca709 2004-04-19 devnull p = n->sym->name;
145 564ca709 2004-04-19 devnull while(*p && *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");
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;
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';
167 564ca709 2004-04-19 devnull oindex(Node *n, Node *res)
169 564ca709 2004-04-19 devnull Node l, r;
171 564ca709 2004-04-19 devnull expr(n->left, &l);
172 564ca709 2004-04-19 devnull expr(n->right, &r);
174 564ca709 2004-04-19 devnull if(r.type != TINT)
175 564ca709 2004-04-19 devnull error("bad type for []");
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;
185 564ca709 2004-04-19 devnull case TLIST:
186 564ca709 2004-04-19 devnull nthelem(l.store.u.l, r.store.u.ival, res);
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];
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';
203 564ca709 2004-04-19 devnull oappend(Node *n, Node *res)
205 564ca709 2004-04-19 devnull Node r, l;
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);
215 564ca709 2004-04-19 devnull odelete(Node *n, Node *res)
217 564ca709 2004-04-19 devnull Node l, r;
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");
226 564ca709 2004-04-19 devnull delete(l.store.u.l, r.store.u.ival, res);
230 564ca709 2004-04-19 devnull ohead(Node *n, Node *res)
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;
243 564ca709 2004-04-19 devnull res->type = TLIST;
244 564ca709 2004-04-19 devnull res->store.u.l = 0;
249 564ca709 2004-04-19 devnull otail(Node *n, Node *res)
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;
261 564ca709 2004-04-19 devnull res->store.u.l = 0;
265 564ca709 2004-04-19 devnull oconst(Node *n, Node *res)
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;
274 564ca709 2004-04-19 devnull oname(Node *n, Node *res)
276 564ca709 2004-04-19 devnull Value *v;
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;
288 564ca709 2004-04-19 devnull octruct(Node *n, Node *res)
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);
296 564ca709 2004-04-19 devnull oasgn(Node *n, Node *res)
298 564ca709 2004-04-19 devnull Node *lp, r;
299 564ca709 2004-04-19 devnull Value *v;
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);
306 564ca709 2004-04-19 devnull case OINDC:
307 564ca709 2004-04-19 devnull windir(symmap, lp->left, n->right, res);
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;
324 564ca709 2004-04-19 devnull oadd(Node *n, Node *res)
326 564ca709 2004-04-19 devnull Node l, r;
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;
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;
345 564ca709 2004-04-19 devnull default:
346 564ca709 2004-04-19 devnull error("bad rhs type +");
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;
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;
357 564ca709 2004-04-19 devnull default:
358 564ca709 2004-04-19 devnull error("bad rhs type +");
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);
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);
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));
385 564ca709 2004-04-19 devnull osub(Node *n, Node *res)
387 564ca709 2004-04-19 devnull Node l, r;
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;
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;
406 564ca709 2004-04-19 devnull default:
407 564ca709 2004-04-19 devnull error("bad rhs type -");
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;
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;
418 564ca709 2004-04-19 devnull default:
419 564ca709 2004-04-19 devnull error("bad rhs type -");
426 564ca709 2004-04-19 devnull omul(Node *n, Node *res)
428 564ca709 2004-04-19 devnull Node l, r;
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;
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;
447 564ca709 2004-04-19 devnull default:
448 564ca709 2004-04-19 devnull error("bad rhs type *");
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;
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;
459 564ca709 2004-04-19 devnull default:
460 564ca709 2004-04-19 devnull error("bad rhs type *");
467 564ca709 2004-04-19 devnull odiv(Node *n, Node *res)
469 564ca709 2004-04-19 devnull Node l, r;
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;
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;
492 564ca709 2004-04-19 devnull default:
493 564ca709 2004-04-19 devnull error("bad rhs type /");
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;
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;
504 564ca709 2004-04-19 devnull default:
505 564ca709 2004-04-19 devnull error("bad rhs type /");
512 564ca709 2004-04-19 devnull omod(Node *n, Node *res)
514 564ca709 2004-04-19 devnull Node l, r;
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;
527 564ca709 2004-04-19 devnull olsh(Node *n, Node *res)
529 564ca709 2004-04-19 devnull Node l, r;
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;
542 564ca709 2004-04-19 devnull orsh(Node *n, Node *res)
544 564ca709 2004-04-19 devnull Node l, r;
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;
557 564ca709 2004-04-19 devnull olt(Node *n, Node *res)
559 564ca709 2004-04-19 devnull Node l, r;
561 564ca709 2004-04-19 devnull expr(n->left, &l);
562 564ca709 2004-04-19 devnull expr(n->right, &r);
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;
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;
578 564ca709 2004-04-19 devnull default:
579 564ca709 2004-04-19 devnull error("bad rhs type <");
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;
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;
590 564ca709 2004-04-19 devnull default:
591 564ca709 2004-04-19 devnull error("bad rhs type <");
598 564ca709 2004-04-19 devnull ogt(Node *n, Node *res)
600 564ca709 2004-04-19 devnull Node l, r;
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;
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;
618 564ca709 2004-04-19 devnull default:
619 564ca709 2004-04-19 devnull error("bad rhs type >");
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;
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;
630 564ca709 2004-04-19 devnull default:
631 564ca709 2004-04-19 devnull error("bad rhs type >");
638 564ca709 2004-04-19 devnull oleq(Node *n, Node *res)
640 564ca709 2004-04-19 devnull Node l, r;
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;
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;
658 564ca709 2004-04-19 devnull default:
659 564ca709 2004-04-19 devnull error("bad expr type <=");
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;
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;
670 564ca709 2004-04-19 devnull default:
671 564ca709 2004-04-19 devnull error("bad expr type <=");
678 564ca709 2004-04-19 devnull ogeq(Node *n, Node *res)
680 564ca709 2004-04-19 devnull Node l, r;
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;
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;
698 564ca709 2004-04-19 devnull default:
699 564ca709 2004-04-19 devnull error("bad rhs type >=");
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;
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;
710 564ca709 2004-04-19 devnull default:
711 564ca709 2004-04-19 devnull error("bad rhs type >=");
718 564ca709 2004-04-19 devnull oeq(Node *n, Node *res)
720 564ca709 2004-04-19 devnull Node l, r;
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:
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;
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;
739 564ca709 2004-04-19 devnull default:
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;
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;
751 564ca709 2004-04-19 devnull default:
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);
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);
768 564ca709 2004-04-19 devnull if(n->op == ONEQ)
769 564ca709 2004-04-19 devnull res->store.u.ival = !res->store.u.ival;
774 564ca709 2004-04-19 devnull oland(Node *n, Node *res)
776 564ca709 2004-04-19 devnull Node l, r;
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;
789 564ca709 2004-04-19 devnull oxor(Node *n, Node *res)
791 564ca709 2004-04-19 devnull Node l, r;
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;
804 564ca709 2004-04-19 devnull olor(Node *n, Node *res)
806 564ca709 2004-04-19 devnull Node l, r;
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;
819 564ca709 2004-04-19 devnull ocand(Node *n, Node *res)
821 564ca709 2004-04-19 devnull Node l, r;
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)
830 564ca709 2004-04-19 devnull expr(n->right, &r);
831 564ca709 2004-04-19 devnull if(bool(&r) == 0)
833 564ca709 2004-04-19 devnull res->store.u.ival = 1;
837 564ca709 2004-04-19 devnull onot(Node *n, Node *res)
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;
850 564ca709 2004-04-19 devnull ocor(Node *n, Node *res)
852 564ca709 2004-04-19 devnull Node l, r;
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;
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;
870 564ca709 2004-04-19 devnull oeinc(Node *n, Node *res)
872 564ca709 2004-04-19 devnull Value *v;
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);
883 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
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--;
889 564ca709 2004-04-19 devnull v->store.u.fval++;
891 564ca709 2004-04-19 devnull default:
892 564ca709 2004-04-19 devnull error("bad type for pre --/++");
894 564ca709 2004-04-19 devnull res->store = v->store;
898 564ca709 2004-04-19 devnull opinc(Node *n, Node *res)
900 564ca709 2004-04-19 devnull Value *v;
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);
912 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
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--;
918 564ca709 2004-04-19 devnull v->store.u.fval++;
920 564ca709 2004-04-19 devnull default:
921 564ca709 2004-04-19 devnull error("bad type for post --/++");
926 564ca709 2004-04-19 devnull ocall(Node *n, Node *res)
928 564ca709 2004-04-19 devnull Lsym *s;
929 564ca709 2004-04-19 devnull Rplace *rsav;
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;
935 564ca709 2004-04-19 devnull chklval(n->left);
936 564ca709 2004-04-19 devnull s = n->left->sym;
938 564ca709 2004-04-19 devnull if(n->builtin && !s->builtin){
939 564ca709 2004-04-19 devnull error("no builtin %s", s->name);
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);
946 564ca709 2004-04-19 devnull if(s->proc == 0)
947 564ca709 2004-04-19 devnull error("no function %s", s->name);
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;
955 564ca709 2004-04-19 devnull ofmt(Node *n, Node *res)
957 564ca709 2004-04-19 devnull expr(n->left, res);
958 564ca709 2004-04-19 devnull res->store.fmt = n->right->store.u.ival;
962 564ca709 2004-04-19 devnull owhat(Node *n, Node *res)
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);
970 e637c944 2004-04-20 devnull void (*expop[NUMO])(Node*, Node*);
972 e637c944 2004-04-20 devnull static void
973 e637c944 2004-04-20 devnull initexpop(void)
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;
1027 e637c944 2004-04-20 devnull initexpr(void)
1029 e637c944 2004-04-20 devnull initfsize();
1030 e637c944 2004-04-20 devnull initexpop();