OFSStreams.Mos 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. MODULE OFSStreams;
  2. (**
  3. AUTHOR Timothée Martiel, 01/2016
  4. PURPOSE Streams for OFS files.
  5. *)
  6. IMPORT
  7. Trace,
  8. StreamReaders, StreamWriters, OFS;
  9. TYPE
  10. Reader * = RECORD (StreamReaders.Reader)
  11. rider *: OFS.Rider;
  12. END;
  13. Writer * = RECORD (StreamWriters.Writer)
  14. rider *: OFS.Rider;
  15. END;
  16. PROCEDURE OpenReader * (VAR reader: Reader; size: LONGINT; file: OFS.File);
  17. BEGIN
  18. StreamReaders.Init(reader, Receive, size);
  19. OFS.Set(reader.rider, file, 0)
  20. END OpenReader;
  21. PROCEDURE OpenWriter * (VAR writer: Writer; size: LONGINT; file: OFS.File);
  22. BEGIN
  23. StreamWriters.Init(writer, Send, size);
  24. OFS.Set(writer.rider, file, 0)
  25. END OpenWriter;
  26. PROCEDURE SetReaderPos * (VAR reader: Reader; pos: LONGINT);
  27. BEGIN
  28. OFS.Set(reader.rider, reader.rider.file, pos)
  29. END SetReaderPos;
  30. PROCEDURE SetWriterPos * (VAR writer: Writer; pos: LONGINT);
  31. BEGIN
  32. OFS.Set(writer.rider, writer.rider.file, pos)
  33. END SetWriterPos;
  34. PROCEDURE ReaderPos * (VAR reader: Reader): LONGINT;
  35. BEGIN
  36. RETURN OFS.Pos(reader.rider)
  37. END ReaderPos;
  38. PROCEDURE WriterPos * (VAR writer: Writer): LONGINT;
  39. BEGIN
  40. RETURN OFS.Pos(writer.rider)
  41. END WriterPos;
  42. PROCEDURE Send (VAR writer: StreamWriters.Writer; CONST buf: ARRAY OF CHAR; ofs, len: LONGINT; propagate: BOOLEAN; VAR res: LONGINT);
  43. BEGIN
  44. WHILE len > 0 DO
  45. OFS.Write(writer(Writer).rider, buf[ofs]);
  46. INC(ofs);
  47. DEC(len)
  48. END
  49. END Send;
  50. PROCEDURE Receive (VAR reader: StreamReaders.Reader; VAR buf: ARRAY OF CHAR; ofs, size, min: LONGINT; VAR len, res: LONGINT);
  51. BEGIN
  52. len := 0;
  53. WHILE ((min > 0) OR ~reader(Reader).rider.eof) & (size > 0) DO
  54. OFS.Read(reader(Reader).rider, buf[ofs]);
  55. INC(ofs);
  56. INC(len);
  57. DEC(min);
  58. DEC(size)
  59. END
  60. END Receive;
  61. END OFSStreams.