From: <cr...@us...> - 2009-08-24 14:11:24
|
Revision: 5661 http://jnode.svn.sourceforge.net/jnode/?rev=5661&view=rev Author: crawley Date: 2009-08-24 14:11:14 +0000 (Mon, 24 Aug 2009) Log Message: ----------- Shell functions now support arguments and redirection Modified Paths: -------------- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java =================================================================== --- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java 2009-08-24 10:52:13 UTC (rev 5660) +++ trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneContext.java 2009-08-24 14:11:14 UTC (rev 5661) @@ -1183,6 +1183,27 @@ } /** + * Evaluate the redirections for this command against a set of streams, saving the context's existing IOs. + * + * @param redirects the redirection nodes to be evaluated + * @param streams the base CommandIOs for the redirection calculation. + * @throws ShellException + */ + void evaluateRedirectionsAndPushHolders(RedirectionNode[] redirects, CommandIO[] streams) + throws ShellException { + if (savedHolders == null) { + savedHolders = new ArrayList<CommandIOHolder[]>(1); + } + savedHolders.add(holders); + holders = new CommandIOHolder[streams.length]; + for (int i = 0; i < holders.length; i++) { + // Don't take ownership of the streams. + holders[i] = new CommandIOHolder(streams[i], false); + } + evaluateRedirections(redirects, holders); + } + + /** * Close the context's current IO, restoring the previous ones. * @throws ShellException */ @@ -1199,8 +1220,8 @@ * @return the stream state after redirections * @throws ShellException */ - void evaluateRedirections( - RedirectionNode[] redirects, CommandIOHolder[] holders) throws ShellException { + void evaluateRedirections(RedirectionNode[] redirects, CommandIOHolder[] holders) + throws ShellException { if (redirects == null) { return; } Modified: trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java =================================================================== --- trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java 2009-08-24 10:52:13 UTC (rev 5660) +++ trunk/shell/src/shell/org/jnode/shell/bjorne/BjorneInterpreter.java 2009-08-24 14:11:14 UTC (rev 5661) @@ -322,27 +322,34 @@ } else { CommandNode body = context.getFunction(commandName); if (body != null) { - // FIXME setup a new context, streams and args. - return body.execute(context); + context.evaluateRedirectionsAndPushHolders(body.getRedirects(), streams); + String[] savedArgs = context.getArgs(); + try { + context.setArgs(cmdLine.getArguments()); + return body.execute(context); + } finally { + context.popHolders(); + context.setArgs(savedArgs); + } } } cmdLine.setStreams(streams); return shell.invoke(cmdLine, sysProps, env); } - public BjorneContext createContext() throws ShellFailureException { + BjorneContext createContext() throws ShellFailureException { return new BjorneContext(this); } - public CommandShell getShell() { + CommandShell getShell() { return shell; } - public PrintStream resolvePrintStream(CommandIO commandIOIF) { + PrintStream resolvePrintStream(CommandIO commandIOIF) { return shell.resolvePrintStream(commandIOIF); } - public InputStream resolveInputStream(CommandIO stream) { + InputStream resolveInputStream(CommandIO stream) { return shell.resolveInputStream(stream); } @@ -350,7 +357,7 @@ return subshellCount++; } - public String getUniqueName() { + String getUniqueName() { return getName() + "-" + getSubshellNumber(); } } Modified: trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml =================================================================== --- trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml 2009-08-24 10:52:13 UTC (rev 5660) +++ trunk/shell/src/test/org/jnode/test/shell/bjorne/bjorne-shell-tests.xml 2009-08-24 14:11:14 UTC (rev 5661) @@ -976,7 +976,20 @@ } foo </script> - <output >hi + <output>hi </output> </testSpec> + <testSpec title="shell function 2" command="test" runMode="AS_SCRIPT" rc="0"> + <script>#!bjorne + foo() { + echo $1 $2 + } + foo hi there + foo bye mum >&2 + </script> + <output>hi there +</output> + <error>bye mum +</error> + </testSpec> </testSet> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |