<> <> <> <> <<>> DIRECTORY Ascii, Diablo USING [PutChar], DiabloStreams, IO USING [CreateStream, CreateStreamProcs, StreamProcs], IOUtils USING [closedStreamProcs] ; DiabloStreamsImpl: CEDAR MONITOR IMPORTS Diablo, IO, IOUtils EXPORTS DiabloStreams = BEGIN OPEN DiabloStreams; StreamProcs: TYPE ~ IO.StreamProcs; Busy: PUBLIC ERROR = CODE; DiabloProcs: REF StreamProcs _ NIL; theStream: STREAM _ NIL; --The STREAM currently writing to Diablo inUse: BOOL _ FALSE; StreamOpen: PUBLIC ENTRY PROC RETURNS [stream: STREAM] ~ { ENABLE UNWIND => NULL; IF inUse THEN ERROR Busy; stream _ IO.CreateStream[DiabloProcs, NIL]; inUse _ TRUE; }; Init: PROC ~ { DiabloProcs _ IO.CreateStreamProcs [ variety: output, class: $Diablo, putChar: PutChar, reset: Reset, flush: Flush, close: Close ]; theStream _ IO.CreateStream[DiabloProcs, NIL]; }; PutChar: PROC [self: STREAM, char: CHAR] ~ { ENABLE UNWIND => NULL; Diablo.PutChar[char]; }; Reset: PROC [self: STREAM] ~ { OPEN Ascii; ENABLE UNWIND => NULL; Diablo.PutChar[ESC]; Diablo.PutChar[CR]; Diablo.PutChar['P]; }; Flush: PROC [self: STREAM] ~ { ENABLE UNWIND => NULL; Diablo.PutChar['\030]; }; Close: ENTRY PROC [self: STREAM, abort: BOOL _ FALSE] ~ { ENABLE UNWIND => NULL; inUse _ FALSE; self.streamProcs _ IOUtils.closedStreamProcs; }; Init[]; END.....