Commander.mesa
Copyright Ó 1985, 1986, 1991 by Xerox Corporation. All rights reserved.
McGregor, 7-Dec-81 10:53:03
Paul Rovner, March 22, 1983 12:25 pm
Stewart, September 9, 1983 11:40 am
Russ Atkinson (RRA) February 28, 1985 1:34:11 pm PST
Michael Plass, August 19, 1991 11:04 am PDT
Basic command registration; refer to CommanderOps for more support for implementing command procedures.
DIRECTORY
IO USING [STREAM],
List USING [AList],
Rope USING [ROPE];
Commander: CEDAR DEFINITIONS = BEGIN
OPEN IO, List, Rope;
CommandProc: TYPE = PROC [cmd: Handle] RETURNS [result: REF ¬ NIL, msg: ROPE ¬ NIL];
A CommandProc represents a function which a user can invoke from a CommandTool.
The result will be stored in the CommandTool property list under the key $Result for the possible use by the suceeding command. Any result other than the ATOM $Failure is deemed to indicate some sort of success.
Register: PROC [key: ROPE, proc: CommandProc ¬ NIL, doc: ROPE ¬ NIL, clientData: REF ¬ NIL, interpreted: BOOL ¬ TRUE];
A command may be unregistered by registering proc: NIL with the appropriate key. Case is ignored for keys. If the key has no directory part, the current working directory will be prepended.
Handle: TYPE = REF CommandObject;
CommandObject: TYPE = RECORD [
in, out, err: STREAM ¬ NIL,
in and out may be redirected. err is a bidirectional stream which always allows communication with the user. UserAbort is indicated only by in.UserAborted[].
command: ROPE ¬ NIL,
The first token on the command line, used as a key to select this CommandProc. This rope will be the key under which the command was registered, rather than the (possibly) prefix of that string by which the command was invoked.
commandLine: ROPE ¬ NIL,
commandLine is the command line with the first token (the command) removed; commandLine ends with end-of-line character.
procData: CommandProcHandle ¬ NIL,
This field contains the information registered with the CommandProc, doc and clientData may be useful to the authors of commands.
propertyList: AList ¬ NIL
Name value pairs. The key $Result will be associated with the result of the previous command. The command line unprocessed by the CommandTool will be found under $OriginalCommandLine. A CommandProc may alter the property list either by appending to it, in which case the changes are permanent (seen by later commands), or by prepending, in which case the changes will be discarded when the CommandProc returns. Changes made to the value fields of existing properties are always permanent.
];
CommandProcHandle: TYPE = REF CommandProcObject;
CommandProcObject: TYPE = RECORD [
proc: CommandProc ¬ NIL,
... is the procedure to invoke in order to perform the command.
doc: ROPE ¬ NIL,
... is a short blurb about what the command does.
clientData: REF ANY ¬ NIL,
... is passed to the command when it is invoked.
interpreted: BOOL ¬ TRUE
... controls how the command line is to be interpreted. FALSE means to do no processing, since the command itself has funny syntax. TRUE means to do I/O redirection, use semicolon separators and other processing.
];
Enumerate: PROC [EnumerateAction] RETURNS [key: ROPE, procData: CommandProcHandle];
EnumerateAction: TYPE = PROC [key: ROPE, procData: CommandProcHandle] RETURNS [stop: BOOL ¬ FALSE];
... calls the EnumerateAction with the key and registered procedure data for all registered commands. It will stop early if the EnumerateAction returns TRUE. Commands are not enumerated in any particular order.
Lookup: PROC [key: ROPE] RETURNS [procData: CommandProcHandle];
... will look up the command and return the associated CommandProcHandle (NIL if no such command is registered). Case of keys does not matter. As in Register, if no directory part is mentioned, the current working directory will be prepended to the key.
END.