ISO2022 encoding

Ignore-this: 6058e1ef5776d1cdf70c32e533252b5e

darcs-hash:20090303125452-a4fee-d9a0533bf8215100a923f6552775048c2844a240
This commit is contained in:
Henning Guenther 2009-03-03 04:54:52 -08:00
parent 693010654c
commit 7f65298d3a

60
Data/Encoding/ISO2022.hs Normal file
View File

@ -0,0 +1,60 @@
module Data.Encoding.ISO2022 where
import Data.Encoding.Base
import Data.Encoding.ByteSource
import Data.Encoding.ByteSink
import Data.Encoding.Exception
import Data.Encoding.ASCII
import Data.Word
import Control.Throws
class ISO2022 e where
readEscape :: ByteSource m => e -> m (Maybe DynEncoding)
encodingForChar :: e -> Char -> Maybe (DynEncoding,[Word8])
encodeCharISO2022 :: (ISO2022 e,ByteSink m) => e -> Char -> m ()
encodeCharISO2022 e c = case encodingForChar e c of
Nothing -> throwException (HasNoRepresentation c)
Just (enc,esc) -> do
mapM_ pushWord8 esc
encodeChar enc c
decodeCharISO2022 :: (ISO2022 e,ByteSource m) => e -> m Char
decodeCharISO2022 e = do
enc <- readEscape e
case enc of
Nothing -> decodeChar ASCII
Just renc -> decodeChar renc
encodeISO2022 :: (ISO2022 e,ByteSink m) => e -> String -> m ()
encodeISO2022 e = encode' (DynEncoding ASCII)
where
encode' _ [] = return ()
encode' enc (c:cs) = case encodingForChar e c of
Nothing -> throwException (HasNoRepresentation c)
Just (nenc,esc)
| enc==nenc -> do
encodeChar enc c
encode' enc cs
| otherwise -> do
mapM_ pushWord8 esc
encodeChar nenc c
encode' nenc cs
decodeISO2022 :: (ISO2022 e,ByteSource m) => e -> m String
decodeISO2022 e = decode' (DynEncoding ASCII)
where
decode' enc = do
empty <- sourceEmpty
if empty
then return []
else (do
nenc <- readEscape e
case nenc of
Just renc -> decode' renc
Nothing -> do
c <- decodeChar enc
cs <- decode' enc
return (c:cs)
)