IMPLEMENTATION MODULE Files; (* Layered on IOChan: a File holds a channel handle (a C FILE pointer), exposed as ADDRESS. No direct shim binding here. *) FROM SYSTEM IMPORT ADDRESS; IMPORT IOChan; TYPE FileRec = RECORD cid : IOChan.ChanId; END; PROCEDURE OpenRead(VAR name : ARRAY OF CHAR) : File; VAR f : File; BEGIN NEW(f); f^.cid := IOChan.OpenRead(name); RETURN f END OpenRead; PROCEDURE OpenWrite(VAR name : ARRAY OF CHAR) : File; VAR f : File; BEGIN NEW(f); f^.cid := IOChan.OpenWrite(name); RETURN f END OpenWrite; PROCEDURE Close(f : File); BEGIN IF f # NIL THEN IOChan.Close(f^.cid); DISPOSE(f) END END Close; PROCEDURE ReadChar(f : File) : CHAR; BEGIN IF f = NIL THEN RETURN CHR(0) END; RETURN IOChan.ReadChar(f^.cid) END ReadChar; PROCEDURE ReadString(f : File; VAR s : ARRAY OF CHAR); BEGIN IF f # NIL THEN IOChan.ReadString(f^.cid, s) END END ReadString; PROCEDURE ReadInt(f : File) : INTEGER; BEGIN IF f = NIL THEN RETURN 0 END; RETURN IOChan.ReadInt(f^.cid) END ReadInt; PROCEDURE WriteChar(f : File; c : CHAR); BEGIN IF f # NIL THEN IOChan.WriteChar(f^.cid, c) END END WriteChar; PROCEDURE WriteInt(f : File; n : INTEGER); BEGIN IF f # NIL THEN IOChan.WriteInt(f^.cid, n) END END WriteInt; PROCEDURE WriteString(f : File; VAR s : ARRAY OF CHAR); BEGIN IF f # NIL THEN IOChan.WriteString(f^.cid, s) END END WriteString; PROCEDURE WriteLn(f : File); BEGIN IF f # NIL THEN IOChan.WriteLn(f^.cid) END END WriteLn; END Files.