A Terminal.T
, or terminal handle, is a file handle that provides
access to a duplex communication channel usually connected to a
user terminal.
INTERFACETerminal ; IMPORT File; TYPE T <: File.T; VAR (*CONST*) FileType: File.Type;
Equal to {\tt Atom.FromText("Terminal").}
END Terminal.Like every
File.T
, a terminal handle h
has the components
type(h) an atom, equal to FileType readable(h) a boolean writable(h) a booleanA terminal handle is readable, or writable, or both (until it is closed). If it is readable, it has the component
srcTerm(h) a terminal deviceIf it is writable, it has the component
snkTerm(h) a terminal deviceA terminal device
t
has the components
seq(t) a sequence of bytes r(t) a non-negative integer, the index of the next byte to read w(t) a non-negative integer, the index of the next byte to write flag(t) a byte reserved to mark the end-of-file in seq(t)The meaning of the call
h.read(b, mayBlock)is given by the specification of
File.T.read
together with these
definitions, where t = srcTerm(h)
, and k
is the number of
occurrences of flag(t)
in seq(t)
up to r(t)-1
:
src(h) = subsequence of seq(t) with all occurrences of flag(t) deleted srcCur(h) = r(t)-k srcEof(h) = (seq(t)[r(t)] = flag(t))When end-of-file is reported,
r(t)
is also incremented. This
means subsequent reads can return further data in seq(t)
.
The meaning of the call
h.write(b)is given by the specification of
File.T.write
together with these
definitions, where t = snkTerm(h)
:
snk(h) = seq(t) snkCur(h) = w(t)A specific implementation may provide one or more subtypes of
Terminal.T
with additional methods.
The communication channel underlying a terminal handle is necessarily monitored, since the purpose of the channel is to allow asynchronous communication between a program and a user operating a terminal device. However a terminal handle itself should be treated as unmonitored, thus avoiding the question of the unit of atomicity for reads and writes.