-- ---------------------------------------------------------------------------
-- |
-- 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 = ["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 :: Char -> Put
putLitChar '\DEL' = String -> Put
putAsciiStr "\\DEL"
putLitChar '\\'   = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii '\\'
putLitChar c :: Char
c | Char
c Char -> Char -> Bool
forall a. Ord a => a -> a -> Bool
>= ' ' = Char -> Put
putUTF8 Char
c
putLitChar '\a' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'a'
putLitChar '\b' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'b'
putLitChar '\f' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'f'
putLitChar '\n' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'n'
putLitChar '\r' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'r'
putLitChar '\t' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 't'
putLitChar '\v' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'v'
putLitChar '\SO' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'S' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii 'O'
putLitChar c :: Char
c     = Char -> Put
putAscii '\\' 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 c :: Char
c = Char -> Put
putAscii '\'' 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 '\''
 where
 putEscaped :: Char -> Put
putEscaped '\'' = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii '\''
 putEscaped c' :: Char
c' = Char -> Put
putLitChar Char
c'

showpString :: String -> Put
showpString :: String -> Put
showpString xs :: String
xs = Char -> Put
putAscii '"' 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 '"'
 where
 putEscaped :: Char -> Put
putEscaped '"'   = Char -> Put
putAscii '\\' Put -> Put -> Put
forall (m :: * -> *) a b. Monad m => m a -> m b -> m b
>> Char -> Put
putAscii '"'
 putEscaped '\SO' = String -> Put
putAsciiStr "\\SO\\&"
 putEscaped c :: Char
c     = Char -> Put
putLitChar Char
c