module Data.Endian ( Endian(..), ourEndian ) where
import Foreign
data Endian
= LittleEndian
| BigEndian
| PDPEndian
deriving (Show, Eq)
ourEndian :: Endian
ourEndian =
unsafePerformIO $
allocaArray (sizeOf (undefined :: Word32)) $ \p -> do
let val = 0x01020304 :: Word32
poke p val
let p' = castPtr p :: Ptr Word8
val' <- peekArray 4 p'
case val' of
(0x01:0x02:0x03:0x04:[]) -> return BigEndian
(0x04:0x03:0x02:0x01:[]) -> return LittleEndian
(0x03:0x04:0x01:0x02:[]) -> return PDPEndian
_ -> error "unknown endian"