IMPLEMENTATION MODULE StreamFile; (* Open/Close map onto IOChan's OpenRead/OpenWrite. A channel is a stream channel whenever it is open (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 : ChanId; name : ARRAY OF CHAR; flags : FlagSet; VAR res : OpenResults); VAR c : ChanId; BEGIN IF HasFlag(flags, readFlag) THEN c := IOChan.OpenRead(name); IF NOT IOChan.IsOpen(c) THEN cid := IOChan.MakeChan(NIL); res := noSuchFile; RETURN END 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 := IOChan.MakeChan(NIL); res := wrongFlags; RETURN END; cid := c; res := opened END Open; PROCEDURE IsStreamFile (cid : ChanId) : BOOLEAN; BEGIN RETURN IOChan.IsOpen(cid) END IsStreamFile; PROCEDURE Close (VAR cid : ChanId); BEGIN IOChan.Close(cid) END Close; END StreamFile.