module CharIO(
    putStr,
    putStrLn,
    hPutStrLn,
    putErr,
    putErrLn,
    putErrDie,
    CharIO.readFile,
    CharIO.print,
    CharIO.hGetContents,
    runMain
    ) where

import Char
import Control.Exception
import Prelude hiding(putStr, putStrLn)
import System
import UTF8
import qualified IO
import qualified Prelude (putStr, putStrLn)

toUTF8 s = (map (chr. fromIntegral) $ toUTF s)
fromUTF8 s = fromUTF (map (fromIntegral . ord) s)

flushOut = Control.Exception.catch  (IO.hFlush IO.stdout) (\_ -> return ())

putStr = Prelude.putStr . toUTF8
putStrLn = Prelude.putStrLn . toUTF8
putErr s = flushOut >> IO.hPutStr IO.stderr (toUTF8 s)
putErrLn s = flushOut >> hPutStrLn IO.stderr s
putErrDie s = flushOut >> hPutStrLn IO.stderr s >> System.exitFailure
print x = putStrLn $ show x


hPutStrLn fh = IO.hPutStrLn fh . toUTF8

readFile fn = Prelude.readFile fn >>= \s -> return (fromUTF8 s)
hGetContents h =  IO.hGetContents h >>= \s -> return (fromUTF8 s)

runMain :: IO a -> IO ()
runMain action = Control.Exception.catch (action >> return ()) $ \x -> case x of
        ExitException _ -> throw x
        _ -> putErrDie $ show x

