FILE: StructuredStreamsImpl.Mesa from [Indigo]<PreCedar>Top>StructuredStreams.DF
last edited by Spreitzer December 12, 1983 1:19 pm
DIRECTORY
Rope, IO, IOUtils, UnparserBuffer, StructuredStreams;
 
StructuredStreamsImpl: 
CEDAR 
PROGRAM
IMPORTS IO, IOUtils, UB:UnparserBuffer
EXPORTS StructuredStreams
SHARES IO =
 
BEGIN
SSData: TYPE = REF SSDataRec;
SSDataRec: 
TYPE = 
RECORD [
ubh: UB.Handle];
 
used: CARDINAL ← 0;
SSProcs: 
REF 
IO.StreamProcs ← 
IO.CreateStreamProcs[
variety: output,
class: $StructuredStream,
putChar: PutChar,
flush: Flush,
close: Close];
 
Create: 
PUBLIC 
PROCEDURE [onTopOf: 
IO.
STREAM, margin: 
INTEGER ← 69] 
RETURNS [ss: 
IO.
STREAM] =
BEGIN
ssd: SSData ← NEW [SSDataRec ← [ubh: NIL]];
TRUSTED {ssd.ubh ← UB.NewHandle[]; ssd.ubh.output ← onTopOf; UB.Init[ssd.ubh]};
ss ← 
IO.CreateStream[streamProcs: SSProcs,
streamData: ssd,
backingStream: onTopOf];
 
END;
 
IsAnSS: 
PUBLIC 
PROC [s: 
IO.
STREAM] 
RETURNS [
BOOLEAN] =
BEGIN
IF s.streamData = NIL THEN RETURN [FALSE];
RETURN [ISTYPE[s.streamData, SSData]];
END;
 
UnderStream: 
PUBLIC 
PROC [ss: 
IO.
STREAM] 
RETURNS [
IO.
STREAM] =
BEGIN
IF ss.streamData = NIL THEN RETURN [ss];
IF NOT ISTYPE[ss.streamData, SSData] THEN RETURN [ss];
RETURN [ss.backingStream];
END;
 
CloseThrough: 
PUBLIC 
PROCEDURE [self: 
IO.
STREAM] =
BEGIN
IF NOT IsAnSS[self] THEN self.Close[]
ELSE {
ssd: SSData ← NARROW[self.streamData];
behind: IO.STREAM ← ssd.ubh.output;
self.Close[];
behind.Close[]};
 
END;
 
Begin: 
PUBLIC 
PROCEDURE [ss: 
IO.
STREAM] = 
TRUSTED
BEGIN
IF IsAnSS[ss] THEN NARROW[ss.streamData, SSData].ubh.Setb[];
END;
 
End: 
PUBLIC 
PROCEDURE [ss: 
IO.
STREAM] = 
TRUSTED
BEGIN
IF IsAnSS[ss] THEN NARROW[ss.streamData, SSData].ubh.Endb[];
END;
 
Bp: 
PUBLIC 
PROCEDURE [ss: 
IO.
STREAM, united: 
BOOLEAN, offset: 
INTEGER] = 
TRUSTED
BEGIN
IF IsAnSS[ss] 
THEN
BEGIN
ssd: SSData ← NARROW[ss.streamData];
ssd.ubh.Bp[united, offset];
END;
 
END;
 
ChangeMargin: 
PUBLIC 
PROCEDURE [ss: 
IO.
STREAM, newMargin: 
INTEGER ← 69] =
BEGIN
IF IsAnSS[ss] 
THEN
BEGIN
ssd: SSData ← NARROW[ss.streamData];
ssd.ubh.margin ← newMargin;
END;
 
END;
 
PutChar: 
PROCEDURE [self: 
IO.
STREAM, char: 
CHAR] = 
TRUSTED
{ssd: SSData ← NARROW[self.streamData];
IF char = IO.CR THEN ssd.ubh.Newlineb[0]
ELSE ssd.ubh.Charb[char];
};
 
Flush: PROCEDURE [self: IO.STREAM] = {IO.Flush[self.backingStream]};
Close: 
PROC [self: 
IO.
STREAM, abort: 
BOOL ← 
FALSE] =
BEGIN
IOUtils.AmbushStream[self: self, streamProcs: IOUtils.closedStreamProcs, streamData: NIL];
END;
 
END.