stdio.mod 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. IMPLEMENTATION MODULE StdIO;
  2. CONST MaxStack = 32;
  3. PROCEDURE m2writechar (c : CHAR);
  4. EXTERNAL;
  5. PROCEDURE m2readchar () : CHAR;
  6. EXTERNAL;
  7. VAR
  8. outStack : ARRAY [0 .. MaxStack - 1] OF ProcWrite;
  9. outTop : INTEGER;
  10. inStack : ARRAY [0 .. MaxStack - 1] OF ProcRead;
  11. inTop : INTEGER;
  12. curOut : ProcWrite;
  13. curIn : ProcRead;
  14. PROCEDURE DefaultWrite (c : CHAR);
  15. BEGIN
  16. m2writechar(c)
  17. END DefaultWrite;
  18. PROCEDURE DefaultRead (VAR c : CHAR);
  19. BEGIN
  20. c := m2readchar()
  21. END DefaultRead;
  22. PROCEDURE Write (ch : CHAR);
  23. BEGIN
  24. curOut(ch)
  25. END Write;
  26. PROCEDURE Read (VAR ch : CHAR);
  27. BEGIN
  28. curIn(ch)
  29. END Read;
  30. PROCEDURE PushOutput (p : ProcWrite);
  31. BEGIN
  32. IF outTop < MaxStack THEN
  33. outStack[outTop] := curOut;
  34. INC(outTop)
  35. END;
  36. curOut := p
  37. END PushOutput;
  38. PROCEDURE PopOutput;
  39. BEGIN
  40. IF outTop > 0 THEN
  41. DEC(outTop);
  42. curOut := outStack[outTop]
  43. END
  44. END PopOutput;
  45. PROCEDURE GetCurrentOutput () : ProcWrite;
  46. BEGIN
  47. RETURN curOut
  48. END GetCurrentOutput;
  49. PROCEDURE PushInput (p : ProcRead);
  50. BEGIN
  51. IF inTop < MaxStack THEN
  52. inStack[inTop] := curIn;
  53. INC(inTop)
  54. END;
  55. curIn := p
  56. END PushInput;
  57. PROCEDURE PopInput;
  58. BEGIN
  59. IF inTop > 0 THEN
  60. DEC(inTop);
  61. curIn := inStack[inTop]
  62. END
  63. END PopInput;
  64. PROCEDURE GetCurrentInput () : ProcRead;
  65. BEGIN
  66. RETURN curIn
  67. END GetCurrentInput;
  68. BEGIN
  69. outTop := 0; inTop := 0;
  70. curOut := DefaultWrite;
  71. curIn := DefaultRead
  72. END StdIO.