@ -6,6 +6,7 @@
# include "decode.h"
# include <string>
# include <sstream>
# include <algorithm>
# include <vector>
extern const char * xpr_name [ NXPR ] ;
@ -23,10 +24,13 @@ class arg_t
class disasm_insn_t
{
public :
NOINLINE disasm_insn_t ( const char * name , uint32_t match , uint32_t mask ,
NOINLINE disasm_insn_t ( const char * name_ , uint32_t match , uint32_t mask ,
const std : : vector < const arg_t * > & args )
: match ( match ) , mask ( mask ) , args ( args ) , name ( strdup ( name ) ) { }
~ disasm_insn_t ( ) { free ( const_cast < char * > ( name ) ) ; }
: match ( match ) , mask ( mask ) , args ( args )
{
name = name_ ;
std : : replace ( name . begin ( ) , name . end ( ) , ' _ ' , ' . ' ) ;
}
bool operator = = ( insn_t insn ) const
{
@ -35,20 +39,17 @@ class disasm_insn_t
const char * get_name ( ) const
{
return name ;
return name . c_str ( ) ;
}
std : : string to_string ( insn_t insn ) const
{
std : : stringstream s ;
int len ;
for ( len = 0 ; name [ len ] ; len + + )
s < < ( name [ len ] = = ' _ ' ? ' . ' : name [ len ] ) ;
std : : string s ( name ) ;
if ( args . size ( ) )
{
bool next_arg_optional = false ;
s < < std : : string ( std : : max ( 1 , 8 - l en ) , ' ' ) ;
s + = std : : string ( std : : max ( 1 , 8 - int ( nam e. size ( ) ) ) , ' ' ) ;
for ( size_t i = 0 ; i < args . size ( ) ; i + + ) {
if ( args [ i ] = = nullptr ) {
next_arg_optional = true ;
@ -59,11 +60,11 @@ class disasm_insn_t
next_arg_optional = false ;
if ( argString . empty ( ) ) continue ;
}
if ( i ! = 0 ) s < < " , " ;
s < < argString ;
if ( i ! = 0 ) s + = " , " ;
s + = argString ;
}
}
return s . str ( ) ;
return s ;
}
uint32_t get_match ( ) const { return match ; }
@ -73,7 +74,7 @@ class disasm_insn_t
uint32_t match ;
uint32_t mask ;
std : : vector < const arg_t * > args ;
const char * name ;
std : : string name ;
} ;
class disassembler_t