1 564ca709 2004-04-19 devnull #include <u.h>
2 564ca709 2004-04-19 devnull #include <libc.h>
3 564ca709 2004-04-19 devnull #include <bio.h>
4 564ca709 2004-04-19 devnull #include <ctype.h>
5 564ca709 2004-04-19 devnull #include <mach.h>
6 564ca709 2004-04-19 devnull #define Extern extern
7 564ca709 2004-04-19 devnull #include "acid.h"
9 e637c944 2004-04-20 devnull static char *binop[NUMO];
11 e637c944 2004-04-20 devnull static void
12 e637c944 2004-04-20 devnull initbinop(void)
14 e637c944 2004-04-20 devnull binop[OMUL]= "*";
15 e637c944 2004-04-20 devnull binop[ODIV]= "/";
16 e637c944 2004-04-20 devnull binop[OMOD]= "%";
17 e637c944 2004-04-20 devnull binop[OADD]= "+";
18 e637c944 2004-04-20 devnull binop[OSUB]= "-";
19 e637c944 2004-04-20 devnull binop[ORSH]= ">>";
20 e637c944 2004-04-20 devnull binop[OLSH]= "<<";
21 e637c944 2004-04-20 devnull binop[OLT]= "<";
22 e637c944 2004-04-20 devnull binop[OGT]= ">";
23 e637c944 2004-04-20 devnull binop[OLEQ]= "<=";
24 e637c944 2004-04-20 devnull binop[OGEQ]= ">=";
25 e637c944 2004-04-20 devnull binop[OEQ]= "==";
26 e637c944 2004-04-20 devnull binop[ONEQ]= "!=";
27 e637c944 2004-04-20 devnull binop[OLAND]= "&";
28 e637c944 2004-04-20 devnull binop[OXOR]= "^";
29 e637c944 2004-04-20 devnull binop[OLOR]= "|";
30 e637c944 2004-04-20 devnull binop[OCAND]= "&&";
31 e637c944 2004-04-20 devnull binop[OCOR]= "||";
32 e637c944 2004-04-20 devnull binop[OASGN]= " = ";
35 564ca709 2004-04-19 devnull static char *tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
36 e637c944 2004-04-20 devnull char *typenames[] = {
37 e637c944 2004-04-20 devnull "integer",
39 e637c944 2004-04-20 devnull "string",
45 e637c944 2004-04-20 devnull initprint(void)
47 e637c944 2004-04-20 devnull initbinop();
51 564ca709 2004-04-19 devnull cmp(const void *va, const void *vb)
53 564ca709 2004-04-19 devnull char **a = (char**)va;
54 564ca709 2004-04-19 devnull char **b = (char**)vb;
56 564ca709 2004-04-19 devnull return strcmp(*a, *b);
60 564ca709 2004-04-19 devnull fundefs(void)
63 564ca709 2004-04-19 devnull char **vec;
64 564ca709 2004-04-19 devnull int i, j, n, max, col, f, g, s;
69 564ca709 2004-04-19 devnull vec = malloc(sizeof(char*)*g);
70 564ca709 2004-04-19 devnull if(vec == 0)
71 564ca709 2004-04-19 devnull fatal("out of memory");
73 564ca709 2004-04-19 devnull for(i = 0; i < Hashsize; i++) {
74 564ca709 2004-04-19 devnull for(l = hash[i]; l; l = l->hash) {
75 564ca709 2004-04-19 devnull if(l->proc == 0 && l->builtin == 0)
76 564ca709 2004-04-19 devnull continue;
77 564ca709 2004-04-19 devnull n = strlen(l->name);
78 564ca709 2004-04-19 devnull if(n > max)
80 564ca709 2004-04-19 devnull if(f >= g) {
82 564ca709 2004-04-19 devnull vec = realloc(vec, sizeof(char*)*g);
83 564ca709 2004-04-19 devnull if(vec == 0)
84 564ca709 2004-04-19 devnull fatal("out of memory");
86 564ca709 2004-04-19 devnull vec[f++] = l->name;
89 564ca709 2004-04-19 devnull qsort(vec, f, sizeof(char*), cmp);
91 564ca709 2004-04-19 devnull col = 60/max;
92 564ca709 2004-04-19 devnull s = (f+col-1)/col;
94 564ca709 2004-04-19 devnull for(i = 0; i < s; i++) {
95 564ca709 2004-04-19 devnull for(j = i; j < f; j += s)
96 564ca709 2004-04-19 devnull Bprint(bout, "%-*s", max, vec[j]);
97 564ca709 2004-04-19 devnull Bprint(bout, "\n");
102 564ca709 2004-04-19 devnull whatis(Lsym *l)
105 564ca709 2004-04-19 devnull int def;
106 564ca709 2004-04-19 devnull Type *ti;
108 564ca709 2004-04-19 devnull if(l == 0) {
109 564ca709 2004-04-19 devnull fundefs();
113 564ca709 2004-04-19 devnull def = 0;
114 564ca709 2004-04-19 devnull if(l->v->set) {
115 564ca709 2004-04-19 devnull t = l->v->type;
116 564ca709 2004-04-19 devnull Bprint(bout, "%s variable", typenames[t]);
117 564ca709 2004-04-19 devnull if(t == TINT || t == TFLOAT)
118 564ca709 2004-04-19 devnull Bprint(bout, " format %c", l->v->store.fmt);
119 564ca709 2004-04-19 devnull if(l->v->store.comt)
120 564ca709 2004-04-19 devnull Bprint(bout, " complex %s",
121 564ca709 2004-04-19 devnull l->v->store.comt->base->name);
122 564ca709 2004-04-19 devnull Bputc(bout, '\n');
123 564ca709 2004-04-19 devnull def = 1;
125 564ca709 2004-04-19 devnull if(l->lt) {
126 564ca709 2004-04-19 devnull Bprint(bout, "complex %s {\n", l->name);
127 564ca709 2004-04-19 devnull for(ti = l->lt; ti; ti = ti->next) {
128 564ca709 2004-04-19 devnull if(ti->type) {
129 564ca709 2004-04-19 devnull if(ti->fmt == 'a') {
130 564ca709 2004-04-19 devnull Bprint(bout, "\t%s %d %s;\n",
131 564ca709 2004-04-19 devnull ti->type->name, ti->offset,
132 564ca709 2004-04-19 devnull ti->tag->name);
135 564ca709 2004-04-19 devnull Bprint(bout, "\t'%c' %s %d %s;\n",
136 564ca709 2004-04-19 devnull ti->fmt, ti->type->name, ti->offset,
137 564ca709 2004-04-19 devnull ti->tag->name);
141 564ca709 2004-04-19 devnull Bprint(bout, "\t'%c' %d %s;\n",
142 564ca709 2004-04-19 devnull ti->fmt, ti->offset, ti->tag->name);
144 564ca709 2004-04-19 devnull Bprint(bout, "};\n");
145 564ca709 2004-04-19 devnull def = 1;
147 564ca709 2004-04-19 devnull if(l->proc) {
148 564ca709 2004-04-19 devnull Bprint(bout, "defn %s(", l->name);
149 564ca709 2004-04-19 devnull pexpr(l->proc->left);
150 564ca709 2004-04-19 devnull Bprint(bout, ") {\n");
151 564ca709 2004-04-19 devnull pcode(l->proc->right, 1);
152 564ca709 2004-04-19 devnull Bprint(bout, "}\n");
153 564ca709 2004-04-19 devnull def = 1;
155 564ca709 2004-04-19 devnull if(l->builtin) {
156 564ca709 2004-04-19 devnull Bprint(bout, "builtin function\n");
157 564ca709 2004-04-19 devnull def = 1;
159 564ca709 2004-04-19 devnull if(def == 0)
160 564ca709 2004-04-19 devnull Bprint(bout, "%s is undefined\n", l->name);
164 564ca709 2004-04-19 devnull slist(Node *n, int d)
166 564ca709 2004-04-19 devnull if(n == 0)
168 564ca709 2004-04-19 devnull if(n->op == OLIST)
169 564ca709 2004-04-19 devnull Bprint(bout, "%.*s{\n", d-1, tabs);
170 564ca709 2004-04-19 devnull pcode(n, d);
171 564ca709 2004-04-19 devnull if(n->op == OLIST)
172 564ca709 2004-04-19 devnull Bprint(bout, "%.*s}\n", d-1, tabs);
176 564ca709 2004-04-19 devnull pcode(Node *n, int d)
178 564ca709 2004-04-19 devnull Node *r, *l;
180 564ca709 2004-04-19 devnull if(n == 0)
183 564ca709 2004-04-19 devnull r = n->right;
184 564ca709 2004-04-19 devnull l = n->left;
186 564ca709 2004-04-19 devnull switch(n->op) {
187 564ca709 2004-04-19 devnull default:
188 564ca709 2004-04-19 devnull Bprint(bout, "%.*s", d, tabs);
189 564ca709 2004-04-19 devnull pexpr(n);
190 564ca709 2004-04-19 devnull Bprint(bout, ";\n");
192 564ca709 2004-04-19 devnull case OLIST:
193 564ca709 2004-04-19 devnull pcode(n->left, d);
194 564ca709 2004-04-19 devnull pcode(n->right, d);
196 564ca709 2004-04-19 devnull case OLOCAL:
197 564ca709 2004-04-19 devnull Bprint(bout, "%.*slocal", d, tabs);
198 564ca709 2004-04-19 devnull while(l) {
199 564ca709 2004-04-19 devnull Bprint(bout, " %s", l->sym->name);
200 564ca709 2004-04-19 devnull l = l->left;
201 564ca709 2004-04-19 devnull if(l == 0)
202 564ca709 2004-04-19 devnull Bprint(bout, ";\n");
204 564ca709 2004-04-19 devnull Bprint(bout, ",");
207 564ca709 2004-04-19 devnull case OCOMPLEX:
208 564ca709 2004-04-19 devnull Bprint(bout, "%.*scomplex %s %s;\n", d, tabs, n->sym->name, l->sym->name);
210 564ca709 2004-04-19 devnull case OIF:
211 564ca709 2004-04-19 devnull Bprint(bout, "%.*sif ", d, tabs);
212 564ca709 2004-04-19 devnull pexpr(l);
214 564ca709 2004-04-19 devnull Bprint(bout, " then\n");
215 564ca709 2004-04-19 devnull if(r && r->op == OELSE) {
216 564ca709 2004-04-19 devnull slist(r->left, d);
217 564ca709 2004-04-19 devnull Bprint(bout, "%.*selse\n", d-1, tabs);
218 564ca709 2004-04-19 devnull slist(r->right, d);
221 564ca709 2004-04-19 devnull slist(r, d);
223 564ca709 2004-04-19 devnull case OWHILE:
224 564ca709 2004-04-19 devnull Bprint(bout, "%.*swhile ", d, tabs);
225 564ca709 2004-04-19 devnull pexpr(l);
227 564ca709 2004-04-19 devnull Bprint(bout, " do\n");
228 564ca709 2004-04-19 devnull slist(r, d);
230 564ca709 2004-04-19 devnull case ORET:
231 564ca709 2004-04-19 devnull Bprint(bout, "%.*sreturn ", d, tabs);
232 564ca709 2004-04-19 devnull pexpr(l);
233 564ca709 2004-04-19 devnull Bprint(bout, ";\n");
235 564ca709 2004-04-19 devnull case ODO:
236 564ca709 2004-04-19 devnull Bprint(bout, "%.*sloop ", d, tabs);
237 564ca709 2004-04-19 devnull pexpr(l->left);
238 564ca709 2004-04-19 devnull Bprint(bout, ", ");
239 564ca709 2004-04-19 devnull pexpr(l->right);
240 564ca709 2004-04-19 devnull Bprint(bout, " do\n");
241 564ca709 2004-04-19 devnull slist(r, d+1);
246 564ca709 2004-04-19 devnull pexpr(Node *n)
248 564ca709 2004-04-19 devnull Node *r, *l;
250 564ca709 2004-04-19 devnull if(n == 0)
253 564ca709 2004-04-19 devnull r = n->right;
254 564ca709 2004-04-19 devnull l = n->left;
256 564ca709 2004-04-19 devnull switch(n->op) {
257 564ca709 2004-04-19 devnull case ONAME:
258 564ca709 2004-04-19 devnull Bprint(bout, "%s", n->sym->name);
260 564ca709 2004-04-19 devnull case OCONST:
261 564ca709 2004-04-19 devnull switch(n->type) {
262 564ca709 2004-04-19 devnull case TINT:
263 564ca709 2004-04-19 devnull Bprint(bout, "%d", (int)n->store.u.ival);
265 564ca709 2004-04-19 devnull case TFLOAT:
266 564ca709 2004-04-19 devnull Bprint(bout, "%g", n->store.u.fval);
268 564ca709 2004-04-19 devnull case TSTRING:
269 564ca709 2004-04-19 devnull pstr(n->store.u.string);
271 564ca709 2004-04-19 devnull case TLIST:
275 564ca709 2004-04-19 devnull case OMUL:
276 564ca709 2004-04-19 devnull case ODIV:
277 564ca709 2004-04-19 devnull case OMOD:
278 564ca709 2004-04-19 devnull case OADD:
279 564ca709 2004-04-19 devnull case OSUB:
280 564ca709 2004-04-19 devnull case ORSH:
281 564ca709 2004-04-19 devnull case OLSH:
282 564ca709 2004-04-19 devnull case OLT:
283 564ca709 2004-04-19 devnull case OGT:
284 564ca709 2004-04-19 devnull case OLEQ:
285 564ca709 2004-04-19 devnull case OGEQ:
286 564ca709 2004-04-19 devnull case OEQ:
287 564ca709 2004-04-19 devnull case ONEQ:
288 564ca709 2004-04-19 devnull case OLAND:
289 564ca709 2004-04-19 devnull case OXOR:
290 564ca709 2004-04-19 devnull case OLOR:
291 564ca709 2004-04-19 devnull case OCAND:
292 564ca709 2004-04-19 devnull case OCOR:
293 564ca709 2004-04-19 devnull Bputc(bout, '(');
294 564ca709 2004-04-19 devnull pexpr(l);
295 564ca709 2004-04-19 devnull Bprint(bout, binop[(uchar)n->op]);
296 564ca709 2004-04-19 devnull pexpr(r);
297 564ca709 2004-04-19 devnull Bputc(bout, ')');
299 564ca709 2004-04-19 devnull case OASGN:
300 564ca709 2004-04-19 devnull pexpr(l);
301 564ca709 2004-04-19 devnull Bprint(bout, binop[(uchar)n->op]);
302 564ca709 2004-04-19 devnull pexpr(r);
304 564ca709 2004-04-19 devnull case OINDM:
305 564ca709 2004-04-19 devnull Bprint(bout, "*");
306 564ca709 2004-04-19 devnull pexpr(l);
308 564ca709 2004-04-19 devnull case OEDEC:
309 564ca709 2004-04-19 devnull Bprint(bout, "--");
310 564ca709 2004-04-19 devnull pexpr(l);
312 564ca709 2004-04-19 devnull case OEINC:
313 564ca709 2004-04-19 devnull Bprint(bout, "++");
314 564ca709 2004-04-19 devnull pexpr(l);
316 564ca709 2004-04-19 devnull case OPINC:
317 564ca709 2004-04-19 devnull pexpr(l);
318 564ca709 2004-04-19 devnull Bprint(bout, "++");
320 564ca709 2004-04-19 devnull case OPDEC:
321 564ca709 2004-04-19 devnull pexpr(l);
322 564ca709 2004-04-19 devnull Bprint(bout, "--");
324 564ca709 2004-04-19 devnull case ONOT:
325 564ca709 2004-04-19 devnull Bprint(bout, "!");
326 564ca709 2004-04-19 devnull pexpr(l);
328 564ca709 2004-04-19 devnull case OLIST:
329 564ca709 2004-04-19 devnull pexpr(l);
331 564ca709 2004-04-19 devnull Bprint(bout, ",");
332 564ca709 2004-04-19 devnull pexpr(r);
335 564ca709 2004-04-19 devnull case OCALL:
336 564ca709 2004-04-19 devnull pexpr(l);
337 564ca709 2004-04-19 devnull Bprint(bout, "(");
338 564ca709 2004-04-19 devnull pexpr(r);
339 564ca709 2004-04-19 devnull Bprint(bout, ")");
341 564ca709 2004-04-19 devnull case OCTRUCT:
342 564ca709 2004-04-19 devnull Bprint(bout, "{");
343 564ca709 2004-04-19 devnull pexpr(l);
344 564ca709 2004-04-19 devnull Bprint(bout, "}");
346 564ca709 2004-04-19 devnull case OHEAD:
347 564ca709 2004-04-19 devnull Bprint(bout, "head ");
348 564ca709 2004-04-19 devnull pexpr(l);
350 564ca709 2004-04-19 devnull case OTAIL:
351 564ca709 2004-04-19 devnull Bprint(bout, "tail ");
352 564ca709 2004-04-19 devnull pexpr(l);
354 564ca709 2004-04-19 devnull case OAPPEND:
355 564ca709 2004-04-19 devnull Bprint(bout, "append ");
356 564ca709 2004-04-19 devnull pexpr(l);
357 564ca709 2004-04-19 devnull Bprint(bout, ",");
358 564ca709 2004-04-19 devnull pexpr(r);
360 564ca709 2004-04-19 devnull case ODELETE:
361 564ca709 2004-04-19 devnull Bprint(bout, "delete ");
362 564ca709 2004-04-19 devnull pexpr(l);
363 564ca709 2004-04-19 devnull Bprint(bout, ",");
364 564ca709 2004-04-19 devnull pexpr(r);
366 564ca709 2004-04-19 devnull case ORET:
367 564ca709 2004-04-19 devnull Bprint(bout, "return ");
368 564ca709 2004-04-19 devnull pexpr(l);
370 564ca709 2004-04-19 devnull case OINDEX:
371 564ca709 2004-04-19 devnull pexpr(l);
372 564ca709 2004-04-19 devnull Bprint(bout, "[");
373 564ca709 2004-04-19 devnull pexpr(r);
374 564ca709 2004-04-19 devnull Bprint(bout, "]");
376 564ca709 2004-04-19 devnull case OINDC:
377 564ca709 2004-04-19 devnull Bprint(bout, "@");
378 564ca709 2004-04-19 devnull pexpr(l);
380 564ca709 2004-04-19 devnull case ODOT:
381 564ca709 2004-04-19 devnull pexpr(l);
382 564ca709 2004-04-19 devnull Bprint(bout, ".%s", n->sym->name);
384 564ca709 2004-04-19 devnull case OFRAME:
385 564ca709 2004-04-19 devnull Bprint(bout, "%s:%s", n->sym->name, l->sym->name);
387 564ca709 2004-04-19 devnull case OCAST:
388 564ca709 2004-04-19 devnull Bprint(bout, "(%s)", n->sym->name);
389 564ca709 2004-04-19 devnull pexpr(l);
391 564ca709 2004-04-19 devnull case OFMT:
392 564ca709 2004-04-19 devnull pexpr(l);
393 564ca709 2004-04-19 devnull Bprint(bout, "\\%c", (int)r->store.u.ival);
395 564ca709 2004-04-19 devnull case OEVAL:
396 564ca709 2004-04-19 devnull Bprint(bout, "eval ");
397 564ca709 2004-04-19 devnull pexpr(l);
399 564ca709 2004-04-19 devnull case OWHAT:
400 564ca709 2004-04-19 devnull Bprint(bout, "whatis");
401 564ca709 2004-04-19 devnull if(n->sym)
402 564ca709 2004-04-19 devnull Bprint(bout, " %s", n->sym->name);
404 4f2ac1b7 2005-01-23 devnull case OUPLUS:
405 4f2ac1b7 2005-01-23 devnull Bprint(bout, "+");
406 4f2ac1b7 2005-01-23 devnull pexpr(l);
412 564ca709 2004-04-19 devnull pstr(String *s)
414 564ca709 2004-04-19 devnull int i, c;
416 564ca709 2004-04-19 devnull Bputc(bout, '"');
417 564ca709 2004-04-19 devnull for(i = 0; i < s->len; i++) {
418 564ca709 2004-04-19 devnull c = s->string[i];
419 564ca709 2004-04-19 devnull switch(c) {
420 564ca709 2004-04-19 devnull case '\0':
421 564ca709 2004-04-19 devnull c = '0';
423 564ca709 2004-04-19 devnull case '\n':
424 564ca709 2004-04-19 devnull c = 'n';
426 564ca709 2004-04-19 devnull case '\r':
427 564ca709 2004-04-19 devnull c = 'r';
429 564ca709 2004-04-19 devnull case '\t':
430 564ca709 2004-04-19 devnull c = 't';
432 564ca709 2004-04-19 devnull case '\b':
433 564ca709 2004-04-19 devnull c = 'b';
435 564ca709 2004-04-19 devnull case '\f':
436 564ca709 2004-04-19 devnull c = 'f';
438 564ca709 2004-04-19 devnull case '\a':
439 564ca709 2004-04-19 devnull c = 'a';
441 564ca709 2004-04-19 devnull case '\v':
442 564ca709 2004-04-19 devnull c = 'v';
444 564ca709 2004-04-19 devnull case '\\':
445 564ca709 2004-04-19 devnull c = '\\';
447 564ca709 2004-04-19 devnull case '"':
448 564ca709 2004-04-19 devnull c = '"';
450 564ca709 2004-04-19 devnull default:
451 564ca709 2004-04-19 devnull Bputc(bout, c);
452 564ca709 2004-04-19 devnull continue;
454 564ca709 2004-04-19 devnull Bputc(bout, '\\');
455 564ca709 2004-04-19 devnull Bputc(bout, c);
457 564ca709 2004-04-19 devnull Bputc(bout, '"');