Subversion Repositories Kolibri OS

Rev

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

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