{-# LANGUAGE CPP, ForeignFunctionInterface #-}
module System.Endian
( Endianness(..)
, getSystemEndianness
, fromLE32
, fromLE64
, fromLE16
, toLE32
, toLE64
, toLE16
, fromBE32
, fromBE64
, fromBE16
, toBE32
, toBE64
, toBE16
) where
#include "MachDeps.h"
import Foreign.C.Types
import Data.Word
data Endianness = LittleEndian
| BigEndian
deriving (Int -> Endianness -> ShowS
[Endianness] -> ShowS
Endianness -> String
(Int -> Endianness -> ShowS)
-> (Endianness -> String)
-> ([Endianness] -> ShowS)
-> Show Endianness
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [Endianness] -> ShowS
$cshowList :: [Endianness] -> ShowS
show :: Endianness -> String
$cshow :: Endianness -> String
showsPrec :: Int -> Endianness -> ShowS
$cshowsPrec :: Int -> Endianness -> ShowS
Show,Endianness -> Endianness -> Bool
(Endianness -> Endianness -> Bool)
-> (Endianness -> Endianness -> Bool) -> Eq Endianness
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
/= :: Endianness -> Endianness -> Bool
$c/= :: Endianness -> Endianness -> Bool
== :: Endianness -> Endianness -> Bool
$c== :: Endianness -> Endianness -> Bool
Eq)
getSystemEndianness :: Endianness
#ifdef WORDS_BIGENDIAN
getSystemEndianness = BigEndian
#else
getSystemEndianness :: Endianness
getSystemEndianness = Endianness
LittleEndian
#endif
fromBE64 :: Word64 -> Word64
fromBE64 :: Word64 -> Word64
fromBE64 = if Endianness
getSystemEndianness Endianness -> Endianness -> Bool
forall a. Eq a => a -> a -> Bool
== Endianness
BigEndian then Word64 -> Word64
forall a. a -> a
id else Word64 -> Word64
swap64
fromLE64 :: Word64 -> Word64
fromLE64 :: Word64 -> Word64
fromLE64 = if Endianness
getSystemEndianness Endianness -> Endianness -> Bool
forall a. Eq a => a -> a -> Bool
== Endianness
LittleEndian then Word64 -> Word64
forall a. a -> a
id else Word64 -> Word64
swap64
fromBE32 :: Word32 -> Word32
fromBE32 :: Word32 -> Word32
fromBE32 = if Endianness
getSystemEndianness Endianness -> Endianness -> Bool
forall a. Eq a => a -> a -> Bool
== Endianness
BigEndian then Word32 -> Word32
forall a. a -> a
id else Word32 -> Word32
swap32
fromLE32 :: Word32 -> Word32
fromLE32 :: Word32 -> Word32
fromLE32 = if Endianness
getSystemEndianness Endianness -> Endianness -> Bool
forall a. Eq a => a -> a -> Bool
== Endianness
LittleEndian then Word32 -> Word32
forall a. a -> a
id else Word32 -> Word32
swap32
fromBE16 :: Word16 -> Word16
fromBE16 :: Word16 -> Word16
fromBE16 = if Endianness
getSystemEndianness Endianness -> Endianness -> Bool
forall a. Eq a => a -> a -> Bool
== Endianness
BigEndian then Word16 -> Word16
forall a. a -> a
id else Word16 -> Word16
swap16
fromLE16 :: Word16 -> Word16
fromLE16 :: Word16 -> Word16
fromLE16 = if Endianness
getSystemEndianness Endianness -> Endianness -> Bool
forall a. Eq a => a -> a -> Bool
== Endianness
LittleEndian then Word16 -> Word16
forall a. a -> a
id else Word16 -> Word16
swap16
toBE64 :: Word64 -> Word64
toBE64 :: Word64 -> Word64
toBE64 = Word64 -> Word64
fromBE64
toLE64 :: Word64 -> Word64
toLE64 :: Word64 -> Word64
toLE64 = Word64 -> Word64
fromLE64
toBE32 :: Word32 -> Word32
toBE32 :: Word32 -> Word32
toBE32 = Word32 -> Word32
fromBE32
toLE32 :: Word32 -> Word32
toLE32 :: Word32 -> Word32
toLE32 = Word32 -> Word32
fromLE32
toBE16 :: Word16 -> Word16
toBE16 :: Word16 -> Word16
toBE16 = Word16 -> Word16
fromBE16
toLE16 :: Word16 -> Word16
toLE16 :: Word16 -> Word16
toLE16 = Word16 -> Word16
fromLE16
#if MIN_VERSION_base(4,7,0)
swap16 :: Word16 -> Word16
swap16 :: Word16 -> Word16
swap16 = Word16 -> Word16
byteSwap16
swap32 :: Word32 -> Word32
swap32 :: Word32 -> Word32
swap32 = Word32 -> Word32
byteSwap32
swap64 :: Word64 -> Word64
swap64 :: Word64 -> Word64
swap64 = Word64 -> Word64
byteSwap64
#else
{-# INLINE swap16 #-}
swap16 :: Word16 -> Word16
swap16 = fromIntegral . c_swap16 . fromIntegral
{-# INLINE swap32 #-}
swap32 :: Word32 -> Word32
swap32 = fromIntegral . c_swap32 . fromIntegral
{-# INLINE swap64 #-}
swap64 :: Word64 -> Word64
swap64 = fromIntegral . c_swap64 . fromIntegral
foreign import ccall unsafe "bitfn_swap16" c_swap16 :: CUShort -> CUShort
foreign import ccall unsafe "bitfn_swap32" c_swap32 :: CUInt -> CUInt
foreign import ccall unsafe "bitfn_swap64" c_swap64 :: CULLong -> CULLong
#endif