/* * CallExpr -- get a call expression */ void CallExpr( address *out_val ) { unsigned old; old = SetCurrRadix( 16 ); _SwitchOn( SW_EXPR_IS_CALL ); EvalExpr( 0 ); /* call expression */ MakeMemoryAddr( TRUE, EXPR_CODE, out_val ); SetCurrRadix( old ); }
void ReqMemAddr( memory_expr def_seg, address *out_val ) { unsigned old; old = SetCurrRadix( 16 ); _SwitchOff( SW_EXPR_IS_CALL ); EvalExpr( 0 ); /* memory expression */ MakeMemoryAddr( TRUE, def_seg, out_val ); SetCurrRadix( old ); }
mad_status DIGCLIENT MADCliMemExpr( const char *expr, unsigned radix, address *a ) { const char *old_scan; unsigned old_radix; old_radix = SetCurrRadix( radix ); old_scan = ReScan( expr ); EvalExpr( 0 ); /* memory expression */ MakeMemoryAddr( TRUE, EXPR_DATA, a ); SetCurrRadix( old_radix ); ReScan( old_scan ); return( MS_OK ); }
inspect_type WndGetExprSPInspectType( address *paddr ) { sym_info info; DIPHDL( sym, sh ); LValue( ExprSP ); *paddr = NilAddr; if( ExprSP->info.kind == TK_FUNCTION ) { ExprValue( ExprSP ); *paddr = ExprSP->v.addr; PopEntry(); return( INSP_CODE ); } else if( (ExprSP->flags & SF_LOCATION) && ExprSP->th != NULL && !IsInternalMod( TypeMod( ExprSP->th ) ) ) { if( ExprSP->v.loc.num == 1 && ExprSP->v.loc.e[0].type == LT_ADDR ) { *paddr = ExprSP->v.loc.e[0].u.addr; } PopEntry(); return( INSP_DATA ); } else { if( (ExprSP->flags & SF_LOCATION) && ExprSP->v.loc.e[0].type == LT_ADDR ) { *paddr = ExprSP->v.loc.e[0].u.addr; } else if( ExprSP->info.kind == TK_ADDRESS || ExprSP->info.kind == TK_POINTER ) { *paddr = ExprSP->v.addr; } if( !IS_NIL_ADDR( (*paddr) ) ) { AddrFloat( paddr ); if( DeAliasAddrSym( NO_MOD, *paddr, sh ) != SR_NONE ) { SymInfo( sh, ExprSP->lc, &info ); PopEntry(); switch( info.kind ) { case SK_CODE: case SK_PROCEDURE: return( INSP_CODE ); break; default: return( INSP_RAW_DATA ); break; } } } } ExprValue( ExprSP ); MakeMemoryAddr( TRUE, EXPR_DATA, paddr ); return( INSP_RAW_DATA ); }