MODULE Commands; IMPORT Objects, Modules, Streams, KernelLog, Trace, Machine; CONST Wait* = 0; InheritContext* = 1; Silent* = 2; Ok* = 0; CommandNotFound* = 3901; CommandError* = 3902; CommandParseError* = 3903; CommandTrapped* = 3904; Delimiter* = \"."\; Started = 0; Loaded = 1; Finished = 2; TYPE Context* = OBJECT VAR in-, arg-: Streams.Reader; out-, error-: Streams.Writer; caller-: OBJECT; result*: WORD; PROCEDURE ^ & Init*(in, arg: Streams.Reader; out, error: Streams.Writer; caller: OBJECT); END Context; ReaderMonitor* = OBJECT (Streams.Reader) VAR in: Streams.Reader; tracer: Streams.Writer; pos0: Streams.Position; tracedPos: LONGINT; PROCEDURE ^ & Init(in: Streams.Reader; tracer: Streams.Writer); PROCEDURE ^ Receiver(VAR buf: ARRAY OF CHAR; ofs, size, min: LONGINT; VAR len, res: LONGINT); PROCEDURE ^ CanSetPos*(): BOOLEAN; PROCEDURE ^ SetPos*(pos: Streams.Position); PROCEDURE ^ Pos*(): Streams.Position; END ReaderMonitor; CommandProc = PROCEDURE ; CommandContextProc = PROCEDURE (context: Context); Runner = OBJECT {EXCLUSIVE} VAR moduleName, commandName: Modules.Name; context: Context; tracer: Streams.Writer; r: ReaderMonitor; proc: CommandProc; commandProc: CommandContextProc; msg: ARRAY 128 OF CHAR; res: WORD; module: Modules.Module; state: WORD; exception: BOOLEAN; PROCEDURE ^ & Init*(CONST moduleName, commandName: Modules.Name; context: Context); PROCEDURE ^ Join(this: WORD; VAR res: WORD; VAR msg: ARRAY OF CHAR); BEGIN{ACTIVE, SAFE} END Runner; VAR emptyString: ARRAY 1 OF CHAR; silentWriter: Streams.Writer; trace: BOOLEAN; defaultContext: Context; PROCEDURE ^ GetEmptyReader(): Streams.Reader; PROCEDURE ^ SendNothing(CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: WORD); PROCEDURE ^ Split*(CONST cmdstr: ARRAY OF CHAR; VAR moduleName, procedureName: Modules.Name; VAR res: WORD; VAR msg: ARRAY OF CHAR); PROCEDURE ^ GetContext*(): Context; PROCEDURE ^ Activate*(CONST cmd: ARRAY OF CHAR; context: Context; flags: SET; VAR res: WORD; VAR msg: ARRAY OF CHAR); PROCEDURE ^ Call*(cmds: ARRAY OF CHAR; flags: SET; VAR res: WORD; VAR msg: ARRAY OF CHAR); PROCEDURE ^ Init; BEGIN END Commands.