-- ---------------------------------------------------------------------------
-- |
-- Module      : Text.Show.ByteString.Char
-- Copyright   : (c) 2008 Dan Doel
-- Maintainer  : Dan Doel
-- Stability   : Experimental
-- Portability : Portable
--
-- Putting characters.
--
-- Functions based on GHC.Show in base

module Text.Show.ByteString.Char where

import Data.Binary
import Data.Char

import Text.Show.ByteString.Util

asciiTab :: [String]
asciiTab :: [String]
asciiTab = [String
"NUL", String
"SOH", String
"STX", String
"ETX", String
"EOT", String
"ENQ", String
"ACK", String
"BEL",
            String
"BS",  String
"HT",  String
"LF",  String
"VT",  String
"FF",  String
"CR",  String
"SO",  String
"SI",
            String
"DLE", String
"DC1", String
"DC2", String
"DC3", String
"DC4", String
"NAK", String
"SYN", String
"ETB",
            String
"CAN", String
"EM",  String
"SUB", String
"ESC", String
"FS",  String
"GS",  String
"RS",  String
"US", String
"SP"]

putLitChar :: Char -> Put
putLitChar :: Char -> Put
putLitChar Char
'\DEL' = String -> Put
putAsciiStr String
"\\DEL"
putLitChar Char
'\\'   = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'\\'
putLitChar Char
c | Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= Char
' ' = Char -> Put
putUTF8 Char
c
putLitChar Char
'\a' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'a'
putLitChar Char
'\b' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'b'
putLitChar Char
'\f' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'f'
putLitChar Char
'\n' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'n'
putLitChar Char
'\r' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'r'
putLitChar Char
'\t' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
't'
putLitChar Char
'\v' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'v'
putLitChar Char
'\SO' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'S' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'O'
putLitChar Char
c     = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> String -> Put
putAsciiStr ([String]
asciiTab [String] -> Int -> String
forall a. [a] -> Int -> a
!! Char -> Int
ord Char
c)

showpChar :: Char -> Put
showpChar :: Char -> Put
showpChar Char
c = Char -> Put
putAscii Char
'\'' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putEscaped Char
c Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'\''
 where
 putEscaped :: Char -> Put
putEscaped Char
'\'' = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'\''
 putEscaped Char
c' = Char -> Put
putLitChar Char
c'

showpString :: String -> Put
showpString :: String -> Put
showpString String
xs = Char -> Put
putAscii Char
'"' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> (Char -> Put) -> String -> Put
forall (t :: * -> *) (m :: * -> *) a b.
(Foldable t, Monad m) =>
(a -> m b) -> t a -> m ()
mapM_ Char -> Put
putEscaped String
xs Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'"'
 where
 putEscaped :: Char -> Put
putEscaped Char
'"'   = Char -> Put
putAscii Char
'\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii Char
'"'
 putEscaped Char
'\SO' = String -> Put
putAsciiStr String
"\\SO\\&"
 putEscaped Char
c     = Char -> Put
putLitChar Char
c