File: TilerMenuImpl.mesa   
Copyright © 1984 by Xerox Corporation. All rights reserved.
Created by: Bob Mayo, July 27, 1984 8:10:46 pm PDT
Last Edited by: July 30, 1984 11:15:34 am PDT PDT
DIRECTORY
TilerMenu,
TerminalIO USING [WriteRope, UserAbort, RequestSelection],
Rope USING [ROPE, Equal],
CDSequencer USING [ImplementCommand, ExecuteCommand, Command];
TilerMenuImpl: CEDAR PROGRAM    
IMPORTS TerminalIO, Rope, CDSequencer EXPORTS TilerMenu = BEGIN
numCommands: CARDINAL ← 0;
atomList: LIST OF ATOMNIL;
nameList: LIST OF Rope.ROPENIL;
Register: PUBLIC PROC [name: Rope.ROPE, commandAtom: ATOM] = BEGIN
a: LIST OF ATOM ← atomList;
n: LIST OF Rope.ROPE ← nameList;
WHILE a # NIL DO
IF Rope.Equal[n.first, name] THEN {
a.first ← commandAtom;
RETURN;
};
a ← a.rest;
n ← n.rest;
ENDLOOP;
numCommands ← numCommands + 1;
atomList ← CONS[commandAtom, atomList];
nameList ← CONS[name, nameList];
END;
TilerMenuProc: PROC [comm: CDSequencer.Command] = BEGIN
ENABLE TerminalIO.UserAbort => GOTO userAbort;
selection, pos: INT;
atoms: LIST OF ATOM;
IF numCommands < 1 THEN GOTO none;
selection ← TerminalIO.RequestSelection[label: "Module Generator Menu", choice: nameList];
IF selection < 1 THEN GOTO skipped;
pos ← 1; atoms ← atomList;
IF selection > numCommands THEN ERROR;
WHILE pos # selection DO pos ← pos + 1; atoms ← atoms.rest; ENDLOOP;
CDSequencer.ExecuteCommand[comm: comm, as: atoms.first];
EXITS
userAbort => TerminalIO.WriteRope["discarded\n"];
skipped => TerminalIO.WriteRope["skipped\n"];
none => TerminalIO.WriteRope["No tiler commands are running.\n"];
END;
-- Main body
CDSequencer.ImplementCommand[$ModuleMenu, TilerMenuProc,, doQueue];
END.