packages feed

base16 0.1.1 → 0.1.2

raw patch · 5 files changed

+64/−42 lines, 5 filesPVP ok

version bump matches the API change (PVP)

API changes (from Hackage documentation)

Files

CHANGELOG.md view
@@ -1,5 +1,14 @@ # Revision history for base16 ++## 0.1.2 -- 2020-02-17++* Unmask loops - now correct.++## 0.1.1 -- 2020-02-17++* Mask `Word32` and `Word64` loops (flaky)+ ## 0.1.0.0 -- 2020-02-16  * First version. Released on an unsuspecting world.
base16.cabal view
@@ -1,6 +1,6 @@ cabal-version:      2.0 name:               base16-version:            0.1.1+version:            0.1.2 synopsis:           RFC 4648-compliant Base16 encodings/decodings description:   RFC 4648-compliant Base16 encodings and decodings.
src/Data/ByteString/Base16/Internal/Head.hs view
@@ -13,13 +13,13 @@  import Data.ByteString.Internal import Data.ByteString.Base16.Internal.Tables--- #if WORD_SIZE_IN_BITS >= 32--- import Data.ByteString.Base16.Internal.W32.Loop--- #elif WORD_SIZE_IN_BITS >= 64--- import Data.ByteString.Base16.Internal.W64.Loop--- #else+#if WORD_SIZE_IN_BITS == 32+import Data.ByteString.Base16.Internal.W32.Loop+#elif WORD_SIZE_IN_BITS >= 64+import Data.ByteString.Base16.Internal.W64.Loop+#else import Data.ByteString.Base16.Internal.W16.Loop--- #endif+#endif import Data.Text (Text)  import Foreign.Ptr
src/Data/ByteString/Base16/Internal/W32/Loop.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE MagicHash #-}+{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE TypeApplications #-} -- | -- Module       : Data.ByteString.Base16.Internal.W32.Loop@@ -98,6 +99,10 @@   -> IO (Either Text ByteString) decodeLoop !dfp !hi !lo !dptr !sptr !end = go dptr sptr 0   where+    err !src = return . Left . T.pack+      $ "invalid character at offset: "+      ++ show (src `minusPtr` sptr)+     tailRound16 !dst !src !n       | src == end = return (Right (PS dfp 0 n))       | otherwise = do@@ -135,11 +140,11 @@          let !zz = fromIntegral (a .|. b)                .|. (unsafeShiftL (fromIntegral (c .|. d)) 8)--        if a .|. b .|. c .|. d == 0xff-        then return . Left . T.pack-          $ "invalid character at offset: "-          ++ show (src `minusPtr` sptr)-        else do-          poke @Word16 dst zz-          go (plusPtr dst 2) (plusPtr src 4) (n + 2)+        if+          | a == 0xff -> err src+          | b == 0xff -> err (plusPtr src 1)+          | c == 0xff -> err (plusPtr src 2)+          | d == 0xff -> err (plusPtr src 3)+          | otherwise -> do+            poke @Word16 dst zz+            go (plusPtr dst 2) (plusPtr src 4) (n + 2)
src/Data/ByteString/Base16/Internal/W64/Loop.hs view
@@ -1,6 +1,7 @@ {-# LANGUAGE BangPatterns #-} {-# LANGUAGE CPP #-} {-# LANGUAGE MagicHash #-}+{-# LANGUAGE MultiWayIf #-} {-# LANGUAGE TypeApplications #-} -- | -- Module       : Data.ByteString.Base16.Internal.W64.Loop@@ -141,6 +142,10 @@   -> IO (Either Text ByteString) decodeLoop !dfp !hi !lo !dptr !sptr !end = go dptr sptr 0   where+    err !src = return . Left . T.pack+      $ "invalid character at offset: "+      ++ show (src `minusPtr` sptr)+     tailRound16 !dst !src !n       | src == end = return (Right (PS dfp 0 n))       | otherwise = do@@ -150,16 +155,15 @@         !a <- peekByteOff @Word8 hi (fromIntegral x)         !b <- peekByteOff @Word8 lo (fromIntegral y) -        if a == 0xff || b == 0xff-        then return . Left . T.pack-          $ "invalid character at offset: "-          ++ show (src `minusPtr` sptr)-        else do-          poke dst (a .|. b)-          go (plusPtr dst 1) (plusPtr src 2) (n + 1)+        if+          | a == 0xff -> err src+          | b == 0xff -> err (plusPtr src 1)+          | otherwise -> do+            poke dst (a .|. b)+            go (plusPtr dst 1) (plusPtr src 2) (n + 1)      tailRound32 !dst !src !n-      | plusPtr src 4 >= end = tailRound16 (castPtr dst) (castPtr src) n+      | plusPtr src 3 >= end = tailRound16 (castPtr dst) (castPtr src) n       | otherwise = do #ifdef WORDS_BIGENDIAN         !t <- peek @Word32 src@@ -176,21 +180,20 @@         !c <- peekByteOff @Word8 hi y         !d <- peekByteOff @Word8 lo z -        let !xx = fromIntegral (a .|. b)-            !yy = fromIntegral (c .|. d)--        let !zz = xx .|. (unsafeShiftL yy 8)+        let !zz = fromIntegral (a .|. b)+               .|. (unsafeShiftL (fromIntegral (c .|. d)) 8) -        if a .|. b .|. c .|. d == 0xff-        then return . Left . T.pack-          $ "invalid character at offset: "-          ++ show (src `minusPtr` sptr)-        else do-          poke @Word16 dst zz-          go (plusPtr dst 2) (plusPtr src 4) (n + 2)+        if+          | a == 0xff -> err src+          | b == 0xff -> err (plusPtr src 1)+          | c == 0xff -> err (plusPtr src 2)+          | d == 0xff -> err (plusPtr src 3)+          | otherwise -> do+            poke @Word16 dst zz+            go (plusPtr dst 2) (plusPtr src 4) (n + 2)      go !dst !src !n-      | plusPtr src 8 >= end = tailRound32 (castPtr dst) (castPtr src) n+      | plusPtr src 7 >= end = tailRound32 (castPtr dst) (castPtr src) n       | otherwise = do #ifdef WORDS_BIGENDIAN         !tt <- peek @Word64 src@@ -220,10 +223,15 @@                .|. (unsafeShiftL (fromIntegral (e .|. f)) 16)                .|. (unsafeShiftL (fromIntegral (g .|. h)) 24) -        if a .|. b .|. c .|. d .|. e .|. f .|. g .|. h == 0xff-        then return . Left . T.pack-          $ "invalid character at offset: "-          ++ show (src `minusPtr` sptr)-        else do-          poke @Word32 dst zz-          go (plusPtr dst 4) (plusPtr src 8) (n + 4)+        if+          | a == 0xff -> err src+          | b == 0xff -> err (plusPtr src 1)+          | c == 0xff -> err (plusPtr src 2)+          | d == 0xff -> err (plusPtr src 3)+          | e == 0xff -> err (plusPtr src 4)+          | f == 0xff -> err (plusPtr src 5)+          | g == 0xff -> err (plusPtr src 6)+          | h == 0xff -> err (plusPtr src 7)+          | otherwise -> do+            poke @Word32 dst zz+            go (plusPtr dst 4) (plusPtr src 8) (n + 4)