iochan.mod 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. IMPLEMENTATION MODULE IOChan;
  2. (* A ChanId is a C FILE* handle; all operations go through SysShim
  3. (which degrades a NIL handle to a safe no-op / 0C). *)
  4. IMPORT SysShim;
  5. FROM SYSTEM IMPORT ADDRESS;
  6. TYPE ChanId = ADDRESS;
  7. PROCEDURE StdInChan() : ChanId;
  8. BEGIN
  9. RETURN SysShim.stdin()
  10. END StdInChan;
  11. PROCEDURE StdOutChan() : ChanId;
  12. BEGIN
  13. RETURN SysShim.stdout()
  14. END StdOutChan;
  15. PROCEDURE StdErrChan() : ChanId;
  16. BEGIN
  17. RETURN SysShim.stderr()
  18. END StdErrChan;
  19. PROCEDURE OpenRead(VAR name : ARRAY OF CHAR) : ChanId;
  20. BEGIN
  21. RETURN SysShim.fopenread(name)
  22. END OpenRead;
  23. PROCEDURE OpenWrite(VAR name : ARRAY OF CHAR) : ChanId;
  24. BEGIN
  25. RETURN SysShim.fopenwrite(name)
  26. END OpenWrite;
  27. PROCEDURE Close(VAR cid : ChanId);
  28. BEGIN
  29. SysShim.fclose(cid);
  30. cid := NIL
  31. END Close;
  32. PROCEDURE IsOpen(cid : ChanId) : BOOLEAN;
  33. BEGIN
  34. RETURN cid # NIL
  35. END IsOpen;
  36. PROCEDURE Handle(cid : ChanId) : ADDRESS;
  37. BEGIN
  38. RETURN cid
  39. END Handle;
  40. PROCEDURE MakeChan(h : ADDRESS) : ChanId;
  41. BEGIN
  42. RETURN h
  43. END MakeChan;
  44. PROCEDURE ReadChar(cid : ChanId) : CHAR;
  45. BEGIN
  46. RETURN SysShim.fgetc(cid)
  47. END ReadChar;
  48. PROCEDURE ReadString(cid : ChanId; VAR s : ARRAY OF CHAR);
  49. BEGIN
  50. IF SysShim.freadline(cid, s, HIGH(s) + 1) < 0 THEN
  51. END
  52. END ReadString;
  53. PROCEDURE ReadInt(cid : ChanId) : INTEGER;
  54. BEGIN
  55. RETURN SysShim.freadint(cid)
  56. END ReadInt;
  57. PROCEDURE WriteChar(cid : ChanId; c : CHAR);
  58. BEGIN
  59. SysShim.fputc(cid, c)
  60. END WriteChar;
  61. PROCEDURE WriteString(cid : ChanId; VAR s : ARRAY OF CHAR);
  62. BEGIN
  63. SysShim.fputs(cid, s)
  64. END WriteString;
  65. PROCEDURE WriteInt(cid : ChanId; n : INTEGER);
  66. BEGIN
  67. SysShim.fwriteint(cid, n)
  68. END WriteInt;
  69. PROCEDURE WriteLn(cid : ChanId);
  70. BEGIN
  71. SysShim.fwriteln(cid)
  72. END WriteLn;
  73. PROCEDURE Position(cid : ChanId) : INTEGER;
  74. BEGIN
  75. RETURN SysShim.ftell(cid)
  76. END Position;
  77. PROCEDURE Seek(cid : ChanId; pos : INTEGER) : BOOLEAN;
  78. BEGIN
  79. RETURN SysShim.fseek(cid, pos)
  80. END Seek;
  81. PROCEDURE Rewind(cid : ChanId) : BOOLEAN;
  82. BEGIN
  83. RETURN SysShim.fseek(cid, 0)
  84. END Rewind;
  85. END IOChan.