📄 typesets.c
字号:
return; } EiC_exchtype(t_int,e1->Type); u1.ival = n; EiC_generate(&e1->Code, inst, &u1, 0);}static void checkint(unsigned obj, token_t * e1, token_t * e2){ if (EiC_gettype(e1->Type) != obj) { if(!isconst(e1->Type)) EiC_exchtype(obj, e1->Type); else EiC_castconst(e1,e2,0); } if (EiC_gettype(e2->Type) != obj) { if(!isconst(e1->Type)) EiC_exchtype(obj, e2->Type); else EiC_castconst(e2, e1, 0); } if (!e2->Pflag) EiC_output(e2);}void binhint(unsigned oper, token_t * e1, token_t * e2){ checkint(t_int, e1, e2); switch (oper) { case '+': EiC_generate(&e2->Code, addint, &e2->Val, 0); break; case '-': EiC_generate(&e2->Code, subint, &e2->Val, 0); break; case '*': EiC_generate(&e2->Code, multint, &e2->Val, 0); break; case '/': EiC_generate(&e2->Code, divint, &e2->Val, 0); break; case '%': EiC_generate(&e2->Code, modint, &e2->Val, 0); break; case LSHT: EiC_generate(&e2->Code, lshtint, &e2->Val, 0); break; case RSHT: EiC_generate(&e2->Code, rshtint, &e2->Val, 0); break; case LT: EiC_generate(&e2->Code, ltint, &e2->Val, 0); break; case LE: EiC_generate(&e2->Code, leint, &e2->Val, 0); break; case EQ: EiC_generate(&e2->Code, eqint, &e2->Val, 0); break; case NE: EiC_generate(&e2->Code, neint, &e2->Val, 0); break; case GT: EiC_generate(&e2->Code, gtint, &e2->Val, 0); break; case GE: EiC_generate(&e2->Code, geint, &e2->Val, 0); break; case BOR: EiC_generate(&e2->Code, borint, &e2->Val, 0); break; case XOR: EiC_generate(&e2->Code, xorint, &e2->Val, 0); break; case AND: EiC_generate(&e2->Code, andint, &e2->Val, 0); break; }}void binhuint(unsigned oper, token_t * e1, token_t * e2){ checkint(t_uint, e1, e2); switch (oper) { case '+': EiC_generate(&e2->Code, adduint, &e2->Val, 0); break; case '-': EiC_generate(&e2->Code, subuint, &e2->Val, 0); break; case '*': EiC_generate(&e2->Code, multuint, &e2->Val, 0); break; case '/': EiC_generate(&e2->Code, divuint, &e2->Val, 0); break; case '%': EiC_generate(&e2->Code, moduint, &e2->Val, 0); break; case LSHT: EiC_generate(&e2->Code, lshtuint, &e2->Val, 0); break; case RSHT: EiC_generate(&e2->Code, rshtuint, &e2->Val, 0); break; case BOR: EiC_generate(&e2->Code, boruint, &e2->Val, 0); break; case XOR: EiC_generate(&e2->Code, xoruint, &e2->Val, 0); break; case AND: EiC_generate(&e2->Code, anduint, &e2->Val, 0); break; default: EiC_output(e1); EiC_exchtype(t_int, e1->Type); /* should really be boolean */ switch (oper) { case LT: EiC_generate(&e2->Code, ltuint, &e2->Val, 0); break; case LE: EiC_generate(&e2->Code, leuint, &e2->Val, 0); break; case EQ: EiC_generate(&e2->Code, equint, &e2->Val, 0); break; case NE: EiC_generate(&e2->Code, neuint, &e2->Val, 0); break; case GT: EiC_generate(&e2->Code, gtuint, &e2->Val, 0); break; case GE: EiC_generate(&e2->Code, geuint, &e2->Val, 0); break; } }}static void checklong(unsigned obj, token_t * e1, token_t * e2){ int t; if ((t=EiC_gettype(e1->Type)) != obj) { if (!isconst(e1->Type)) { if (!e1->Pflag) EiC_output(e1); if(sizeof(int) != sizeof(long)) switch (t) { CASE_INT:EiC_generate(&e1->Code, int2long, &e1->Val, 0); break; CASE_UINT:EiC_generate(&e1->Code, uint2long, &e1->Val, 0); break; } EiC_exchtype(obj, e1->Type); } else EiC_castconst(e1, e2, 0); } if ((t=EiC_gettype(e2->Type)) != obj) { if (!isconst(e2->Type)) { if (!e2->Pflag) EiC_output(e2); if(sizeof(int) != sizeof(long)) switch (t) { CASE_INT:EiC_generate(&e2->Code, int2long, &e1->Val, 0); break; CASE_UINT:EiC_generate(&e2->Code, uint2long, &e1->Val, 0); break; } EiC_exchtype(obj, e2->Type); } else EiC_castconst(e2, e1, 0); } if (!e2->Pflag) EiC_output(e2);}void binhlong(unsigned oper, token_t * e1, token_t * e2){ checklong(t_long, e1, e2); switch (oper) { case '+': EiC_generate(&e2->Code, addlong, &e2->Val, 0); break; case '-': EiC_generate(&e2->Code, sublong, &e2->Val, 0); break; case '*': EiC_generate(&e2->Code, multlong, &e2->Val, 0); break; case '/': EiC_generate(&e2->Code, divlong, &e2->Val, 0); break; case '%': EiC_generate(&e2->Code, modlong, &e2->Val, 0); break; case LSHT: EiC_generate(&e2->Code, lshtlong, &e2->Val, 0); break; case RSHT: EiC_generate(&e2->Code, rshtlong, &e2->Val, 0); break; case BOR: EiC_generate(&e2->Code, borlong, &e2->Val, 0); break; case XOR: EiC_generate(&e2->Code, xorlong, &e2->Val, 0); break; case AND: EiC_generate(&e2->Code, andlong, &e2->Val, 0); break; default: EiC_output(e1); EiC_exchtype(t_int, e1->Type); /* should really be boolean */ switch (oper) { case LT: EiC_generate(&e2->Code, ltlong, &e2->Val, 0); break; case LE: EiC_generate(&e2->Code, lelong, &e2->Val, 0); break; case EQ: EiC_generate(&e2->Code, eqlong, &e2->Val, 0); break; case NE: EiC_generate(&e2->Code, nelong, &e2->Val, 0); break; case GT: EiC_generate(&e2->Code, gtlong, &e2->Val, 0); break; case GE: EiC_generate(&e2->Code, gelong, &e2->Val, 0); break; } break; }}void binhulong(unsigned oper, token_t * e1, token_t * e2){ checklong(t_ulong, e1, e2); switch (oper) { case '+': EiC_generate(&e2->Code, addulong, &e2->Val, 0); break; case '-': EiC_generate(&e2->Code, subulong, &e2->Val, 0); break; case '*': EiC_generate(&e2->Code, multulong, &e2->Val, 0); break; case '/': EiC_generate(&e2->Code, divulong, &e2->Val, 0); break; case '%': EiC_generate(&e2->Code, modulong, &e2->Val, 0); break; case LSHT: EiC_generate(&e2->Code, lshtulong, &e2->Val, 0); break; case RSHT: EiC_generate(&e2->Code, rshtulong, &e2->Val, 0); break; case BOR: EiC_generate(&e2->Code, borulong, &e2->Val, 0); break; case XOR: EiC_generate(&e2->Code, xorulong, &e2->Val, 0); break; case AND: EiC_generate(&e2->Code, andulong, &e2->Val, 0); break; default: EiC_output(e1); EiC_exchtype(t_int, e1->Type); /* should really be boolean */ switch (oper) { case LT: EiC_generate(&e2->Code, ltulong, &e2->Val, 0); break; case LE: EiC_generate(&e2->Code, leulong, &e2->Val, 0); break; case EQ: EiC_generate(&e2->Code, equlong, &e2->Val, 0); break; case NE: EiC_generate(&e2->Code, neulong, &e2->Val, 0); break; case GT: EiC_generate(&e2->Code, gtulong, &e2->Val, 0); break; case GE: EiC_generate(&e2->Code, geulong, &e2->Val, 0); break; } break; }}static void checkllong(unsigned obj, token_t * e1, token_t * e2){ int t; if ((t=EiC_gettype(e1->Type)) != obj) { if (!isconst(e1->Type)) { if (!e1->Pflag) EiC_output(e1); if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) { switch (t) { CASE_INT:EiC_generate(&e1->Code, int2llong, &e1->Val, 0); break; CASE_UINT:EiC_generate(&e1->Code, uint2llong, &e1->Val, 0); } } else if(sizeof(long) != sizeof(eic_llong)) { switch (t) { case t_long:EiC_generate(&e1->Code, long2llong, &e1->Val, 0); break; case t_ulong:EiC_generate(&e1->Code, ulong2llong, &e1->Val, 0); } } EiC_exchtype(obj, e1->Type); } else EiC_castconst(e1, e2, 0); } if ((t=EiC_gettype(e2->Type)) != obj) { if (!isconst(e2->Type)) { if (!e2->Pflag) EiC_output(e2); if(t <= t_uint && sizeof(int) != sizeof(eic_llong)) { switch (t) { CASE_INT:EiC_generate(&e2->Code, int2llong, &e1->Val, 0); break; CASE_UINT:EiC_generate(&e2->Code, uint2llong, &e1->Val, 0); } } else if(sizeof(long) != sizeof(eic_llong)) { switch (t) { case t_long:EiC_generate(&e2->Code, long2llong, &e1->Val, 0); break; case t_ulong:EiC_generate(&e2->Code, ulong2llong, &e1->Val, 0); } } EiC_exchtype(obj, e2->Type); } else EiC_castconst(e2, e1, 0); } if (!e2->Pflag) EiC_output(e2);}void binhllong(unsigned oper, token_t * e1, token_t * e2){ checkllong(t_llong, e1, e2); switch (oper) { case '+': EiC_generate(&e2->Code, addllong, &e2->Val, 0); break; case '-': EiC_generate(&e2->Code, subllong, &e2->Val, 0); break; case '*': EiC_generate(&e2->Code, multllong, &e2->Val, 0); break; case '/': EiC_generate(&e2->Code, divllong, &e2->Val, 0); break; case '%': EiC_generate(&e2->Code, modllong, &e2->Val, 0); break; case LSHT: EiC_generate(&e2->Code, lshtllong, &e2->Val, 0); break; case RSHT: EiC_generate(&e2->Code, rshtllong, &e2->Val, 0); break; case BOR: EiC_generate(&e2->Code, borllong, &e2->Val, 0); break; case XOR: EiC_generate(&e2->Code, xorllong, &e2->Val, 0); break; case AND: EiC_generate(&e2->Code, andllong, &e2->Val, 0); break; default: EiC_output(e1); EiC_exchtype(t_int, e1->Type); /* should really be boolean */ switch (oper) { case LT: EiC_generate(&e2->Code, ltllong, &e2->Val, 0); break; case LE: EiC_generate(&e2->Code, lellong, &e2->Val, 0); break; case EQ: EiC_generate(&e2->Code, eqllong, &e2->Val, 0); break; case NE: EiC_generate(&e2->Code, nellong, &e2->Val, 0); break; case GT: EiC_generate(&e2->Code, gtllong, &e2->Val, 0); break; case GE: EiC_generate(&e2->Code, gellong, &e2->Val, 0); break; } break; }}void binhdouble(unsigned oper, token_t * e1, token_t * e2){ int t; if ((t=EiC_gettype(e1->Type)) != t_double) { if (!isconst(e1->Type)) { if (!e1->Pflag) EiC_output(e1); switch (t) { CASE_INT:EiC_generate(&e1->Code, int2double, &e1->Val, 0); break; CASE_UINT:EiC_generate(&e1->Code, uint2double, &e1->Val, 0); break; CASE_LONG:EiC_generate(&e1->Code, long2double, &e1->Val, 0); break; CASE_ULONG:EiC_generate(&e1->Code, ulong2double, &e1->Val, 0); break; case t_llong: EiC_generate(&e1->Code, llong2double, &e1->Val, 0); break; } EiC_exchtype(t_double, e1->Type); } else EiC_castconst(e1, e2, 0); } if ((t=EiC_gettype(e2->Type)) != t_double) { if (!isconst(e2->Type)) { if (!e2->Pflag) EiC_output(e2); switch (t) { CASE_INT:EiC_generate(&e2->Code, int2double, &e1->Val, 0); break; CASE_UINT:EiC_generate(&e2->Code, uint2double, &e1->Val, 0); break; CASE_LONG:EiC_generate(&e2->Code, long2double, &e1->Val, 0); break; CASE_ULONG:EiC_generate(&e2->Code, ulong2double, &e1->Val, 0); break; case t_llong:EiC_generate(&e2->Code, llong2double, &e1->Val, 0); break; } EiC_exchtype(t_double, e2->Type); } else EiC_castconst(e2, e1, 0); } if (!e2->Pflag) EiC_output(e2); switch (oper) { case '+': EiC_generate(&e2->Code, adddouble, &e2->Val, 0); break; case '-': EiC_generate(&e2->Code, subdouble, &e2->Val, 0); break; case '*': EiC_generate(&e2->Code, multdouble, &e2->Val, 0); break; case '/': EiC_generate(&e2->Code, divdouble, &e2->Val, 0); break; default: EiC_output(e1); EiC_exchtype(t_int, e1->Type); /* should really be boolean */ switch (oper) { case LT: EiC_generate(&e2->Code, ltdouble, &e2->Val, 0); break; case LE: EiC_generate(&e2->Code, ledouble, &e2->Val, 0); break; case EQ: EiC_generate(&e2->Code, eqdouble, &e2->Val, 0); break; case NE: EiC_generate(&e2->Code, nedouble, &e2->Val, 0); break; case GT: EiC_generate(&e2->Code, gtdouble, &e2->Val, 0); break; case GE: EiC_generate(&e2->Code, gedouble, &e2->Val, 0); break; default:EiC_error("illegal binary operation to `%c'", oper); } }}#define arrayLimit(type) /* replaced by runtime checks *//*if(limit && (e2->Val.type >= limit || \ e2->Val.type < 0))\ EiC_error("Array bound violation"); */#define ConstPval(y) { if(oper == '+')\ e1->Val.p.p = (char*)e1->Val.p.p + e2->Val.y;\ else\ e1->Val.p.p = (char*)e1->Val.p.p - e2->Val.y;\ }void EiC_binhlval(unsigned oper, token_t * e1, token_t * e2){ unsigned limit = 0; if (EiC_gettype(e1->Type) != t_pointer) { if(EiC_gettype(e1->Type) != t_array) { EiC_binhlval(oper,e2,e1); EiC_swaptokens(e1,e2); return; } else { /* convert array to pointer */ limit = getNumElems(e1->Type); EiC_output(e1); } } if(EiC_gettype(e2->Type) == t_array) EiC_output(e2); if (EiC_gettype(e2->Type) != t_pointer) { if(oper == '+' || oper == '-') { int c = 0; VAL.ival = EiC_get_sizeof(nextType(e1->Type)); if(!VAL.ival) EiC_error("Illegal pointer operation"); if(isconst(e1->Type) && isconst(e2->Type)) c = 1; if(isconst(e2->Type)) { switch (EiC_gettype(e2->Type)) { CASE_INT: arrayLimit(ival); e2->Val.ival *= VAL.ival; if(c) ConstPval(ival); break; CASE_UINT: arrayLimit(uival); e2->Val.uival *= VAL.ival; if(c) ConstPval(uival); break; CASE_LONG: arrayLimit(lval); e2->Val.lval *= VAL.ival; if(c) ConstPval(lval); break; CASE_ULONG: arrayLimit(ulval); e2->Val.ulval *= VAL.ival; if(c) ConstPval(ulval); break; default: EiC_error("Illegal pointer operation"); } VAL.ival = 1; } if(!c) { if(oper == '-') VAL.ival = -VAL.ival; EiC_output(e2); if(EiC_gettype(e2->Type) > t_uint && sizeof(int) != sizeof(long)) { token_t e3; EiC_inittoken(&e3); e3.Type = EiC_addtype(t_int,NULL); EiC_castvar(e2,&e3,0); EiC_freetype(e3.Type); } if(VAL.ival > 1 || VAL.ival < 0) EiC_generate(&e2->Code, ixa, &VAL, limit); else EiC_generate(&e2->Code, addptr2int, &e2->Val, 0); } return; }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -