base16-bytestring (empty) → 0.1.0.0
raw patch · 5 files changed
+186/−0 lines, 5 filesdep +basedep +bytestringsetup-changed
Dependencies added: base, bytestring
Files
- Data/ByteString/Base16.hs +81/−0
- LICENSE +30/−0
- README.markdown +37/−0
- Setup.hs +2/−0
- base16-bytestring.cabal +36/−0
+ Data/ByteString/Base16.hs view
@@ -0,0 +1,81 @@+{-# LANGUAGE OverloadedStrings #-}++-- |+-- Module : Data.ByteString.Base16+-- Copyright : (c) 2011 MailRank, Inc.+--+-- License : BSD+-- Maintainer : bos@mailrank.com+-- Stability : experimental+-- Portability : GHC+--+-- Fast and efficient encoding and decoding of base16-encoded strings.++module Data.ByteString.Base16+ (+ encode+ , decode+ ) where++import Data.Bits ((.&.), shiftL, shiftR)+import Data.ByteString.Char8 (empty)+import Data.ByteString.Internal (ByteString(..), createAndTrim', unsafeCreate)+import Data.ByteString.Unsafe (unsafeIndex)+import Data.Word (Word8)+import Foreign.ForeignPtr (ForeignPtr, withForeignPtr)+import Foreign.Ptr (Ptr, minusPtr, plusPtr)+import Foreign.Storable (peek, poke)+import System.IO.Unsafe (unsafePerformIO)++digits :: ByteString+digits = "0123456789abcdef"+{-# NOINLINE digits #-}++encode :: ByteString -> ByteString+encode (PS sfp soff slen)+ | slen > maxBound `div` 2 = error "Data.ByteString.Base16.encode: input too large"+ | otherwise = unsafeCreate (slen*2) $ \dptr ->+ withForeignPtr sfp $ \sptr ->+ enc (sptr `plusPtr` soff) dptr+ where+ enc sptr = go sptr where+ e = sptr `plusPtr` slen+ go s d | s == e = return ()+ | otherwise = do+ x <- peek8 s+ poke d . unsafeIndex digits $ x `shiftR` 4+ poke (d `plusPtr` 1) . unsafeIndex digits $ x .&. 0xf+ go (s `plusPtr` 1) (d `plusPtr` 2)++decode :: ByteString -> (ByteString, ByteString)+decode (PS sfp soff slen) =+ unsafePerformIO . createAndTrim' (slen `div` 2) $ \dptr ->+ withForeignPtr sfp $ \sptr ->+ dec (sptr `plusPtr` soff) dptr+ where+ dec sptr = go sptr where+ e = sptr `plusPtr` if odd slen then slen - 1 else slen+ 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+ then let len = s `minusPtr` sptr+ in return (0, len `div` 2, ps sfp (soff+len) (slen-len))+ else do+ poke d . fromIntegral $ lo + (hi `shiftL` 4)+ go (s `plusPtr` 2) (d `plusPtr` 1)++peek8 :: Ptr Word8 -> IO Int+peek8 p = fromIntegral `fmap` peek p++ps :: ForeignPtr Word8 -> Int -> Int -> ByteString+ps fp off len+ | len <= 0 = empty+ | otherwise = PS fp off len
+ LICENSE view
@@ -0,0 +1,30 @@+Copyright (c) 2011 MailRank, Inc.++All rights reserved.++Redistribution and use in source and binary forms, with or without+modification, are permitted provided that the following conditions+are met:++1. Redistributions of source code must retain the above copyright+ notice, this list of conditions and the following disclaimer.++2. Redistributions in binary form must reproduce the above copyright+ notice, this list of conditions and the following disclaimer in the+ documentation and/or other materials provided with the distribution.++3. Neither the name of the author nor the names of his contributors+ may be used to endorse or promote products derived from this software+ without specific prior written permission.++THIS SOFTWARE IS PROVIDED BY THE CONTRIBUTORS ``AS IS'' AND ANY EXPRESS+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE+DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE LIABLE FOR+ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN+ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE+POSSIBILITY OF SUCH DAMAGE.
+ README.markdown view
@@ -0,0 +1,37 @@+# Fast base16 support++This package provides a Haskell library for working with base16-encoded+data quickly and efficiently, using the ByteString type.+++# Performance++This library is written in pure Haskell, and it's fast:++* 250 MB/sec encoding++* 200 MB/sec strict decoding (per RFC 4648)++* 100 MB/sec lenient decoding+++# Get involved!++Please report bugs via the+[bitbucket issue tracker](http://github.com/mailrank/base16-bytestring).++Master [github repository](http://github.com/mailrank/base16-bytestring):++* `git clone git://github.com/mailrank/base16-bytestring.git`++There's also a [Mercurial mirror](http://bitbucket.org/bos/base16-bytestring):++* `hg clone http://bitbucket.org/bos/base16-bytestring`++(You can create and contribute changes using either git or Mercurial.)+++# Authors++This library is written and maintained by Bryan O'Sullivan,+<bos@mailrank.com>.
+ Setup.hs view
@@ -0,0 +1,2 @@+import Distribution.Simple+main = defaultMain
+ base16-bytestring.cabal view
@@ -0,0 +1,36 @@+name: base16-bytestring+version: 0.1.0.0+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://girhub.co/mailrank/base16-bytestring/issues+license: BSD3+license-file: LICENSE+copyright: Copyright 2011 MailRank, Inc.+author: Bryan O'Sullivan <bos@serpentine.com>+maintainer: Bryan O'Sullivan <bos@serpentine.com>+copyright: 2010 Bryan O'Sullivan+category: Data+build-type: Simple+extra-source-files: README.markdown++Cabal-version: >=1.6++library+ exposed-modules:+ Data.ByteString.Base16+ + build-depends:+ base == 4.*,+ bytestring == 0.9.*++ ghc-options: -Wall -funbox-strict-fields+ ghc-prof-options: -auto-all++source-repository head+ type: git+ location: http://github.com/mailrank/base16-bytestring++source-repository head+ type: mercurial+ location: http://bitbucket.org/bos/base16-bytestring