make the utf8 IO compatibiity layer build on GHC 6.12.3, 7.0.4, 7.2.2, 7.4.1

This commit is contained in:
Simon Michael 2012-03-29 20:40:31 +00:00
parent 50068221c3
commit 977fb2c3e8

View File

@ -32,11 +32,12 @@ module Hledger.Utils.UTF8IOCompat (
) )
where where
import Control.Monad (liftM)
import qualified Data.ByteString.Lazy as B import qualified Data.ByteString.Lazy as B
import Data.ByteString.Lazy.UTF8 (toString, fromString) import qualified Data.ByteString.Lazy.Char8 as B8
import qualified Data.ByteString.Lazy.UTF8 as U8 (toString, fromString)
import Prelude hiding (readFile, writeFile, appendFile, getContents, putStr, putStrLn) import Prelude hiding (readFile, writeFile, appendFile, getContents, putStr, putStrLn)
import System.IO (Handle) import System.IO (Handle)
import Control.Monad (liftM)
#if __GLASGOW_HASKELL__ < 702 #if __GLASGOW_HASKELL__ < 702
import Codec.Binary.UTF8.String as UTF8 (decodeString, encodeString, isUTF8Encoded) import Codec.Binary.UTF8.String as UTF8 (decodeString, encodeString, isUTF8Encoded)
import System.Info (os) import System.Info (os)
@ -50,31 +51,38 @@ stripBOM s | bom `B.isPrefixOf` s = B.drop 3 s
stripBOM s = s stripBOM s = s
readFile :: FilePath -> IO String readFile :: FilePath -> IO String
readFile = liftM (toString . stripBOM) . B.readFile readFile = liftM (U8.toString . stripBOM) . B.readFile
writeFile :: FilePath -> String -> IO () writeFile :: FilePath -> String -> IO ()
writeFile f = B.writeFile f . fromString writeFile f = B.writeFile f . U8.fromString
appendFile :: FilePath -> String -> IO () appendFile :: FilePath -> String -> IO ()
appendFile f = B.appendFile f . fromString appendFile f = B.appendFile f . U8.fromString
getContents :: IO String getContents :: IO String
getContents = liftM (toString . stripBOM) B.getContents getContents = liftM (U8.toString . stripBOM) B.getContents
hGetContents :: Handle -> IO String hGetContents :: Handle -> IO String
hGetContents h = liftM (toString . stripBOM) (B.hGetContents h) hGetContents h = liftM (U8.toString . stripBOM) (B.hGetContents h)
putStr :: String -> IO () putStr :: String -> IO ()
putStr = B.putStr . fromString putStr = bs_putStr . U8.fromString
putStrLn :: String -> IO () putStrLn :: String -> IO ()
putStrLn = B.putStrLn . fromString putStrLn = bs_putStrLn . U8.fromString
hPutStr :: Handle -> String -> IO () hPutStr :: Handle -> String -> IO ()
hPutStr h = B.hPutStr h . fromString hPutStr h = bs_hPutStr h . U8.fromString
hPutStrLn :: Handle -> String -> IO () hPutStrLn :: Handle -> String -> IO ()
hPutStrLn h s = hPutStr h (s ++ "\n") hPutStrLn h = bs_hPutStrLn h . U8.fromString
-- span GHC versions including 6.12.3 - 7.4.1:
bs_putStr = B8.putStr
bs_putStrLn = B8.putStrLn
bs_hPutStr = B8.hPut
bs_hPutStrLn h bs = B8.hPut h bs >> B8.hPut h (B.singleton 0x0a)
-- | A string received from or being passed to the operating system, such -- | A string received from or being passed to the operating system, such
-- as a file path, command-line argument, or environment variable name or -- as a file path, command-line argument, or environment variable name or