From bf2fdeb22ef950f7f5f375a3f4cf5f90abf87fd8 Mon Sep 17 00:00:00 2001 From: aarne Date: Thu, 6 Oct 2005 13:21:33 +0000 Subject: [PATCH] eqStr ; pipe to system --- src/GF/Grammar/AppPredefined.hs | 9 ++++++--- src/GF/Shell.hs | 18 +++++++++++++++--- src/GF/Shell/HelpFile.hs | 23 ++++++++++++++++------- src/GF/Shell/PShell.hs | 7 ++++--- src/HelpFile | 19 ++++++++++++++----- 5 files changed, 55 insertions(+), 21 deletions(-) diff --git a/src/GF/Grammar/AppPredefined.hs b/src/GF/Grammar/AppPredefined.hs index da81c0d83..5a2450632 100644 --- a/src/GF/Grammar/AppPredefined.hs +++ b/src/GF/Grammar/AppPredefined.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/06/26 20:40:33 $ +-- > CVS $Date: 2005/10/06 14:21:34 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.12 $ +-- > CVS $Revision: 1.13 $ -- -- Predefined function type signatures and definitions. ----------------------------------------------------------------------------- @@ -71,7 +71,7 @@ appPredefined t = case t of -- two-place functions App (Q (IC "Predef") (IC f)) z0 -> do (z,_) <- appPredefined z0 - case (f, z, x) of + case (f, norm z, norm x) of ("drop", EInt i, K s) -> retb $ K (drop i s) ("take", EInt i, K s) -> retb $ K (take i s) ("tk", EInt i, K s) -> retb $ K (take (max 0 (length s - i)) s) @@ -102,6 +102,9 @@ appPredefined t = case t of where retb t = return (t,True) -- no further computing needed retf t = return (t,False) -- must be computed further + norm t = case t of + Empty -> K [] + _ -> t -- read makes variables into constants diff --git a/src/GF/Shell.hs b/src/GF/Shell.hs index 6e4cf45fd..6aca6ff09 100644 --- a/src/GF/Shell.hs +++ b/src/GF/Shell.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/10/06 10:02:33 $ +-- > CVS $Date: 2005/10/06 14:21:34 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.44 $ +-- > CVS $Revision: 1.45 $ -- -- GF shell command interpreter. ----------------------------------------------------------------------------- @@ -313,7 +313,9 @@ execC co@(comm, opts0) sa@(sh@(st,(h,_,_,_)),a) = checkOptions st co >> case com CWriteFile file -> justOutputArg opts (writeFile file) sa CAppendFile file -> justOutputArg opts (appendFile file) sa CSpeakAloud -> justOutputArg opts (speechGenerate opts) sa - CSystemCommand s -> justOutput opts (system s >> return ()) sa + CSystemCommand s -> case a of + AUnit -> justOutput opts (system s >> return ()) sa + _ -> systemArg opts a s sa CPutString -> changeArg (opSS2CommandArg (optStringCommand opts gro)) sa ----- CShowTerm -> changeArg (opTS2CommandArg (optPrintTerm opts gro) . s2t) sa CGrep ms -> changeArg (AString . unlines . filter (grep ms) . lines . prCommandArg) sa @@ -417,6 +419,16 @@ justOutputArg opts f sa@(st,a) = f (utf (prCommandArg a)) >> return (st, AUnit) justOutput :: Options -> IO () -> ShellIO justOutput opts = justOutputArg opts . const +systemArg :: Options -> CommandArg -> String -> ShellIO +systemArg _ cont syst sa = do + writeFile tmpi $ prCommandArg cont + system $ syst ++ " <" ++ tmpi ++ " >" ++ tmpo + s <- readFile tmpo + returnArg (AString s) sa + where + tmpi = "_tmpi" --- + tmpo = "_tmpo" + -- | type system for command arguments; instead of plain strings... data CommandArg = AError String diff --git a/src/GF/Shell/HelpFile.hs b/src/GF/Shell/HelpFile.hs index 3e41e0745..b6c1c9a5e 100644 --- a/src/GF/Shell/HelpFile.hs +++ b/src/GF/Shell/HelpFile.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/10/06 10:02:34 $ +-- > CVS $Date: 2005/10/06 14:21:34 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.15 $ +-- > CVS $Revision: 1.16 $ -- -- Help on shell commands. Generated from HelpFile by 'make help'. -- PLEASE DON'T EDIT THIS FILE. @@ -93,16 +93,19 @@ txtHelpFile = "\ndc, define_command Name Anything" ++ "\n Add a new defined command. The Name must star with '%'. Later," ++ "\n if 'Name X' is used, it is replaced by Anything where #1 is replaced" ++ - "\n by X. Currently at most one argument is possible. To see" ++ - "\n definitions in scope, use help -defs." ++ + "\n by X. " ++ + "\n Restrictions: Currently at most one argument is possible, and a defined" ++ + "\n command cannot appear in a pipe. " ++ + "\n To see what definitions are in scope, use help -defs." ++ "\n examples:" ++ "\n dc %tnp p -cat=NP -lang=Eng #1 | l -lang=Swe -- translate NPs" ++ - "\n %tnp \"this man\" | p -lang=Swe -- translate and parse" ++ + "\n %tnp \"this man\" -- translate and parse" ++ "\n" ++ "\ndt, define_term Name Tree" ++ "\n Add a constant for a tree. The constant can later be called by" ++ - "\n prefixing it with '$'. It is not yet usable as a subterm. To see" ++ - "\n definitions in scope, use help -defs." ++ + "\n prefixing it with '$'. " ++ + "\n Restriction: These terms are not yet usable as a subterm. " ++ + "\n To see what definitions are in scope, use help -defs." ++ "\n examples:" ++ "\n p -cat=NP \"this man\" | dt tm -- define tm as parse result" ++ "\n l -all $tm -- linearize tm in all forms" ++ @@ -476,6 +479,12 @@ txtHelpFile = "\n example:" ++ "\n ! ls" ++ "\n" ++ + "\n?, system_command: ? String" ++ + "\n Issues a system command that receives its arguments from GF pipe" ++ + "\n and returns a value to GF." ++ + "\n example:" ++ + "\n h | ? 'wc -l' | p -cat=Num" ++ + "\n" ++ "\n" ++ "\n-- Flags. The availability of flags is defined separately for each command." ++ "\n" ++ diff --git a/src/GF/Shell/PShell.hs b/src/GF/Shell/PShell.hs index aefd066d5..0649fe7a8 100644 --- a/src/GF/Shell/PShell.hs +++ b/src/GF/Shell/PShell.hs @@ -5,9 +5,9 @@ -- Stability : (stable) -- Portability : (portable) -- --- > CVS $Date: 2005/10/06 10:02:34 $ +-- > CVS $Date: 2005/10/06 14:21:34 $ -- > CVS $Author: aarne $ --- > CVS $Revision: 1.27 $ +-- > CVS $Revision: 1.28 $ -- -- parsing GF shell commands. AR 11\/11\/2001 ----------------------------------------------------------------------------- @@ -62,6 +62,7 @@ unquote (x:xs@(_:_)) | x `elem` "\"'" && x == last xs = init xs unquote s = s pCommandLine :: HState -> [String] -> CommandLine +pCommandLine st (c@('%':_):args) = pCommandLine st $ resolveShMacro st c args pCommandLine st (dc:c:def) | abbrevCommand dc == "dc" = ((CDefineCommand c def, noOptions),AUnit,[]) pCommandLine st s = pFirst (chks s) where pFirst cos = case cos of @@ -73,7 +74,6 @@ pCommandLine st s = pFirst (chks s) where chks = map (pCommandOpt st) . chunks "|" pCommandOpt :: HState -> [String] -> (Command, Options, [CommandArg]) -pCommandOpt st (c@('%':_):args) = pCommandOpt st $ resolveShMacro st c args pCommandOpt _ (w:ws) = let (os, co) = getOptions "-" ws (comm, args) = pCommand (abbrevCommand w:co) @@ -136,6 +136,7 @@ pCommand ws = case ws of "ps" : s -> aString CPutString s "st" : s -> aTerm CShowTerm s "!" : s -> aUnit (CSystemCommand (unwords s)) + "?" : s : x -> aString (CSystemCommand (unquote s)) x "sc" : s -> aUnit (CSystemCommand (unwords s)) "g" : f : s -> aString (CGrep (unquote f)) s diff --git a/src/HelpFile b/src/HelpFile index f85107186..147bee228 100644 --- a/src/HelpFile +++ b/src/HelpFile @@ -64,16 +64,19 @@ s, strip: s dc, define_command Name Anything Add a new defined command. The Name must star with '%'. Later, if 'Name X' is used, it is replaced by Anything where #1 is replaced - by X. Currently at most one argument is possible. To see - definitions in scope, use help -defs. + by X. + Restrictions: Currently at most one argument is possible, and a defined + command cannot appear in a pipe. + To see what definitions are in scope, use help -defs. examples: dc %tnp p -cat=NP -lang=Eng #1 | l -lang=Swe -- translate NPs - %tnp "this man" | p -lang=Swe -- translate and parse + %tnp "this man" -- translate and parse dt, define_term Name Tree Add a constant for a tree. The constant can later be called by - prefixing it with '$'. It is not yet usable as a subterm. To see - definitions in scope, use help -defs. + prefixing it with '$'. + Restriction: These terms are not yet usable as a subterm. + To see what definitions are in scope, use help -defs. examples: p -cat=NP "this man" | dt tm -- define tm as parse result l -all $tm -- linearize tm in all forms @@ -447,6 +450,12 @@ q, quit: q example: ! ls +?, system_command: ? String + Issues a system command that receives its arguments from GF pipe + and returns a value to GF. + example: + h | ? 'wc -l' | p -cat=Num + -- Flags. The availability of flags is defined separately for each command.