DIRECTORY Commander USING [CommandProc, Register], EditedStream, Icons USING [IconFlavor, NewIconFromFile], InputFocus USING [PopInputFocus, PushInputFocus], IO, PopUpMenu, Process, Rope, RuntimeError USING [UNCAUGHT], TerminalIO, ViewerClasses USING [Viewer], ViewerIO USING [CreateViewerStreams, GetViewerFromStream], ViewerOps USING [PaintViewer, OpenIcon], ViewerTools USING [SetSelection]; TerminalIOImpl: CEDAR MONITOR IMPORTS Commander, EditedStream, Icons, InputFocus, IO, PopUpMenu, Process, Rope, RuntimeError, ViewerIO, ViewerOps, ViewerTools EXPORTS TerminalIO = BEGIN UserAbort: PUBLIC SIGNAL = CODE; -- Signalyzed allways outside of monitor-lock terminalParent: ViewerClasses.Viewer_NIL; messageUsed: BOOLEAN _ FALSE; in, out, editedIn: IO.STREAM _ NIL; terminalIcon: Icons.IconFlavor; inputIcon: Icons.IconFlavor; del: CHAR = LOOPHOLE[127, CHAR]; delRope: Rope.ROPE = Rope.FromChar[del]; moduleEntered: BOOLEAN _ FALSE; next: CONDITION; -- the next module might enter the "moduleEntered" region MyLock: INTERNAL PROC [] = BEGIN ENABLE UNWIND => NULL; WHILE moduleEntered DO WAIT next; ENDLOOP; moduleEntered _ TRUE; terminalParent.icon _ inputIcon; terminalParent.name _ "Terminal [Input Expected]"; ViewerOps.PaintViewer[terminalParent, caption]; END; MyUnLock: INTERNAL PROC [] = BEGIN ENABLE UNWIND => NULL; moduleEntered _ FALSE; NOTIFY next; terminalParent.icon _ terminalIcon; terminalParent.name _ "Terminal"; ViewerOps.PaintViewer[terminalParent, caption]; terminalParent.inhibitDestroy _ FALSE; END; LockList: TYPE = LIST OF PROC; lockList: LockList_NIL; unLockList: LockList_NIL; AddLock: PUBLIC ENTRY PROC [lock, unLock: PROC] = BEGIN ENABLE UNWIND => NULL; lockList _ CONS[lock, lockList]; IF unLockList=NIL THEN unLockList _ LIST[unLock] ELSE FOR l: LockList _ unLockList, l.rest DO IF l.rest=NIL THEN {l.rest_LIST[unLock]; EXIT} ENDLOOP; END; Lock: INTERNAL PROC = BEGIN FOR l: LockList _ lockList, l.rest WHILE l#NIL DO l.first[! RuntimeError.UNCAUGHT => CONTINUE] ENDLOOP END; UnLock: INTERNAL PROC = BEGIN FOR l: LockList _ unLockList, l.rest WHILE l#NIL DO l.first[! RuntimeError.UNCAUGHT => CONTINUE] ENDLOOP END; InternalCreateTerminal: INTERNAL PROC [] = BEGIN [in: in, out: out] _ ViewerIO.CreateViewerStreams[ name: "Terminal", viewer: NIL, editedStream: FALSE]; [editedIn] _ EditedStream.Create[in: in, echoTo: out]; terminalParent _ ViewerIO.GetViewerFromStream[out]; IF terminalParent=NIL THEN ERROR; IF terminalParent.iconic THEN { terminalParent.column _ right; ViewerOps.OpenIcon[terminalParent]; }; terminalParent.icon _ terminalIcon; END; Done: TYPE = {ok, repeat, intError, abort}; PrepareRequest: INTERNAL PROC [text, text2: Rope.ROPE _ NIL] = BEGIN InternalWriteRope[text]; InternalWriteRope[text2]; IF terminalParent.iconic THEN { terminalParent.column _ right; ViewerOps.OpenIcon[terminalParent]; }; InputFocus.PushInputFocus[terminalParent]; ViewerTools.SetSelection[terminalParent]; END; RequestRope: PUBLIC ENTRY PROC [text, text2: Rope.ROPE _ NIL] RETURNS [Rope.ROPE] = BEGIN ENABLE UNWIND => UnLock[]; done: Done; r: Rope.ROPE; DoIt: INTERNAL PROC [] = BEGIN ENABLE BEGIN IO.Error => IF ec=StreamClosed THEN { done_repeat; IO.Reset[editedIn]; CONTINUE } ELSE REJECT; EditedStream.Rubout => { done_abort; IO.Reset[editedIn]; CONTINUE }; END; PrepareRequest[text, text2]; r _ IO.GetLineRope[editedIn]; InputFocus.PopInputFocus[]; IF Rope.Find[r, delRope]>=0 THEN done_abort; END; Lock[]; DO done _ ok; DoIt[]; IF done=ok THEN {UnLock[]; RETURN [r]} ELSE IF done=repeat THEN {InternalWriteRope["XXX\n"]} ELSE {InternalWriteRope[" ..user abort\n"]; SIGNAL UserAbort} ENDLOOP; END; RequestChar: PUBLIC ENTRY PROC [text, text2: Rope.ROPE _ NIL] RETURNS [CHAR] = BEGIN ENABLE UNWIND => UnLock[]; done: Done; ch: CHAR; DoIt: INTERNAL PROC [] = BEGIN ENABLE BEGIN IO.Error => IF ec=StreamClosed THEN {done_repeat; CONTINUE} ELSE REJECT; EditedStream.Rubout => { done_abort; IO.Reset[in]; CONTINUE }; END; PrepareRequest[text, text2]; ch _ IO.GetChar[in]; -- returns immediately, no CR to eat InputFocus.PopInputFocus[]; IF ch=del THEN done_abort; END; Lock[]; DO done _ ok; DoIt[]; IF done=ok THEN {UnLock[]; RETURN[ch]} ELSE IF done=repeat THEN {InternalWriteRope["XXX\n"]} ELSE { InternalWriteRope[" ..user abortion\n"]; SIGNAL UserAbort }; ENDLOOP; END; RequestInt: PUBLIC ENTRY PROC [text, text2: Rope.ROPE _ NIL] RETURNS [INT] = BEGIN ENABLE UNWIND => UnLock[]; done: Done; i: INT; DoIt: INTERNAL PROC [] = BEGIN ENABLE BEGIN IO.Error => IF ec=StreamClosed THEN {done_repeat; CONTINUE} ELSE IF ec=Overflow THEN {done_intError; CONTINUE} ELSE IF ec=SyntaxError THEN {done_intError; CONTINUE} ELSE REJECT; EditedStream.Rubout => { done_abort; IO.Reset[editedIn]; CONTINUE }; END; ch: CHAR; PrepareRequest[text, text2]; i _ IO.GetInt[editedIn]; WHILE IO.CharsAvail[editedIn]>0 DO [ch] _ IO.GetChar[editedIn]; IF ch=del THEN done_abort; IF ch#15C AND done#abort THEN done_intError ENDLOOP; InputFocus.PopInputFocus[]; END; Lock[]; DO done _ ok; DoIt[]; IF done=ok THEN {UnLock[]; RETURN[i]} ELSE IF done=repeat THEN {InternalWriteRope["XXX\n"]} ELSE IF done=intError THEN {InternalWriteRope[" ?? (integer), please repeat: \n"]} ELSE {InternalWriteRope[" ..user abortion\n"]; SIGNAL UserAbort} ENDLOOP; END; ChoiceError: ERROR = CODE; RequestSelection: PUBLIC ENTRY PROC [ label: Rope.ROPE _ NIL, choice: LIST OF Rope.ROPE, text: Rope.ROPE _ NIL, default: NAT_0] RETURNS [NAT] = BEGIN ENABLE UNWIND => UnLock[]; c: NAT _ 0; IF (choice=NIL) OR (choice.first=NIL) THEN RETURN WITH ERROR ChoiceError; Lock[]; IF text#NIL THEN InternalWriteRope[text]; IO.Flush[out ! RuntimeError.UNCAUGHT => CONTINUE]; Process.Pause[Process.MsecToTicks[5]]; c _ PopUpMenu.RequestSelection[label, choice, default]; UnLock[]; RETURN [c]; END; UserSaysYes: PUBLIC PROC [label, text: Rope.ROPE _ NIL, default: BOOLEAN_FALSE] RETURNS [BOOLEAN] = BEGIN RETURN [SELECT RequestSelection[label, LIST["yes", "no"], text, (IF default THEN 1 ELSE 2)] FROM 1 => TRUE, 2 => FALSE ENDCASE => default]; END; InternalWriteRope: INTERNAL PROC [text: Rope.ROPE] = BEGIN IF out=NIL THEN InternalCreateTerminal[]; IO.PutRope[out, text ! IO.Error => { IF ec=StreamClosed THEN { InternalCreateTerminal[]; IO.PutRope[out, text]; CONTINUE } ELSE REJECT }]; END; WriteRope: PUBLIC ENTRY PROC [text: Rope.ROPE] = BEGIN ENABLE UNWIND => NULL; InternalWriteRope[text]; END; WriteLn: PUBLIC PROC [] = BEGIN WriteRope["\n"]; END; WriteChar: PUBLIC PROC [ch: CHAR] = BEGIN WriteRope[Rope.FromChar[ch]]; END; WriteInt: PUBLIC PROC [i: INT] = BEGIN WriteRope[IO.PutFR1[format: " %g", value: IO.int[i]]]; END; CreateTerminal: ENTRY Commander.CommandProc = BEGIN ENABLE UNWIND => NULL; InternalCreateTerminal[]; END; Init: PROC [] = BEGIN terminalIcon _ Icons.NewIconFromFile["TerminalIO.icons", 0 ! RuntimeError.UNCAUGHT => { terminalIcon _ Icons.NewIconFromFile["/Cedar/ChipNDale/6.0/TerminalIO/TerminalIO.icons", 0 ! RuntimeError.UNCAUGHT => { terminalIcon_Icons.IconFlavor[unInit]; CONTINUE } ]; CONTINUE }]; inputIcon _ Icons.NewIconFromFile["TerminalIO.icons", 1 ! RuntimeError.UNCAUGHT => { inputIcon _ Icons.NewIconFromFile["/Cedar/ChipNDale/6.0/TerminalIO/TerminalIO.icons.icons", 1 ! RuntimeError.UNCAUGHT => { inputIcon _ terminalIcon; CONTINUE } ]; CONTINUE }]; AddLock[MyLock, MyUnLock]; Commander.Register[ key: "Terminal", proc: CreateTerminal, doc: "Create terminal viewer if it does not yet exist" ]; END; Init[]; END. ŒTerminalIOImpl.mesa Copyright c 1983, 1985 by Xerox Corporation. All rights reserved. By Ch. Jacobi August 3, 1983 9:54 am Last edited by Ch. Jacobi July 10, 1985 11:55:27 am PDT -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --Terminals own locking procedures --is set if process releases the monitorlock but waits still for input --conveniant to be here since in all places where UnLock is called -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --Lock, UnLock mechanism -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --creation of viewer -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --input procedures --RequestRope --RequestChar --RequestInt --SILLY FLUSH DOESN'T WORK -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --output procedures --terminalParent.inhibitDestroy _ FALSE; -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- Κ Ο˜šœ™Icodešœ Οmœ7™BJšœ$™$Jšœ7™7—J˜šΟk ˜ Jšœ žœ˜(Jšœ ˜ Jšœžœ"˜-Jšœ žœ!˜1Jšžœ˜J˜ Jšœ˜Jšœ˜Jšœ žœžœ˜J˜ Jšœžœ ˜Jšœ žœ,˜:Jšœ žœ˜+Jšœ žœ˜!—J˜JšΟbœžœž˜J˜šžœ˜Jšœ,žœJ˜x—šžœ˜J˜ —Jšž˜J˜Jšœ žœžœžœΟc-˜NJšœ%žœ˜)Jšœ žœžœ˜Jšœžœžœžœ˜#J˜J˜J˜Jšœžœžœžœ˜ Jšœžœ˜(J™Jšœ;™;Jšœ"™"J˜šœžœžœ˜ JšœF™F—Jšœž œ 9˜KJ˜šΟnœžœžœ˜šžœ˜Jšžœžœžœ˜—šžœž˜Jšžœ˜ Jšžœ˜—Jšœžœ˜J˜ J˜5J˜/Jšžœ˜—J˜š‘œžœžœ˜šžœ˜Jšžœžœžœ˜—Jšœžœ˜Jšžœ˜ J˜#J˜!J˜/JšœC™CJšœ žœ˜&Jšžœ˜—J˜Jšœ8™8Jšœ™J˜Jš œ žœžœžœžœ˜Jšœžœ˜Jšœžœ˜J˜š ‘œžœžœžœžœ˜1šžœ˜Jšžœžœžœ˜—Jšœ žœ˜ Jšžœ žœžœžœ˜0šž˜šžœ"ž˜'Jš žœžœžœ žœ žœ˜.Jšžœ˜——Jšžœ˜—J˜š‘œžœžœ˜Jšž˜šžœ žœžœž˜1Jšœžœžœ˜,Jšž˜—Jšžœ˜—J˜š‘œžœžœ˜Jšž˜šžœ"žœžœž˜3Jšœžœžœ˜,Jšž˜—Jšžœ˜—J˜Jšœ;™;Jšœ™J˜š‘œžœžœ˜+Jšž˜˜2J˜Jšœžœ˜ Jšœžœ˜—Jšœ6˜6Jšœ3˜3Jšžœžœžœžœ˜!šžœžœ˜Jšœ˜Jšœ#˜#Jšœ˜—J˜#Jšžœ˜—J˜Jšœ8™8Jšœ™J˜Jšœžœ!˜+J˜š‘œž œžœžœ˜>Jšž˜J˜J˜šžœžœ˜Jšœ˜Jšœ#˜#Jšœ˜—Jšœ*˜*Jšœ)˜)Jšžœ˜—J˜š‘ œžœžœžœžœžœžœžœ˜Sšžœ˜Jšžœžœ ˜—Jšœ ˜ Jšœžœ˜ J˜š‘œžœžœ˜šžœ˜šžœž˜ šžœ ˜ šžœžœ˜Jšœ žœž˜)Jšœ˜—Jšžœžœ˜ —šœ˜Jšœ žœž˜(J˜—Jšžœ˜——Jšœ˜Jšœžœ˜J˜Jšžœžœ ˜,Jšžœ˜J˜—Jšœ ™ Jšœ˜šž˜J˜ J˜Jšžœ žœ žœ˜&Jšžœžœ žœ˜5Jšžœ(žœ ˜>Jšžœ˜—Jšžœ˜—J˜š‘ œžœžœžœžœžœžœžœ˜Nšžœ˜Jšžœžœ ˜—Jšœ ˜ Jšœžœ˜ J˜š‘œžœžœ˜šžœ˜šžœž˜ šžœ ˜ Jšžœžœžœ˜/Jšžœžœ˜ —šœ˜Jšœ žœ ž˜"J˜—Jšžœ˜——Jšœ˜Jšœžœ $˜:J˜Jšžœžœ ˜Jšžœ˜J˜—Jšœ ™ J˜šž˜Jšœ ˜ J˜Jšžœ žœ žœ˜&Jšžœžœ žœ˜5šžœ˜Jšœ)˜)Jšžœ ˜J˜—Jšžœ˜—Jšžœ˜—J˜š‘ œžœžœžœžœžœžœžœ˜Lšžœ˜Jšžœžœ ˜—Jšœ ˜ Jšœžœ˜J˜š‘œžœžœ˜šžœ˜šžœž˜ šžœ ˜ Jšžœžœžœ˜/Jšžœžœ žœžœ˜2Jšžœžœžœžœ˜5Jšžœžœ˜ —šœ˜Jšœ žœž˜(J˜—Jšžœ˜——Jšœžœ˜ Jšœ˜Jšœžœ˜šžœžœž˜"Jšœžœ˜Jšžœžœ ˜Jšžœžœ žœ˜+Jšžœ˜—J˜Jšžœ˜J˜—Jšœ ™ J˜šžœ˜J˜ J˜Jšžœ žœ žœ˜%Jšžœžœ žœ˜5Jšžœžœžœ9˜SJšžœ+žœ ˜AJšžœ˜—Jšžœ˜—J˜Jšœ žœžœ˜J˜š‘œžœžœžœ˜%Jšœ žœžœ˜Jšœžœžœžœ˜Jšœ žœžœ˜šœ žœ˜Jšžœžœ˜—šžœ˜Jšžœžœ ˜—Jšœžœ˜ Jšžœ žœžœžœžœžœžœžœ ˜IJ˜Jšžœžœžœ˜)Jšžœžœžœ˜2J˜Jšœ™Jšœ&˜&J˜J˜7J˜ Jšžœ˜ Jšžœ˜—J˜š‘ œžœžœžœžœ žœžœžœžœ˜cJšžœ˜šžœžœ˜š œžœžœ žœžœž˜QJšœžœ˜ Jšœž˜ Jšžœ ˜——Jšžœ˜—J˜Jšœ8™8Jšœ™J˜š‘œžœžœ žœ˜5Jšžœ˜Jšžœžœžœ˜)šžœžœ ˜$šžœžœ˜J˜Jšžœ˜Jšž˜J˜—Jšžœž˜ Jšœ˜—Jšžœ˜—J˜š ‘ œžœžœžœ žœ˜1šžœ˜Jšžœžœžœ˜—J˜Jšœ"žœ™(Jšžœ˜—J˜š‘œžœžœ˜Jšžœ˜J˜Jšžœ˜—J˜š‘ œžœžœžœ˜$Jšžœ˜J˜Jšžœ˜—J˜š‘œžœžœžœ˜!Jšžœ˜Jšœ žœžœ ˜6Jšžœ˜J˜—Jšœ;™;J˜š‘œžœ˜-šžœ˜Jšžœžœžœ˜—J˜Jšžœ˜—J˜š‘œžœ˜Jšž˜˜;šœžœ˜šœZ˜Zšœžœ˜Jšœ'˜'Jšž˜Jšœ˜—Jšœ˜—Jšž˜Jšœ˜——˜8šœžœ˜šœ]˜]šœžœ˜Jšœ˜Jšž˜Jšœ˜—Jšœ˜——Jšž˜Jšœ˜—J˜˜J˜J˜J˜6J˜—Jšžœ˜—J˜Jšœ˜Jšžœ˜J˜—…—x.Σ