#include "ccg"/* deep blue c compiler * switch and for processors */doswitch()$(int sq[wqsiz]; /* like while */int label;/* lable for case */int dlabel;/* for default */int nlabel; /* for next case */int val;/* case value */char xflag; /* another case seen */char defflag; /* 'default' seen */dlabel=defflag=xflag=0; /* init */sq[wqsym]=locptr;sq[wqsp]=oursp;sq[wqlab]=getlabel(); /* get exit *//* tell docont() we're a switch */sq[wqloop]=0;addwhile(sq);needbrack("(");expression();needbrack(")");/* result of expr is in P */needbrack("$(");if(!(defflag=amatch("default",7))&& !amatch("case",4))error("'case' or 'default' expected");do$(label=getlabel();do$(if(defflag)dlabel=label;else$(if(number(&val)==0 &&pstr(&val)==0)error("constant needed");cmpjump(val,label);$)needcol();$) while((defflag=amatch("default",7))|| amatch("case",4));nlabel=getlabel();jump(nlabel);outcdf(label);do statement();while(!(defflag=amatch("default",7))&& !(xflag=amatch("case",4))&& !(match("$)")));jump(nlabel+1); /* fall thru */outcdf(nlabel);$) while (xflag || defflag);/* end of case */if(dlabel)jump(dlabel);outcdf(nlabel+1);outcdf(sq[wqlab]);locptr=sq[wqsym];oursp=modstk(sq[wqsp]);delwhile();$)/* "for" statement */dofor()$(int fq[wqsiz];fq[wqsym]=locptr;fq[wqsp]=oursp;fq[wqloop]=getlabel();fq[wqlab]=getlabel();fq[wqinc]=getlabel();fq[wqstat]=getlabel();addwhile(fq);needbrack("(");if(match(";")==0)$( /* exp1 */expression();ns();$)outcdf(fq[wqloop]);if(match(";")==0)$( /* exp2 */expression();ns();falsejump(fq[wqlab]);$)jump(fq[wqstat]);outcdf(fq[wqinc]);if(match(")")==0)$( /* exp3 */expression();needbrack(")");$)jump(fq[wqloop]);outcdf(fq[wqstat]);statement();jump(fq[wqinc]);outcdf(fq[wqlab]);locptr=fq[wqsym];oursp=modstk(fq[wqsp]);delwhile();$)needcol()$(if(match(":")==0)error("Missing colon");$)/* end of cc21 */