module Codec.Binary.PythonString
( encode
, decode
, decode'
, chop
, unchop
) where
import Data.Char
import Data.Word
import Codec.Binary.Util
encode :: [Word8]
-> String
encode [] = ""
encode (o : os)
| o < 0x20 || o > 0x7e = ('\\' : 'x' : toHex o) ++ encode os
| o == 34 = "\\\"" ++ encode os
| o == 39 = "\\'" ++ encode os
| o == 92 = "\\\\" ++ encode os
| otherwise = chr (fromIntegral o) : encode os
decode' :: String
-> [Maybe Word8]
decode' [] = []
decode' ('\\':'x' : c0 : c1 : cs) = fromHex [c0, c1] : decode' cs
decode' ('\\':'\\' : cs) = (Just $ fromIntegral $ ord '\\') : decode' cs
decode' ('\\':'\'' : cs) = (Just $ fromIntegral $ ord '\'') : decode' cs
decode' ('\\':'\"' : cs) = (Just $ fromIntegral $ ord '\"') : decode' cs
decode' (c : cs)
| c /= '\\' = (Just $ fromIntegral $ ord c) : decode' cs
| otherwise = [Nothing]
decode :: String -> Maybe [Word8]
decode = sequence . decode'
chop :: Int
-> String
-> [String]
chop n = let
_n = max 1 n
_chop [] = []
_chop cs = take _n cs : _chop (drop _n cs)
in _chop
unchop :: [String]
-> String
unchop = foldr (++) ""