IMPLEMENTATION MODULE StreamFile; (* Open/close maps onto IOChan's OpenRead/OpenWrite; IsStreamFile is TRUE for any open channel (V3's channels are all streams). *) IMPORT IOChan, ChanConsts; FROM ChanConsts IMPORT opened, noSuchFile, wrongFlags; FROM ChanConsts IMPORT readFlag, writeFlag; PROCEDURE HasFlag (flags : ChanConsts.FlagSet; f : ChanConsts.ChanFlags) : BOOLEAN; BEGIN RETURN f IN flags END HasFlag; PROCEDURE Open (VAR cid : IOChan.ChanId; name : ARRAY OF CHAR; flags : ChanConsts.FlagSet; VAR res : ChanConsts.OpenResults); VAR c : IOChan.ChanId; BEGIN c := IOChan.MakeChan(NIL); IF HasFlag(flags, readFlag) THEN (* read implies old *) IF NOT IOChan.IsOpen(IOChan.OpenRead(name)) THEN cid := c; res := noSuchFile; RETURN END; c := IOChan.OpenRead(name) ELSIF HasFlag(flags, writeFlag) THEN c := IOChan.OpenWrite(name); IF NOT IOChan.IsOpen(c) THEN cid := IOChan.MakeChan(NIL); res := noSuchFile; RETURN END ELSE cid := c; res := wrongFlags; RETURN END; cid := c; res := opened END Open; PROCEDURE IsStreamFile (cid : IOChan.ChanId) : BOOLEAN; BEGIN RETURN IOChan.IsOpen(cid) END IsStreamFile; PROCEDURE Close (VAR cid : IOChan.ChanId); BEGIN IOChan.Close(cid) END Close; END StreamFile.