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; ssd.ubh.margin _ margin; 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. †FILE: StructuredStreamsImpl.Mesa from {Cedar}Top>StructuredStreams.DF last edited by Spreitzer February 6, 1984 4:26:12 pm PST Κž˜JšœE™EJšœ8™8J˜codešΟk ˜ Kšœœ-˜5—K˜šΠbxœœ˜$Kšœœ œ˜&Kšœ˜Kšœœ˜ —K˜Kš˜K˜Kšœœœ ˜šœ œœ˜Kšœœ ˜—K˜Kšœœ˜šœ œœœ˜3K˜K˜K˜K˜ K˜—K˜K˜šΟnœœ œ œœ œœœœ˜]Kš˜Kšœœœ˜+šœ˜ Kšœ œ ˜Kšœ˜Kšœ˜Kšœ˜—šœœ#˜*K˜Kšœ˜—Kšœ˜—K˜šŸœœœœœœœ˜6Kš˜Kš œœœœœ˜*Kšœœ˜&Kšœ˜—K˜šŸ œœœœœœœœ˜>Kš˜Kšœœœœ˜(Kš œœœœœ˜6Kšœ˜Kšœ˜—K˜š Ÿ œœ œœœ˜2Kš˜Kšœœœ ˜%šœ˜Kšœœ˜&Kšœœœ˜#K˜ K˜—Kšœ˜—K˜š Ÿœœ œœœ˜1Kš˜Kšœ œœ#˜