File.ob07 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2020-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE File;
  7. IMPORT SYSTEM, Libdl, API;
  8. CONST
  9. OPEN_R* = "rb"; OPEN_W* = "wb"; OPEN_RW* = "r+b";
  10. SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
  11. VAR
  12. fwrite,
  13. fread : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  14. fseek : PROCEDURE [linux] (file, offset, origin: INTEGER): INTEGER;
  15. ftell : PROCEDURE [linux] (file: INTEGER): INTEGER;
  16. fopen : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  17. fclose : PROCEDURE [linux] (file: INTEGER): INTEGER;
  18. remove : PROCEDURE [linux] (fname: INTEGER): INTEGER;
  19. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  20. VAR
  21. sym: INTEGER;
  22. BEGIN
  23. sym := Libdl.sym(lib, name);
  24. ASSERT(sym # 0);
  25. SYSTEM.PUT(VarAdr, sym)
  26. END GetSym;
  27. PROCEDURE init;
  28. VAR
  29. libc: INTEGER;
  30. BEGIN
  31. libc := API.libc;
  32. GetSym(libc, "fread", SYSTEM.ADR(fread));
  33. GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
  34. GetSym(libc, "fseek", SYSTEM.ADR(fseek));
  35. GetSym(libc, "ftell", SYSTEM.ADR(ftell));
  36. GetSym(libc, "fopen", SYSTEM.ADR(fopen));
  37. GetSym(libc, "fclose", SYSTEM.ADR(fclose));
  38. GetSym(libc, "remove", SYSTEM.ADR(remove));
  39. END init;
  40. PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
  41. RETURN remove(SYSTEM.ADR(FName[0])) = 0
  42. END Delete;
  43. PROCEDURE Close* (F: INTEGER);
  44. BEGIN
  45. F := fclose(F)
  46. END Close;
  47. PROCEDURE Open* (FName, Mode: ARRAY OF CHAR): INTEGER;
  48. RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.ADR(Mode[0]))
  49. END Open;
  50. PROCEDURE Create* (FName: ARRAY OF CHAR): INTEGER;
  51. RETURN Open(FName, OPEN_W)
  52. END Create;
  53. PROCEDURE Seek* (F, Offset, Origin: INTEGER): INTEGER;
  54. VAR
  55. res: INTEGER;
  56. BEGIN
  57. IF fseek(F, Offset, Origin) = 0 THEN
  58. res := ftell(F)
  59. ELSE
  60. res := -1
  61. END
  62. RETURN res
  63. END Seek;
  64. PROCEDURE Write* (F, Buffer, Count: INTEGER): INTEGER;
  65. RETURN fwrite(Buffer, 1, Count, F)
  66. END Write;
  67. PROCEDURE Read* (F, Buffer, Count: INTEGER): INTEGER;
  68. RETURN fread(Buffer, 1, Count, F)
  69. END Read;
  70. PROCEDURE Load* (FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER;
  71. VAR
  72. res, n, F: INTEGER;
  73. BEGIN
  74. res := 0;
  75. F := Open(FName, OPEN_R);
  76. IF F > 0 THEN
  77. Size := Seek(F, 0, SEEK_END);
  78. n := Seek(F, 0, SEEK_BEG);
  79. res := API._NEW(Size);
  80. IF (res = 0) OR (Read(F, res, Size) # Size) THEN
  81. IF res # 0 THEN
  82. res := API._DISPOSE(res);
  83. Size := 0
  84. END
  85. END;
  86. Close(F)
  87. END
  88. RETURN res
  89. END Load;
  90. BEGIN
  91. init
  92. END File.