<* PRAGMA LL *>A
TypescriptVBT
is a subtype of TextEditVBT
, with additional
features to make it serve as a ``glass teletype'' with a memory.
Abstractly, a typescript contains
reader(v) an intermittent, unseekable reader writer(v) a buffered, unseekable writer readingThread(v) a thread
reader(v)
provides the client with input that the user typed.
writer(v)
is used to display output. The reader and writer are
paired such that the writer is flushed whenever a seek blocks on
the reader. The writer is not flushed at every newline.
All input to the typescript, once it has been read, and all output,
become part of the {\em history} of the typescript, and is not
modifiable; it remains until the client deletes it by calling
ClearHistory
. Selections that lie fully or partially within the
history region are never ``replace-mode'' selections (see
Section~\ref{ReplaceMode}, page~\pageref{ReplaceMode}). Any
attempt to type or insert text in the history region becomes an
insertion at the end of the typescript instead.
readingThread(v)
is initially NIL
. When a client reads from
v
, readingThread(v)
is set to Thread.Self()
. The
handleInterrupt
method (see below) alerts readingThread(v)
.
This is useful when the reading thread is blocked waiting for
input.
A typescript's textport, v.tp
, must be of type
TypescriptVBT.Port
(which is a subtype of TextPort.T
). The
textport's returnAction
method makes the text of the current
type-in region available to the reader and no longer editable. The
textport's setReadOnly
method is a no-op.
Typescripts do not allow the use of Undo and Redo.
INTERFACEThe callTypescriptVBT ; IMPORT Rd, TextEditVBT, TextPort, VBT, Wr, Thread; TYPE T <: Public; Public = TextEditVBT.T OBJECT METHODS <* LL.sup <= VBT.mu *> init (scrollable := TRUE): T; interrupt (time: VBT.TimeStamp); handleInterrupt (time: VBT.TimeStamp); terminate (); setThread (thread: Thread.T := NIL); END; Port <: TextPort.T;
v.init()
initializes v
as an empty typescript.
It is a checked runtime error if v.tp
is NIL
or is not of type
TypescriptVBT.Port
, which is a subtype of TextPort.T
.
The call v.interrupt(time)
simulates an interrupt by
flushing any pending type-in, writing the characters ^C
, and then
calling v.handleInterrupt(time)
.
The call v.handleInterrupt(time)
alerts readingThread(v)
.
After v.terminate()
is called, subsequent attempts to read from
v
will causes it to report end of file, and v
becomes
unresponsive to further user input, although it will continue to
display output written to its output stream. This is appropriate
when v
is being discarded.
The call v.setThread(thread)
changes readingThread(v)
. This
can be used to protect Thread.Self()
from being alerted after it
has finished reading from reader(v)
. Subsequent reads on
reader(v)
will reset the readingThread(v)
to Thread.Self()
.
TYPE Reader <: PublicReader; PublicReader = Rd.T OBJECT METHODS typescript (): T END; Writer <: PublicWriter; PublicWriter = Wr.T OBJECT METHODS typescript (): T END; PROCEDURE GetRd (v: T): Reader;
Get the input stream forv
. By definition,GetRd(v).typescript() = v
PROCEDURE GetWr (v: T): Writer;
Get the output stream forv
. By definition,GetWr(v).typescript() = v
PROCEDURE GetHistory (v: T): TEXT; <* LL <= VBT.mu *>
Return the ``history'' text of v
.
PROCEDURE ClearHistory (v: T); <* LL <= VBT.mu *>
Clear the ``history'' text of v
.
END TypescriptVBT.