MODULE OFSStreams; (** AUTHOR Timothée Martiel, 01/2016 PURPOSE Streams for OFS files. *) IMPORT Trace, StreamReaders, StreamWriters, OFS; TYPE Reader * = RECORD (StreamReaders.Reader) rider *: OFS.Rider; END; Writer * = RECORD (StreamWriters.Writer) rider *: OFS.Rider; END; PROCEDURE OpenReader * (VAR reader: Reader; size: LONGINT; file: OFS.File); BEGIN StreamReaders.Init(reader, Receive, size); OFS.Set(reader.rider, file, 0) END OpenReader; PROCEDURE OpenWriter * (VAR writer: Writer; size: LONGINT; file: OFS.File); BEGIN StreamWriters.Init(writer, Send, size); OFS.Set(writer.rider, file, 0) END OpenWriter; PROCEDURE SetReaderPos * (VAR reader: Reader; pos: LONGINT); BEGIN OFS.Set(reader.rider, reader.rider.file, pos) END SetReaderPos; PROCEDURE SetWriterPos * (VAR writer: Writer; pos: LONGINT); BEGIN OFS.Set(writer.rider, writer.rider.file, pos) END SetWriterPos; PROCEDURE ReaderPos * (VAR reader: Reader): LONGINT; BEGIN RETURN OFS.Pos(reader.rider) END ReaderPos; PROCEDURE WriterPos * (VAR writer: Writer): LONGINT; BEGIN RETURN OFS.Pos(writer.rider) END WriterPos; PROCEDURE Send (VAR writer: StreamWriters.Writer; CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: LONGINT); BEGIN WHILE len > 0 DO OFS.Write(writer(Writer).rider, buf[ofs]); INC(ofs); DEC(len) END END Send; PROCEDURE Receive (VAR reader: StreamReaders.Reader; VAR buf: ARRAY OF CHAR; ofs, size, min: LONGINT; VAR len, res: LONGINT); BEGIN len := 0; WHILE ((min > 0) OR ~reader(Reader).rider.eof) & (size > 0) DO OFS.Read(reader(Reader).rider, buf[ofs]); INC(ofs); INC(len); DEC(min); DEC(size) END END Receive; END OFSStreams.