<> <> <> <> 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 ATOM _ NIL; nameList: LIST OF Rope.ROPE _ NIL; 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.