packages feed

xor-0.0.1.4: src/Endianness.hs

{-# LANGUAGE CPP         #-}
{-# LANGUAGE Haskell2010 #-}

-- |
-- Copyright: © 2019-2020  Herbert Valerio Riedel
-- SPDX-License-Identifier: GPL-2.0-or-later
--
module Endianness
    ( Word8, Word16, Word32, Word64
    , ByteOrder(LittleEndian,BigEndian), targetByteOrder

    , byteSwap16
    , byteSwap32
    , byteSwap64

    , pokeWord16be
    , pokeWord32be
    , pokeWord64be
    , peekWord16be
    , peekWord32be
    , peekWord64be

    ) where

import           Data.Word        (Word16, Word32, Word64, Word8)
import           Data.Word        (byteSwap16, byteSwap32, byteSwap64)
import           Foreign.Ptr
import           Foreign.Storable
import           GHC.ByteOrder    (ByteOrder (..), targetByteOrder)

pokeWord16be :: Ptr Word16 -> Word16 -> IO ()
pokeWord16be = case targetByteOrder of
  BigEndian    -> poke
  LittleEndian -> \p w -> poke p (byteSwap16 w)

pokeWord32be :: Ptr Word32 -> Word32 -> IO ()
pokeWord32be = case targetByteOrder of
  BigEndian    -> poke
  LittleEndian -> \p w -> poke p (byteSwap32 w)

pokeWord64be :: Ptr Word64 -> Word64 -> IO ()
pokeWord64be = case targetByteOrder of
  BigEndian    -> poke
  LittleEndian -> \p w -> poke p (byteSwap64 w)


peekWord16be :: Ptr Word16 -> IO Word16
peekWord16be = case targetByteOrder of
  BigEndian    -> peek
  LittleEndian -> \p -> fmap byteSwap16 (peek p)

peekWord32be :: Ptr Word32 -> IO Word32
peekWord32be = case targetByteOrder of
  BigEndian    -> peek
  LittleEndian -> \p -> fmap byteSwap32 (peek p)

peekWord64be :: Ptr Word64 -> IO Word64
peekWord64be = case targetByteOrder of
  BigEndian    -> peek
  LittleEndian -> \p -> fmap byteSwap64 (peek p)