10 #define emitf(x) ((codep!=ncode || morecode()), codebuf[codep].f = (x), codep++)
11 #define emiti(x) ((codep!=ncode || morecode()), codebuf[codep].i = (x), codep++)
12 #define emits(x) ((codep!=ncode || morecode()), codebuf[codep].s = (x), codep++)
15 void outcode(tree*, int);
16 void codeswitch(tree*, int);
18 code *codecopy(code*);
25 codebuf = (code *)erealloc((char *)codebuf, ncode*sizeof codebuf[0]);
33 panic("Bad address %d in stuffdot", a);
41 codebuf = (code *)emalloc(ncode*sizeof codebuf[0]);
43 emiti(0); /* reference count */
44 outcode(t, flag['e']?1:0);
46 efree((char *)codebuf);
80 outcode(tree *t, int eflag)
86 if(t->type!=NOT && t->type!=';')
90 pfmt(err, "bad type %d in outcode\n", t->type);
172 emitf(Xunlocal); /* get rid of $* */
189 yyerror("`if not' does not follow `if(...)'");
225 codeswitch(t, eflag);
240 emitf(Xsettrue); /* empty condition == while(true) */
264 emitf(Xmark); /* dummy value for Xlocal */
278 emits(strdup(t->str));
330 for(;t && t->type=='=';t = c2);
331 if(t){ /* var=value cmd */
332 for(t = tt;t->type=='=';t = c2){
337 emitf(Xlocal); /* push var for cmd */
339 outcode(t, eflag); /* gen. code for cmd */
340 for(t = tt; t->type == '='; t = c2)
341 emitf(Xunlocal); /* pop var */
343 else{ /* var=value */
344 for(t = tt;t;t = c2){
349 emitf(Xassign); /* set var permanently */
352 t = tt; /* so tests below will work */
374 if(t->type!=NOT && t->type!=';')
375 runq->iflast = t->type==IF;
376 else if(c0) runq->iflast = c0->type==IF;
379 * switch code looks like this:
400 codeswitch(tree *t, int eflag)
402 int leave; /* patch jump address to leave switch */
403 int out; /* jump here to leave switch */
404 int nextcase; /* patch jump address to next case */
407 || c1->child[0]->type!=';'
408 || !iscase(c1->child[0]->child[0])){
409 yyerror("case missing in switch");
423 for(t = c0->child[0];t->type==ARGLIST;t = c0) outcode(c1, eflag);
429 if(iscase(c0)) break;
434 if(!iscase(t)) outcode(t, eflag);
451 do t = c0; while(t->type==ARGLIST);
452 return t->type==WORD && !t->quoted && strcmp(t->str, "case")==0;
468 for(p = cp+1;p->f;p++){
469 if(p->f==Xappend || p->f==Xclose || p->f==Xread || p->f==Xwrite
471 || p->f==Xasync || p->f==Xbackq || p->f==Xcase || p->f==Xfalse
472 || p->f==Xfor || p->f==Xjump
473 || p->f==Xsubshell || p->f==Xtrue) p++;
474 else if(p->f==Xdup || p->f==Xpipefd) p+=2;
475 else if(p->f==Xpipe) p+=4;
476 else if(p->f==Xword || p->f==Xdelhere) efree((++p)->s);