Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Blame | Last modification | View Log | Download | RSS feed

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