IMPLEMENTATION MODULE IOChan; (* A ChanId is a C FILE* handle; all operations go through SysShim (which degrades a NIL handle to a safe no-op / 0C). *) IMPORT SysShim; FROM SYSTEM IMPORT ADDRESS; TYPE ChanId = ADDRESS; PROCEDURE StdInChan() : ChanId; BEGIN RETURN SysShim.stdin() END StdInChan; PROCEDURE StdOutChan() : ChanId; BEGIN RETURN SysShim.stdout() END StdOutChan; PROCEDURE StdErrChan() : ChanId; BEGIN RETURN SysShim.stderr() END StdErrChan; PROCEDURE OpenRead(VAR name : ARRAY OF CHAR) : ChanId; BEGIN RETURN SysShim.fopenread(name) END OpenRead; PROCEDURE OpenWrite(VAR name : ARRAY OF CHAR) : ChanId; BEGIN RETURN SysShim.fopenwrite(name) END OpenWrite; PROCEDURE Close(VAR cid : ChanId); BEGIN SysShim.fclose(cid); cid := NIL END Close; PROCEDURE IsOpen(cid : ChanId) : BOOLEAN; BEGIN RETURN cid # NIL END IsOpen; PROCEDURE Handle(cid : ChanId) : ADDRESS; BEGIN RETURN cid END Handle; PROCEDURE MakeChan(h : ADDRESS) : ChanId; BEGIN RETURN h END MakeChan; PROCEDURE ReadChar(cid : ChanId) : CHAR; BEGIN RETURN SysShim.fgetc(cid) END ReadChar; PROCEDURE ReadString(cid : ChanId; VAR s : ARRAY OF CHAR); BEGIN IF SysShim.freadline(cid, s, HIGH(s) + 1) < 0 THEN END END ReadString; PROCEDURE ReadInt(cid : ChanId) : INTEGER; BEGIN RETURN SysShim.freadint(cid) END ReadInt; PROCEDURE WriteChar(cid : ChanId; c : CHAR); BEGIN SysShim.fputc(cid, c) END WriteChar; PROCEDURE WriteString(cid : ChanId; VAR s : ARRAY OF CHAR); BEGIN SysShim.fputs(cid, s) END WriteString; PROCEDURE WriteInt(cid : ChanId; n : INTEGER); BEGIN SysShim.fwriteint(cid, n) END WriteInt; PROCEDURE WriteLn(cid : ChanId); BEGIN SysShim.fwriteln(cid) END WriteLn; PROCEDURE Position(cid : ChanId) : INTEGER; BEGIN RETURN SysShim.ftell(cid) END Position; PROCEDURE Seek(cid : ChanId; pos : INTEGER) : BOOLEAN; BEGIN RETURN SysShim.fseek(cid, pos) END Seek; PROCEDURE Rewind(cid : ChanId) : BOOLEAN; BEGIN RETURN SysShim.fseek(cid, 0) END Rewind; END IOChan.