{-# LANGUAGE BangPatterns #-} {-# LANGUAGE MagicHash #-} {-# LANGUAGE MultiWayIf #-} {-# LANGUAGE OverloadedStrings #-} module Data.ByteString.Base16.Internal.W16.ShortLoop ( innerLoop , decodeLoop , decodeLoopTyped , lenientLoop ) where import Control.Monad.ST import Data.Bits import Data.ByteString.Base16.Internal.Utils import Data.Primitive.ByteArray import Data.Text (Text) import qualified Data.Text as T innerLoop :: Int -> MutableByteArray s -> MutableByteArray s -> ST s () innerLoop :: forall s. Int -> MutableByteArray s -> MutableByteArray s -> ST s () innerLoop !Int slen !MutableByteArray s dst !MutableByteArray s src = Int -> Int -> ST s () go (Int 0 :: Int) (Int 0 :: Int) where !hex :: Addr# hex = Addr# "0123456789abcdef"# go :: Int -> Int -> ST s () go !Int doff !Int soff | Int soff forall a. Eq a => a -> a -> Bool == Int slen = forall (m :: * -> *) a. Monad m => a -> m a return () | Bool otherwise = do Word8 x <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src Int soff forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> a -> m () writeByteArray MutableByteArray s dst Int doff (Word8 -> Addr# -> Word8 aix (forall a. Bits a => a -> Int -> a unsafeShiftR Word8 x Int 4) Addr# hex) forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> a -> m () writeByteArray MutableByteArray s dst (Int doff forall a. Num a => a -> a -> a + Int 1) (Word8 -> Addr# -> Word8 aix (Word8 x forall a. Bits a => a -> a -> a .&. Word8 0x0f) Addr# hex) Int -> Int -> ST s () go (Int doff forall a. Num a => a -> a -> a + Int 2) (Int soff forall a. Num a => a -> a -> a + Int 1) {-# inline innerLoop #-} decodeLoop :: Int -> MutableByteArray s -> MutableByteArray s -> ST s (Either Text ByteArray) decodeLoop :: forall s. Int -> MutableByteArray s -> MutableByteArray s -> ST s (Either Text ByteArray) decodeLoop !Int slen !MutableByteArray s dst !MutableByteArray s src = Int -> Int -> ST s (Either Text ByteArray) go (Int 0 :: Int) (Int 0 :: Int) where err :: a -> m (Either Text b) err a i = forall (m :: * -> *) a. Monad m => a -> m a return forall b c a. (b -> c) -> (a -> b) -> a -> c . forall a b. a -> Either a b Left forall b c a. (b -> c) -> (a -> b) -> a -> c . [Char] -> Text T.pack forall a b. (a -> b) -> a -> b $ [Char] "invalid character at offset: " forall a. [a] -> [a] -> [a] ++ forall a. Show a => a -> [Char] show a i !lo :: Addr# lo = Addr# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# !hi :: Addr# hi = Addr# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x10\x20\x30\x40\x50\x60\x70\x80\x90\xff\xff\xff\xff\xff\xff\xff\xa0\xb0\xc0\xd0\xe0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\xb0\xc0\xd0\xe0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# go :: Int -> Int -> ST s (Either Text ByteArray) go !Int doff !Int soff | Int soff forall a. Eq a => a -> a -> Bool == Int slen = forall a b. b -> Either a b Right forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b <$> forall (m :: * -> *). PrimMonad m => MutableByteArray (PrimState m) -> m ByteArray unsafeFreezeByteArray MutableByteArray s dst | Bool otherwise = do Word8 x <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src Int soff Word8 y <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src (Int soff forall a. Num a => a -> a -> a + Int 1) let !a :: Word8 a = Word8 -> Addr# -> Word8 aix Word8 x Addr# hi !b :: Word8 b = Word8 -> Addr# -> Word8 aix Word8 y Addr# lo if | Word8 a forall a. Eq a => a -> a -> Bool == Word8 0xff -> forall {m :: * -> *} {a} {b}. (Monad m, Show a) => a -> m (Either Text b) err Int soff | Word8 b forall a. Eq a => a -> a -> Bool == Word8 0xff -> forall {m :: * -> *} {a} {b}. (Monad m, Show a) => a -> m (Either Text b) err (Int soff forall a. Num a => a -> a -> a + Int 1) | Bool otherwise -> do forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> a -> m () writeByteArray MutableByteArray s dst Int doff (Word8 a forall a. Bits a => a -> a -> a .|. Word8 b) Int -> Int -> ST s (Either Text ByteArray) go (Int doff forall a. Num a => a -> a -> a + Int 1) (Int soff forall a. Num a => a -> a -> a + Int 2) {-# inline decodeLoop #-} decodeLoopTyped :: Int -> MutableByteArray s -> MutableByteArray s -> ST s ByteArray decodeLoopTyped :: forall s. Int -> MutableByteArray s -> MutableByteArray s -> ST s ByteArray decodeLoopTyped !Int slen !MutableByteArray s dst !MutableByteArray s src = Int -> Int -> ST s ByteArray go (Int 0 :: Int) (Int 0 :: Int) where !lo :: Addr# lo = Addr# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# !hi :: Addr# hi = Addr# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x10\x20\x30\x40\x50\x60\x70\x80\x90\xff\xff\xff\xff\xff\xff\xff\xa0\xb0\xc0\xd0\xe0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\xb0\xc0\xd0\xe0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# go :: Int -> Int -> ST s ByteArray go !Int doff !Int soff | Int soff forall a. Eq a => a -> a -> Bool == Int slen = forall (m :: * -> *). PrimMonad m => MutableByteArray (PrimState m) -> m ByteArray unsafeFreezeByteArray MutableByteArray s dst | Bool otherwise = do Word8 x <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src Int soff Word8 y <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src (Int soff forall a. Num a => a -> a -> a + Int 1) let !a :: Word8 a = Word8 -> Addr# -> Word8 aix Word8 x Addr# hi !b :: Word8 b = Word8 -> Addr# -> Word8 aix Word8 y Addr# lo forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> a -> m () writeByteArray MutableByteArray s dst Int doff (Word8 a forall a. Bits a => a -> a -> a .|. Word8 b) Int -> Int -> ST s ByteArray go (Int doff forall a. Num a => a -> a -> a + Int 1) (Int soff forall a. Num a => a -> a -> a + Int 2) {-# inline decodeLoopTyped #-} lenientLoop :: Int -> MutableByteArray s -> MutableByteArray s -> ST s Int lenientLoop :: forall s. Int -> MutableByteArray s -> MutableByteArray s -> ST s Int lenientLoop !Int slen !MutableByteArray s dst !MutableByteArray s src = Int -> Int -> ST s Int goHi (Int 0 :: Int) (Int 0 :: Int) where !lo :: Addr# lo = Addr# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\xff\xff\xff\xff\xff\xff\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x0a\x0b\x0c\x0d\x0e\x0f\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# !hi :: Addr# hi = Addr# "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\x00\x10\x20\x30\x40\x50\x60\x70\x80\x90\xff\xff\xff\xff\xff\xff\xff\xa0\xb0\xc0\xd0\xe0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xa0\xb0\xc0\xd0\xe0\xf0\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"# goHi :: Int -> Int -> ST s Int goHi !Int doff !Int soff | Int soff forall a. Eq a => a -> a -> Bool == Int slen = forall (m :: * -> *) a. Monad m => a -> m a return Int doff | Bool otherwise = do Word8 x <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src Int soff let !a :: Word8 a = Word8 -> Addr# -> Word8 aix Word8 x Addr# hi if Word8 a forall a. Eq a => a -> a -> Bool == Word8 0xff then Int -> Int -> ST s Int goHi Int doff (Int soff forall a. Num a => a -> a -> a + Int 1) else Int -> Int -> Word8 -> ST s Int goLo Int doff (Int soff forall a. Num a => a -> a -> a + Int 1) Word8 a goLo :: Int -> Int -> Word8 -> ST s Int goLo !Int doff !Int soff !Word8 a | Int soff forall a. Eq a => a -> a -> Bool == Int slen = forall (m :: * -> *) a. Monad m => a -> m a return Int doff | Bool otherwise = do Word8 y <- forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> m a readByteArray MutableByteArray s src Int soff let !b :: Word8 b = Word8 -> Addr# -> Word8 aix Word8 y Addr# lo if Word8 b forall a. Eq a => a -> a -> Bool == Word8 0xff then Int -> Int -> Word8 -> ST s Int goLo Int doff (Int soff forall a. Num a => a -> a -> a + Int 1) Word8 a else do forall a (m :: * -> *). (Prim a, PrimMonad m) => MutableByteArray (PrimState m) -> Int -> a -> m () writeByteArray MutableByteArray s dst Int doff (Word8 a forall a. Bits a => a -> a -> a .|. Word8 b) Int -> Int -> ST s Int goHi (Int doff forall a. Num a => a -> a -> a + Int 1) (Int soff forall a. Num a => a -> a -> a + Int 1) {-# inline lenientLoop #-}