| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | ! Copyright (C) 2009 Doug Coleman. | 
					
						
							|  |  |  | ! See http://factorcode.org/license.txt for BSD license. | 
					
						
							| 
									
										
										
										
											2010-12-25 19:54:45 -05:00
										 |  |  | USING: alien.c-types alien.data namespaces io.binary fry | 
					
						
							| 
									
										
										
										
											2009-02-14 01:31:17 -05:00
										 |  |  | kernel math grouping sequences math.bitwise ;
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | IN: endian | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | SINGLETONS: big-endian little-endian ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | : compute-native-endianness ( -- class )
 | 
					
						
							| 
									
										
										
										
											2014-06-02 19:30:12 -04:00
										 |  |  |     1 int <ref> char deref 0 = big-endian little-endian ? ; foldable
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | SYMBOL: native-endianness | 
					
						
							|  |  |  | native-endianness [ compute-native-endianness ] initialize
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | SYMBOL: endianness | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | endianness [ native-endianness get-global ] initialize
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | HOOK: >native-endian native-endianness ( obj n -- bytes )
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: big-endian >native-endian >be ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: little-endian >native-endian >le ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | HOOK: unsigned-native-endian> native-endianness ( obj -- bytes )
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: big-endian unsigned-native-endian> be> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: little-endian unsigned-native-endian> le> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | : signed-native-endian> ( obj n -- n' )
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  |     [ unsigned-native-endian> ] dip >signed ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | HOOK: >endian endianness ( obj n -- bytes )
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | 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> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | HOOK: unsigned-endian> endianness ( obj -- bytes )
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | M: big-endian unsigned-endian> be> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | M: little-endian unsigned-endian> le> ;
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | : signed-endian> ( obj n -- bytes )
 | 
					
						
							| 
									
										
										
										
											2009-02-07 00:37:18 -05:00
										 |  |  |     [ 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
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  | 
 | 
					
						
							|  |  |  | : seq>native-endianness ( seq n -- seq' )
 | 
					
						
							|  |  |  |     native-endianness get-global dup endianness get = [ | 
					
						
							|  |  |  |         2drop
 | 
					
						
							|  |  |  |     ] [ | 
					
						
							| 
									
										
										
										
											2013-03-23 15:08:18 -04:00
										 |  |  |         [ [ <groups> ] keep ] dip
 | 
					
						
							| 
									
										
										
										
											2009-02-13 16:47:48 -05:00
										 |  |  |         little-endian = [ | 
					
						
							|  |  |  |             '[ be> _ >le ] map
 | 
					
						
							|  |  |  |         ] [ | 
					
						
							|  |  |  |             '[ le> _ >be ] map
 | 
					
						
							|  |  |  |         ] if concat
 | 
					
						
							|  |  |  |     ] if ; inline
 |