<<>> <> <> <> <> <> <> <> <> 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]; <> <> <<>> Register: PROC [key: ROPE, proc: CommandProc ¬ NIL, doc: ROPE ¬ NIL, clientData: REF ¬ NIL, interpreted: BOOL ¬ TRUE]; <> Handle: TYPE = REF CommandObject; CommandObject: TYPE = RECORD [ in, out, err: STREAM ¬ NIL, <> command: ROPE ¬ NIL, <> commandLine: ROPE ¬ NIL, <> procData: CommandProcHandle ¬ NIL, <> propertyList: AList ¬ NIL <> ]; 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.