summaryrefslogtreecommitdiff
path: root/src-3.0/GF/GFModes.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
committeraarne <aarne@cs.chalmers.se>2008-05-21 09:26:44 +0000
commit055c0d0d5a5bb0dc75904fe53df7f2e4f5732a8f (patch)
tree0e63fb68c69c8f6ad0f78893c63420f0a3600e1c /src-3.0/GF/GFModes.hs
parent915a1de71783ab8446b1af9e72c7ba7dfbc12d3f (diff)
GF/src is now for 2.9, and the new sources are in src-3.0 - keep it this way until the release of GF 3
Diffstat (limited to 'src-3.0/GF/GFModes.hs')
-rw-r--r--src-3.0/GF/GFModes.hs112
1 files changed, 112 insertions, 0 deletions
diff --git a/src-3.0/GF/GFModes.hs b/src-3.0/GF/GFModes.hs
new file mode 100644
index 000000000..faab3cede
--- /dev/null
+++ b/src-3.0/GF/GFModes.hs
@@ -0,0 +1,112 @@
+----------------------------------------------------------------------
+-- |
+-- Maintainer : Aarne Ranta
+-- Stability : (stability)
+-- Portability : (portability)
+--
+-- > CVS $Date: 2005/10/06 10:02:33 $
+-- > CVS $Author: aarne $
+-- > CVS $Revision: 1.8 $
+--
+-- (Description of the module)
+-----------------------------------------------------------------------------
+
+module GF.GFModes (gfInteract, gfBatch, batchCompile) where
+
+import GF.Data.Operations
+import GF.Infra.UseIO
+import GF.Infra.Option
+import GF.Compile.ShellState
+import GF.Shell.ShellCommands
+import GF.Shell
+import GF.Shell.CommandL (execCommandHistory)
+import GF.Shell.SubShell
+import GF.Shell.PShell
+import GF.Shell.JGF
+import Data.Char (isSpace)
+
+-- separated from GF Main 24/6/2003
+
+gfInteract :: HState -> IO HState
+gfInteract st@(env,hist@(his,_,_,_)) = do
+ -- putStrFlush "> " M.F 25/01-02 prompt moved to Arch.
+ (s,cs) <- getCommandLines st
+ case ifImpure cs of
+
+ -- these are the three impure commands
+ Just (ICQuit,_) -> do
+ ifNotSilent "See you."
+ return st
+ Just (ICExecuteHistory file,_) -> do
+ ss <- readFileIf file
+ let co = pCommandLines st ss
+ st' <- execLinesH s co st
+ gfInteract st'
+ Just (ICEarlierCommand i,_) -> do
+ let line = earlierCommandH st i
+ co = pCommandLine st $ words line
+ st' <- execLinesH line [co] st -- s would not work in execLinesH
+ gfInteract st'
+
+ Just (ICReload,_) -> case dropWhile (not . isImport) his of
+ line:_ -> do
+ let co = pCommandLine st $ words line
+ st' <- execLinesH line [co] st
+ gfInteract st'
+ _ -> do
+ putStrLn "No previous import"
+ gfInteract st
+
+ Just (ICEditSession,os) -> case getOptVal os useFile of
+ Just file -> do
+ s <- readFileIf file
+ (env',tree) <- execCommandHistory env s
+ gfInteract st
+ _ ->
+ editSession (addOptions os opts) env >> gfInteract st
+ Just (ICTranslateSession,os) ->
+ translateSession (addOptions os opts) env >> gfInteract st
+
+ -- this is a normal command sequence
+ _ -> do
+ st' <- execLinesH s cs st
+ gfInteract st'
+ where
+ opts = globalOptions env
+ ifNotSilent c =
+ if oElem beSilent opts then return () else putStrLnFlush c
+ isImport l = case words l of
+ "i":_ -> True
+ "import":_ -> True
+ _ -> False
+
+gfBatch :: HState -> IO HState
+gfBatch st@(sh,_) = do
+ (s,cs) <- getCommandLinesBatch st
+ if s == "q" then return st else do
+ st' <- if all isSpace s then return st else do
+ putVe "<gfcommand>"
+ putVe s
+ putVe "</gfcommand>"
+ putVe "<gfreply>"
+ (_,st') <- execLines True cs st
+ putVe "</gfreply>"
+ return st'
+ gfBatch st'
+ where
+ putVe = putVerb st
+
+putVerb st@(sh,_) s = if (oElem beSilent (globalOptions sh))
+ then return ()
+ else putStrLnFlush s
+
+batchCompile :: Options -> FilePath -> IO ()
+batchCompile os file = do
+ let file' = mkGFC file
+ let st = initHState $ addGlobalOptions (options [iOpt "make"]) emptyShellState
+ let s = "i -o" +++ (unwords $ map ('-':) $ words $ prOpts os) +++ file
+ let cs = pCommandLines st s
+ execLines True cs st
+ return ()
+
+mkGFC = reverse . ("cfg" ++) . dropWhile (/='.') . reverse