12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- 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.
|