77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			77 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Factor
		
	
	
| ! Copyright (C) 2009 Doug Coleman.
 | |
| ! See http://factorcode.org/license.txt for BSD license.
 | |
| USING: alien.c-types alien.data namespaces io.binary fry
 | |
| kernel math grouping sequences math.bitwise ;
 | |
| IN: endian
 | |
| 
 | |
| SINGLETONS: big-endian little-endian ;
 | |
| 
 | |
| : compute-native-endianness ( -- class )
 | |
|     1 int <ref> char deref 0 = big-endian little-endian ? ; foldable
 | |
| 
 | |
| SYMBOL: native-endianness
 | |
| native-endianness [ compute-native-endianness ] initialize
 | |
| 
 | |
| SYMBOL: endianness
 | |
| endianness [ native-endianness get-global ] initialize
 | |
| 
 | |
| HOOK: >native-endian native-endianness ( obj n -- bytes )
 | |
| 
 | |
| M: big-endian >native-endian >be ;
 | |
| 
 | |
| M: little-endian >native-endian >le ;
 | |
| 
 | |
| HOOK: unsigned-native-endian> native-endianness ( obj -- bytes )
 | |
| 
 | |
| M: big-endian unsigned-native-endian> be> ;
 | |
| 
 | |
| M: little-endian unsigned-native-endian> le> ;
 | |
| 
 | |
| : signed-native-endian> ( obj n -- n' )
 | |
|     [ unsigned-native-endian> ] dip >signed ;
 | |
| 
 | |
| HOOK: >endian endianness ( obj n -- bytes )
 | |
| 
 | |
| M: big-endian >endian >be ;
 | |
| 
 | |
| M: little-endian >endian >le ;
 | |
| 
 | |
| HOOK: endian> endianness ( seq -- n )
 | |
| 
 | |
| M: big-endian endian> be> ;
 | |
| 
 | |
| M: little-endian endian> le> ;
 | |
| 
 | |
| HOOK: unsigned-endian> endianness ( obj -- bytes )
 | |
| 
 | |
| M: big-endian unsigned-endian> be> ;
 | |
| 
 | |
| M: little-endian unsigned-endian> le> ;
 | |
| 
 | |
| : signed-endian> ( obj n -- bytes )
 | |
|     [ unsigned-endian> ] dip >signed ;
 | |
| 
 | |
| : with-endianness ( endian quot -- )
 | |
|     [ endianness ] dip with-variable ; inline
 | |
| 
 | |
| : with-big-endian ( quot -- )
 | |
|     big-endian swap with-endianness ; inline
 | |
| 
 | |
| : with-little-endian ( quot -- )
 | |
|     little-endian swap with-endianness ; inline
 | |
| 
 | |
| : with-native-endian ( quot -- )
 | |
|     \ native-endianness get-global swap with-endianness ; inline
 | |
| 
 | |
| : seq>native-endianness ( seq n -- seq' )
 | |
|     native-endianness get-global dup endianness get = [
 | |
|         2drop
 | |
|     ] [
 | |
|         [ [ <groups> ] keep ] dip
 | |
|         little-endian = [
 | |
|             '[ be> _ >le ] map
 | |
|         ] [
 | |
|             '[ le> _ >be ] map
 | |
|         ] if concat
 | |
|     ] if ; inline
 |