SLControl.mesa
Last edited by Satterthwaite on January 6, 1983 2:21 pm 
Last Edited by: Maxwell, August 29, 1983 3:49 pm
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 = {
switches
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
others are unused
Commander interfaces
DoCommand: SAFE PROC[cmd: Commander.Handle] = TRUSTED {
switches: Rope.ROPE;
results: CommandUtil.PairList;
commandArgs: CommandUtil.PairList;
localSwitches: CommandUtil.Switches;
inputName, outputName, rootName: Rope.ROPENIL;
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];
main loop
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;
};
global Binder initialization
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[];
}.