File.ob07 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149
  1. (*
  2. BSD 2-Clause License
  3. Copyright (c) 2019-2021, Anton Krotov
  4. All rights reserved.
  5. *)
  6. MODULE File;
  7. IMPORT SYSTEM, WINAPI, API;
  8. CONST
  9. OPEN_R* = 0; OPEN_W* = 1; OPEN_RW* = 2;
  10. SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
  11. PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
  12. VAR
  13. FindData: WINAPI.TWin32FindData;
  14. Handle: INTEGER;
  15. attr: SET;
  16. BEGIN
  17. Handle := WINAPI.FindFirstFileA(SYSTEM.ADR(FName[0]), FindData);
  18. IF Handle # -1 THEN
  19. WINAPI.FindClose(Handle);
  20. SYSTEM.GET32(SYSTEM.ADR(FindData.dwFileAttributes), attr);
  21. IF 4 IN attr THEN
  22. Handle := -1
  23. END
  24. END
  25. RETURN Handle # -1
  26. END Exists;
  27. PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
  28. RETURN WINAPI.DeleteFileA(SYSTEM.ADR(FName[0])) # 0
  29. END Delete;
  30. PROCEDURE Create* (FName: ARRAY OF CHAR): INTEGER;
  31. RETURN WINAPI.CreateFileA(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0)
  32. END Create;
  33. PROCEDURE Close* (F: INTEGER);
  34. BEGIN
  35. WINAPI.CloseHandle(F)
  36. END Close;
  37. PROCEDURE Open* (FName: ARRAY OF CHAR; Mode: INTEGER): INTEGER;
  38. VAR
  39. ofstr: WINAPI.OFSTRUCT;
  40. BEGIN
  41. RETURN WINAPI.OpenFile(SYSTEM.ADR(FName[0]), ofstr, Mode)
  42. END Open;
  43. PROCEDURE Seek* (F, Offset, Origin: INTEGER): INTEGER;
  44. VAR
  45. res: INTEGER;
  46. BEGIN
  47. IF API.BIT_DEPTH = 32 THEN
  48. res := WINAPI.SetFilePointer(F, Offset, 0, Origin)
  49. ELSE
  50. res := WINAPI.SetFilePointer(F, ORD(BITS(Offset) * {0..31}), SYSTEM.ADR(Offset) + 4, Origin)
  51. END
  52. RETURN res
  53. END Seek;
  54. PROCEDURE Read* (F, Buffer, Count: INTEGER): INTEGER;
  55. VAR
  56. res: INTEGER;
  57. BEGIN
  58. IF WINAPI.ReadFile(F, Buffer, Count, SYSTEM.ADR(res), NIL) = 0 THEN
  59. res := -1
  60. END
  61. RETURN res
  62. END Read;
  63. PROCEDURE Write* (F, Buffer, Count: INTEGER): INTEGER;
  64. VAR
  65. res: INTEGER;
  66. BEGIN
  67. IF WINAPI.WriteFile(F, Buffer, Count, SYSTEM.ADR(res), NIL) = 0 THEN
  68. res := -1
  69. END
  70. RETURN res
  71. END Write;
  72. PROCEDURE Load* (FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER;
  73. VAR
  74. res, n, F: INTEGER;
  75. BEGIN
  76. res := 0;
  77. F := Open(FName, OPEN_R);
  78. IF F # -1 THEN
  79. Size := Seek(F, 0, SEEK_END);
  80. n := Seek(F, 0, SEEK_BEG);
  81. res := API._NEW(Size);
  82. IF (res = 0) OR (Read(F, res, Size) # Size) THEN
  83. IF res # 0 THEN
  84. res := API._DISPOSE(res);
  85. Size := 0
  86. END
  87. END;
  88. Close(F)
  89. END
  90. RETURN res
  91. END Load;
  92. PROCEDURE RemoveDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  93. RETURN WINAPI.RemoveDirectoryA(SYSTEM.ADR(DirName[0])) # 0
  94. END RemoveDir;
  95. PROCEDURE ExistsDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  96. VAR
  97. Code: SET;
  98. BEGIN
  99. Code := WINAPI.GetFileAttributesA(SYSTEM.ADR(DirName[0]))
  100. RETURN (Code # {0..31}) & (4 IN Code)
  101. END ExistsDir;
  102. PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  103. RETURN WINAPI.CreateDirectoryA(SYSTEM.ADR(DirName[0]), NIL) # 0
  104. END CreateDir;
  105. END File.