{-# OPTIONS -cpp #-}
----------------------------------------------------------------------
-- |
-- Module : Main
-- Maintainer : Aarne Ranta
-- Stability : (stability)
-- Portability : (portability)
--
-- > CVS $Date: 2005/06/30 11:36:49 $
-- > CVS $Author: aarne $
-- > CVS $Revision: 1.29 $
--
-- The Main module of GF program.
-----------------------------------------------------------------------------
module Main (main) where
import GF.GFModes (gfInteract, gfBatch, batchCompile)
import GF.Data.Operations
import GF.Infra.UseIO
import GF.Infra.Option
import GF.API.IOGrammar
import GF.Compile.ShellState
import GF.Compile.Compile
import GF.Compile.MkConcrete
import GF.Compile.Wordlist
import GF.Shell
import GF.Shell.SubShell
import GF.Shell.ShellCommands
import GF.Shell.PShell
import GF.Shell.JGF
import GF.System.Signal
import GF.Text.UTF8
import GF.Today (today,version,libdir)
import System (getArgs,system,getEnv)
import System.FilePath
import Control.Monad (foldM,liftM)
import Data.List (nub)
#ifdef mingw32_HOST_OS
import System.Win32.Console
import System.Win32.NLS
#endif
-- AR 19/4/2000 -- 21/3/2006
main :: IO ()
main = do
#ifdef mingw32_HOST_OS
codepage <- getACP
setConsoleCP codepage
setConsoleOutputCP codepage
#endif
xs <- getArgs
let
(os,fs) = getOptions "-" xs
opt j = oElem j os
st0 = optInitShellState os
ifNotSil c = if oElem beSilent os then return () else c
doGF os fs = case 0 of
_ | opt getHelp || any opt (map iOpt ["h", "-help", "-h"])-> do
putStrLnFlush $ encodeUTF8 helpMsg
_ | opt forJava -> do
welcome <- welcomeMsgLib
putStrLnFlush $ encodeUTF8 welcome
st <- useIOE st0 $
foldM (shellStateFromFiles os) st0 fs
sessionLineJ True st
return ()
_ | opt doMake -> do
mapM_ (batchCompile os) fs
return ()
_ | opt makeConcrete -> do
mkConcretes os fs
_ | opt openEditor -> do
system $ "jgf" +++ unwords xs
return ()
_ | opt doBatch -> do
if opt beSilent then return () else putStrLnFlush ""
st <- useIOE st0 $
foldM (shellStateFromFiles os) st0 fs
gfBatch (initHState st)
if opt beSilent then return () else putStrLnFlush ""
return ()
_ -> do
welcome <- welcomeMsgLib
ifNotSil $ putStrLnFlush $ welcome
st <- useIOE st0 $
foldM (shellStateFromFiles os) st0 fs
if null fs then return () else (ifNotSil putCPU)
blockInterrupt (gfInteract (initHState st))
return ()
-- preprocessing gfe
if opt fromExamples
then do
es <- liftM (nub . concat) $ mapM (getGFEFiles os) fs
mkConcretes os es
doGF (removeOption fromExamples os) fs
-- preprocessing gfwl
else if (length fs == 1 && takeExtensions (head fs) == ".gfwl")
then do
fs' <- mkWordlist (head fs)
doGF os fs'
else doGF os fs
helpMsg = unlines [
"Usage: gf