summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-11-18 15:31:30 +0000
committeraarne <aarne@cs.chalmers.se>2008-11-18 15:31:30 +0000
commit288ffd290a67a1d0ff497c8aa1d3c12d612a6dc3 (patch)
tree328d97d1c2c1d907efdb3023ab44c26daeccba08 /src
parentbd1417e21a12ebf3e9da96b4f02459fee259d676 (diff)
restored "?" as system pipe command
Diffstat (limited to 'src')
-rw-r--r--src/GF/Command/Commands.hs18
-rw-r--r--src/GF/Command/Parse.hs17
2 files changed, 32 insertions, 3 deletions
diff --git a/src/GF/Command/Commands.hs b/src/GF/Command/Commands.hs
index 22978cc6c..691121bde 100644
--- a/src/GF/Command/Commands.hs
+++ b/src/GF/Command/Commands.hs
@@ -87,6 +87,20 @@ commandHelp full (co,info) = unlines $ [
-- this list must no more be kept sorted by the command name
allCommands :: String -> PGF -> Map.Map String CommandInfo
allCommands cod pgf = Map.fromList [
+ ("!", emptyCommandInfo {
+ synopsis = "system command: escape to system shell",
+ syntax = "! SYSTEMCOMMAND",
+ examples = [
+ "! ls *.gf -- list all GF files in the working directory"
+ ]
+ }),
+ ("?", emptyCommandInfo {
+ synopsis = "system pipe: send value from previous command to a system command",
+ syntax = "? SYSTEMCOMMAND",
+ examples = [
+ "gt | l | ? wc -- generate, linearize, word-count"
+ ]
+ }),
("cc", emptyCommandInfo {
longname = "compute_concrete",
syntax = "cc (-all | -table | -unqual)? TERM",
@@ -443,7 +457,7 @@ allCommands cod pgf = Map.fromList [
("sp", emptyCommandInfo {
longname = "system_pipe",
synopsis = "send argument to a system command",
- syntax = "sp -command=\"SYSTEMCOMMAND\" STRING",
+ syntax = "sp -command=\"SYSTEMCOMMAND\", alt. ? SYSTEMCOMMAND",
exec = \opts arg -> do
let tmpi = "_tmpi" ---
let tmpo = "_tmpo"
@@ -456,7 +470,7 @@ allCommands cod pgf = Map.fromList [
("command","the system command applied to the argument")
],
examples = [
- "ps -command=\"wc\" \"foo\"",
+ "sp -command=\"wc\" \"foo\"",
"gt | l | sp -command=\"grep \\\"who\\\"\" | sp -command=\"wc\""
]
}),
diff --git a/src/GF/Command/Parse.hs b/src/GF/Command/Parse.hs
index 85a351ead..f48d0d444 100644
--- a/src/GF/Command/Parse.hs
+++ b/src/GF/Command/Parse.hs
@@ -20,12 +20,18 @@ pCommandLine = RP.sepBy (RP.skipSpaces >> pPipe) (RP.skipSpaces >> RP.char ';')
pPipe = RP.sepBy1 (RP.skipSpaces >> pCommand) (RP.skipSpaces >> RP.char '|')
-pCommand = do
+pCommand = (do
cmd <- pIdent RP.<++ (RP.char '%' >> pIdent >>= return . ('%':))
RP.skipSpaces
opts <- RP.sepBy pOption RP.skipSpaces
arg <- pArgument
return (Command cmd opts arg)
+ )
+ RP.<++ (do
+ RP.char '?'
+ c <- pSystemCommand
+ return (Command "sp" [OFlag "command" (VStr c)] ANoArg)
+ )
pOption = do
RP.char '-'
@@ -47,3 +53,12 @@ pArgument =
(fmap ATree (pTree False)
RP.<++
(RP.munch isSpace >> RP.char '%' >> fmap AMacro pIdent))
+
+pSystemCommand =
+ RP.munch isSpace >> (
+ (RP.char '"' >> (RP.manyTill (pEsc RP.<++ RP.get) (RP.char '"')))
+ RP.<++
+ RP.many RP.get
+ )
+ where
+ pEsc = RP.char '\\' >> RP.get