1 c5b9ff9f 2003-12-04 devnull #include <u.h>
2 c5b9ff9f 2003-12-04 devnull #include <libc.h>
3 c5b9ff9f 2003-12-04 devnull #include <bio.h>
4 c5b9ff9f 2003-12-04 devnull #include "hoc.h"
5 c5b9ff9f 2003-12-04 devnull #include "y.tab.h"
7 c5b9ff9f 2003-12-04 devnull #define NSTACK 256
9 c5b9ff9f 2003-12-04 devnull static Datum stack[NSTACK]; /* the stack */
10 c5b9ff9f 2003-12-04 devnull static Datum *stackp; /* next free spot on stack */
12 c5b9ff9f 2003-12-04 devnull #define NPROG 2000
13 c5b9ff9f 2003-12-04 devnull Inst prog[NPROG]; /* the machine */
14 c5b9ff9f 2003-12-04 devnull Inst *progp; /* next free spot for code generation */
15 c5b9ff9f 2003-12-04 devnull Inst *pc; /* program counter during execution */
16 c5b9ff9f 2003-12-04 devnull Inst *progbase = prog; /* start of current subprogram */
17 c5b9ff9f 2003-12-04 devnull int returning; /* 1 if return stmt seen */
18 c5b9ff9f 2003-12-04 devnull int indef; /* 1 if parsing a func or proc */
20 c5b9ff9f 2003-12-04 devnull typedef struct Frame { /* proc/func call stack frame */
21 c5b9ff9f 2003-12-04 devnull Symbol *sp; /* symbol table entry */
22 c5b9ff9f 2003-12-04 devnull Inst *retpc; /* where to resume after return */
23 c5b9ff9f 2003-12-04 devnull Datum *argn; /* n-th argument on stack */
24 c5b9ff9f 2003-12-04 devnull int nargs; /* number of arguments */
26 c5b9ff9f 2003-12-04 devnull #define NFRAME 100
27 c5b9ff9f 2003-12-04 devnull Frame frame[NFRAME];
28 c5b9ff9f 2003-12-04 devnull Frame *fp; /* frame pointer */
31 c5b9ff9f 2003-12-04 devnull initcode(void)
33 c5b9ff9f 2003-12-04 devnull progp = progbase;
34 c5b9ff9f 2003-12-04 devnull stackp = stack;
35 c5b9ff9f 2003-12-04 devnull fp = frame;
36 c5b9ff9f 2003-12-04 devnull returning = 0;
37 c5b9ff9f 2003-12-04 devnull indef = 0;
41 c5b9ff9f 2003-12-04 devnull push(Datum d)
43 c5b9ff9f 2003-12-04 devnull if (stackp >= &stack[NSTACK])
44 c5b9ff9f 2003-12-04 devnull execerror("stack too deep", 0);
45 c5b9ff9f 2003-12-04 devnull *stackp++ = d;
49 c5b9ff9f 2003-12-04 devnull pop(void)
51 c5b9ff9f 2003-12-04 devnull if (stackp == stack)
52 c5b9ff9f 2003-12-04 devnull execerror("stack underflow", 0);
53 c5b9ff9f 2003-12-04 devnull return *--stackp;
57 c5b9ff9f 2003-12-04 devnull xpop(void) /* for when no value is wanted */
59 c5b9ff9f 2003-12-04 devnull if (stackp == stack)
60 c5b9ff9f 2003-12-04 devnull execerror("stack underflow", (char *)0);
61 c5b9ff9f 2003-12-04 devnull --stackp;
65 c5b9ff9f 2003-12-04 devnull constpush(void)
68 c5b9ff9f 2003-12-04 devnull d.val = ((Symbol *)*pc++)->u.val;
73 c5b9ff9f 2003-12-04 devnull varpush(void)
76 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
81 c5b9ff9f 2003-12-04 devnull whilecode(void)
84 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
86 c5b9ff9f 2003-12-04 devnull execute(savepc+2); /* condition */
87 c5b9ff9f 2003-12-04 devnull d = pop();
88 c5b9ff9f 2003-12-04 devnull while (d.val) {
89 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* body */
90 c5b9ff9f 2003-12-04 devnull if (returning)
92 c5b9ff9f 2003-12-04 devnull execute(savepc+2); /* condition */
93 c5b9ff9f 2003-12-04 devnull d = pop();
95 c5b9ff9f 2003-12-04 devnull if (!returning)
96 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+1)); /* next stmt */
100 c5b9ff9f 2003-12-04 devnull forcode(void)
102 c5b9ff9f 2003-12-04 devnull Datum d;
103 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
105 c5b9ff9f 2003-12-04 devnull execute(savepc+4); /* precharge */
107 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* condition */
108 c5b9ff9f 2003-12-04 devnull d = pop();
109 c5b9ff9f 2003-12-04 devnull while (d.val) {
110 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+2))); /* body */
111 c5b9ff9f 2003-12-04 devnull if (returning)
113 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+1))); /* post loop */
115 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* condition */
116 c5b9ff9f 2003-12-04 devnull d = pop();
118 c5b9ff9f 2003-12-04 devnull if (!returning)
119 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+3)); /* next stmt */
123 c5b9ff9f 2003-12-04 devnull ifcode(void)
125 c5b9ff9f 2003-12-04 devnull Datum d;
126 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc; /* then part */
128 c5b9ff9f 2003-12-04 devnull execute(savepc+3); /* condition */
129 c5b9ff9f 2003-12-04 devnull d = pop();
130 c5b9ff9f 2003-12-04 devnull if (d.val)
131 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc)));
132 c5b9ff9f 2003-12-04 devnull else if (*((Inst **)(savepc+1))) /* else part? */
133 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+1)));
134 c5b9ff9f 2003-12-04 devnull if (!returning)
135 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+2)); /* next stmt */
139 c5b9ff9f 2003-12-04 devnull define(Symbol* sp, Formal *f) /* put func/proc in symbol table */
141 c5b9ff9f 2003-12-04 devnull Fndefn *fd;
144 c5b9ff9f 2003-12-04 devnull fd = emalloc(sizeof(Fndefn));
145 c5b9ff9f 2003-12-04 devnull fd->code = progbase; /* start of code */
146 c5b9ff9f 2003-12-04 devnull progbase = progp; /* next code starts here */
147 c5b9ff9f 2003-12-04 devnull fd->formals = f;
148 c5b9ff9f 2003-12-04 devnull for(n=0; f; f=f->next)
150 c5b9ff9f 2003-12-04 devnull fd->nargs = n;
151 c5b9ff9f 2003-12-04 devnull sp->u.defn = fd;
155 c5b9ff9f 2003-12-04 devnull call(void) /* call a function */
157 c5b9ff9f 2003-12-04 devnull Formal *f;
158 c5b9ff9f 2003-12-04 devnull Datum *arg;
159 c5b9ff9f 2003-12-04 devnull Saveval *s;
162 c5b9ff9f 2003-12-04 devnull Symbol *sp = (Symbol *)pc[0]; /* symbol table entry */
163 c5b9ff9f 2003-12-04 devnull /* for function */
164 c5b9ff9f 2003-12-04 devnull if (fp >= &frame[NFRAME])
165 c5b9ff9f 2003-12-04 devnull execerror(sp->name, "call nested too deeply");
167 c5b9ff9f 2003-12-04 devnull fp->sp = sp;
168 c5b9ff9f 2003-12-04 devnull fp->nargs = (int)pc[1];
169 c5b9ff9f 2003-12-04 devnull fp->retpc = pc + 2;
170 c5b9ff9f 2003-12-04 devnull fp->argn = stackp - 1; /* last argument */
171 c5b9ff9f 2003-12-04 devnull if(fp->nargs != sp->u.defn->nargs)
172 c5b9ff9f 2003-12-04 devnull execerror(sp->name, "called with wrong number of arguments");
173 c5b9ff9f 2003-12-04 devnull /* bind formals */
174 c5b9ff9f 2003-12-04 devnull f = sp->u.defn->formals;
175 c5b9ff9f 2003-12-04 devnull arg = stackp - fp->nargs;
176 c5b9ff9f 2003-12-04 devnull while(f){
177 c5b9ff9f 2003-12-04 devnull s = emalloc(sizeof(Saveval));
178 c5b9ff9f 2003-12-04 devnull s->val = f->sym->u;
179 c5b9ff9f 2003-12-04 devnull s->type = f->sym->type;
180 c5b9ff9f 2003-12-04 devnull s->next = f->save;
181 c5b9ff9f 2003-12-04 devnull f->save = s;
182 c5b9ff9f 2003-12-04 devnull f->sym->u.val = arg->val;
183 c5b9ff9f 2003-12-04 devnull f->sym->type = VAR;
184 c5b9ff9f 2003-12-04 devnull f = f->next;
187 c5b9ff9f 2003-12-04 devnull for (i = 0; i < fp->nargs; i++)
188 c5b9ff9f 2003-12-04 devnull pop(); /* pop arguments; no longer needed */
189 c5b9ff9f 2003-12-04 devnull execute(sp->u.defn->code);
190 c5b9ff9f 2003-12-04 devnull returning = 0;
194 c5b9ff9f 2003-12-04 devnull restore(Symbol *sp) /* restore formals associated with symbol */
196 c5b9ff9f 2003-12-04 devnull Formal *f;
197 c5b9ff9f 2003-12-04 devnull Saveval *s;
199 c5b9ff9f 2003-12-04 devnull f = sp->u.defn->formals;
200 c5b9ff9f 2003-12-04 devnull while(f){
201 c5b9ff9f 2003-12-04 devnull s = f->save;
202 c5b9ff9f 2003-12-04 devnull if(s == 0) /* more actuals than formals */
204 c5b9ff9f 2003-12-04 devnull f->sym->u = s->val;
205 c5b9ff9f 2003-12-04 devnull f->sym->type = s->type;
206 c5b9ff9f 2003-12-04 devnull f->save = s->next;
207 c5b9ff9f 2003-12-04 devnull free(s);
208 c5b9ff9f 2003-12-04 devnull f = f->next;
213 c5b9ff9f 2003-12-04 devnull restoreall(void) /* restore all variables in case of error */
215 c5b9ff9f 2003-12-04 devnull while(fp>=frame && fp->sp){
216 c5b9ff9f 2003-12-04 devnull restore(fp->sp);
219 c5b9ff9f 2003-12-04 devnull fp = frame;
222 c5b9ff9f 2003-12-04 devnull static void
223 c5b9ff9f 2003-12-04 devnull ret(void) /* common return from func or proc */
225 c5b9ff9f 2003-12-04 devnull /* restore formals */
226 c5b9ff9f 2003-12-04 devnull restore(fp->sp);
227 c5b9ff9f 2003-12-04 devnull pc = (Inst *)fp->retpc;
229 c5b9ff9f 2003-12-04 devnull returning = 1;
233 c5b9ff9f 2003-12-04 devnull funcret(void) /* return from a function */
235 c5b9ff9f 2003-12-04 devnull Datum d;
236 c5b9ff9f 2003-12-04 devnull if (fp->sp->type == PROCEDURE)
237 c5b9ff9f 2003-12-04 devnull execerror(fp->sp->name, "(proc) returns value");
238 c5b9ff9f 2003-12-04 devnull d = pop(); /* preserve function return value */
240 c5b9ff9f 2003-12-04 devnull push(d);
244 c5b9ff9f 2003-12-04 devnull procret(void) /* return from a procedure */
246 c5b9ff9f 2003-12-04 devnull if (fp->sp->type == FUNCTION)
247 c5b9ff9f 2003-12-04 devnull execerror(fp->sp->name,
248 c5b9ff9f 2003-12-04 devnull "(func) returns no value");
253 c5b9ff9f 2003-12-04 devnull bltin(void)
256 c5b9ff9f 2003-12-04 devnull Datum d;
257 c5b9ff9f 2003-12-04 devnull d = pop();
258 c5b9ff9f 2003-12-04 devnull d.val = (*(double (*)(double))*pc++)(d.val);
259 c5b9ff9f 2003-12-04 devnull push(d);
263 c5b9ff9f 2003-12-04 devnull add(void)
265 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
266 c5b9ff9f 2003-12-04 devnull d2 = pop();
267 c5b9ff9f 2003-12-04 devnull d1 = pop();
268 c5b9ff9f 2003-12-04 devnull d1.val += d2.val;
269 c5b9ff9f 2003-12-04 devnull push(d1);
273 c5b9ff9f 2003-12-04 devnull sub(void)
275 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
276 c5b9ff9f 2003-12-04 devnull d2 = pop();
277 c5b9ff9f 2003-12-04 devnull d1 = pop();
278 c5b9ff9f 2003-12-04 devnull d1.val -= d2.val;
279 c5b9ff9f 2003-12-04 devnull push(d1);
283 c5b9ff9f 2003-12-04 devnull mul(void)
285 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
286 c5b9ff9f 2003-12-04 devnull d2 = pop();
287 c5b9ff9f 2003-12-04 devnull d1 = pop();
288 c5b9ff9f 2003-12-04 devnull d1.val *= d2.val;
289 c5b9ff9f 2003-12-04 devnull push(d1);
293 c5b9ff9f 2003-12-04 devnull div(void)
295 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
296 c5b9ff9f 2003-12-04 devnull d2 = pop();
297 c5b9ff9f 2003-12-04 devnull if (d2.val == 0.0)
298 c5b9ff9f 2003-12-04 devnull execerror("division by zero", (char *)0);
299 c5b9ff9f 2003-12-04 devnull d1 = pop();
300 c5b9ff9f 2003-12-04 devnull d1.val /= d2.val;
301 c5b9ff9f 2003-12-04 devnull push(d1);
305 c5b9ff9f 2003-12-04 devnull mod(void)
307 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
308 c5b9ff9f 2003-12-04 devnull d2 = pop();
309 c5b9ff9f 2003-12-04 devnull if (d2.val == 0.0)
310 c5b9ff9f 2003-12-04 devnull execerror("division by zero", (char *)0);
311 c5b9ff9f 2003-12-04 devnull d1 = pop();
312 c5b9ff9f 2003-12-04 devnull /* d1.val %= d2.val; */
313 c5b9ff9f 2003-12-04 devnull d1.val = fmod(d1.val, d2.val);
314 c5b9ff9f 2003-12-04 devnull push(d1);
318 c5b9ff9f 2003-12-04 devnull negate(void)
320 c5b9ff9f 2003-12-04 devnull Datum d;
321 c5b9ff9f 2003-12-04 devnull d = pop();
322 c5b9ff9f 2003-12-04 devnull d.val = -d.val;
323 c5b9ff9f 2003-12-04 devnull push(d);
327 c5b9ff9f 2003-12-04 devnull verify(Symbol* s)
329 c5b9ff9f 2003-12-04 devnull if (s->type != VAR && s->type != UNDEF)
330 c5b9ff9f 2003-12-04 devnull execerror("attempt to evaluate non-variable", s->name);
331 c5b9ff9f 2003-12-04 devnull if (s->type == UNDEF)
332 c5b9ff9f 2003-12-04 devnull execerror("undefined variable", s->name);
336 c5b9ff9f 2003-12-04 devnull eval(void) /* evaluate variable on stack */
338 c5b9ff9f 2003-12-04 devnull Datum d;
339 c5b9ff9f 2003-12-04 devnull d = pop();
340 c5b9ff9f 2003-12-04 devnull verify(d.sym);
341 c5b9ff9f 2003-12-04 devnull d.val = d.sym->u.val;
342 c5b9ff9f 2003-12-04 devnull push(d);
346 c5b9ff9f 2003-12-04 devnull preinc(void)
348 c5b9ff9f 2003-12-04 devnull Datum d;
349 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
350 c5b9ff9f 2003-12-04 devnull verify(d.sym);
351 c5b9ff9f 2003-12-04 devnull d.val = d.sym->u.val += 1.0;
352 c5b9ff9f 2003-12-04 devnull push(d);
356 c5b9ff9f 2003-12-04 devnull predec(void)
358 c5b9ff9f 2003-12-04 devnull Datum d;
359 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
360 c5b9ff9f 2003-12-04 devnull verify(d.sym);
361 c5b9ff9f 2003-12-04 devnull d.val = d.sym->u.val -= 1.0;
362 c5b9ff9f 2003-12-04 devnull push(d);
366 c5b9ff9f 2003-12-04 devnull postinc(void)
368 c5b9ff9f 2003-12-04 devnull Datum d;
369 c5b9ff9f 2003-12-04 devnull double v;
370 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
371 c5b9ff9f 2003-12-04 devnull verify(d.sym);
372 c5b9ff9f 2003-12-04 devnull v = d.sym->u.val;
373 c5b9ff9f 2003-12-04 devnull d.sym->u.val += 1.0;
374 c5b9ff9f 2003-12-04 devnull d.val = v;
375 c5b9ff9f 2003-12-04 devnull push(d);
379 c5b9ff9f 2003-12-04 devnull postdec(void)
381 c5b9ff9f 2003-12-04 devnull Datum d;
382 c5b9ff9f 2003-12-04 devnull double v;
383 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
384 c5b9ff9f 2003-12-04 devnull verify(d.sym);
385 c5b9ff9f 2003-12-04 devnull v = d.sym->u.val;
386 c5b9ff9f 2003-12-04 devnull d.sym->u.val -= 1.0;
387 c5b9ff9f 2003-12-04 devnull d.val = v;
388 c5b9ff9f 2003-12-04 devnull push(d);
392 c5b9ff9f 2003-12-04 devnull gt(void)
394 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
395 c5b9ff9f 2003-12-04 devnull d2 = pop();
396 c5b9ff9f 2003-12-04 devnull d1 = pop();
397 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val > d2.val);
398 c5b9ff9f 2003-12-04 devnull push(d1);
402 c5b9ff9f 2003-12-04 devnull lt(void)
404 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
405 c5b9ff9f 2003-12-04 devnull d2 = pop();
406 c5b9ff9f 2003-12-04 devnull d1 = pop();
407 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val < d2.val);
408 c5b9ff9f 2003-12-04 devnull push(d1);
412 c5b9ff9f 2003-12-04 devnull ge(void)
414 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
415 c5b9ff9f 2003-12-04 devnull d2 = pop();
416 c5b9ff9f 2003-12-04 devnull d1 = pop();
417 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val >= d2.val);
418 c5b9ff9f 2003-12-04 devnull push(d1);
422 c5b9ff9f 2003-12-04 devnull le(void)
424 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
425 c5b9ff9f 2003-12-04 devnull d2 = pop();
426 c5b9ff9f 2003-12-04 devnull d1 = pop();
427 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val <= d2.val);
428 c5b9ff9f 2003-12-04 devnull push(d1);
432 c5b9ff9f 2003-12-04 devnull eq(void)
434 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
435 c5b9ff9f 2003-12-04 devnull d2 = pop();
436 c5b9ff9f 2003-12-04 devnull d1 = pop();
437 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val == d2.val);
438 c5b9ff9f 2003-12-04 devnull push(d1);
442 c5b9ff9f 2003-12-04 devnull ne(void)
444 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
445 c5b9ff9f 2003-12-04 devnull d2 = pop();
446 c5b9ff9f 2003-12-04 devnull d1 = pop();
447 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val != d2.val);
448 c5b9ff9f 2003-12-04 devnull push(d1);
452 c5b9ff9f 2003-12-04 devnull and(void)
454 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
455 c5b9ff9f 2003-12-04 devnull d2 = pop();
456 c5b9ff9f 2003-12-04 devnull d1 = pop();
457 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val != 0.0 && d2.val != 0.0);
458 c5b9ff9f 2003-12-04 devnull push(d1);
462 c5b9ff9f 2003-12-04 devnull or(void)
464 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
465 c5b9ff9f 2003-12-04 devnull d2 = pop();
466 c5b9ff9f 2003-12-04 devnull d1 = pop();
467 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val != 0.0 || d2.val != 0.0);
468 c5b9ff9f 2003-12-04 devnull push(d1);
472 c5b9ff9f 2003-12-04 devnull not(void)
474 c5b9ff9f 2003-12-04 devnull Datum d;
475 c5b9ff9f 2003-12-04 devnull d = pop();
476 c5b9ff9f 2003-12-04 devnull d.val = (double)(d.val == 0.0);
477 c5b9ff9f 2003-12-04 devnull push(d);
481 c5b9ff9f 2003-12-04 devnull power(void)
483 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
484 c5b9ff9f 2003-12-04 devnull d2 = pop();
485 c5b9ff9f 2003-12-04 devnull d1 = pop();
486 c5b9ff9f 2003-12-04 devnull d1.val = Pow(d1.val, d2.val);
487 c5b9ff9f 2003-12-04 devnull push(d1);
491 c5b9ff9f 2003-12-04 devnull assign(void)
493 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
494 c5b9ff9f 2003-12-04 devnull d1 = pop();
495 c5b9ff9f 2003-12-04 devnull d2 = pop();
496 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
497 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
498 c5b9ff9f 2003-12-04 devnull d1.sym->name);
499 c5b9ff9f 2003-12-04 devnull d1.sym->u.val = d2.val;
500 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
501 c5b9ff9f 2003-12-04 devnull push(d2);
505 c5b9ff9f 2003-12-04 devnull addeq(void)
507 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
508 c5b9ff9f 2003-12-04 devnull d1 = pop();
509 c5b9ff9f 2003-12-04 devnull d2 = pop();
510 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
511 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
512 c5b9ff9f 2003-12-04 devnull d1.sym->name);
513 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val += d2.val;
514 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
515 c5b9ff9f 2003-12-04 devnull push(d2);
519 c5b9ff9f 2003-12-04 devnull subeq(void)
521 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
522 c5b9ff9f 2003-12-04 devnull d1 = pop();
523 c5b9ff9f 2003-12-04 devnull d2 = pop();
524 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
525 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
526 c5b9ff9f 2003-12-04 devnull d1.sym->name);
527 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val -= d2.val;
528 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
529 c5b9ff9f 2003-12-04 devnull push(d2);
533 c5b9ff9f 2003-12-04 devnull muleq(void)
535 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
536 c5b9ff9f 2003-12-04 devnull d1 = pop();
537 c5b9ff9f 2003-12-04 devnull d2 = pop();
538 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
539 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
540 c5b9ff9f 2003-12-04 devnull d1.sym->name);
541 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val *= d2.val;
542 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
543 c5b9ff9f 2003-12-04 devnull push(d2);
547 c5b9ff9f 2003-12-04 devnull diveq(void)
549 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
550 c5b9ff9f 2003-12-04 devnull d1 = pop();
551 c5b9ff9f 2003-12-04 devnull d2 = pop();
552 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
553 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
554 c5b9ff9f 2003-12-04 devnull d1.sym->name);
555 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val /= d2.val;
556 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
557 c5b9ff9f 2003-12-04 devnull push(d2);
561 c5b9ff9f 2003-12-04 devnull modeq(void)
563 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
565 c5b9ff9f 2003-12-04 devnull d1 = pop();
566 c5b9ff9f 2003-12-04 devnull d2 = pop();
567 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
568 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
569 c5b9ff9f 2003-12-04 devnull d1.sym->name);
570 c5b9ff9f 2003-12-04 devnull /* d2.val = d1.sym->u.val %= d2.val; */
571 c5b9ff9f 2003-12-04 devnull x = d1.sym->u.val;
572 c5b9ff9f 2003-12-04 devnull x %= (long) d2.val;
573 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val = x;
574 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
575 c5b9ff9f 2003-12-04 devnull push(d2);
579 c5b9ff9f 2003-12-04 devnull printtop(void) /* pop top value from stack, print it */
581 c5b9ff9f 2003-12-04 devnull Datum d;
582 c5b9ff9f 2003-12-04 devnull static Symbol *s; /* last value computed */
583 c5b9ff9f 2003-12-04 devnull if (s == 0)
584 c5b9ff9f 2003-12-04 devnull s = install("_", VAR, 0.0);
585 c5b9ff9f 2003-12-04 devnull d = pop();
586 c5b9ff9f 2003-12-04 devnull print("%.12g\n", d.val);
587 c5b9ff9f 2003-12-04 devnull s->u.val = d.val;
591 c5b9ff9f 2003-12-04 devnull prexpr(void) /* print numeric value */
593 c5b9ff9f 2003-12-04 devnull Datum d;
594 c5b9ff9f 2003-12-04 devnull d = pop();
595 c5b9ff9f 2003-12-04 devnull print("%.12g ", d.val);
599 c5b9ff9f 2003-12-04 devnull prstr(void) /* print string value */
601 c5b9ff9f 2003-12-04 devnull print("%s", (char *) *pc++);
605 c5b9ff9f 2003-12-04 devnull varread(void) /* read into variable */
607 c5b9ff9f 2003-12-04 devnull Datum d;
608 c5b9ff9f 2003-12-04 devnull extern Biobuf *bin;
609 c5b9ff9f 2003-12-04 devnull Symbol *var = (Symbol *) *pc++;
614 c5b9ff9f 2003-12-04 devnull c = Bgetc(bin);
615 c5b9ff9f 2003-12-04 devnull while(c==' ' || c=='\t');
616 c5b9ff9f 2003-12-04 devnull if(c == Beof){
618 c5b9ff9f 2003-12-04 devnull if(moreinput())
619 c5b9ff9f 2003-12-04 devnull goto Again;
620 c5b9ff9f 2003-12-04 devnull d.val = var->u.val = 0.0;
621 c5b9ff9f 2003-12-04 devnull goto Return;
624 c5b9ff9f 2003-12-04 devnull if(strchr("+-.0123456789", c) == 0)
625 c5b9ff9f 2003-12-04 devnull execerror("non-number read into", var->name);
626 c5b9ff9f 2003-12-04 devnull Bungetc(bin);
627 c5b9ff9f 2003-12-04 devnull if(Bgetd(bin, &var->u.val) == Beof)
628 c5b9ff9f 2003-12-04 devnull goto Iseof;
630 c5b9ff9f 2003-12-04 devnull d.val = 1.0;
632 c5b9ff9f 2003-12-04 devnull var->type = VAR;
633 c5b9ff9f 2003-12-04 devnull push(d);
637 c5b9ff9f 2003-12-04 devnull code(Inst f) /* install one instruction or operand */
639 c5b9ff9f 2003-12-04 devnull Inst *oprogp = progp;
640 c5b9ff9f 2003-12-04 devnull if (progp >= &prog[NPROG])
641 c5b9ff9f 2003-12-04 devnull execerror("program too big", (char *)0);
642 c5b9ff9f 2003-12-04 devnull *progp++ = f;
643 c5b9ff9f 2003-12-04 devnull return oprogp;
647 c5b9ff9f 2003-12-04 devnull execute(Inst* p)
649 c5b9ff9f 2003-12-04 devnull for (pc = p; *pc != STOP && !returning; )
650 c5b9ff9f 2003-12-04 devnull (*((++pc)[-1]))();