16 /* Unstack io channels */
18 for(i = 1; i < iop; i++)
31 vseprint(buf, buf+sizeof(buf), fmt, arg);
33 fprint(2, "%L: (error) %s\n", buf);
48 for(i = 0; i < Hashsize; i++) {
49 for(s = hash[i]; s; s = s->hash) {
65 /* make node a root so it isn't collected! */
66 s = mkvar("_thiscmd");
68 v = gmalloc(sizeof(Value));
69 memset(v, 0, sizeof(Value));
112 if(ret || (res.type == TLIST && res.l == 0 && n->op != OADD))
125 for(n = n->left; n; n = n->left) {
127 error("local not in function");
129 if(sl->v->ret == ret)
130 error("%s declared twice", sl->name);
131 v = gmalloc(sizeof(Value));
137 ret->tail = &v->scope;
143 error("return not in function");
144 expr(n->left, ret->val);
145 longjmp(ret->rlab, 1);
152 if(r && r->op == OELSE) {
172 error("loop must have integer start");
174 expr(l->right, &res);
176 error("loop must have integer end");
178 for(i = s; i <= e; i++)
190 fatal("bool: not const");
214 convflt(Node *r, char *flt)
222 if(*s == '-' || *s == '+')
227 if(*s >= '0' && *s <= '9'){
233 r->string = strnode(flt);
238 indir(Map *m, uvlong addr, char fmt, Node *r)
246 char buf[512], reg[12];
252 error("bad pointer format '%c' for *", fmt);
257 ret = get1(m, addr, &cval, 1);
269 ret = get2(m, addr, &sval);
278 ret = geta(m, addr, &uvval);
290 ret = get4(m, addr, &lval);
299 ret = get8(m, addr, &uvval);
306 for(i = 0; i < sizeof(buf)-1; i++) {
307 ret = get1(m, addr, (uchar*)&buf[i], 1);
316 strcpy(buf, "(null)");
317 r->string = strnode(buf);
321 for(i = 0; i < sizeof(buf)-2; i += 2) {
322 ret = get1(m, addr, (uchar*)&buf[i], 2);
326 if(buf[i] == 0 && buf[i+1] == 0)
331 r->string = runenode((Rune*)buf);
335 if ((*machdata->das)(m, addr, fmt, buf, sizeof(buf)) < 0)
339 r->string = strnode(buf);
342 ret = get1(m, addr, (uchar*)buf, mach->szfloat);
345 machdata->sftos(buf, sizeof(buf), (void*) buf);
349 ret = get1(m, addr, (uchar*)buf, mach->szfloat);
352 machdata->sftos(buf, sizeof(buf), (void*) buf);
354 r->string = strnode(buf);
357 ret = get1(m, addr, (uchar*)buf, mach->szdouble);
360 machdata->dftos(buf, sizeof(buf), (void*) buf);
363 case '3': /* little endian ieee 80 with hole in bytes 8&9 */
364 ret = get1(m, addr, (uchar*)reg, 10);
367 memmove(reg+10, reg+8, 2); /* open hole */
368 memset(reg+8, 0, 2); /* fill it */
369 leieee80ftos(buf, sizeof(buf), reg);
372 case '8': /* big-endian ieee 80 */
373 ret = get1(m, addr, (uchar*)reg, 10);
376 beieee80ftos(buf, sizeof(buf), reg);
380 ret = get1(m, addr, (uchar*)buf, mach->szdouble);
383 machdata->dftos(buf, sizeof(buf), (void*) buf);
385 r->string = strnode(buf);
391 windir(Map *m, Node *addr, Node *rval, Node *r)
400 error("no map for */@=");
406 error("bad type lhs of @/*");
408 if(m != cormap && wtflag == 0)
409 error("not in write mode");
413 r->Store = res.Store;
417 error("bad pointer format '%c' for */@=", res.fmt);
422 ret = put1(m, aes.ival, &cval, 1);
430 ret = put2(m, aes.ival, sval);
436 ret = puta(m, aes.ival, res.ival);
444 ret = put4(m, aes.ival, lval);
449 ret = put8(m, aes.ival, res.ival);
453 ret = put1(m, aes.ival, (uchar*)res.string->string, res.string->len);
461 call(char *fn, Node *parameters, Node *local, Node *body, Node *retexp)
468 Node *avp[Maxarg], *ava[Maxarg];
473 flatten(avp, parameters);
479 error("%s: too few arguments", fn);
480 error("%s: too many arguments", fn);
483 rlab.tail = &rlab.local;
486 for(i = 0; i < np; i++) {
490 error("%s: %d formal not a name", fn, i);
499 if(n->left->op != ONAME)
500 error("%s: %d formal not a name", fn, i);
505 error("%s already declared at this scope", s->name);
507 v = gmalloc(sizeof(Value));
513 rlab.tail = &v->scope;
515 v->Store = res.Store;
521 if(setjmp(rlab.rlab) == 0)
524 for(s = rlab.local; s; s = next) {