diff options
author | Joey Hess <joey@kitenet.net> | 2013-09-16 12:57:39 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2013-09-16 12:57:39 -0400 |
commit | 1ffd9ec9830df8200cc0e0baad11dcf86387e508 (patch) | |
tree | 88446df75733b5fdd4c2e5d7a6188c3b767521e1 /Utility/Format.hs | |
parent | 17f7274cd8022bfbc0472a584604e6ceb9b8f14a (diff) |
gpg secret keys list parsing
Note that Utility.Format.prop_idempotent_deencode does not hold
now that hex escaped characters are supported. quickcheck fails to notice
this, so I have left it as-is for now.
Diffstat (limited to 'Utility/Format.hs')
-rw-r--r-- | Utility/Format.hs | 11 |
1 files changed, 8 insertions, 3 deletions
diff --git a/Utility/Format.hs b/Utility/Format.hs index 97a966ac1..e7a27515e 100644 --- a/Utility/Format.hs +++ b/Utility/Format.hs @@ -15,7 +15,7 @@ module Utility.Format ( ) where import Text.Printf (printf) -import Data.Char (isAlphaNum, isOctDigit, isSpace, chr, ord) +import Data.Char (isAlphaNum, isOctDigit, isHexDigit, isSpace, chr, ord) import Data.Maybe (fromMaybe) import Data.Word (Word8) import Data.List (isPrefixOf) @@ -101,7 +101,7 @@ empty (Const "") = True empty _ = False {- Decodes a C-style encoding, where \n is a newline, \NNN is an octal - - encoded character, etc. + - encoded character, and \xNN is a hex encoded character. -} decode_c :: FormatString -> FormatString decode_c [] = [] @@ -114,7 +114,12 @@ decode_c s = unescape ("", s) where pair = span (/= e) v isescape x = x == e - -- \NNN is an octal encoded character + handle (x:'x':n1:n2:rest) + | isescape x && allhex = (fromhex, rest) + where + allhex = isHexDigit n1 && isHexDigit n2 + fromhex = [chr $ readhex [n1, n2]] + readhex h = Prelude.read $ "0x" ++ h :: Int handle (x:n1:n2:n3:rest) | isescape x && alloctal = (fromoctal, rest) where |