Blame


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"
8 564ca709 2004-04-19 devnull
9 e637c944 2004-04-20 devnull static char *binop[NUMO];
10 e637c944 2004-04-20 devnull
11 e637c944 2004-04-20 devnull static void
12 e637c944 2004-04-20 devnull initbinop(void)
13 564ca709 2004-04-19 devnull {
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]= " = ";
33 a0f1e21f 2004-04-20 devnull }
34 564ca709 2004-04-19 devnull
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",
38 e637c944 2004-04-20 devnull "float",
39 e637c944 2004-04-20 devnull "string",
40 e637c944 2004-04-20 devnull "list",
41 cbeb0b26 2006-04-01 devnull "code"
42 564ca709 2004-04-19 devnull };
43 e637c944 2004-04-20 devnull
44 e637c944 2004-04-20 devnull void
45 e637c944 2004-04-20 devnull initprint(void)
46 e637c944 2004-04-20 devnull {
47 e637c944 2004-04-20 devnull initbinop();
48 e637c944 2004-04-20 devnull }
49 564ca709 2004-04-19 devnull
50 564ca709 2004-04-19 devnull int
51 564ca709 2004-04-19 devnull cmp(const void *va, const void *vb)
52 564ca709 2004-04-19 devnull {
53 564ca709 2004-04-19 devnull char **a = (char**)va;
54 564ca709 2004-04-19 devnull char **b = (char**)vb;
55 564ca709 2004-04-19 devnull
56 564ca709 2004-04-19 devnull return strcmp(*a, *b);
57 564ca709 2004-04-19 devnull }
58 564ca709 2004-04-19 devnull
59 564ca709 2004-04-19 devnull void
60 564ca709 2004-04-19 devnull fundefs(void)
61 564ca709 2004-04-19 devnull {
62 564ca709 2004-04-19 devnull Lsym *l;
63 564ca709 2004-04-19 devnull char **vec;
64 564ca709 2004-04-19 devnull int i, j, n, max, col, f, g, s;
65 564ca709 2004-04-19 devnull
66 564ca709 2004-04-19 devnull max = 0;
67 564ca709 2004-04-19 devnull f = 0;
68 564ca709 2004-04-19 devnull g = 100;
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");
72 564ca709 2004-04-19 devnull
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)
79 564ca709 2004-04-19 devnull max = n;
80 564ca709 2004-04-19 devnull if(f >= g) {
81 564ca709 2004-04-19 devnull g *= 2;
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");
85 564ca709 2004-04-19 devnull }
86 564ca709 2004-04-19 devnull vec[f++] = l->name;
87 564ca709 2004-04-19 devnull }
88 564ca709 2004-04-19 devnull }
89 564ca709 2004-04-19 devnull qsort(vec, f, sizeof(char*), cmp);
90 564ca709 2004-04-19 devnull max++;
91 564ca709 2004-04-19 devnull col = 60/max;
92 564ca709 2004-04-19 devnull s = (f+col-1)/col;
93 564ca709 2004-04-19 devnull
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");
98 564ca709 2004-04-19 devnull }
99 564ca709 2004-04-19 devnull }
100 564ca709 2004-04-19 devnull
101 564ca709 2004-04-19 devnull void
102 564ca709 2004-04-19 devnull whatis(Lsym *l)
103 564ca709 2004-04-19 devnull {
104 564ca709 2004-04-19 devnull int t;
105 564ca709 2004-04-19 devnull int def;
106 564ca709 2004-04-19 devnull Type *ti;
107 564ca709 2004-04-19 devnull
108 564ca709 2004-04-19 devnull if(l == 0) {
109 564ca709 2004-04-19 devnull fundefs();
110 564ca709 2004-04-19 devnull return;
111 564ca709 2004-04-19 devnull }
112 564ca709 2004-04-19 devnull
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;
124 564ca709 2004-04-19 devnull }
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);
133 564ca709 2004-04-19 devnull }
134 564ca709 2004-04-19 devnull else {
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);
138 564ca709 2004-04-19 devnull }
139 564ca709 2004-04-19 devnull }
140 564ca709 2004-04-19 devnull else
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);
143 564ca709 2004-04-19 devnull }
144 564ca709 2004-04-19 devnull Bprint(bout, "};\n");
145 564ca709 2004-04-19 devnull def = 1;
146 564ca709 2004-04-19 devnull }
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;
154 564ca709 2004-04-19 devnull }
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;
158 564ca709 2004-04-19 devnull }
159 564ca709 2004-04-19 devnull if(def == 0)
160 564ca709 2004-04-19 devnull Bprint(bout, "%s is undefined\n", l->name);
161 564ca709 2004-04-19 devnull }
162 564ca709 2004-04-19 devnull
163 564ca709 2004-04-19 devnull void
164 564ca709 2004-04-19 devnull slist(Node *n, int d)
165 564ca709 2004-04-19 devnull {
166 564ca709 2004-04-19 devnull if(n == 0)
167 564ca709 2004-04-19 devnull return;
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);
173 564ca709 2004-04-19 devnull }
174 564ca709 2004-04-19 devnull
175 564ca709 2004-04-19 devnull void
176 564ca709 2004-04-19 devnull pcode(Node *n, int d)
177 564ca709 2004-04-19 devnull {
178 564ca709 2004-04-19 devnull Node *r, *l;
179 564ca709 2004-04-19 devnull
180 564ca709 2004-04-19 devnull if(n == 0)
181 564ca709 2004-04-19 devnull return;
182 564ca709 2004-04-19 devnull
183 564ca709 2004-04-19 devnull r = n->right;
184 564ca709 2004-04-19 devnull l = n->left;
185 564ca709 2004-04-19 devnull
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");
191 564ca709 2004-04-19 devnull break;
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);
195 564ca709 2004-04-19 devnull break;
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");
203 564ca709 2004-04-19 devnull else
204 564ca709 2004-04-19 devnull Bprint(bout, ",");
205 564ca709 2004-04-19 devnull }
206 564ca709 2004-04-19 devnull break;
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);
209 564ca709 2004-04-19 devnull break;
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);
213 564ca709 2004-04-19 devnull d++;
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);
219 564ca709 2004-04-19 devnull }
220 564ca709 2004-04-19 devnull else
221 564ca709 2004-04-19 devnull slist(r, d);
222 564ca709 2004-04-19 devnull break;
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);
226 564ca709 2004-04-19 devnull d++;
227 564ca709 2004-04-19 devnull Bprint(bout, " do\n");
228 564ca709 2004-04-19 devnull slist(r, d);
229 564ca709 2004-04-19 devnull break;
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");
234 564ca709 2004-04-19 devnull break;
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);
242 564ca709 2004-04-19 devnull }
243 564ca709 2004-04-19 devnull }
244 564ca709 2004-04-19 devnull
245 564ca709 2004-04-19 devnull void
246 564ca709 2004-04-19 devnull pexpr(Node *n)
247 564ca709 2004-04-19 devnull {
248 564ca709 2004-04-19 devnull Node *r, *l;
249 564ca709 2004-04-19 devnull
250 564ca709 2004-04-19 devnull if(n == 0)
251 564ca709 2004-04-19 devnull return;
252 564ca709 2004-04-19 devnull
253 564ca709 2004-04-19 devnull r = n->right;
254 564ca709 2004-04-19 devnull l = n->left;
255 564ca709 2004-04-19 devnull
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);
259 564ca709 2004-04-19 devnull break;
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);
264 564ca709 2004-04-19 devnull break;
265 564ca709 2004-04-19 devnull case TFLOAT:
266 564ca709 2004-04-19 devnull Bprint(bout, "%g", n->store.u.fval);
267 564ca709 2004-04-19 devnull break;
268 564ca709 2004-04-19 devnull case TSTRING:
269 564ca709 2004-04-19 devnull pstr(n->store.u.string);
270 564ca709 2004-04-19 devnull break;
271 564ca709 2004-04-19 devnull case TLIST:
272 564ca709 2004-04-19 devnull break;
273 564ca709 2004-04-19 devnull }
274 564ca709 2004-04-19 devnull break;
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, ')');
298 564ca709 2004-04-19 devnull break;
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);
303 564ca709 2004-04-19 devnull break;
304 564ca709 2004-04-19 devnull case OINDM:
305 564ca709 2004-04-19 devnull Bprint(bout, "*");
306 564ca709 2004-04-19 devnull pexpr(l);
307 564ca709 2004-04-19 devnull break;
308 564ca709 2004-04-19 devnull case OEDEC:
309 564ca709 2004-04-19 devnull Bprint(bout, "--");
310 564ca709 2004-04-19 devnull pexpr(l);
311 564ca709 2004-04-19 devnull break;
312 564ca709 2004-04-19 devnull case OEINC:
313 564ca709 2004-04-19 devnull Bprint(bout, "++");
314 564ca709 2004-04-19 devnull pexpr(l);
315 564ca709 2004-04-19 devnull break;
316 564ca709 2004-04-19 devnull case OPINC:
317 564ca709 2004-04-19 devnull pexpr(l);
318 564ca709 2004-04-19 devnull Bprint(bout, "++");
319 564ca709 2004-04-19 devnull break;
320 564ca709 2004-04-19 devnull case OPDEC:
321 564ca709 2004-04-19 devnull pexpr(l);
322 564ca709 2004-04-19 devnull Bprint(bout, "--");
323 564ca709 2004-04-19 devnull break;
324 564ca709 2004-04-19 devnull case ONOT:
325 564ca709 2004-04-19 devnull Bprint(bout, "!");
326 564ca709 2004-04-19 devnull pexpr(l);
327 564ca709 2004-04-19 devnull break;
328 564ca709 2004-04-19 devnull case OLIST:
329 564ca709 2004-04-19 devnull pexpr(l);
330 564ca709 2004-04-19 devnull if(r) {
331 564ca709 2004-04-19 devnull Bprint(bout, ",");
332 564ca709 2004-04-19 devnull pexpr(r);
333 564ca709 2004-04-19 devnull }
334 564ca709 2004-04-19 devnull break;
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, ")");
340 564ca709 2004-04-19 devnull break;
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, "}");
345 564ca709 2004-04-19 devnull break;
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);
349 564ca709 2004-04-19 devnull break;
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);
353 564ca709 2004-04-19 devnull break;
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);
359 564ca709 2004-04-19 devnull break;
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);
365 564ca709 2004-04-19 devnull break;
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);
369 564ca709 2004-04-19 devnull break;
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, "]");
375 564ca709 2004-04-19 devnull break;
376 564ca709 2004-04-19 devnull case OINDC:
377 564ca709 2004-04-19 devnull Bprint(bout, "@");
378 564ca709 2004-04-19 devnull pexpr(l);
379 564ca709 2004-04-19 devnull break;
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);
383 564ca709 2004-04-19 devnull break;
384 564ca709 2004-04-19 devnull case OFRAME:
385 564ca709 2004-04-19 devnull Bprint(bout, "%s:%s", n->sym->name, l->sym->name);
386 564ca709 2004-04-19 devnull break;
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);
390 564ca709 2004-04-19 devnull break;
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);
394 564ca709 2004-04-19 devnull break;
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);
398 564ca709 2004-04-19 devnull break;
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);
403 4f2ac1b7 2005-01-23 devnull break;
404 4f2ac1b7 2005-01-23 devnull case OUPLUS:
405 4f2ac1b7 2005-01-23 devnull Bprint(bout, "+");
406 4f2ac1b7 2005-01-23 devnull pexpr(l);
407 564ca709 2004-04-19 devnull break;
408 564ca709 2004-04-19 devnull }
409 564ca709 2004-04-19 devnull }
410 564ca709 2004-04-19 devnull
411 564ca709 2004-04-19 devnull void
412 564ca709 2004-04-19 devnull pstr(String *s)
413 564ca709 2004-04-19 devnull {
414 564ca709 2004-04-19 devnull int i, c;
415 564ca709 2004-04-19 devnull
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';
422 564ca709 2004-04-19 devnull break;
423 564ca709 2004-04-19 devnull case '\n':
424 564ca709 2004-04-19 devnull c = 'n';
425 564ca709 2004-04-19 devnull break;
426 564ca709 2004-04-19 devnull case '\r':
427 564ca709 2004-04-19 devnull c = 'r';
428 564ca709 2004-04-19 devnull break;
429 564ca709 2004-04-19 devnull case '\t':
430 564ca709 2004-04-19 devnull c = 't';
431 564ca709 2004-04-19 devnull break;
432 564ca709 2004-04-19 devnull case '\b':
433 564ca709 2004-04-19 devnull c = 'b';
434 564ca709 2004-04-19 devnull break;
435 564ca709 2004-04-19 devnull case '\f':
436 564ca709 2004-04-19 devnull c = 'f';
437 564ca709 2004-04-19 devnull break;
438 564ca709 2004-04-19 devnull case '\a':
439 564ca709 2004-04-19 devnull c = 'a';
440 564ca709 2004-04-19 devnull break;
441 564ca709 2004-04-19 devnull case '\v':
442 564ca709 2004-04-19 devnull c = 'v';
443 564ca709 2004-04-19 devnull break;
444 564ca709 2004-04-19 devnull case '\\':
445 564ca709 2004-04-19 devnull c = '\\';
446 564ca709 2004-04-19 devnull break;
447 564ca709 2004-04-19 devnull case '"':
448 564ca709 2004-04-19 devnull c = '"';
449 564ca709 2004-04-19 devnull break;
450 564ca709 2004-04-19 devnull default:
451 564ca709 2004-04-19 devnull Bputc(bout, c);
452 564ca709 2004-04-19 devnull continue;
453 564ca709 2004-04-19 devnull }
454 564ca709 2004-04-19 devnull Bputc(bout, '\\');
455 564ca709 2004-04-19 devnull Bputc(bout, c);
456 564ca709 2004-04-19 devnull }
457 564ca709 2004-04-19 devnull Bputc(bout, '"');
458 564ca709 2004-04-19 devnull }