Blame


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"
6 c5b9ff9f 2003-12-04 devnull
7 c5b9ff9f 2003-12-04 devnull #define NSTACK 256
8 c5b9ff9f 2003-12-04 devnull
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 */
11 c5b9ff9f 2003-12-04 devnull
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 */
19 c5b9ff9f 2003-12-04 devnull
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 */
25 c5b9ff9f 2003-12-04 devnull } Frame;
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 */
29 c5b9ff9f 2003-12-04 devnull
30 c5b9ff9f 2003-12-04 devnull void
31 c5b9ff9f 2003-12-04 devnull initcode(void)
32 c5b9ff9f 2003-12-04 devnull {
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;
38 c5b9ff9f 2003-12-04 devnull }
39 c5b9ff9f 2003-12-04 devnull
40 c5b9ff9f 2003-12-04 devnull void
41 c5b9ff9f 2003-12-04 devnull push(Datum d)
42 c5b9ff9f 2003-12-04 devnull {
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;
46 c5b9ff9f 2003-12-04 devnull }
47 c5b9ff9f 2003-12-04 devnull
48 c5b9ff9f 2003-12-04 devnull Datum
49 c5b9ff9f 2003-12-04 devnull pop(void)
50 c5b9ff9f 2003-12-04 devnull {
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;
54 c5b9ff9f 2003-12-04 devnull }
55 c5b9ff9f 2003-12-04 devnull
56 c5b9ff9f 2003-12-04 devnull void
57 c5b9ff9f 2003-12-04 devnull xpop(void) /* for when no value is wanted */
58 c5b9ff9f 2003-12-04 devnull {
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;
62 c5b9ff9f 2003-12-04 devnull }
63 c5b9ff9f 2003-12-04 devnull
64 c5b9ff9f 2003-12-04 devnull void
65 c5b9ff9f 2003-12-04 devnull constpush(void)
66 c5b9ff9f 2003-12-04 devnull {
67 c5b9ff9f 2003-12-04 devnull Datum d;
68 c5b9ff9f 2003-12-04 devnull d.val = ((Symbol *)*pc++)->u.val;
69 c5b9ff9f 2003-12-04 devnull push(d);
70 c5b9ff9f 2003-12-04 devnull }
71 c5b9ff9f 2003-12-04 devnull
72 c5b9ff9f 2003-12-04 devnull void
73 c5b9ff9f 2003-12-04 devnull varpush(void)
74 c5b9ff9f 2003-12-04 devnull {
75 c5b9ff9f 2003-12-04 devnull Datum d;
76 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
77 c5b9ff9f 2003-12-04 devnull push(d);
78 c5b9ff9f 2003-12-04 devnull }
79 c5b9ff9f 2003-12-04 devnull
80 c5b9ff9f 2003-12-04 devnull void
81 c5b9ff9f 2003-12-04 devnull whilecode(void)
82 c5b9ff9f 2003-12-04 devnull {
83 c5b9ff9f 2003-12-04 devnull Datum d;
84 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
85 c5b9ff9f 2003-12-04 devnull
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)
91 c5b9ff9f 2003-12-04 devnull break;
92 c5b9ff9f 2003-12-04 devnull execute(savepc+2); /* condition */
93 c5b9ff9f 2003-12-04 devnull d = pop();
94 c5b9ff9f 2003-12-04 devnull }
95 c5b9ff9f 2003-12-04 devnull if (!returning)
96 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+1)); /* next stmt */
97 c5b9ff9f 2003-12-04 devnull }
98 c5b9ff9f 2003-12-04 devnull
99 c5b9ff9f 2003-12-04 devnull void
100 c5b9ff9f 2003-12-04 devnull forcode(void)
101 c5b9ff9f 2003-12-04 devnull {
102 c5b9ff9f 2003-12-04 devnull Datum d;
103 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
104 c5b9ff9f 2003-12-04 devnull
105 c5b9ff9f 2003-12-04 devnull execute(savepc+4); /* precharge */
106 c5b9ff9f 2003-12-04 devnull pop();
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)
112 c5b9ff9f 2003-12-04 devnull break;
113 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+1))); /* post loop */
114 c5b9ff9f 2003-12-04 devnull pop();
115 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* condition */
116 c5b9ff9f 2003-12-04 devnull d = pop();
117 c5b9ff9f 2003-12-04 devnull }
118 c5b9ff9f 2003-12-04 devnull if (!returning)
119 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+3)); /* next stmt */
120 c5b9ff9f 2003-12-04 devnull }
121 c5b9ff9f 2003-12-04 devnull
122 c5b9ff9f 2003-12-04 devnull void
123 c5b9ff9f 2003-12-04 devnull ifcode(void)
124 c5b9ff9f 2003-12-04 devnull {
125 c5b9ff9f 2003-12-04 devnull Datum d;
126 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc; /* then part */
127 c5b9ff9f 2003-12-04 devnull
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 */
136 c5b9ff9f 2003-12-04 devnull }
137 c5b9ff9f 2003-12-04 devnull
138 c5b9ff9f 2003-12-04 devnull void
139 c5b9ff9f 2003-12-04 devnull define(Symbol* sp, Formal *f) /* put func/proc in symbol table */
140 c5b9ff9f 2003-12-04 devnull {
141 c5b9ff9f 2003-12-04 devnull Fndefn *fd;
142 c5b9ff9f 2003-12-04 devnull int n;
143 c5b9ff9f 2003-12-04 devnull
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)
149 c5b9ff9f 2003-12-04 devnull n++;
150 c5b9ff9f 2003-12-04 devnull fd->nargs = n;
151 c5b9ff9f 2003-12-04 devnull sp->u.defn = fd;
152 c5b9ff9f 2003-12-04 devnull }
153 c5b9ff9f 2003-12-04 devnull
154 c5b9ff9f 2003-12-04 devnull void
155 c5b9ff9f 2003-12-04 devnull call(void) /* call a function */
156 c5b9ff9f 2003-12-04 devnull {
157 c5b9ff9f 2003-12-04 devnull Formal *f;
158 c5b9ff9f 2003-12-04 devnull Datum *arg;
159 c5b9ff9f 2003-12-04 devnull Saveval *s;
160 c5b9ff9f 2003-12-04 devnull int i;
161 c5b9ff9f 2003-12-04 devnull
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");
166 c5b9ff9f 2003-12-04 devnull fp++;
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;
185 c5b9ff9f 2003-12-04 devnull arg++;
186 c5b9ff9f 2003-12-04 devnull }
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;
191 c5b9ff9f 2003-12-04 devnull }
192 c5b9ff9f 2003-12-04 devnull
193 c5b9ff9f 2003-12-04 devnull void
194 c5b9ff9f 2003-12-04 devnull restore(Symbol *sp) /* restore formals associated with symbol */
195 c5b9ff9f 2003-12-04 devnull {
196 c5b9ff9f 2003-12-04 devnull Formal *f;
197 c5b9ff9f 2003-12-04 devnull Saveval *s;
198 c5b9ff9f 2003-12-04 devnull
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 */
203 c5b9ff9f 2003-12-04 devnull break;
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;
209 c5b9ff9f 2003-12-04 devnull }
210 c5b9ff9f 2003-12-04 devnull }
211 c5b9ff9f 2003-12-04 devnull
212 c5b9ff9f 2003-12-04 devnull void
213 c5b9ff9f 2003-12-04 devnull restoreall(void) /* restore all variables in case of error */
214 c5b9ff9f 2003-12-04 devnull {
215 c5b9ff9f 2003-12-04 devnull while(fp>=frame && fp->sp){
216 c5b9ff9f 2003-12-04 devnull restore(fp->sp);
217 c5b9ff9f 2003-12-04 devnull --fp;
218 c5b9ff9f 2003-12-04 devnull }
219 c5b9ff9f 2003-12-04 devnull fp = frame;
220 c5b9ff9f 2003-12-04 devnull }
221 c5b9ff9f 2003-12-04 devnull
222 c5b9ff9f 2003-12-04 devnull static void
223 c5b9ff9f 2003-12-04 devnull ret(void) /* common return from func or proc */
224 c5b9ff9f 2003-12-04 devnull {
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;
228 c5b9ff9f 2003-12-04 devnull --fp;
229 c5b9ff9f 2003-12-04 devnull returning = 1;
230 c5b9ff9f 2003-12-04 devnull }
231 c5b9ff9f 2003-12-04 devnull
232 c5b9ff9f 2003-12-04 devnull void
233 c5b9ff9f 2003-12-04 devnull funcret(void) /* return from a function */
234 c5b9ff9f 2003-12-04 devnull {
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 */
239 c5b9ff9f 2003-12-04 devnull ret();
240 c5b9ff9f 2003-12-04 devnull push(d);
241 c5b9ff9f 2003-12-04 devnull }
242 c5b9ff9f 2003-12-04 devnull
243 c5b9ff9f 2003-12-04 devnull void
244 c5b9ff9f 2003-12-04 devnull procret(void) /* return from a procedure */
245 c5b9ff9f 2003-12-04 devnull {
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");
249 c5b9ff9f 2003-12-04 devnull ret();
250 c5b9ff9f 2003-12-04 devnull }
251 c5b9ff9f 2003-12-04 devnull
252 c5b9ff9f 2003-12-04 devnull void
253 c5b9ff9f 2003-12-04 devnull bltin(void)
254 c5b9ff9f 2003-12-04 devnull {
255 c5b9ff9f 2003-12-04 devnull
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);
260 c5b9ff9f 2003-12-04 devnull }
261 c5b9ff9f 2003-12-04 devnull
262 c5b9ff9f 2003-12-04 devnull void
263 c5b9ff9f 2003-12-04 devnull add(void)
264 c5b9ff9f 2003-12-04 devnull {
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);
270 c5b9ff9f 2003-12-04 devnull }
271 c5b9ff9f 2003-12-04 devnull
272 c5b9ff9f 2003-12-04 devnull void
273 c5b9ff9f 2003-12-04 devnull sub(void)
274 c5b9ff9f 2003-12-04 devnull {
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);
280 c5b9ff9f 2003-12-04 devnull }
281 c5b9ff9f 2003-12-04 devnull
282 c5b9ff9f 2003-12-04 devnull void
283 c5b9ff9f 2003-12-04 devnull mul(void)
284 c5b9ff9f 2003-12-04 devnull {
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);
290 c5b9ff9f 2003-12-04 devnull }
291 c5b9ff9f 2003-12-04 devnull
292 c5b9ff9f 2003-12-04 devnull void
293 c5b9ff9f 2003-12-04 devnull div(void)
294 c5b9ff9f 2003-12-04 devnull {
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);
302 c5b9ff9f 2003-12-04 devnull }
303 c5b9ff9f 2003-12-04 devnull
304 c5b9ff9f 2003-12-04 devnull void
305 c5b9ff9f 2003-12-04 devnull mod(void)
306 c5b9ff9f 2003-12-04 devnull {
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);
315 c5b9ff9f 2003-12-04 devnull }
316 c5b9ff9f 2003-12-04 devnull
317 c5b9ff9f 2003-12-04 devnull void
318 c5b9ff9f 2003-12-04 devnull negate(void)
319 c5b9ff9f 2003-12-04 devnull {
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);
324 c5b9ff9f 2003-12-04 devnull }
325 c5b9ff9f 2003-12-04 devnull
326 c5b9ff9f 2003-12-04 devnull void
327 c5b9ff9f 2003-12-04 devnull verify(Symbol* s)
328 c5b9ff9f 2003-12-04 devnull {
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);
333 c5b9ff9f 2003-12-04 devnull }
334 c5b9ff9f 2003-12-04 devnull
335 c5b9ff9f 2003-12-04 devnull void
336 c5b9ff9f 2003-12-04 devnull eval(void) /* evaluate variable on stack */
337 c5b9ff9f 2003-12-04 devnull {
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);
343 c5b9ff9f 2003-12-04 devnull }
344 c5b9ff9f 2003-12-04 devnull
345 c5b9ff9f 2003-12-04 devnull void
346 c5b9ff9f 2003-12-04 devnull preinc(void)
347 c5b9ff9f 2003-12-04 devnull {
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);
353 c5b9ff9f 2003-12-04 devnull }
354 c5b9ff9f 2003-12-04 devnull
355 c5b9ff9f 2003-12-04 devnull void
356 c5b9ff9f 2003-12-04 devnull predec(void)
357 c5b9ff9f 2003-12-04 devnull {
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);
363 c5b9ff9f 2003-12-04 devnull }
364 c5b9ff9f 2003-12-04 devnull
365 c5b9ff9f 2003-12-04 devnull void
366 c5b9ff9f 2003-12-04 devnull postinc(void)
367 c5b9ff9f 2003-12-04 devnull {
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);
376 c5b9ff9f 2003-12-04 devnull }
377 c5b9ff9f 2003-12-04 devnull
378 c5b9ff9f 2003-12-04 devnull void
379 c5b9ff9f 2003-12-04 devnull postdec(void)
380 c5b9ff9f 2003-12-04 devnull {
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);
389 c5b9ff9f 2003-12-04 devnull }
390 c5b9ff9f 2003-12-04 devnull
391 c5b9ff9f 2003-12-04 devnull void
392 c5b9ff9f 2003-12-04 devnull gt(void)
393 c5b9ff9f 2003-12-04 devnull {
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);
399 c5b9ff9f 2003-12-04 devnull }
400 c5b9ff9f 2003-12-04 devnull
401 c5b9ff9f 2003-12-04 devnull void
402 c5b9ff9f 2003-12-04 devnull lt(void)
403 c5b9ff9f 2003-12-04 devnull {
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);
409 c5b9ff9f 2003-12-04 devnull }
410 c5b9ff9f 2003-12-04 devnull
411 c5b9ff9f 2003-12-04 devnull void
412 c5b9ff9f 2003-12-04 devnull ge(void)
413 c5b9ff9f 2003-12-04 devnull {
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);
419 c5b9ff9f 2003-12-04 devnull }
420 c5b9ff9f 2003-12-04 devnull
421 c5b9ff9f 2003-12-04 devnull void
422 c5b9ff9f 2003-12-04 devnull le(void)
423 c5b9ff9f 2003-12-04 devnull {
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);
429 c5b9ff9f 2003-12-04 devnull }
430 c5b9ff9f 2003-12-04 devnull
431 c5b9ff9f 2003-12-04 devnull void
432 c5b9ff9f 2003-12-04 devnull eq(void)
433 c5b9ff9f 2003-12-04 devnull {
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);
439 c5b9ff9f 2003-12-04 devnull }
440 c5b9ff9f 2003-12-04 devnull
441 c5b9ff9f 2003-12-04 devnull void
442 c5b9ff9f 2003-12-04 devnull ne(void)
443 c5b9ff9f 2003-12-04 devnull {
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);
449 c5b9ff9f 2003-12-04 devnull }
450 c5b9ff9f 2003-12-04 devnull
451 c5b9ff9f 2003-12-04 devnull void
452 c5b9ff9f 2003-12-04 devnull and(void)
453 c5b9ff9f 2003-12-04 devnull {
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);
459 c5b9ff9f 2003-12-04 devnull }
460 c5b9ff9f 2003-12-04 devnull
461 c5b9ff9f 2003-12-04 devnull void
462 c5b9ff9f 2003-12-04 devnull or(void)
463 c5b9ff9f 2003-12-04 devnull {
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);
469 c5b9ff9f 2003-12-04 devnull }
470 c5b9ff9f 2003-12-04 devnull
471 c5b9ff9f 2003-12-04 devnull void
472 c5b9ff9f 2003-12-04 devnull not(void)
473 c5b9ff9f 2003-12-04 devnull {
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);
478 c5b9ff9f 2003-12-04 devnull }
479 c5b9ff9f 2003-12-04 devnull
480 c5b9ff9f 2003-12-04 devnull void
481 c5b9ff9f 2003-12-04 devnull power(void)
482 c5b9ff9f 2003-12-04 devnull {
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);
488 c5b9ff9f 2003-12-04 devnull }
489 c5b9ff9f 2003-12-04 devnull
490 c5b9ff9f 2003-12-04 devnull void
491 c5b9ff9f 2003-12-04 devnull assign(void)
492 c5b9ff9f 2003-12-04 devnull {
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);
502 c5b9ff9f 2003-12-04 devnull }
503 c5b9ff9f 2003-12-04 devnull
504 c5b9ff9f 2003-12-04 devnull void
505 c5b9ff9f 2003-12-04 devnull addeq(void)
506 c5b9ff9f 2003-12-04 devnull {
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);
516 c5b9ff9f 2003-12-04 devnull }
517 c5b9ff9f 2003-12-04 devnull
518 c5b9ff9f 2003-12-04 devnull void
519 c5b9ff9f 2003-12-04 devnull subeq(void)
520 c5b9ff9f 2003-12-04 devnull {
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);
530 c5b9ff9f 2003-12-04 devnull }
531 c5b9ff9f 2003-12-04 devnull
532 c5b9ff9f 2003-12-04 devnull void
533 c5b9ff9f 2003-12-04 devnull muleq(void)
534 c5b9ff9f 2003-12-04 devnull {
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);
544 c5b9ff9f 2003-12-04 devnull }
545 c5b9ff9f 2003-12-04 devnull
546 c5b9ff9f 2003-12-04 devnull void
547 c5b9ff9f 2003-12-04 devnull diveq(void)
548 c5b9ff9f 2003-12-04 devnull {
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);
558 c5b9ff9f 2003-12-04 devnull }
559 c5b9ff9f 2003-12-04 devnull
560 c5b9ff9f 2003-12-04 devnull void
561 c5b9ff9f 2003-12-04 devnull modeq(void)
562 c5b9ff9f 2003-12-04 devnull {
563 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
564 c5b9ff9f 2003-12-04 devnull long x;
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);
576 c5b9ff9f 2003-12-04 devnull }
577 c5b9ff9f 2003-12-04 devnull
578 c5b9ff9f 2003-12-04 devnull void
579 c5b9ff9f 2003-12-04 devnull printtop(void) /* pop top value from stack, print it */
580 c5b9ff9f 2003-12-04 devnull {
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;
588 c5b9ff9f 2003-12-04 devnull }
589 c5b9ff9f 2003-12-04 devnull
590 c5b9ff9f 2003-12-04 devnull void
591 c5b9ff9f 2003-12-04 devnull prexpr(void) /* print numeric value */
592 c5b9ff9f 2003-12-04 devnull {
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);
596 c5b9ff9f 2003-12-04 devnull }
597 c5b9ff9f 2003-12-04 devnull
598 c5b9ff9f 2003-12-04 devnull void
599 c5b9ff9f 2003-12-04 devnull prstr(void) /* print string value */
600 c5b9ff9f 2003-12-04 devnull {
601 c5b9ff9f 2003-12-04 devnull print("%s", (char *) *pc++);
602 c5b9ff9f 2003-12-04 devnull }
603 c5b9ff9f 2003-12-04 devnull
604 c5b9ff9f 2003-12-04 devnull void
605 c5b9ff9f 2003-12-04 devnull varread(void) /* read into variable */
606 c5b9ff9f 2003-12-04 devnull {
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++;
610 c5b9ff9f 2003-12-04 devnull int c;
611 c5b9ff9f 2003-12-04 devnull
612 c5b9ff9f 2003-12-04 devnull Again:
613 c5b9ff9f 2003-12-04 devnull do
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){
617 c5b9ff9f 2003-12-04 devnull Iseof:
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;
622 c5b9ff9f 2003-12-04 devnull }
623 c5b9ff9f 2003-12-04 devnull
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;
629 c5b9ff9f 2003-12-04 devnull else
630 c5b9ff9f 2003-12-04 devnull d.val = 1.0;
631 c5b9ff9f 2003-12-04 devnull Return:
632 c5b9ff9f 2003-12-04 devnull var->type = VAR;
633 c5b9ff9f 2003-12-04 devnull push(d);
634 c5b9ff9f 2003-12-04 devnull }
635 c5b9ff9f 2003-12-04 devnull
636 c5b9ff9f 2003-12-04 devnull Inst*
637 c5b9ff9f 2003-12-04 devnull code(Inst f) /* install one instruction or operand */
638 c5b9ff9f 2003-12-04 devnull {
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;
644 c5b9ff9f 2003-12-04 devnull }
645 c5b9ff9f 2003-12-04 devnull
646 c5b9ff9f 2003-12-04 devnull void
647 c5b9ff9f 2003-12-04 devnull execute(Inst* p)
648 c5b9ff9f 2003-12-04 devnull {
649 c5b9ff9f 2003-12-04 devnull for (pc = p; *pc != STOP && !returning; )
650 c5b9ff9f 2003-12-04 devnull (*((++pc)[-1]))();
651 c5b9ff9f 2003-12-04 devnull }