module Text.Show.ByteString.Char where
import Data.Binary
import Data.Char
import Text.Show.ByteString.Util
asciiTab :: [String]
asciiTab = ["NUL", "SOH", "STX", "ETX", "EOT", "ENQ", "ACK", "BEL",
"BS", "HT", "LF", "VT", "FF", "CR", "SO", "SI",
"DLE", "DC1", "DC2", "DC3", "DC4", "NAK", "SYN", "ETB",
"CAN", "EM", "SUB", "ESC", "FS", "GS", "RS", "US", "SP"]
putLitChar :: Char -> Put
putLitChar '\DEL' = putAsciiStr "\\DEL"
putLitChar '\\' = putAscii '\\' >> putAscii '\\'
putLitChar c | c >= ' ' = putUTF8 c
putLitChar '\a' = putAscii '\\' >> putAscii 'a'
putLitChar '\b' = putAscii '\\' >> putAscii 'b'
putLitChar '\f' = putAscii '\\' >> putAscii 'f'
putLitChar '\n' = putAscii '\\' >> putAscii 'n'
putLitChar '\r' = putAscii '\\' >> putAscii 'r'
putLitChar '\t' = putAscii '\\' >> putAscii 't'
putLitChar '\v' = putAscii '\\' >> putAscii 'v'
putLitChar '\SO' = putAscii '\\' >> putAscii 'S' >> putAscii 'O'
putLitChar c = putAscii '\\' >> putAsciiStr (asciiTab !! ord c)
showpChar :: Char -> Put
showpChar c = putAscii '\'' >> putEscaped c >> putAscii '\''
where
putEscaped '\'' = putAscii '\\' >> putAscii '\''
putEscaped c' = putLitChar c'
showpString :: String -> Put
showpString xs = putAscii '"' >> mapM_ putEscaped xs >> putAscii '"'
where
putEscaped '"' = putAscii '\\' >> putAscii '"'
putEscaped '\SO' = putAsciiStr "\\SO\\&"
putEscaped c = putLitChar c