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 d21d62e2 2004-02-29 devnull nop(void)
42 d21d62e2 2004-02-29 devnull {
43 d21d62e2 2004-02-29 devnull }
44 d21d62e2 2004-02-29 devnull
45 d21d62e2 2004-02-29 devnull void
46 c5b9ff9f 2003-12-04 devnull push(Datum d)
47 c5b9ff9f 2003-12-04 devnull {
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;
51 c5b9ff9f 2003-12-04 devnull }
52 c5b9ff9f 2003-12-04 devnull
53 c5b9ff9f 2003-12-04 devnull Datum
54 c5b9ff9f 2003-12-04 devnull pop(void)
55 c5b9ff9f 2003-12-04 devnull {
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;
59 c5b9ff9f 2003-12-04 devnull }
60 c5b9ff9f 2003-12-04 devnull
61 c5b9ff9f 2003-12-04 devnull void
62 c5b9ff9f 2003-12-04 devnull xpop(void) /* for when no value is wanted */
63 c5b9ff9f 2003-12-04 devnull {
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;
67 c5b9ff9f 2003-12-04 devnull }
68 c5b9ff9f 2003-12-04 devnull
69 c5b9ff9f 2003-12-04 devnull void
70 c5b9ff9f 2003-12-04 devnull constpush(void)
71 c5b9ff9f 2003-12-04 devnull {
72 c5b9ff9f 2003-12-04 devnull Datum d;
73 c5b9ff9f 2003-12-04 devnull d.val = ((Symbol *)*pc++)->u.val;
74 c5b9ff9f 2003-12-04 devnull push(d);
75 c5b9ff9f 2003-12-04 devnull }
76 c5b9ff9f 2003-12-04 devnull
77 c5b9ff9f 2003-12-04 devnull void
78 c5b9ff9f 2003-12-04 devnull varpush(void)
79 c5b9ff9f 2003-12-04 devnull {
80 c5b9ff9f 2003-12-04 devnull Datum d;
81 c5b9ff9f 2003-12-04 devnull d.sym = (Symbol *)(*pc++);
82 c5b9ff9f 2003-12-04 devnull push(d);
83 c5b9ff9f 2003-12-04 devnull }
84 c5b9ff9f 2003-12-04 devnull
85 c5b9ff9f 2003-12-04 devnull void
86 c5b9ff9f 2003-12-04 devnull whilecode(void)
87 c5b9ff9f 2003-12-04 devnull {
88 c5b9ff9f 2003-12-04 devnull Datum d;
89 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
90 c5b9ff9f 2003-12-04 devnull
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)
96 c5b9ff9f 2003-12-04 devnull break;
97 c5b9ff9f 2003-12-04 devnull execute(savepc+2); /* condition */
98 c5b9ff9f 2003-12-04 devnull d = pop();
99 c5b9ff9f 2003-12-04 devnull }
100 c5b9ff9f 2003-12-04 devnull if (!returning)
101 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+1)); /* next stmt */
102 c5b9ff9f 2003-12-04 devnull }
103 c5b9ff9f 2003-12-04 devnull
104 c5b9ff9f 2003-12-04 devnull void
105 c5b9ff9f 2003-12-04 devnull forcode(void)
106 c5b9ff9f 2003-12-04 devnull {
107 c5b9ff9f 2003-12-04 devnull Datum d;
108 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc;
109 c5b9ff9f 2003-12-04 devnull
110 c5b9ff9f 2003-12-04 devnull execute(savepc+4); /* precharge */
111 c5b9ff9f 2003-12-04 devnull pop();
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)
117 c5b9ff9f 2003-12-04 devnull break;
118 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc+1))); /* post loop */
119 c5b9ff9f 2003-12-04 devnull pop();
120 c5b9ff9f 2003-12-04 devnull execute(*((Inst **)(savepc))); /* condition */
121 c5b9ff9f 2003-12-04 devnull d = pop();
122 c5b9ff9f 2003-12-04 devnull }
123 c5b9ff9f 2003-12-04 devnull if (!returning)
124 c5b9ff9f 2003-12-04 devnull pc = *((Inst **)(savepc+3)); /* next stmt */
125 c5b9ff9f 2003-12-04 devnull }
126 c5b9ff9f 2003-12-04 devnull
127 c5b9ff9f 2003-12-04 devnull void
128 fa325e9b 2020-01-10 cross ifcode(void)
129 c5b9ff9f 2003-12-04 devnull {
130 c5b9ff9f 2003-12-04 devnull Datum d;
131 c5b9ff9f 2003-12-04 devnull Inst *savepc = pc; /* then part */
132 c5b9ff9f 2003-12-04 devnull
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 fa325e9b 2020-01-10 cross 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 */
141 c5b9ff9f 2003-12-04 devnull }
142 c5b9ff9f 2003-12-04 devnull
143 c5b9ff9f 2003-12-04 devnull void
144 c5b9ff9f 2003-12-04 devnull define(Symbol* sp, Formal *f) /* put func/proc in symbol table */
145 c5b9ff9f 2003-12-04 devnull {
146 c5b9ff9f 2003-12-04 devnull Fndefn *fd;
147 c5b9ff9f 2003-12-04 devnull int n;
148 c5b9ff9f 2003-12-04 devnull
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)
154 c5b9ff9f 2003-12-04 devnull n++;
155 c5b9ff9f 2003-12-04 devnull fd->nargs = n;
156 c5b9ff9f 2003-12-04 devnull sp->u.defn = fd;
157 c5b9ff9f 2003-12-04 devnull }
158 c5b9ff9f 2003-12-04 devnull
159 c5b9ff9f 2003-12-04 devnull void
160 c5b9ff9f 2003-12-04 devnull call(void) /* call a function */
161 c5b9ff9f 2003-12-04 devnull {
162 c5b9ff9f 2003-12-04 devnull Formal *f;
163 c5b9ff9f 2003-12-04 devnull Datum *arg;
164 c5b9ff9f 2003-12-04 devnull Saveval *s;
165 c5b9ff9f 2003-12-04 devnull int i;
166 c5b9ff9f 2003-12-04 devnull
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");
171 c5b9ff9f 2003-12-04 devnull fp++;
172 c5b9ff9f 2003-12-04 devnull fp->sp = sp;
173 de9b8f86 2006-04-20 devnull fp->nargs = (int)(uintptr)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;
190 c5b9ff9f 2003-12-04 devnull arg++;
191 c5b9ff9f 2003-12-04 devnull }
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;
196 c5b9ff9f 2003-12-04 devnull }
197 c5b9ff9f 2003-12-04 devnull
198 c5b9ff9f 2003-12-04 devnull void
199 c5b9ff9f 2003-12-04 devnull restore(Symbol *sp) /* restore formals associated with symbol */
200 c5b9ff9f 2003-12-04 devnull {
201 c5b9ff9f 2003-12-04 devnull Formal *f;
202 c5b9ff9f 2003-12-04 devnull Saveval *s;
203 c5b9ff9f 2003-12-04 devnull
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 */
208 c5b9ff9f 2003-12-04 devnull break;
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;
214 c5b9ff9f 2003-12-04 devnull }
215 c5b9ff9f 2003-12-04 devnull }
216 c5b9ff9f 2003-12-04 devnull
217 c5b9ff9f 2003-12-04 devnull void
218 c5b9ff9f 2003-12-04 devnull restoreall(void) /* restore all variables in case of error */
219 c5b9ff9f 2003-12-04 devnull {
220 c5b9ff9f 2003-12-04 devnull while(fp>=frame && fp->sp){
221 c5b9ff9f 2003-12-04 devnull restore(fp->sp);
222 c5b9ff9f 2003-12-04 devnull --fp;
223 c5b9ff9f 2003-12-04 devnull }
224 c5b9ff9f 2003-12-04 devnull fp = frame;
225 c5b9ff9f 2003-12-04 devnull }
226 c5b9ff9f 2003-12-04 devnull
227 c5b9ff9f 2003-12-04 devnull static void
228 c5b9ff9f 2003-12-04 devnull ret(void) /* common return from func or proc */
229 c5b9ff9f 2003-12-04 devnull {
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;
233 c5b9ff9f 2003-12-04 devnull --fp;
234 c5b9ff9f 2003-12-04 devnull returning = 1;
235 c5b9ff9f 2003-12-04 devnull }
236 c5b9ff9f 2003-12-04 devnull
237 c5b9ff9f 2003-12-04 devnull void
238 c5b9ff9f 2003-12-04 devnull funcret(void) /* return from a function */
239 c5b9ff9f 2003-12-04 devnull {
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 */
244 c5b9ff9f 2003-12-04 devnull ret();
245 c5b9ff9f 2003-12-04 devnull push(d);
246 c5b9ff9f 2003-12-04 devnull }
247 c5b9ff9f 2003-12-04 devnull
248 c5b9ff9f 2003-12-04 devnull void
249 c5b9ff9f 2003-12-04 devnull procret(void) /* return from a procedure */
250 c5b9ff9f 2003-12-04 devnull {
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");
254 c5b9ff9f 2003-12-04 devnull ret();
255 c5b9ff9f 2003-12-04 devnull }
256 c5b9ff9f 2003-12-04 devnull
257 c5b9ff9f 2003-12-04 devnull void
258 fa325e9b 2020-01-10 cross bltin(void)
259 c5b9ff9f 2003-12-04 devnull {
260 c5b9ff9f 2003-12-04 devnull
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);
265 c5b9ff9f 2003-12-04 devnull }
266 c5b9ff9f 2003-12-04 devnull
267 c5b9ff9f 2003-12-04 devnull void
268 c5b9ff9f 2003-12-04 devnull add(void)
269 c5b9ff9f 2003-12-04 devnull {
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);
275 c5b9ff9f 2003-12-04 devnull }
276 c5b9ff9f 2003-12-04 devnull
277 c5b9ff9f 2003-12-04 devnull void
278 c5b9ff9f 2003-12-04 devnull sub(void)
279 c5b9ff9f 2003-12-04 devnull {
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);
285 c5b9ff9f 2003-12-04 devnull }
286 c5b9ff9f 2003-12-04 devnull
287 c5b9ff9f 2003-12-04 devnull void
288 c5b9ff9f 2003-12-04 devnull mul(void)
289 c5b9ff9f 2003-12-04 devnull {
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);
295 c5b9ff9f 2003-12-04 devnull }
296 c5b9ff9f 2003-12-04 devnull
297 c5b9ff9f 2003-12-04 devnull void
298 c5b9ff9f 2003-12-04 devnull div(void)
299 c5b9ff9f 2003-12-04 devnull {
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);
307 c5b9ff9f 2003-12-04 devnull }
308 c5b9ff9f 2003-12-04 devnull
309 c5b9ff9f 2003-12-04 devnull void
310 c5b9ff9f 2003-12-04 devnull mod(void)
311 c5b9ff9f 2003-12-04 devnull {
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);
320 c5b9ff9f 2003-12-04 devnull }
321 c5b9ff9f 2003-12-04 devnull
322 c5b9ff9f 2003-12-04 devnull void
323 c5b9ff9f 2003-12-04 devnull negate(void)
324 c5b9ff9f 2003-12-04 devnull {
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);
329 c5b9ff9f 2003-12-04 devnull }
330 c5b9ff9f 2003-12-04 devnull
331 c5b9ff9f 2003-12-04 devnull void
332 c5b9ff9f 2003-12-04 devnull verify(Symbol* s)
333 c5b9ff9f 2003-12-04 devnull {
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);
338 c5b9ff9f 2003-12-04 devnull }
339 c5b9ff9f 2003-12-04 devnull
340 c5b9ff9f 2003-12-04 devnull void
341 c5b9ff9f 2003-12-04 devnull eval(void) /* evaluate variable on stack */
342 c5b9ff9f 2003-12-04 devnull {
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);
348 c5b9ff9f 2003-12-04 devnull }
349 c5b9ff9f 2003-12-04 devnull
350 c5b9ff9f 2003-12-04 devnull void
351 c5b9ff9f 2003-12-04 devnull preinc(void)
352 c5b9ff9f 2003-12-04 devnull {
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);
358 c5b9ff9f 2003-12-04 devnull }
359 c5b9ff9f 2003-12-04 devnull
360 c5b9ff9f 2003-12-04 devnull void
361 c5b9ff9f 2003-12-04 devnull predec(void)
362 c5b9ff9f 2003-12-04 devnull {
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);
368 c5b9ff9f 2003-12-04 devnull }
369 c5b9ff9f 2003-12-04 devnull
370 c5b9ff9f 2003-12-04 devnull void
371 c5b9ff9f 2003-12-04 devnull postinc(void)
372 c5b9ff9f 2003-12-04 devnull {
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);
381 c5b9ff9f 2003-12-04 devnull }
382 c5b9ff9f 2003-12-04 devnull
383 c5b9ff9f 2003-12-04 devnull void
384 c5b9ff9f 2003-12-04 devnull postdec(void)
385 c5b9ff9f 2003-12-04 devnull {
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);
394 c5b9ff9f 2003-12-04 devnull }
395 c5b9ff9f 2003-12-04 devnull
396 c5b9ff9f 2003-12-04 devnull void
397 c5b9ff9f 2003-12-04 devnull gt(void)
398 c5b9ff9f 2003-12-04 devnull {
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);
404 c5b9ff9f 2003-12-04 devnull }
405 c5b9ff9f 2003-12-04 devnull
406 c5b9ff9f 2003-12-04 devnull void
407 c5b9ff9f 2003-12-04 devnull lt(void)
408 c5b9ff9f 2003-12-04 devnull {
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);
414 c5b9ff9f 2003-12-04 devnull }
415 c5b9ff9f 2003-12-04 devnull
416 c5b9ff9f 2003-12-04 devnull void
417 c5b9ff9f 2003-12-04 devnull ge(void)
418 c5b9ff9f 2003-12-04 devnull {
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);
424 c5b9ff9f 2003-12-04 devnull }
425 c5b9ff9f 2003-12-04 devnull
426 c5b9ff9f 2003-12-04 devnull void
427 c5b9ff9f 2003-12-04 devnull le(void)
428 c5b9ff9f 2003-12-04 devnull {
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);
434 c5b9ff9f 2003-12-04 devnull }
435 c5b9ff9f 2003-12-04 devnull
436 c5b9ff9f 2003-12-04 devnull void
437 c5b9ff9f 2003-12-04 devnull eq(void)
438 c5b9ff9f 2003-12-04 devnull {
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);
444 c5b9ff9f 2003-12-04 devnull }
445 c5b9ff9f 2003-12-04 devnull
446 c5b9ff9f 2003-12-04 devnull void
447 c5b9ff9f 2003-12-04 devnull ne(void)
448 c5b9ff9f 2003-12-04 devnull {
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);
454 c5b9ff9f 2003-12-04 devnull }
455 c5b9ff9f 2003-12-04 devnull
456 c5b9ff9f 2003-12-04 devnull void
457 c5b9ff9f 2003-12-04 devnull and(void)
458 c5b9ff9f 2003-12-04 devnull {
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);
464 c5b9ff9f 2003-12-04 devnull }
465 c5b9ff9f 2003-12-04 devnull
466 c5b9ff9f 2003-12-04 devnull void
467 c5b9ff9f 2003-12-04 devnull or(void)
468 c5b9ff9f 2003-12-04 devnull {
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);
474 c5b9ff9f 2003-12-04 devnull }
475 c5b9ff9f 2003-12-04 devnull
476 c5b9ff9f 2003-12-04 devnull void
477 c5b9ff9f 2003-12-04 devnull not(void)
478 c5b9ff9f 2003-12-04 devnull {
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);
483 c5b9ff9f 2003-12-04 devnull }
484 c5b9ff9f 2003-12-04 devnull
485 c5b9ff9f 2003-12-04 devnull void
486 c5b9ff9f 2003-12-04 devnull power(void)
487 c5b9ff9f 2003-12-04 devnull {
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);
493 c5b9ff9f 2003-12-04 devnull }
494 c5b9ff9f 2003-12-04 devnull
495 c5b9ff9f 2003-12-04 devnull void
496 c5b9ff9f 2003-12-04 devnull assign(void)
497 c5b9ff9f 2003-12-04 devnull {
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);
507 c5b9ff9f 2003-12-04 devnull }
508 c5b9ff9f 2003-12-04 devnull
509 c5b9ff9f 2003-12-04 devnull void
510 c5b9ff9f 2003-12-04 devnull addeq(void)
511 c5b9ff9f 2003-12-04 devnull {
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);
521 c5b9ff9f 2003-12-04 devnull }
522 c5b9ff9f 2003-12-04 devnull
523 c5b9ff9f 2003-12-04 devnull void
524 c5b9ff9f 2003-12-04 devnull subeq(void)
525 c5b9ff9f 2003-12-04 devnull {
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);
535 c5b9ff9f 2003-12-04 devnull }
536 c5b9ff9f 2003-12-04 devnull
537 c5b9ff9f 2003-12-04 devnull void
538 c5b9ff9f 2003-12-04 devnull muleq(void)
539 c5b9ff9f 2003-12-04 devnull {
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);
549 c5b9ff9f 2003-12-04 devnull }
550 c5b9ff9f 2003-12-04 devnull
551 c5b9ff9f 2003-12-04 devnull void
552 c5b9ff9f 2003-12-04 devnull diveq(void)
553 c5b9ff9f 2003-12-04 devnull {
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);
563 c5b9ff9f 2003-12-04 devnull }
564 c5b9ff9f 2003-12-04 devnull
565 c5b9ff9f 2003-12-04 devnull void
566 d21d62e2 2004-02-29 devnull ppush(Datum *d)
567 d21d62e2 2004-02-29 devnull {
568 d21d62e2 2004-02-29 devnull push(*d);
569 d21d62e2 2004-02-29 devnull }
570 d21d62e2 2004-02-29 devnull
571 d21d62e2 2004-02-29 devnull void
572 c5b9ff9f 2003-12-04 devnull modeq(void)
573 c5b9ff9f 2003-12-04 devnull {
574 c5b9ff9f 2003-12-04 devnull Datum d1, d2;
575 c5b9ff9f 2003-12-04 devnull long x;
576 d21d62e2 2004-02-29 devnull
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;
588 d21d62e2 2004-02-29 devnull
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);
591 c5b9ff9f 2003-12-04 devnull }
592 c5b9ff9f 2003-12-04 devnull
593 c5b9ff9f 2003-12-04 devnull void
594 c5b9ff9f 2003-12-04 devnull printtop(void) /* pop top value from stack, print it */
595 c5b9ff9f 2003-12-04 devnull {
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 6c611739 2007-12-07 rsc print("%.17g\n", d.val);
602 c5b9ff9f 2003-12-04 devnull s->u.val = d.val;
603 c5b9ff9f 2003-12-04 devnull }
604 c5b9ff9f 2003-12-04 devnull
605 c5b9ff9f 2003-12-04 devnull void
606 c5b9ff9f 2003-12-04 devnull prexpr(void) /* print numeric value */
607 c5b9ff9f 2003-12-04 devnull {
608 c5b9ff9f 2003-12-04 devnull Datum d;
609 c5b9ff9f 2003-12-04 devnull d = pop();
610 6c611739 2007-12-07 rsc print("%.17g ", d.val);
611 c5b9ff9f 2003-12-04 devnull }
612 c5b9ff9f 2003-12-04 devnull
613 c5b9ff9f 2003-12-04 devnull void
614 fa325e9b 2020-01-10 cross prstr(void) /* print string value */
615 c5b9ff9f 2003-12-04 devnull {
616 c5b9ff9f 2003-12-04 devnull print("%s", (char *) *pc++);
617 c5b9ff9f 2003-12-04 devnull }
618 c5b9ff9f 2003-12-04 devnull
619 c5b9ff9f 2003-12-04 devnull void
620 c5b9ff9f 2003-12-04 devnull varread(void) /* read into variable */
621 c5b9ff9f 2003-12-04 devnull {
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++;
625 c5b9ff9f 2003-12-04 devnull int c;
626 c5b9ff9f 2003-12-04 devnull
627 c5b9ff9f 2003-12-04 devnull Again:
628 c5b9ff9f 2003-12-04 devnull do
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){
632 c5b9ff9f 2003-12-04 devnull Iseof:
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;
637 c5b9ff9f 2003-12-04 devnull }
638 c5b9ff9f 2003-12-04 devnull
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;
644 c5b9ff9f 2003-12-04 devnull else
645 c5b9ff9f 2003-12-04 devnull d.val = 1.0;
646 c5b9ff9f 2003-12-04 devnull Return:
647 c5b9ff9f 2003-12-04 devnull var->type = VAR;
648 c5b9ff9f 2003-12-04 devnull push(d);
649 c5b9ff9f 2003-12-04 devnull }
650 c5b9ff9f 2003-12-04 devnull
651 c5b9ff9f 2003-12-04 devnull Inst*
652 c5b9ff9f 2003-12-04 devnull code(Inst f) /* install one instruction or operand */
653 c5b9ff9f 2003-12-04 devnull {
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;
659 c5b9ff9f 2003-12-04 devnull }
660 c5b9ff9f 2003-12-04 devnull
661 c5b9ff9f 2003-12-04 devnull void
662 c5b9ff9f 2003-12-04 devnull execute(Inst* p)
663 c5b9ff9f 2003-12-04 devnull {
664 c5b9ff9f 2003-12-04 devnull for (pc = p; *pc != STOP && !returning; )
665 c5b9ff9f 2003-12-04 devnull (*((++pc)[-1]))();
666 c5b9ff9f 2003-12-04 devnull }