From 288ffd290a67a1d0ff497c8aa1d3c12d612a6dc3 Mon Sep 17 00:00:00 2001 From: aarne Date: Tue, 18 Nov 2008 15:31:30 +0000 Subject: [PATCH] restored "?" as system pipe command --- src/GF/Command/Commands.hs | 18 ++++++++++++++++-- src/GF/Command/Parse.hs | 17 ++++++++++++++++- 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