152 lines
4.0 KiB
Plaintext
152 lines
4.0 KiB
Plaintext
|
(* Version 1.10, Nov 1984 *)
|
|||
|
DEFINITION MODULE Termbase;
|
|||
|
(*
|
|||
|
Terminal input/output with redirection hooks
|
|||
|
[Private module of the Modula-2 system]
|
|||
|
|
|||
|
Derived from the Lilith Modula-2 system developed by the
|
|||
|
group of Prof. N. Wirth at ETH Zurich, Switzerland.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
EXPORT QUALIFIED
|
|||
|
ReadProcedure, StatusProcedure, WriteProcedure,
|
|||
|
AssignRead, AssignWrite, UnAssignRead, UnAssignWrite,
|
|||
|
Read, KeyPressed, Write;
|
|||
|
|
|||
|
|
|||
|
TYPE
|
|||
|
ReadProcedure = PROCEDURE (VAR CHAR);
|
|||
|
(*
|
|||
|
- To assign a private read procedure (for redirection
|
|||
|
of input) a procedure of type 'ReadProcedure' must
|
|||
|
be provided. This procedure returns a character
|
|||
|
from the input device. It waits until a character
|
|||
|
hes been entered.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
TYPE
|
|||
|
StatusProcedure = PROCEDURE (): BOOLEAN;
|
|||
|
(*
|
|||
|
- To assign a private status-procedure (for redirection
|
|||
|
of input) a procedure of type 'StatusProcedure' must
|
|||
|
be provided. This procedure returns TRUE, if a
|
|||
|
character is available to read, FALSE otherwise.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
TYPE
|
|||
|
WriteProcedure = PROCEDURE (CHAR);
|
|||
|
(*
|
|||
|
- To assign a private write procedure (for redirection
|
|||
|
of output) a procedure of type 'WriteProcedure' must
|
|||
|
be provided. This is typically used to redirect
|
|||
|
output to a file or to the screen and a file (log
|
|||
|
file). Special interpretation of characters sent to
|
|||
|
the screen can be performed in such a private driver
|
|||
|
procedure.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE AssignRead (rp: ReadProcedure;
|
|||
|
sp: StatusProcedure;
|
|||
|
VAR done: BOOLEAN);
|
|||
|
(*
|
|||
|
- Install read and status routines for terminal input.
|
|||
|
|
|||
|
in: rp read-a-character procedure,
|
|||
|
sp is-character-available function,
|
|||
|
|
|||
|
out: done TRUE if the installation was done.
|
|||
|
|
|||
|
Initially the corresponding procedures of 'Keyboard' are
|
|||
|
installed.
|
|||
|
|
|||
|
Subsequent assignments will be valid until the next
|
|||
|
'UnAssignRead' is executed or until the (sub-)program
|
|||
|
which has installed the procedures terminates. Upon
|
|||
|
termination of a program, the read and status procedures
|
|||
|
allocated by that program are removed. Read procedures
|
|||
|
are non-sharable resources (see module 'Program').
|
|||
|
|
|||
|
The assignments are implemented in a stack manner. When a
|
|||
|
read procedure is removed, the previously valid procedure
|
|||
|
becomes valid again. Up to six levels of re-assignment are
|
|||
|
allowed. Done = FALSE if this depth is exceeded.
|
|||
|
During execution of a read or status procedure, this
|
|||
|
assignments-stack is decremented, which allows an
|
|||
|
installed routine to call recursively Terminal.Read
|
|||
|
and/or Terminal.KeyPressed to activate the previously
|
|||
|
installed routine. At the lowest level however, the
|
|||
|
stack is not decremented.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE AssignWrite (wp: WriteProcedure;
|
|||
|
VAR done: BOOLEAN);
|
|||
|
(*
|
|||
|
- Install write routine for terminal output.
|
|||
|
|
|||
|
in: wp character output procedure,
|
|||
|
|
|||
|
out: done set TRUE if the installation was done.
|
|||
|
|
|||
|
[See AssignRead above.]
|
|||
|
Initially the procedure Display.Write is assigned.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE UnAssignRead (VAR done: BOOLEAN);
|
|||
|
(*
|
|||
|
- Undo the last AssignRead by the current program.
|
|||
|
|
|||
|
out: done set TRUE if there was something to unassign.
|
|||
|
|
|||
|
The previously valid procedures become active again.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE UnAssignWrite (VAR done: BOOLEAN);
|
|||
|
(*
|
|||
|
- Undo the last AssignWrite by the current program.
|
|||
|
|
|||
|
out: done set TRUE if there was something to unassign.
|
|||
|
|
|||
|
The previously valid procedure becomes active again.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE Read (VAR ch: CHAR);
|
|||
|
(*
|
|||
|
- Read a character using the current input procedure.
|
|||
|
|
|||
|
out: ch the character read.
|
|||
|
|
|||
|
Uses the current read-procedure, as assigned by
|
|||
|
AssignRead.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE KeyPressed (): BOOLEAN;
|
|||
|
(*
|
|||
|
- Test if a character is available from the current input.
|
|||
|
|
|||
|
Uses the current status-procedure, as assigned by
|
|||
|
AssignRead.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
PROCEDURE Write (ch: CHAR);
|
|||
|
(*
|
|||
|
- Write a character to the current output.
|
|||
|
|
|||
|
in: ch character to write.
|
|||
|
|
|||
|
Uses the current write-procedure as assigned by
|
|||
|
AssignWrite.
|
|||
|
*)
|
|||
|
|
|||
|
|
|||
|
END Termbase.
|
|||
|
|