base16-bytestring 0.1.1.2 → 0.1.1.3
raw patch · 4 files changed
+76/−32 lines, 4 filesdep +ghc-primdep ~basePVP ok
version bump matches the API change (PVP)
Dependencies added: ghc-prim
Dependency ranges changed: base
API changes (from Hackage documentation)
Files
- Data/ByteString/Base16.hs +63/−20
- Data/ByteString/Base16/Lazy.hs +1/−1
- README.markdown +4/−4
- base16-bytestring.cabal +8/−7
Data/ByteString/Base16.hs view
@@ -1,11 +1,11 @@-{-# LANGUAGE BangPatterns #-}+{-# LANGUAGE BangPatterns, MagicHash #-} -- | -- Module : Data.ByteString.Base16 -- Copyright : (c) 2011 MailRank, Inc. -- -- License : BSD--- Maintainer : bos@mailrank.com+-- Maintainer : bos@serpentine.com -- Stability : experimental -- Portability : GHC --@@ -17,16 +17,16 @@ , decode ) where -import Control.Monad (forM_)-import Data.Bits ((.&.), shiftL, shiftR) import Data.ByteString.Char8 (empty) import Data.ByteString.Internal (ByteString(..), createAndTrim', unsafeCreate)-import Data.Word (Word8)+import Data.Bits (shiftL) import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)-import Foreign.Marshal.Alloc (mallocBytes) import Foreign.Ptr (Ptr, minusPtr, plusPtr) import Foreign.Storable (peek, poke) import System.IO.Unsafe (unsafePerformIO)+import GHC.Prim+import GHC.Types+import GHC.Word -- | Encode a string into base16 form. The result will always be a -- multiple of 2 bytes in length.@@ -47,16 +47,45 @@ go s d | s == e = return () | otherwise = do x <- peek8 s- poke d =<< (peek (digits `plusPtr` (x `shiftR` 4)) :: IO Word8)- poke (d `plusPtr` 1) =<< (peek (digits `plusPtr` (x .&. 0xf)) :: IO Word8)+ poke d (tlookup tableHi x)+ poke (d `plusPtr` 1) (tlookup tableLo x) go (s `plusPtr` 1) (d `plusPtr` 2)- digits :: Ptr Word8- !digits = unsafePerformIO $ do- ptr <- mallocBytes 16- forM_ (zip [0..] "0123456789abcdef") $ \(i,c) ->- poke (ptr `plusPtr` i) ((fromIntegral (fromEnum c)) :: Word8)- return ptr- {-# NOINLINE digits #-}+ tlookup :: Addr# -> Int -> Word8+ tlookup table (I# index) = W8# (indexWord8OffAddr# table index)+ !tableLo =+ "\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66\+ \\x30\x31\x32\x33\x34\x35\x36\x37\x38\x39\x61\x62\x63\x64\x65\x66"#+ !tableHi =+ "\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\x30\+ \\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\x31\+ \\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\x32\+ \\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\x33\+ \\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\x34\+ \\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\x35\+ \\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\x36\+ \\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\x37\+ \\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\x38\+ \\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\x39\+ \\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\x61\+ \\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\x62\+ \\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\x63\+ \\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\x64\+ \\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\x65\+ \\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66\x66"# -- | Decode a string from base16 form. The first element of the -- returned tuple contains the decoded data. The second element starts@@ -78,11 +107,6 @@ go s d | s == e = let len = e `minusPtr` sptr in return (0, len `div` 2, ps sfp (soff+len) (slen-len)) | otherwise = do- let hex w- | w >= 48 && w <= 57 = w - 48- | w >= 97 && w <= 102 = w - 97 + 10- | w >= 65 && w <= 70 = w - 65 + 10- | otherwise = 0xff hi <- hex `fmap` peek8 s lo <- hex `fmap` peek8 (s `plusPtr` 1) if lo == 0xff || hi == 0xff@@ -91,6 +115,25 @@ else do poke d . fromIntegral $ lo + (hi `shiftL` 4) go (s `plusPtr` 2) (d `plusPtr` 1)++ hex (I# index) = W8# $ indexWord8OffAddr# table index+ !table =+ "\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\+ \\xff\xff\xff\xff\xff\xff\xff\xff\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\+ \\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\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"# peek8 :: Ptr Word8 -> IO Int peek8 p = fromIntegral `fmap` peek p
Data/ByteString/Base16/Lazy.hs view
@@ -5,7 +5,7 @@ -- Copyright : (c) 2011 MailRank, Inc. -- -- License : BSD--- Maintainer : bos@mailrank.com+-- Maintainer : bos@serpentine.com -- Stability : experimental -- Portability : GHC --
README.markdown view
@@ -18,11 +18,11 @@ # Get involved! Please report bugs via the-[bitbucket issue tracker](http://github.com/mailrank/base16-bytestring).+[github issue tracker](http://github.com/bos/base16-bytestring). -Master [github repository](http://github.com/mailrank/base16-bytestring):+Master [github repository](http://github.com/bos/base16-bytestring): -* `git clone git://github.com/mailrank/base16-bytestring.git`+* `git clone git://github.com/bos/base16-bytestring.git` There's also a [Mercurial mirror](http://bitbucket.org/bos/base16-bytestring): @@ -34,4 +34,4 @@ # Authors This library is written and maintained by Bryan O'Sullivan,-<bos@mailrank.com>.+<bos@serpentine.com>.
base16-bytestring.cabal view
@@ -1,9 +1,9 @@ name: base16-bytestring-version: 0.1.1.2-synopsis: Fast base16 (hex) encoding and deconding for ByteStrings-description: Fast base16 (hex) encoding and deconding for ByteStrings-homepage: http://github.com/mailrank/base16-bytestring-bug-reports: http://github.com/mailrank/base16-bytestring/issues+version: 0.1.1.3+synopsis: Fast base16 (hex) encoding and decoding for ByteStrings+description: Fast base16 (hex) encoding and decoding for ByteStrings+homepage: http://github.com/bos/base16-bytestring+bug-reports: http://github.com/bos/base16-bytestring/issues license: BSD3 license-file: LICENSE copyright: Copyright 2011 MailRank, Inc.@@ -23,14 +23,15 @@ build-depends: base == 4.*,- bytestring == 0.9.*+ bytestring == 0.9.*,+ ghc-prim ghc-options: -Wall -funbox-strict-fields ghc-prof-options: -auto-all source-repository head type: git- location: http://github.com/mailrank/base16-bytestring+ location: http://github.com/bos/base16-bytestring source-repository head type: mercurial