📄 sub.c
字号:
TIND, 0, "IND", TFUNC, 0, "FUNC", TARRAY, 0, "ARRAY", TVOID, 0, "VOID", TSTRUCT, 0, "STRUCT", TUNION, 0, "UNION", TENUM, 0, "ENUM", TAUTO, 0, "AUTO", TEXTERN, 0, "EXTERN", TSTATIC, 0, "STATIC", TTYPEDEF, 0, "TYPEDEF", TTYPESTR, 0, "TYPESTR", TREGISTER, 0, "REGISTER", TCONSTNT, 0, "CONSTNT", TVOLATILE, 0, "VOLATILE", TUNSIGNED, 0, "UNSIGNED", TSIGNED, 0, "SIGNED", TDOT, 0, "DOT", TFILE, 0, "FILE", TOLD, 0, "OLD", -1, 0, 0,};char* cnames[NCTYPES];Init cnamesinit[] ={ CXXX, 0, "CXXX", CAUTO, 0, "AUTO", CEXTERN, 0, "EXTERN", CGLOBL, 0, "GLOBL", CSTATIC, 0, "STATIC", CLOCAL, 0, "LOCAL", CTYPEDEF, 0, "TYPEDEF", CTYPESTR, 0, "TYPESTR", CPARAM, 0, "PARAM", CSELEM, 0, "SELEM", CLABEL, 0, "LABEL", CEXREG, 0, "EXREG", -1, 0, 0,};char* onames[OEND+1];Init onamesinit[] ={ OXXX, 0, "OXXX", OADD, 0, "ADD", OADDR, 0, "ADDR", OAND, 0, "AND", OANDAND, 0, "ANDAND", OARRAY, 0, "ARRAY", OAS, 0, "AS", OASI, 0, "ASI", OASADD, 0, "ASADD", OASAND, 0, "ASAND", OASASHL, 0, "ASASHL", OASASHR, 0, "ASASHR", OASDIV, 0, "ASDIV", OASHL, 0, "ASHL", OASHR, 0, "ASHR", OASLDIV, 0, "ASLDIV", OASLMOD, 0, "ASLMOD", OASLMUL, 0, "ASLMUL", OASLSHR, 0, "ASLSHR", OASMOD, 0, "ASMOD", OASMUL, 0, "ASMUL", OASOR, 0, "ASOR", OASSUB, 0, "ASSUB", OASXOR, 0, "ASXOR", OBIT, 0, "BIT", OBREAK, 0, "BREAK", OCASE, 0, "CASE", OCAST, 0, "CAST", OCOMMA, 0, "COMMA", OCOND, 0, "COND", OCONST, 0, "CONST", OCONTINUE, 0, "CONTINUE", ODIV, 0, "DIV", ODOT, 0, "DOT", ODOTDOT, 0, "DOTDOT", ODWHILE, 0, "DWHILE", OENUM, 0, "ENUM", OEQ, 0, "EQ", OFOR, 0, "FOR", OFUNC, 0, "FUNC", OGE, 0, "GE", OGOTO, 0, "GOTO", OGT, 0, "GT", OHI, 0, "HI", OHS, 0, "HS", OIF, 0, "IF", OIND, 0, "IND", OINDREG, 0, "INDREG", OINIT, 0, "INIT", OLABEL, 0, "LABEL", OLDIV, 0, "LDIV", OLE, 0, "LE", OLIST, 0, "LIST", OLMOD, 0, "LMOD", OLMUL, 0, "LMUL", OLO, 0, "LO", OLS, 0, "LS", OLSHR, 0, "LSHR", OLT, 0, "LT", OMOD, 0, "MOD", OMUL, 0, "MUL", ONAME, 0, "NAME", ONE, 0, "NE", ONOT, 0, "NOT", OOR, 0, "OR", OOROR, 0, "OROR", OPOSTDEC, 0, "POSTDEC", OPOSTINC, 0, "POSTINC", OPREDEC, 0, "PREDEC", OPREINC, 0, "PREINC", OPROTO, 0, "PROTO", OREGISTER, 0, "REGISTER", ORETURN, 0, "RETURN", OSET, 0, "SET", OSIGN, 0, "SIGN", OSIZE, 0, "SIZE", OSTRING, 0, "STRING", OLSTRING, 0, "LSTRING", OSTRUCT, 0, "STRUCT", OSUB, 0, "SUB", OSWITCH, 0, "SWITCH", OUNION, 0, "UNION", OUSED, 0, "USED", OWHILE, 0, "WHILE", OXOR, 0, "XOR", OPOS, 0, "POS", ONEG, 0, "NEG", OCOM, 0, "COM", OELEM, 0, "ELEM", OTST, 0, "TST", OINDEX, 0, "INDEX", OFAS, 0, "FAS", OREGPAIR, 0, "REGPAIR", OEND, 0, "END", -1, 0, 0,};/* OEQ, ONE, OLE, OLS, OLT, OLO, OGE, OHS, OGT, OHI */char comrel[12] ={ ONE, OEQ, OGT, OHI, OGE, OHS, OLT, OLO, OLE, OLS,};char invrel[12] ={ OEQ, ONE, OGE, OHS, OGT, OHI, OLE, OLS, OLT, OLO,};char logrel[12] ={ OEQ, ONE, OLS, OLS, OLO, OLO, OHS, OHS, OHI, OHI,};char typei[NTYPE];int typeiinit[] ={ TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, -1,};char typeu[NTYPE];int typeuinit[] ={ TUCHAR, TUSHORT, TUINT, TULONG, TUVLONG, TIND, -1,};char typesuv[NTYPE];int typesuvinit[] ={ TVLONG, TUVLONG, TSTRUCT, TUNION, -1,};char typeilp[NTYPE];int typeilpinit[] ={ TINT, TUINT, TLONG, TULONG, TIND, -1};char typechl[NTYPE];char typechlv[NTYPE];char typechlvp[NTYPE];int typechlinit[] ={ TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, -1,};char typechlp[NTYPE];int typechlpinit[] ={ TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TIND, -1,};char typechlpfd[NTYPE];int typechlpfdinit[] ={ TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TFLOAT, TDOUBLE, TIND, -1,};char typec[NTYPE];int typecinit[] ={ TCHAR, TUCHAR, -1};char typeh[NTYPE];int typehinit[] ={ TSHORT, TUSHORT, -1,};char typeil[NTYPE];int typeilinit[] ={ TINT, TUINT, TLONG, TULONG, -1,};char typev[NTYPE];int typevinit[] ={ TVLONG, TUVLONG, -1,};char typefd[NTYPE];int typefdinit[] ={ TFLOAT, TDOUBLE, -1,};char typeaf[NTYPE];int typeafinit[] ={ TFUNC, TARRAY, -1,};char typesu[NTYPE];int typesuinit[] ={ TSTRUCT, TUNION, -1,};long tasign[NTYPE];Init tasigninit[] ={ TCHAR, BNUMBER, 0, TUCHAR, BNUMBER, 0, TSHORT, BNUMBER, 0, TUSHORT, BNUMBER, 0, TINT, BNUMBER, 0, TUINT, BNUMBER, 0, TLONG, BNUMBER, 0, TULONG, BNUMBER, 0, TVLONG, BNUMBER, 0, TUVLONG, BNUMBER, 0, TFLOAT, BNUMBER, 0, TDOUBLE, BNUMBER, 0, TIND, BIND, 0, TSTRUCT, BSTRUCT, 0, TUNION, BUNION, 0, -1, 0, 0,};long tasadd[NTYPE];Init tasaddinit[] ={ TCHAR, BNUMBER, 0, TUCHAR, BNUMBER, 0, TSHORT, BNUMBER, 0, TUSHORT, BNUMBER, 0, TINT, BNUMBER, 0, TUINT, BNUMBER, 0, TLONG, BNUMBER, 0, TULONG, BNUMBER, 0, TVLONG, BNUMBER, 0, TUVLONG, BNUMBER, 0, TFLOAT, BNUMBER, 0, TDOUBLE, BNUMBER, 0, TIND, BINTEGER, 0, -1, 0, 0,};long tcast[NTYPE];Init tcastinit[] ={ TCHAR, BNUMBER|BIND|BVOID, 0, TUCHAR, BNUMBER|BIND|BVOID, 0, TSHORT, BNUMBER|BIND|BVOID, 0, TUSHORT, BNUMBER|BIND|BVOID, 0, TINT, BNUMBER|BIND|BVOID, 0, TUINT, BNUMBER|BIND|BVOID, 0, TLONG, BNUMBER|BIND|BVOID, 0, TULONG, BNUMBER|BIND|BVOID, 0, TVLONG, BNUMBER|BIND|BVOID, 0, TUVLONG, BNUMBER|BIND|BVOID, 0, TFLOAT, BNUMBER|BVOID, 0, TDOUBLE, BNUMBER|BVOID, 0, TIND, BINTEGER|BIND|BVOID, 0, TVOID, BVOID, 0, TSTRUCT, BSTRUCT|BVOID, 0, TUNION, BUNION|BVOID, 0, -1, 0, 0,};long tadd[NTYPE];Init taddinit[] ={ TCHAR, BNUMBER|BIND, 0, TUCHAR, BNUMBER|BIND, 0, TSHORT, BNUMBER|BIND, 0, TUSHORT, BNUMBER|BIND, 0, TINT, BNUMBER|BIND, 0, TUINT, BNUMBER|BIND, 0, TLONG, BNUMBER|BIND, 0, TULONG, BNUMBER|BIND, 0, TVLONG, BNUMBER|BIND, 0, TUVLONG, BNUMBER|BIND, 0, TFLOAT, BNUMBER, 0, TDOUBLE, BNUMBER, 0, TIND, BINTEGER, 0, -1, 0, 0,};long tsub[NTYPE];Init tsubinit[] ={ TCHAR, BNUMBER, 0, TUCHAR, BNUMBER, 0, TSHORT, BNUMBER, 0, TUSHORT, BNUMBER, 0, TINT, BNUMBER, 0, TUINT, BNUMBER, 0, TLONG, BNUMBER, 0, TULONG, BNUMBER, 0, TVLONG, BNUMBER, 0, TUVLONG, BNUMBER, 0, TFLOAT, BNUMBER, 0, TDOUBLE, BNUMBER, 0, TIND, BINTEGER|BIND, 0, -1, 0, 0,};long tmul[NTYPE];Init tmulinit[] ={ TCHAR, BNUMBER, 0, TUCHAR, BNUMBER, 0, TSHORT, BNUMBER, 0, TUSHORT, BNUMBER, 0, TINT, BNUMBER, 0, TUINT, BNUMBER, 0, TLONG, BNUMBER, 0, TULONG, BNUMBER, 0, TVLONG, BNUMBER, 0, TUVLONG, BNUMBER, 0, TFLOAT, BNUMBER, 0, TDOUBLE, BNUMBER, 0, -1, 0, 0,};long tand[NTYPE];Init tandinit[] ={ TCHAR, BINTEGER, 0, TUCHAR, BINTEGER, 0, TSHORT, BINTEGER, 0, TUSHORT, BINTEGER, 0, TINT, BNUMBER, 0, TUINT, BNUMBER, 0, TLONG, BINTEGER, 0, TULONG, BINTEGER, 0, TVLONG, BINTEGER, 0, TUVLONG, BINTEGER, 0, -1, 0, 0,};long trel[NTYPE];Init trelinit[] ={ TCHAR, BNUMBER, 0, TUCHAR, BNUMBER, 0, TSHORT, BNUMBER, 0, TUSHORT, BNUMBER, 0, TINT, BNUMBER, 0, TUINT, BNUMBER, 0, TLONG, BNUMBER, 0, TULONG, BNUMBER, 0, TVLONG, BNUMBER, 0, TUVLONG, BNUMBER, 0, TFLOAT, BNUMBER, 0, TDOUBLE, BNUMBER, 0, TIND, BIND, 0, -1, 0, 0,};long tfunct[1] ={ BFUNC,};long tindir[1] ={ BIND,};long tdot[1] ={ BSTRUCT|BUNION,};long tnot[1] ={ BNUMBER|BIND,};long targ[1] ={ BNUMBER|BIND|BSTRUCT|BUNION,};char tab[NTYPE][NTYPE] ={/*TXXX*/ { 0, },/*TCHAR*/ { 0, TCHAR, TUCHAR, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TUCHAR*/ { 0, TUCHAR, TUCHAR, TUSHORT, TUSHORT, TUINT, TUINT, TULONG, TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TSHORT*/ { 0, TSHORT, TUSHORT, TSHORT, TUSHORT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TUSHORT*/ { 0, TUSHORT, TUSHORT, TUSHORT, TUSHORT, TUINT, TUINT, TULONG, TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TINT*/ { 0, TINT, TUINT, TINT, TUINT, TINT, TUINT, TLONG, TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TUINT*/ { 0, TUINT, TUINT, TUINT, TUINT, TUINT, TUINT, TULONG, TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TLONG*/ { 0, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TLONG, TULONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TULONG*/ { 0, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TULONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TVLONG*/ { 0, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TUVLONG*/ { 0, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TUVLONG, TFLOAT, TDOUBLE, TIND, },/*TFLOAT*/ { 0, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TFLOAT, TDOUBLE, TIND, },/*TDOUBLE*/ { 0, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TDOUBLE, TFLOAT, TDOUBLE, TIND, },/*TIND*/ { 0, TIND, TIND, TIND, TIND, TIND, TIND, TIND, TIND, TIND, TIND, TIND, TIND, TIND, },};voidurk(char *name, int max, int i){ if(i >= max) { fprint(2, "bad tinit: %s %d>=%d\n", name, i, max); exits("init"); }}voidtinit(void){ int *ip; Init *p; for(p=thashinit; p->code >= 0; p++) { urk("thash", nelem(thash), p->code); thash[p->code] = p->value; } for(p=bnamesinit; p->code >= 0; p++) { urk("bnames", nelem(bnames), p->code); bnames[p->code] = p->s; } for(p=tnamesinit; p->code >= 0; p++) { urk("tnames", nelem(tnames), p->code); tnames[p->code] = p->s; } for(p=gnamesinit; p->code >= 0; p++) { urk("gnames", nelem(gnames), p->code); gnames[p->code] = p->s; } for(p=qnamesinit; p->code >= 0; p++) { urk("qnames", nelem(qnames), p->code); qnames[p->code] = p->s; } for(p=cnamesinit; p->code >= 0; p++) { urk("cnames", nelem(cnames), p->code); cnames[p->code] = p->s; } for(p=onamesinit; p->code >= 0; p++) { urk("onames", nelem(onames), p->code); onames[p->code] = p->s; } for(ip=typeiinit; *ip>=0; ip++) { urk("typei", nelem(typei), *ip); typei[*ip] = 1; } for(ip=typeuinit; *ip>=0; ip++) { urk("typeu", nelem(typeu), *ip); typeu[*ip] = 1; } for(ip=typesuvinit; *ip>=0; ip++) { urk("typesuv", nelem(typesuv), *ip); typesuv[*ip] = 1; } for(ip=typeilpinit; *ip>=0; ip++) { urk("typeilp", nelem(typeilp), *ip); typeilp[*ip] = 1; } for(ip=typechlinit; *ip>=0; ip++) { urk("typechl", nelem(typechl), *ip); typechl[*ip] = 1; typechlv[*ip] = 1; typechlvp[*ip] = 1; } for(ip=typechlpinit; *ip>=0; ip++) { urk("typechlp", nelem(typechlp), *ip); typechlp[*ip] = 1; typechlvp[*ip] = 1; } for(ip=typechlpfdinit; *ip>=0; ip++) { urk("typechlpfd", nelem(typechlpfd), *ip); typechlpfd[*ip] = 1; } for(ip=typecinit; *ip>=0; ip++) { urk("typec", nelem(typec), *ip); typec[*ip] = 1; } for(ip=typehinit; *ip>=0; ip++) { urk("typeh", nelem(typeh), *ip); typeh[*ip] = 1; } for(ip=typeilinit; *ip>=0; ip++) { urk("typeil", nelem(typeil), *ip); typeil[*ip] = 1; } for(ip=typevinit; *ip>=0; ip++) { urk("typev", nelem(typev), *ip); typev[*ip] = 1; typechlv[*ip] = 1; typechlvp[*ip] = 1; } for(ip=typefdinit; *ip>=0; ip++) { urk("typefd", nelem(typefd), *ip); typefd[*ip] = 1; } for(ip=typeafinit; *ip>=0; ip++) { urk("typeaf", nelem(typeaf), *ip); typeaf[*ip] = 1; } for(ip=typesuinit; *ip >= 0; ip++) { urk("typesu", nelem(typesu), *ip); typesu[*ip] = 1; } for(p=tasigninit; p->code >= 0; p++) { urk("tasign", nelem(tasign), p->code); tasign[p->code] = p->value; } for(p=tasaddinit; p->code >= 0; p++) { urk("tasadd", nelem(tasadd), p->code); tasadd[p->code] = p->value; } for(p=tcastinit; p->code >= 0; p++) { urk("tcast", nelem(tcast), p->code); tcast[p->code] = p->value; } for(p=taddinit; p->code >= 0; p++) { urk("tadd", nelem(tadd), p->code); tadd[p->code] = p->value; } for(p=tsubinit; p->code >= 0; p++) { urk("tsub", nelem(tsub), p->code); tsub[p->code] = p->value; } for(p=tmulinit; p->code >= 0; p++) { urk("tmul", nelem(tmul), p->code); tmul[p->code] = p->value; } for(p=tandinit; p->code >= 0; p++) { urk("tand", nelem(tand), p->code); tand[p->code] = p->value; } for(p=trelinit; p->code >= 0; p++) { urk("trel", nelem(trel), p->code); trel[p->code] = p->value; } /* 32-bit defaults */ typeword = typechlp; typecmplx = typesuv;}/* * return 1 if it is impossible to jump into the middle of n. */static intdeadhead(Node *n, int caseok){loop: if(n == Z) return 1; switch(n->op) { case OLIST: if(!deadhead(n->left, caseok)) return 0; rloop: n = n->right; goto loop; case ORETURN: break; case OLABEL: return 0; case OGOTO: break; case OCASE: if(!caseok) return 0; goto rloop; case OSWITCH: return deadhead(n->right, 1); case OWHILE: case ODWHILE: goto rloop; case OFOR: goto rloop; case OCONTINUE: break; case OBREAK: break; case OIF: return deadhead(n->right->left, caseok) && deadhead(n->right->right, caseok); case OSET: case OUSED: break; } return 1;}intdeadheads(Node *c){ return deadhead(c->left, 0) && deadhead(c->right, 0);}intmixedasop(Type *l, Type *r){ return !typefd[l->etype] && typefd[r->etype];}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -