MemoryReader.Mod 890 B

12345678910111213141516171819202122232425262728293031323334353637383940
  1. (** AUTHOR "rg"; PURPOSE "Memory reader"; *)
  2. MODULE MemoryReader;
  3. IMPORT SYSTEM, Streams;
  4. CONST
  5. DefaultReaderSize = 64;
  6. TYPE
  7. Reader* = OBJECT (Streams.Reader)
  8. VAR
  9. memoryAdr: ADDRESS;
  10. available : LONGINT;
  11. PROCEDURE Receive(VAR buf: ARRAY OF CHAR; ofs, size, min : LONGINT; VAR len: LONGINT; VAR res: WORD);
  12. BEGIN
  13. ASSERT(ofs+size <= LEN(buf));
  14. IF available # 0 THEN
  15. IF size >= available THEN len := available
  16. ELSE len := size END;
  17. SYSTEM.MOVE(memoryAdr, ADDRESSOF(buf[0])+ofs, len);
  18. INC(memoryAdr, len);
  19. DEC(available, len);
  20. res := Streams.Ok
  21. ELSE
  22. len := 0;
  23. res := Streams.EOF
  24. END
  25. END Receive;
  26. PROCEDURE &InitMemoryReader*(memoryAdr: ADDRESS; length : LONGINT);
  27. BEGIN
  28. SELF.memoryAdr := memoryAdr;
  29. available := length;
  30. InitReader(Receive, DefaultReaderSize);
  31. END InitMemoryReader;
  32. END Reader;
  33. END MemoryReader.