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);
80 outcode(tree *t, int eflag)
86 if(t->type!=NOT && t->type!=';')
90 pfmt(err, "bad type %d in outcode\n", t->type);
137 emits(estrdup("ifs"));
178 emitf(Xunlocal); /* get rid of $* */
195 yyerror("`if not' does not follow `if(...)'");
228 codeswitch(t, eflag);
243 emitf(Xsettrue); /* empty condition == while(true) */
267 emitf(Xmark); /* dummy value for Xlocal */
282 emits(estrdup(t->str));
284 if((q = Globsize(t->str)) > 0){
286 emits(estrdup(t->str));
290 emits(deglob(estrdup(t->str)));
340 for(;t && t->type=='=';t = c2);
341 if(t){ /* var=value cmd */
342 for(t = tt;t->type=='=';t = c2){
347 emitf(Xlocal); /* push var for cmd */
349 outcode(t, eflag); /* gen. code for cmd */
350 for(t = tt; t->type == '='; t = c2)
351 emitf(Xunlocal); /* pop var */
353 else{ /* var=value */
354 for(t = tt;t;t = c2){
359 emitf(Xassign); /* set var permanently */
362 t = tt; /* so tests below will work */
379 if(t->type!=NOT && t->type!=';')
380 runq->iflast = t->type==IF;
381 else if(c0) runq->iflast = c0->type==IF;
384 * switch code looks like this:
405 codeswitch(tree *t, int eflag)
407 int leave; /* patch jump address to leave switch */
408 int out; /* jump here to leave switch */
409 int nextcase; /* patch jump address to next case */
412 || c1->child[0]->type!=';'
413 || !iscase(c1->child[0]->child[0])){
414 yyerror("case missing in switch");
428 for(t = c0->child[0];t->type==ARGLIST;t = c0) outcode(c1, eflag);
434 if(iscase(c0)) break;
439 if(!iscase(t)) outcode(t, eflag);
456 do t = c0; while(t->type==ARGLIST);
457 return t->type==WORD && !t->quoted && strcmp(t->str, "case")==0;
473 for(p = cp+1;p->f;p++){
474 if(p->f==Xappend || p->f==Xclose || p->f==Xread || p->f==Xwrite
476 || p->f==Xasync || p->f==Xbackq || p->f==Xcase || p->f==Xfalse
477 || p->f==Xfor || p->f==Xjump
478 || p->f==Xsubshell || p->f==Xtrue) p++;
479 else if(p->f==Xdup || p->f==Xpipefd) p+=2;
480 else if(p->f==Xpipe) p+=4;
481 else if(p->f==Xglobs) free(p[1].s), p+=2;
482 else if(p->f==Xword || p->f==Xdelhere) free((++p)->s);