{-# LANGUAGE CPP #-}
module Unicode.Internal.Bits
(
lookupBit,
lookupWord8AsInt,
lookupWord8AsInt#,
lookupWord16AsInt,
lookupWord16AsInt#,
lookupWord32#,
unpackCString#
) where
#include "MachDeps.h"
import GHC.Exts
(Addr#, Int(..), Int#, Word(..), Word#, indexWord8OffAddr#,
indexWord16OffAddr#, indexWord32OffAddr#,
and#, word2Int#, uncheckedShiftL#)
#if MIN_VERSION_base(4,16,0)
import GHC.Exts (word8ToWord#, word16ToWord#, word32ToWord#)
#endif
#ifdef WORDS_BIGENDIAN
import GHC.Exts
(narrow16Word#, narrow32Word#,
byteSwap16#, byteSwap32#)
#endif
#if MIN_VERSION_base(4,15,0)
import GHC.Exts (unpackCString#)
#else
import GHC.CString (unpackCString#)
#endif
lookupBit :: Addr# -> Int -> Int -> Bool
lookupBit :: Addr# -> Int -> Int -> Bool
lookupBit Addr#
addr# (I# Int#
byteIndex#) (I# Int#
bitIndex#) =
Word# -> Word
W# (Word#
word## Word# -> Word# -> Word#
`and#` Word#
bitMask##) Word -> Word -> Bool
forall a. Eq a => a -> a -> Bool
/= Word
0
where
#if MIN_VERSION_base(4,16,0)
word## :: Word#
word## = Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
addr# Int#
byteIndex#)
#else
word## = indexWord8OffAddr# addr# byteIndex#
#endif
bitMask## :: Word#
bitMask## = Word#
1## Word# -> Int# -> Word#
`uncheckedShiftL#` Int#
bitIndex#
lookupWord8AsInt
:: Addr#
-> Int
-> Int
lookupWord8AsInt :: Addr# -> Int -> Int
lookupWord8AsInt Addr#
addr# (I# Int#
index#) = Int# -> Int
I# (Addr# -> Int# -> Int#
lookupWord8AsInt# Addr#
addr# Int#
index#)
lookupWord8AsInt#
:: Addr#
-> Int#
-> Int#
lookupWord8AsInt# :: Addr# -> Int# -> Int#
lookupWord8AsInt# Addr#
addr# Int#
index# = Word# -> Int#
word2Int# Word#
word##
where
#if MIN_VERSION_base(4,16,0)
word## :: Word#
word## = Word8# -> Word#
word8ToWord# (Addr# -> Int# -> Word8#
indexWord8OffAddr# Addr#
addr# Int#
index#)
#else
word## = indexWord8OffAddr# addr# index#
#endif
lookupWord16AsInt
:: Addr#
-> Int
-> Int
lookupWord16AsInt :: Addr# -> Int -> Int
lookupWord16AsInt Addr#
addr# (I# Int#
k#) = Int# -> Int
I# (Addr# -> Int# -> Int#
lookupWord16AsInt# Addr#
addr# Int#
k#)
lookupWord16AsInt#
:: Addr#
-> Int#
-> Int#
lookupWord16AsInt# :: Addr# -> Int# -> Int#
lookupWord16AsInt# Addr#
addr# Int#
k# = Word# -> Int#
word2Int# Word#
word##
where
#ifdef WORDS_BIGENDIAN
#if MIN_VERSION_base(4,16,0)
word## = narrow16Word# (byteSwap16# (word16ToWord# (indexWord16OffAddr# addr# k#)))
#else
word## = narrow16Word# (byteSwap16# (indexWord16OffAddr# addr# k#))
#endif
#elif MIN_VERSION_base(4,16,0)
word## :: Word#
word## = Word16# -> Word#
word16ToWord# (Addr# -> Int# -> Word16#
indexWord16OffAddr# Addr#
addr# Int#
k#)
#else
word## = indexWord16OffAddr# addr# k#
#endif
lookupWord32#
:: Addr#
-> Int#
-> Word#
lookupWord32# :: Addr# -> Int# -> Word#
lookupWord32#
#ifdef WORDS_BIGENDIAN
#if MIN_VERSION_base(4,16,0)
addr# k# = narrow32Word# (byteSwap32# (word32ToWord# (indexWord32OffAddr# addr# k#)))
#else
addr# k# = narrow32Word# (byteSwap32# (indexWord32OffAddr# addr# k#))
#endif
#elif MIN_VERSION_base(4,16,0)
Addr#
addr# Int#
k# = Word32# -> Word#
word32ToWord# (Addr# -> Int# -> Word32#
indexWord32OffAddr# Addr#
addr# Int#
k#)
#else
= indexWord32OffAddr#
#endif