<> <> <> 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 [ListSymbols], ListerUtil: TYPE USING [SetTypescript], OSMiscOps: TYPE USING [BcdCreateTime], Rope: TYPE USING [ROPE]; SLControl: 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 TRUE , -- S Symbols FALSE, -- T Trees (for bodies) 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 outputName = NIL THEN outputName _ rootName; outputName _ CommandUtil.SetExtension[outputName, "sl"]; Initialize[]; ListerOps.ListSymbols[rootName, outputName, localSwitches['s], localSwitches['t] ! 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["sl", DoCommand, "Produces a symbol listing for a .bcd file."]; Commander.Register["SymbolLister", DoCommand, "Produces a symbol listing for a .bcd file."]}; Init[]; }.