char *CnvAddr( address addr, cnvaddr_option cao, bool uniq, char *p, size_t max ) { char off_buff[40]; size_t str_width, name_width, off_width; addr_off sym_offset; search_result sr; location_list ll; DIPHDL( sym, sym ); off_width = 0; AddrFloat( &addr ); sr = DeAliasAddrSym( NO_MOD, addr, sym ); switch( sr ) { case SR_NONE: return( NULL ); case SR_CLOSEST: if( cao == CAO_NO_PLUS ) return( NULL ); DIPSymLocation( sym, NULL, &ll ); sym_offset = addr.mach.offset - ll.e[0].u.addr.mach.offset; if( cao == CAO_NORMAL_PLUS ) { char *prfx; prfx = AddHexSpec( off_buff ); off_width = CnvULongHex( sym_offset, prfx, sizeof( off_buff ) - ( prfx - off_buff ) ) - off_buff + 1; } break; case SR_EXACT: break; } name_width = QualifiedSymName( sym, NULL, 0, uniq ); str_width = name_width + off_width; if( max == 0 ) max = str_width; if( str_width > max ) { /* won't fit */ if( off_width != 0 ) return( NULL ); QualifiedSymName( sym, p, max - 1, uniq ); p += max - 1; *p++ = '>'; *p = NULLCHAR; return( p ); } QualifiedSymName( sym, p, name_width + 1, uniq ); p += name_width; if( off_width != 0 ) { --off_width; *p++ = '+'; memcpy( p, off_buff, off_width ); p += off_width; *p = NULLCHAR; } return( p ); }
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 ); }