]> gitweb.factorcode.org Git - factor.git/commitdiff
alien.endian: read 64bit numbers of the opposite endian as two 32bit numbers, then...
authorDoug Coleman <doug.coleman@gmail.com>
Tue, 15 Nov 2011 21:22:12 +0000 (13:22 -0800)
committerDoug Coleman <doug.coleman@gmail.com>
Tue, 15 Nov 2011 21:22:49 +0000 (13:22 -0800)
basis/alien/endian/endian.factor

index bc2919bb6e6b0b58fb65305d62d6fa75998ab704..b72e0c634da1d88ec772f39ad975179e66663f7b 100644 (file)
@@ -3,7 +3,7 @@
 USING: accessors alien alien.accessors alien.c-types alien.data
 classes.struct.private combinators compiler.units endian fry
 generalizations kernel macros math namespaces sequences words
-arrays slots ;
+arrays slots math.bitwise ;
 QUALIFIED-WITH: alien.c-types ac
 IN: alien.endian
 
@@ -57,9 +57,22 @@ ERROR: unknown-endian-c-type symbol ;
 
 : change-c-type-accessors ( n ? c-type -- c-type' )
     endian-c-type>c-type-symbol "c-type" word-prop clone
-    -rot
-    [ '[ [ _ _ byte-reverse ] compose ] change-getter drop ]
-    [ '[ [ [ _ _ byte-reverse ] 2dip ] prepose ] change-setter ] 3bi ;
+    -rot over 8 = [
+        [
+            nip
+            [
+                [
+                    [ alien-unsigned-4 4 f byte-reverse 32 shift ]
+                    [ 4 + alien-unsigned-4 4 f byte-reverse ] 2bi bitor
+                ]
+            ] dip [ [ 64 >signed ] compose ] when 
+            >>getter drop
+        ]
+        [ '[ [ [ _ _ byte-reverse ] 2dip ] prepose ] change-setter ] 3bi
+    ] [
+        [ '[ [ _ _ byte-reverse ] compose ] change-getter drop ]
+        [ '[ [ [ _ _ byte-reverse ] 2dip ] prepose ] change-setter ] 3bi
+    ] if ;
 
 : typedef-endian ( n ? c-type endian -- )
     native-endianness get = [