Commander.mesa
Copyright © 1985 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
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: REFNIL, msg: ROPENIL];
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: ROPENIL, clientData: REFNIL, interpreted: BOOLTRUE];
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: STREAMNIL,
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[].
commandLine: ROPE,
commandLine is the command line with the first "token" (as defined by IO.GetCedarToken) removed; commandLine ends with CR
command: ROPENIL,
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.
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.
procData: CommandProcHandle ← NIL
This field contains the information registered with the CommandProc, doc and clientData may be useful to the authors of commands.
];
CommandProcHandle: TYPE = REF CommandProcObject;
CommandProcObject: TYPE = RECORD [
proc: CommandProc ← NIL,
... is the procedure to invoke in order to perform the command.
doc: ROPENIL,
... is a short blurb about what the command does.
clientData: REF ANYNIL,
... is passed to the command when it is invoked.
interpreted: BOOLTRUE
... 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: BOOLFALSE];
... 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.
PrependWorkingDir: PROC [key: ROPE] RETURNS [ROPE];
... tests for a directory specification in the key ('[ or '/ in the first character). If there is one (or key = NIL), then returns key. Otherwise, prepends the working directory for the current process to the key and returns the result.
The following procedures are useful for manipulating propertyLists.
PutProperty: PUBLIC PROC [key: REF ANY, val: REF ANY, aList: AList] RETURNS [AList];
... is like List.PutAssoc, except that it works correctly if the key is a ROPE.
GetProperty: PROC [key: REF ANY, aList: AList] RETURNS [val: REF ANY];
... is like List.Assoc, except that it works correctly if the key is a ROPE.
END.