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 564ca709 2004-04-19 devnull void
10 564ca709 2004-04-19 devnull error(char *fmt, ...)
11 564ca709 2004-04-19 devnull {
12 564ca709 2004-04-19 devnull int i;
13 564ca709 2004-04-19 devnull char buf[2048];
14 564ca709 2004-04-19 devnull va_list arg;
15 564ca709 2004-04-19 devnull
16 564ca709 2004-04-19 devnull /* Unstack io channels */
17 564ca709 2004-04-19 devnull if(iop != 0) {
18 564ca709 2004-04-19 devnull for(i = 1; i < iop; i++)
19 564ca709 2004-04-19 devnull Bterm(io[i]);
20 564ca709 2004-04-19 devnull bout = io[0];
21 564ca709 2004-04-19 devnull iop = 0;
22 564ca709 2004-04-19 devnull }
23 564ca709 2004-04-19 devnull
24 564ca709 2004-04-19 devnull ret = 0;
25 564ca709 2004-04-19 devnull gotint = 0;
26 564ca709 2004-04-19 devnull Bflush(bout);
27 564ca709 2004-04-19 devnull if(silent)
28 564ca709 2004-04-19 devnull silent = 0;
29 564ca709 2004-04-19 devnull else {
30 564ca709 2004-04-19 devnull va_start(arg, fmt);
31 564ca709 2004-04-19 devnull vseprint(buf, buf+sizeof(buf), fmt, arg);
32 564ca709 2004-04-19 devnull va_end(arg);
33 564ca709 2004-04-19 devnull fprint(2, "%Z: (error) %s\n", buf);
34 564ca709 2004-04-19 devnull }
35 564ca709 2004-04-19 devnull while(popio())
36 564ca709 2004-04-19 devnull ;
37 564ca709 2004-04-19 devnull interactive = 1;
38 564ca709 2004-04-19 devnull longjmp(err, 1);
39 564ca709 2004-04-19 devnull }
40 564ca709 2004-04-19 devnull
41 564ca709 2004-04-19 devnull void
42 564ca709 2004-04-19 devnull unwind(void)
43 564ca709 2004-04-19 devnull {
44 564ca709 2004-04-19 devnull int i;
45 564ca709 2004-04-19 devnull Lsym *s;
46 564ca709 2004-04-19 devnull Value *v;
47 564ca709 2004-04-19 devnull
48 564ca709 2004-04-19 devnull for(i = 0; i < Hashsize; i++) {
49 564ca709 2004-04-19 devnull for(s = hash[i]; s; s = s->hash) {
50 564ca709 2004-04-19 devnull while(s->v->pop) {
51 564ca709 2004-04-19 devnull v = s->v->pop;
52 564ca709 2004-04-19 devnull free(s->v);
53 564ca709 2004-04-19 devnull s->v = v;
54 564ca709 2004-04-19 devnull }
55 564ca709 2004-04-19 devnull }
56 564ca709 2004-04-19 devnull }
57 564ca709 2004-04-19 devnull }
58 564ca709 2004-04-19 devnull
59 564ca709 2004-04-19 devnull void
60 564ca709 2004-04-19 devnull execute(Node *n)
61 564ca709 2004-04-19 devnull {
62 564ca709 2004-04-19 devnull Value *v;
63 564ca709 2004-04-19 devnull Lsym *sl;
64 564ca709 2004-04-19 devnull Node *l, *r;
65 564ca709 2004-04-19 devnull int i, s, e;
66 564ca709 2004-04-19 devnull Node res, xx;
67 564ca709 2004-04-19 devnull static int stmnt;
68 564ca709 2004-04-19 devnull
69 564ca709 2004-04-19 devnull gc();
70 564ca709 2004-04-19 devnull if(gotint)
71 564ca709 2004-04-19 devnull error("interrupted");
72 564ca709 2004-04-19 devnull
73 564ca709 2004-04-19 devnull if(n == 0)
74 564ca709 2004-04-19 devnull return;
75 564ca709 2004-04-19 devnull
76 564ca709 2004-04-19 devnull if(stmnt++ > 5000) {
77 564ca709 2004-04-19 devnull Bflush(bout);
78 564ca709 2004-04-19 devnull stmnt = 0;
79 564ca709 2004-04-19 devnull }
80 564ca709 2004-04-19 devnull
81 564ca709 2004-04-19 devnull l = n->left;
82 564ca709 2004-04-19 devnull r = n->right;
83 564ca709 2004-04-19 devnull
84 564ca709 2004-04-19 devnull switch(n->op) {
85 564ca709 2004-04-19 devnull default:
86 564ca709 2004-04-19 devnull expr(n, &res);
87 564ca709 2004-04-19 devnull if(ret || (res.type == TLIST && res.store.u.l == 0))
88 564ca709 2004-04-19 devnull break;
89 564ca709 2004-04-19 devnull prnt->right = &res;
90 564ca709 2004-04-19 devnull expr(prnt, &xx);
91 564ca709 2004-04-19 devnull break;
92 564ca709 2004-04-19 devnull case OASGN:
93 564ca709 2004-04-19 devnull case OCALL:
94 564ca709 2004-04-19 devnull expr(n, &res);
95 564ca709 2004-04-19 devnull break;
96 564ca709 2004-04-19 devnull case OCOMPLEX:
97 564ca709 2004-04-19 devnull decl(n);
98 564ca709 2004-04-19 devnull break;
99 564ca709 2004-04-19 devnull case OLOCAL:
100 564ca709 2004-04-19 devnull for(n = n->left; n; n = n->left) {
101 564ca709 2004-04-19 devnull if(ret == 0)
102 564ca709 2004-04-19 devnull error("local not in function");
103 564ca709 2004-04-19 devnull sl = n->sym;
104 564ca709 2004-04-19 devnull if(sl->v->ret == ret)
105 564ca709 2004-04-19 devnull error("%s declared twice", sl->name);
106 564ca709 2004-04-19 devnull v = gmalloc(sizeof(Value));
107 564ca709 2004-04-19 devnull v->ret = ret;
108 564ca709 2004-04-19 devnull v->pop = sl->v;
109 564ca709 2004-04-19 devnull sl->v = v;
110 564ca709 2004-04-19 devnull v->scope = 0;
111 564ca709 2004-04-19 devnull *(ret->tail) = sl;
112 564ca709 2004-04-19 devnull ret->tail = &v->scope;
113 564ca709 2004-04-19 devnull v->set = 0;
114 564ca709 2004-04-19 devnull }
115 564ca709 2004-04-19 devnull break;
116 564ca709 2004-04-19 devnull case ORET:
117 564ca709 2004-04-19 devnull if(ret == 0)
118 564ca709 2004-04-19 devnull error("return not in function");
119 564ca709 2004-04-19 devnull expr(n->left, ret->val);
120 564ca709 2004-04-19 devnull longjmp(ret->rlab, 1);
121 564ca709 2004-04-19 devnull case OLIST:
122 564ca709 2004-04-19 devnull execute(n->left);
123 564ca709 2004-04-19 devnull execute(n->right);
124 564ca709 2004-04-19 devnull break;
125 564ca709 2004-04-19 devnull case OIF:
126 564ca709 2004-04-19 devnull expr(l, &res);
127 564ca709 2004-04-19 devnull if(r && r->op == OELSE) {
128 564ca709 2004-04-19 devnull if(bool(&res))
129 564ca709 2004-04-19 devnull execute(r->left);
130 564ca709 2004-04-19 devnull else
131 564ca709 2004-04-19 devnull execute(r->right);
132 564ca709 2004-04-19 devnull }
133 564ca709 2004-04-19 devnull else if(bool(&res))
134 564ca709 2004-04-19 devnull execute(r);
135 564ca709 2004-04-19 devnull break;
136 564ca709 2004-04-19 devnull case OWHILE:
137 564ca709 2004-04-19 devnull for(;;) {
138 564ca709 2004-04-19 devnull expr(l, &res);
139 564ca709 2004-04-19 devnull if(!bool(&res))
140 564ca709 2004-04-19 devnull break;
141 564ca709 2004-04-19 devnull execute(r);
142 564ca709 2004-04-19 devnull }
143 564ca709 2004-04-19 devnull break;
144 564ca709 2004-04-19 devnull case ODO:
145 564ca709 2004-04-19 devnull expr(l->left, &res);
146 564ca709 2004-04-19 devnull if(res.type != TINT)
147 564ca709 2004-04-19 devnull error("loop must have integer start");
148 564ca709 2004-04-19 devnull s = res.store.u.ival;
149 564ca709 2004-04-19 devnull expr(l->right, &res);
150 564ca709 2004-04-19 devnull if(res.type != TINT)
151 564ca709 2004-04-19 devnull error("loop must have integer end");
152 564ca709 2004-04-19 devnull e = res.store.u.ival;
153 564ca709 2004-04-19 devnull for(i = s; i <= e; i++)
154 564ca709 2004-04-19 devnull execute(r);
155 564ca709 2004-04-19 devnull break;
156 564ca709 2004-04-19 devnull }
157 564ca709 2004-04-19 devnull }
158 564ca709 2004-04-19 devnull
159 564ca709 2004-04-19 devnull int
160 564ca709 2004-04-19 devnull bool(Node *n)
161 564ca709 2004-04-19 devnull {
162 564ca709 2004-04-19 devnull int true = 0;
163 564ca709 2004-04-19 devnull
164 564ca709 2004-04-19 devnull if(n->op != OCONST)
165 564ca709 2004-04-19 devnull fatal("bool: not const");
166 564ca709 2004-04-19 devnull
167 564ca709 2004-04-19 devnull switch(n->type) {
168 564ca709 2004-04-19 devnull case TINT:
169 564ca709 2004-04-19 devnull if(n->store.u.ival != 0)
170 564ca709 2004-04-19 devnull true = 1;
171 564ca709 2004-04-19 devnull break;
172 564ca709 2004-04-19 devnull case TFLOAT:
173 564ca709 2004-04-19 devnull if(n->store.u.fval != 0.0)
174 564ca709 2004-04-19 devnull true = 1;
175 564ca709 2004-04-19 devnull break;
176 564ca709 2004-04-19 devnull case TSTRING:
177 564ca709 2004-04-19 devnull if(n->store.u.string->len)
178 564ca709 2004-04-19 devnull true = 1;
179 564ca709 2004-04-19 devnull break;
180 564ca709 2004-04-19 devnull case TLIST:
181 564ca709 2004-04-19 devnull if(n->store.u.l)
182 564ca709 2004-04-19 devnull true = 1;
183 564ca709 2004-04-19 devnull break;
184 564ca709 2004-04-19 devnull }
185 564ca709 2004-04-19 devnull return true;
186 564ca709 2004-04-19 devnull }
187 564ca709 2004-04-19 devnull
188 564ca709 2004-04-19 devnull void
189 564ca709 2004-04-19 devnull convflt(Node *r, char *flt)
190 564ca709 2004-04-19 devnull {
191 564ca709 2004-04-19 devnull char c;
192 564ca709 2004-04-19 devnull
193 564ca709 2004-04-19 devnull c = flt[0];
194 564ca709 2004-04-19 devnull if(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
195 564ca709 2004-04-19 devnull r->type = TSTRING;
196 564ca709 2004-04-19 devnull r->store.fmt = 's';
197 564ca709 2004-04-19 devnull r->store.u.string = strnode(flt);
198 564ca709 2004-04-19 devnull }
199 564ca709 2004-04-19 devnull else {
200 564ca709 2004-04-19 devnull r->type = TFLOAT;
201 564ca709 2004-04-19 devnull r->store.u.fval = atof(flt);
202 564ca709 2004-04-19 devnull }
203 564ca709 2004-04-19 devnull }
204 564ca709 2004-04-19 devnull
205 564ca709 2004-04-19 devnull void
206 4a000a28 2012-03-05 rsc indir(Map *m, u64int addr, char fmt, Node *r)
207 564ca709 2004-04-19 devnull {
208 a8bf49f9 2011-01-02 rsc int i;
209 564ca709 2004-04-19 devnull u32int ival;
210 564ca709 2004-04-19 devnull u64int vval;
211 564ca709 2004-04-19 devnull int ret;
212 564ca709 2004-04-19 devnull u8int cval;
213 564ca709 2004-04-19 devnull u16int sval;
214 564ca709 2004-04-19 devnull char buf[512], reg[12];
215 564ca709 2004-04-19 devnull
216 564ca709 2004-04-19 devnull r->op = OCONST;
217 564ca709 2004-04-19 devnull r->store.fmt = fmt;
218 564ca709 2004-04-19 devnull switch(fmt) {
219 564ca709 2004-04-19 devnull default:
220 564ca709 2004-04-19 devnull error("bad pointer format '%c' for *", fmt);
221 564ca709 2004-04-19 devnull case 'c':
222 564ca709 2004-04-19 devnull case 'C':
223 564ca709 2004-04-19 devnull case 'b':
224 564ca709 2004-04-19 devnull r->type = TINT;
225 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, &cval, 1);
226 564ca709 2004-04-19 devnull if (ret < 0)
227 564ca709 2004-04-19 devnull error("indir: %r");
228 564ca709 2004-04-19 devnull r->store.u.ival = cval;
229 564ca709 2004-04-19 devnull break;
230 564ca709 2004-04-19 devnull case 'x':
231 564ca709 2004-04-19 devnull case 'd':
232 564ca709 2004-04-19 devnull case 'u':
233 564ca709 2004-04-19 devnull case 'o':
234 564ca709 2004-04-19 devnull case 'q':
235 564ca709 2004-04-19 devnull case 'r':
236 564ca709 2004-04-19 devnull r->type = TINT;
237 4f2ac1b7 2005-01-23 devnull ret = get2(m, addr, &sval);
238 564ca709 2004-04-19 devnull if (ret < 0)
239 564ca709 2004-04-19 devnull error("indir: %r");
240 564ca709 2004-04-19 devnull r->store.u.ival = sval;
241 564ca709 2004-04-19 devnull break;
242 564ca709 2004-04-19 devnull case 'a':
243 564ca709 2004-04-19 devnull case 'A':
244 564ca709 2004-04-19 devnull case 'B':
245 564ca709 2004-04-19 devnull case 'X':
246 564ca709 2004-04-19 devnull case 'D':
247 564ca709 2004-04-19 devnull case 'U':
248 564ca709 2004-04-19 devnull case 'O':
249 564ca709 2004-04-19 devnull case 'Q':
250 564ca709 2004-04-19 devnull r->type = TINT;
251 4f2ac1b7 2005-01-23 devnull ret = get4(m, addr, &ival);
252 564ca709 2004-04-19 devnull if (ret < 0)
253 564ca709 2004-04-19 devnull error("indir: %r");
254 564ca709 2004-04-19 devnull r->store.u.ival = ival;
255 564ca709 2004-04-19 devnull break;
256 564ca709 2004-04-19 devnull case 'V':
257 564ca709 2004-04-19 devnull case 'W':
258 564ca709 2004-04-19 devnull case 'Y':
259 564ca709 2004-04-19 devnull case 'Z':
260 564ca709 2004-04-19 devnull r->type = TINT;
261 4f2ac1b7 2005-01-23 devnull ret = get8(m, addr, &vval);
262 564ca709 2004-04-19 devnull if (ret < 0)
263 564ca709 2004-04-19 devnull error("indir: %r");
264 564ca709 2004-04-19 devnull r->store.u.ival = vval;
265 564ca709 2004-04-19 devnull break;
266 564ca709 2004-04-19 devnull case 's':
267 564ca709 2004-04-19 devnull r->type = TSTRING;
268 564ca709 2004-04-19 devnull for(i = 0; i < sizeof(buf)-1; i++) {
269 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)&buf[i], 1);
270 564ca709 2004-04-19 devnull if (ret < 0)
271 564ca709 2004-04-19 devnull error("indir: %r");
272 564ca709 2004-04-19 devnull addr++;
273 564ca709 2004-04-19 devnull if(buf[i] == '\0')
274 564ca709 2004-04-19 devnull break;
275 564ca709 2004-04-19 devnull }
276 564ca709 2004-04-19 devnull buf[i] = 0;
277 564ca709 2004-04-19 devnull if(i == 0)
278 564ca709 2004-04-19 devnull strcpy(buf, "(null)");
279 564ca709 2004-04-19 devnull r->store.u.string = strnode(buf);
280 564ca709 2004-04-19 devnull break;
281 564ca709 2004-04-19 devnull case 'R':
282 564ca709 2004-04-19 devnull r->type = TSTRING;
283 839c052a 2011-01-02 rsc assert(sizeof(Rune) == 4);
284 839c052a 2011-01-02 rsc for(i = 0; i < sizeof(buf)-4; i += 4) {
285 839c052a 2011-01-02 rsc ret = get4(m, addr, &ival);
286 564ca709 2004-04-19 devnull if (ret < 0)
287 564ca709 2004-04-19 devnull error("indir: %r");
288 839c052a 2011-01-02 rsc memmove(buf+i, &ival, 4);
289 839c052a 2011-01-02 rsc addr += 4;
290 839c052a 2011-01-02 rsc if(ival == 0)
291 564ca709 2004-04-19 devnull break;
292 564ca709 2004-04-19 devnull }
293 839c052a 2011-01-02 rsc ival = 0;
294 839c052a 2011-01-02 rsc memmove(buf+i, &ival, 4);
295 564ca709 2004-04-19 devnull r->store.u.string = runenode((Rune*)buf);
296 564ca709 2004-04-19 devnull break;
297 564ca709 2004-04-19 devnull case 'i':
298 564ca709 2004-04-19 devnull case 'I':
299 564ca709 2004-04-19 devnull if ((*mach->das)(m, addr, fmt, buf, sizeof(buf)) < 0)
300 564ca709 2004-04-19 devnull error("indir: %r");
301 564ca709 2004-04-19 devnull r->type = TSTRING;
302 564ca709 2004-04-19 devnull r->store.fmt = 's';
303 564ca709 2004-04-19 devnull r->store.u.string = strnode(buf);
304 564ca709 2004-04-19 devnull break;
305 564ca709 2004-04-19 devnull case 'f':
306 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)buf, mach->szfloat);
307 564ca709 2004-04-19 devnull if (ret < 0)
308 564ca709 2004-04-19 devnull error("indir: %r");
309 564ca709 2004-04-19 devnull mach->ftoa32(buf, sizeof(buf), (void*) buf);
310 564ca709 2004-04-19 devnull convflt(r, buf);
311 564ca709 2004-04-19 devnull break;
312 564ca709 2004-04-19 devnull case 'g':
313 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)buf, mach->szfloat);
314 564ca709 2004-04-19 devnull if (ret < 0)
315 564ca709 2004-04-19 devnull error("indir: %r");
316 564ca709 2004-04-19 devnull mach->ftoa32(buf, sizeof(buf), (void*) buf);
317 564ca709 2004-04-19 devnull r->type = TSTRING;
318 564ca709 2004-04-19 devnull r->store.u.string = strnode(buf);
319 564ca709 2004-04-19 devnull break;
320 564ca709 2004-04-19 devnull case 'F':
321 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)buf, mach->szdouble);
322 564ca709 2004-04-19 devnull if (ret < 0)
323 564ca709 2004-04-19 devnull error("indir: %r");
324 564ca709 2004-04-19 devnull mach->ftoa64(buf, sizeof(buf), (void*) buf);
325 564ca709 2004-04-19 devnull convflt(r, buf);
326 564ca709 2004-04-19 devnull break;
327 564ca709 2004-04-19 devnull case '3': /* little endian ieee 80 with hole in bytes 8&9 */
328 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)reg, 10);
329 564ca709 2004-04-19 devnull if (ret < 0)
330 564ca709 2004-04-19 devnull error("indir: %r");
331 564ca709 2004-04-19 devnull memmove(reg+10, reg+8, 2); /* open hole */
332 564ca709 2004-04-19 devnull memset(reg+8, 0, 2); /* fill it */
333 564ca709 2004-04-19 devnull leieeeftoa80(buf, sizeof(buf), reg);
334 564ca709 2004-04-19 devnull convflt(r, buf);
335 564ca709 2004-04-19 devnull break;
336 564ca709 2004-04-19 devnull case '8': /* big-endian ieee 80 */
337 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)reg, 10);
338 564ca709 2004-04-19 devnull if (ret < 0)
339 564ca709 2004-04-19 devnull error("indir: %r");
340 564ca709 2004-04-19 devnull beieeeftoa80(buf, sizeof(buf), reg);
341 564ca709 2004-04-19 devnull convflt(r, buf);
342 564ca709 2004-04-19 devnull break;
343 564ca709 2004-04-19 devnull case 'G':
344 4f2ac1b7 2005-01-23 devnull ret = get1(m, addr, (uchar*)buf, mach->szdouble);
345 564ca709 2004-04-19 devnull if (ret < 0)
346 564ca709 2004-04-19 devnull error("indir: %r");
347 564ca709 2004-04-19 devnull mach->ftoa64(buf, sizeof(buf), (void*) buf);
348 564ca709 2004-04-19 devnull r->type = TSTRING;
349 564ca709 2004-04-19 devnull r->store.u.string = strnode(buf);
350 564ca709 2004-04-19 devnull break;
351 564ca709 2004-04-19 devnull }
352 564ca709 2004-04-19 devnull }
353 564ca709 2004-04-19 devnull
354 564ca709 2004-04-19 devnull void
355 4f2ac1b7 2005-01-23 devnull indirreg(Regs *regs, char *name, char fmt, Node *r)
356 564ca709 2004-04-19 devnull {
357 443d6288 2012-02-19 rsc u64int val;
358 4f2ac1b7 2005-01-23 devnull
359 4f2ac1b7 2005-01-23 devnull if(regs == 0)
360 4f2ac1b7 2005-01-23 devnull error("no register set for *%s=", name);
361 4f2ac1b7 2005-01-23 devnull
362 4f2ac1b7 2005-01-23 devnull r->op = OCONST;
363 4f2ac1b7 2005-01-23 devnull r->store.fmt = fmt;
364 4f2ac1b7 2005-01-23 devnull switch(fmt){
365 4f2ac1b7 2005-01-23 devnull default:
366 4f2ac1b7 2005-01-23 devnull error("bad pointer format '%c' for *%s", fmt, name);
367 4f2ac1b7 2005-01-23 devnull case 'c':
368 4f2ac1b7 2005-01-23 devnull case 'C':
369 4f2ac1b7 2005-01-23 devnull case 'b':
370 4f2ac1b7 2005-01-23 devnull case 'x':
371 4f2ac1b7 2005-01-23 devnull case 'd':
372 4f2ac1b7 2005-01-23 devnull case 'u':
373 4f2ac1b7 2005-01-23 devnull case 'o':
374 4f2ac1b7 2005-01-23 devnull case 'q':
375 4f2ac1b7 2005-01-23 devnull case 'r':
376 4f2ac1b7 2005-01-23 devnull case 'a':
377 4f2ac1b7 2005-01-23 devnull case 'A':
378 4f2ac1b7 2005-01-23 devnull case 'B':
379 4f2ac1b7 2005-01-23 devnull case 'X':
380 4f2ac1b7 2005-01-23 devnull case 'D':
381 4f2ac1b7 2005-01-23 devnull case 'U':
382 4f2ac1b7 2005-01-23 devnull case 'O':
383 4f2ac1b7 2005-01-23 devnull case 'Q':
384 4f2ac1b7 2005-01-23 devnull case 'V':
385 4f2ac1b7 2005-01-23 devnull case 'W':
386 4f2ac1b7 2005-01-23 devnull case 'Y':
387 4f2ac1b7 2005-01-23 devnull case 'Z':
388 4f2ac1b7 2005-01-23 devnull if(rget(regs, name, &val) < 0)
389 4f2ac1b7 2005-01-23 devnull error("reading %s: %r", name);
390 4f2ac1b7 2005-01-23 devnull r->type = TINT;
391 4f2ac1b7 2005-01-23 devnull r->store.u.ival = val;
392 4f2ac1b7 2005-01-23 devnull break;
393 4f2ac1b7 2005-01-23 devnull case 'f':
394 4f2ac1b7 2005-01-23 devnull case 'g':
395 4f2ac1b7 2005-01-23 devnull case 'F':
396 4f2ac1b7 2005-01-23 devnull case '3':
397 4f2ac1b7 2005-01-23 devnull case '8':
398 4f2ac1b7 2005-01-23 devnull case 'G':
399 4f2ac1b7 2005-01-23 devnull error("floating point registers not supported");
400 4f2ac1b7 2005-01-23 devnull break;
401 4f2ac1b7 2005-01-23 devnull }
402 4f2ac1b7 2005-01-23 devnull }
403 4f2ac1b7 2005-01-23 devnull
404 4f2ac1b7 2005-01-23 devnull void
405 4f2ac1b7 2005-01-23 devnull windir(Map *m, Node aes, Node *rval, Node *r)
406 4f2ac1b7 2005-01-23 devnull {
407 564ca709 2004-04-19 devnull uchar cval;
408 564ca709 2004-04-19 devnull ushort sval;
409 4f2ac1b7 2005-01-23 devnull Node res;
410 564ca709 2004-04-19 devnull int ret;
411 564ca709 2004-04-19 devnull
412 564ca709 2004-04-19 devnull if(m == 0)
413 564ca709 2004-04-19 devnull error("no map for */@=");
414 564ca709 2004-04-19 devnull
415 564ca709 2004-04-19 devnull if(aes.type != TINT)
416 4f2ac1b7 2005-01-23 devnull error("bad type lhs of */@=");
417 564ca709 2004-04-19 devnull
418 4f2ac1b7 2005-01-23 devnull expr(rval, &res);
419 4f2ac1b7 2005-01-23 devnull
420 564ca709 2004-04-19 devnull if(m != cormap && wtflag == 0)
421 564ca709 2004-04-19 devnull error("not in write mode");
422 564ca709 2004-04-19 devnull
423 564ca709 2004-04-19 devnull r->type = res.type;
424 564ca709 2004-04-19 devnull r->store.fmt = res.store.fmt;
425 564ca709 2004-04-19 devnull r->store = res.store;
426 564ca709 2004-04-19 devnull
427 564ca709 2004-04-19 devnull switch(res.store.fmt) {
428 564ca709 2004-04-19 devnull default:
429 564ca709 2004-04-19 devnull error("bad pointer format '%c' for */@=", res.store.fmt);
430 564ca709 2004-04-19 devnull case 'c':
431 564ca709 2004-04-19 devnull case 'C':
432 564ca709 2004-04-19 devnull case 'b':
433 564ca709 2004-04-19 devnull cval = res.store.u.ival;
434 564ca709 2004-04-19 devnull ret = put1(m, aes.store.u.ival, &cval, 1);
435 564ca709 2004-04-19 devnull break;
436 564ca709 2004-04-19 devnull case 'r':
437 564ca709 2004-04-19 devnull case 'x':
438 564ca709 2004-04-19 devnull case 'd':
439 564ca709 2004-04-19 devnull case 'u':
440 564ca709 2004-04-19 devnull case 'o':
441 564ca709 2004-04-19 devnull sval = res.store.u.ival;
442 564ca709 2004-04-19 devnull ret = put2(m, aes.store.u.ival, sval);
443 564ca709 2004-04-19 devnull r->store.u.ival = sval;
444 564ca709 2004-04-19 devnull break;
445 564ca709 2004-04-19 devnull case 'a':
446 564ca709 2004-04-19 devnull case 'A':
447 564ca709 2004-04-19 devnull case 'B':
448 564ca709 2004-04-19 devnull case 'X':
449 564ca709 2004-04-19 devnull case 'D':
450 564ca709 2004-04-19 devnull case 'U':
451 564ca709 2004-04-19 devnull case 'O':
452 564ca709 2004-04-19 devnull ret = put4(m, aes.store.u.ival, res.store.u.ival);
453 564ca709 2004-04-19 devnull break;
454 564ca709 2004-04-19 devnull case 'V':
455 564ca709 2004-04-19 devnull case 'W':
456 564ca709 2004-04-19 devnull case 'Y':
457 564ca709 2004-04-19 devnull case 'Z':
458 564ca709 2004-04-19 devnull ret = put8(m, aes.store.u.ival, res.store.u.ival);
459 564ca709 2004-04-19 devnull break;
460 564ca709 2004-04-19 devnull case 's':
461 564ca709 2004-04-19 devnull case 'R':
462 564ca709 2004-04-19 devnull ret = put1(m, aes.store.u.ival, (uchar*)res.store.u.string->string, res.store.u.string->len);
463 564ca709 2004-04-19 devnull break;
464 564ca709 2004-04-19 devnull }
465 564ca709 2004-04-19 devnull if (ret < 0)
466 564ca709 2004-04-19 devnull error("windir: %r");
467 564ca709 2004-04-19 devnull }
468 564ca709 2004-04-19 devnull
469 564ca709 2004-04-19 devnull void
470 4f2ac1b7 2005-01-23 devnull windirreg(Regs *regs, char *name, Node *rval, Node *r)
471 4f2ac1b7 2005-01-23 devnull {
472 4f2ac1b7 2005-01-23 devnull Node res;
473 4f2ac1b7 2005-01-23 devnull
474 4f2ac1b7 2005-01-23 devnull if(regs == 0)
475 4f2ac1b7 2005-01-23 devnull error("no register set for *%s=", name);
476 4f2ac1b7 2005-01-23 devnull
477 4f2ac1b7 2005-01-23 devnull expr(rval, &res);
478 4f2ac1b7 2005-01-23 devnull
479 4f2ac1b7 2005-01-23 devnull r->type = res.type;
480 4f2ac1b7 2005-01-23 devnull r->store.fmt = res.store.fmt;
481 4f2ac1b7 2005-01-23 devnull r->store = res.store;
482 4f2ac1b7 2005-01-23 devnull
483 4f2ac1b7 2005-01-23 devnull switch(res.store.fmt){
484 4f2ac1b7 2005-01-23 devnull default:
485 4f2ac1b7 2005-01-23 devnull error("bad format '%c' for *%s=", res.store.fmt, name);
486 4f2ac1b7 2005-01-23 devnull case 'c':
487 4f2ac1b7 2005-01-23 devnull case 'C':
488 4f2ac1b7 2005-01-23 devnull case 'b':
489 4f2ac1b7 2005-01-23 devnull case 'x':
490 4f2ac1b7 2005-01-23 devnull case 'd':
491 4f2ac1b7 2005-01-23 devnull case 'u':
492 4f2ac1b7 2005-01-23 devnull case 'o':
493 4f2ac1b7 2005-01-23 devnull case 'q':
494 4f2ac1b7 2005-01-23 devnull case 'r':
495 4f2ac1b7 2005-01-23 devnull case 'a':
496 4f2ac1b7 2005-01-23 devnull case 'A':
497 4f2ac1b7 2005-01-23 devnull case 'B':
498 4f2ac1b7 2005-01-23 devnull case 'X':
499 4f2ac1b7 2005-01-23 devnull case 'D':
500 4f2ac1b7 2005-01-23 devnull case 'U':
501 4f2ac1b7 2005-01-23 devnull case 'O':
502 4f2ac1b7 2005-01-23 devnull case 'Q':
503 4f2ac1b7 2005-01-23 devnull case 'V':
504 4f2ac1b7 2005-01-23 devnull case 'W':
505 4f2ac1b7 2005-01-23 devnull case 'Y':
506 4f2ac1b7 2005-01-23 devnull case 'Z':
507 4f2ac1b7 2005-01-23 devnull if(rput(regs, name, res.store.u.ival) < 0)
508 4f2ac1b7 2005-01-23 devnull error("writing %s: %r", name);
509 4f2ac1b7 2005-01-23 devnull break;
510 4f2ac1b7 2005-01-23 devnull case 'f':
511 4f2ac1b7 2005-01-23 devnull case 'g':
512 4f2ac1b7 2005-01-23 devnull case 'F':
513 4f2ac1b7 2005-01-23 devnull case '3':
514 4f2ac1b7 2005-01-23 devnull case '8':
515 4f2ac1b7 2005-01-23 devnull case 'G':
516 4f2ac1b7 2005-01-23 devnull error("floating point registers not supported");
517 4f2ac1b7 2005-01-23 devnull break;
518 4f2ac1b7 2005-01-23 devnull }
519 4f2ac1b7 2005-01-23 devnull }
520 4f2ac1b7 2005-01-23 devnull
521 4f2ac1b7 2005-01-23 devnull void
522 564ca709 2004-04-19 devnull call(char *fn, Node *parameters, Node *local, Node *body, Node *retexp)
523 564ca709 2004-04-19 devnull {
524 564ca709 2004-04-19 devnull int np, i;
525 564ca709 2004-04-19 devnull Rplace rlab;
526 564ca709 2004-04-19 devnull Node *n, res;
527 564ca709 2004-04-19 devnull Value *v, *f;
528 564ca709 2004-04-19 devnull Lsym *s, *next;
529 564ca709 2004-04-19 devnull Node *avp[Maxarg], *ava[Maxarg];
530 564ca709 2004-04-19 devnull
531 564ca709 2004-04-19 devnull rlab.local = 0;
532 564ca709 2004-04-19 devnull
533 564ca709 2004-04-19 devnull na = 0;
534 564ca709 2004-04-19 devnull flatten(avp, parameters);
535 564ca709 2004-04-19 devnull np = na;
536 564ca709 2004-04-19 devnull na = 0;
537 564ca709 2004-04-19 devnull flatten(ava, local);
538 564ca709 2004-04-19 devnull if(np != na) {
539 564ca709 2004-04-19 devnull if(np < na)
540 564ca709 2004-04-19 devnull error("%s: too few arguments", fn);
541 564ca709 2004-04-19 devnull error("%s: too many arguments", fn);
542 564ca709 2004-04-19 devnull }
543 564ca709 2004-04-19 devnull
544 564ca709 2004-04-19 devnull rlab.tail = &rlab.local;
545 564ca709 2004-04-19 devnull
546 564ca709 2004-04-19 devnull ret = &rlab;
547 564ca709 2004-04-19 devnull for(i = 0; i < np; i++) {
548 564ca709 2004-04-19 devnull n = ava[i];
549 564ca709 2004-04-19 devnull switch(n->op) {
550 564ca709 2004-04-19 devnull default:
551 564ca709 2004-04-19 devnull error("%s: %d formal not a name", fn, i);
552 564ca709 2004-04-19 devnull case ONAME:
553 564ca709 2004-04-19 devnull expr(avp[i], &res);
554 564ca709 2004-04-19 devnull s = n->sym;
555 564ca709 2004-04-19 devnull break;
556 564ca709 2004-04-19 devnull case OINDM:
557 564ca709 2004-04-19 devnull res.store.u.cc = avp[i];
558 564ca709 2004-04-19 devnull res.type = TCODE;
559 564ca709 2004-04-19 devnull res.store.comt = 0;
560 564ca709 2004-04-19 devnull if(n->left->op != ONAME)
561 564ca709 2004-04-19 devnull error("%s: %d formal not a name", fn, i);
562 564ca709 2004-04-19 devnull s = n->left->sym;
563 564ca709 2004-04-19 devnull break;
564 564ca709 2004-04-19 devnull }
565 564ca709 2004-04-19 devnull if(s->v->ret == ret)
566 564ca709 2004-04-19 devnull error("%s already declared at this scope", s->name);
567 564ca709 2004-04-19 devnull
568 564ca709 2004-04-19 devnull v = gmalloc(sizeof(Value));
569 564ca709 2004-04-19 devnull v->ret = ret;
570 564ca709 2004-04-19 devnull v->pop = s->v;
571 564ca709 2004-04-19 devnull s->v = v;
572 564ca709 2004-04-19 devnull v->scope = 0;
573 564ca709 2004-04-19 devnull *(rlab.tail) = s;
574 564ca709 2004-04-19 devnull rlab.tail = &v->scope;
575 564ca709 2004-04-19 devnull
576 564ca709 2004-04-19 devnull v->store = res.store;
577 564ca709 2004-04-19 devnull v->type = res.type;
578 564ca709 2004-04-19 devnull v->set = 1;
579 564ca709 2004-04-19 devnull }
580 564ca709 2004-04-19 devnull
581 564ca709 2004-04-19 devnull ret->val = retexp;
582 564ca709 2004-04-19 devnull if(setjmp(rlab.rlab) == 0)
583 564ca709 2004-04-19 devnull execute(body);
584 564ca709 2004-04-19 devnull
585 564ca709 2004-04-19 devnull for(s = rlab.local; s; s = next) {
586 564ca709 2004-04-19 devnull f = s->v;
587 564ca709 2004-04-19 devnull next = f->scope;
588 564ca709 2004-04-19 devnull s->v = f->pop;
589 564ca709 2004-04-19 devnull free(f);
590 564ca709 2004-04-19 devnull }
591 564ca709 2004-04-19 devnull }