streamfile.mod 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  1. IMPLEMENTATION MODULE StreamFile;
  2. (* Open/close maps onto IOChan's OpenRead/OpenWrite; IsStreamFile is
  3. TRUE for any open channel (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 : IOChan.ChanId; name : ARRAY OF CHAR;
  13. flags : ChanConsts.FlagSet;
  14. VAR res : ChanConsts.OpenResults);
  15. VAR c : IOChan.ChanId;
  16. BEGIN
  17. c := IOChan.MakeChan(NIL);
  18. IF HasFlag(flags, readFlag) THEN
  19. (* read implies old *)
  20. IF NOT IOChan.IsOpen(IOChan.OpenRead(name)) THEN
  21. cid := c; res := noSuchFile; RETURN
  22. END;
  23. c := IOChan.OpenRead(name)
  24. ELSIF HasFlag(flags, writeFlag) THEN
  25. c := IOChan.OpenWrite(name);
  26. IF NOT IOChan.IsOpen(c) THEN
  27. cid := IOChan.MakeChan(NIL); res := noSuchFile; RETURN
  28. END
  29. ELSE
  30. cid := c; res := wrongFlags; RETURN
  31. END;
  32. cid := c;
  33. res := opened
  34. END Open;
  35. PROCEDURE IsStreamFile (cid : IOChan.ChanId) : BOOLEAN;
  36. BEGIN
  37. RETURN IOChan.IsOpen(cid)
  38. END IsStreamFile;
  39. PROCEDURE Close (VAR cid : IOChan.ChanId);
  40. BEGIN
  41. IOChan.Close(cid)
  42. END Close;
  43. END StreamFile.