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 +9/−0
- base16.cabal +1/−1
- src/Data/ByteString/Base16/Internal/Head.hs +6/−6
- src/Data/ByteString/Base16/Internal/W32/Loop.hs +13/−8
- src/Data/ByteString/Base16/Internal/W64/Loop.hs +35/−27
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)