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)
219 if(('a' <= c && c <= 'z') || ('A' <= c && c <= 'Z')) {
222 r->string = strnode(flt);
231 indir(Map *m, uvlong addr, char fmt, Node *r)
239 char buf[512], reg[12];
245 error("bad pointer format '%c' for *", fmt);
250 ret = get1(m, addr, &cval, 1);
262 ret = get2(m, addr, &sval);
271 ret = geta(m, addr, &uvval);
283 ret = get4(m, addr, &lval);
292 ret = get8(m, addr, &uvval);
299 for(i = 0; i < sizeof(buf)-1; i++) {
300 ret = get1(m, addr, (uchar*)&buf[i], 1);
309 strcpy(buf, "(null)");
310 r->string = strnode(buf);
314 for(i = 0; i < sizeof(buf)-2; i += 2) {
315 ret = get1(m, addr, (uchar*)&buf[i], 2);
319 if(buf[i] == 0 && buf[i+1] == 0)
324 r->string = runenode((Rune*)buf);
328 if ((*machdata->das)(m, addr, fmt, buf, sizeof(buf)) < 0)
332 r->string = strnode(buf);
335 ret = get1(m, addr, (uchar*)buf, mach->szfloat);
338 machdata->sftos(buf, sizeof(buf), (void*) buf);
342 ret = get1(m, addr, (uchar*)buf, mach->szfloat);
345 machdata->sftos(buf, sizeof(buf), (void*) buf);
347 r->string = strnode(buf);
350 ret = get1(m, addr, (uchar*)buf, mach->szdouble);
353 machdata->dftos(buf, sizeof(buf), (void*) buf);
356 case '3': /* little endian ieee 80 with hole in bytes 8&9 */
357 ret = get1(m, addr, (uchar*)reg, 10);
360 memmove(reg+10, reg+8, 2); /* open hole */
361 memset(reg+8, 0, 2); /* fill it */
362 leieee80ftos(buf, sizeof(buf), reg);
365 case '8': /* big-endian ieee 80 */
366 ret = get1(m, addr, (uchar*)reg, 10);
369 beieee80ftos(buf, sizeof(buf), reg);
373 ret = get1(m, addr, (uchar*)buf, mach->szdouble);
376 machdata->dftos(buf, sizeof(buf), (void*) buf);
378 r->string = strnode(buf);
384 windir(Map *m, Node *addr, Node *rval, Node *r)
393 error("no map for */@=");
399 error("bad type lhs of @/*");
401 if(m != cormap && wtflag == 0)
402 error("not in write mode");
406 r->Store = res.Store;
410 error("bad pointer format '%c' for */@=", res.fmt);
415 ret = put1(m, aes.ival, &cval, 1);
423 ret = put2(m, aes.ival, sval);
429 ret = puta(m, aes.ival, res.ival);
437 ret = put4(m, aes.ival, lval);
442 ret = put8(m, aes.ival, res.ival);
446 ret = put1(m, aes.ival, (uchar*)res.string->string, res.string->len);
454 call(char *fn, Node *parameters, Node *local, Node *body, Node *retexp)
461 Node *avp[Maxarg], *ava[Maxarg];
466 flatten(avp, parameters);
472 error("%s: too few arguments", fn);
473 error("%s: too many arguments", fn);
476 rlab.tail = &rlab.local;
479 for(i = 0; i < np; i++) {
483 error("%s: %d formal not a name", fn, i);
492 if(n->left->op != ONAME)
493 error("%s: %d formal not a name", fn, i);
498 error("%s already declared at this scope", s->name);
500 v = gmalloc(sizeof(Value));
506 rlab.tail = &v->scope;
508 v->Store = res.Store;
514 if(setjmp(rlab.rlab) == 0)
517 for(s = rlab.local; s; s = next) {