summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorkrasimir <krasimir@chalmers.se>2008-10-25 20:26:48 +0000
committerkrasimir <krasimir@chalmers.se>2008-10-25 20:26:48 +0000
commit4104b838011e2e87f8645d60fb67c24b318f981a (patch)
treedec43493d4efe56861af60b2bec84e5024533e2a
parente816ae237a5112364ad2eb7d8cb4f3295ae711e8 (diff)
Windows fix: the default coding isn't utf8 but the current system codepage. The se command changes the codepage as well as the coding
-rw-r--r--src/GFI.hs32
1 files changed, 27 insertions, 5 deletions
diff --git a/src/GFI.hs b/src/GFI.hs
index 16456fb1a..cbc9b5e84 100644
--- a/src/GFI.hs
+++ b/src/GFI.hs
@@ -1,3 +1,4 @@
+{-# OPTIONS -cpp #-}
module GFI (mainGFI,mainRunGFI) where
import GF.Command.Interpreter
@@ -29,20 +30,26 @@ import Control.Monad
import Data.Version
import GF.System.Signal
--import System.IO.Error (try)
+#ifdef mingw32_HOST_OS
+import System.Win32.Console
+import System.Win32.NLS
+#endif
import Paths_gf
mainRunGFI :: Options -> [FilePath] -> IO ()
mainRunGFI opts files = do
let opts1 = addOptions (modifyFlags (\f -> f{optVerbosity=Quiet})) opts
- gfenv <- importInEnv emptyGFEnv opts1 files
+ gfenv <- emptyGFEnv
+ gfenv <- importInEnv gfenv opts1 files
loop opts1 gfenv
return ()
mainGFI :: Options -> [FilePath] -> IO ()
mainGFI opts files = do
putStrLn welcome
- gfenv <- importInEnv emptyGFEnv opts files
+ gfenv <- emptyGFEnv
+ gfenv <- importInEnv gfenv opts files
loop opts gfenv
return ()
@@ -128,7 +135,15 @@ loop opts gfenv0 = do
"ph":_ ->
mapM_ (putStrLn . enc) (reverse (history gfenv0)) >> loopNewCPU gfenv
- "se":c:_ -> loopNewCPU $ gfenv {coding = c}
+ "se":c:_ -> do
+#ifdef mingw32_HOST_OS
+ case c of
+ 'c':'p':c -> case reads c of
+ [(cp,"")] -> setConsoleCP cp >> setConsoleOutputCP cp
+ _ -> return ()
+ _ -> return ()
+#endif
+ loopNewCPU $ gfenv {coding = c}
-- ordinary commands, working on CommandEnv
_ -> do
@@ -191,8 +206,15 @@ data GFEnv = GFEnv {
coding :: String
}
-emptyGFEnv :: GFEnv
-emptyGFEnv = GFEnv emptyGrammar (mkCommandEnv "utf8" emptyPGF) [] 0 "utf8"
+emptyGFEnv :: IO GFEnv
+emptyGFEnv = do
+#ifdef mingw32_HOST_OS
+ codepage <- getACP
+ let coding = "cp"++show codepage
+#else
+ let coding = "utf8"
+#endif
+ return $ GFEnv emptyGrammar (mkCommandEnv coding emptyPGF) [] 0 coding
encode = encodeUnicode . coding
decode = decodeUnicode . coding