iochan.mod 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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. END IOChan.