summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam T <pxqr.sta@gmail.com>2013-09-26 23:13:12 +0400
committerSam T <pxqr.sta@gmail.com>2013-09-26 23:13:12 +0400
commit861f289b2500d2576fe3572b3441e2ac868edeea (patch)
tree2a927b9cfd4acf229c7a862ab61ab52e6da89aa6
parent4a79ab996010484c38836db33e40d05e81126068 (diff)
Refactor unpack5 function
-rw-r--r--src/Data/ByteString/Base32.hs26
1 files changed, 16 insertions, 10 deletions
diff --git a/src/Data/ByteString/Base32.hs b/src/Data/ByteString/Base32.hs
index d139156..ca377e2 100644
--- a/src/Data/ByteString/Base32.hs
+++ b/src/Data/ByteString/Base32.hs
@@ -62,10 +62,8 @@ padCeilN !n !x
62-- Encoding 62-- Encoding
63-----------------------------------------------------------------------} 63-----------------------------------------------------------------------}
64 64
65type EncTable = Ptr Word8 65unpack5Ptr :: Ptr Word8 -> ByteString -> ByteString
66 66unpack5Ptr !tbl bs @ (PS fptr off sz) =
67unpack5 :: EncTable -> ByteString -> ByteString
68unpack5 !tbl bs @ (PS fptr off sz) =
69 unsafePerformIO $ do 67 unsafePerformIO $ do
70 let unpackedSize = dstSize $ BS.length bs 68 let unpackedSize = dstSize $ BS.length bs
71 BS.create unpackedSize $ \ dst -> do 69 BS.create unpackedSize $ \ dst -> do
@@ -132,21 +130,29 @@ unpack5 !tbl bs @ (PS fptr off sz) =
132 (advancePtr src 1) (pred s) 130 (advancePtr src 1) (pred s)
133 (w8 `shiftL` usd_cnt) (8 - usd_cnt) 131 (w8 `shiftL` usd_cnt) (8 - usd_cnt)
134 132
133type EncTable = ByteString
134
135unpack5 :: EncTable -> ByteString -> ByteString
136unpack5 (PS fptr off len) bs
137 | len /= 32
138 = error $ "base32: unpack5: invalid lookup table size " ++ show len
139 | otherwise =
140 unsafePerformIO $ do
141 withForeignPtr fptr $ \ptr -> do
142 return $ unpack5Ptr (ptr `advancePtr` off) bs
143
135encW5 :: Word5 -> Word8 144encW5 :: Word5 -> Word8
136encW5 !x 145encW5 !x
137 | x <= 25 = 65 + x 146 | x <= 25 = 65 + x
138 | otherwise = 24 + x 147 | otherwise = 24 + x
139{-# INLINE encW5 #-} 148{-# INLINE encW5 #-}
140 149
141encTable :: ForeignPtr Word8 150encTable :: EncTable
142PS encTable _ _ = BS.pack $ fmap encW5 [0..31] 151encTable = BS.pack $ fmap encW5 [0..31]
143 152
144-- | Encode a bytestring into base32 form. 153-- | Encode a bytestring into base32 form.
145encode :: ByteString -> ByteString 154encode :: ByteString -> ByteString
146encode bs = 155encode = unpack5 encTable
147 unsafePerformIO $ do
148 withForeignPtr encTable $ \ptr -> do
149 return $ unpack5 ptr bs
150 156
151{----------------------------------------------------------------------- 157{-----------------------------------------------------------------------
152-- Decoding 158-- Decoding