IMPLEMENTATION MODULE StdIO; CONST MaxStack = 32; PROCEDURE m2writechar (c : CHAR); EXTERNAL; PROCEDURE m2readchar () : CHAR; EXTERNAL; VAR outStack : ARRAY [0 .. MaxStack - 1] OF ProcWrite; outTop : INTEGER; inStack : ARRAY [0 .. MaxStack - 1] OF ProcRead; inTop : INTEGER; curOut : ProcWrite; curIn : ProcRead; PROCEDURE DefaultWrite (c : CHAR); BEGIN m2writechar(c) END DefaultWrite; PROCEDURE DefaultRead (VAR c : CHAR); BEGIN c := m2readchar() END DefaultRead; PROCEDURE Write (ch : CHAR); BEGIN curOut(ch) END Write; PROCEDURE Read (VAR ch : CHAR); BEGIN curIn(ch) END Read; PROCEDURE PushOutput (p : ProcWrite); BEGIN IF outTop < MaxStack THEN outStack[outTop] := curOut; INC(outTop) END; curOut := p END PushOutput; PROCEDURE PopOutput; BEGIN IF outTop > 0 THEN DEC(outTop); curOut := outStack[outTop] END END PopOutput; PROCEDURE GetCurrentOutput () : ProcWrite; BEGIN RETURN curOut END GetCurrentOutput; PROCEDURE PushInput (p : ProcRead); BEGIN IF inTop < MaxStack THEN inStack[inTop] := curIn; INC(inTop) END; curIn := p END PushInput; PROCEDURE PopInput; BEGIN IF inTop > 0 THEN DEC(inTop); curIn := inStack[inTop] END END PopInput; PROCEDURE GetCurrentInput () : ProcRead; BEGIN RETURN curIn END GetCurrentInput; BEGIN outTop := 0; inTop := 0; curOut := DefaultWrite; curIn := DefaultRead END StdIO.