files.mod 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. IMPLEMENTATION MODULE Files;
  2. (* Layered on IOChan: a File holds a channel handle (a C FILE
  3. pointer), exposed as ADDRESS. No direct shim binding here. *)
  4. FROM SYSTEM IMPORT ADDRESS;
  5. IMPORT IOChan;
  6. TYPE
  7. FileRec = RECORD
  8. cid : IOChan.ChanId;
  9. END;
  10. PROCEDURE OpenRead(VAR name : ARRAY OF CHAR) : File;
  11. VAR f : File;
  12. BEGIN
  13. NEW(f);
  14. f^.cid := IOChan.OpenRead(name);
  15. RETURN f
  16. END OpenRead;
  17. PROCEDURE OpenWrite(VAR name : ARRAY OF CHAR) : File;
  18. VAR f : File;
  19. BEGIN
  20. NEW(f);
  21. f^.cid := IOChan.OpenWrite(name);
  22. RETURN f
  23. END OpenWrite;
  24. PROCEDURE Close(f : File);
  25. BEGIN
  26. IF f # NIL THEN
  27. IOChan.Close(f^.cid);
  28. DISPOSE(f)
  29. END
  30. END Close;
  31. PROCEDURE ReadChar(f : File) : CHAR;
  32. BEGIN
  33. IF f = NIL THEN RETURN CHR(0) END;
  34. RETURN IOChan.ReadChar(f^.cid)
  35. END ReadChar;
  36. PROCEDURE ReadString(f : File; VAR s : ARRAY OF CHAR);
  37. BEGIN
  38. IF f # NIL THEN IOChan.ReadString(f^.cid, s) END
  39. END ReadString;
  40. PROCEDURE ReadInt(f : File) : INTEGER;
  41. BEGIN
  42. IF f = NIL THEN RETURN 0 END;
  43. RETURN IOChan.ReadInt(f^.cid)
  44. END ReadInt;
  45. PROCEDURE WriteChar(f : File; c : CHAR);
  46. BEGIN
  47. IF f # NIL THEN IOChan.WriteChar(f^.cid, c) END
  48. END WriteChar;
  49. PROCEDURE WriteInt(f : File; n : INTEGER);
  50. BEGIN
  51. IF f # NIL THEN IOChan.WriteInt(f^.cid, n) END
  52. END WriteInt;
  53. PROCEDURE WriteString(f : File; VAR s : ARRAY OF CHAR);
  54. BEGIN
  55. IF f # NIL THEN IOChan.WriteString(f^.cid, s) END
  56. END WriteString;
  57. PROCEDURE WriteLn(f : File);
  58. BEGIN
  59. IF f # NIL THEN IOChan.WriteLn(f^.cid) END
  60. END WriteLn;
  61. END Files.