summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSam T <pxqr.sta@gmail.com>2013-09-26 22:39:29 +0400
committerSam T <pxqr.sta@gmail.com>2013-09-26 22:39:29 +0400
commit13dc0f086d3d8f217a2818a429ac117c97397e9b (patch)
tree1665dd8607bf4ea336e1092d7a9ad122e2638bd9
parentefc54d7c09e4e018c3729f2144a7fade49360f56 (diff)
Make decode case insensitive.
> 6. Base 32 Encoding > > The Base 32 encoding is designed to represent arbitrary sequences of > octets in a form that _needs to be case insensitive_ but that need not > be human readable.
-rw-r--r--src/Data/ByteString/Base32.hs12
-rw-r--r--tests/Data/ByteString/Base32Spec.hs8
2 files changed, 13 insertions, 7 deletions
diff --git a/src/Data/ByteString/Base32.hs b/src/Data/ByteString/Base32.hs
index 5dc025c..a5835ad 100644
--- a/src/Data/ByteString/Base32.hs
+++ b/src/Data/ByteString/Base32.hs
@@ -227,11 +227,13 @@ pack5 !tbl bs @ (PS fptr off sz) =
227 227
228decW5 :: Word8 -> Word5 228decW5 :: Word8 -> Word5
229decW5 !x 229decW5 !x
230 | x < 50 {- c2w '2' -} = invIx 230 | x < 50 {- c2w '2' -} = invIx
231 | x <= 55 {- c2w '7' -} = x - 24 231 | x <= 55 {- c2w '7' -} = x - 24 {- c2w '2' - 26 -}
232 | x < 65 {- c2w 'A' -} = invIx 232 | x < 65 {- c2w 'A' -} = invIx
233 | x <= 90 {- c2w 'Z' -} = x - 65 233 | x <= 90 {- c2w 'Z' -} = x - 65 {- c2w 'A' -}
234 | otherwise = invIx 234 | x < 97 {- c2w 'a' -} = invIx
235 | x <= 122 {- c2w 'z' -} = x - 97 {- c2w 'a' -}
236 | otherwise = invIx
235{-# INLINE decW5 #-} 237{-# INLINE decW5 #-}
236 238
237decTable :: ForeignPtr Word8 239decTable :: ForeignPtr Word8
diff --git a/tests/Data/ByteString/Base32Spec.hs b/tests/Data/ByteString/Base32Spec.hs
index ff3e13c..60e340c 100644
--- a/tests/Data/ByteString/Base32Spec.hs
+++ b/tests/Data/ByteString/Base32Spec.hs
@@ -4,8 +4,9 @@ module Data.ByteString.Base32Spec (spec) where
4import Control.Applicative 4import Control.Applicative
5import Control.Exception 5import Control.Exception
6import Data.ByteString as BS 6import Data.ByteString as BS
7import Data.ByteString.Internal as BS 7import Data.ByteString.Char8 as BC
8import Data.ByteString.Base32 as Base32 8import Data.ByteString.Base32 as Base32
9import Data.Char
9import Test.Hspec 10import Test.Hspec
10import Test.QuickCheck 11import Test.QuickCheck
11 12
@@ -29,7 +30,7 @@ spec = do
29 (BS.length (encode bs) `rem` 8) `shouldBe` 0 30 (BS.length (encode bs) `rem` 8) `shouldBe` 0
30 31
31 it "padding less than" $ property $ \bs -> 32 it "padding less than" $ property $ \bs ->
32 count (c2w '=') bs `shouldSatisfy` (< 8) 33 BC.count '=' bs `shouldSatisfy` (< 8)
33 34
34 describe "decode" $ do 35 describe "decode" $ do
35 it "conform RFC examples" $ do 36 it "conform RFC examples" $ do
@@ -44,6 +45,9 @@ spec = do
44 it "inverse for encode" $ property $ \bs -> 45 it "inverse for encode" $ property $ \bs ->
45 decode (encode bs) == bs 46 decode (encode bs) == bs
46 47
48 it "case insensitive" $ property $ \bs ->
49 decode (BC.map toLower (encode bs)) == bs
50
47 it "fail gracefully if encoded data contains non alphabet chars" $ do 51 it "fail gracefully if encoded data contains non alphabet chars" $ do
48 evaluate (decode "0=======") `shouldThrow` anyErrorCall 52 evaluate (decode "0=======") `shouldThrow` anyErrorCall
49 evaluate (decode "AAAAAAAA0=======") `shouldThrow` anyErrorCall 53 evaluate (decode "AAAAAAAA0=======") `shouldThrow` anyErrorCall