42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.2 KiB
		
	
	
	
		
			Factor
		
	
	
| USING: accessors arrays binary-search kernel math math.order
 | |
| math.parser namespaces sequences sorting splitting vectors vocabs words ;
 | |
| IN: tools.disassembler.utils
 | |
| 
 | |
| SYMBOL: words-xt
 | |
| SYMBOL: smallest-xt
 | |
| SYMBOL: greatest-xt
 | |
| 
 | |
| : (words-xt) ( -- assoc )
 | |
|     vocabs [ words ] map concat [ [ word-xt ] keep 3array ] map
 | |
|     [ [ first ] bi@ <=> ] sort >vector ;
 | |
| 
 | |
| : complete-address ( n seq -- str )
 | |
|     [ first - ] [ third name>> ] bi
 | |
|     over zero? [ nip ] [ swap 16 >base "0x" prepend "+" glue ] if ;
 | |
| 
 | |
| : search-xt ( n -- str/f )
 | |
|     dup [ smallest-xt get < ] [ greatest-xt get > ] bi or [
 | |
|         drop f
 | |
|     ] [
 | |
|         words-xt get over [ swap first <=> ] curry search nip
 | |
|         2dup second <= [
 | |
|             [ complete-address ] [ drop f ] if*
 | |
|         ] [
 | |
|             2drop f
 | |
|         ] if
 | |
|     ] if ;
 | |
| 
 | |
| : resolve-xt ( str -- str' )
 | |
|     [ "0x" prepend ] [ 16 base> ] bi
 | |
|     [ search-xt [ " (" ")" surround append ] when* ] when* ;
 | |
| 
 | |
| : resolve-call ( str -- str' )
 | |
|     "0x" split1-last [ resolve-xt "0x" glue ] when* ;
 | |
| 
 | |
| : with-words-xt ( quot -- )
 | |
|     [ (words-xt)
 | |
|       [ words-xt set ]
 | |
|       [ first first smallest-xt set ]
 | |
|       [ last second greatest-xt set ] tri
 | |
|     ] prepose with-scope ; inline
 |