xref: /plan9/sys/src/cmd/acid/print.c (revision 4de34a7edde43207e841ec91ecd12e6cf5f5ebe7)
1bd389b36SDavid du Colombier #include <u.h>
2bd389b36SDavid du Colombier #include <libc.h>
3bd389b36SDavid du Colombier #include <bio.h>
4bd389b36SDavid du Colombier #include <ctype.h>
5bd389b36SDavid du Colombier #include <mach.h>
6bd389b36SDavid du Colombier #define Extern extern
7bd389b36SDavid du Colombier #include "acid.h"
8bd389b36SDavid du Colombier 
9bd389b36SDavid du Colombier static char *binop[] =
10bd389b36SDavid du Colombier {
11bd389b36SDavid du Colombier 	[OMUL]	"*",
12bd389b36SDavid du Colombier 	[ODIV]	"/",
13bd389b36SDavid du Colombier 	[OMOD]	"%",
14bd389b36SDavid du Colombier 	[OADD]	"+",
15bd389b36SDavid du Colombier 	[OSUB]	"-",
16bd389b36SDavid du Colombier 	[ORSH]	">>",
17bd389b36SDavid du Colombier 	[OLSH]	"<<",
18bd389b36SDavid du Colombier 	[OLT]	"<",
19bd389b36SDavid du Colombier 	[OGT]	">",
20bd389b36SDavid du Colombier 	[OLEQ]	"<=",
21bd389b36SDavid du Colombier 	[OGEQ]	">=",
22bd389b36SDavid du Colombier 	[OEQ]	"==",
23bd389b36SDavid du Colombier 	[ONEQ]	"!=",
24bd389b36SDavid du Colombier 	[OLAND]	"&",
25bd389b36SDavid du Colombier 	[OXOR]	"^",
26bd389b36SDavid du Colombier 	[OLOR]	"|",
27bd389b36SDavid du Colombier 	[OCAND]	"&&",
28bd389b36SDavid du Colombier 	[OCOR]	"||",
29219b2ee8SDavid du Colombier 	[OASGN]	" = ",
30bd389b36SDavid du Colombier };
31bd389b36SDavid du Colombier 
32bd389b36SDavid du Colombier static char *tabs = "\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t";
3380ee5cbfSDavid du Colombier char *typenames[] =
34bd389b36SDavid du Colombier {
35bd389b36SDavid du Colombier 	[TINT]		"integer",
36bd389b36SDavid du Colombier 	[TFLOAT]	"float",
37bd389b36SDavid du Colombier 	[TSTRING]	"string",
38bd389b36SDavid du Colombier 	[TLIST]		"list",
39219b2ee8SDavid du Colombier 	[TCODE]		"code",
40bd389b36SDavid du Colombier };
41bd389b36SDavid du Colombier 
42219b2ee8SDavid du Colombier int
cmp(void * va,void * vb)437dd7cddfSDavid du Colombier cmp(void *va, void *vb)
44219b2ee8SDavid du Colombier {
457dd7cddfSDavid du Colombier 	char **a = va;
467dd7cddfSDavid du Colombier 	char **b = vb;
477dd7cddfSDavid du Colombier 
48219b2ee8SDavid du Colombier 	return strcmp(*a, *b);
49219b2ee8SDavid du Colombier }
50219b2ee8SDavid du Colombier 
51219b2ee8SDavid du Colombier void
fundefs(void)52219b2ee8SDavid du Colombier fundefs(void)
53219b2ee8SDavid du Colombier {
54219b2ee8SDavid du Colombier 	Lsym *l;
55219b2ee8SDavid du Colombier 	char **vec;
56219b2ee8SDavid du Colombier 	int i, j, n, max, col, f, g, s;
57219b2ee8SDavid du Colombier 
58219b2ee8SDavid du Colombier 	max = 0;
59219b2ee8SDavid du Colombier 	f = 0;
60219b2ee8SDavid du Colombier 	g = 100;
61219b2ee8SDavid du Colombier 	vec = malloc(sizeof(char*)*g);
62219b2ee8SDavid du Colombier 	if(vec == 0)
63219b2ee8SDavid du Colombier 		fatal("out of memory");
64219b2ee8SDavid du Colombier 
65219b2ee8SDavid du Colombier 	for(i = 0; i < Hashsize; i++) {
66219b2ee8SDavid du Colombier 		for(l = hash[i]; l; l = l->hash) {
67219b2ee8SDavid du Colombier 			if(l->proc == 0 && l->builtin == 0)
68219b2ee8SDavid du Colombier 				continue;
69219b2ee8SDavid du Colombier 			n = strlen(l->name);
70219b2ee8SDavid du Colombier 			if(n > max)
71219b2ee8SDavid du Colombier 				max = n;
72219b2ee8SDavid du Colombier 			if(f >= g) {
73219b2ee8SDavid du Colombier 				g *= 2;
74219b2ee8SDavid du Colombier 				vec = realloc(vec, sizeof(char*)*g);
75219b2ee8SDavid du Colombier 				if(vec == 0)
76219b2ee8SDavid du Colombier 					fatal("out of memory");
77219b2ee8SDavid du Colombier 			}
78219b2ee8SDavid du Colombier 			vec[f++] = l->name;
79219b2ee8SDavid du Colombier 		}
80219b2ee8SDavid du Colombier 	}
81219b2ee8SDavid du Colombier         qsort(vec, f, sizeof(char*), cmp);
82219b2ee8SDavid du Colombier 	max++;
83219b2ee8SDavid du Colombier 	col = 60/max;
84219b2ee8SDavid du Colombier 	s = (f+col-1)/col;
85219b2ee8SDavid du Colombier 
86219b2ee8SDavid du Colombier 	for(i = 0; i < s; i++) {
87219b2ee8SDavid du Colombier 		for(j = i; j < f; j += s)
88219b2ee8SDavid du Colombier 			Bprint(bout, "%-*s", max, vec[j]);
89219b2ee8SDavid du Colombier 		Bprint(bout, "\n");
90219b2ee8SDavid du Colombier 	}
91219b2ee8SDavid du Colombier }
92219b2ee8SDavid du Colombier 
93bd389b36SDavid du Colombier void
whatis(Lsym * l)94bd389b36SDavid du Colombier whatis(Lsym *l)
95bd389b36SDavid du Colombier {
96bd389b36SDavid du Colombier 	int t;
97bd389b36SDavid du Colombier 	int def;
98bd389b36SDavid du Colombier 	Type *ti;
99bd389b36SDavid du Colombier 
100219b2ee8SDavid du Colombier 	if(l == 0) {
101219b2ee8SDavid du Colombier 		fundefs();
102219b2ee8SDavid du Colombier 		return;
103219b2ee8SDavid du Colombier 	}
104219b2ee8SDavid du Colombier 
105bd389b36SDavid du Colombier 	def = 0;
106bd389b36SDavid du Colombier 	if(l->v->set) {
107bd389b36SDavid du Colombier 		t = l->v->type;
10880ee5cbfSDavid du Colombier 		Bprint(bout, "%s variable", typenames[t]);
109bd389b36SDavid du Colombier 		if(t == TINT || t == TFLOAT)
110bd389b36SDavid du Colombier 			Bprint(bout, " format %c", l->v->fmt);
111219b2ee8SDavid du Colombier 		if(l->v->comt)
112*4de34a7eSDavid du Colombier 			Bprint(bout, " complex %s", l->v->comt->base->name);
113bd389b36SDavid du Colombier 		Bputc(bout, '\n');
114bd389b36SDavid du Colombier 		def = 1;
115bd389b36SDavid du Colombier 	}
116bd389b36SDavid du Colombier 	if(l->lt) {
117219b2ee8SDavid du Colombier 		Bprint(bout, "complex %s {\n", l->name);
118219b2ee8SDavid du Colombier 		for(ti = l->lt; ti; ti = ti->next) {
119219b2ee8SDavid du Colombier 			if(ti->type) {
120219b2ee8SDavid du Colombier 				if(ti->fmt == 'a') {
121219b2ee8SDavid du Colombier 					Bprint(bout, "\t%s %d %s;\n",
122219b2ee8SDavid du Colombier 					ti->type->name, ti->offset,
123219b2ee8SDavid du Colombier 					ti->tag->name);
124219b2ee8SDavid du Colombier 				}
125219b2ee8SDavid du Colombier 				else {
126219b2ee8SDavid du Colombier 					Bprint(bout, "\t'%c' %s %d %s;\n",
127219b2ee8SDavid du Colombier 					ti->fmt, ti->type->name, ti->offset,
128219b2ee8SDavid du Colombier 					ti->tag->name);
129219b2ee8SDavid du Colombier 				}
130219b2ee8SDavid du Colombier 			}
131219b2ee8SDavid du Colombier 			else
132219b2ee8SDavid du Colombier 				Bprint(bout, "\t'%c' %d %s;\n",
133219b2ee8SDavid du Colombier 				ti->fmt, ti->offset, ti->tag->name);
134219b2ee8SDavid du Colombier 		}
135219b2ee8SDavid du Colombier 		Bprint(bout, "};\n");
136bd389b36SDavid du Colombier 		def = 1;
137bd389b36SDavid du Colombier 	}
138bd389b36SDavid du Colombier 	if(l->proc) {
139bd389b36SDavid du Colombier 		Bprint(bout, "defn %s(", l->name);
140bd389b36SDavid du Colombier 		pexpr(l->proc->left);
141219b2ee8SDavid du Colombier 		Bprint(bout, ") {\n");
142bd389b36SDavid du Colombier 		pcode(l->proc->right, 1);
143bd389b36SDavid du Colombier 		Bprint(bout, "}\n");
144bd389b36SDavid du Colombier 		def = 1;
145bd389b36SDavid du Colombier 	}
146bd389b36SDavid du Colombier 	if(l->builtin) {
147bd389b36SDavid du Colombier 		Bprint(bout, "builtin function\n");
148bd389b36SDavid du Colombier 		def = 1;
149bd389b36SDavid du Colombier 	}
150bd389b36SDavid du Colombier 	if(def == 0)
151bd389b36SDavid du Colombier 		Bprint(bout, "%s is undefined\n", l->name);
152bd389b36SDavid du Colombier }
153bd389b36SDavid du Colombier 
154bd389b36SDavid du Colombier void
slist(Node * n,int d)155bd389b36SDavid du Colombier slist(Node *n, int d)
156bd389b36SDavid du Colombier {
157bd389b36SDavid du Colombier 	if(n == 0)
158bd389b36SDavid du Colombier 		return;
159bd389b36SDavid du Colombier 	if(n->op == OLIST)
160bd389b36SDavid du Colombier 		Bprint(bout, "%.*s{\n", d-1, tabs);
161bd389b36SDavid du Colombier 	pcode(n, d);
162bd389b36SDavid du Colombier 	if(n->op == OLIST)
163bd389b36SDavid du Colombier 		Bprint(bout, "%.*s}\n", d-1, tabs);
164bd389b36SDavid du Colombier }
165bd389b36SDavid du Colombier 
166bd389b36SDavid du Colombier void
pcode(Node * n,int d)167bd389b36SDavid du Colombier pcode(Node *n, int d)
168bd389b36SDavid du Colombier {
169bd389b36SDavid du Colombier 	Node *r, *l;
170bd389b36SDavid du Colombier 
171bd389b36SDavid du Colombier 	if(n == 0)
172bd389b36SDavid du Colombier 		return;
173bd389b36SDavid du Colombier 
174bd389b36SDavid du Colombier 	r = n->right;
175bd389b36SDavid du Colombier 	l = n->left;
176bd389b36SDavid du Colombier 
177bd389b36SDavid du Colombier 	switch(n->op) {
178bd389b36SDavid du Colombier 	default:
179bd389b36SDavid du Colombier 		Bprint(bout, "%.*s", d, tabs);
180bd389b36SDavid du Colombier 		pexpr(n);
181bd389b36SDavid du Colombier 		Bprint(bout, ";\n");
182bd389b36SDavid du Colombier 		break;
183bd389b36SDavid du Colombier 	case OLIST:
184bd389b36SDavid du Colombier 		pcode(n->left, d);
185bd389b36SDavid du Colombier 		pcode(n->right, d);
186bd389b36SDavid du Colombier 		break;
187bd389b36SDavid du Colombier 	case OLOCAL:
188219b2ee8SDavid du Colombier 		Bprint(bout, "%.*slocal", d, tabs);
189219b2ee8SDavid du Colombier 		while(l) {
190219b2ee8SDavid du Colombier 			Bprint(bout, " %s", l->sym->name);
191219b2ee8SDavid du Colombier 			l = l->left;
192219b2ee8SDavid du Colombier 			if(l == 0)
193219b2ee8SDavid du Colombier 				Bprint(bout, ";\n");
194219b2ee8SDavid du Colombier 			else
195219b2ee8SDavid du Colombier 				Bprint(bout, ",");
196219b2ee8SDavid du Colombier 		}
197bd389b36SDavid du Colombier 		break;
198bd389b36SDavid du Colombier 	case OCOMPLEX:
199bd389b36SDavid du Colombier 		Bprint(bout, "%.*scomplex %s %s;\n", d, tabs, n->sym->name, l->sym->name);
200bd389b36SDavid du Colombier 		break;
201bd389b36SDavid du Colombier 	case OIF:
202bd389b36SDavid du Colombier 		Bprint(bout, "%.*sif ", d, tabs);
203bd389b36SDavid du Colombier 		pexpr(l);
204bd389b36SDavid du Colombier 		d++;
2057dd7cddfSDavid du Colombier 		Bprint(bout, " then\n");
206bd389b36SDavid du Colombier 		if(r && r->op == OELSE) {
207bd389b36SDavid du Colombier 			slist(r->left, d);
2087dd7cddfSDavid du Colombier 			Bprint(bout, "%.*selse\n", d-1, tabs);
209bd389b36SDavid du Colombier 			slist(r->right, d);
210bd389b36SDavid du Colombier 		}
211bd389b36SDavid du Colombier 		else
212bd389b36SDavid du Colombier 			slist(r, d);
213bd389b36SDavid du Colombier 		break;
214bd389b36SDavid du Colombier 	case OWHILE:
215bd389b36SDavid du Colombier 		Bprint(bout, "%.*swhile ", d, tabs);
216bd389b36SDavid du Colombier 		pexpr(l);
217bd389b36SDavid du Colombier 		d++;
2187dd7cddfSDavid du Colombier 		Bprint(bout, " do\n");
219bd389b36SDavid du Colombier 		slist(r, d);
220bd389b36SDavid du Colombier 		break;
221bd389b36SDavid du Colombier 	case ORET:
222bd389b36SDavid du Colombier 		Bprint(bout, "%.*sreturn ", d, tabs);
223bd389b36SDavid du Colombier 		pexpr(l);
224bd389b36SDavid du Colombier 		Bprint(bout, ";\n");
225bd389b36SDavid du Colombier 		break;
226bd389b36SDavid du Colombier 	case ODO:
227bd389b36SDavid du Colombier 		Bprint(bout, "%.*sloop ", d, tabs);
228bd389b36SDavid du Colombier 		pexpr(l->left);
229bd389b36SDavid du Colombier 		Bprint(bout, ", ");
230bd389b36SDavid du Colombier 		pexpr(l->right);
231bd389b36SDavid du Colombier 		Bprint(bout, " do\n");
232bd389b36SDavid du Colombier 		slist(r, d+1);
233bd389b36SDavid du Colombier 	}
234bd389b36SDavid du Colombier }
235bd389b36SDavid du Colombier 
236bd389b36SDavid du Colombier void
pexpr(Node * n)237bd389b36SDavid du Colombier pexpr(Node *n)
238bd389b36SDavid du Colombier {
239bd389b36SDavid du Colombier 	Node *r, *l;
240bd389b36SDavid du Colombier 
241bd389b36SDavid du Colombier 	if(n == 0)
242bd389b36SDavid du Colombier 		return;
243bd389b36SDavid du Colombier 
244bd389b36SDavid du Colombier 	r = n->right;
245bd389b36SDavid du Colombier 	l = n->left;
246bd389b36SDavid du Colombier 
247bd389b36SDavid du Colombier 	switch(n->op) {
248bd389b36SDavid du Colombier 	case ONAME:
249bd389b36SDavid du Colombier 		Bprint(bout, "%s", n->sym->name);
250bd389b36SDavid du Colombier 		break;
251bd389b36SDavid du Colombier 	case OCONST:
252bd389b36SDavid du Colombier 		switch(n->type) {
253bd389b36SDavid du Colombier 		case TINT:
254*4de34a7eSDavid du Colombier 			Bprint(bout, "%lld", n->ival);
255bd389b36SDavid du Colombier 			break;
256bd389b36SDavid du Colombier 		case TFLOAT:
257bd389b36SDavid du Colombier 			Bprint(bout, "%g", n->fval);
258bd389b36SDavid du Colombier 			break;
259bd389b36SDavid du Colombier 		case TSTRING:
260bd389b36SDavid du Colombier 			pstr(n->string);
261bd389b36SDavid du Colombier 			break;
262bd389b36SDavid du Colombier 		case TLIST:
263bd389b36SDavid du Colombier 			break;
264bd389b36SDavid du Colombier 		}
265bd389b36SDavid du Colombier 		break;
266bd389b36SDavid du Colombier 	case OMUL:
267bd389b36SDavid du Colombier 	case ODIV:
268bd389b36SDavid du Colombier 	case OMOD:
269bd389b36SDavid du Colombier 	case OADD:
270bd389b36SDavid du Colombier 	case OSUB:
271bd389b36SDavid du Colombier 	case ORSH:
272bd389b36SDavid du Colombier 	case OLSH:
273bd389b36SDavid du Colombier 	case OLT:
274bd389b36SDavid du Colombier 	case OGT:
275bd389b36SDavid du Colombier 	case OLEQ:
276bd389b36SDavid du Colombier 	case OGEQ:
277bd389b36SDavid du Colombier 	case OEQ:
278bd389b36SDavid du Colombier 	case ONEQ:
279bd389b36SDavid du Colombier 	case OLAND:
280bd389b36SDavid du Colombier 	case OXOR:
281bd389b36SDavid du Colombier 	case OLOR:
282bd389b36SDavid du Colombier 	case OCAND:
283bd389b36SDavid du Colombier 	case OCOR:
284219b2ee8SDavid du Colombier 		Bputc(bout, '(');
285219b2ee8SDavid du Colombier 		pexpr(l);
286219b2ee8SDavid du Colombier 		Bprint(bout, binop[n->op]);
287219b2ee8SDavid du Colombier 		pexpr(r);
288219b2ee8SDavid du Colombier 		Bputc(bout, ')');
289219b2ee8SDavid du Colombier 		break;
290bd389b36SDavid du Colombier 	case OASGN:
291bd389b36SDavid du Colombier 		pexpr(l);
292bd389b36SDavid du Colombier 		Bprint(bout, binop[n->op]);
293bd389b36SDavid du Colombier 		pexpr(r);
294bd389b36SDavid du Colombier 		break;
295bd389b36SDavid du Colombier 	case OINDM:
296bd389b36SDavid du Colombier 		Bprint(bout, "*");
297bd389b36SDavid du Colombier 		pexpr(l);
298bd389b36SDavid du Colombier 		break;
299bd389b36SDavid du Colombier 	case OEDEC:
300bd389b36SDavid du Colombier 		Bprint(bout, "--");
301bd389b36SDavid du Colombier 		pexpr(l);
302bd389b36SDavid du Colombier 		break;
303bd389b36SDavid du Colombier 	case OEINC:
304bd389b36SDavid du Colombier 		Bprint(bout, "++");
305bd389b36SDavid du Colombier 		pexpr(l);
306bd389b36SDavid du Colombier 		break;
307bd389b36SDavid du Colombier 	case OPINC:
308bd389b36SDavid du Colombier 		pexpr(l);
309bd389b36SDavid du Colombier 		Bprint(bout, "++");
310bd389b36SDavid du Colombier 		break;
311bd389b36SDavid du Colombier 	case OPDEC:
312bd389b36SDavid du Colombier 		pexpr(l);
313bd389b36SDavid du Colombier 		Bprint(bout, "--");
314bd389b36SDavid du Colombier 		break;
315bd389b36SDavid du Colombier 	case ONOT:
316bd389b36SDavid du Colombier 		Bprint(bout, "!");
317bd389b36SDavid du Colombier 		pexpr(l);
318bd389b36SDavid du Colombier 		break;
319bd389b36SDavid du Colombier 	case OLIST:
320bd389b36SDavid du Colombier 		pexpr(l);
321bd389b36SDavid du Colombier 		if(r) {
322bd389b36SDavid du Colombier 			Bprint(bout, ",");
323bd389b36SDavid du Colombier 			pexpr(r);
324bd389b36SDavid du Colombier 		}
325bd389b36SDavid du Colombier 		break;
326bd389b36SDavid du Colombier 	case OCALL:
327bd389b36SDavid du Colombier 		pexpr(l);
328bd389b36SDavid du Colombier 		Bprint(bout, "(");
329bd389b36SDavid du Colombier 		pexpr(r);
330bd389b36SDavid du Colombier 		Bprint(bout, ")");
331bd389b36SDavid du Colombier 		break;
332bd389b36SDavid du Colombier 	case OCTRUCT:
333bd389b36SDavid du Colombier 		Bprint(bout, "{");
334bd389b36SDavid du Colombier 		pexpr(l);
335bd389b36SDavid du Colombier 		Bprint(bout, "}");
336bd389b36SDavid du Colombier 		break;
337bd389b36SDavid du Colombier 	case OHEAD:
338bd389b36SDavid du Colombier 		Bprint(bout, "head ");
339bd389b36SDavid du Colombier 		pexpr(l);
340bd389b36SDavid du Colombier 		break;
341bd389b36SDavid du Colombier 	case OTAIL:
342bd389b36SDavid du Colombier 		Bprint(bout, "tail ");
343bd389b36SDavid du Colombier 		pexpr(l);
344bd389b36SDavid du Colombier 		break;
345bd389b36SDavid du Colombier 	case OAPPEND:
346bd389b36SDavid du Colombier 		Bprint(bout, "append ");
347bd389b36SDavid du Colombier 		pexpr(l);
348bd389b36SDavid du Colombier 		Bprint(bout, ",");
349bd389b36SDavid du Colombier 		pexpr(r);
350bd389b36SDavid du Colombier 		break;
351219b2ee8SDavid du Colombier 	case ODELETE:
352219b2ee8SDavid du Colombier 		Bprint(bout, "delete ");
353219b2ee8SDavid du Colombier 		pexpr(l);
354219b2ee8SDavid du Colombier 		Bprint(bout, ",");
355219b2ee8SDavid du Colombier 		pexpr(r);
356219b2ee8SDavid du Colombier 		break;
357bd389b36SDavid du Colombier 	case ORET:
358bd389b36SDavid du Colombier 		Bprint(bout, "return ");
359bd389b36SDavid du Colombier 		pexpr(l);
360bd389b36SDavid du Colombier 		break;
361bd389b36SDavid du Colombier 	case OINDEX:
362bd389b36SDavid du Colombier 		pexpr(l);
363bd389b36SDavid du Colombier 		Bprint(bout, "[");
364bd389b36SDavid du Colombier 		pexpr(r);
365bd389b36SDavid du Colombier 		Bprint(bout, "]");
366bd389b36SDavid du Colombier 		break;
367bd389b36SDavid du Colombier 	case OINDC:
368bd389b36SDavid du Colombier 		Bprint(bout, "@");
369bd389b36SDavid du Colombier 		pexpr(l);
370bd389b36SDavid du Colombier 		break;
371bd389b36SDavid du Colombier 	case ODOT:
372219b2ee8SDavid du Colombier 		pexpr(l);
373219b2ee8SDavid du Colombier 		Bprint(bout, ".%s", n->sym->name);
374219b2ee8SDavid du Colombier 		break;
375bd389b36SDavid du Colombier 	case OFRAME:
376219b2ee8SDavid du Colombier 		Bprint(bout, "%s:%s", n->sym->name, l->sym->name);
377219b2ee8SDavid du Colombier 		break;
378219b2ee8SDavid du Colombier 	case OCAST:
379219b2ee8SDavid du Colombier 		Bprint(bout, "(%s)", n->sym->name);
380219b2ee8SDavid du Colombier 		pexpr(l);
381219b2ee8SDavid du Colombier 		break;
382219b2ee8SDavid du Colombier 	case OFMT:
383219b2ee8SDavid du Colombier 		pexpr(l);
3847dd7cddfSDavid du Colombier 		Bprint(bout, "\\%c", (int)r->ival);
385219b2ee8SDavid du Colombier 		break;
386219b2ee8SDavid du Colombier 	case OEVAL:
387219b2ee8SDavid du Colombier 		Bprint(bout, "eval ");
388219b2ee8SDavid du Colombier 		pexpr(l);
389219b2ee8SDavid du Colombier 		break;
390219b2ee8SDavid du Colombier 	case OWHAT:
3917dd7cddfSDavid du Colombier 		Bprint(bout, "whatis");
392219b2ee8SDavid du Colombier 		if(n->sym)
393219b2ee8SDavid du Colombier 			Bprint(bout, " %s", n->sym->name);
394bd389b36SDavid du Colombier 		break;
395bd389b36SDavid du Colombier 	}
396bd389b36SDavid du Colombier }
397bd389b36SDavid du Colombier 
398bd389b36SDavid du Colombier void
pstr(String * s)399bd389b36SDavid du Colombier pstr(String *s)
400bd389b36SDavid du Colombier {
401bd389b36SDavid du Colombier 	int i, c;
402bd389b36SDavid du Colombier 
403bd389b36SDavid du Colombier 	Bputc(bout, '"');
404bd389b36SDavid du Colombier 	for(i = 0; i < s->len; i++) {
405bd389b36SDavid du Colombier 		c = s->string[i];
406bd389b36SDavid du Colombier 		switch(c) {
407bd389b36SDavid du Colombier 		case '\0':
408bd389b36SDavid du Colombier 			c = '0';
409bd389b36SDavid du Colombier 			break;
410bd389b36SDavid du Colombier 		case '\n':
411bd389b36SDavid du Colombier 			c = 'n';
412bd389b36SDavid du Colombier 			break;
413bd389b36SDavid du Colombier 		case '\r':
414bd389b36SDavid du Colombier 			c = 'r';
415bd389b36SDavid du Colombier 			break;
416bd389b36SDavid du Colombier 		case '\t':
417bd389b36SDavid du Colombier 			c = 't';
418bd389b36SDavid du Colombier 			break;
419bd389b36SDavid du Colombier 		case '\b':
420bd389b36SDavid du Colombier 			c = 'b';
421bd389b36SDavid du Colombier 			break;
422bd389b36SDavid du Colombier 		case '\f':
423bd389b36SDavid du Colombier 			c = 'f';
424bd389b36SDavid du Colombier 			break;
425bd389b36SDavid du Colombier 		case '\a':
426bd389b36SDavid du Colombier 			c = 'a';
427bd389b36SDavid du Colombier 			break;
428bd389b36SDavid du Colombier 		case '\v':
429bd389b36SDavid du Colombier 			c = 'v';
430bd389b36SDavid du Colombier 			break;
431bd389b36SDavid du Colombier 		case '\\':
432bd389b36SDavid du Colombier 			c = '\\';
433bd389b36SDavid du Colombier 			break;
434bd389b36SDavid du Colombier 		case '"':
435bd389b36SDavid du Colombier 			c = '"';
436bd389b36SDavid du Colombier 			break;
437bd389b36SDavid du Colombier 		default:
438bd389b36SDavid du Colombier 			Bputc(bout, c);
439bd389b36SDavid du Colombier 			continue;
440bd389b36SDavid du Colombier 		}
441bd389b36SDavid du Colombier 		Bputc(bout, '\\');
442bd389b36SDavid du Colombier 		Bputc(bout, c);
443bd389b36SDavid du Colombier 	}
444bd389b36SDavid du Colombier 	Bputc(bout, '"');
445bd389b36SDavid du Colombier }
446