<> <> <> DIRECTORY Commander: TYPE USING [Handle, Register], CommandUtil: TYPE USING [ Echo, Failed, GetNth, GetRootName, GetSwitches, ListLength, PairList, Parse, SetExtension, Switches], IO: TYPE USING [char, CR, Put, PutChar, PutRope, rope, STREAM, time, UserAbort], ListerOps: TYPE USING [ListGlobals], ListerUtil: TYPE USING [SetTypescript], OSMiscOps: TYPE USING [BcdCreateTime], Rope: TYPE USING [ROPE]; GLControl: PROGRAM IMPORTS Commander, CommandUtil, IO, ListerOps, ListerUtil, OSMiscOps = { <> StandardDefaults: PACKED ARRAY CHAR ['a..'z] OF BOOL = [ FALSE, -- a FALSE, -- b FALSE, -- c FALSE, -- d Call debugger on error FALSE, -- e FALSE, -- f FALSE, -- g FALSE, -- h FALSE, -- i FALSE, -- j FALSE, -- k FALSE, -- l FALSE, -- m FALSE, -- n FALSE, -- o FALSE, -- p FALSE, -- q FALSE, -- r FALSE, -- s FALSE, -- t output to Typescript FALSE, -- u FALSE, -- v FALSE, -- w FALSE, -- x FALSE, -- y FALSE];-- z <> DoCommand: SAFE PROC[cmd: Commander.Handle] = TRUSTED { switches: Rope.ROPE; results: CommandUtil.PairList; commandArgs: CommandUtil.PairList; localSwitches: CommandUtil.Switches; inputName, outputName, rootName: Rope.ROPE _ NIL; defaultSwitches: CommandUtil.Switches _ StandardDefaults; RepeatCommand: PROC [s: IO.STREAM] = { IO.PutRope[s, "\nListing "]; IO.PutRope[s, inputName]; IO.PutRope[s, ", output to "]; IO.PutRope[s, outputName]; IO.PutChar[s, IO.CR]}; WriteHerald: PROC [stream: IO.STREAM, id: Rope.ROPE] = { stream.Put[ IO.rope["Cedar 3.4 Symbol Lister of "], IO.time[OSMiscOps.BcdCreateTime[]], IO.char[IO.CR]]; IF id # NIL THEN stream.Put[IO.rope[id], IO.rope[" -- "]]; stream.Put[IO.time[], IO.char[IO.CR]]}; ListerUtil.SetTypescript[cmd.out]; WriteHerald[cmd.out, NIL]; <
> DO { Initialize: PROC = INLINE {RepeatCommand[cmd.out]}; Finalize: PROC = INLINE {}; [inputName, commandArgs, results, switches] _ CommandUtil.Parse[cmd.commandLine ! CommandUtil.Failed => {GO TO badSyntax}]; IF inputName = NIL AND switches = NIL THEN EXIT; -- done listing cmd.out.PutRope["\nCommand: "]; CommandUtil.Echo[ d: cmd.out, operator: inputName, argList: commandArgs, resultList: results, switches: switches]; IF inputName = NIL THEN GO TO globalSwitches; SELECT CommandUtil.ListLength[results] FROM 0 => outputName _ NIL; 1 => outputName _ CommandUtil.GetNth[list: results, n: 0]; ENDCASE => GO TO badSemantics; rootName _ CommandUtil.GetRootName[inputName]; localSwitches _ CommandUtil.GetSwitches[switches, defaultSwitches]; IF localSwitches['t] THEN outputName _ NIL ELSE {IF outputName = NIL THEN outputName _ rootName; outputName _ CommandUtil.SetExtension[outputName, "sl"]}; Initialize[]; ListerOps.ListGlobals[rootName, outputName ! UNWIND => Finalize[]]; Finalize[]; IF cmd.in.UserAbort[] THEN EXIT; EXITS globalSwitches => { defaultSwitches _ CommandUtil.GetSwitches[switches, defaultSwitches]; switches _ NIL; results _ NIL}; badSemantics => { results _ NIL; cmd.out.PutRope["\n -- Illegal command"]}}; REPEAT badSyntax => {cmd.out.PutRope["-- Illegal syntax"]}; ENDLOOP; }; <> Init: PROC = { Commander.Register["gl", DoCommand, "Lists the contents of a program module's global frame, by reading the .bcd."]; Commander.Register["GlobalLister", DoCommand, "Lists the contents of a program module's global frame, by reading the .bcd."]}; Init[]; }.