From: <chr...@us...> - 2009-04-29 21:59:24
|
Revision: 5363 http://jnode.svn.sourceforge.net/jnode/?rev=5363&view=rev Author: chrisboertien Date: 2009-04-29 21:59:13 +0000 (Wed, 29 Apr 2009) Log Message: ----------- Refactored commands from shell to cli Signed-off-by: chrisboertien <chr...@gm...> Modified Paths: -------------- trunk/cli/descriptors/org.jnode.command.file.xml Added Paths: ----------- trunk/cli/descriptors/org.jnode.command.common.xml trunk/cli/descriptors/org.jnode.command.dev.ant.xml trunk/cli/descriptors/org.jnode.command.dev.xml trunk/cli/descriptors/org.jnode.command.system.xml trunk/cli/src/commands/org/jnode/command/common/ trunk/cli/src/commands/org/jnode/command/common/BasenameCommand.java trunk/cli/src/commands/org/jnode/command/common/DateCommand.java trunk/cli/src/commands/org/jnode/command/common/DirnameCommand.java trunk/cli/src/commands/org/jnode/command/common/EchoCommand.java trunk/cli/src/commands/org/jnode/command/common/EnvCommand.java trunk/cli/src/commands/org/jnode/command/common/ExitCommand.java trunk/cli/src/commands/org/jnode/command/common/ExprCommand.java trunk/cli/src/commands/org/jnode/command/common/FalseCommand.java trunk/cli/src/commands/org/jnode/command/common/HelpCommand.java trunk/cli/src/commands/org/jnode/command/common/HistoryCommand.java trunk/cli/src/commands/org/jnode/command/common/SleepCommand.java trunk/cli/src/commands/org/jnode/command/common/TimeCommand.java trunk/cli/src/commands/org/jnode/command/common/TrueCommand.java trunk/cli/src/commands/org/jnode/command/common/UnixTestCommand.java trunk/cli/src/commands/org/jnode/command/common/UptimeCommand.java trunk/cli/src/commands/org/jnode/command/dev/ trunk/cli/src/commands/org/jnode/command/dev/CompileCommand.java trunk/cli/src/commands/org/jnode/command/dev/DebugCommand.java trunk/cli/src/commands/org/jnode/command/dev/DisassembleCommand.java trunk/cli/src/commands/org/jnode/command/dev/RemoteOutputCommand.java trunk/cli/src/commands/org/jnode/command/dev/ant/ trunk/cli/src/commands/org/jnode/command/dev/ant/AntCommand.java trunk/cli/src/commands/org/jnode/command/file/CatCommand.java trunk/cli/src/commands/org/jnode/command/file/GrepCommand.java trunk/cli/src/commands/org/jnode/command/file/HeadCommand.java trunk/cli/src/commands/org/jnode/command/file/TailCommand.java trunk/cli/src/commands/org/jnode/command/file/WcCommand.java trunk/cli/src/commands/org/jnode/command/system/ trunk/cli/src/commands/org/jnode/command/system/AliasCommand.java trunk/cli/src/commands/org/jnode/command/system/BindKeysCommand.java trunk/cli/src/commands/org/jnode/command/system/ClassCommand.java trunk/cli/src/commands/org/jnode/command/system/ClasspathCommand.java trunk/cli/src/commands/org/jnode/command/system/CpuIDCommand.java trunk/cli/src/commands/org/jnode/command/system/GcCommand.java trunk/cli/src/commands/org/jnode/command/system/HaltCommand.java trunk/cli/src/commands/org/jnode/command/system/IsolateCommand.java trunk/cli/src/commands/org/jnode/command/system/JavaCommand.java trunk/cli/src/commands/org/jnode/command/system/KdbCommand.java trunk/cli/src/commands/org/jnode/command/system/KillCommand.java trunk/cli/src/commands/org/jnode/command/system/LoadkeysCommand.java trunk/cli/src/commands/org/jnode/command/system/LocaleCommand.java trunk/cli/src/commands/org/jnode/command/system/Log4jCommand.java trunk/cli/src/commands/org/jnode/command/system/LsIRQCommand.java trunk/cli/src/commands/org/jnode/command/system/MemoryCommand.java trunk/cli/src/commands/org/jnode/command/system/NamespaceCommand.java trunk/cli/src/commands/org/jnode/command/system/OnHeapCommand.java trunk/cli/src/commands/org/jnode/command/system/PageCommand.java trunk/cli/src/commands/org/jnode/command/system/PluginCommand.java trunk/cli/src/commands/org/jnode/command/system/PrintEnvCommand.java trunk/cli/src/commands/org/jnode/command/system/RebootCommand.java trunk/cli/src/commands/org/jnode/command/system/RunCommand.java trunk/cli/src/commands/org/jnode/command/system/SetCommand.java trunk/cli/src/commands/org/jnode/command/system/SyntaxCommand.java trunk/cli/src/commands/org/jnode/command/system/TerminateCommand.java trunk/cli/src/commands/org/jnode/command/system/ThreadCommand.java trunk/cli/src/commands/org/jnode/command/system/VmInfoCommand.java Removed Paths: ------------- trunk/shell/descriptors/org.jnode.shell.command.ant.xml trunk/shell/descriptors/org.jnode.shell.command.debug.xml trunk/shell/descriptors/org.jnode.shell.command.log4j.xml trunk/shell/descriptors/org.jnode.shell.command.plugin.xml trunk/shell/descriptors/org.jnode.shell.command.posix.xml trunk/shell/descriptors/org.jnode.shell.command.system.xml trunk/shell/descriptors/org.jnode.shell.command.xml trunk/shell/src/shell/org/jnode/shell/command/AliasCommand.java trunk/shell/src/shell/org/jnode/shell/command/BindKeysCommand.java trunk/shell/src/shell/org/jnode/shell/command/CatCommand.java trunk/shell/src/shell/org/jnode/shell/command/ClassCommand.java trunk/shell/src/shell/org/jnode/shell/command/ClasspathCommand.java trunk/shell/src/shell/org/jnode/shell/command/CompileCommand.java trunk/shell/src/shell/org/jnode/shell/command/DateCommand.java trunk/shell/src/shell/org/jnode/shell/command/DisassembleCommand.java trunk/shell/src/shell/org/jnode/shell/command/EchoCommand.java trunk/shell/src/shell/org/jnode/shell/command/EnvCommand.java trunk/shell/src/shell/org/jnode/shell/command/ExitCommand.java trunk/shell/src/shell/org/jnode/shell/command/GcCommand.java trunk/shell/src/shell/org/jnode/shell/command/GrepCommand.java trunk/shell/src/shell/org/jnode/shell/command/HeadCommand.java trunk/shell/src/shell/org/jnode/shell/command/HelpCommand.java trunk/shell/src/shell/org/jnode/shell/command/HistoryCommand.java trunk/shell/src/shell/org/jnode/shell/command/IsolateCommand.java trunk/shell/src/shell/org/jnode/shell/command/JavaCommand.java trunk/shell/src/shell/org/jnode/shell/command/KillCommand.java trunk/shell/src/shell/org/jnode/shell/command/LoadkeysCommand.java trunk/shell/src/shell/org/jnode/shell/command/LocaleCommand.java trunk/shell/src/shell/org/jnode/shell/command/MemoryCommand.java trunk/shell/src/shell/org/jnode/shell/command/NamespaceCommand.java trunk/shell/src/shell/org/jnode/shell/command/OnHeapCommand.java trunk/shell/src/shell/org/jnode/shell/command/PageCommand.java trunk/shell/src/shell/org/jnode/shell/command/PrintEnvCommand.java trunk/shell/src/shell/org/jnode/shell/command/RunCommand.java trunk/shell/src/shell/org/jnode/shell/command/SetCommand.java trunk/shell/src/shell/org/jnode/shell/command/SleepCommand.java trunk/shell/src/shell/org/jnode/shell/command/SyntaxCommand.java trunk/shell/src/shell/org/jnode/shell/command/TailCommand.java trunk/shell/src/shell/org/jnode/shell/command/TerminateCommand.java trunk/shell/src/shell/org/jnode/shell/command/ThreadCommand.java trunk/shell/src/shell/org/jnode/shell/command/TimeCommand.java trunk/shell/src/shell/org/jnode/shell/command/UptimeCommand.java trunk/shell/src/shell/org/jnode/shell/command/ant/AntCommand.java trunk/shell/src/shell/org/jnode/shell/command/debug/DebugCommand.java trunk/shell/src/shell/org/jnode/shell/command/debug/RemoteOutputCommand.java trunk/shell/src/shell/org/jnode/shell/command/log4j/Log4jCommand.java trunk/shell/src/shell/org/jnode/shell/command/plugin/HaltCommand.java trunk/shell/src/shell/org/jnode/shell/command/plugin/PluginCommand.java trunk/shell/src/shell/org/jnode/shell/command/plugin/RebootCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/BasenameCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/DirnameCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/ExprCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/FalseCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/TrueCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/UnixTestCommand.java trunk/shell/src/shell/org/jnode/shell/command/posix/WcCommand.java trunk/shell/src/shell/org/jnode/shell/command/system/CpuIDCommand.java trunk/shell/src/shell/org/jnode/shell/command/system/KdbCommand.java trunk/shell/src/shell/org/jnode/shell/command/system/LsIRQCommand.java trunk/shell/src/shell/org/jnode/shell/command/system/VmInfoCommand.java Added: trunk/cli/descriptors/org.jnode.command.common.xml =================================================================== --- trunk/cli/descriptors/org.jnode.command.common.xml (rev 0) +++ trunk/cli/descriptors/org.jnode.command.common.xml 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,103 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plugin SYSTEM "jnode.dtd"> + +<plugin id="org.jnode.command.common" + name="JNode common commands" + version="@VERSION@" + provider-name="@PROVIDER@" + license-name="lgpl"> + + <requires> + <import plugin="org.jnode.shell.help"/> + <import plugin="org.jnode.shell.syntax"/> + </requires> + + <runtime> + <library name="jnode-coreutils.jar"> + <export name="org.jnode.command.common.*"/> + </library> + </runtime> + + <extension point="org.jnode.shell.aliases"> + <alias name="basename" class="org.jnode.command.common.BasenameCommand"/> + <alias name="date" class="org.jnode.command.common.DateCommand"/> + <alias name="dirname" class="org.jnode.command.common.DirnameCommand"/> + <alias name="echo" class="org.jnode.command.common.EchoCommand"/> + <alias name="env" class="org.jnode.command.common.EnvCommand"/> + <alias name="exit" class="org.jnode.command.common.ExitCommand"/> + <alias name="expr" class="org.jnode.command.common.ExprCommand"/> + <alias name="false" class="org.jnode.command.common.FalseCommand"/> + <alias name="help" class="org.jnode.command.common.HelpCommand"/> + <alias name="history" class="org.jnode.command.common.HistoryCommand"/> + <alias name="man" class="org.jnode.command.common.HelpCommand"/> + <alias name="sleep" class="org.jnode.command.common.SleepCommand"/> + <alias name="test" class="org.jnode.command.common.UnixTestCommand"/> + <alias name="time" class="org.jnode.command.common.TimeCommand"/> + <alias name="true" class="org.jnode.command.common.TrueCommand"/> + <alias name="uptime" class="org.jnode.command.common.UptimeCommand"/> + <alias name="[" class="org.jnode.command.common.UnixTestCommand"/> + </extension> + + <extension point="org.jnode.shell.syntaxes"> + <syntax alias="basename"> + <sequence description="strip the directory prefix from a filename, as well as an option suffix"> + <argument argLabel="name" /> + <optional><argument argLabel="suffix"/></optional> + </sequence> + </syntax> + <syntax alias="date" description="Print the current date"/> + <syntax alias="dirname"> + <argument argLabel="name"/> + </syntax> + <syntax alias="echo" description="Print the arguments"> + <repeat> + <argument argLabel="text"/> + </repeat> + </syntax> + <syntax alias="env"> + <empty description="Print the system properties"/> + <option argLabel="env" shortName="e" longName="env" + description="Print the system environment variables"/> + <option argLabel="shell" shortName="s" longName="shell" + description="Print the current shell properties"/> + </syntax> + <syntax alias="exit" description="Exit the current shell"/> + <syntax alias="false"> + <empty description="Set a non-zero return code"/> + </syntax> + <syntax alias="help"> + <empty description="Print help about 'help'"/> + <argument argLabel="alias" description="Print help about a command alias or class"/> + </syntax> + <syntax alias="history"> + <empty description="List history entries"/> + <sequence description="Run a history command"> + <alternatives><empty/><option argLabel="test" shortName="t" longName="test"/></alternatives> + <alternatives> + <argument argLabel="index"/> + <argument argLabel="prefix"/> + </alternatives> + </sequence> + </syntax> + <syntax alias="man"> + <empty description="Print help about 'man'"/> + <argument argLabel="alias" description="Print help about a command alias or class"/> + </syntax> + <syntax alias="sleep" description="Sleep for a given number of seconds"> + <argument argLabel="seconds"/> + </syntax> + <syntax alias="time" description="Measures command execution time"> + <sequence> + <argument argLabel="alias"/> + <repeat><argument argLabel="args"/></repeat> + </sequence> + </syntax> + <syntax alias="true"> + <empty description="Set a zero return code"/> + </syntax> + </extension> + + <extension point="org.jnode.security.permissions"> + <permission class="java.util.FilePermission" name="<<ALL FILES>>" actions="read"/> + </extension> +</plugin> Copied: trunk/cli/descriptors/org.jnode.command.dev.ant.xml (from rev 5362, trunk/shell/descriptors/org.jnode.shell.command.ant.xml) =================================================================== --- trunk/cli/descriptors/org.jnode.command.dev.ant.xml (rev 0) +++ trunk/cli/descriptors/org.jnode.command.dev.ant.xml 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,36 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plugin SYSTEM "jnode.dtd"> + +<plugin id="org.jnode.command.dev.ant" + name="JNode Ant Commands" + version="@VERSION@" + license-name="lgpl" + provider-name="JNode.org"> + + <requires> + <import plugin="org.jnode.shell.help"/> + <import plugin="org.apache.tools.ant"/> + <import plugin="org.apache.tools.ant-launcher"/> + </requires> + + <runtime> + <library name="jnode-coreutils.jar"> + <export name="org.jnode.command.dev.ant.*"/> + </library> + </runtime> + + <extension point="org.jnode.shell.aliases"> + <alias name="ant" class="org.jnode.command.dev.ant.AntCommand"/> + </extension> + + <extension point="org.jnode.security.permissions"> + <permission class="java.io.FilePermission" name="<<ALL FILES>>" actions="read,write"/> + <permission class="java.lang.RuntimePermission" name="setSecurityManager" actions="*" /> + <permission class="java.lang.RuntimePermission" name="createClassLoader" actions="*" /> + <permission class="java.lang.RuntimePermission" name="setIO" actions="*" /> + <permission class="java.lang.RuntimePermission" name="exitVM" actions="*" /> + <permission class="org.jnode.security.JNodePermission" name="getVmClass" actions="*" /> + <permission class="java.util.PropertyPermission" name="*" actions="read,write"/> + </extension> + +</plugin> Added: trunk/cli/descriptors/org.jnode.command.dev.xml =================================================================== --- trunk/cli/descriptors/org.jnode.command.dev.xml (rev 0) +++ trunk/cli/descriptors/org.jnode.command.dev.xml 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,73 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plugin SYSTEM "jnode.dtd"> + +<plugin id="org.jnode.command.dev" + name="JNode developer commands" + version="@VERSION@" + provider-name="@PROVIDER@" + license-name="lgpl"> + + <requires> + <import plugin="org.jnode.debug"/> + <import plugin="org.classpath.ext.jdwp"/> + <import plugin="org.jnode.shell.syntax"/> + </requires> + + <runtime> + <library name="jnode-coreutils.jar"> + <export name="org.jnode.command.dev.*"/> + </library> + </runtime> + + <extension point="org.jnode.shell.aliases"> + <alias name="compile" class="org.jnode.command.dev.CompileCommand"/> + <alias name="debug" class="org.jnode.command.dev.DebugCommand"/> + <alias name="disasm" class="org.jnode.command.dev.DisassembleCommand"/> + <alias name="netout" class="org.jnode.command.dev.RemoteOutputCommand"/> + </extension> + + <extension point="org.jnode.shell.syntaxes"> + <syntax alias="compile" description="Compile a class to native code"> + <sequence> + <optionSet> + <option argLabel="test" longName="test"/> + <option argLabel="level" longName="level"/> + </optionSet> + <argument argLabel="className"/> + </sequence> + </syntax> + <syntax alias="disasm" description="Disassemble a native code class"> + <sequence> + <optionSet> + <option argLabel="test" longName="test"/> + <option argLabel="level" longName="level"/> + </optionSet> + <argument argLabel="className"/> + <optional> + <argument argLabel="methodName"/> + </optional> + </sequence> + </syntax> + <syntax alias="debug"> + <optional description="Run a JDWP listener to enable remote debugging"> + <option argLabel="port" shortName="p"/> + </optional> + </syntax> + <syntax alias="remoteout"> + <optionSet description="Redirect output and logging to a remote receiver"> + <option argLabel="host" shortName="h" longName="host"/> + <option argLabel="port" shortName="p" longName="port"/> + <option argLabel="udp" shortName="u" longName="udp"/> + </optionSet> + </syntax> + </extension> + + <extension point="org.jnode.security.permissions"> + <permission class="java.io.FilePermission" name="<<ALL FILES>>" actions="read,write"/> + <permission class="java.lang.RuntimePermission" name="modifyThreadGroup"/> + <permission class="java.lang.RuntimePermission" name="setIO"/> + <permission class="java.lang.RuntimePermission" name="exitVM"/> + <permission class="java.net.SocketPermission" name="*:1-" actions="resolve,listen,connect"/> + <permission class="java.util.PropertyPermission" name="*" actions="read,write"/> + </extension> +</plugin> Modified: trunk/cli/descriptors/org.jnode.command.file.xml =================================================================== --- trunk/cli/descriptors/org.jnode.command.file.xml 2009-04-29 21:56:54 UTC (rev 5362) +++ trunk/cli/descriptors/org.jnode.command.file.xml 2009-04-29 21:59:13 UTC (rev 5363) @@ -19,22 +19,39 @@ </runtime> <extension point="org.jnode.shell.aliases"> + <alias name="cat" class="org.jnode.command.file.CatCommand"/> <alias name="cd" class="org.jnode.command.file.CdCommand" internal="yes"/> <alias name="cp" class="org.jnode.command.file.CpCommand"/> <alias name="del" class="org.jnode.command.file.DeleteCommand"/> <alias name="df" class="org.jnode.command.file.DFCommand"/> <alias name="dir" class="org.jnode.command.file.DirCommand"/> - <alias name="find" class="org.jnode.command.file.FindCommand"/> + <alias name="find" class="org.jnode.command.file.FindCommand"/> + <alias name="grep" class="org.jnode.command.file.GrepCommand"/> + <alias name="head" class="org.jnode.command.file.HeadCommand"/> <alias name="hexdump" class="org.jnode.command.file.HexdumpCommand"/> <alias name="ls" class="org.jnode.command.file.DirCommand"/> <alias name="md5sum" class="org.jnode.command.file.Md5SumCommand"/> <alias name="mkdir" class="org.jnode.command.file.MkdirCommand"/> <alias name="pwd" class="org.jnode.command.file.PwdCommand"/> <alias name="rm" class="org.jnode.command.file.DeleteCommand"/> + <alias name="tail" class="org.jnode.command.file.TailCommand"/> <alias name="touch" class="org.jnode.command.file.TouchCommand"/> + <alias name="wc" class="org.jnode.command.file.WcCommand"/> </extension> <extension point="org.jnode.shell.syntaxes"> + <syntax alias="cat"> + <empty description="copy standard input to standard output"/> + <sequence description="fetch and concatenate urls to standard output"> + <option argLabel="urls" shortName="u" longName="urls"/> + <repeat minCount="1"> + <argument argLabel="url"/> + </repeat> + </sequence> + <repeat minCount="1" description="concatenate files to standard output"> + <argument argLabel="file"/> + </repeat> + </syntax> <syntax alias="cd"> <empty description="change the current directory to the 'user.home' directory"/> <argument argLabel="directory" description="change the current directory to 'directory'"/> @@ -89,6 +106,86 @@ </optionSet> </sequence> </syntax> + <syntax alias="grep"> + <!-- grep [Options] <pattern> [<file>...] or + grep [Options] (-e <pattern> | -f <file>)... [<file>...] --> + <sequence description="Search for lines that match a string or regex"> + <optionSet> + <!-- Matcher type --> + <option argLabel="matcher-fixed" shortName="F" longName="fixed-strings"/> + <option argLabel="matcher-ext" shortName="E" longName="extended-regexp"/> + <option argLabel="matcher-basic" shortName="G" longName="basic-regexp"/> + <option argLabel="matcher-perl" shortName="P" longName="perl-regexp"/> + <!-- Matching options --> + <option argLabel="ignore-case" shortName="i" longName="ignore-case"/> + <option argLabel="invert" shortName="v" longName="invert-match"/> + <option argLabel="word-match" shortName="w" longName="word-regexp"/> + <option argLabel="line-match" shortName="x" longName="line-regexp"/> + <!-- Output options --> + <option argLabel="show-count" shortName="c" longName="count"/> + <option argLabel="show-files-nomatch" shortName="L" longName="files-without-match"/> + <option argLabel="show-files-match" shortName="l" longName="files-with-match"/> + <option argLabel="show-only-match" shortName="o" longName="only-matching"/> + <option argLabel="max-matches" shortName="m" longName="max-count"/> + <option argLabel="quiet" shortName="q" longName="quiet"/> + <option argLabel="quiet" longName="silent"/> + <option argLabel="suppress" shortName="s" longName="no-messages"/> + <!-- Output prefix control --> + <option argLabel="prefix-byte" shortName="b" longName="byte-offset"/> + <option argLabel="prefix-file" shortName="H" longName="with-filename"/> + <option argLabel="prefix-nofile" shortName="h" longName="no-filename"/> + <option argLabel="prefix-label" longName="label"/> + <option argLabel="prefix-line" shortName="n" longName="line-number"/> + <option argLabel="prefix-tab" shortName="T" longName="initial-tab"/> + <option argLabel="prefix-null" shortName="Z" longName="null"/> + <!-- Context lines --> + <option argLabel="show-context-after" shortName="A" longName="after-context"/> + <option argLabel="show-context-before" shortName="B" longName="before-context"/> + <option argLabel="show-context-both" shortName="C" longName="context"/> + <!-- File/Directory selection --> + <option argLabel="mode-binary" longName="binary-files"/> + <option argLabel="mode-binary-text" shortName="a" longName="text"/> + <option argLabel="mode-binary-skip" shortName="I"/> + <option argLabel="mode-device" shortName="D" longName="devices"/> + <option argLabel="mode-dir" shortName="d" longName="directories"/> + <option argLabel="mode-dir-recurse" shortName="r" longName="recursive"/> + <option argLabel="mode-dir-recurse" shortName="R"/> + <option argLabel="pattern-exclude" longName="exclude"/> + <option argLabel="pattern-exclude-file" longName="exclude-from"/> + <option argLabel="pattern-exclude-dir" longName="exclude-dir"/> + <option argLabel="pattern-include" longName="include"/> + <!-- Other options --> + <option argLabel="null-term" shortName="z" longName="null-data"/> + <option argLabel="debug" longName="debug"/> + </optionSet> + <alternatives> + <repeat minCount="1"> + <alternatives> + <option argLabel="patterns" shortName="e"/> + <option argLabel="pattern-files" shortName="f"/> + </alternatives> + </repeat> + <argument argLabel="patterns"/> + </alternatives> + <repeat> + <argument argLabel="files"/> + </repeat> + </sequence> + </syntax> + <syntax alias="head"> + <sequence> + <optionSet> + <option argLabel="quiet" shortName="q" longName="quiet"/> + <option argLabel="quiet" longName="silent"/> + <option argLabel="verbose" shortName="v" longName="verbose"/> + <option argLabel="bytes" shortName="c" longName="bytes"/> + <option argLabel="lines" shortName="n" longName="lines"/> + </optionSet> + <repeat> + <argument argLabel="files" /> + </repeat> + </sequence> + </syntax> <syntax alias="hexdump"> <empty description="print a hex dump of standard input"/> <argument argLabel="file" description="print a hex dump of a file"/> @@ -129,9 +226,42 @@ </repeat> </sequence> </syntax> + <syntax alias="tail"> + <sequence> + <optionSet label="globals"> + <option argLabel="follow" shortName="f" longName="follow"/> + <option argLabel="followr" shortName="F"/> + <option argLabel="retry" longName="retry"/> + <option argLabel="unchanged" longName="max-unchanged-stats"/> + <!--<option argLabel="pid" longName="pid"/> disabled --> + <option argLabel="sleep" shortName="s" longName="sleep-interval"/> + <option argLabel="quiet" shortName="q" longName="quiet"/> + <option argLabel="verbose" shortName="v" longName="verbose"/> + <option argLabel="bytes" shortName="c" longName="bytes"/> + <option argLabel="lines" shortName="n" longName="lines"/> + </optionSet> + <repeat> + <argument argLabel="files"/> + </repeat> + </sequence> + </syntax> <syntax alias="touch"> <argument argLabel="file" description="touch the given file"/> </syntax> + <syntax alias="wc"> + <sequence> + <optionSet> + <option argLabel="bytes" shortName="c" longName="bytes"/> + <option argLabel="chars" shortName="m" longName="chars"/> + <option argLabel="lines" shortName="l" longName="lines"/> + <option argLabel="worlds" shortName="w" longName="words"/> + <option argLabel="maxCharLine" shortName="L" longName="max-line-length"/> + </optionSet> + <repeat> + <argument argLabel="files"/> + </repeat> + </sequence> + </syntax> </extension> <extension point="org.jnode.security.permissions"> Added: trunk/cli/descriptors/org.jnode.command.system.xml =================================================================== --- trunk/cli/descriptors/org.jnode.command.system.xml (rev 0) +++ trunk/cli/descriptors/org.jnode.command.system.xml 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,255 @@ +<?xml version="1.0" encoding="UTF-8"?> +<!DOCTYPE plugin SYSTEM "jnode.dtd"> + +<plugin id="org.jnode.command.system" + name="JNode system commands" + version="@VERSION@" + provider-name="@PROVIDER@" + license-name="lgpl"> + + <requires> + <import plugin="org.jnode.shell.syntax"/> + </requires> + + <runtime> + <library name="jnode-coreutils.jar"> + <export name="org.jnode.command.system.*"/> + </library> + </runtime> + + <extension point="org.jnode.shell.aliases"> + <alias name="alias" class="org.jnode.shell.command.AliasCommand"/> + <alias name="bindkeys" class="org.jnode.shell.command.BindKeysCommand"/> + <alias name="class" class="org.jnode.shell.command.ClassCommand"/> + <alias name="classpath" class="org.jnode.shell.command.ClasspathCommand" internal="yes"/> + <alias name="gc" class="org.jnode.shell.command.GcCommand"/> + <alias name="isolate" class="org.jnode.shell.command.IsolateCommand"/> + <alias name="java" class="org.jnode.shell.command.JavaCommand"/> + <alias name="kill" class="org.jnode.shell.command.KillCommand"/> + <alias name="loadkeys" class="org.jnode.shell.command.LoadkeysCommand"/> + <alias name="locale" class="org.jnode.shell.command.LocaleCommand"/> + <alias name="memory" class="org.jnode.shell.command.MemoryCommand"/> + <alias name="namespace" class="org.jnode.shell.command.NamespaceCommand"/> + <alias name="onheap" class="org.jnode.shell.command.OnHeapCommand"/> + <alias name="page" class="org.jnode.shell.command.PageCommand"/> + <alias name="printenv" class="org.jnode.shell.command.PrintEnvCommand"/> + <alias name="propset" class="org.jnode.shell.command.SetCommand" internal="yes"/> + <alias name="run" class="org.jnode.shell.command.RunCommand"/> + <alias name="syntax" class="org.jnode.shell.command.SyntaxCommand"/> + <alias name="terminate" class="org.jnode.shell.command.TerminateCommand"/> + <alias name="thread" class="org.jnode.shell.command.ThreadCommand"/> + </extension> + + <extension point="org.jnode.shell.syntaxes"> + <syntax alias="alias"> + <empty description="List all aliases"/> + <option argLabel="remove" shortName="r" description="Remove an alias"/> + <sequence description="Create or update an alias"> + <argument argLabel="alias"/> + <argument argLabel="className"/> + </sequence> + </syntax> + <syntax alias="bindkeys"> + <empty description="Show the key bindings"/> + <option argLabel="reset" longName="reset" description="Reset the key bindings to the default settings"/> + <sequence description="Remove key bindings"> + <option argLabel="remove" shortName="r" longName="remove"/> + <argument argLabel="action"/> + <repeat minCount="0"> + <alternatives> + <argument argLabel="vkSpec"/> + <argument argLabel="character"/> + </alternatives> + </repeat> + </sequence> + <sequence description="Add key bindings"> + <option argLabel="add" shortName="a" longName="add"/> + <argument argLabel="action"/> + <repeat minCount="1"> + <alternatives> + <argument argLabel="vkSpec"/> + <argument argLabel="character"/> + </alternatives> + </repeat> + </sequence> + </syntax> + <syntax alias="class" description="Show details of a Java class"> + <argument argLabel="className"/> + </syntax> + <syntax alias="classpath"> + <empty description="Print the current classpath"/> + <option argLabel="addUrl" longName="add" description="add a URL to the classpath"/> + <option argLabel="clear" longName="clear" description="clear the classpath"/> + <option argLabel="refresh" longName="refresh" description="refresh the classpath"/> + </syntax> + <syntax alias="gc"> + <empty description="Run the garbage collector"/> + <sequence description="Set heap debug flags"> + <option argLabel="set" longName="set"/> + <repeat minCount="1"> + <argument argLabel="debugFlag"/> + </repeat> + </sequence> + <sequence description="Clear heap debug flags"> + <option argLabel="clear" longName="clear"/> + <repeat minCount="1"> + <argument argLabel="debugFlag"/> + </repeat> + </sequence> + <option argLabel="show" longName="show" description="Show heap debug flags"/> + </syntax> + <syntax alias="isolate"> + <empty description="Show basic information about all isolates in the system"/> + </syntax> + <syntax alias="java" description="Run a Java class via its 'main' method"> + <sequence> + <argument argLabel="className"/> + <repeat> + <argument argLabel="arg"/> + </repeat> + </sequence> + </syntax> + <syntax alias="kill" description="Kill a thread"> + <sequence> + <repeat maxCount="1"> + <option argLabel="debug" longName="debug"/> + </repeat> + <argument argLabel="threadId"/> + </sequence> + </syntax> + <syntax alias="loadkeys"> + <empty description="Print the current keyboard layout"/> + <sequence description="Change the current keyboard layout"> + <option argLabel="set" shortName="s" longName="set"/> + <alternatives> + <argument argLabel="layout"/> + <sequence> + <option argLabel="triple" shortName="t" longName="triple"/> + <argument argLabel="country"/> + <optional> + <argument argLabel="language"/> + <optional> + <argument argLabel="variant"/> + </optional> + </optional> + </sequence> + </alternatives> + </sequence> + <sequence description="Register a keyboard layout"> + <option argLabel="add" shortName="a" longName="add"/> + <alternatives> + <argument argLabel="layout"/> + <sequence> + <option shortName="t" longName="triple" argLabel="triple"/> + <argument argLabel="country"/> + <optional> + <argument argLabel="language"/> + <optional> + <argument argLabel="variant"/> + </optional> + </optional> + </sequence> + </alternatives> + <argument argLabel="class"/> + </sequence> + <sequence description="Unregister a keyboard layout"> + <option argLabel="remove" shortName="r" longName="remove"/> + <alternatives> + <argument argLabel="layout"/> + <sequence> + <option argLabel="triple" shortName="t" longName="triple"/> + <argument argLabel="country"/> + <optional> + <argument argLabel="language"/> + <optional> + <argument argLabel="variant"/> + </optional> + </optional> + </sequence> + </alternatives> + </sequence> + </syntax> + <syntax alias="locale"> + <empty description="Print the current default Locale name"/> + <option argLabel="list" longName="list" shortName="l" description="List the names of the available Locales"/> + <sequence description="Change the default Locale"> + <argument argLabel="language"/> + <optional> + <argument argLabel="country"/> + <optional> + <argument argLabel="variant"/> + </optional> + </optional> + </sequence> + </syntax> + <syntax alias="memory" description="Show JNode memory usage"/> + <syntax alias="namespace" description="Print the contents of the system namespace"/> + <syntax alias="onheap" description="Print heap object count and size statistics"> + <optionSet> + <option argLabel="minCount" longName="minCount"/> + <option argLabel="minTotalSize" longName="minTotalSize"/> + </optionSet> + </syntax> + <syntax alias="page"> + <empty description="Filter standard input a page (screen) at a time"/> + <argument argLabel="file" description="Output the file a page (screen) at a time"/> + </syntax> + <syntax alias="propset"> + <sequence description="Set a shell property"> + <option argLabel="shell" shortName="s" longName="shell"/> + <argument argLabel="skey"/> + <argument argLabel="value"/> + </sequence> + <sequence> + <argument description="Remove a shell property" argLabel="skey"/> + <option argLabel="shell" shortName="s" longName="shell"/> + </sequence> + <sequence description="Set a system property"> + <argument argLabel="key"/> + <argument argLabel="value"/> + </sequence> + <argument description="Remove a system property" argLabel="key"/> + </syntax> + <syntax alias="run" description="Run a command file"> + <argument argLabel="file"/> + </syntax> + <syntax alias="syntax"> + <empty description="List aliases which have syntaxes"/> + <option argLabel="dumpAll" longName="dump-all" description="Dump all syntaxes"/> + <sequence description="Dump the syntax for a given alias"> + <option argLabel="dump" shortName="d" longName="dump"/> + <argument argLabel="alias"/> + </sequence> + <sequence description="Load a new syntax for a given alias"> + <option argLabel="file" shortName="l" longName="load"/> + <argument argLabel="alias"/> + </sequence> + <sequence description="Remove the syntax for a given alias"> + <option argLabel="remove" shortName="r" longName="remove"/> + <argument argLabel="alias"/> + </sequence> + </syntax> + <syntax alias="terminate" description="Terminate an isolate"> + <argument argLabel="id" description="isolate identifier"/> + </syntax> + <syntax alias="thread"> + <optional description="Display all extant JNode Threads"> + <option argLabel="groupDump" shortName="g" longName="groupDump"/> + </optional> + <argument argLabel="threadName" description="Display the named Thread"/> + </syntax> + </extension> + + <extension point="org.jnode.security.permissions"> + <permission class="java.util.PropertyPermission" name="*" actions="read,write"/> + <permission class="java.lang.RuntimePermission" name="getProtectionDomain"/> + <permission class="java.lang.RuntimePermission" name="createClassLoader"/> + <permission class="java.lang.RuntimePermission" name="setContextClassLoader"/> + <permission class="java.lang.RuntimePermission" name="modifyThreadGroup"/> + <permission class="java.io.FilePermission" name="<<ALL FILES>>" actions="read,write"/> + <permission class="org.jnode.security.JNodePermission" name="getVmThread"/> + <permission class="org.jnode.security.JNodePermission" name="getVmClass"/> + <permission class="java.lang.reflect.ReflectPermission" name="suppressAccessChecks"/> + </extension> + +</plugin> Copied: trunk/cli/src/commands/org/jnode/command/common/BasenameCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/posix/BasenameCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/BasenameCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/BasenameCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,79 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import org.jnode.shell.AbstractCommand; +import org.jnode.shell.syntax.Argument; +import org.jnode.shell.syntax.StringArgument; + +/** + * Unix `basename` command. + * + * @see {@link http://www.opengroup.org/onlinepubs/000095399/utilities/basename.html} + * @author chris boertien + */ +public class BasenameCommand extends AbstractCommand { + + private static final String help_name = "Strip this fileargName of its directory and optionally argSuffix components."; + private static final String help_suffix = "Strip this argSuffix from the fileargName"; + private static final String help_super = "Strip directory and argSuffix from filesargNames"; + + private final StringArgument argName = new StringArgument("name", Argument.MANDATORY, help_name); + private final StringArgument argSuffix = new StringArgument("suffix", Argument.OPTIONAL, help_suffix); + + public BasenameCommand() { + super(help_super); + registerArguments(argName, argSuffix); + } + + public void execute() { + String name = argName.getValue(); + + int start = 0; + int end = name.length(); + + boolean allSlashes = true; + for (char c : name.toCharArray()) { + if (c != '/') { + allSlashes = false; + break; + } + } + + if (allSlashes) { + name = "/"; + } else { + if (name.endsWith("/")) { + end--; + } + start = name.lastIndexOf('/', end - 1) + 1; + name = name.substring(start, end); + + if (argSuffix.isSet()) { + String suffix = argSuffix.getValue(); + if (!name.equals(suffix) && name.endsWith(suffix)) { + name = name.substring(0, name.length() - suffix.length()); + } + } + } + getOutput().getPrintWriter().println(name); + } +} Copied: trunk/cli/src/commands/org/jnode/command/common/DateCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/DateCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/DateCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/DateCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,53 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import java.util.Date; + +import org.jnode.shell.AbstractCommand; + +/** + * A shell command to access the display the system date. + * @author Matt Paine + * @author cr...@jn... + */ +public class DateCommand extends AbstractCommand { + + private static final String help_super = "Print the current date"; + + public DateCommand() { + super(help_super); + } + + @Override + public void execute() throws Exception { + getOutput().getPrintWriter().println(new Date()); + } + + /** + * Displays the system date + * @param args No arguments. + **/ + public static void main(String[] args) throws Exception { + new DateCommand().execute(args); + } + +} Copied: trunk/cli/src/commands/org/jnode/command/common/DirnameCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/posix/DirnameCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/DirnameCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/DirnameCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,78 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import org.jnode.shell.AbstractCommand; +import org.jnode.shell.syntax.Argument; +import org.jnode.shell.syntax.StringArgument; + +/** + * Unix `dirname` command + * @see http://www.opengroup.org/onlinepubs/000095399/utilities/dirname.html + * @author chris boertien + */ +public class DirnameCommand extends AbstractCommand { + + private static final String help_name = "Strip the non-directory suffix from this file name"; + private static final String help_super = "Strip non-directory suffix from the file name"; + + private final StringArgument argName = new StringArgument("name", Argument.MANDATORY, help_name); + + public DirnameCommand() { + super(help_super); + registerArguments(argName); + } + + public void execute() { + String name = argName.getValue(); + + if (name.equals("")) { + name = "."; + } + + boolean allSlashes = true; + for (char c : name.toCharArray()) { + if (c != '/') { + allSlashes = false; + break; + } + } + + if (allSlashes) { + name = "/"; + } else { + int i = name.length() - 1; + if (name.endsWith("/")) { + i--; + } + i = name.lastIndexOf('/', i); + if (i == -1) { + name = "."; + } else if (i == 0) { + name = "/"; + } else { + name = name.substring(0, i); + } + } + + getOutput().getPrintWriter().println(name); + } +} Copied: trunk/cli/src/commands/org/jnode/command/common/EchoCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/EchoCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/EchoCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/EchoCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,66 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import java.io.PrintWriter; + +import org.jnode.shell.AbstractCommand; +import org.jnode.shell.syntax.Argument; +import org.jnode.shell.syntax.StringArgument; + +/** + * Echo the command's arguments to its output. + * + * @author epr + * @author cr...@jn... + */ +public class EchoCommand extends AbstractCommand { + + private static final String help_words = "the text to be printed"; + private static final String help_super = "Print text to standard output"; + + private final StringArgument argWords; + + public EchoCommand() { + super(help_super); + argWords = new StringArgument("text", Argument.MULTIPLE, help_words); + registerArguments(argWords); + } + + public static void main(String[] args) throws Exception { + new EchoCommand().execute(args); + } + + /** + * Execute the command + */ + public void execute() throws Exception { + PrintWriter out = getOutput().getPrintWriter(); + String[] words = argWords.getValues(); + for (int i = 0; i < words.length; i++) { + if (i > 0) { + out.print(' '); + } + out.print(words[i]); + } + out.println(); + } +} Copied: trunk/cli/src/commands/org/jnode/command/common/EnvCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/EnvCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/EnvCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/EnvCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,84 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import gnu.java.security.action.GetEnvAction; +import gnu.java.security.action.GetPropertiesAction; + +import java.io.PrintWriter; +import java.security.AccessController; +import java.util.Map; +import java.util.Properties; +import java.util.TreeMap; + +import org.jnode.shell.AbstractCommand; +import org.jnode.shell.ShellUtils; +import org.jnode.shell.syntax.Argument; +import org.jnode.shell.syntax.FlagArgument; + +/** + * @author epr + */ +public class EnvCommand extends AbstractCommand { + // FIXME ... this class and the corresponding alias are incorrectly named + + private static final String help_env = "If set, print the environment variables rather than the System props"; + private static final String help_shell = "If set, print the shell props rather than the System props"; + private static final String help_super = "Print the System/Shell props or Environment Variables"; + + private final FlagArgument envArg; + private final FlagArgument shellArg; + + public EnvCommand() { + super(help_super); + envArg = new FlagArgument("env", Argument.OPTIONAL | Argument.SINGLE, help_env); + shellArg = new FlagArgument("shell", Argument.OPTIONAL | Argument.SINGLE, help_shell); + registerArguments(envArg, shellArg); + } + + public static void main(String[] args) throws Exception { + new EnvCommand().execute(args); + } + + /** + * Execute this command + */ + public void execute() throws Exception { + final TreeMap<?, ?> sortedPs; + if (envArg.isSet()) { + Map<String, String> ps = + (Map<String, String>) AccessController.doPrivileged(new GetEnvAction()); + sortedPs = new TreeMap<Object, Object>(ps); + } else if (shellArg.isSet()) { + sortedPs = ShellUtils.getCurrentShell().getProperties(); + } else { + Properties ps = AccessController.doPrivileged(new GetPropertiesAction()); + sortedPs = new TreeMap<Object, Object>(ps); + } + + final PrintWriter out = getOutput().getPrintWriter(); + for (Map.Entry<?, ?> entry : sortedPs.entrySet()) { + final String key = entry.getKey().toString(); + final String value = entry.getValue().toString(); + out.println(key + '=' + value); + } + } +} Copied: trunk/cli/src/commands/org/jnode/command/common/ExitCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/ExitCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/ExitCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/ExitCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,50 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import org.jnode.naming.InitialNaming; +import org.jnode.shell.AbstractCommand; +import org.jnode.shell.CommandShell; +import org.jnode.shell.ShellManager; + +/** + * @author Levente S\u00e1ntha + */ +public class ExitCommand extends AbstractCommand { + + private static final String help_super = "Exit the current shell"; + + public ExitCommand() { + super(help_super); + } + + public static void main(String[] args) throws Exception { + new ExitCommand().execute(args); + } + + /** + * Execute this command + */ + public void execute() throws Exception { + ShellManager sm = InitialNaming.lookup(ShellManager.NAME); + ((CommandShell) sm.getCurrentShell()).exit(); + } +} Copied: trunk/cli/src/commands/org/jnode/command/common/ExprCommand.java (from rev 5362, trunk/shell/src/shell/org/jnode/shell/command/posix/ExprCommand.java) =================================================================== --- trunk/cli/src/commands/org/jnode/command/common/ExprCommand.java (rev 0) +++ trunk/cli/src/commands/org/jnode/command/common/ExprCommand.java 2009-04-29 21:59:13 UTC (rev 5363) @@ -0,0 +1,339 @@ +/* + * $Id$ + * + * Copyright (C) 2003-2009 JNode.org + * + * This library is free software; you can redistribute it and/or modify it + * under the terms of the GNU Lesser General Public License as published + * by the Free Software Foundation; either version 2.1 of the License, or + * (at your option) any later version. + * + * This library is distributed in the hope that it will be useful, but + * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public + * License for more details. + * + * You should have received a copy of the GNU Lesser General Public License + * along with this library; If not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + */ + +package org.jnode.command.common; + +import java.io.PrintWriter; +import java.util.Arrays; +import java.util.HashSet; +import java.util.Set; + +import org.jnode.shell.AbstractCommand; + + +/** + * JNode implementation of the UNIX 'expr' command + * + * @author cr...@jn... + */ +public class ExprCommand extends AbstractCommand { + private static class ExprException extends Exception { + private static final long serialVersionUID = 1L; + + private ExprException(String msg) { + super(msg); + } + } + + private static class ExprSyntaxException extends ExprException { + private static final long serialVersionUID = 1L; + + private ExprSyntaxException(String msg) { + super(msg); + } + + private ExprSyntaxException() { + super("syntax error"); + } + } + + private static final Set<String> RESERVED_WORDS = new HashSet<String>( + Arrays.asList(new String[] { + "|", "&", "+", "-", "*", "/", "%", "(", ")", "<", "<=", "=", "!=", + ">", ">=", ":", "match", "index", "substr", "find"})); + + // FIXME convert to use the new commandline syntax mechanism so that + // we get command completion. + + String[] args; + int pos; + + + public void execute() throws Exception { + PrintWriter out = getOutput().getPrintWriter(true); + PrintWriter err = getError().getPrintWriter(true); + try { + this.args = getCommandLine().getArguments(); + if (args.length == 0) { + throw new ExprSyntaxException("missing operand"); + } + this.pos = 0; + Object res = parseExpr(true); + if (this.pos < this.args.length) { + throw new ExprSyntaxException(); + } + out.println(res); + out.flush(); + exit(isTrue(res) ? 0 : 1); + } catch (ExprSyntaxException ex) { + err.println(ex.getMessage()); + exit(2); + } catch (ExprException ex) { + err.println(ex.getMessage()); + exit(3); + } + } + + /** + * Parse an expression. If 'evaluate' is true, the parsed expression + * is evaluate and the resulting value is returned. Otherwise, the + * result is a non-null dummy value. + * + * @param evaluate + * @return + * @throws ExprException + */ + private Object parseExpr(boolean evaluate) throws ExprException { + if (pos >= args.length) { + throw new ExprSyntaxException(); + } + String op = args[pos]; + if (op.equals("match")) { + return parseMatch(evaluate); + } else if (op.equals("index")) { + return parseIndex(evaluate); + } else if (op.equals("substr")) { + return parseSubstr(evaluate); + } else if (op.equals("length")) { + return parseLength(evaluate); + } else { + return parseOrExpr(evaluate); + } + } + + private Object parseOrExpr(final boolean evaluate) throws ExprException { + Object res = parseAndExpr(evaluate); + boolean eval = evaluate; + while (pos < args.length && args[pos].equals("|")) { + pos++; + eval = eval && !isTrue(res); + Object tmp = parseAndExpr(eval); + if (eval) { + res = tmp; + } + } + return evaluate ? res : 0; + } + + private Object parseAndExpr(final boolean evaluate) throws ExprException { + Object res = parseRelExpr(evaluate); + boolean eval = evaluate; + while (pos < args.length && args[pos].equals("&")) { + pos++; + if (isTrue(res)) { + parseRelExpr(eval); + res = 0; + } else { + parseRelExpr(false); + } + } + return res; + } + + priva... [truncated message content] |