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 #include <regexp.h>
7 564ca709 2004-04-19 devnull #define Extern extern
8 564ca709 2004-04-19 devnull #include "acid.h"
9 564ca709 2004-04-19 devnull #include "y.tab.h"
10 564ca709 2004-04-19 devnull
11 564ca709 2004-04-19 devnull void cvtatof(Node*, Node*);
12 564ca709 2004-04-19 devnull void cvtatoi(Node*, Node*);
13 564ca709 2004-04-19 devnull void cvtitoa(Node*, Node*);
14 564ca709 2004-04-19 devnull void bprint(Node*, Node*);
15 564ca709 2004-04-19 devnull void funcbound(Node*, Node*);
16 564ca709 2004-04-19 devnull void printto(Node*, Node*);
17 564ca709 2004-04-19 devnull void getfile(Node*, Node*);
18 564ca709 2004-04-19 devnull void fmt(Node*, Node*);
19 564ca709 2004-04-19 devnull void pcfile(Node*, Node*);
20 564ca709 2004-04-19 devnull void pcline(Node*, Node*);
21 564ca709 2004-04-19 devnull void setproc(Node*, Node*);
22 564ca709 2004-04-19 devnull void strace(Node*, Node*);
23 564ca709 2004-04-19 devnull void follow(Node*, Node*);
24 564ca709 2004-04-19 devnull void reason(Node*, Node*);
25 564ca709 2004-04-19 devnull void newproc(Node*, Node*);
26 564ca709 2004-04-19 devnull void startstop(Node*, Node*);
27 564ca709 2004-04-19 devnull void match(Node*, Node*);
28 564ca709 2004-04-19 devnull void status(Node*, Node*);
29 564ca709 2004-04-19 devnull void xkill(Node*,Node*);
30 564ca709 2004-04-19 devnull void waitstop(Node*, Node*);
31 689be541 2005-11-28 devnull void waitsyscall(Node*, Node*);
32 564ca709 2004-04-19 devnull void stop(Node*, Node*);
33 564ca709 2004-04-19 devnull void start(Node*, Node*);
34 564ca709 2004-04-19 devnull void filepc(Node*, Node*);
35 564ca709 2004-04-19 devnull void doerror(Node*, Node*);
36 564ca709 2004-04-19 devnull void rc(Node*, Node*);
37 564ca709 2004-04-19 devnull void doaccess(Node*, Node*);
38 564ca709 2004-04-19 devnull void map(Node*, Node*);
39 564ca709 2004-04-19 devnull void readfile(Node*, Node*);
40 564ca709 2004-04-19 devnull void interpret(Node*, Node*);
41 564ca709 2004-04-19 devnull void include(Node*, Node*);
42 564ca709 2004-04-19 devnull void includepipe(Node*, Node*);
43 564ca709 2004-04-19 devnull void regexp(Node*, Node*);
44 564ca709 2004-04-19 devnull void textfile(Node*, Node*);
45 564ca709 2004-04-19 devnull void deltextfile(Node*, Node*);
46 709efa01 2004-09-23 devnull void stringn(Node*, Node*);
47 4f2ac1b7 2005-01-23 devnull void xregister(Node*, Node*);
48 4f2ac1b7 2005-01-23 devnull void refconst(Node*, Node*);
49 4f2ac1b7 2005-01-23 devnull void dolook(Node*, Node*);
50 689be541 2005-11-28 devnull void step1(Node*, Node*);
51 564ca709 2004-04-19 devnull
52 564ca709 2004-04-19 devnull typedef struct Btab Btab;
53 564ca709 2004-04-19 devnull struct Btab
54 564ca709 2004-04-19 devnull {
55 564ca709 2004-04-19 devnull char *name;
56 564ca709 2004-04-19 devnull void (*fn)(Node*, Node*);
57 564ca709 2004-04-19 devnull } tab[] =
58 564ca709 2004-04-19 devnull {
59 4f2ac1b7 2005-01-23 devnull "access", doaccess,
60 564ca709 2004-04-19 devnull "atof", cvtatof,
61 564ca709 2004-04-19 devnull "atoi", cvtatoi,
62 564ca709 2004-04-19 devnull "deltextfile", deltextfile,
63 564ca709 2004-04-19 devnull "error", doerror,
64 564ca709 2004-04-19 devnull "file", getfile,
65 564ca709 2004-04-19 devnull "filepc", filepc,
66 564ca709 2004-04-19 devnull "fnbound", funcbound,
67 564ca709 2004-04-19 devnull "fmt", fmt,
68 564ca709 2004-04-19 devnull "follow", follow,
69 564ca709 2004-04-19 devnull "include", include,
70 564ca709 2004-04-19 devnull "includepipe", includepipe,
71 564ca709 2004-04-19 devnull "interpret", interpret,
72 564ca709 2004-04-19 devnull "itoa", cvtitoa,
73 564ca709 2004-04-19 devnull "kill", xkill,
74 564ca709 2004-04-19 devnull "map", map,
75 564ca709 2004-04-19 devnull "match", match,
76 564ca709 2004-04-19 devnull "newproc", newproc,
77 564ca709 2004-04-19 devnull "pcfile", pcfile,
78 564ca709 2004-04-19 devnull "pcline", pcline,
79 564ca709 2004-04-19 devnull "print", bprint,
80 564ca709 2004-04-19 devnull "printto", printto,
81 564ca709 2004-04-19 devnull "rc", rc,
82 4f2ac1b7 2005-01-23 devnull "readfile", readfile,
83 564ca709 2004-04-19 devnull "reason", reason,
84 4f2ac1b7 2005-01-23 devnull "refconst", refconst,
85 564ca709 2004-04-19 devnull "regexp", regexp,
86 4f2ac1b7 2005-01-23 devnull "register", xregister,
87 564ca709 2004-04-19 devnull "setproc", setproc,
88 564ca709 2004-04-19 devnull "start", start,
89 564ca709 2004-04-19 devnull "startstop", startstop,
90 564ca709 2004-04-19 devnull "status", status,
91 689be541 2005-11-28 devnull "step1", step1,
92 564ca709 2004-04-19 devnull "stop", stop,
93 564ca709 2004-04-19 devnull "strace", strace,
94 709efa01 2004-09-23 devnull "stringn", stringn,
95 564ca709 2004-04-19 devnull "textfile", textfile,
96 4f2ac1b7 2005-01-23 devnull "var", dolook,
97 564ca709 2004-04-19 devnull "waitstop", waitstop,
98 689be541 2005-11-28 devnull "waitsyscall", waitsyscall,
99 564ca709 2004-04-19 devnull 0
100 564ca709 2004-04-19 devnull };
101 564ca709 2004-04-19 devnull
102 564ca709 2004-04-19 devnull void
103 564ca709 2004-04-19 devnull mkprint(Lsym *s)
104 564ca709 2004-04-19 devnull {
105 564ca709 2004-04-19 devnull prnt = malloc(sizeof(Node));
106 564ca709 2004-04-19 devnull memset(prnt, 0, sizeof(Node));
107 564ca709 2004-04-19 devnull prnt->op = OCALL;
108 564ca709 2004-04-19 devnull prnt->left = malloc(sizeof(Node));
109 564ca709 2004-04-19 devnull memset(prnt->left, 0, sizeof(Node));
110 564ca709 2004-04-19 devnull prnt->left->sym = s;
111 564ca709 2004-04-19 devnull }
112 564ca709 2004-04-19 devnull
113 564ca709 2004-04-19 devnull void
114 564ca709 2004-04-19 devnull installbuiltin(void)
115 564ca709 2004-04-19 devnull {
116 564ca709 2004-04-19 devnull Btab *b;
117 564ca709 2004-04-19 devnull Lsym *s;
118 564ca709 2004-04-19 devnull
119 564ca709 2004-04-19 devnull b = tab;
120 564ca709 2004-04-19 devnull while(b->name) {
121 564ca709 2004-04-19 devnull s = look(b->name);
122 564ca709 2004-04-19 devnull if(s == 0)
123 564ca709 2004-04-19 devnull s = enter(b->name, Tid);
124 564ca709 2004-04-19 devnull
125 564ca709 2004-04-19 devnull s->builtin = b->fn;
126 564ca709 2004-04-19 devnull if(b->fn == bprint)
127 564ca709 2004-04-19 devnull mkprint(s);
128 564ca709 2004-04-19 devnull b++;
129 564ca709 2004-04-19 devnull }
130 564ca709 2004-04-19 devnull }
131 564ca709 2004-04-19 devnull
132 564ca709 2004-04-19 devnull void
133 564ca709 2004-04-19 devnull match(Node *r, Node *args)
134 564ca709 2004-04-19 devnull {
135 564ca709 2004-04-19 devnull int i;
136 564ca709 2004-04-19 devnull List *f;
137 564ca709 2004-04-19 devnull Node *av[Maxarg];
138 564ca709 2004-04-19 devnull Node resi, resl;
139 564ca709 2004-04-19 devnull
140 564ca709 2004-04-19 devnull na = 0;
141 564ca709 2004-04-19 devnull flatten(av, args);
142 564ca709 2004-04-19 devnull if(na != 2)
143 564ca709 2004-04-19 devnull error("match(obj, list): arg count");
144 564ca709 2004-04-19 devnull
145 564ca709 2004-04-19 devnull expr(av[1], &resl);
146 564ca709 2004-04-19 devnull if(resl.type != TLIST)
147 564ca709 2004-04-19 devnull error("match(obj, list): need list");
148 564ca709 2004-04-19 devnull expr(av[0], &resi);
149 564ca709 2004-04-19 devnull
150 564ca709 2004-04-19 devnull r->op = OCONST;
151 564ca709 2004-04-19 devnull r->type = TINT;
152 564ca709 2004-04-19 devnull r->store.fmt = 'D';
153 564ca709 2004-04-19 devnull r->store.u.ival = -1;
154 564ca709 2004-04-19 devnull
155 564ca709 2004-04-19 devnull i = 0;
156 564ca709 2004-04-19 devnull for(f = resl.store.u.l; f; f = f->next) {
157 564ca709 2004-04-19 devnull if(resi.type == f->type) {
158 564ca709 2004-04-19 devnull switch(resi.type) {
159 564ca709 2004-04-19 devnull case TINT:
160 564ca709 2004-04-19 devnull if(resi.store.u.ival == f->store.u.ival) {
161 564ca709 2004-04-19 devnull r->store.u.ival = i;
162 564ca709 2004-04-19 devnull return;
163 564ca709 2004-04-19 devnull }
164 564ca709 2004-04-19 devnull break;
165 564ca709 2004-04-19 devnull case TFLOAT:
166 564ca709 2004-04-19 devnull if(resi.store.u.fval == f->store.u.fval) {
167 564ca709 2004-04-19 devnull r->store.u.ival = i;
168 564ca709 2004-04-19 devnull return;
169 564ca709 2004-04-19 devnull }
170 564ca709 2004-04-19 devnull break;
171 564ca709 2004-04-19 devnull case TSTRING:
172 564ca709 2004-04-19 devnull if(scmp(resi.store.u.string, f->store.u.string)) {
173 564ca709 2004-04-19 devnull r->store.u.ival = i;
174 564ca709 2004-04-19 devnull return;
175 564ca709 2004-04-19 devnull }
176 564ca709 2004-04-19 devnull break;
177 564ca709 2004-04-19 devnull case TLIST:
178 564ca709 2004-04-19 devnull error("match(obj, list): not defined for list");
179 564ca709 2004-04-19 devnull }
180 564ca709 2004-04-19 devnull }
181 564ca709 2004-04-19 devnull i++;
182 564ca709 2004-04-19 devnull }
183 564ca709 2004-04-19 devnull }
184 564ca709 2004-04-19 devnull
185 564ca709 2004-04-19 devnull void
186 564ca709 2004-04-19 devnull newproc(Node *r, Node *args)
187 564ca709 2004-04-19 devnull {
188 564ca709 2004-04-19 devnull int i;
189 564ca709 2004-04-19 devnull Node res;
190 564ca709 2004-04-19 devnull char *p, *e;
191 564ca709 2004-04-19 devnull char *argv[Maxarg], buf[Strsize];
192 564ca709 2004-04-19 devnull
193 564ca709 2004-04-19 devnull i = 1;
194 564ca709 2004-04-19 devnull argv[0] = symfil;
195 564ca709 2004-04-19 devnull
196 564ca709 2004-04-19 devnull if(args) {
197 564ca709 2004-04-19 devnull expr(args, &res);
198 564ca709 2004-04-19 devnull if(res.type != TSTRING)
199 564ca709 2004-04-19 devnull error("newproc(): arg not string");
200 564ca709 2004-04-19 devnull if(res.store.u.string->len >= sizeof(buf))
201 564ca709 2004-04-19 devnull error("newproc(): too many arguments");
202 564ca709 2004-04-19 devnull memmove(buf, res.store.u.string->string, res.store.u.string->len);
203 564ca709 2004-04-19 devnull buf[res.store.u.string->len] = '\0';
204 564ca709 2004-04-19 devnull p = buf;
205 564ca709 2004-04-19 devnull e = buf+res.store.u.string->len;
206 564ca709 2004-04-19 devnull for(;;) {
207 564ca709 2004-04-19 devnull while(p < e && (*p == '\t' || *p == ' '))
208 564ca709 2004-04-19 devnull *p++ = '\0';
209 564ca709 2004-04-19 devnull if(p >= e)
210 564ca709 2004-04-19 devnull break;
211 564ca709 2004-04-19 devnull argv[i++] = p;
212 564ca709 2004-04-19 devnull if(i >= Maxarg)
213 564ca709 2004-04-19 devnull error("newproc: too many arguments");
214 564ca709 2004-04-19 devnull while(p < e && *p != '\t' && *p != ' ')
215 564ca709 2004-04-19 devnull p++;
216 564ca709 2004-04-19 devnull }
217 564ca709 2004-04-19 devnull }
218 564ca709 2004-04-19 devnull argv[i] = 0;
219 564ca709 2004-04-19 devnull r->op = OCONST;
220 564ca709 2004-04-19 devnull r->type = TINT;
221 564ca709 2004-04-19 devnull r->store.fmt = 'D';
222 564ca709 2004-04-19 devnull r->store.u.ival = nproc(argv);
223 564ca709 2004-04-19 devnull }
224 564ca709 2004-04-19 devnull
225 564ca709 2004-04-19 devnull void
226 689be541 2005-11-28 devnull step1(Node *r, Node *args)
227 689be541 2005-11-28 devnull {
228 689be541 2005-11-28 devnull Node res;
229 689be541 2005-11-28 devnull
230 689be541 2005-11-28 devnull USED(r);
231 689be541 2005-11-28 devnull if(args == 0)
232 689be541 2005-11-28 devnull error("step1(pid): no pid");
233 689be541 2005-11-28 devnull expr(args, &res);
234 689be541 2005-11-28 devnull if(res.type != TINT)
235 689be541 2005-11-28 devnull error("step1(pid): arg type");
236 689be541 2005-11-28 devnull
237 689be541 2005-11-28 devnull msg(res.store.u.ival, "step");
238 689be541 2005-11-28 devnull notes(res.store.u.ival);
239 689be541 2005-11-28 devnull dostop(res.store.u.ival);
240 689be541 2005-11-28 devnull }
241 689be541 2005-11-28 devnull
242 689be541 2005-11-28 devnull void
243 564ca709 2004-04-19 devnull startstop(Node *r, Node *args)
244 564ca709 2004-04-19 devnull {
245 564ca709 2004-04-19 devnull Node res;
246 564ca709 2004-04-19 devnull
247 564ca709 2004-04-19 devnull USED(r);
248 564ca709 2004-04-19 devnull if(args == 0)
249 564ca709 2004-04-19 devnull error("startstop(pid): no pid");
250 564ca709 2004-04-19 devnull expr(args, &res);
251 564ca709 2004-04-19 devnull if(res.type != TINT)
252 564ca709 2004-04-19 devnull error("startstop(pid): arg type");
253 564ca709 2004-04-19 devnull
254 564ca709 2004-04-19 devnull msg(res.store.u.ival, "startstop");
255 564ca709 2004-04-19 devnull notes(res.store.u.ival);
256 564ca709 2004-04-19 devnull dostop(res.store.u.ival);
257 564ca709 2004-04-19 devnull }
258 564ca709 2004-04-19 devnull
259 564ca709 2004-04-19 devnull void
260 564ca709 2004-04-19 devnull waitstop(Node *r, Node *args)
261 564ca709 2004-04-19 devnull {
262 564ca709 2004-04-19 devnull Node res;
263 564ca709 2004-04-19 devnull
264 564ca709 2004-04-19 devnull USED(r);
265 564ca709 2004-04-19 devnull if(args == 0)
266 564ca709 2004-04-19 devnull error("waitstop(pid): no pid");
267 564ca709 2004-04-19 devnull expr(args, &res);
268 564ca709 2004-04-19 devnull if(res.type != TINT)
269 564ca709 2004-04-19 devnull error("waitstop(pid): arg type");
270 564ca709 2004-04-19 devnull
271 564ca709 2004-04-19 devnull Bflush(bout);
272 564ca709 2004-04-19 devnull msg(res.store.u.ival, "waitstop");
273 564ca709 2004-04-19 devnull notes(res.store.u.ival);
274 564ca709 2004-04-19 devnull dostop(res.store.u.ival);
275 564ca709 2004-04-19 devnull }
276 564ca709 2004-04-19 devnull
277 564ca709 2004-04-19 devnull void
278 689be541 2005-11-28 devnull waitsyscall(Node *r, Node *args)
279 564ca709 2004-04-19 devnull {
280 564ca709 2004-04-19 devnull Node res;
281 564ca709 2004-04-19 devnull
282 564ca709 2004-04-19 devnull USED(r);
283 564ca709 2004-04-19 devnull if(args == 0)
284 689be541 2005-11-28 devnull error("waitsyscall(pid): no pid");
285 564ca709 2004-04-19 devnull expr(args, &res);
286 564ca709 2004-04-19 devnull if(res.type != TINT)
287 689be541 2005-11-28 devnull error("waitsycall(pid): arg type");
288 564ca709 2004-04-19 devnull
289 564ca709 2004-04-19 devnull Bflush(bout);
290 564ca709 2004-04-19 devnull msg(res.store.u.ival, "sysstop");
291 564ca709 2004-04-19 devnull notes(res.store.u.ival);
292 564ca709 2004-04-19 devnull dostop(res.store.u.ival);
293 564ca709 2004-04-19 devnull }
294 564ca709 2004-04-19 devnull
295 564ca709 2004-04-19 devnull void
296 564ca709 2004-04-19 devnull start(Node *r, Node *args)
297 564ca709 2004-04-19 devnull {
298 564ca709 2004-04-19 devnull Node res;
299 564ca709 2004-04-19 devnull
300 564ca709 2004-04-19 devnull USED(r);
301 564ca709 2004-04-19 devnull if(args == 0)
302 564ca709 2004-04-19 devnull error("start(pid): no pid");
303 564ca709 2004-04-19 devnull expr(args, &res);
304 564ca709 2004-04-19 devnull if(res.type != TINT)
305 564ca709 2004-04-19 devnull error("start(pid): arg type");
306 564ca709 2004-04-19 devnull
307 564ca709 2004-04-19 devnull msg(res.store.u.ival, "start");
308 564ca709 2004-04-19 devnull }
309 564ca709 2004-04-19 devnull
310 564ca709 2004-04-19 devnull void
311 564ca709 2004-04-19 devnull stop(Node *r, Node *args)
312 564ca709 2004-04-19 devnull {
313 564ca709 2004-04-19 devnull Node res;
314 564ca709 2004-04-19 devnull
315 564ca709 2004-04-19 devnull USED(r);
316 564ca709 2004-04-19 devnull if(args == 0)
317 564ca709 2004-04-19 devnull error("stop(pid): no pid");
318 564ca709 2004-04-19 devnull expr(args, &res);
319 564ca709 2004-04-19 devnull if(res.type != TINT)
320 564ca709 2004-04-19 devnull error("stop(pid): arg type");
321 564ca709 2004-04-19 devnull
322 564ca709 2004-04-19 devnull Bflush(bout);
323 564ca709 2004-04-19 devnull msg(res.store.u.ival, "stop");
324 564ca709 2004-04-19 devnull notes(res.store.u.ival);
325 564ca709 2004-04-19 devnull dostop(res.store.u.ival);
326 564ca709 2004-04-19 devnull }
327 564ca709 2004-04-19 devnull
328 564ca709 2004-04-19 devnull void
329 564ca709 2004-04-19 devnull xkill(Node *r, Node *args)
330 564ca709 2004-04-19 devnull {
331 564ca709 2004-04-19 devnull Node res;
332 564ca709 2004-04-19 devnull
333 564ca709 2004-04-19 devnull USED(r);
334 564ca709 2004-04-19 devnull if(args == 0)
335 564ca709 2004-04-19 devnull error("kill(pid): no pid");
336 564ca709 2004-04-19 devnull expr(args, &res);
337 564ca709 2004-04-19 devnull if(res.type != TINT)
338 564ca709 2004-04-19 devnull error("kill(pid): arg type");
339 564ca709 2004-04-19 devnull
340 564ca709 2004-04-19 devnull msg(res.store.u.ival, "kill");
341 564ca709 2004-04-19 devnull deinstall(res.store.u.ival);
342 564ca709 2004-04-19 devnull }
343 564ca709 2004-04-19 devnull
344 564ca709 2004-04-19 devnull void
345 4f2ac1b7 2005-01-23 devnull xregister(Node *r, Node *args)
346 4f2ac1b7 2005-01-23 devnull {
347 281c90a5 2005-02-11 devnull int tid;
348 4f2ac1b7 2005-01-23 devnull Regdesc *rp;
349 281c90a5 2005-02-11 devnull Node res, resid;
350 281c90a5 2005-02-11 devnull Node *av[Maxarg];
351 4f2ac1b7 2005-01-23 devnull
352 281c90a5 2005-02-11 devnull na = 0;
353 281c90a5 2005-02-11 devnull flatten(av, args);
354 7b8a3f12 2005-02-11 devnull if(na != 1/* && na != 2 */)
355 7b8a3f12 2005-02-11 devnull error("register(name): arg count");
356 4f2ac1b7 2005-01-23 devnull
357 281c90a5 2005-02-11 devnull expr(av[0], &res);
358 281c90a5 2005-02-11 devnull if(res.type != TSTRING)
359 7b8a3f12 2005-02-11 devnull error("register(name): arg type: name should be string");
360 281c90a5 2005-02-11 devnull tid = 0;
361 281c90a5 2005-02-11 devnull if(na == 2){
362 281c90a5 2005-02-11 devnull expr(av[1], &resid);
363 281c90a5 2005-02-11 devnull if(resid.type != TINT)
364 281c90a5 2005-02-11 devnull error("register(name[, threadid]): arg type: threadid should be int");
365 281c90a5 2005-02-11 devnull tid = resid.store.u.ival;
366 281c90a5 2005-02-11 devnull }
367 4f2ac1b7 2005-01-23 devnull if((rp = regdesc(res.store.u.string->string)) == nil)
368 4f2ac1b7 2005-01-23 devnull error("no such register");
369 4f2ac1b7 2005-01-23 devnull r->op = OCONST;
370 4f2ac1b7 2005-01-23 devnull r->type = TREG;
371 4f2ac1b7 2005-01-23 devnull r->store.fmt = rp->format;
372 281c90a5 2005-02-11 devnull r->store.u.reg.name = rp->name;
373 281c90a5 2005-02-11 devnull r->store.u.reg.thread = tid;
374 4f2ac1b7 2005-01-23 devnull }
375 4f2ac1b7 2005-01-23 devnull
376 4f2ac1b7 2005-01-23 devnull void
377 4f2ac1b7 2005-01-23 devnull refconst(Node *r, Node *args)
378 4f2ac1b7 2005-01-23 devnull {
379 4f2ac1b7 2005-01-23 devnull Node *n;
380 4f2ac1b7 2005-01-23 devnull
381 4f2ac1b7 2005-01-23 devnull if(args == 0)
382 4f2ac1b7 2005-01-23 devnull error("refconst(expr): arg count");
383 4f2ac1b7 2005-01-23 devnull
384 4f2ac1b7 2005-01-23 devnull n = an(OCONST, ZN, ZN);
385 4f2ac1b7 2005-01-23 devnull expr(args, n);
386 4f2ac1b7 2005-01-23 devnull
387 4f2ac1b7 2005-01-23 devnull r->op = OCONST;
388 4f2ac1b7 2005-01-23 devnull r->type = TCON;
389 4f2ac1b7 2005-01-23 devnull r->store.u.con = n;
390 4f2ac1b7 2005-01-23 devnull }
391 4f2ac1b7 2005-01-23 devnull
392 4f2ac1b7 2005-01-23 devnull void
393 4f2ac1b7 2005-01-23 devnull dolook(Node *r, Node *args)
394 4f2ac1b7 2005-01-23 devnull {
395 4f2ac1b7 2005-01-23 devnull Node res;
396 4f2ac1b7 2005-01-23 devnull Lsym *l;
397 4f2ac1b7 2005-01-23 devnull
398 4f2ac1b7 2005-01-23 devnull if(args == 0)
399 4f2ac1b7 2005-01-23 devnull error("var(string): arg count");
400 4f2ac1b7 2005-01-23 devnull expr(args, &res);
401 4f2ac1b7 2005-01-23 devnull if(res.type != TSTRING)
402 4f2ac1b7 2005-01-23 devnull error("var(string): arg type");
403 4f2ac1b7 2005-01-23 devnull
404 4f2ac1b7 2005-01-23 devnull r->op = OCONST;
405 4f2ac1b7 2005-01-23 devnull if((l = look(res.store.u.string->string)) == nil || l->v->set == 0){
406 4f2ac1b7 2005-01-23 devnull r->type = TLIST;
407 4f2ac1b7 2005-01-23 devnull r->store.u.l = nil;
408 4f2ac1b7 2005-01-23 devnull }else{
409 4f2ac1b7 2005-01-23 devnull r->type = l->v->type;
410 4f2ac1b7 2005-01-23 devnull r->store = l->v->store;
411 4f2ac1b7 2005-01-23 devnull }
412 4f2ac1b7 2005-01-23 devnull }
413 4f2ac1b7 2005-01-23 devnull
414 4f2ac1b7 2005-01-23 devnull void
415 564ca709 2004-04-19 devnull status(Node *r, Node *args)
416 564ca709 2004-04-19 devnull {
417 564ca709 2004-04-19 devnull Node res;
418 564ca709 2004-04-19 devnull char *p;
419 564ca709 2004-04-19 devnull
420 564ca709 2004-04-19 devnull USED(r);
421 564ca709 2004-04-19 devnull if(args == 0)
422 564ca709 2004-04-19 devnull error("status(pid): no pid");
423 564ca709 2004-04-19 devnull expr(args, &res);
424 564ca709 2004-04-19 devnull if(res.type != TINT)
425 564ca709 2004-04-19 devnull error("status(pid): arg type");
426 564ca709 2004-04-19 devnull
427 564ca709 2004-04-19 devnull p = getstatus(res.store.u.ival);
428 564ca709 2004-04-19 devnull r->store.u.string = strnode(p);
429 564ca709 2004-04-19 devnull r->op = OCONST;
430 564ca709 2004-04-19 devnull r->store.fmt = 's';
431 564ca709 2004-04-19 devnull r->type = TSTRING;
432 564ca709 2004-04-19 devnull }
433 564ca709 2004-04-19 devnull
434 564ca709 2004-04-19 devnull void
435 564ca709 2004-04-19 devnull reason(Node *r, Node *args)
436 564ca709 2004-04-19 devnull {
437 564ca709 2004-04-19 devnull Node res;
438 564ca709 2004-04-19 devnull
439 564ca709 2004-04-19 devnull if(args == 0)
440 564ca709 2004-04-19 devnull error("reason(cause): no cause");
441 564ca709 2004-04-19 devnull expr(args, &res);
442 564ca709 2004-04-19 devnull if(res.type != TINT)
443 564ca709 2004-04-19 devnull error("reason(cause): arg type");
444 564ca709 2004-04-19 devnull
445 564ca709 2004-04-19 devnull r->op = OCONST;
446 564ca709 2004-04-19 devnull r->type = TSTRING;
447 564ca709 2004-04-19 devnull r->store.fmt = 's';
448 4f2ac1b7 2005-01-23 devnull r->store.u.string = strnode((*mach->exc)(cormap, acidregs));
449 564ca709 2004-04-19 devnull }
450 564ca709 2004-04-19 devnull
451 564ca709 2004-04-19 devnull void
452 564ca709 2004-04-19 devnull follow(Node *r, Node *args)
453 564ca709 2004-04-19 devnull {
454 564ca709 2004-04-19 devnull int n, i;
455 564ca709 2004-04-19 devnull Node res;
456 443d6288 2012-02-19 rsc u64int f[10];
457 564ca709 2004-04-19 devnull List **tail, *l;
458 564ca709 2004-04-19 devnull
459 564ca709 2004-04-19 devnull if(args == 0)
460 564ca709 2004-04-19 devnull error("follow(addr): no addr");
461 564ca709 2004-04-19 devnull expr(args, &res);
462 564ca709 2004-04-19 devnull if(res.type != TINT)
463 564ca709 2004-04-19 devnull error("follow(addr): arg type");
464 564ca709 2004-04-19 devnull
465 4f2ac1b7 2005-01-23 devnull n = (*mach->foll)(cormap, acidregs, res.store.u.ival, f);
466 564ca709 2004-04-19 devnull if (n < 0)
467 564ca709 2004-04-19 devnull error("follow(addr): %r");
468 564ca709 2004-04-19 devnull tail = &r->store.u.l;
469 564ca709 2004-04-19 devnull for(i = 0; i < n; i++) {
470 564ca709 2004-04-19 devnull l = al(TINT);
471 564ca709 2004-04-19 devnull l->store.u.ival = f[i];
472 564ca709 2004-04-19 devnull l->store.fmt = 'X';
473 564ca709 2004-04-19 devnull *tail = l;
474 564ca709 2004-04-19 devnull tail = &l->next;
475 564ca709 2004-04-19 devnull }
476 564ca709 2004-04-19 devnull }
477 564ca709 2004-04-19 devnull
478 564ca709 2004-04-19 devnull void
479 564ca709 2004-04-19 devnull funcbound(Node *r, Node *args)
480 564ca709 2004-04-19 devnull {
481 564ca709 2004-04-19 devnull int n;
482 564ca709 2004-04-19 devnull Node res;
483 443d6288 2012-02-19 rsc u64int bounds[2];
484 564ca709 2004-04-19 devnull List *l;
485 564ca709 2004-04-19 devnull
486 564ca709 2004-04-19 devnull if(args == 0)
487 564ca709 2004-04-19 devnull error("fnbound(addr): no addr");
488 564ca709 2004-04-19 devnull expr(args, &res);
489 564ca709 2004-04-19 devnull if(res.type != TINT)
490 564ca709 2004-04-19 devnull error("fnbound(addr): arg type");
491 564ca709 2004-04-19 devnull
492 564ca709 2004-04-19 devnull n = fnbound(res.store.u.ival, bounds);
493 689be541 2005-11-28 devnull if (n >= 0) {
494 564ca709 2004-04-19 devnull r->store.u.l = al(TINT);
495 564ca709 2004-04-19 devnull l = r->store.u.l;
496 564ca709 2004-04-19 devnull l->store.u.ival = bounds[0];
497 564ca709 2004-04-19 devnull l->store.fmt = 'X';
498 564ca709 2004-04-19 devnull l->next = al(TINT);
499 564ca709 2004-04-19 devnull l = l->next;
500 564ca709 2004-04-19 devnull l->store.u.ival = bounds[1];
501 564ca709 2004-04-19 devnull l->store.fmt = 'X';
502 564ca709 2004-04-19 devnull }
503 564ca709 2004-04-19 devnull }
504 564ca709 2004-04-19 devnull
505 564ca709 2004-04-19 devnull void
506 564ca709 2004-04-19 devnull setproc(Node *r, Node *args)
507 564ca709 2004-04-19 devnull {
508 564ca709 2004-04-19 devnull Node res;
509 564ca709 2004-04-19 devnull
510 564ca709 2004-04-19 devnull USED(r);
511 564ca709 2004-04-19 devnull if(args == 0)
512 564ca709 2004-04-19 devnull error("setproc(pid): no pid");
513 564ca709 2004-04-19 devnull expr(args, &res);
514 564ca709 2004-04-19 devnull if(res.type != TINT)
515 564ca709 2004-04-19 devnull error("setproc(pid): arg type");
516 564ca709 2004-04-19 devnull
517 564ca709 2004-04-19 devnull sproc(res.store.u.ival);
518 564ca709 2004-04-19 devnull }
519 564ca709 2004-04-19 devnull
520 564ca709 2004-04-19 devnull void
521 564ca709 2004-04-19 devnull filepc(Node *r, Node *args)
522 564ca709 2004-04-19 devnull {
523 564ca709 2004-04-19 devnull int i;
524 564ca709 2004-04-19 devnull Node res;
525 564ca709 2004-04-19 devnull char *p, c;
526 443d6288 2012-02-19 rsc u64int v;
527 564ca709 2004-04-19 devnull
528 564ca709 2004-04-19 devnull if(args == 0)
529 564ca709 2004-04-19 devnull error("filepc(filename:line): arg count");
530 564ca709 2004-04-19 devnull expr(args, &res);
531 564ca709 2004-04-19 devnull if(res.type != TSTRING)
532 564ca709 2004-04-19 devnull error("filepc(filename:line): arg type");
533 564ca709 2004-04-19 devnull
534 564ca709 2004-04-19 devnull p = strchr(res.store.u.string->string, ':');
535 564ca709 2004-04-19 devnull if(p == 0)
536 564ca709 2004-04-19 devnull error("filepc(filename:line): bad arg format");
537 564ca709 2004-04-19 devnull
538 564ca709 2004-04-19 devnull c = *p;
539 564ca709 2004-04-19 devnull *p++ = '\0';
540 564ca709 2004-04-19 devnull i = file2pc(res.store.u.string->string, atoi(p), &v);
541 564ca709 2004-04-19 devnull p[-1] = c;
542 564ca709 2004-04-19 devnull if(i < 0)
543 564ca709 2004-04-19 devnull error("filepc(filename:line): can't find address");
544 564ca709 2004-04-19 devnull
545 564ca709 2004-04-19 devnull r->op = OCONST;
546 564ca709 2004-04-19 devnull r->type = TINT;
547 564ca709 2004-04-19 devnull r->store.fmt = 'D';
548 564ca709 2004-04-19 devnull r->store.u.ival = v;
549 564ca709 2004-04-19 devnull }
550 564ca709 2004-04-19 devnull
551 564ca709 2004-04-19 devnull void
552 564ca709 2004-04-19 devnull interpret(Node *r, Node *args)
553 564ca709 2004-04-19 devnull {
554 564ca709 2004-04-19 devnull Node res;
555 564ca709 2004-04-19 devnull int isave;
556 564ca709 2004-04-19 devnull
557 564ca709 2004-04-19 devnull if(args == 0)
558 564ca709 2004-04-19 devnull error("interpret(string): arg count");
559 564ca709 2004-04-19 devnull expr(args, &res);
560 564ca709 2004-04-19 devnull if(res.type != TSTRING)
561 564ca709 2004-04-19 devnull error("interpret(string): arg type");
562 564ca709 2004-04-19 devnull
563 564ca709 2004-04-19 devnull pushstr(&res);
564 564ca709 2004-04-19 devnull
565 564ca709 2004-04-19 devnull isave = interactive;
566 564ca709 2004-04-19 devnull interactive = 0;
567 564ca709 2004-04-19 devnull r->store.u.ival = yyparse();
568 564ca709 2004-04-19 devnull interactive = isave;
569 564ca709 2004-04-19 devnull popio();
570 564ca709 2004-04-19 devnull r->op = OCONST;
571 564ca709 2004-04-19 devnull r->type = TINT;
572 564ca709 2004-04-19 devnull r->store.fmt = 'D';
573 564ca709 2004-04-19 devnull }
574 564ca709 2004-04-19 devnull
575 564ca709 2004-04-19 devnull void
576 564ca709 2004-04-19 devnull include(Node *r, Node *args)
577 564ca709 2004-04-19 devnull {
578 a8c15b08 2004-04-21 devnull char *file, *libfile;
579 a8c15b08 2004-04-21 devnull static char buf[1024];
580 564ca709 2004-04-19 devnull Node res;
581 564ca709 2004-04-19 devnull int isave;
582 564ca709 2004-04-19 devnull
583 564ca709 2004-04-19 devnull if(args == 0)
584 564ca709 2004-04-19 devnull error("include(string): arg count");
585 564ca709 2004-04-19 devnull expr(args, &res);
586 564ca709 2004-04-19 devnull if(res.type != TSTRING)
587 564ca709 2004-04-19 devnull error("include(string): arg type");
588 564ca709 2004-04-19 devnull
589 564ca709 2004-04-19 devnull Bflush(bout);
590 a8c15b08 2004-04-21 devnull
591 a8c15b08 2004-04-21 devnull libfile = nil;
592 a8c15b08 2004-04-21 devnull file = res.store.u.string->string;
593 a8c15b08 2004-04-21 devnull if(access(file, AREAD) < 0 && file[0] != '/'){
594 a8c15b08 2004-04-21 devnull snprint(buf, sizeof buf, "#9/acid/%s", file);
595 a8c15b08 2004-04-21 devnull libfile = unsharp(buf);
596 a8c15b08 2004-04-21 devnull if(access(libfile, AREAD) >= 0){
597 a8c15b08 2004-04-21 devnull strecpy(buf, buf+sizeof buf, libfile);
598 a8c15b08 2004-04-21 devnull file = buf;
599 a8c15b08 2004-04-21 devnull }
600 a8c15b08 2004-04-21 devnull free(libfile);
601 a8c15b08 2004-04-21 devnull }
602 564ca709 2004-04-19 devnull
603 a9df759c 2004-04-21 devnull pushfile(file);
604 564ca709 2004-04-19 devnull isave = interactive;
605 564ca709 2004-04-19 devnull interactive = 0;
606 564ca709 2004-04-19 devnull r->store.u.ival = yyparse();
607 564ca709 2004-04-19 devnull interactive = isave;
608 564ca709 2004-04-19 devnull popio();
609 564ca709 2004-04-19 devnull r->op = OCONST;
610 564ca709 2004-04-19 devnull r->type = TINT;
611 564ca709 2004-04-19 devnull r->store.fmt = 'D';
612 564ca709 2004-04-19 devnull }
613 564ca709 2004-04-19 devnull
614 564ca709 2004-04-19 devnull void
615 564ca709 2004-04-19 devnull includepipe(Node *r, Node *args)
616 564ca709 2004-04-19 devnull {
617 564ca709 2004-04-19 devnull Node res;
618 564ca709 2004-04-19 devnull int i, isave, pid, pip[2];
619 564ca709 2004-04-19 devnull char *argv[4];
620 564ca709 2004-04-19 devnull Waitmsg *w;
621 564ca709 2004-04-19 devnull
622 564ca709 2004-04-19 devnull USED(r);
623 564ca709 2004-04-19 devnull if(args == 0)
624 564ca709 2004-04-19 devnull error("includepipe(string): arg count");
625 564ca709 2004-04-19 devnull expr(args, &res);
626 564ca709 2004-04-19 devnull if(res.type != TSTRING)
627 564ca709 2004-04-19 devnull error("includepipe(string): arg type");
628 564ca709 2004-04-19 devnull
629 564ca709 2004-04-19 devnull Bflush(bout);
630 564ca709 2004-04-19 devnull
631 564ca709 2004-04-19 devnull argv[0] = "rc";
632 564ca709 2004-04-19 devnull argv[1] = "-c";
633 564ca709 2004-04-19 devnull argv[2] = res.store.u.string->string;
634 564ca709 2004-04-19 devnull argv[3] = 0;
635 564ca709 2004-04-19 devnull
636 564ca709 2004-04-19 devnull if(pipe(pip) < 0)
637 564ca709 2004-04-19 devnull error("pipe: %r");
638 fa325e9b 2020-01-10 cross
639 564ca709 2004-04-19 devnull pid = fork();
640 564ca709 2004-04-19 devnull switch(pid) {
641 564ca709 2004-04-19 devnull case -1:
642 564ca709 2004-04-19 devnull close(pip[0]);
643 564ca709 2004-04-19 devnull close(pip[1]);
644 564ca709 2004-04-19 devnull error("fork: %r");
645 564ca709 2004-04-19 devnull case 0:
646 564ca709 2004-04-19 devnull close(pip[0]);
647 564ca709 2004-04-19 devnull close(0);
648 564ca709 2004-04-19 devnull open("/dev/null", OREAD);
649 564ca709 2004-04-19 devnull dup(pip[1], 1);
650 564ca709 2004-04-19 devnull if(pip[1] > 1)
651 564ca709 2004-04-19 devnull close(pip[1]);
652 564ca709 2004-04-19 devnull for(i=3; i<100; i++)
653 564ca709 2004-04-19 devnull close(i);
654 564ca709 2004-04-19 devnull exec("rc", argv);
655 564ca709 2004-04-19 devnull sysfatal("exec rc: %r");
656 564ca709 2004-04-19 devnull }
657 564ca709 2004-04-19 devnull
658 564ca709 2004-04-19 devnull close(pip[1]);
659 564ca709 2004-04-19 devnull pushfd(pip[0]);
660 fa325e9b 2020-01-10 cross
661 564ca709 2004-04-19 devnull isave = interactive;
662 564ca709 2004-04-19 devnull interactive = 0;
663 564ca709 2004-04-19 devnull r->store.u.ival = yyparse();
664 564ca709 2004-04-19 devnull interactive = isave;
665 564ca709 2004-04-19 devnull popio();
666 a9df759c 2004-04-21 devnull
667 564ca709 2004-04-19 devnull r->op = OCONST;
668 564ca709 2004-04-19 devnull r->type = TINT;
669 564ca709 2004-04-19 devnull r->store.fmt = 'D';
670 564ca709 2004-04-19 devnull
671 564ca709 2004-04-19 devnull w = waitfor(pid);
672 564ca709 2004-04-19 devnull if(w->msg && w->msg[0])
673 564ca709 2004-04-19 devnull error("includepipe(\"%s\"): %s", argv[2], w->msg); /* leaks w */
674 564ca709 2004-04-19 devnull free(w);
675 564ca709 2004-04-19 devnull }
676 564ca709 2004-04-19 devnull
677 564ca709 2004-04-19 devnull void
678 564ca709 2004-04-19 devnull rc(Node *r, Node *args)
679 564ca709 2004-04-19 devnull {
680 564ca709 2004-04-19 devnull Node res;
681 564ca709 2004-04-19 devnull int pid;
682 564ca709 2004-04-19 devnull char *p, *q, *argv[4];
683 564ca709 2004-04-19 devnull Waitmsg *w;
684 564ca709 2004-04-19 devnull
685 564ca709 2004-04-19 devnull USED(r);
686 564ca709 2004-04-19 devnull if(args == 0)
687 564ca709 2004-04-19 devnull error("rc(string): arg count");
688 564ca709 2004-04-19 devnull expr(args, &res);
689 564ca709 2004-04-19 devnull if(res.type != TSTRING)
690 564ca709 2004-04-19 devnull error("rc(string): arg type");
691 564ca709 2004-04-19 devnull
692 564ca709 2004-04-19 devnull argv[0] = "rc";
693 564ca709 2004-04-19 devnull argv[1] = "-c";
694 564ca709 2004-04-19 devnull argv[2] = res.store.u.string->string;
695 564ca709 2004-04-19 devnull argv[3] = 0;
696 564ca709 2004-04-19 devnull
697 564ca709 2004-04-19 devnull pid = fork();
698 564ca709 2004-04-19 devnull switch(pid) {
699 564ca709 2004-04-19 devnull case -1:
700 564ca709 2004-04-19 devnull error("fork %r");
701 564ca709 2004-04-19 devnull case 0:
702 564ca709 2004-04-19 devnull exec("rc", argv);
703 564ca709 2004-04-19 devnull exits(0);
704 564ca709 2004-04-19 devnull default:
705 564ca709 2004-04-19 devnull w = waitfor(pid);
706 564ca709 2004-04-19 devnull break;
707 564ca709 2004-04-19 devnull }
708 564ca709 2004-04-19 devnull p = w->msg;
709 564ca709 2004-04-19 devnull q = strrchr(p, ':');
710 564ca709 2004-04-19 devnull if (q)
711 564ca709 2004-04-19 devnull p = q+1;
712 564ca709 2004-04-19 devnull
713 564ca709 2004-04-19 devnull r->op = OCONST;
714 564ca709 2004-04-19 devnull r->type = TSTRING;
715 564ca709 2004-04-19 devnull r->store.u.string = strnode(p);
716 564ca709 2004-04-19 devnull free(w);
717 564ca709 2004-04-19 devnull r->store.fmt = 's';
718 564ca709 2004-04-19 devnull }
719 564ca709 2004-04-19 devnull
720 564ca709 2004-04-19 devnull void
721 564ca709 2004-04-19 devnull doerror(Node *r, Node *args)
722 564ca709 2004-04-19 devnull {
723 564ca709 2004-04-19 devnull Node res;
724 564ca709 2004-04-19 devnull
725 564ca709 2004-04-19 devnull USED(r);
726 564ca709 2004-04-19 devnull if(args == 0)
727 564ca709 2004-04-19 devnull error("error(string): arg count");
728 564ca709 2004-04-19 devnull expr(args, &res);
729 564ca709 2004-04-19 devnull if(res.type != TSTRING)
730 564ca709 2004-04-19 devnull error("error(string): arg type");
731 564ca709 2004-04-19 devnull
732 564ca709 2004-04-19 devnull error(res.store.u.string->string);
733 564ca709 2004-04-19 devnull }
734 564ca709 2004-04-19 devnull
735 564ca709 2004-04-19 devnull void
736 564ca709 2004-04-19 devnull doaccess(Node *r, Node *args)
737 564ca709 2004-04-19 devnull {
738 564ca709 2004-04-19 devnull Node res;
739 564ca709 2004-04-19 devnull
740 564ca709 2004-04-19 devnull if(args == 0)
741 564ca709 2004-04-19 devnull error("access(filename): arg count");
742 564ca709 2004-04-19 devnull expr(args, &res);
743 564ca709 2004-04-19 devnull if(res.type != TSTRING)
744 564ca709 2004-04-19 devnull error("access(filename): arg type");
745 564ca709 2004-04-19 devnull
746 564ca709 2004-04-19 devnull r->op = OCONST;
747 564ca709 2004-04-19 devnull r->type = TINT;
748 6c885647 2004-04-20 devnull r->store.fmt = 'D';
749 fa325e9b 2020-01-10 cross r->store.u.ival = 0;
750 564ca709 2004-04-19 devnull if(access(res.store.u.string->string, 4) == 0)
751 564ca709 2004-04-19 devnull r->store.u.ival = 1;
752 564ca709 2004-04-19 devnull }
753 564ca709 2004-04-19 devnull
754 564ca709 2004-04-19 devnull void
755 564ca709 2004-04-19 devnull readfile(Node *r, Node *args)
756 564ca709 2004-04-19 devnull {
757 564ca709 2004-04-19 devnull Node res;
758 564ca709 2004-04-19 devnull int n, fd;
759 564ca709 2004-04-19 devnull char *buf;
760 564ca709 2004-04-19 devnull Dir *db;
761 564ca709 2004-04-19 devnull
762 564ca709 2004-04-19 devnull if(args == 0)
763 564ca709 2004-04-19 devnull error("readfile(filename): arg count");
764 564ca709 2004-04-19 devnull expr(args, &res);
765 564ca709 2004-04-19 devnull if(res.type != TSTRING)
766 564ca709 2004-04-19 devnull error("readfile(filename): arg type");
767 564ca709 2004-04-19 devnull
768 564ca709 2004-04-19 devnull fd = open(res.store.u.string->string, OREAD);
769 564ca709 2004-04-19 devnull if(fd < 0)
770 564ca709 2004-04-19 devnull return;
771 564ca709 2004-04-19 devnull
772 564ca709 2004-04-19 devnull db = dirfstat(fd);
773 564ca709 2004-04-19 devnull if(db == nil || db->length == 0)
774 564ca709 2004-04-19 devnull n = 8192;
775 564ca709 2004-04-19 devnull else
776 564ca709 2004-04-19 devnull n = db->length;
777 564ca709 2004-04-19 devnull free(db);
778 564ca709 2004-04-19 devnull
779 564ca709 2004-04-19 devnull buf = malloc(n);
780 564ca709 2004-04-19 devnull n = read(fd, buf, n);
781 564ca709 2004-04-19 devnull
782 564ca709 2004-04-19 devnull if(n > 0) {
783 564ca709 2004-04-19 devnull r->op = OCONST;
784 564ca709 2004-04-19 devnull r->type = TSTRING;
785 564ca709 2004-04-19 devnull r->store.u.string = strnodlen(buf, n);
786 564ca709 2004-04-19 devnull r->store.fmt = 's';
787 564ca709 2004-04-19 devnull }
788 564ca709 2004-04-19 devnull free(buf);
789 564ca709 2004-04-19 devnull close(fd);
790 564ca709 2004-04-19 devnull }
791 564ca709 2004-04-19 devnull
792 564ca709 2004-04-19 devnull void
793 564ca709 2004-04-19 devnull getfile(Node *r, Node *args)
794 564ca709 2004-04-19 devnull {
795 564ca709 2004-04-19 devnull int n;
796 564ca709 2004-04-19 devnull char *p;
797 564ca709 2004-04-19 devnull Node res;
798 564ca709 2004-04-19 devnull String *s;
799 564ca709 2004-04-19 devnull Biobuf *bp;
800 564ca709 2004-04-19 devnull List **l, *new;
801 564ca709 2004-04-19 devnull
802 564ca709 2004-04-19 devnull if(args == 0)
803 564ca709 2004-04-19 devnull error("file(filename): arg count");
804 564ca709 2004-04-19 devnull expr(args, &res);
805 564ca709 2004-04-19 devnull if(res.type != TSTRING)
806 564ca709 2004-04-19 devnull error("file(filename): arg type");
807 564ca709 2004-04-19 devnull
808 564ca709 2004-04-19 devnull r->op = OCONST;
809 564ca709 2004-04-19 devnull r->type = TLIST;
810 564ca709 2004-04-19 devnull r->store.u.l = 0;
811 564ca709 2004-04-19 devnull
812 564ca709 2004-04-19 devnull p = res.store.u.string->string;
813 564ca709 2004-04-19 devnull bp = Bopen(p, OREAD);
814 564ca709 2004-04-19 devnull if(bp == 0)
815 564ca709 2004-04-19 devnull return;
816 564ca709 2004-04-19 devnull
817 564ca709 2004-04-19 devnull l = &r->store.u.l;
818 564ca709 2004-04-19 devnull for(;;) {
819 564ca709 2004-04-19 devnull p = Brdline(bp, '\n');
820 564ca709 2004-04-19 devnull n = Blinelen(bp);
821 564ca709 2004-04-19 devnull if(p == 0) {
822 564ca709 2004-04-19 devnull if(n == 0)
823 564ca709 2004-04-19 devnull break;
824 564ca709 2004-04-19 devnull s = strnodlen(0, n);
825 564ca709 2004-04-19 devnull Bread(bp, s->string, n);
826 564ca709 2004-04-19 devnull }
827 564ca709 2004-04-19 devnull else
828 564ca709 2004-04-19 devnull s = strnodlen(p, n-1);
829 564ca709 2004-04-19 devnull
830 564ca709 2004-04-19 devnull new = al(TSTRING);
831 564ca709 2004-04-19 devnull new->store.u.string = s;
832 564ca709 2004-04-19 devnull new->store.fmt = 's';
833 564ca709 2004-04-19 devnull *l = new;
834 564ca709 2004-04-19 devnull l = &new->next;
835 564ca709 2004-04-19 devnull }
836 564ca709 2004-04-19 devnull Bterm(bp);
837 564ca709 2004-04-19 devnull }
838 564ca709 2004-04-19 devnull
839 564ca709 2004-04-19 devnull void
840 564ca709 2004-04-19 devnull cvtatof(Node *r, Node *args)
841 564ca709 2004-04-19 devnull {
842 564ca709 2004-04-19 devnull Node res;
843 564ca709 2004-04-19 devnull
844 564ca709 2004-04-19 devnull if(args == 0)
845 564ca709 2004-04-19 devnull error("atof(string): arg count");
846 564ca709 2004-04-19 devnull expr(args, &res);
847 564ca709 2004-04-19 devnull if(res.type != TSTRING)
848 564ca709 2004-04-19 devnull error("atof(string): arg type");
849 564ca709 2004-04-19 devnull
850 564ca709 2004-04-19 devnull r->op = OCONST;
851 564ca709 2004-04-19 devnull r->type = TFLOAT;
852 564ca709 2004-04-19 devnull r->store.u.fval = atof(res.store.u.string->string);
853 564ca709 2004-04-19 devnull r->store.fmt = 'f';
854 564ca709 2004-04-19 devnull }
855 564ca709 2004-04-19 devnull
856 564ca709 2004-04-19 devnull void
857 564ca709 2004-04-19 devnull cvtatoi(Node *r, Node *args)
858 564ca709 2004-04-19 devnull {
859 564ca709 2004-04-19 devnull Node res;
860 564ca709 2004-04-19 devnull
861 564ca709 2004-04-19 devnull if(args == 0)
862 564ca709 2004-04-19 devnull error("atoi(string): arg count");
863 564ca709 2004-04-19 devnull expr(args, &res);
864 564ca709 2004-04-19 devnull if(res.type != TSTRING)
865 564ca709 2004-04-19 devnull error("atoi(string): arg type");
866 564ca709 2004-04-19 devnull
867 564ca709 2004-04-19 devnull r->op = OCONST;
868 564ca709 2004-04-19 devnull r->type = TINT;
869 4a000a28 2012-03-05 rsc r->store.u.ival = strtoull(res.store.u.string->string, 0, 0);
870 564ca709 2004-04-19 devnull r->store.fmt = 'D';
871 564ca709 2004-04-19 devnull }
872 564ca709 2004-04-19 devnull
873 564ca709 2004-04-19 devnull void
874 564ca709 2004-04-19 devnull cvtitoa(Node *r, Node *args)
875 564ca709 2004-04-19 devnull {
876 564ca709 2004-04-19 devnull Node res;
877 564ca709 2004-04-19 devnull Node *av[Maxarg];
878 4a000a28 2012-03-05 rsc s64int ival;
879 564ca709 2004-04-19 devnull char buf[128], *fmt;
880 564ca709 2004-04-19 devnull
881 564ca709 2004-04-19 devnull if(args == 0)
882 564ca709 2004-04-19 devnull err:
883 564ca709 2004-04-19 devnull error("itoa(number [, printformat]): arg count");
884 564ca709 2004-04-19 devnull na = 0;
885 564ca709 2004-04-19 devnull flatten(av, args);
886 564ca709 2004-04-19 devnull if(na == 0 || na > 2)
887 564ca709 2004-04-19 devnull goto err;
888 564ca709 2004-04-19 devnull expr(av[0], &res);
889 564ca709 2004-04-19 devnull if(res.type != TINT)
890 564ca709 2004-04-19 devnull error("itoa(integer): arg type");
891 564ca709 2004-04-19 devnull ival = (int)res.store.u.ival;
892 564ca709 2004-04-19 devnull fmt = "%d";
893 564ca709 2004-04-19 devnull if(na == 2){
894 564ca709 2004-04-19 devnull expr(av[1], &res);
895 564ca709 2004-04-19 devnull if(res.type != TSTRING)
896 564ca709 2004-04-19 devnull error("itoa(integer, string): arg type");
897 564ca709 2004-04-19 devnull fmt = res.store.u.string->string;
898 564ca709 2004-04-19 devnull }
899 564ca709 2004-04-19 devnull
900 564ca709 2004-04-19 devnull sprint(buf, fmt, ival);
901 564ca709 2004-04-19 devnull r->op = OCONST;
902 564ca709 2004-04-19 devnull r->type = TSTRING;
903 564ca709 2004-04-19 devnull r->store.u.string = strnode(buf);
904 564ca709 2004-04-19 devnull r->store.fmt = 's';
905 564ca709 2004-04-19 devnull }
906 564ca709 2004-04-19 devnull
907 564ca709 2004-04-19 devnull List*
908 564ca709 2004-04-19 devnull mapent(Map *m)
909 564ca709 2004-04-19 devnull {
910 564ca709 2004-04-19 devnull int i;
911 564ca709 2004-04-19 devnull List *l, *n, **t, *h;
912 564ca709 2004-04-19 devnull
913 564ca709 2004-04-19 devnull h = 0;
914 564ca709 2004-04-19 devnull t = &h;
915 564ca709 2004-04-19 devnull for(i = 0; i < m->nseg; i++) {
916 564ca709 2004-04-19 devnull l = al(TSTRING);
917 564ca709 2004-04-19 devnull n = al(TLIST);
918 564ca709 2004-04-19 devnull n->store.u.l = l;
919 564ca709 2004-04-19 devnull *t = n;
920 564ca709 2004-04-19 devnull t = &n->next;
921 564ca709 2004-04-19 devnull l->store.u.string = strnode(m->seg[i].name);
922 564ca709 2004-04-19 devnull l->store.fmt = 's';
923 564ca709 2004-04-19 devnull l->next = al(TSTRING);
924 564ca709 2004-04-19 devnull l = l->next;
925 564ca709 2004-04-19 devnull l->store.u.string = strnode(m->seg[i].file ? m->seg[i].file : "");
926 564ca709 2004-04-19 devnull l->store.fmt = 's';
927 564ca709 2004-04-19 devnull l->next = al(TINT);
928 564ca709 2004-04-19 devnull l = l->next;
929 564ca709 2004-04-19 devnull l->store.u.ival = m->seg[i].base;
930 564ca709 2004-04-19 devnull l->store.fmt = 'X';
931 564ca709 2004-04-19 devnull l->next = al(TINT);
932 564ca709 2004-04-19 devnull l = l->next;
933 564ca709 2004-04-19 devnull l->store.u.ival = m->seg[i].base + m->seg[i].size;
934 564ca709 2004-04-19 devnull l->store.fmt = 'X';
935 564ca709 2004-04-19 devnull l->next = al(TINT);
936 564ca709 2004-04-19 devnull l = l->next;
937 564ca709 2004-04-19 devnull l->store.u.ival = m->seg[i].offset;
938 564ca709 2004-04-19 devnull l->store.fmt = 'X';
939 564ca709 2004-04-19 devnull }
940 564ca709 2004-04-19 devnull return h;
941 564ca709 2004-04-19 devnull }
942 564ca709 2004-04-19 devnull
943 564ca709 2004-04-19 devnull void
944 564ca709 2004-04-19 devnull map(Node *r, Node *args)
945 564ca709 2004-04-19 devnull {
946 564ca709 2004-04-19 devnull int i;
947 564ca709 2004-04-19 devnull Map *m;
948 564ca709 2004-04-19 devnull List *l;
949 564ca709 2004-04-19 devnull char *nam, *fil;
950 564ca709 2004-04-19 devnull Node *av[Maxarg], res;
951 564ca709 2004-04-19 devnull
952 564ca709 2004-04-19 devnull na = 0;
953 564ca709 2004-04-19 devnull flatten(av, args);
954 564ca709 2004-04-19 devnull
955 564ca709 2004-04-19 devnull if(na != 0) {
956 564ca709 2004-04-19 devnull expr(av[0], &res);
957 564ca709 2004-04-19 devnull if(res.type != TLIST)
958 564ca709 2004-04-19 devnull error("map(list): map needs a list");
959 564ca709 2004-04-19 devnull if(listlen(res.store.u.l) != 5)
960 564ca709 2004-04-19 devnull error("map(list): list must have 5 entries");
961 564ca709 2004-04-19 devnull
962 564ca709 2004-04-19 devnull l = res.store.u.l;
963 564ca709 2004-04-19 devnull if(l->type != TSTRING)
964 564ca709 2004-04-19 devnull error("map name must be a string");
965 564ca709 2004-04-19 devnull nam = l->store.u.string->string;
966 564ca709 2004-04-19 devnull l = l->next;
967 564ca709 2004-04-19 devnull if(l->type != TSTRING)
968 564ca709 2004-04-19 devnull error("map file must be a string");
969 564ca709 2004-04-19 devnull fil = l->store.u.string->string;
970 564ca709 2004-04-19 devnull m = symmap;
971 564ca709 2004-04-19 devnull i = findseg(m, nam, fil);
972 564ca709 2004-04-19 devnull if(i < 0) {
973 564ca709 2004-04-19 devnull m = cormap;
974 564ca709 2004-04-19 devnull i = findseg(m, nam, fil);
975 564ca709 2004-04-19 devnull }
976 564ca709 2004-04-19 devnull if(i < 0)
977 fa325e9b 2020-01-10 cross error("%s %s is not a map entry", nam, fil);
978 564ca709 2004-04-19 devnull l = l->next;
979 564ca709 2004-04-19 devnull if(l->type != TINT)
980 564ca709 2004-04-19 devnull error("map entry not int");
981 564ca709 2004-04-19 devnull m->seg[i].base = l->store.u.ival;
982 564ca709 2004-04-19 devnull /*
983 564ca709 2004-04-19 devnull if (strcmp(ent, "text") == 0)
984 564ca709 2004-04-19 devnull textseg(l->store.u.ival, &fhdr);
985 564ca709 2004-04-19 devnull */
986 564ca709 2004-04-19 devnull l = l->next;
987 564ca709 2004-04-19 devnull if(l->type != TINT)
988 564ca709 2004-04-19 devnull error("map entry not int");
989 564ca709 2004-04-19 devnull m->seg[i].size = l->store.u.ival - m->seg[i].base;
990 564ca709 2004-04-19 devnull l = l->next;
991 564ca709 2004-04-19 devnull if(l->type != TINT)
992 564ca709 2004-04-19 devnull error("map entry not int");
993 564ca709 2004-04-19 devnull m->seg[i].offset = l->store.u.ival;
994 564ca709 2004-04-19 devnull }
995 564ca709 2004-04-19 devnull
996 564ca709 2004-04-19 devnull r->type = TLIST;
997 564ca709 2004-04-19 devnull r->store.u.l = 0;
998 564ca709 2004-04-19 devnull if(symmap)
999 564ca709 2004-04-19 devnull r->store.u.l = mapent(symmap);
1000 564ca709 2004-04-19 devnull if(cormap) {
1001 564ca709 2004-04-19 devnull if(r->store.u.l == 0)
1002 564ca709 2004-04-19 devnull r->store.u.l = mapent(cormap);
1003 564ca709 2004-04-19 devnull else {
1004 564ca709 2004-04-19 devnull for(l = r->store.u.l; l->next; l = l->next)
1005 564ca709 2004-04-19 devnull ;
1006 564ca709 2004-04-19 devnull l->next = mapent(cormap);
1007 564ca709 2004-04-19 devnull }
1008 564ca709 2004-04-19 devnull }
1009 564ca709 2004-04-19 devnull }
1010 564ca709 2004-04-19 devnull
1011 fa325e9b 2020-01-10 cross void
1012 564ca709 2004-04-19 devnull flatten(Node **av, Node *n)
1013 564ca709 2004-04-19 devnull {
1014 564ca709 2004-04-19 devnull if(n == 0)
1015 564ca709 2004-04-19 devnull return;
1016 564ca709 2004-04-19 devnull
1017 564ca709 2004-04-19 devnull switch(n->op) {
1018 564ca709 2004-04-19 devnull case OLIST:
1019 564ca709 2004-04-19 devnull flatten(av, n->left);
1020 564ca709 2004-04-19 devnull flatten(av, n->right);
1021 564ca709 2004-04-19 devnull break;
1022 564ca709 2004-04-19 devnull default:
1023 564ca709 2004-04-19 devnull av[na++] = n;
1024 564ca709 2004-04-19 devnull if(na >= Maxarg)
1025 564ca709 2004-04-19 devnull error("too many function arguments");
1026 564ca709 2004-04-19 devnull break;
1027 564ca709 2004-04-19 devnull }
1028 564ca709 2004-04-19 devnull }
1029 564ca709 2004-04-19 devnull
1030 564ca709 2004-04-19 devnull static struct
1031 564ca709 2004-04-19 devnull {
1032 564ca709 2004-04-19 devnull char *name;
1033 4a000a28 2012-03-05 rsc u64int val;
1034 564ca709 2004-04-19 devnull } sregs[Maxarg/2];
1035 564ca709 2004-04-19 devnull static int nsregs;
1036 564ca709 2004-04-19 devnull
1037 564ca709 2004-04-19 devnull static int
1038 443d6288 2012-02-19 rsc straceregrw(Regs *regs, char *name, u64int *val, int isr)
1039 564ca709 2004-04-19 devnull {
1040 564ca709 2004-04-19 devnull int i;
1041 564ca709 2004-04-19 devnull
1042 564ca709 2004-04-19 devnull if(!isr){
1043 564ca709 2004-04-19 devnull werrstr("saved registers cannot be written");
1044 564ca709 2004-04-19 devnull return -1;
1045 564ca709 2004-04-19 devnull }
1046 564ca709 2004-04-19 devnull for(i=0; i<nsregs; i++)
1047 564ca709 2004-04-19 devnull if(strcmp(sregs[i].name, name) == 0){
1048 564ca709 2004-04-19 devnull *val = sregs[i].val;
1049 564ca709 2004-04-19 devnull return 0;
1050 564ca709 2004-04-19 devnull }
1051 4f2ac1b7 2005-01-23 devnull return rget(acidregs, name, val);
1052 564ca709 2004-04-19 devnull }
1053 564ca709 2004-04-19 devnull
1054 564ca709 2004-04-19 devnull void
1055 564ca709 2004-04-19 devnull strace(Node *r, Node *args)
1056 564ca709 2004-04-19 devnull {
1057 564ca709 2004-04-19 devnull Node *av[Maxarg], res;
1058 564ca709 2004-04-19 devnull List *l;
1059 564ca709 2004-04-19 devnull Regs regs;
1060 564ca709 2004-04-19 devnull
1061 564ca709 2004-04-19 devnull na = 0;
1062 564ca709 2004-04-19 devnull flatten(av, args);
1063 564ca709 2004-04-19 devnull
1064 564ca709 2004-04-19 devnull if(na != 1)
1065 564ca709 2004-04-19 devnull error("strace(list): want one arg");
1066 564ca709 2004-04-19 devnull
1067 564ca709 2004-04-19 devnull expr(av[0], &res);
1068 564ca709 2004-04-19 devnull if(res.type != TLIST)
1069 564ca709 2004-04-19 devnull error("strace(list): strace needs a list");
1070 564ca709 2004-04-19 devnull l = res.store.u.l;
1071 564ca709 2004-04-19 devnull if(listlen(l)%2)
1072 564ca709 2004-04-19 devnull error("strace(list): strace needs an even-length list");
1073 564ca709 2004-04-19 devnull for(nsregs=0; l; nsregs++){
1074 564ca709 2004-04-19 devnull if(l->type != TSTRING)
1075 564ca709 2004-04-19 devnull error("strace({r,v,r,v,...}): non-string name");
1076 564ca709 2004-04-19 devnull sregs[nsregs].name = l->store.u.string->string;
1077 564ca709 2004-04-19 devnull if(regdesc(sregs[nsregs].name) == nil)
1078 564ca709 2004-04-19 devnull error("strace: bad register '%s'", sregs[nsregs].name);
1079 564ca709 2004-04-19 devnull l = l->next;
1080 564ca709 2004-04-19 devnull
1081 564ca709 2004-04-19 devnull if(l == nil)
1082 564ca709 2004-04-19 devnull error("cannot happen in strace");
1083 564ca709 2004-04-19 devnull if(l->type != TINT)
1084 564ca709 2004-04-19 devnull error("strace: non-int value for %s", sregs[nsregs].name);
1085 564ca709 2004-04-19 devnull sregs[nsregs].val = l->store.u.ival;
1086 564ca709 2004-04-19 devnull l = l->next;
1087 564ca709 2004-04-19 devnull }
1088 564ca709 2004-04-19 devnull regs.rw = straceregrw;
1089 fa325e9b 2020-01-10 cross
1090 564ca709 2004-04-19 devnull tracelist = 0;
1091 564ca709 2004-04-19 devnull if(stacktrace(cormap, &regs, trlist) <= 0)
1092 564ca709 2004-04-19 devnull error("no stack frame");
1093 564ca709 2004-04-19 devnull r->type = TLIST;
1094 564ca709 2004-04-19 devnull r->store.u.l = tracelist;
1095 564ca709 2004-04-19 devnull }
1096 564ca709 2004-04-19 devnull
1097 564ca709 2004-04-19 devnull void
1098 564ca709 2004-04-19 devnull regerror(char *msg)
1099 564ca709 2004-04-19 devnull {
1100 564ca709 2004-04-19 devnull error(msg);
1101 564ca709 2004-04-19 devnull }
1102 564ca709 2004-04-19 devnull
1103 564ca709 2004-04-19 devnull void
1104 564ca709 2004-04-19 devnull regexp(Node *r, Node *args)
1105 564ca709 2004-04-19 devnull {
1106 564ca709 2004-04-19 devnull Node res;
1107 564ca709 2004-04-19 devnull Reprog *rp;
1108 564ca709 2004-04-19 devnull Node *av[Maxarg];
1109 564ca709 2004-04-19 devnull
1110 564ca709 2004-04-19 devnull na = 0;
1111 564ca709 2004-04-19 devnull flatten(av, args);
1112 564ca709 2004-04-19 devnull if(na != 2)
1113 564ca709 2004-04-19 devnull error("regexp(pattern, string): arg count");
1114 564ca709 2004-04-19 devnull expr(av[0], &res);
1115 564ca709 2004-04-19 devnull if(res.type != TSTRING)
1116 564ca709 2004-04-19 devnull error("regexp(pattern, string): pattern must be string");
1117 564ca709 2004-04-19 devnull rp = regcomp(res.store.u.string->string);
1118 564ca709 2004-04-19 devnull if(rp == 0)
1119 564ca709 2004-04-19 devnull return;
1120 564ca709 2004-04-19 devnull
1121 564ca709 2004-04-19 devnull expr(av[1], &res);
1122 564ca709 2004-04-19 devnull if(res.type != TSTRING)
1123 564ca709 2004-04-19 devnull error("regexp(pattern, string): bad string");
1124 564ca709 2004-04-19 devnull
1125 564ca709 2004-04-19 devnull r->store.fmt = 'D';
1126 564ca709 2004-04-19 devnull r->type = TINT;
1127 564ca709 2004-04-19 devnull r->store.u.ival = regexec(rp, res.store.u.string->string, 0, 0);
1128 564ca709 2004-04-19 devnull free(rp);
1129 564ca709 2004-04-19 devnull }
1130 564ca709 2004-04-19 devnull
1131 564ca709 2004-04-19 devnull char vfmt[] = "aBbcCdDfFgGiIoOqQrRsSuUVxXYZ";
1132 564ca709 2004-04-19 devnull
1133 564ca709 2004-04-19 devnull void
1134 564ca709 2004-04-19 devnull fmt(Node *r, Node *args)
1135 564ca709 2004-04-19 devnull {
1136 564ca709 2004-04-19 devnull Node res;
1137 564ca709 2004-04-19 devnull Node *av[Maxarg];
1138 564ca709 2004-04-19 devnull
1139 564ca709 2004-04-19 devnull na = 0;
1140 564ca709 2004-04-19 devnull flatten(av, args);
1141 564ca709 2004-04-19 devnull if(na != 2)
1142 564ca709 2004-04-19 devnull error("fmt(obj, fmt): arg count");
1143 564ca709 2004-04-19 devnull expr(av[1], &res);
1144 564ca709 2004-04-19 devnull if(res.type != TINT || strchr(vfmt, res.store.u.ival) == 0)
1145 564ca709 2004-04-19 devnull error("fmt(obj, fmt): bad format '%c'", (char)res.store.u.ival);
1146 564ca709 2004-04-19 devnull expr(av[0], r);
1147 564ca709 2004-04-19 devnull r->store.fmt = res.store.u.ival;
1148 564ca709 2004-04-19 devnull }
1149 564ca709 2004-04-19 devnull
1150 564ca709 2004-04-19 devnull void
1151 564ca709 2004-04-19 devnull patom(char type, Store *res)
1152 564ca709 2004-04-19 devnull {
1153 564ca709 2004-04-19 devnull int i;
1154 564ca709 2004-04-19 devnull char buf[512];
1155 564ca709 2004-04-19 devnull extern char *typenames[];
1156 4f2ac1b7 2005-01-23 devnull Node *n;
1157 4f2ac1b7 2005-01-23 devnull
1158 4f2ac1b7 2005-01-23 devnull switch(type){
1159 4f2ac1b7 2005-01-23 devnull case TREG:
1160 281c90a5 2005-02-11 devnull if(res->u.reg.thread)
1161 7b8a3f12 2005-02-11 devnull Bprint(bout, "register(\"%s\", %#ux)", res->u.reg.name, res->u.reg.thread);
1162 281c90a5 2005-02-11 devnull else
1163 281c90a5 2005-02-11 devnull Bprint(bout, "register(\"%s\")", res->u.reg.name);
1164 4f2ac1b7 2005-01-23 devnull return;
1165 4f2ac1b7 2005-01-23 devnull case TCON:
1166 4f2ac1b7 2005-01-23 devnull Bprint(bout, "refconst(");
1167 4f2ac1b7 2005-01-23 devnull n = res->u.con;
1168 4f2ac1b7 2005-01-23 devnull patom(n->type, &n->store);
1169 4f2ac1b7 2005-01-23 devnull Bprint(bout, ")");
1170 4f2ac1b7 2005-01-23 devnull return;
1171 4f2ac1b7 2005-01-23 devnull }
1172 4f2ac1b7 2005-01-23 devnull
1173 4f2ac1b7 2005-01-23 devnull switch(res->fmt){
1174 4f2ac1b7 2005-01-23 devnull case 'c':
1175 4f2ac1b7 2005-01-23 devnull case 'C':
1176 4f2ac1b7 2005-01-23 devnull case 'r':
1177 4f2ac1b7 2005-01-23 devnull case 'B':
1178 4f2ac1b7 2005-01-23 devnull case 'b':
1179 4f2ac1b7 2005-01-23 devnull case 'X':
1180 4f2ac1b7 2005-01-23 devnull case 'x':
1181 4f2ac1b7 2005-01-23 devnull case 'W':
1182 4f2ac1b7 2005-01-23 devnull case 'D':
1183 4f2ac1b7 2005-01-23 devnull case 'd':
1184 4f2ac1b7 2005-01-23 devnull case 'u':
1185 4f2ac1b7 2005-01-23 devnull case 'U':
1186 4f2ac1b7 2005-01-23 devnull case 'Z':
1187 4f2ac1b7 2005-01-23 devnull case 'V':
1188 4f2ac1b7 2005-01-23 devnull case 'Y':
1189 4f2ac1b7 2005-01-23 devnull case 'o':
1190 4f2ac1b7 2005-01-23 devnull case 'O':
1191 4f2ac1b7 2005-01-23 devnull case 'q':
1192 4f2ac1b7 2005-01-23 devnull case 'Q':
1193 4f2ac1b7 2005-01-23 devnull case 'a':
1194 4f2ac1b7 2005-01-23 devnull case 'A':
1195 4f2ac1b7 2005-01-23 devnull case 'I':
1196 4f2ac1b7 2005-01-23 devnull case 'i':
1197 4f2ac1b7 2005-01-23 devnull if(type != TINT){
1198 4f2ac1b7 2005-01-23 devnull badtype:
1199 4f2ac1b7 2005-01-23 devnull Bprint(bout, "*%s\\%c*", typenames[(uchar)type], res->fmt);
1200 4f2ac1b7 2005-01-23 devnull return;
1201 4f2ac1b7 2005-01-23 devnull }
1202 4f2ac1b7 2005-01-23 devnull break;
1203 4f2ac1b7 2005-01-23 devnull
1204 4f2ac1b7 2005-01-23 devnull case 'f':
1205 4f2ac1b7 2005-01-23 devnull case 'F':
1206 4f2ac1b7 2005-01-23 devnull if(type != TFLOAT)
1207 4f2ac1b7 2005-01-23 devnull goto badtype;
1208 4f2ac1b7 2005-01-23 devnull break;
1209 4f2ac1b7 2005-01-23 devnull
1210 4f2ac1b7 2005-01-23 devnull case 's':
1211 4f2ac1b7 2005-01-23 devnull case 'g':
1212 4f2ac1b7 2005-01-23 devnull case 'G':
1213 4f2ac1b7 2005-01-23 devnull case 'R':
1214 4f2ac1b7 2005-01-23 devnull if(type != TSTRING)
1215 4f2ac1b7 2005-01-23 devnull goto badtype;
1216 4f2ac1b7 2005-01-23 devnull break;
1217 4f2ac1b7 2005-01-23 devnull }
1218 564ca709 2004-04-19 devnull
1219 564ca709 2004-04-19 devnull switch(res->fmt) {
1220 564ca709 2004-04-19 devnull case 'c':
1221 564ca709 2004-04-19 devnull Bprint(bout, "%c", (int)res->u.ival);
1222 564ca709 2004-04-19 devnull break;
1223 564ca709 2004-04-19 devnull case 'C':
1224 564ca709 2004-04-19 devnull if(res->u.ival < ' ' || res->u.ival >= 0x7f)
1225 564ca709 2004-04-19 devnull Bprint(bout, "%3d", (int)res->u.ival&0xff);
1226 564ca709 2004-04-19 devnull else
1227 564ca709 2004-04-19 devnull Bprint(bout, "%3c", (int)res->u.ival);
1228 564ca709 2004-04-19 devnull break;
1229 564ca709 2004-04-19 devnull case 'r':
1230 564ca709 2004-04-19 devnull Bprint(bout, "%C", (int)res->u.ival);
1231 564ca709 2004-04-19 devnull break;
1232 564ca709 2004-04-19 devnull case 'B':
1233 564ca709 2004-04-19 devnull memset(buf, '0', 34);
1234 564ca709 2004-04-19 devnull buf[1] = 'b';
1235 564ca709 2004-04-19 devnull for(i = 0; i < 32; i++) {
1236 564ca709 2004-04-19 devnull if(res->u.ival & (1<<i))
1237 564ca709 2004-04-19 devnull buf[33-i] = '1';
1238 564ca709 2004-04-19 devnull }
1239 564ca709 2004-04-19 devnull buf[35] = '\0';
1240 564ca709 2004-04-19 devnull Bprint(bout, "%s", buf);
1241 564ca709 2004-04-19 devnull break;
1242 564ca709 2004-04-19 devnull case 'b':
1243 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.2x", (int)res->u.ival&0xff);
1244 564ca709 2004-04-19 devnull break;
1245 564ca709 2004-04-19 devnull case 'X':
1246 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.8lux", (ulong)res->u.ival);
1247 564ca709 2004-04-19 devnull break;
1248 564ca709 2004-04-19 devnull case 'x':
1249 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.4lux", (ulong)res->u.ival&0xffff);
1250 564ca709 2004-04-19 devnull break;
1251 564ca709 2004-04-19 devnull case 'W':
1252 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.16llux", res->u.ival);
1253 564ca709 2004-04-19 devnull break;
1254 564ca709 2004-04-19 devnull case 'D':
1255 564ca709 2004-04-19 devnull Bprint(bout, "%d", (int)res->u.ival);
1256 564ca709 2004-04-19 devnull break;
1257 564ca709 2004-04-19 devnull case 'd':
1258 564ca709 2004-04-19 devnull Bprint(bout, "%d", (ushort)res->u.ival);
1259 564ca709 2004-04-19 devnull break;
1260 564ca709 2004-04-19 devnull case 'u':
1261 564ca709 2004-04-19 devnull Bprint(bout, "%d", (int)res->u.ival&0xffff);
1262 564ca709 2004-04-19 devnull break;
1263 564ca709 2004-04-19 devnull case 'U':
1264 564ca709 2004-04-19 devnull Bprint(bout, "%lud", (ulong)res->u.ival);
1265 564ca709 2004-04-19 devnull break;
1266 564ca709 2004-04-19 devnull case 'Z':
1267 564ca709 2004-04-19 devnull Bprint(bout, "%llud", res->u.ival);
1268 564ca709 2004-04-19 devnull break;
1269 564ca709 2004-04-19 devnull case 'V':
1270 564ca709 2004-04-19 devnull Bprint(bout, "%lld", res->u.ival);
1271 564ca709 2004-04-19 devnull break;
1272 564ca709 2004-04-19 devnull case 'Y':
1273 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.16llux", res->u.ival);
1274 564ca709 2004-04-19 devnull break;
1275 564ca709 2004-04-19 devnull case 'o':
1276 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.11uo", (int)res->u.ival&0xffff);
1277 564ca709 2004-04-19 devnull break;
1278 564ca709 2004-04-19 devnull case 'O':
1279 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.6uo", (int)res->u.ival);
1280 564ca709 2004-04-19 devnull break;
1281 564ca709 2004-04-19 devnull case 'q':
1282 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.11o", (short)(res->u.ival&0xffff));
1283 564ca709 2004-04-19 devnull break;
1284 564ca709 2004-04-19 devnull case 'Q':
1285 7b8a3f12 2005-02-11 devnull Bprint(bout, "%#.6o", (int)res->u.ival);
1286 564ca709 2004-04-19 devnull break;
1287 564ca709 2004-04-19 devnull case 'f':
1288 564ca709 2004-04-19 devnull case 'F':
1289 4f2ac1b7 2005-01-23 devnull Bprint(bout, "%g", res->u.fval);
1290 564ca709 2004-04-19 devnull break;
1291 564ca709 2004-04-19 devnull case 's':
1292 564ca709 2004-04-19 devnull case 'g':
1293 564ca709 2004-04-19 devnull case 'G':
1294 4f2ac1b7 2005-01-23 devnull Bwrite(bout, res->u.string->string, res->u.string->len);
1295 564ca709 2004-04-19 devnull break;
1296 564ca709 2004-04-19 devnull case 'R':
1297 4f2ac1b7 2005-01-23 devnull Bprint(bout, "%S", (Rune*)res->u.string->string);
1298 564ca709 2004-04-19 devnull break;
1299 564ca709 2004-04-19 devnull case 'a':
1300 564ca709 2004-04-19 devnull case 'A':
1301 564ca709 2004-04-19 devnull symoff(buf, sizeof(buf), res->u.ival, CANY);
1302 564ca709 2004-04-19 devnull Bprint(bout, "%s", buf);
1303 564ca709 2004-04-19 devnull break;
1304 564ca709 2004-04-19 devnull case 'I':
1305 564ca709 2004-04-19 devnull case 'i':
1306 4f2ac1b7 2005-01-23 devnull if (symmap == nil || (*mach->das)(symmap, res->u.ival, res->fmt, buf, sizeof(buf)) < 0)
1307 4f2ac1b7 2005-01-23 devnull Bprint(bout, "no instruction");
1308 4f2ac1b7 2005-01-23 devnull else
1309 4f2ac1b7 2005-01-23 devnull Bprint(bout, "%s", buf);
1310 564ca709 2004-04-19 devnull break;
1311 564ca709 2004-04-19 devnull }
1312 564ca709 2004-04-19 devnull }
1313 564ca709 2004-04-19 devnull
1314 564ca709 2004-04-19 devnull void
1315 564ca709 2004-04-19 devnull blprint(List *l)
1316 564ca709 2004-04-19 devnull {
1317 564ca709 2004-04-19 devnull Store *res;
1318 564ca709 2004-04-19 devnull
1319 564ca709 2004-04-19 devnull Bprint(bout, "{");
1320 564ca709 2004-04-19 devnull while(l) {
1321 564ca709 2004-04-19 devnull switch(l->type) {
1322 564ca709 2004-04-19 devnull case TINT:
1323 564ca709 2004-04-19 devnull res = &l->store;
1324 564ca709 2004-04-19 devnull if(res->fmt == 'c'){
1325 564ca709 2004-04-19 devnull Bprint(bout, "\'%c\'", (int)res->u.ival);
1326 564ca709 2004-04-19 devnull break;
1327 564ca709 2004-04-19 devnull }else if(res->fmt == 'r'){
1328 564ca709 2004-04-19 devnull Bprint(bout, "\'%C\'", (int)res->u.ival);
1329 564ca709 2004-04-19 devnull break;
1330 564ca709 2004-04-19 devnull }
1331 564ca709 2004-04-19 devnull /* fall through */
1332 564ca709 2004-04-19 devnull default:
1333 564ca709 2004-04-19 devnull patom(l->type, &l->store);
1334 564ca709 2004-04-19 devnull break;
1335 564ca709 2004-04-19 devnull case TSTRING:
1336 564ca709 2004-04-19 devnull Bputc(bout, '"');
1337 564ca709 2004-04-19 devnull patom(l->type, &l->store);
1338 564ca709 2004-04-19 devnull Bputc(bout, '"');
1339 564ca709 2004-04-19 devnull break;
1340 564ca709 2004-04-19 devnull case TLIST:
1341 564ca709 2004-04-19 devnull blprint(l->store.u.l);
1342 564ca709 2004-04-19 devnull break;
1343 564ca709 2004-04-19 devnull case TCODE:
1344 564ca709 2004-04-19 devnull pcode(l->store.u.cc, 0);
1345 564ca709 2004-04-19 devnull break;
1346 564ca709 2004-04-19 devnull }
1347 564ca709 2004-04-19 devnull l = l->next;
1348 564ca709 2004-04-19 devnull if(l)
1349 564ca709 2004-04-19 devnull Bprint(bout, ", ");
1350 564ca709 2004-04-19 devnull }
1351 564ca709 2004-04-19 devnull Bprint(bout, "}");
1352 564ca709 2004-04-19 devnull }
1353 564ca709 2004-04-19 devnull
1354 564ca709 2004-04-19 devnull int
1355 564ca709 2004-04-19 devnull comx(Node res)
1356 564ca709 2004-04-19 devnull {
1357 564ca709 2004-04-19 devnull Lsym *sl;
1358 564ca709 2004-04-19 devnull Node *n, xx;
1359 564ca709 2004-04-19 devnull
1360 564ca709 2004-04-19 devnull if(res.store.fmt != 'a' && res.store.fmt != 'A')
1361 564ca709 2004-04-19 devnull return 0;
1362 564ca709 2004-04-19 devnull
1363 564ca709 2004-04-19 devnull if(res.store.comt == 0 || res.store.comt->base == 0)
1364 564ca709 2004-04-19 devnull return 0;
1365 564ca709 2004-04-19 devnull
1366 564ca709 2004-04-19 devnull sl = res.store.comt->base;
1367 564ca709 2004-04-19 devnull if(sl->proc) {
1368 564ca709 2004-04-19 devnull res.left = ZN;
1369 564ca709 2004-04-19 devnull res.right = ZN;
1370 564ca709 2004-04-19 devnull n = an(ONAME, ZN, ZN);
1371 564ca709 2004-04-19 devnull n->sym = sl;
1372 564ca709 2004-04-19 devnull n = an(OCALL, n, &res);
1373 564ca709 2004-04-19 devnull n->left->sym = sl;
1374 564ca709 2004-04-19 devnull expr(n, &xx);
1375 564ca709 2004-04-19 devnull return 1;
1376 564ca709 2004-04-19 devnull }
1377 564ca709 2004-04-19 devnull print("(%s)", sl->name);
1378 564ca709 2004-04-19 devnull return 0;
1379 564ca709 2004-04-19 devnull }
1380 564ca709 2004-04-19 devnull
1381 564ca709 2004-04-19 devnull void
1382 564ca709 2004-04-19 devnull bprint(Node *r, Node *args)
1383 564ca709 2004-04-19 devnull {
1384 564ca709 2004-04-19 devnull int i, nas;
1385 564ca709 2004-04-19 devnull Node res, *av[Maxarg];
1386 564ca709 2004-04-19 devnull
1387 564ca709 2004-04-19 devnull USED(r);
1388 564ca709 2004-04-19 devnull na = 0;
1389 564ca709 2004-04-19 devnull flatten(av, args);
1390 564ca709 2004-04-19 devnull nas = na;
1391 564ca709 2004-04-19 devnull for(i = 0; i < nas; i++) {
1392 564ca709 2004-04-19 devnull expr(av[i], &res);
1393 564ca709 2004-04-19 devnull switch(res.type) {
1394 564ca709 2004-04-19 devnull default:
1395 564ca709 2004-04-19 devnull if(comx(res))
1396 564ca709 2004-04-19 devnull break;
1397 564ca709 2004-04-19 devnull patom(res.type, &res.store);
1398 564ca709 2004-04-19 devnull break;
1399 564ca709 2004-04-19 devnull case TCODE:
1400 564ca709 2004-04-19 devnull pcode(res.store.u.cc, 0);
1401 564ca709 2004-04-19 devnull break;
1402 564ca709 2004-04-19 devnull case TLIST:
1403 564ca709 2004-04-19 devnull blprint(res.store.u.l);
1404 564ca709 2004-04-19 devnull break;
1405 564ca709 2004-04-19 devnull }
1406 564ca709 2004-04-19 devnull }
1407 564ca709 2004-04-19 devnull if(ret == 0)
1408 564ca709 2004-04-19 devnull Bputc(bout, '\n');
1409 564ca709 2004-04-19 devnull }
1410 564ca709 2004-04-19 devnull
1411 564ca709 2004-04-19 devnull void
1412 564ca709 2004-04-19 devnull printto(Node *r, Node *args)
1413 564ca709 2004-04-19 devnull {
1414 564ca709 2004-04-19 devnull int fd;
1415 564ca709 2004-04-19 devnull Biobuf *b;
1416 564ca709 2004-04-19 devnull int i, nas;
1417 564ca709 2004-04-19 devnull Node res, *av[Maxarg];
1418 564ca709 2004-04-19 devnull
1419 564ca709 2004-04-19 devnull USED(r);
1420 564ca709 2004-04-19 devnull na = 0;
1421 564ca709 2004-04-19 devnull flatten(av, args);
1422 564ca709 2004-04-19 devnull nas = na;
1423 564ca709 2004-04-19 devnull
1424 564ca709 2004-04-19 devnull expr(av[0], &res);
1425 564ca709 2004-04-19 devnull if(res.type != TSTRING)
1426 564ca709 2004-04-19 devnull error("printto(string, ...): need string");
1427 564ca709 2004-04-19 devnull
1428 564ca709 2004-04-19 devnull fd = create(res.store.u.string->string, OWRITE, 0666);
1429 564ca709 2004-04-19 devnull if(fd < 0)
1430 564ca709 2004-04-19 devnull fd = open(res.store.u.string->string, OWRITE);
1431 564ca709 2004-04-19 devnull if(fd < 0)
1432 564ca709 2004-04-19 devnull error("printto: open %s: %r", res.store.u.string->string);
1433 564ca709 2004-04-19 devnull
1434 564ca709 2004-04-19 devnull b = gmalloc(sizeof(Biobuf));
1435 564ca709 2004-04-19 devnull Binit(b, fd, OWRITE);
1436 564ca709 2004-04-19 devnull
1437 564ca709 2004-04-19 devnull Bflush(bout);
1438 564ca709 2004-04-19 devnull io[iop++] = bout;
1439 564ca709 2004-04-19 devnull bout = b;
1440 564ca709 2004-04-19 devnull
1441 564ca709 2004-04-19 devnull for(i = 1; i < nas; i++) {
1442 564ca709 2004-04-19 devnull expr(av[i], &res);
1443 564ca709 2004-04-19 devnull switch(res.type) {
1444 564ca709 2004-04-19 devnull default:
1445 564ca709 2004-04-19 devnull if(comx(res))
1446 564ca709 2004-04-19 devnull break;
1447 564ca709 2004-04-19 devnull patom(res.type, &res.store);
1448 564ca709 2004-04-19 devnull break;
1449 564ca709 2004-04-19 devnull case TLIST:
1450 564ca709 2004-04-19 devnull blprint(res.store.u.l);
1451 564ca709 2004-04-19 devnull break;
1452 564ca709 2004-04-19 devnull }
1453 564ca709 2004-04-19 devnull }
1454 564ca709 2004-04-19 devnull if(ret == 0)
1455 564ca709 2004-04-19 devnull Bputc(bout, '\n');
1456 564ca709 2004-04-19 devnull
1457 564ca709 2004-04-19 devnull Bterm(b);
1458 564ca709 2004-04-19 devnull close(fd);
1459 564ca709 2004-04-19 devnull free(b);
1460 564ca709 2004-04-19 devnull bout = io[--iop];
1461 564ca709 2004-04-19 devnull }
1462 564ca709 2004-04-19 devnull
1463 564ca709 2004-04-19 devnull void
1464 564ca709 2004-04-19 devnull pcfile(Node *r, Node *args)
1465 564ca709 2004-04-19 devnull {
1466 564ca709 2004-04-19 devnull Node res;
1467 564ca709 2004-04-19 devnull char *p, buf[128];
1468 564ca709 2004-04-19 devnull
1469 564ca709 2004-04-19 devnull if(args == 0)
1470 564ca709 2004-04-19 devnull error("pcfile(addr): arg count");
1471 564ca709 2004-04-19 devnull expr(args, &res);
1472 564ca709 2004-04-19 devnull if(res.type != TINT)
1473 564ca709 2004-04-19 devnull error("pcfile(addr): arg type");
1474 564ca709 2004-04-19 devnull
1475 564ca709 2004-04-19 devnull r->type = TSTRING;
1476 564ca709 2004-04-19 devnull r->store.fmt = 's';
1477 564ca709 2004-04-19 devnull if(fileline(res.store.u.ival, buf, sizeof(buf)) < 0) {
1478 564ca709 2004-04-19 devnull r->store.u.string = strnode("?file?");
1479 564ca709 2004-04-19 devnull return;
1480 564ca709 2004-04-19 devnull }
1481 564ca709 2004-04-19 devnull p = strrchr(buf, ':');
1482 564ca709 2004-04-19 devnull if(p == 0)
1483 564ca709 2004-04-19 devnull error("pcfile(addr): funny file %s", buf);
1484 564ca709 2004-04-19 devnull *p = '\0';
1485 fa325e9b 2020-01-10 cross r->store.u.string = strnode(buf);
1486 564ca709 2004-04-19 devnull }
1487 564ca709 2004-04-19 devnull
1488 564ca709 2004-04-19 devnull void
1489 564ca709 2004-04-19 devnull pcline(Node *r, Node *args)
1490 564ca709 2004-04-19 devnull {
1491 564ca709 2004-04-19 devnull Node res;
1492 564ca709 2004-04-19 devnull char *p, buf[128];
1493 564ca709 2004-04-19 devnull
1494 564ca709 2004-04-19 devnull if(args == 0)
1495 564ca709 2004-04-19 devnull error("pcline(addr): arg count");
1496 564ca709 2004-04-19 devnull expr(args, &res);
1497 564ca709 2004-04-19 devnull if(res.type != TINT)
1498 564ca709 2004-04-19 devnull error("pcline(addr): arg type");
1499 564ca709 2004-04-19 devnull
1500 564ca709 2004-04-19 devnull r->type = TINT;
1501 564ca709 2004-04-19 devnull r->store.fmt = 'D';
1502 564ca709 2004-04-19 devnull if(fileline(res.store.u.ival, buf, sizeof(buf)) < 0) {
1503 564ca709 2004-04-19 devnull r->store.u.ival = 0;
1504 564ca709 2004-04-19 devnull return;
1505 564ca709 2004-04-19 devnull }
1506 564ca709 2004-04-19 devnull
1507 564ca709 2004-04-19 devnull p = strrchr(buf, ':');
1508 564ca709 2004-04-19 devnull if(p == 0)
1509 564ca709 2004-04-19 devnull error("pcline(addr): funny file %s", buf);
1510 fa325e9b 2020-01-10 cross r->store.u.ival = atoi(p+1);
1511 564ca709 2004-04-19 devnull }
1512 564ca709 2004-04-19 devnull
1513 564ca709 2004-04-19 devnull void
1514 564ca709 2004-04-19 devnull textfile(Node *r, Node *args)
1515 564ca709 2004-04-19 devnull {
1516 564ca709 2004-04-19 devnull char *file;
1517 564ca709 2004-04-19 devnull long base;
1518 564ca709 2004-04-19 devnull Fhdr *fp;
1519 564ca709 2004-04-19 devnull Node res, *av[Maxarg];
1520 564ca709 2004-04-19 devnull List *l, *l2, **tail, *list, *tl;
1521 564ca709 2004-04-19 devnull
1522 564ca709 2004-04-19 devnull na = 0;
1523 564ca709 2004-04-19 devnull flatten(av, args);
1524 564ca709 2004-04-19 devnull
1525 564ca709 2004-04-19 devnull if(na != 0) {
1526 564ca709 2004-04-19 devnull expr(av[0], &res);
1527 564ca709 2004-04-19 devnull if(res.type != TLIST)
1528 564ca709 2004-04-19 devnull error("textfile(list): textfile needs a list");
1529 564ca709 2004-04-19 devnull if(listlen(res.store.u.l) != 2)
1530 564ca709 2004-04-19 devnull error("textfile(list): list must have 2 entries");
1531 564ca709 2004-04-19 devnull
1532 564ca709 2004-04-19 devnull l = res.store.u.l;
1533 564ca709 2004-04-19 devnull if(l->type != TSTRING)
1534 564ca709 2004-04-19 devnull error("textfile name must be a string");
1535 564ca709 2004-04-19 devnull file = l->store.u.string->string;
1536 564ca709 2004-04-19 devnull
1537 564ca709 2004-04-19 devnull l = l->next;
1538 564ca709 2004-04-19 devnull if(l->type != TINT)
1539 564ca709 2004-04-19 devnull error("textfile base must be an int");
1540 564ca709 2004-04-19 devnull base = l->store.u.ival;
1541 564ca709 2004-04-19 devnull
1542 564ca709 2004-04-19 devnull if((fp = crackhdr(file, OREAD)) == nil)
1543 564ca709 2004-04-19 devnull error("crackhdr %s: %r", file);
1544 564ca709 2004-04-19 devnull Bflush(bout);
1545 564ca709 2004-04-19 devnull fp->base = base;
1546 564ca709 2004-04-19 devnull fprint(2, "%s: %s %s %s\n", file, fp->aname, fp->mname, fp->fname);
1547 564ca709 2004-04-19 devnull if(mapfile(fp, base, symmap, nil) < 0)
1548 564ca709 2004-04-19 devnull fprint(2, "mapping %s: %r\n", file);
1549 564ca709 2004-04-19 devnull if(corhdr){
1550 564ca709 2004-04-19 devnull unmapfile(corhdr, cormap);
1551 564ca709 2004-04-19 devnull mapfile(fp, base, cormap, nil);
1552 564ca709 2004-04-19 devnull free(correg);
1553 4f2ac1b7 2005-01-23 devnull correg = nil;
1554 564ca709 2004-04-19 devnull mapfile(corhdr, 0, cormap, &correg);
1555 564ca709 2004-04-19 devnull }
1556 8b549a62 2005-01-07 devnull if(symopen(fp) < 0)
1557 8b549a62 2005-01-07 devnull fprint(2, "symopen %s: %r\n", file);
1558 564ca709 2004-04-19 devnull else
1559 564ca709 2004-04-19 devnull addvarsym(fp);
1560 564ca709 2004-04-19 devnull return;
1561 564ca709 2004-04-19 devnull }
1562 564ca709 2004-04-19 devnull
1563 564ca709 2004-04-19 devnull l2 = nil;
1564 564ca709 2004-04-19 devnull tail = &l2;
1565 564ca709 2004-04-19 devnull for(fp=fhdrlist; fp; fp=fp->next){
1566 564ca709 2004-04-19 devnull if(fp->ftype == FCORE)
1567 564ca709 2004-04-19 devnull continue;
1568 564ca709 2004-04-19 devnull tl = al(TLIST);
1569 564ca709 2004-04-19 devnull *tail = tl;
1570 564ca709 2004-04-19 devnull tail = &tl->next;
1571 564ca709 2004-04-19 devnull
1572 564ca709 2004-04-19 devnull list = al(TSTRING);
1573 564ca709 2004-04-19 devnull tl->store.u.l = list;
1574 564ca709 2004-04-19 devnull list->store.u.string = strnode(fp->filename);
1575 564ca709 2004-04-19 devnull list->store.fmt = 's';
1576 564ca709 2004-04-19 devnull list->next = al(TINT);
1577 564ca709 2004-04-19 devnull list = list->next;
1578 564ca709 2004-04-19 devnull list->store.fmt = 'X';
1579 564ca709 2004-04-19 devnull list->store.u.ival = fp->base;
1580 564ca709 2004-04-19 devnull }
1581 564ca709 2004-04-19 devnull
1582 564ca709 2004-04-19 devnull r->type = TLIST;
1583 564ca709 2004-04-19 devnull r->store.u.l = l2;
1584 564ca709 2004-04-19 devnull }
1585 564ca709 2004-04-19 devnull
1586 564ca709 2004-04-19 devnull void
1587 564ca709 2004-04-19 devnull deltextfile(Node *r, Node *args)
1588 564ca709 2004-04-19 devnull {
1589 564ca709 2004-04-19 devnull int did;
1590 564ca709 2004-04-19 devnull char *file;
1591 564ca709 2004-04-19 devnull Fhdr *fp, *fpnext;
1592 564ca709 2004-04-19 devnull Node res, *av[Maxarg];
1593 564ca709 2004-04-19 devnull
1594 564ca709 2004-04-19 devnull na = 0;
1595 564ca709 2004-04-19 devnull flatten(av, args);
1596 564ca709 2004-04-19 devnull
1597 564ca709 2004-04-19 devnull if(na != 1)
1598 564ca709 2004-04-19 devnull error("deltextfile(string): arg count");
1599 564ca709 2004-04-19 devnull
1600 564ca709 2004-04-19 devnull expr(av[0], &res);
1601 564ca709 2004-04-19 devnull if(res.type != TSTRING)
1602 564ca709 2004-04-19 devnull error("deltextfile(string): arg type");
1603 564ca709 2004-04-19 devnull file = res.store.u.string->string;
1604 564ca709 2004-04-19 devnull
1605 564ca709 2004-04-19 devnull did = 0;
1606 564ca709 2004-04-19 devnull for(fp=fhdrlist; fp; fp=fpnext){
1607 564ca709 2004-04-19 devnull fpnext = fp->next;
1608 564ca709 2004-04-19 devnull if(fp->ftype == FCORE)
1609 564ca709 2004-04-19 devnull continue;
1610 564ca709 2004-04-19 devnull if(strcmp(file, fp->filename) == 0){
1611 564ca709 2004-04-19 devnull did = 1;
1612 564ca709 2004-04-19 devnull if(fp == symhdr)
1613 564ca709 2004-04-19 devnull error("cannot remove symbols from main text file");
1614 564ca709 2004-04-19 devnull unmapfile(fp, symmap);
1615 564ca709 2004-04-19 devnull uncrackhdr(fp);
1616 564ca709 2004-04-19 devnull }
1617 564ca709 2004-04-19 devnull }
1618 564ca709 2004-04-19 devnull
1619 564ca709 2004-04-19 devnull delvarsym(file);
1620 564ca709 2004-04-19 devnull if(!did)
1621 564ca709 2004-04-19 devnull error("symbol file %s not open", file);
1622 564ca709 2004-04-19 devnull }
1623 709efa01 2004-09-23 devnull
1624 709efa01 2004-09-23 devnull void
1625 709efa01 2004-09-23 devnull stringn(Node *r, Node *args)
1626 709efa01 2004-09-23 devnull {
1627 709efa01 2004-09-23 devnull uint addr;
1628 709efa01 2004-09-23 devnull int i, n, ret;
1629 709efa01 2004-09-23 devnull Node res, *av[Maxarg];
1630 709efa01 2004-09-23 devnull char *buf;
1631 709efa01 2004-09-23 devnull
1632 709efa01 2004-09-23 devnull na = 0;
1633 709efa01 2004-09-23 devnull flatten(av, args);
1634 709efa01 2004-09-23 devnull if(na != 2)
1635 709efa01 2004-09-23 devnull error("stringn(addr, n): arg count");
1636 709efa01 2004-09-23 devnull
1637 709efa01 2004-09-23 devnull expr(av[0], &res);
1638 709efa01 2004-09-23 devnull if(res.type != TINT)
1639 709efa01 2004-09-23 devnull error("stringn(addr, n): arg type");
1640 709efa01 2004-09-23 devnull addr = res.store.u.ival;
1641 709efa01 2004-09-23 devnull
1642 709efa01 2004-09-23 devnull expr(av[1], &res);
1643 709efa01 2004-09-23 devnull if(res.type != TINT)
1644 709efa01 2004-09-23 devnull error("stringn(addr,n): arg type");
1645 709efa01 2004-09-23 devnull n = res.store.u.ival;
1646 564ca709 2004-04-19 devnull
1647 709efa01 2004-09-23 devnull buf = malloc(n+1);
1648 709efa01 2004-09-23 devnull if(buf == nil)
1649 709efa01 2004-09-23 devnull error("out of memory");
1650 709efa01 2004-09-23 devnull
1651 709efa01 2004-09-23 devnull r->type = TSTRING;
1652 709efa01 2004-09-23 devnull for(i=0; i<n; i++){
1653 4f2ac1b7 2005-01-23 devnull ret = get1(cormap, addr, (uchar*)&buf[i], 1);
1654 709efa01 2004-09-23 devnull if(ret < 0){
1655 709efa01 2004-09-23 devnull free(buf);
1656 709efa01 2004-09-23 devnull error("indir: %r");
1657 709efa01 2004-09-23 devnull }
1658 709efa01 2004-09-23 devnull addr++;
1659 709efa01 2004-09-23 devnull }
1660 709efa01 2004-09-23 devnull buf[n] = 0;
1661 709efa01 2004-09-23 devnull r->store.u.string = strnode(buf);
1662 709efa01 2004-09-23 devnull free(buf);
1663 709efa01 2004-09-23 devnull }