int Judge( NS * n,OS * o , char a[]) { float x,y,z; int i = 0; char sh; if(o->optop == Stack_Size - 1 ) { return FALSE; } sh = '#'; PushOperation(o,sh); while(a[i] != '#') {//全部进栈并且将所有操作全部转化,仅剩+ - if(a[i] >= 48 && a[i]<=57 ) { x = a[i] - 48; PushNum(n,x); } else if(a[i] == '+' && ( o->elem[o->optop - 1] == '*' || o->elem[o->optop - 1] == '/')) { PopNum(n,&x); PopNum(n,&y); PopOperation(o , &sh); z = Calculation( x, y , sh); PushNum(n , z); } else if(a[i] == '-' && (o->elem[o->optop - 1] == '*' || o->elem[o->optop - 1] == '/')) { PopNum(n,&x); PopNum(n,&y); PopOperation(o , &sh); z = Calculation( x, y , sh); PushNum(n , z); } else if( a[i] == '*' || a[i] == '/') { sh = a[i]; PopNum( n , &x); y = a[i+1] - 48; z = Calculation( x, y ,sh); PushNum(n,z); i++; } else { sh = a[i]; PushOperation(o , sh); } i++; } Result(n , o , a); return TRUE; }
static void PushBaseSize( void ) { DIPHDL( type, th ); dip_type_info ti; TypeBase( ExprSP->th, th, NULL, NULL ); TypeInfo( th, ExprSP->lc, &ti ); PushNum( ti.size ); }
void eef(void) { flagINV=0; if (clrdisp) { if (rpn && lift_enabled) PushNum(dnum); strlcpy(dispstr, rpn ? "1" : "0", sizeof(dispstr)); } if (!exponent) { strcat(dispstr,"E+"); DrawDisplay(); exponent=strlen(dispstr)-1; /* where the '-' goes */ } clrdisp=0; entered=1; }
void decf(void) { flagINV=0; if (clrdisp) { if (rpn && lift_enabled) PushNum(dnum); strlcpy(dispstr, "0", sizeof(dispstr)); } if (!Dpoint) { #ifndef X_LOCALE strcat(dispstr, localeconv()->decimal_point); #else strcat(dispstr, "."); #endif DrawDisplay(); Dpoint++; } clrdisp=0; entered=1; }
static unsigned MechDo( unsigned select, unsigned parm ) { unsigned long size; unsigned result = 0; DIPHDL( type, th ); dip_type_info info; mad_type_info mti; switch( select ) { case 0: DoAssign(); break; case 1: DoMul(); break; case 2: DoDiv(); break; case 3: DoMod(); break; case 4: DoMinus(); break; case 5: DoShift(); break; case 6: DoAnd(); break; case 7: DoXor(); break; case 8: DoOr(); break; case 9: DoAddr(); break; case 10: ClassToTypeInfo( parm, &info ); DoPoints( info.kind ); break; case 11: DoField(); break; case 12: DoCall( Num, parm ); break; case 13: DoConvert(); break; case 14: DoPlus(); break; case 15: MakeAddr(); break; case 16: result = TstEQ( parm ); break; case 17: result = TstLT( parm ); break; case 18: result = TstTrue( parm ); break; case 19: result = TstExist( parm ); break; case 20: size = ExprSP->info.size; PopEntry(); PushNum( size ); break; case 21: TypeBase( ExprSP->th, th, NULL, NULL ); PopEntry(); PushType( th ); break; case 22: GetMADTypeDefault( MTK_ADDRESS, &mti ); size = (mti.b.bits - mti.a.seg.bits) / BITS_PER_BYTE; if( parm ) { size += sizeof( addr_seg ); TypePointer( ExprSP->th, TM_FAR, size, th ); } else { TypePointer( ExprSP->th, TM_NEAR, size, th ); } PopEntry(); PushType( th ); break; case 23: result = UserType( th ); if( result ) { PopEntry(); PushType( th ); } break; case 24: DoMakeComplex(); break; case 25: DoStringConcat(); break; case 26: DoLConvert(); break; case 27: DoPlusScaled(); break; case 28: DoMinusScaled(); break; case 29: DoPoints( TI_KIND_EXTRACT( parm ) ); break; case 30: info.kind = TK_POINTER; info.size = TI_SIZE_EXTRACT( parm ); info.modifier = TI_MOD_EXTRACT( parm ); FillInDefaults( &info ); TypePointer( ExprSP->th, info.modifier, info.size, th ); PopEntry(); PushType( th ); break; case 31: if( parm ) { /* file scope */ if( ExprSP->flags & SF_NAME ) { ExprSP->v.li.file_scope = TRUE; } else { Error( ERR_LOC, LIT( ERR_WANT_NAME ) ); } } else { /* in a namespace */ DoScope(); } break; } return( result ); }
/* Two operand functions for infix calc */ void twoop(int keynum) { if (flagINV) { flagINV=0; DrawDisplay(); } if (!entered) { /* something like "5+*" */ if (!isopempty()) (void) PopOp(); /* replace the prev op */ PushOp(keynum); /* with the new one */ return; } if (entered==1) parse_double(&dnum); clrdisp=CLR=1; entered=Dpoint=exponent=0; if (!isopempty()) { /* there was a previous op */ lastop=PopOp(); /* get it */ if (lastop==kLPAR) { /* put it back */ PushOp(kLPAR); PushOp(keynum); PushNum(dnum); return; } /* now, if the current op (keynum) is of higher priority than the lastop, the current op and number are just pushed on top Priorities: (Y^X) > *,/ > +,- > >>,<< > & > ^ > ~ */ if (priority(keynum) > priority(lastop)) { PushNum(dnum); PushOp(lastop); PushOp(keynum); } else { /* execute lastop on lastnum and dnum, push result and current op on stack */ acc=PopNum(); switch (lastop) { /* perform the operation */ case kADD: acc += dnum; break; case kSUB: acc -= dnum; break; case kMUL: acc *= dnum; break; case kDIV: acc /= dnum; break; case kPOW: acc = pow(acc,dnum); break; case kMOD: acc = (long)acc % (long)dnum; break; case kAND: acc = (long)acc & (long)dnum; break; case kOR: acc = (long)acc | (long)dnum; break; case kXOR: acc = (long)acc ^ (long)dnum; break; case kSHL: acc = (long)acc << (long)dnum; break; case kSHR: acc = (long)acc >> (long)dnum; break; } PushNum(acc); PushOp(keynum); format_double(acc); DrawDisplay(); dnum=acc; } }
/*-------------------------------------------------------------------------*/ void numeric(int keynum) { char st[2]; flagINV=0; if (rpn && (memop == kSTO || memop == kRCL || memop == kSUM)) { int cell = 0; switch (keynum) { case kONE: cell = 1; break; case kTWO: cell = 2; break; case kTHREE: cell = 3; break; case kFOUR: cell = 4; break; case kFIVE: cell = 5; break; case kSIX: cell = 6; break; case kSEVEN: cell = 7; break; case kEIGHT: cell = 8; break; case kNINE: cell = 9; break; case kZERO: cell = 0; break; } switch (memop) { case kSTO: mem[cell] = dnum; lift_enabled = 1; entered = 2; clrdisp++; break; case kRCL: PushNum(dnum); dnum = mem[cell]; format_double(dnum); lift_enabled = 1; entered = 1; clrdisp++; break; case kSUM: mem[cell] += dnum; lift_enabled = 1; entered = 2; clrdisp++; break; } memop = kCLR; DrawDisplay(); return; } if (clrdisp) { dispstr[0]='\0'; exponent=Dpoint=0; /* if (rpn && entered==2) PushNum(dnum); */ if (rpn & lift_enabled) PushNum(dnum); } if ((int) strlen(dispstr) >= MAXDISP) return; st[0] = '\0'; switch (keynum){ case kZERO: st[0] = '0'; break; case kONE: st[0] = '1'; break; case kTWO: st[0] = '2'; break; case kTHREE: st[0] = '3'; break; case kFOUR: st[0] = '4'; break; case kFIVE: st[0] = '5'; break; case kSIX: st[0] = '6'; break; case kSEVEN: st[0] = '7'; break; case kEIGHT: if (numbase > 8) st[0] = '8'; break; case kNINE: if (numbase > 8) st[0] = '9'; break; case kxA: if (numbase > 10) st[0] = 'A'; break; case kxB: if (numbase > 10) st[0] = 'B'; break; case kxC: if (numbase > 10) st[0] = 'C'; break; case kxD: if (numbase > 10) st[0] = 'D'; break; case kxE: if (numbase > 10) st[0] = 'E'; break; case kxF: if (numbase > 10) st[0] = 'F'; break; } if (st[0] == '\0') return; st[1] = '\0'; strcat(dispstr,st); DrawDisplay(); if (clrdisp && keynum != kZERO) clrdisp=0; /*no leading 0s*/ memop = keynum; entered=1; lift_enabled = 0; }
static ssl_value MechDo( unsigned select, ssl_value parm ) { unsigned long size; ssl_value result; DIPHDL( type, th ); dig_type_info ti; mad_type_info mti; result = 0; switch( select ) { case 0: DoAssign(); break; case 1: DoMul(); break; case 2: DoDiv(); break; case 3: DoMod(); break; case 4: DoMinus(); break; case 5: DoShift(); break; case 6: DoAnd(); break; case 7: DoXor(); break; case 8: DoOr(); break; case 9: DoAddr(); break; case 10: ClassToTypeInfo( parm, &ti ); DoPoints( ti.kind ); break; case 11: DoField(); break; case 12: DoCall( Num, SSL2BOOL( parm ) ); break; case 13: DoConvert(); break; case 14: DoPlus(); break; case 15: MakeAddr(); break; case 16: result = ( TstEQ( SSL2INT( parm ) ) != 0 ); break; case 17: result = ( TstLT( SSL2INT( parm ) ) != 0 ); break; case 18: result = ( TstTrue( SSL2INT( parm ) ) != 0 ); break; case 19: result = ( TstExist( SSL2INT( parm ) ) != 0 ); break; case 20: size = ExprSP->ti.size; PopEntry(); PushNum( size ); break; case 21: DIPTypeBase( ExprSP->th, th, NULL, NULL ); PopEntry(); PushType( th ); break; case 22: GetMADTypeDefault( MTK_ADDRESS, &mti ); size = BITS2BYTES( mti.b.bits - mti.a.seg.bits ); if( parm ) { size += sizeof( addr_seg ); DIPTypePointer( ExprSP->th, TM_FAR, size, th ); } else { DIPTypePointer( ExprSP->th, TM_NEAR, size, th ); } PopEntry(); PushType( th ); break; case 23: result = UserType( th ); if( result ) { PopEntry(); PushType( th ); } break; case 24: DoMakeComplex(); break; case 25: DoStringConcat(); break; case 26: DoLConvert(); break; case 27: DoPlusScaled(); break; case 28: DoMinusScaled(); break; case 29: DoPoints( TI_KIND_EXTRACT( parm ) ); break; case 30: ti.kind = TK_POINTER; ti.size = TI_SIZE_EXTRACT( parm ); ti.modifier = TI_MOD_EXTRACT( parm ); ti.deref = false; FillInDefaults( &ti ); DIPTypePointer( ExprSP->th, ti.modifier, ti.size, th ); PopEntry(); PushType( th ); break; case 31: if( SSL2BOOL( parm ) ) { /* file scope */ if( ExprSP->flags & SF_NAME ) { ExprSP->v.li.file_scope = true; } else { Error( ERR_LOC, LIT_ENG( ERR_WANT_NAME ) ); } } else { /* in a namespace */ DoScope(); } break; } return( result ); }