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 d21d62e2 2004-02-29 devnull nop(void)
46 c5b9ff9f 2003-12-04 devnull push(Datum d)
48 c5b9ff9f 2003-12-04 devnull if (stackp >= &stack[NSTACK])
49 c5b9ff9f 2003-12-04 devnull execerror("stack too deep", 0);
50 c5b9ff9f 2003-12-04 devnull *stackp++ = d;
54 c5b9ff9f 2003-12-04 devnull pop(void)
56 c5b9ff9f 2003-12-04 devnull if (stackp == stack)
57 c5b9ff9f 2003-12-04 devnull execerror("stack underflow", 0);
58 c5b9ff9f 2003-12-04 devnull return *--stackp;
62 c5b9ff9f 2003-12-04 devnull xpop(void) /* for when no value is wanted */
64 c5b9ff9f 2003-12-04 devnull if (stackp == stack)
65 c5b9ff9f 2003-12-04 devnull execerror("stack underflow", (char *)0);
66 c5b9ff9f 2003-12-04 devnull --stackp;
70 c5b9ff9f 2003-12-04 devnull constpush(void)
73 c5b9ff9f 2003-12-04 devnull d.val = ((Symbol *)*pc++)->u.val;
78 c5b9ff9f 2003-12-04 devnull varpush(void)
81 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
86 c5b9ff9f 2003-12-04 devnull whilecode(void)
89 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
91 c5b9ff9f 2003-12-04 devnull execute(savepc+2); /* condition */
92 c5b9ff9f 2003-12-04 devnull d = pop();
93 c5b9ff9f 2003-12-04 devnull while (d.val) {
94 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* body */
95 c5b9ff9f 2003-12-04 devnull if (returning)
97 c5b9ff9f 2003-12-04 devnull execute(savepc+2); /* condition */
98 c5b9ff9f 2003-12-04 devnull d = pop();
100 c5b9ff9f 2003-12-04 devnull if (!returning)
101 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+1)); /* next stmt */
105 c5b9ff9f 2003-12-04 devnull forcode(void)
107 c5b9ff9f 2003-12-04 devnull Datum d;
108 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
110 c5b9ff9f 2003-12-04 devnull execute(savepc+4); /* precharge */
112 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* condition */
113 c5b9ff9f 2003-12-04 devnull d = pop();
114 c5b9ff9f 2003-12-04 devnull while (d.val) {
115 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+2))); /* body */
116 c5b9ff9f 2003-12-04 devnull if (returning)
118 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+1))); /* post loop */
120 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* condition */
121 c5b9ff9f 2003-12-04 devnull d = pop();
123 c5b9ff9f 2003-12-04 devnull if (!returning)
124 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+3)); /* next stmt */
128 c5b9ff9f 2003-12-04 devnull ifcode(void)
130 c5b9ff9f 2003-12-04 devnull Datum d;
131 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc; /* then part */
133 c5b9ff9f 2003-12-04 devnull execute(savepc+3); /* condition */
134 c5b9ff9f 2003-12-04 devnull d = pop();
135 c5b9ff9f 2003-12-04 devnull if (d.val)
136 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc)));
137 c5b9ff9f 2003-12-04 devnull else if (*((Inst **)(savepc+1))) /* else part? */
138 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+1)));
139 c5b9ff9f 2003-12-04 devnull if (!returning)
140 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+2)); /* next stmt */
144 c5b9ff9f 2003-12-04 devnull define(Symbol* sp, Formal *f) /* put func/proc in symbol table */
146 c5b9ff9f 2003-12-04 devnull Fndefn *fd;
149 c5b9ff9f 2003-12-04 devnull fd = emalloc(sizeof(Fndefn));
150 c5b9ff9f 2003-12-04 devnull fd->code = progbase; /* start of code */
151 c5b9ff9f 2003-12-04 devnull progbase = progp; /* next code starts here */
152 c5b9ff9f 2003-12-04 devnull fd->formals = f;
153 c5b9ff9f 2003-12-04 devnull for(n=0; f; f=f->next)
155 c5b9ff9f 2003-12-04 devnull fd->nargs = n;
156 c5b9ff9f 2003-12-04 devnull sp->u.defn = fd;
160 c5b9ff9f 2003-12-04 devnull call(void) /* call a function */
162 c5b9ff9f 2003-12-04 devnull Formal *f;
163 c5b9ff9f 2003-12-04 devnull Datum *arg;
164 c5b9ff9f 2003-12-04 devnull Saveval *s;
167 c5b9ff9f 2003-12-04 devnull Symbol *sp = (Symbol *)pc[0]; /* symbol table entry */
168 c5b9ff9f 2003-12-04 devnull /* for function */
169 c5b9ff9f 2003-12-04 devnull if (fp >= &frame[NFRAME])
170 c5b9ff9f 2003-12-04 devnull execerror(sp->name, "call nested too deeply");
172 c5b9ff9f 2003-12-04 devnull fp->sp = sp;
173 c5b9ff9f 2003-12-04 devnull fp->nargs = (int)pc[1];
174 c5b9ff9f 2003-12-04 devnull fp->retpc = pc + 2;
175 c5b9ff9f 2003-12-04 devnull fp->argn = stackp - 1; /* last argument */
176 c5b9ff9f 2003-12-04 devnull if(fp->nargs != sp->u.defn->nargs)
177 c5b9ff9f 2003-12-04 devnull execerror(sp->name, "called with wrong number of arguments");
178 c5b9ff9f 2003-12-04 devnull /* bind formals */
179 c5b9ff9f 2003-12-04 devnull f = sp->u.defn->formals;
180 c5b9ff9f 2003-12-04 devnull arg = stackp - fp->nargs;
181 c5b9ff9f 2003-12-04 devnull while(f){
182 c5b9ff9f 2003-12-04 devnull s = emalloc(sizeof(Saveval));
183 c5b9ff9f 2003-12-04 devnull s->val = f->sym->u;
184 c5b9ff9f 2003-12-04 devnull s->type = f->sym->type;
185 c5b9ff9f 2003-12-04 devnull s->next = f->save;
186 c5b9ff9f 2003-12-04 devnull f->save = s;
187 c5b9ff9f 2003-12-04 devnull f->sym->u.val = arg->val;
188 c5b9ff9f 2003-12-04 devnull f->sym->type = VAR;
189 c5b9ff9f 2003-12-04 devnull f = f->next;
192 c5b9ff9f 2003-12-04 devnull for (i = 0; i < fp->nargs; i++)
193 c5b9ff9f 2003-12-04 devnull pop(); /* pop arguments; no longer needed */
194 c5b9ff9f 2003-12-04 devnull execute(sp->u.defn->code);
195 c5b9ff9f 2003-12-04 devnull returning = 0;
199 c5b9ff9f 2003-12-04 devnull restore(Symbol *sp) /* restore formals associated with symbol */
201 c5b9ff9f 2003-12-04 devnull Formal *f;
202 c5b9ff9f 2003-12-04 devnull Saveval *s;
204 c5b9ff9f 2003-12-04 devnull f = sp->u.defn->formals;
205 c5b9ff9f 2003-12-04 devnull while(f){
206 c5b9ff9f 2003-12-04 devnull s = f->save;
207 c5b9ff9f 2003-12-04 devnull if(s == 0) /* more actuals than formals */
209 c5b9ff9f 2003-12-04 devnull f->sym->u = s->val;
210 c5b9ff9f 2003-12-04 devnull f->sym->type = s->type;
211 c5b9ff9f 2003-12-04 devnull f->save = s->next;
212 c5b9ff9f 2003-12-04 devnull free(s);
213 c5b9ff9f 2003-12-04 devnull f = f->next;
218 c5b9ff9f 2003-12-04 devnull restoreall(void) /* restore all variables in case of error */
220 c5b9ff9f 2003-12-04 devnull while(fp>=frame && fp->sp){
221 c5b9ff9f 2003-12-04 devnull restore(fp->sp);
224 c5b9ff9f 2003-12-04 devnull fp = frame;
227 c5b9ff9f 2003-12-04 devnull static void
228 c5b9ff9f 2003-12-04 devnull ret(void) /* common return from func or proc */
230 c5b9ff9f 2003-12-04 devnull /* restore formals */
231 c5b9ff9f 2003-12-04 devnull restore(fp->sp);
232 c5b9ff9f 2003-12-04 devnull pc = (Inst *)fp->retpc;
234 c5b9ff9f 2003-12-04 devnull returning = 1;
238 c5b9ff9f 2003-12-04 devnull funcret(void) /* return from a function */
240 c5b9ff9f 2003-12-04 devnull Datum d;
241 c5b9ff9f 2003-12-04 devnull if (fp->sp->type == PROCEDURE)
242 c5b9ff9f 2003-12-04 devnull execerror(fp->sp->name, "(proc) returns value");
243 c5b9ff9f 2003-12-04 devnull d = pop(); /* preserve function return value */
245 c5b9ff9f 2003-12-04 devnull push(d);
249 c5b9ff9f 2003-12-04 devnull procret(void) /* return from a procedure */
251 c5b9ff9f 2003-12-04 devnull if (fp->sp->type == FUNCTION)
252 c5b9ff9f 2003-12-04 devnull execerror(fp->sp->name,
253 c5b9ff9f 2003-12-04 devnull "(func) returns no value");
258 c5b9ff9f 2003-12-04 devnull bltin(void)
261 c5b9ff9f 2003-12-04 devnull Datum d;
262 c5b9ff9f 2003-12-04 devnull d = pop();
263 c5b9ff9f 2003-12-04 devnull d.val = (*(double (*)(double))*pc++)(d.val);
264 c5b9ff9f 2003-12-04 devnull push(d);
268 c5b9ff9f 2003-12-04 devnull add(void)
270 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
271 c5b9ff9f 2003-12-04 devnull d2 = pop();
272 c5b9ff9f 2003-12-04 devnull d1 = pop();
273 c5b9ff9f 2003-12-04 devnull d1.val += d2.val;
274 c5b9ff9f 2003-12-04 devnull push(d1);
278 c5b9ff9f 2003-12-04 devnull sub(void)
280 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
281 c5b9ff9f 2003-12-04 devnull d2 = pop();
282 c5b9ff9f 2003-12-04 devnull d1 = pop();
283 c5b9ff9f 2003-12-04 devnull d1.val -= d2.val;
284 c5b9ff9f 2003-12-04 devnull push(d1);
288 c5b9ff9f 2003-12-04 devnull mul(void)
290 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
291 c5b9ff9f 2003-12-04 devnull d2 = pop();
292 c5b9ff9f 2003-12-04 devnull d1 = pop();
293 c5b9ff9f 2003-12-04 devnull d1.val *= d2.val;
294 c5b9ff9f 2003-12-04 devnull push(d1);
298 c5b9ff9f 2003-12-04 devnull div(void)
300 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
301 c5b9ff9f 2003-12-04 devnull d2 = pop();
302 c5b9ff9f 2003-12-04 devnull if (d2.val == 0.0)
303 c5b9ff9f 2003-12-04 devnull execerror("division by zero", (char *)0);
304 c5b9ff9f 2003-12-04 devnull d1 = pop();
305 c5b9ff9f 2003-12-04 devnull d1.val /= d2.val;
306 c5b9ff9f 2003-12-04 devnull push(d1);
310 c5b9ff9f 2003-12-04 devnull mod(void)
312 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
313 c5b9ff9f 2003-12-04 devnull d2 = pop();
314 c5b9ff9f 2003-12-04 devnull if (d2.val == 0.0)
315 c5b9ff9f 2003-12-04 devnull execerror("division by zero", (char *)0);
316 c5b9ff9f 2003-12-04 devnull d1 = pop();
317 c5b9ff9f 2003-12-04 devnull /* d1.val %= d2.val; */
318 c5b9ff9f 2003-12-04 devnull d1.val = fmod(d1.val, d2.val);
319 c5b9ff9f 2003-12-04 devnull push(d1);
323 c5b9ff9f 2003-12-04 devnull negate(void)
325 c5b9ff9f 2003-12-04 devnull Datum d;
326 c5b9ff9f 2003-12-04 devnull d = pop();
327 c5b9ff9f 2003-12-04 devnull d.val = -d.val;
328 c5b9ff9f 2003-12-04 devnull push(d);
332 c5b9ff9f 2003-12-04 devnull verify(Symbol* s)
334 c5b9ff9f 2003-12-04 devnull if (s->type != VAR && s->type != UNDEF)
335 c5b9ff9f 2003-12-04 devnull execerror("attempt to evaluate non-variable", s->name);
336 c5b9ff9f 2003-12-04 devnull if (s->type == UNDEF)
337 c5b9ff9f 2003-12-04 devnull execerror("undefined variable", s->name);
341 c5b9ff9f 2003-12-04 devnull eval(void) /* evaluate variable on stack */
343 c5b9ff9f 2003-12-04 devnull Datum d;
344 c5b9ff9f 2003-12-04 devnull d = pop();
345 c5b9ff9f 2003-12-04 devnull verify(d.sym);
346 c5b9ff9f 2003-12-04 devnull d.val = d.sym->u.val;
347 c5b9ff9f 2003-12-04 devnull push(d);
351 c5b9ff9f 2003-12-04 devnull preinc(void)
353 c5b9ff9f 2003-12-04 devnull Datum d;
354 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
355 c5b9ff9f 2003-12-04 devnull verify(d.sym);
356 c5b9ff9f 2003-12-04 devnull d.val = d.sym->u.val += 1.0;
357 c5b9ff9f 2003-12-04 devnull push(d);
361 c5b9ff9f 2003-12-04 devnull predec(void)
363 c5b9ff9f 2003-12-04 devnull Datum d;
364 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
365 c5b9ff9f 2003-12-04 devnull verify(d.sym);
366 c5b9ff9f 2003-12-04 devnull d.val = d.sym->u.val -= 1.0;
367 c5b9ff9f 2003-12-04 devnull push(d);
371 c5b9ff9f 2003-12-04 devnull postinc(void)
373 c5b9ff9f 2003-12-04 devnull Datum d;
374 c5b9ff9f 2003-12-04 devnull double v;
375 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
376 c5b9ff9f 2003-12-04 devnull verify(d.sym);
377 c5b9ff9f 2003-12-04 devnull v = d.sym->u.val;
378 c5b9ff9f 2003-12-04 devnull d.sym->u.val += 1.0;
379 c5b9ff9f 2003-12-04 devnull d.val = v;
380 c5b9ff9f 2003-12-04 devnull push(d);
384 c5b9ff9f 2003-12-04 devnull postdec(void)
386 c5b9ff9f 2003-12-04 devnull Datum d;
387 c5b9ff9f 2003-12-04 devnull double v;
388 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
389 c5b9ff9f 2003-12-04 devnull verify(d.sym);
390 c5b9ff9f 2003-12-04 devnull v = d.sym->u.val;
391 c5b9ff9f 2003-12-04 devnull d.sym->u.val -= 1.0;
392 c5b9ff9f 2003-12-04 devnull d.val = v;
393 c5b9ff9f 2003-12-04 devnull push(d);
397 c5b9ff9f 2003-12-04 devnull gt(void)
399 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
400 c5b9ff9f 2003-12-04 devnull d2 = pop();
401 c5b9ff9f 2003-12-04 devnull d1 = pop();
402 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val > d2.val);
403 c5b9ff9f 2003-12-04 devnull push(d1);
407 c5b9ff9f 2003-12-04 devnull lt(void)
409 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
410 c5b9ff9f 2003-12-04 devnull d2 = pop();
411 c5b9ff9f 2003-12-04 devnull d1 = pop();
412 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val < d2.val);
413 c5b9ff9f 2003-12-04 devnull push(d1);
417 c5b9ff9f 2003-12-04 devnull ge(void)
419 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
420 c5b9ff9f 2003-12-04 devnull d2 = pop();
421 c5b9ff9f 2003-12-04 devnull d1 = pop();
422 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val >= d2.val);
423 c5b9ff9f 2003-12-04 devnull push(d1);
427 c5b9ff9f 2003-12-04 devnull le(void)
429 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
430 c5b9ff9f 2003-12-04 devnull d2 = pop();
431 c5b9ff9f 2003-12-04 devnull d1 = pop();
432 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val <= d2.val);
433 c5b9ff9f 2003-12-04 devnull push(d1);
437 c5b9ff9f 2003-12-04 devnull eq(void)
439 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
440 c5b9ff9f 2003-12-04 devnull d2 = pop();
441 c5b9ff9f 2003-12-04 devnull d1 = pop();
442 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val == d2.val);
443 c5b9ff9f 2003-12-04 devnull push(d1);
447 c5b9ff9f 2003-12-04 devnull ne(void)
449 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
450 c5b9ff9f 2003-12-04 devnull d2 = pop();
451 c5b9ff9f 2003-12-04 devnull d1 = pop();
452 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val != d2.val);
453 c5b9ff9f 2003-12-04 devnull push(d1);
457 c5b9ff9f 2003-12-04 devnull and(void)
459 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
460 c5b9ff9f 2003-12-04 devnull d2 = pop();
461 c5b9ff9f 2003-12-04 devnull d1 = pop();
462 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val != 0.0 && d2.val != 0.0);
463 c5b9ff9f 2003-12-04 devnull push(d1);
467 c5b9ff9f 2003-12-04 devnull or(void)
469 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
470 c5b9ff9f 2003-12-04 devnull d2 = pop();
471 c5b9ff9f 2003-12-04 devnull d1 = pop();
472 c5b9ff9f 2003-12-04 devnull d1.val = (double)(d1.val != 0.0 || d2.val != 0.0);
473 c5b9ff9f 2003-12-04 devnull push(d1);
477 c5b9ff9f 2003-12-04 devnull not(void)
479 c5b9ff9f 2003-12-04 devnull Datum d;
480 c5b9ff9f 2003-12-04 devnull d = pop();
481 c5b9ff9f 2003-12-04 devnull d.val = (double)(d.val == 0.0);
482 c5b9ff9f 2003-12-04 devnull push(d);
486 c5b9ff9f 2003-12-04 devnull power(void)
488 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
489 c5b9ff9f 2003-12-04 devnull d2 = pop();
490 c5b9ff9f 2003-12-04 devnull d1 = pop();
491 c5b9ff9f 2003-12-04 devnull d1.val = Pow(d1.val, d2.val);
492 c5b9ff9f 2003-12-04 devnull push(d1);
496 c5b9ff9f 2003-12-04 devnull assign(void)
498 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
499 c5b9ff9f 2003-12-04 devnull d1 = pop();
500 c5b9ff9f 2003-12-04 devnull d2 = pop();
501 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
502 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
503 c5b9ff9f 2003-12-04 devnull d1.sym->name);
504 c5b9ff9f 2003-12-04 devnull d1.sym->u.val = d2.val;
505 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
506 c5b9ff9f 2003-12-04 devnull push(d2);
510 c5b9ff9f 2003-12-04 devnull addeq(void)
512 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
513 c5b9ff9f 2003-12-04 devnull d1 = pop();
514 c5b9ff9f 2003-12-04 devnull d2 = pop();
515 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
516 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
517 c5b9ff9f 2003-12-04 devnull d1.sym->name);
518 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val += d2.val;
519 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
520 c5b9ff9f 2003-12-04 devnull push(d2);
524 c5b9ff9f 2003-12-04 devnull subeq(void)
526 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
527 c5b9ff9f 2003-12-04 devnull d1 = pop();
528 c5b9ff9f 2003-12-04 devnull d2 = pop();
529 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
530 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
531 c5b9ff9f 2003-12-04 devnull d1.sym->name);
532 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val -= d2.val;
533 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
534 c5b9ff9f 2003-12-04 devnull push(d2);
538 c5b9ff9f 2003-12-04 devnull muleq(void)
540 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
541 c5b9ff9f 2003-12-04 devnull d1 = pop();
542 c5b9ff9f 2003-12-04 devnull d2 = pop();
543 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
544 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
545 c5b9ff9f 2003-12-04 devnull d1.sym->name);
546 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val *= d2.val;
547 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
548 c5b9ff9f 2003-12-04 devnull push(d2);
552 c5b9ff9f 2003-12-04 devnull diveq(void)
554 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
555 c5b9ff9f 2003-12-04 devnull d1 = pop();
556 c5b9ff9f 2003-12-04 devnull d2 = pop();
557 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
558 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
559 c5b9ff9f 2003-12-04 devnull d1.sym->name);
560 c5b9ff9f 2003-12-04 devnull d2.val = d1.sym->u.val /= d2.val;
561 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
562 c5b9ff9f 2003-12-04 devnull push(d2);
566 d21d62e2 2004-02-29 devnull ppush(Datum *d)
568 d21d62e2 2004-02-29 devnull push(*d);
572 c5b9ff9f 2003-12-04 devnull modeq(void)
574 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
577 c5b9ff9f 2003-12-04 devnull d1 = pop();
578 c5b9ff9f 2003-12-04 devnull d2 = pop();
579 c5b9ff9f 2003-12-04 devnull if (d1.sym->type != VAR && d1.sym->type != UNDEF)
580 c5b9ff9f 2003-12-04 devnull execerror("assignment to non-variable",
581 c5b9ff9f 2003-12-04 devnull d1.sym->name);
582 c5b9ff9f 2003-12-04 devnull /* d2.val = d1.sym->u.val %= d2.val; */
583 c5b9ff9f 2003-12-04 devnull x = d1.sym->u.val;
584 c5b9ff9f 2003-12-04 devnull x %= (long) d2.val;
585 d21d62e2 2004-02-29 devnull d2.val = x;
586 d21d62e2 2004-02-29 devnull d1.sym->u.val = x;
587 c5b9ff9f 2003-12-04 devnull d1.sym->type = VAR;
589 d21d62e2 2004-02-29 devnull /* push(d2) generates a compiler error on Linux w. gcc 2.95.4 */
590 d21d62e2 2004-02-29 devnull ppush(&d2);
594 c5b9ff9f 2003-12-04 devnull printtop(void) /* pop top value from stack, print it */
596 c5b9ff9f 2003-12-04 devnull Datum d;
597 c5b9ff9f 2003-12-04 devnull static Symbol *s; /* last value computed */
598 c5b9ff9f 2003-12-04 devnull if (s == 0)
599 c5b9ff9f 2003-12-04 devnull s = install("_", VAR, 0.0);
600 c5b9ff9f 2003-12-04 devnull d = pop();
601 c5b9ff9f 2003-12-04 devnull print("%.12g\n", d.val);
602 c5b9ff9f 2003-12-04 devnull s->u.val = d.val;
606 c5b9ff9f 2003-12-04 devnull prexpr(void) /* print numeric value */
608 c5b9ff9f 2003-12-04 devnull Datum d;
609 c5b9ff9f 2003-12-04 devnull d = pop();
610 c5b9ff9f 2003-12-04 devnull print("%.12g ", d.val);
614 c5b9ff9f 2003-12-04 devnull prstr(void) /* print string value */
616 c5b9ff9f 2003-12-04 devnull print("%s", (char *) *pc++);
620 c5b9ff9f 2003-12-04 devnull varread(void) /* read into variable */
622 c5b9ff9f 2003-12-04 devnull Datum d;
623 c5b9ff9f 2003-12-04 devnull extern Biobuf *bin;
624 c5b9ff9f 2003-12-04 devnull Symbol *var = (Symbol *) *pc++;
629 c5b9ff9f 2003-12-04 devnull c = Bgetc(bin);
630 c5b9ff9f 2003-12-04 devnull while(c==' ' || c=='\t');
631 c5b9ff9f 2003-12-04 devnull if(c == Beof){
633 c5b9ff9f 2003-12-04 devnull if(moreinput())
634 c5b9ff9f 2003-12-04 devnull goto Again;
635 c5b9ff9f 2003-12-04 devnull d.val = var->u.val = 0.0;
636 c5b9ff9f 2003-12-04 devnull goto Return;
639 c5b9ff9f 2003-12-04 devnull if(strchr("+-.0123456789", c) == 0)
640 c5b9ff9f 2003-12-04 devnull execerror("non-number read into", var->name);
641 c5b9ff9f 2003-12-04 devnull Bungetc(bin);
642 c5b9ff9f 2003-12-04 devnull if(Bgetd(bin, &var->u.val) == Beof)
643 c5b9ff9f 2003-12-04 devnull goto Iseof;
645 c5b9ff9f 2003-12-04 devnull d.val = 1.0;
647 c5b9ff9f 2003-12-04 devnull var->type = VAR;
648 c5b9ff9f 2003-12-04 devnull push(d);
652 c5b9ff9f 2003-12-04 devnull code(Inst f) /* install one instruction or operand */
654 c5b9ff9f 2003-12-04 devnull Inst *oprogp = progp;
655 c5b9ff9f 2003-12-04 devnull if (progp >= &prog[NPROG])
656 c5b9ff9f 2003-12-04 devnull execerror("program too big", (char *)0);
657 c5b9ff9f 2003-12-04 devnull *progp++ = f;
658 c5b9ff9f 2003-12-04 devnull return oprogp;
662 c5b9ff9f 2003-12-04 devnull execute(Inst* p)
664 c5b9ff9f 2003-12-04 devnull for (pc = p; *pc != STOP && !returning; )
665 c5b9ff9f 2003-12-04 devnull (*((++pc)[-1]))();