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 ); }
static char *GetBPCmd( brkp *bp, brk_event event, char *buff, unsigned buff_len ) { char *cmds; char *cond; char *p; char *end = buff + buff_len ; cmds = cond = LIT_ENG( Empty ); if( bp != NULL ) { if( bp->cmds != NULL ) cmds = bp->cmds->buff; if( bp->condition != NULL ) cond = bp->condition; } p = Format( buff, "%s", GetCmdName( CMD_BREAK ) ); switch( event ) { case B_SET: *p++ = '/'; if( IS_BP_EXECUTE( bp->th ) ) { p = GetCmdEntry( PointNameTab, B_SET, p ); } else { p += GetMADTypeNameForCmd( bp->th, p, end - p ); *p++ = ' '; } if( bp->status.b.resume ) { *p++ = '/'; p = GetCmdEntry( PointNameTab, B_RESUME, p ); } if( !bp->status.b.active ) { *p++ = '/'; p = GetCmdEntry( PointNameTab, B_DEACTIVATE, p ); } *p++ = ' '; *p++ = '/'; p = GetCmdEntry( PointNameTab, B_INDEX, p ); p = Format( p, " %d, ", bp->index ); if( bp->loc.image_name != NULL ) { *p++ = '/'; p = GetCmdEntry( PointNameTab, B_UNMAPPED, p ); *p++ = ' '; *p++ = '/'; p = GetCmdEntry( PointNameTab, B_MAPADDRESS, p ); *p++ = ' '; p = StrCopy( bp->loc.image_name, p ); *p++ = ' '; p = AddHexSpec( p ); p = CnvULongHex( bp->loc.addr.mach.segment, p, end - p ); *p++ = ' '; p = AddHexSpec( p ); p = CnvULongHex( bp->loc.addr.mach.offset, p, end - p ); *p++ = ','; } else if( bp->image_name != NULL && bp->mod_name != NULL ) { *p++ = '/'; p = GetCmdEntry( PointNameTab, B_UNMAPPED, p ); *p++ = ' '; *p++ = '/'; p = GetCmdEntry( PointNameTab, B_SYMADDRESS, p ); *p++ = ' '; p = StrCopy( bp->image_name, p ); *p++ = ' '; p = StrCopy( bp->mod_name, p ); *p++ = ' '; p = StrCopy( bp->sym_name, p ); *p++ = ' '; p = AddHexSpec( p ); p = CnvULongHex( bp->cue_diff, p, end - p ); *p++ = ' '; p = AddHexSpec( p ); p = CnvULongHex( bp->addr_diff, p, end - p ); *p++ = ','; } else { p = AddrToString( &bp->loc.addr, MAF_FULL, p, end - p ); // p = Format( p, " %A", bp->loc.addr ); } p = Format( p, " {%s} {%s}", cmds, cond ); if( bp->initial_countdown != 0 ) { p = StrCopy( " ", p ); p = AddHexSpec( p ); p = CnvULongHex( bp->initial_countdown, p, end - p ); } return( p ); case B_CLEAR: case B_ACTIVATE: case B_DEACTIVATE: case B_RESUME: case B_UNRESUME: *p++ = '/'; p = GetCmdEntry( PointNameTab, event, p ); if( bp == NULL ) { p = StrCopy( "*", p ); } else { p = AddrToString( &bp->loc.addr, MAF_FULL, p, end - p ); // p = Format( p, " %A", bp->loc.addr ); } return( p ); } return( NULL ); }
char *FmtStr( char *buff, const char *fmt, va_list args ) { char *ptr; unsigned len; long val; address addr; char *res; sym_handle *sym; char save_buff[UTIL_LEN + 1]; while( *fmt != NULLCHAR ) { if( *fmt != '%' ) { *buff = *fmt; ++buff; } else { ++fmt; switch( *fmt ) { case 'c': val = va_arg( args, int ); *buff++ = val; break; case 's': ptr = va_arg( args, char * ); buff = StrCopy( ptr, buff ); break; case 't': ptr = va_arg( args, char * ); len = va_arg( args, unsigned ); memcpy( buff, ptr, len ); buff += len; break; case 'l': addr = va_arg( args, address ); buff = StrAddr( &addr, buff, TXT_LEN ); // nyi - overflow? res = LineAddr( &addr, save_buff, sizeof( save_buff ) ); if( res != NULL ) { *buff++ = '('; buff = StrCopy( save_buff, buff ); *buff++ = ')'; } break; case 'A': addr = va_arg( args, address ); buff = UniqStrAddr( &addr, buff, TXT_LEN ); // nyi - overflow? break; case 'a': addr = va_arg( args, address ); buff = StrAddr( &addr, buff, TXT_LEN ); // nyi - overflow? break; case 'p': addr = va_arg( args, address ); buff = AddrToIOString( &addr, buff, TXT_LEN ); // nyi - overflow? break; case 'e': val = va_arg( args, unsigned ); buff = SysErrMsg( val, buff ); break; case 'U': buff = CnvULongDec( va_arg( args, unsigned long), buff, TXT_LEN ); break; case 'd': val = va_arg( args, int ); buff = CnvLongDec( val, buff, TXT_LEN ); break; case 'u': val = va_arg( args, unsigned ); buff = CnvULongDec( val, buff, TXT_LEN ); break; case '%': *buff++ = '%'; break; case 'o': val = va_arg( args, long ); if( val < 0 ) { *buff++ = '-'; val = -val; } else { *buff++ = '+'; } buff = AddHexSpec( buff ); buff = CnvULongHex( val, buff, TXT_LEN ); break; case 'S': sym = va_arg( args, sym_handle * ); buff += SymName( sym, NULL, SN_SOURCE, buff, TXT_LEN ); break; } } ++fmt; } *buff = NULLCHAR; return( buff ); }