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 4f2ac1b7 2005-01-23 devnull Node res;
72 4f2ac1b7 2005-01-23 devnull if(lp->op == ONAME)
73 4f2ac1b7 2005-01-23 devnull return lp->sym;
75 4f2ac1b7 2005-01-23 devnull if(lp->op == OCALL){
76 4f2ac1b7 2005-01-23 devnull s = chklval(lp->left);
77 4f2ac1b7 2005-01-23 devnull if(strcmp(s->name, "var") == 0
78 4f2ac1b7 2005-01-23 devnull && (lp->builtin || s->proc == 0)){
79 4f2ac1b7 2005-01-23 devnull if(lp->right == 0)
80 4f2ac1b7 2005-01-23 devnull error("var(string): arg count");
81 4f2ac1b7 2005-01-23 devnull expr(lp->right, &res);
82 4f2ac1b7 2005-01-23 devnull if(res.type != TSTRING)
83 4f2ac1b7 2005-01-23 devnull error("var(string): arg type");
84 4f2ac1b7 2005-01-23 devnull return mkvar(res.store.u.string->string);
87 4f2ac1b7 2005-01-23 devnull error("need l-value");
88 4f2ac1b7 2005-01-23 devnull return nil;
92 564ca709 2004-04-19 devnull olist(Node *n, Node *res)
94 564ca709 2004-04-19 devnull expr(n->left, res);
95 564ca709 2004-04-19 devnull expr(n->right, res);
99 564ca709 2004-04-19 devnull oeval(Node *n, Node *res)
101 564ca709 2004-04-19 devnull expr(n->left, res);
102 564ca709 2004-04-19 devnull if(res->type != TCODE)
103 564ca709 2004-04-19 devnull error("bad type for eval");
104 564ca709 2004-04-19 devnull expr(res->store.u.cc, res);
108 564ca709 2004-04-19 devnull ocast(Node *n, Node *res)
110 564ca709 2004-04-19 devnull if(n->sym->lt == 0)
111 564ca709 2004-04-19 devnull error("%s is not a complex type", n->sym->name);
113 564ca709 2004-04-19 devnull expr(n->left, res);
114 564ca709 2004-04-19 devnull res->store.comt = n->sym->lt;
115 564ca709 2004-04-19 devnull res->store.fmt = 'a';
119 564ca709 2004-04-19 devnull oindm(Node *n, Node *res)
124 564ca709 2004-04-19 devnull m = cormap;
125 564ca709 2004-04-19 devnull if(m == 0)
126 564ca709 2004-04-19 devnull m = symmap;
127 564ca709 2004-04-19 devnull expr(n->left, &l);
128 4f2ac1b7 2005-01-23 devnull switch(l.type){
129 4f2ac1b7 2005-01-23 devnull default:
130 564ca709 2004-04-19 devnull error("bad type for *");
131 4f2ac1b7 2005-01-23 devnull case TINT:
132 4f2ac1b7 2005-01-23 devnull if(m == 0)
133 4f2ac1b7 2005-01-23 devnull error("no map for *");
134 4f2ac1b7 2005-01-23 devnull indir(m, l.store.u.ival, l.store.fmt, res);
135 4f2ac1b7 2005-01-23 devnull res->store.comt = l.store.comt;
137 4f2ac1b7 2005-01-23 devnull case TREG:
138 7b8a3f12 2005-02-11 devnull indirreg(correg, l.store.u.reg.name, l.store.fmt, res);
139 4f2ac1b7 2005-01-23 devnull res->store.comt = l.store.comt;
141 4f2ac1b7 2005-01-23 devnull case TCON:
142 4f2ac1b7 2005-01-23 devnull *res = *l.store.u.con;
143 4f2ac1b7 2005-01-23 devnull res->store.comt = l.store.comt;
149 564ca709 2004-04-19 devnull oindc(Node *n, Node *res)
154 564ca709 2004-04-19 devnull m = symmap;
155 564ca709 2004-04-19 devnull if(m == 0)
156 564ca709 2004-04-19 devnull m = cormap;
157 564ca709 2004-04-19 devnull expr(n->left, &l);
158 564ca709 2004-04-19 devnull if(l.type != TINT)
159 564ca709 2004-04-19 devnull error("bad type for @");
160 564ca709 2004-04-19 devnull if(m == 0)
161 564ca709 2004-04-19 devnull error("no map for @");
162 564ca709 2004-04-19 devnull indir(m, l.store.u.ival, l.store.fmt, res);
163 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
167 564ca709 2004-04-19 devnull oframe(Node *n, Node *res)
169 564ca709 2004-04-19 devnull char *p;
170 564ca709 2004-04-19 devnull Node *lp;
171 564ca709 2004-04-19 devnull ulong ival;
172 564ca709 2004-04-19 devnull Frtype *f;
174 564ca709 2004-04-19 devnull p = n->sym->name;
175 564ca709 2004-04-19 devnull while(*p && *p == '$')
177 564ca709 2004-04-19 devnull lp = n->left;
178 4f2ac1b7 2005-01-23 devnull if(localaddr(cormap, acidregs, p, lp->sym->name, &ival) < 0)
179 564ca709 2004-04-19 devnull error("colon: %r");
181 564ca709 2004-04-19 devnull res->store.u.ival = ival;
182 564ca709 2004-04-19 devnull res->op = OCONST;
183 564ca709 2004-04-19 devnull res->store.fmt = 'X';
184 564ca709 2004-04-19 devnull res->type = TINT;
186 564ca709 2004-04-19 devnull /* Try and set comt */
187 564ca709 2004-04-19 devnull for(f = n->sym->local; f; f = f->next) {
188 564ca709 2004-04-19 devnull if(f->var == lp->sym) {
189 564ca709 2004-04-19 devnull res->store.comt = f->type;
190 564ca709 2004-04-19 devnull res->store.fmt = 'a';
197 564ca709 2004-04-19 devnull oindex(Node *n, Node *res)
199 564ca709 2004-04-19 devnull Node l, r;
201 564ca709 2004-04-19 devnull expr(n->left, &l);
202 564ca709 2004-04-19 devnull expr(n->right, &r);
204 564ca709 2004-04-19 devnull if(r.type != TINT)
205 564ca709 2004-04-19 devnull error("bad type for []");
207 564ca709 2004-04-19 devnull switch(l.type) {
208 564ca709 2004-04-19 devnull default:
209 564ca709 2004-04-19 devnull error("lhs[] has bad type");
210 564ca709 2004-04-19 devnull case TINT:
211 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);
212 564ca709 2004-04-19 devnull res->store.comt = l.store.comt;
213 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
215 564ca709 2004-04-19 devnull case TLIST:
216 564ca709 2004-04-19 devnull nthelem(l.store.u.l, r.store.u.ival, res);
218 564ca709 2004-04-19 devnull case TSTRING:
219 564ca709 2004-04-19 devnull res->store.u.ival = 0;
220 564ca709 2004-04-19 devnull if(r.store.u.ival >= 0 && r.store.u.ival < l.store.u.string->len) {
221 564ca709 2004-04-19 devnull int xx8; /* to get around bug in vc */
222 564ca709 2004-04-19 devnull xx8 = r.store.u.ival;
223 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.string->string[xx8];
225 564ca709 2004-04-19 devnull res->op = OCONST;
226 564ca709 2004-04-19 devnull res->type = TINT;
227 564ca709 2004-04-19 devnull res->store.fmt = 'c';
233 564ca709 2004-04-19 devnull oappend(Node *n, Node *res)
235 564ca709 2004-04-19 devnull Node r, l;
237 564ca709 2004-04-19 devnull expr(n->left, &l);
238 564ca709 2004-04-19 devnull expr(n->right, &r);
239 564ca709 2004-04-19 devnull if(l.type != TLIST)
240 564ca709 2004-04-19 devnull error("must append to list");
241 564ca709 2004-04-19 devnull append(res, &l, &r);
245 564ca709 2004-04-19 devnull odelete(Node *n, Node *res)
247 564ca709 2004-04-19 devnull Node l, r;
249 564ca709 2004-04-19 devnull expr(n->left, &l);
250 564ca709 2004-04-19 devnull expr(n->right, &r);
251 564ca709 2004-04-19 devnull if(l.type != TLIST)
252 564ca709 2004-04-19 devnull error("must delete from list");
253 564ca709 2004-04-19 devnull if(r.type != TINT)
254 564ca709 2004-04-19 devnull error("delete index must be integer");
256 564ca709 2004-04-19 devnull delete(l.store.u.l, r.store.u.ival, res);
260 564ca709 2004-04-19 devnull ohead(Node *n, Node *res)
264 564ca709 2004-04-19 devnull expr(n->left, &l);
265 564ca709 2004-04-19 devnull if(l.type != TLIST)
266 564ca709 2004-04-19 devnull error("head needs list");
267 564ca709 2004-04-19 devnull res->op = OCONST;
268 564ca709 2004-04-19 devnull if(l.store.u.l) {
269 564ca709 2004-04-19 devnull res->type = l.store.u.l->type;
270 564ca709 2004-04-19 devnull res->store = l.store.u.l->store;
273 564ca709 2004-04-19 devnull res->type = TLIST;
274 564ca709 2004-04-19 devnull res->store.u.l = 0;
279 564ca709 2004-04-19 devnull otail(Node *n, Node *res)
283 564ca709 2004-04-19 devnull expr(n->left, &l);
284 564ca709 2004-04-19 devnull if(l.type != TLIST)
285 564ca709 2004-04-19 devnull error("tail needs list");
286 564ca709 2004-04-19 devnull res->op = OCONST;
287 564ca709 2004-04-19 devnull res->type = TLIST;
288 564ca709 2004-04-19 devnull if(l.store.u.l)
289 564ca709 2004-04-19 devnull res->store.u.l = l.store.u.l->next;
291 564ca709 2004-04-19 devnull res->store.u.l = 0;
295 564ca709 2004-04-19 devnull oconst(Node *n, Node *res)
297 564ca709 2004-04-19 devnull res->op = OCONST;
298 564ca709 2004-04-19 devnull res->type = n->type;
299 564ca709 2004-04-19 devnull res->store = n->store;
300 564ca709 2004-04-19 devnull res->store.comt = n->store.comt;
304 564ca709 2004-04-19 devnull oname(Node *n, Node *res)
306 564ca709 2004-04-19 devnull Value *v;
308 564ca709 2004-04-19 devnull v = n->sym->v;
309 564ca709 2004-04-19 devnull if(v->set == 0)
310 564ca709 2004-04-19 devnull error("%s used but not set", n->sym->name);
311 564ca709 2004-04-19 devnull res->op = OCONST;
312 564ca709 2004-04-19 devnull res->type = v->type;
313 564ca709 2004-04-19 devnull res->store = v->store;
314 564ca709 2004-04-19 devnull res->store.comt = v->store.comt;
318 564ca709 2004-04-19 devnull octruct(Node *n, Node *res)
320 564ca709 2004-04-19 devnull res->op = OCONST;
321 564ca709 2004-04-19 devnull res->type = TLIST;
322 564ca709 2004-04-19 devnull res->store.u.l = construct(n->left);
326 564ca709 2004-04-19 devnull oasgn(Node *n, Node *res)
328 564ca709 2004-04-19 devnull Node *lp, r;
329 4f2ac1b7 2005-01-23 devnull Node aes;
330 564ca709 2004-04-19 devnull Value *v;
332 564ca709 2004-04-19 devnull lp = n->left;
333 564ca709 2004-04-19 devnull switch(lp->op) {
334 564ca709 2004-04-19 devnull case OINDM:
335 4f2ac1b7 2005-01-23 devnull expr(lp->left, &aes);
336 4f2ac1b7 2005-01-23 devnull if(aes.type == TREG)
337 7b8a3f12 2005-02-11 devnull windirreg(correg, aes.store.u.reg.name, n->right, res);
339 4f2ac1b7 2005-01-23 devnull windir(cormap, aes, n->right, res);
341 564ca709 2004-04-19 devnull case OINDC:
342 4f2ac1b7 2005-01-23 devnull expr(lp->left, &aes);
343 4f2ac1b7 2005-01-23 devnull windir(symmap, aes, n->right, res);
345 564ca709 2004-04-19 devnull default:
346 4f2ac1b7 2005-01-23 devnull v = chklval(lp)->v;
347 564ca709 2004-04-19 devnull expr(n->right, &r);
348 564ca709 2004-04-19 devnull v->set = 1;
349 564ca709 2004-04-19 devnull v->type = r.type;
350 564ca709 2004-04-19 devnull v->store = r.store;
351 564ca709 2004-04-19 devnull res->op = OCONST;
352 564ca709 2004-04-19 devnull res->type = v->type;
353 564ca709 2004-04-19 devnull res->store = v->store;
354 564ca709 2004-04-19 devnull res->store.comt = v->store.comt;
359 564ca709 2004-04-19 devnull oadd(Node *n, Node *res)
361 564ca709 2004-04-19 devnull Node l, r;
363 564ca709 2004-04-19 devnull expr(n->left, &l);
364 564ca709 2004-04-19 devnull expr(n->right, &r);
365 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
366 564ca709 2004-04-19 devnull res->op = OCONST;
367 564ca709 2004-04-19 devnull res->type = TFLOAT;
368 564ca709 2004-04-19 devnull switch(l.type) {
369 564ca709 2004-04-19 devnull default:
370 564ca709 2004-04-19 devnull error("bad lhs type +");
371 564ca709 2004-04-19 devnull case TINT:
372 564ca709 2004-04-19 devnull switch(r.type) {
373 564ca709 2004-04-19 devnull case TINT:
374 564ca709 2004-04-19 devnull res->type = TINT;
375 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival+r.store.u.ival;
377 564ca709 2004-04-19 devnull case TFLOAT:
378 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival+r.store.u.fval;
380 564ca709 2004-04-19 devnull default:
381 564ca709 2004-04-19 devnull error("bad rhs type +");
384 564ca709 2004-04-19 devnull case TFLOAT:
385 564ca709 2004-04-19 devnull switch(r.type) {
386 564ca709 2004-04-19 devnull case TINT:
387 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval+r.store.u.ival;
389 564ca709 2004-04-19 devnull case TFLOAT:
390 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval+r.store.u.fval;
392 564ca709 2004-04-19 devnull default:
393 564ca709 2004-04-19 devnull error("bad rhs type +");
396 564ca709 2004-04-19 devnull case TSTRING:
397 564ca709 2004-04-19 devnull if(r.type == TSTRING) {
398 564ca709 2004-04-19 devnull res->type = TSTRING;
399 564ca709 2004-04-19 devnull res->store.fmt = 's';
400 564ca709 2004-04-19 devnull res->store.u.string = stradd(l.store.u.string, r.store.u.string);
403 564ca709 2004-04-19 devnull error("bad rhs for +");
404 564ca709 2004-04-19 devnull case TLIST:
405 564ca709 2004-04-19 devnull res->type = TLIST;
406 564ca709 2004-04-19 devnull switch(r.type) {
407 564ca709 2004-04-19 devnull case TLIST:
408 564ca709 2004-04-19 devnull res->store.u.l = addlist(l.store.u.l, r.store.u.l);
410 564ca709 2004-04-19 devnull default:
411 564ca709 2004-04-19 devnull r.left = 0;
412 564ca709 2004-04-19 devnull r.right = 0;
413 564ca709 2004-04-19 devnull res->store.u.l = addlist(l.store.u.l, construct(&r));
420 564ca709 2004-04-19 devnull osub(Node *n, Node *res)
422 564ca709 2004-04-19 devnull Node l, r;
424 564ca709 2004-04-19 devnull expr(n->left, &l);
425 564ca709 2004-04-19 devnull expr(n->right, &r);
426 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
427 564ca709 2004-04-19 devnull res->op = OCONST;
428 564ca709 2004-04-19 devnull res->type = TFLOAT;
429 564ca709 2004-04-19 devnull switch(l.type) {
430 564ca709 2004-04-19 devnull default:
431 564ca709 2004-04-19 devnull error("bad lhs type -");
432 564ca709 2004-04-19 devnull case TINT:
433 564ca709 2004-04-19 devnull switch(r.type) {
434 564ca709 2004-04-19 devnull case TINT:
435 564ca709 2004-04-19 devnull res->type = TINT;
436 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival-r.store.u.ival;
438 564ca709 2004-04-19 devnull case TFLOAT:
439 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival-r.store.u.fval;
441 564ca709 2004-04-19 devnull default:
442 564ca709 2004-04-19 devnull error("bad rhs type -");
445 564ca709 2004-04-19 devnull case TFLOAT:
446 564ca709 2004-04-19 devnull switch(r.type) {
447 564ca709 2004-04-19 devnull case TINT:
448 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval-r.store.u.ival;
450 564ca709 2004-04-19 devnull case TFLOAT:
451 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval-r.store.u.fval;
453 564ca709 2004-04-19 devnull default:
454 564ca709 2004-04-19 devnull error("bad rhs type -");
461 564ca709 2004-04-19 devnull omul(Node *n, Node *res)
463 564ca709 2004-04-19 devnull Node l, r;
465 564ca709 2004-04-19 devnull expr(n->left, &l);
466 564ca709 2004-04-19 devnull expr(n->right, &r);
467 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
468 564ca709 2004-04-19 devnull res->op = OCONST;
469 564ca709 2004-04-19 devnull res->type = TFLOAT;
470 564ca709 2004-04-19 devnull switch(l.type) {
471 564ca709 2004-04-19 devnull default:
472 564ca709 2004-04-19 devnull error("bad lhs type *");
473 564ca709 2004-04-19 devnull case TINT:
474 564ca709 2004-04-19 devnull switch(r.type) {
475 564ca709 2004-04-19 devnull case TINT:
476 564ca709 2004-04-19 devnull res->type = TINT;
477 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival*r.store.u.ival;
479 564ca709 2004-04-19 devnull case TFLOAT:
480 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival*r.store.u.fval;
482 564ca709 2004-04-19 devnull default:
483 564ca709 2004-04-19 devnull error("bad rhs type *");
486 564ca709 2004-04-19 devnull case TFLOAT:
487 564ca709 2004-04-19 devnull switch(r.type) {
488 564ca709 2004-04-19 devnull case TINT:
489 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval*r.store.u.ival;
491 564ca709 2004-04-19 devnull case TFLOAT:
492 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval*r.store.u.fval;
494 564ca709 2004-04-19 devnull default:
495 564ca709 2004-04-19 devnull error("bad rhs type *");
502 564ca709 2004-04-19 devnull odiv(Node *n, Node *res)
504 564ca709 2004-04-19 devnull Node l, r;
506 564ca709 2004-04-19 devnull expr(n->left, &l);
507 564ca709 2004-04-19 devnull expr(n->right, &r);
508 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
509 564ca709 2004-04-19 devnull res->op = OCONST;
510 564ca709 2004-04-19 devnull res->type = TFLOAT;
511 564ca709 2004-04-19 devnull switch(l.type) {
512 564ca709 2004-04-19 devnull default:
513 564ca709 2004-04-19 devnull error("bad lhs type /");
514 564ca709 2004-04-19 devnull case TINT:
515 564ca709 2004-04-19 devnull switch(r.type) {
516 564ca709 2004-04-19 devnull case TINT:
517 564ca709 2004-04-19 devnull res->type = TINT;
518 564ca709 2004-04-19 devnull if(r.store.u.ival == 0)
519 564ca709 2004-04-19 devnull error("zero divide");
520 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival/r.store.u.ival;
522 564ca709 2004-04-19 devnull case TFLOAT:
523 564ca709 2004-04-19 devnull if(r.store.u.fval == 0)
524 564ca709 2004-04-19 devnull error("zero divide");
525 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.ival/r.store.u.fval;
527 564ca709 2004-04-19 devnull default:
528 564ca709 2004-04-19 devnull error("bad rhs type /");
531 564ca709 2004-04-19 devnull case TFLOAT:
532 564ca709 2004-04-19 devnull switch(r.type) {
533 564ca709 2004-04-19 devnull case TINT:
534 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval/r.store.u.ival;
536 564ca709 2004-04-19 devnull case TFLOAT:
537 564ca709 2004-04-19 devnull res->store.u.fval = l.store.u.fval/r.store.u.fval;
539 564ca709 2004-04-19 devnull default:
540 564ca709 2004-04-19 devnull error("bad rhs type /");
547 564ca709 2004-04-19 devnull omod(Node *n, Node *res)
549 564ca709 2004-04-19 devnull Node l, r;
551 564ca709 2004-04-19 devnull expr(n->left, &l);
552 564ca709 2004-04-19 devnull expr(n->right, &r);
553 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
554 564ca709 2004-04-19 devnull res->op = OCONST;
555 564ca709 2004-04-19 devnull res->type = TINT;
556 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
557 564ca709 2004-04-19 devnull error("bad expr type %");
558 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival%r.store.u.ival;
562 564ca709 2004-04-19 devnull olsh(Node *n, Node *res)
564 564ca709 2004-04-19 devnull Node l, r;
566 564ca709 2004-04-19 devnull expr(n->left, &l);
567 564ca709 2004-04-19 devnull expr(n->right, &r);
568 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
569 564ca709 2004-04-19 devnull res->op = OCONST;
570 564ca709 2004-04-19 devnull res->type = TINT;
571 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
572 564ca709 2004-04-19 devnull error("bad expr type <<");
573 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival<<r.store.u.ival;
577 564ca709 2004-04-19 devnull orsh(Node *n, Node *res)
579 564ca709 2004-04-19 devnull Node l, r;
581 564ca709 2004-04-19 devnull expr(n->left, &l);
582 564ca709 2004-04-19 devnull expr(n->right, &r);
583 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
584 564ca709 2004-04-19 devnull res->op = OCONST;
585 564ca709 2004-04-19 devnull res->type = TINT;
586 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
587 564ca709 2004-04-19 devnull error("bad expr type >>");
588 564ca709 2004-04-19 devnull res->store.u.ival = (unsigned)l.store.u.ival>>r.store.u.ival;
592 564ca709 2004-04-19 devnull olt(Node *n, Node *res)
594 564ca709 2004-04-19 devnull Node l, r;
596 564ca709 2004-04-19 devnull expr(n->left, &l);
597 564ca709 2004-04-19 devnull expr(n->right, &r);
599 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
600 564ca709 2004-04-19 devnull res->op = OCONST;
601 564ca709 2004-04-19 devnull res->type = TINT;
602 564ca709 2004-04-19 devnull switch(l.type) {
603 564ca709 2004-04-19 devnull default:
604 564ca709 2004-04-19 devnull error("bad lhs type <");
605 564ca709 2004-04-19 devnull case TINT:
606 564ca709 2004-04-19 devnull switch(r.type) {
607 564ca709 2004-04-19 devnull case TINT:
608 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival < r.store.u.ival;
610 564ca709 2004-04-19 devnull case TFLOAT:
611 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival < r.store.u.fval;
613 564ca709 2004-04-19 devnull default:
614 564ca709 2004-04-19 devnull error("bad rhs type <");
617 564ca709 2004-04-19 devnull case TFLOAT:
618 564ca709 2004-04-19 devnull switch(r.type) {
619 564ca709 2004-04-19 devnull case TINT:
620 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval < r.store.u.ival;
622 564ca709 2004-04-19 devnull case TFLOAT:
623 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval < r.store.u.fval;
625 564ca709 2004-04-19 devnull default:
626 564ca709 2004-04-19 devnull error("bad rhs type <");
633 564ca709 2004-04-19 devnull ogt(Node *n, Node *res)
635 564ca709 2004-04-19 devnull Node l, r;
637 564ca709 2004-04-19 devnull expr(n->left, &l);
638 564ca709 2004-04-19 devnull expr(n->right, &r);
639 564ca709 2004-04-19 devnull res->store.fmt = 'D';
640 564ca709 2004-04-19 devnull res->op = OCONST;
641 564ca709 2004-04-19 devnull res->type = TINT;
642 564ca709 2004-04-19 devnull switch(l.type) {
643 564ca709 2004-04-19 devnull default:
644 564ca709 2004-04-19 devnull error("bad lhs type >");
645 564ca709 2004-04-19 devnull case TINT:
646 564ca709 2004-04-19 devnull switch(r.type) {
647 564ca709 2004-04-19 devnull case TINT:
648 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival > r.store.u.ival;
650 564ca709 2004-04-19 devnull case TFLOAT:
651 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival > r.store.u.fval;
653 564ca709 2004-04-19 devnull default:
654 564ca709 2004-04-19 devnull error("bad rhs type >");
657 564ca709 2004-04-19 devnull case TFLOAT:
658 564ca709 2004-04-19 devnull switch(r.type) {
659 564ca709 2004-04-19 devnull case TINT:
660 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval > r.store.u.ival;
662 564ca709 2004-04-19 devnull case TFLOAT:
663 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval > r.store.u.fval;
665 564ca709 2004-04-19 devnull default:
666 564ca709 2004-04-19 devnull error("bad rhs type >");
673 564ca709 2004-04-19 devnull oleq(Node *n, Node *res)
675 564ca709 2004-04-19 devnull Node l, r;
677 564ca709 2004-04-19 devnull expr(n->left, &l);
678 564ca709 2004-04-19 devnull expr(n->right, &r);
679 564ca709 2004-04-19 devnull res->store.fmt = 'D';
680 564ca709 2004-04-19 devnull res->op = OCONST;
681 564ca709 2004-04-19 devnull res->type = TINT;
682 564ca709 2004-04-19 devnull switch(l.type) {
683 564ca709 2004-04-19 devnull default:
684 564ca709 2004-04-19 devnull error("bad expr type <=");
685 564ca709 2004-04-19 devnull case TINT:
686 564ca709 2004-04-19 devnull switch(r.type) {
687 564ca709 2004-04-19 devnull case TINT:
688 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival <= r.store.u.ival;
690 564ca709 2004-04-19 devnull case TFLOAT:
691 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival <= r.store.u.fval;
693 564ca709 2004-04-19 devnull default:
694 564ca709 2004-04-19 devnull error("bad expr type <=");
697 564ca709 2004-04-19 devnull case TFLOAT:
698 564ca709 2004-04-19 devnull switch(r.type) {
699 564ca709 2004-04-19 devnull case TINT:
700 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval <= r.store.u.ival;
702 564ca709 2004-04-19 devnull case TFLOAT:
703 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval <= r.store.u.fval;
705 564ca709 2004-04-19 devnull default:
706 564ca709 2004-04-19 devnull error("bad expr type <=");
713 564ca709 2004-04-19 devnull ogeq(Node *n, Node *res)
715 564ca709 2004-04-19 devnull Node l, r;
717 564ca709 2004-04-19 devnull expr(n->left, &l);
718 564ca709 2004-04-19 devnull expr(n->right, &r);
719 564ca709 2004-04-19 devnull res->store.fmt = 'D';
720 564ca709 2004-04-19 devnull res->op = OCONST;
721 564ca709 2004-04-19 devnull res->type = TINT;
722 564ca709 2004-04-19 devnull switch(l.type) {
723 564ca709 2004-04-19 devnull default:
724 564ca709 2004-04-19 devnull error("bad lhs type >=");
725 564ca709 2004-04-19 devnull case TINT:
726 564ca709 2004-04-19 devnull switch(r.type) {
727 564ca709 2004-04-19 devnull case TINT:
728 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival >= r.store.u.ival;
730 564ca709 2004-04-19 devnull case TFLOAT:
731 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival >= r.store.u.fval;
733 564ca709 2004-04-19 devnull default:
734 564ca709 2004-04-19 devnull error("bad rhs type >=");
737 564ca709 2004-04-19 devnull case TFLOAT:
738 564ca709 2004-04-19 devnull switch(r.type) {
739 564ca709 2004-04-19 devnull case TINT:
740 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval >= r.store.u.ival;
742 564ca709 2004-04-19 devnull case TFLOAT:
743 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval >= r.store.u.fval;
745 564ca709 2004-04-19 devnull default:
746 564ca709 2004-04-19 devnull error("bad rhs type >=");
753 564ca709 2004-04-19 devnull oeq(Node *n, Node *res)
755 564ca709 2004-04-19 devnull Node l, r;
757 564ca709 2004-04-19 devnull expr(n->left, &l);
758 564ca709 2004-04-19 devnull expr(n->right, &r);
759 564ca709 2004-04-19 devnull res->store.fmt = 'D';
760 564ca709 2004-04-19 devnull res->op = OCONST;
761 564ca709 2004-04-19 devnull res->type = TINT;
762 564ca709 2004-04-19 devnull res->store.u.ival = 0;
763 564ca709 2004-04-19 devnull switch(l.type) {
764 564ca709 2004-04-19 devnull default:
766 564ca709 2004-04-19 devnull case TINT:
767 564ca709 2004-04-19 devnull switch(r.type) {
768 564ca709 2004-04-19 devnull case TINT:
769 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival == r.store.u.ival;
771 564ca709 2004-04-19 devnull case TFLOAT:
772 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival == r.store.u.fval;
774 564ca709 2004-04-19 devnull default:
778 564ca709 2004-04-19 devnull case TFLOAT:
779 564ca709 2004-04-19 devnull switch(r.type) {
780 564ca709 2004-04-19 devnull case TINT:
781 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval == r.store.u.ival;
783 564ca709 2004-04-19 devnull case TFLOAT:
784 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.fval == r.store.u.fval;
786 564ca709 2004-04-19 devnull default:
790 564ca709 2004-04-19 devnull case TSTRING:
791 564ca709 2004-04-19 devnull if(r.type == TSTRING) {
792 564ca709 2004-04-19 devnull res->store.u.ival = scmp(r.store.u.string, l.store.u.string);
796 564ca709 2004-04-19 devnull case TLIST:
797 564ca709 2004-04-19 devnull if(r.type == TLIST) {
798 564ca709 2004-04-19 devnull res->store.u.ival = listcmp(l.store.u.l, r.store.u.l);
803 564ca709 2004-04-19 devnull if(n->op == ONEQ)
804 564ca709 2004-04-19 devnull res->store.u.ival = !res->store.u.ival;
809 564ca709 2004-04-19 devnull oland(Node *n, Node *res)
811 564ca709 2004-04-19 devnull Node l, r;
813 564ca709 2004-04-19 devnull expr(n->left, &l);
814 564ca709 2004-04-19 devnull expr(n->right, &r);
815 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
816 564ca709 2004-04-19 devnull res->op = OCONST;
817 564ca709 2004-04-19 devnull res->type = TINT;
818 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
819 564ca709 2004-04-19 devnull error("bad expr type &");
820 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival&r.store.u.ival;
824 564ca709 2004-04-19 devnull oxor(Node *n, Node *res)
826 564ca709 2004-04-19 devnull Node l, r;
828 564ca709 2004-04-19 devnull expr(n->left, &l);
829 564ca709 2004-04-19 devnull expr(n->right, &r);
830 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
831 564ca709 2004-04-19 devnull res->op = OCONST;
832 564ca709 2004-04-19 devnull res->type = TINT;
833 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
834 564ca709 2004-04-19 devnull error("bad expr type ^");
835 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival^r.store.u.ival;
839 564ca709 2004-04-19 devnull olor(Node *n, Node *res)
841 564ca709 2004-04-19 devnull Node l, r;
843 564ca709 2004-04-19 devnull expr(n->left, &l);
844 564ca709 2004-04-19 devnull expr(n->right, &r);
845 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
846 564ca709 2004-04-19 devnull res->op = OCONST;
847 564ca709 2004-04-19 devnull res->type = TINT;
848 564ca709 2004-04-19 devnull if(l.type != TINT || r.type != TINT)
849 564ca709 2004-04-19 devnull error("bad expr type |");
850 564ca709 2004-04-19 devnull res->store.u.ival = l.store.u.ival|r.store.u.ival;
854 564ca709 2004-04-19 devnull ocand(Node *n, Node *res)
856 564ca709 2004-04-19 devnull Node l, r;
858 564ca709 2004-04-19 devnull res->store.fmt = l.store.fmt;
859 564ca709 2004-04-19 devnull res->op = OCONST;
860 564ca709 2004-04-19 devnull res->type = TINT;
861 564ca709 2004-04-19 devnull res->store.u.ival = 0;
862 564ca709 2004-04-19 devnull expr(n->left, &l);
863 564ca709 2004-04-19 devnull if(bool(&l) == 0)
865 564ca709 2004-04-19 devnull expr(n->right, &r);
866 564ca709 2004-04-19 devnull if(bool(&r) == 0)
868 564ca709 2004-04-19 devnull res->store.u.ival = 1;
872 564ca709 2004-04-19 devnull onot(Node *n, Node *res)
876 564ca709 2004-04-19 devnull res->op = OCONST;
877 564ca709 2004-04-19 devnull res->type = TINT;
878 564ca709 2004-04-19 devnull res->store.u.ival = 0;
879 564ca709 2004-04-19 devnull expr(n->left, &l);
880 564ca709 2004-04-19 devnull if(bool(&l) == 0)
881 564ca709 2004-04-19 devnull res->store.u.ival = 1;
885 564ca709 2004-04-19 devnull ocor(Node *n, Node *res)
887 564ca709 2004-04-19 devnull Node l, r;
889 564ca709 2004-04-19 devnull res->op = OCONST;
890 564ca709 2004-04-19 devnull res->type = TINT;
891 564ca709 2004-04-19 devnull res->store.u.ival = 0;
892 564ca709 2004-04-19 devnull expr(n->left, &l);
893 564ca709 2004-04-19 devnull if(bool(&l)) {
894 564ca709 2004-04-19 devnull res->store.u.ival = 1;
897 564ca709 2004-04-19 devnull expr(n->right, &r);
898 564ca709 2004-04-19 devnull if(bool(&r)) {
899 564ca709 2004-04-19 devnull res->store.u.ival = 1;
905 564ca709 2004-04-19 devnull oeinc(Node *n, Node *res)
907 564ca709 2004-04-19 devnull Value *v;
909 4f2ac1b7 2005-01-23 devnull v = chklval(n->left)->v;
910 564ca709 2004-04-19 devnull res->op = OCONST;
911 564ca709 2004-04-19 devnull res->type = v->type;
912 564ca709 2004-04-19 devnull switch(v->type) {
913 564ca709 2004-04-19 devnull case TINT:
914 564ca709 2004-04-19 devnull if(n->op == OEDEC)
915 564ca709 2004-04-19 devnull v->store.u.ival -= fmtsize(v);
917 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
919 564ca709 2004-04-19 devnull case TFLOAT:
920 564ca709 2004-04-19 devnull if(n->op == OEDEC)
921 564ca709 2004-04-19 devnull v->store.u.fval--;
923 564ca709 2004-04-19 devnull v->store.u.fval++;
925 564ca709 2004-04-19 devnull default:
926 564ca709 2004-04-19 devnull error("bad type for pre --/++");
928 564ca709 2004-04-19 devnull res->store = v->store;
932 564ca709 2004-04-19 devnull opinc(Node *n, Node *res)
934 564ca709 2004-04-19 devnull Value *v;
936 4f2ac1b7 2005-01-23 devnull v = chklval(n->left)->v;
937 564ca709 2004-04-19 devnull res->op = OCONST;
938 564ca709 2004-04-19 devnull res->type = v->type;
939 564ca709 2004-04-19 devnull res->store = v->store;
940 564ca709 2004-04-19 devnull switch(v->type) {
941 564ca709 2004-04-19 devnull case TINT:
942 564ca709 2004-04-19 devnull if(n->op == OPDEC)
943 564ca709 2004-04-19 devnull v->store.u.ival -= fmtsize(v);
945 564ca709 2004-04-19 devnull v->store.u.ival += fmtsize(v);
947 564ca709 2004-04-19 devnull case TFLOAT:
948 564ca709 2004-04-19 devnull if(n->op == OPDEC)
949 564ca709 2004-04-19 devnull v->store.u.fval--;
951 564ca709 2004-04-19 devnull v->store.u.fval++;
953 564ca709 2004-04-19 devnull default:
954 564ca709 2004-04-19 devnull error("bad type for post --/++");
959 564ca709 2004-04-19 devnull ocall(Node *n, Node *res)
961 564ca709 2004-04-19 devnull Lsym *s;
962 564ca709 2004-04-19 devnull Rplace *rsav;
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;
968 4f2ac1b7 2005-01-23 devnull s = chklval(n->left);
969 564ca709 2004-04-19 devnull if(n->builtin && !s->builtin){
970 564ca709 2004-04-19 devnull error("no builtin %s", s->name);
973 564ca709 2004-04-19 devnull if(s->builtin && (n->builtin || s->proc == 0)) {
974 564ca709 2004-04-19 devnull (*s->builtin)(res, n->right);
977 564ca709 2004-04-19 devnull if(s->proc == 0)
978 564ca709 2004-04-19 devnull error("no function %s", s->name);
980 564ca709 2004-04-19 devnull rsav = ret;
981 564ca709 2004-04-19 devnull call(s->name, n->right, s->proc->left, s->proc->right, res);
982 564ca709 2004-04-19 devnull ret = rsav;
986 564ca709 2004-04-19 devnull ofmt(Node *n, Node *res)
988 564ca709 2004-04-19 devnull expr(n->left, res);
989 564ca709 2004-04-19 devnull res->store.fmt = n->right->store.u.ival;
993 4f2ac1b7 2005-01-23 devnull ouplus(Node *n, Node *res)
995 4f2ac1b7 2005-01-23 devnull expr(n->left, res);
999 564ca709 2004-04-19 devnull owhat(Node *n, Node *res)
1001 564ca709 2004-04-19 devnull res->op = OCONST; /* Default return value */
1002 564ca709 2004-04-19 devnull res->type = TLIST;
1003 564ca709 2004-04-19 devnull res->store.u.l = 0;
1004 564ca709 2004-04-19 devnull whatis(n->sym);
1007 e637c944 2004-04-20 devnull void (*expop[NUMO])(Node*, Node*);
1009 e637c944 2004-04-20 devnull static void
1010 e637c944 2004-04-20 devnull initexpop(void)
1012 e637c944 2004-04-20 devnull expop[ONAME] = oname;
1013 e637c944 2004-04-20 devnull expop[OCONST] = oconst;
1014 e637c944 2004-04-20 devnull expop[OMUL] = omul;
1015 e637c944 2004-04-20 devnull expop[ODIV] = odiv;
1016 e637c944 2004-04-20 devnull expop[OMOD] = omod;
1017 e637c944 2004-04-20 devnull expop[OADD] = oadd;
1018 e637c944 2004-04-20 devnull expop[OSUB] = osub;
1019 e637c944 2004-04-20 devnull expop[ORSH] = orsh;
1020 e637c944 2004-04-20 devnull expop[OLSH] = olsh;
1021 e637c944 2004-04-20 devnull expop[OLT] = olt;
1022 e637c944 2004-04-20 devnull expop[OGT] = ogt;
1023 e637c944 2004-04-20 devnull expop[OLEQ] = oleq;
1024 e637c944 2004-04-20 devnull expop[OGEQ] = ogeq;
1025 e637c944 2004-04-20 devnull expop[OEQ] = oeq;
1026 e637c944 2004-04-20 devnull expop[ONEQ] = oeq;
1027 e637c944 2004-04-20 devnull expop[OLAND] = oland;
1028 e637c944 2004-04-20 devnull expop[OXOR] = oxor;
1029 e637c944 2004-04-20 devnull expop[OLOR] = olor;
1030 e637c944 2004-04-20 devnull expop[OCAND] = ocand;
1031 e637c944 2004-04-20 devnull expop[OCOR] = ocor;
1032 e637c944 2004-04-20 devnull expop[OASGN] = oasgn;
1033 e637c944 2004-04-20 devnull expop[OINDM] = oindm;
1034 e637c944 2004-04-20 devnull expop[OEDEC] = oeinc;
1035 e637c944 2004-04-20 devnull expop[OEINC] = oeinc;
1036 e637c944 2004-04-20 devnull expop[OPINC] = opinc;
1037 e637c944 2004-04-20 devnull expop[OPDEC] = opinc;
1038 e637c944 2004-04-20 devnull expop[ONOT] = onot;
1039 e637c944 2004-04-20 devnull expop[OIF] = 0;
1040 e637c944 2004-04-20 devnull expop[ODO] = 0;
1041 e637c944 2004-04-20 devnull expop[OLIST] = olist;
1042 e637c944 2004-04-20 devnull expop[OCALL] = ocall;
1043 e637c944 2004-04-20 devnull expop[OCTRUCT] = octruct;
1044 e637c944 2004-04-20 devnull expop[OWHILE] =0;
1045 e637c944 2004-04-20 devnull expop[OELSE] = 0;
1046 e637c944 2004-04-20 devnull expop[OHEAD] = ohead;
1047 e637c944 2004-04-20 devnull expop[OTAIL] = otail;
1048 e637c944 2004-04-20 devnull expop[OAPPEND] = oappend;
1049 e637c944 2004-04-20 devnull expop[ORET] = 0;
1050 e637c944 2004-04-20 devnull expop[OINDEX] =oindex;
1051 e637c944 2004-04-20 devnull expop[OINDC] = oindc;
1052 e637c944 2004-04-20 devnull expop[ODOT] = odot;
1053 e637c944 2004-04-20 devnull expop[OLOCAL] =0;
1054 e637c944 2004-04-20 devnull expop[OFRAME] = oframe;
1055 e637c944 2004-04-20 devnull expop[OCOMPLEX] =0;
1056 e637c944 2004-04-20 devnull expop[ODELETE] = odelete;
1057 e637c944 2004-04-20 devnull expop[OCAST] = ocast;
1058 e637c944 2004-04-20 devnull expop[OFMT] = ofmt;
1059 e637c944 2004-04-20 devnull expop[OEVAL] = oeval;
1060 e637c944 2004-04-20 devnull expop[OWHAT] = owhat;
1061 4f2ac1b7 2005-01-23 devnull expop[OUPLUS] = ouplus;
1065 e637c944 2004-04-20 devnull initexpr(void)
1067 e637c944 2004-04-20 devnull initfsize();
1068 e637c944 2004-04-20 devnull initexpop();
1072 4f2ac1b7 2005-01-23 devnull acidregsrw(Regs *r, char *name, ulong *u, int isr)
1074 4f2ac1b7 2005-01-23 devnull Lsym *l;
1075 4f2ac1b7 2005-01-23 devnull Value *v;
1076 4f2ac1b7 2005-01-23 devnull Node *n;
1077 4f2ac1b7 2005-01-23 devnull ulong addr;
1078 4f2ac1b7 2005-01-23 devnull u32int u32;
1080 4f2ac1b7 2005-01-23 devnull if(!isr){
1081 4f2ac1b7 2005-01-23 devnull werrstr("cannot write registers");
1082 4f2ac1b7 2005-01-23 devnull return -1;
1084 4f2ac1b7 2005-01-23 devnull USED(r);
1085 4f2ac1b7 2005-01-23 devnull l = look(name);
1086 4f2ac1b7 2005-01-23 devnull if(l == nil){
1087 4f2ac1b7 2005-01-23 devnull werrstr("register %s not found", name);
1088 4f2ac1b7 2005-01-23 devnull return -1;
1090 4f2ac1b7 2005-01-23 devnull v = l->v;
1091 4f2ac1b7 2005-01-23 devnull switch(v->type){
1092 4f2ac1b7 2005-01-23 devnull default:
1093 4f2ac1b7 2005-01-23 devnull werrstr("*%s: bad type", name);
1094 4f2ac1b7 2005-01-23 devnull return -1;
1095 4f2ac1b7 2005-01-23 devnull case TREG:
1096 4f2ac1b7 2005-01-23 devnull if(correg == nil){
1097 4f2ac1b7 2005-01-23 devnull werrstr("*%s: register %s not mapped", name, v->store.u.reg);
1098 4f2ac1b7 2005-01-23 devnull return -1;
1100 7b8a3f12 2005-02-11 devnull return rget(correg, v->store.u.reg.name, u);
1101 4f2ac1b7 2005-01-23 devnull case TCON:
1102 4f2ac1b7 2005-01-23 devnull n = v->store.u.con;
1103 4f2ac1b7 2005-01-23 devnull if(n->op != OCONST || n->type != TINT){
1104 4f2ac1b7 2005-01-23 devnull werrstr("*%s: bad register constant", name);
1105 4f2ac1b7 2005-01-23 devnull return -1;
1107 4f2ac1b7 2005-01-23 devnull *u = n->store.u.ival;
1108 4f2ac1b7 2005-01-23 devnull return 0;
1109 4f2ac1b7 2005-01-23 devnull case TINT:
1110 4f2ac1b7 2005-01-23 devnull if(cormap == nil){
1111 4f2ac1b7 2005-01-23 devnull werrstr("*%s: core not mapped", name);
1112 4f2ac1b7 2005-01-23 devnull return -1;
1114 4f2ac1b7 2005-01-23 devnull addr = v->store.u.ival;
1115 4f2ac1b7 2005-01-23 devnull /* XXX should use format to determine size */
1116 4f2ac1b7 2005-01-23 devnull if(get4(cormap, addr, &u32) < 0)
1117 4f2ac1b7 2005-01-23 devnull return -1;
1118 4f2ac1b7 2005-01-23 devnull *u = u32;
1119 4f2ac1b7 2005-01-23 devnull return 0;