GLControl.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 [ListGlobals],
ListerUtil: TYPE USING [SetTypescript],
OSMiscOps: TYPE USING [BcdCreateTime],
Rope: TYPE USING [ROPE];
GLControl: 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
FALSE, -- s
FALSE, -- t output to Typescript
FALSE, -- u
FALSE, -- v
FALSE, -- w
FALSE, -- x
FALSE, -- y
FALSE];-- z
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 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;
};
global Binder initialization
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[];
}.