diff options
| author | hallgren <hallgren@chalmers.se> | 2015-08-10 14:12:51 +0000 |
|---|---|---|
| committer | hallgren <hallgren@chalmers.se> | 2015-08-10 14:12:51 +0000 |
| commit | 8d6e61a8df4480385a1f2ef29a96f6a88af9e3ba (patch) | |
| tree | 1da6dd617111f90f3a242e6f2f49f784926c1362 /src/compiler/GF/Infra | |
| parent | d38efbaa6a2c94218bb65925bd9ad6c028dfbfd6 (diff) | |
gf -cshell: preliminary support for the C run-time system in the GF shell
Some C run-time functionality is now available in the GF shell, by starting
GF with 'gf -cshell' or 'gf -crun'. Only limited functionality is available
when running the shell in these modes:
- You can only import .pgf files, not source files.
- The -retain flag can not be used and the commands that require it to work
are not available.
- Only 18 of the 40 commands available in the usual shell have been
implemented. The 'linearize' and 'parse' commands are the only ones
that call the C run-time system, and they support only a limited set of
options and flags. Use the 'help' commmands for details.
- A new command 'generate_all', that calls PGF2.generateAll, has been added.
Unfortuntaly, using it causes 'segmentation fault'.
This is implemented by adding two new modules: GF.Command.Commands2 and
GF.Interactive2. They are copied and modified versions of GF.Command.Commands
and GF.Interactive, respectively. Code for unimplemented commands and other
code that has not been adapted to the C run-time system has been left in
place, but commented out, pending further work.
Diffstat (limited to 'src/compiler/GF/Infra')
| -rw-r--r-- | src/compiler/GF/Infra/Option.hs | 7 | ||||
| -rw-r--r-- | src/compiler/GF/Infra/SIO.hs | 11 |
2 files changed, 17 insertions, 1 deletions
diff --git a/src/compiler/GF/Infra/Option.hs b/src/compiler/GF/Infra/Option.hs index 51aa44b82..a9a517a6e 100644 --- a/src/compiler/GF/Infra/Option.hs +++ b/src/compiler/GF/Infra/Option.hs @@ -73,7 +73,10 @@ errors = raise . unlines -- Types -data Mode = ModeVersion | ModeHelp | ModeInteractive | ModeRun | ModeCompiler +data Mode = ModeVersion | ModeHelp + | ModeInteractive | ModeRun + | ModeInteractive2 | ModeRun2 + | ModeCompiler | ModeServer {-port::-}Int deriving (Show,Eq,Ord) @@ -302,6 +305,8 @@ optDescr = Option ['j'] ["jobs"] (OptArg jobs "N") "Compile N modules in parallel with -batch (default 1).", Option [] ["interactive"] (NoArg (mode ModeInteractive)) "Run in interactive mode (default).", Option [] ["run"] (NoArg (mode ModeRun)) "Run in interactive mode, showing output only (no other messages).", + Option [] ["cshell"] (NoArg (mode ModeInteractive2)) "Start the C run-time shell.", + Option [] ["crun"] (NoArg (mode ModeRun2)) "Start the C run-time shell, showing output only (no other messages).", Option [] ["server"] (OptArg modeServer "port") $ "Run in HTTP server mode on given port (default "++show defaultPort++").", Option [] ["document-root"] (ReqArg gfDocuRoot "DIR") diff --git a/src/compiler/GF/Infra/SIO.hs b/src/compiler/GF/Infra/SIO.hs index 5ca683707..e24a6cb35 100644 --- a/src/compiler/GF/Infra/SIO.hs +++ b/src/compiler/GF/Infra/SIO.hs @@ -1,5 +1,6 @@ -- | Shell IO: a monad that can restrict acesss to arbitrary IO and has the -- ability to capture output that normally would be sent to stdout. +{-# LANGUAGE CPP #-} module GF.Infra.SIO( -- * The SIO monad SIO, @@ -11,6 +12,9 @@ module GF.Infra.SIO( newStdGen,print,putStrLn, -- ** Specific to GF importGrammar,importSource, +#ifdef C_RUNTIME + readPGF2, +#endif putStrLnFlush,runInterruptibly,lazySIO, -- * Restricted accesss to arbitrary (potentially unsafe) IO operations -- | If the environment variable GF_RESTRICTED is defined, these @@ -33,6 +37,9 @@ import qualified System.Random as IO(newStdGen) import qualified GF.Infra.UseIO as IO(getLibraryDirectory) import qualified GF.System.Signal as IO(runInterruptibly) import qualified GF.Command.Importing as GF(importGrammar, importSource) +#ifdef C_RUNTIME +import qualified PGF2 +#endif -- * The SIO monad @@ -96,3 +103,7 @@ lazySIO = lift1 lazyIO importGrammar pgf opts files = lift0 $ GF.importGrammar pgf opts files importSource opts files = lift0 $ GF.importSource opts files + +#ifdef C_RUNTIME +readPGF2 = lift0 . PGF2.readPGF +#endif |
