diff options
Diffstat (limited to 'src/Data/ByteString/Base32.hs')
-rw-r--r-- | src/Data/ByteString/Base32.hs | 26 |
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 | ||
65 | type EncTable = Ptr Word8 | 65 | unpack5Ptr :: Ptr Word8 -> ByteString -> ByteString |
66 | 66 | unpack5Ptr !tbl bs @ (PS fptr off sz) = | |
67 | unpack5 :: EncTable -> ByteString -> ByteString | ||
68 | unpack5 !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 | ||
133 | type EncTable = ByteString | ||
134 | |||
135 | unpack5 :: EncTable -> ByteString -> ByteString | ||
136 | unpack5 (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 | |||
135 | encW5 :: Word5 -> Word8 | 144 | encW5 :: Word5 -> Word8 |
136 | encW5 !x | 145 | encW5 !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 | ||
141 | encTable :: ForeignPtr Word8 | 150 | encTable :: EncTable |
142 | PS encTable _ _ = BS.pack $ fmap encW5 [0..31] | 151 | encTable = BS.pack $ fmap encW5 [0..31] |
143 | 152 | ||
144 | -- | Encode a bytestring into base32 form. | 153 | -- | Encode a bytestring into base32 form. |
145 | encode :: ByteString -> ByteString | 154 | encode :: ByteString -> ByteString |
146 | encode bs = | 155 | encode = unpack5 encTable |
147 | unsafePerformIO $ do | ||
148 | withForeignPtr encTable $ \ptr -> do | ||
149 | return $ unpack5 ptr bs | ||
150 | 156 | ||
151 | {----------------------------------------------------------------------- | 157 | {----------------------------------------------------------------------- |
152 | -- Decoding | 158 | -- Decoding |