#include cc.def/1 extern char line[]; extern int lptr; extern char *cptr; heir7(lval) int lval[]; { int k,lval2[2]; k=heir8(lval); blanks(); if((streq(line+lptr,">>")==0)& (streq(line+lptr,"<<")==0))return k; if(k)rvalue(lval); forever {if (match(">>")) {push(); if(heir8(lval2))rvalue(lval2); pop(); asr(); } else if (match("<<")) {push(); if(heir8(lval2))rvalue(lval2); pop(); asl(); } else return 0; } } heir8(lval) int lval[]; { int k,lval2[2]; k=heir9(lval); blanks(); if((ch()!='+')&(ch()!='-'))return k; if(k)rvalue(lval); forever {if (match("+")) {push(); if(heir9(lval2))rvalue(lval2); if(cptr=lval[0]) if((cptr[ident]==pointer)& (cptr[type]==cint)) doublereg(); pop(); add(); } else if (match("-")) {push(); if(heir9(lval2))rvalue(lval2); if(cptr=lval[0]) if((cptr[ident]==pointer)& (cptr[type]==cint)) doublereg(); pop(); sub(); } else return 0; } } heir9(lval) int lval[]; { int k,lval2[2]; k=heir10(lval); blanks(); if((ch()!='*')&(ch()!='/')& (ch()!='%'))return k; if(k)rvalue(lval); forever {if (match("*")) {push(); if(heir9(lval2))rvalue(lval2); pop(); mult(); } else if (match("/")) {push(); if(heir10(lval2))rvalue(lval2); pop(); div(); } else if (match("%")) {push(); if(heir10(lval2))rvalue(lval2); pop(); mod(); } else return 0; } } heir10(lval) int lval[]; { int k; char *ptr; if(match("++")) {if((k=heir10(lval))==0) {needlval(); return 0; } if(lval[1])push(); rvalue(lval); inc(); if(ptr=lval[0]) if((ptr[ident]==pointer)& (ptr[type]==cint)) inc(); store(lval); return 0; } else if(match("--")) {if((k=heir10(lval))==0) {needlval(); return 0; } if(lval[1])push(); rvalue(lval); dec(); if(ptr=lval[0]) if((ptr[ident]==pointer)& (ptr[type]==cint)) dec(); store(lval); return 0; } else if (match("-")) {k=heir10(lval); if (k) rvalue(lval); neg(); return 0; } else if(match("*")) {k=heir10(lval); if(k)rvalue(lval); lval[1]=cint; if(ptr=lval[0])lval[1]=ptr[type]; lval[0] = 0; /* we just dereferenced it */ return 1; } else if(match("&")) {k=heir10(lval); if(k==0) {error("illegal address"); return 0; } else if(lval[1])return 0; else {immed(); outstr(ptr=lval[0]); nl(); lval[1]=ptr[type]; return 0; } } else {k=heir11(lval); if(match("++")) {if(k==0) {needlval(); return 0; } if(lval[1])push(); rvalue(lval); inc(); if(ptr=lval[0]) if((ptr[ident]==pointer)& (ptr[type]==cint)) inc(); store(lval); dec(); if(ptr) if((ptr[ident]==pointer)& (ptr[type]==cint)) dec(); return 0; } else if(match("--")) {if(k==0) {needlval(); return 0; } if(lval[1])push(); rvalue(lval); dec(); if(ptr=lval[0]) if((ptr[ident]==pointer)& (ptr[type]==cint)) dec(); store(lval); inc(); if(ptr) if((ptr[ident]==pointer)& (ptr[type]==cint)) inc(); return 0; } else return k; } }