d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder{-# LANGUAGE CPP #-}
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder{- |
e9458b1a7a19a63aa4c179f9ab20f4d50681c168Jens ElknerModule : ./Common/IO.hs
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederDescription : wrapper module for changed IO handling since ghc-6.12.1
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederCopyright : (c) Christian Maeder DFKI GmbH 2010
98890889ffb2e8f6f722b00e265a211f13b5a861Corneliu-Claudiu ProdescuLicense : GPLv2 or higher, see LICENSE.txt
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederMaintainer : Christian.Maeder@dfki.de
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederStability : provisional
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederPortability : portable
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maederreading and writing files changed between ghc-6.10.4 and ghc-6.12.1 from
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maederlatin1 to utf8.
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
46c318705d1532d90572abf9ee869016583d985bTill MossakowskiThis module allows to continue reading and writing latin1 (DOL) files.
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederHowever, this module does not support to write utf8 files with ghc-6.10.4 or
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maederearlier versions.
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederThe encoding only effects the contents. The encoding of file names is always
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maederutf8.
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder-}
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maedermodule Common.IO
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder ( Enc (..)
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder , readEncFile
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder , writeEncFile
b2a02ef0183a671777294e069307bba893ca3ebeChristian Maeder , setStdEnc
9db2bd64088c7e5935b94dd9c3ad5cdc24f48814Christian Maeder , catchIOException
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder ) where
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maederimport System.IO
9db2bd64088c7e5935b94dd9c3ad5cdc24f48814Christian Maederimport Control.Exception as Exception
9db2bd64088c7e5935b94dd9c3ad5cdc24f48814Christian Maeder
9db2bd64088c7e5935b94dd9c3ad5cdc24f48814Christian MaedercatchIOException :: a -> IO a -> IO a
9db2bd64088c7e5935b94dd9c3ad5cdc24f48814Christian MaedercatchIOException d a = catchJust (\ e ->
9db2bd64088c7e5935b94dd9c3ad5cdc24f48814Christian Maeder fromException e :: Maybe IOException) a . const $ return d
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
96ae1a1d2197d0e0d5b80da2474b64c456feb1b0Christian Maederdata Enc = Latin1 | Utf8 deriving Show
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederreadEncFile :: Enc -> String -> IO String
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederwriteEncFile :: Enc -> String -> String -> IO ()
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
b2a02ef0183a671777294e069307bba893ca3ebeChristian Maeder-- | set encoding of stdin and stdout
b2a02ef0183a671777294e069307bba893ca3ebeChristian MaedersetStdEnc :: Enc -> IO ()
b2a02ef0183a671777294e069307bba893ca3ebeChristian Maeder
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder#if __GLASGOW_HASKELL__ < 612
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederreadEncFile _ = readFile
d5a8d891500a642ce629854857fc00b7c21aec47Christian MaederwriteEncFile _ = writeFile
b2a02ef0183a671777294e069307bba893ca3ebeChristian MaedersetStdEnc _ = return ()
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder#else
605065f212e589cd3ea24be7db99a71aeb858215Christian MaederreadEncFile c f = do
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hdl <- openFile f ReadMode
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hSetEncoding hdl $ case c of
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Utf8 -> utf8
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Latin1 -> latin1
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hGetContents hdl
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder
605065f212e589cd3ea24be7db99a71aeb858215Christian MaederwriteEncFile c f txt = withFile f WriteMode $ \ hdl -> do
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hSetEncoding hdl $ case c of
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Utf8 -> utf8
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Latin1 -> latin1
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hPutStr hdl txt
b2a02ef0183a671777294e069307bba893ca3ebeChristian Maeder
605065f212e589cd3ea24be7db99a71aeb858215Christian MaedersetStdEnc c = do
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hSetEncoding stdin $ case c of
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Utf8 -> utf8
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Latin1 -> latin1
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder hSetEncoding stdout $ case c of
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Utf8 -> utf8
605065f212e589cd3ea24be7db99a71aeb858215Christian Maeder Latin1 -> latin1
d5a8d891500a642ce629854857fc00b7c21aec47Christian Maeder#endif