storable-endian 0.2.2 → 0.2.3
raw patch · 2 files changed
+40/−20 lines, 2 filesdep +byteorder
Dependencies added: byteorder
Files
- Data/Storable/Endian.hs +38/−18
- storable-endian.cabal +2/−2
Data/Storable/Endian.hs view
@@ -18,6 +18,8 @@ ) where +import System.ByteOrder+ import Foreign.Storable import Foreign.Ptr @@ -143,14 +145,18 @@ -- | Write a Word16 in big endian format putWord16be :: Ptr Word8 -> Word16 -> IO ()-putWord16be p w = do+putWord16be = if byteOrder == BigEndian + then \p w -> poke (castPtr p) w + else \p w -> do poke p (fromIntegral (shiftr_w16 w 8) :: Word8) poke (p `plusPtr` 1) (fromIntegral (w) :: Word8) {-# INLINE putWord16be #-} -- | Write a Word16 in little endian format putWord16le :: Ptr Word8 -> Word16 -> IO ()-putWord16le p w = do+putWord16le = if byteOrder == LittleEndian+ then \p w -> poke (castPtr p) w+ else \p w -> do poke p (fromIntegral (w) :: Word8) poke (p `plusPtr` 1) (fromIntegral (shiftr_w16 w 8) :: Word8) {-# INLINE putWord16le #-}@@ -159,7 +165,9 @@ -- | Write a Word32 in big endian format putWord32be :: Ptr Word8 -> Word32 -> IO ()-putWord32be p w = do+putWord32be = if byteOrder == BigEndian+ then \p w -> poke (castPtr p) w+ else \p w -> do poke p (fromIntegral (shiftr_w32 w 24) :: Word8) poke (p `plusPtr` 1) (fromIntegral (shiftr_w32 w 16) :: Word8) poke (p `plusPtr` 2) (fromIntegral (shiftr_w32 w 8) :: Word8)@@ -168,24 +176,25 @@ -- | Write a Word32 in little endian format putWord32le :: Ptr Word8 -> Word32 -> IO ()-putWord32le p w = do+putWord32le = if byteOrder == LittleEndian+ then \p w -> poke (castPtr p) w+ else \p w -> do poke p (fromIntegral (w) :: Word8) poke (p `plusPtr` 1) (fromIntegral (shiftr_w32 w 8) :: Word8) poke (p `plusPtr` 2) (fromIntegral (shiftr_w32 w 16) :: Word8) poke (p `plusPtr` 3) (fromIntegral (shiftr_w32 w 24) :: Word8) {-# INLINE putWord32le #-} --- on a little endian machine:--- putWord32le w32 = writeN 4 (\p -> poke (castPtr p) w32)- -- | Write a Word64 in big endian format putWord64be :: Ptr Word8 -> Word64 -> IO ()+putWord64be = if byteOrder == BigEndian+ then \p w -> poke (castPtr p) w+ else \p w -> do #if WORD_SIZE_IN_BITS < 64 -- -- To avoid expensive 64 bit shifts on 32 bit machines, we cast to -- Word32, and write that ---putWord64be p w = do let a = fromIntegral (shiftr_w64 w 32) :: Word32 b = fromIntegral w :: Word32 poke p (fromIntegral (shiftr_w32 a 24) :: Word8)@@ -197,7 +206,6 @@ poke (p `plusPtr` 6) (fromIntegral (shiftr_w32 b 8) :: Word8) poke (p `plusPtr` 7) (fromIntegral (b) :: Word8) #else-putWord64be p w = do poke p (fromIntegral (shiftr_w64 w 56) :: Word8) poke (p `plusPtr` 1) (fromIntegral (shiftr_w64 w 48) :: Word8) poke (p `plusPtr` 2) (fromIntegral (shiftr_w64 w 40) :: Word8)@@ -211,9 +219,10 @@ -- | Write a Word64 in little endian format putWord64le :: Ptr Word8 -> Word64 -> IO ()-+putWord64le = if byteOrder == LittleEndian+ then \p w -> poke (castPtr p) w+ else \p w -> do #if WORD_SIZE_IN_BITS < 64-putWord64le p w = do let b = fromIntegral (shiftr_w64 w 32) :: Word32 a = fromIntegral w :: Word32 poke (p) (fromIntegral (a) :: Word8)@@ -225,7 +234,6 @@ poke (p `plusPtr` 6) (fromIntegral (shiftr_w32 b 16) :: Word8) poke (p `plusPtr` 7) (fromIntegral (shiftr_w32 b 24) :: Word8) #else-putWord64le p w = do poke p (fromIntegral (w) :: Word8) poke (p `plusPtr` 1) (fromIntegral (shiftr_w64 w 8) :: Word8) poke (p `plusPtr` 2) (fromIntegral (shiftr_w64 w 16) :: Word8)@@ -241,7 +249,9 @@ -- putWord64le w64 = writeN 8 (\p -> poke (castPtr p) w64) -- | Read a Word16 in big endian format getWord16be :: Ptr Word8 -> IO Word16-getWord16be p = do+getWord16be = if byteOrder == BigEndian+ then \p -> peek (castPtr p)+ else \p -> do b0 <- fromIntegral `fmap` (p `peekElemOff` 0) b1 <- fromIntegral `fmap` (p `peekElemOff` 1) return $! (b0 `shiftl_w16` 8) .|.@@ -250,7 +260,9 @@ -- | Read a Word16 in little endian format getWord16le :: Ptr Word8 -> IO Word16-getWord16le p = do+getWord16le = if byteOrder == LittleEndian+ then \p -> peek (castPtr p)+ else \p -> do b0 <- fromIntegral `fmap` (p `peekElemOff` 0) b1 <- fromIntegral `fmap` (p `peekElemOff` 1) return $! (b1 `shiftl_w16` 8) .|.@@ -259,7 +271,9 @@ -- | Read a Word32 in big endian format getWord32be :: Ptr Word8 -> IO Word32-getWord32be p = do+getWord32be = if byteOrder == BigEndian+ then \p -> peek (castPtr p)+ else \p -> do b0 <- fromIntegral `fmap` (p `peekElemOff` 0) b1 <- fromIntegral `fmap` (p `peekElemOff` 1) b2 <- fromIntegral `fmap` (p `peekElemOff` 2)@@ -272,7 +286,9 @@ -- | Read a Word32 in little endian format getWord32le :: Ptr Word8 -> IO Word32-getWord32le p = do+getWord32le = if byteOrder == LittleEndian+ then \p -> peek (castPtr p)+ else \p -> do b0 <- fromIntegral `fmap` (p `peekElemOff` 0) b1 <- fromIntegral `fmap` (p `peekElemOff` 1) b2 <- fromIntegral `fmap` (p `peekElemOff` 2)@@ -285,7 +301,9 @@ -- | Read a Word64 in big endian format getWord64be :: Ptr Word8 -> IO Word64-getWord64be p = do+getWord64be = if byteOrder == BigEndian+ then \p -> peek (castPtr p)+ else \p -> do b0 <- fromIntegral `fmap` (p `peekElemOff` 0) b1 <- fromIntegral `fmap` (p `peekElemOff` 1) b2 <- fromIntegral `fmap` (p `peekElemOff` 2)@@ -306,7 +324,9 @@ -- | Read a Word64 in little endian format getWord64le :: Ptr Word8 -> IO Word64-getWord64le p = do+getWord64le = if byteOrder == LittleEndian+ then \p -> peek (castPtr p)+ else \p -> do b0 <- fromIntegral `fmap` (p `peekElemOff` 0) b1 <- fromIntegral `fmap` (p `peekElemOff` 1) b2 <- fromIntegral `fmap` (p `peekElemOff` 2)
storable-endian.cabal view
@@ -1,5 +1,5 @@ Name: storable-endian-Version: 0.2.2+Version: 0.2.3 License: BSD3 License-file: LICENSE Copyright: Eugene Kirpichov, 2010@@ -23,7 +23,7 @@ else Build-Depends: base < 3 - Build-Depends: haskell98, template-haskell+ Build-Depends: haskell98, template-haskell, byteorder Exposed-Modules: Data.Storable.Endian Extensions: MagicHash