streamfile.mod 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. IMPLEMENTATION MODULE StreamFile;
  2. (* Open/Close map onto IOChan's OpenRead/OpenWrite. A channel is a
  3. stream channel whenever it is open (V3's channels are all streams). *)
  4. IMPORT IOChan, ChanConsts;
  5. FROM ChanConsts IMPORT opened, noSuchFile, wrongFlags;
  6. FROM ChanConsts IMPORT readFlag, writeFlag;
  7. PROCEDURE HasFlag (flags : ChanConsts.FlagSet;
  8. f : ChanConsts.ChanFlags) : BOOLEAN;
  9. BEGIN
  10. RETURN f IN flags
  11. END HasFlag;
  12. PROCEDURE Open (VAR cid : ChanId; name : ARRAY OF CHAR;
  13. flags : FlagSet; VAR res : OpenResults);
  14. VAR c : ChanId;
  15. BEGIN
  16. IF HasFlag(flags, readFlag) THEN
  17. c := IOChan.OpenRead(name);
  18. IF NOT IOChan.IsOpen(c) THEN
  19. cid := IOChan.MakeChan(NIL); res := noSuchFile; RETURN
  20. END
  21. ELSIF HasFlag(flags, writeFlag) THEN
  22. c := IOChan.OpenWrite(name);
  23. IF NOT IOChan.IsOpen(c) THEN
  24. cid := IOChan.MakeChan(NIL); res := noSuchFile; RETURN
  25. END
  26. ELSE
  27. cid := IOChan.MakeChan(NIL); res := wrongFlags; RETURN
  28. END;
  29. cid := c;
  30. res := opened
  31. END Open;
  32. PROCEDURE IsStreamFile (cid : ChanId) : BOOLEAN;
  33. BEGIN
  34. RETURN IOChan.IsOpen(cid)
  35. END IsStreamFile;
  36. PROCEDURE Close (VAR cid : ChanId);
  37. BEGIN
  38. IOChan.Close(cid)
  39. END Close;
  40. END StreamFile.