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) 2020, Anton Krotov
  5.     All rights reserved.
  6. *)
  7.  
  8. MODULE File;
  9.  
  10. IMPORT SYSTEM, Libdl, API;
  11.  
  12.  
  13. CONST
  14.  
  15.     OPEN_R* = "rb";  OPEN_W* = "wb";  OPEN_RW* = "r+b";
  16.     SEEK_BEG* = 0;   SEEK_CUR* = 1;   SEEK_END* = 2;
  17.  
  18.  
  19. VAR
  20.  
  21.     fwrite,
  22.     fread     : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
  23.     fseek     : PROCEDURE [linux] (file, offset, origin: INTEGER): INTEGER;
  24.     ftell     : PROCEDURE [linux] (file: INTEGER): INTEGER;
  25.     fopen     : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
  26.     fclose    : PROCEDURE [linux] (file: INTEGER): INTEGER;
  27.     remove    : PROCEDURE [linux] (fname: INTEGER): INTEGER;
  28.  
  29.  
  30. PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
  31. VAR
  32.     sym: INTEGER;
  33.  
  34. BEGIN
  35.     sym := Libdl.sym(lib, name);
  36.     ASSERT(sym # 0);
  37.     SYSTEM.PUT(VarAdr, sym)
  38. END GetSym;
  39.  
  40.  
  41. PROCEDURE init;
  42. VAR
  43.     libc: INTEGER;
  44.  
  45. BEGIN
  46.     libc := Libdl.open("libc.so.6", Libdl.LAZY);
  47.     ASSERT(libc # 0);
  48.  
  49.     GetSym(libc, "fread",  SYSTEM.ADR(fread));
  50.     GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
  51.     GetSym(libc, "fseek",  SYSTEM.ADR(fseek));
  52.     GetSym(libc, "ftell",  SYSTEM.ADR(ftell));
  53.     GetSym(libc, "fopen",  SYSTEM.ADR(fopen));
  54.     GetSym(libc, "fclose", SYSTEM.ADR(fclose));
  55.     GetSym(libc, "remove", SYSTEM.ADR(remove));
  56. END init;
  57.  
  58.  
  59. PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
  60.     RETURN remove(SYSTEM.ADR(FName[0])) = 0
  61. END Delete;
  62.  
  63.  
  64. PROCEDURE Close* (F: INTEGER);
  65. BEGIN
  66.     F := fclose(F)
  67. END Close;
  68.  
  69.  
  70. PROCEDURE Open* (FName, Mode: ARRAY OF CHAR): INTEGER;
  71.     RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.ADR(Mode[0]))
  72. END Open;
  73.  
  74.  
  75. PROCEDURE Create* (FName: ARRAY OF CHAR): INTEGER;
  76.     RETURN Open(FName, OPEN_W)
  77. END Create;
  78.  
  79.  
  80. PROCEDURE Seek* (F, Offset, Origin: INTEGER): INTEGER;
  81. VAR
  82.     res: INTEGER;
  83.  
  84. BEGIN
  85.     IF fseek(F, Offset, Origin) = 0 THEN
  86.         res := ftell(F)
  87.     ELSE
  88.         res := -1
  89.     END
  90.  
  91.     RETURN res
  92. END Seek;
  93.  
  94.  
  95. PROCEDURE Write* (F, Buffer, Count: INTEGER): INTEGER;
  96.     RETURN fwrite(Buffer, 1, Count, F)
  97. END Write;
  98.  
  99.  
  100. PROCEDURE Read* (F, Buffer, Count: INTEGER): INTEGER;
  101.     RETURN fread(Buffer, 1, Count, F)
  102. END Read;
  103.  
  104.  
  105. PROCEDURE Load* (FName: ARRAY OF CHAR; VAR Size: INTEGER): INTEGER;
  106. VAR
  107.     res, n, F: INTEGER;
  108.  
  109. BEGIN
  110.     res := 0;
  111.     F := Open(FName, OPEN_R);
  112.  
  113.     IF F > 0 THEN
  114.         Size := Seek(F, 0, SEEK_END);
  115.         n    := Seek(F, 0, SEEK_BEG);
  116.         res  := API._NEW(Size);
  117.         IF (res = 0) OR (Read(F, res, Size) # Size) THEN
  118.             IF res # 0 THEN
  119.                 res := API._DISPOSE(res);
  120.                 Size := 0
  121.             END
  122.         END;
  123.         Close(F)
  124.     END
  125.  
  126.     RETURN res
  127. END Load;
  128.  
  129.  
  130. BEGIN
  131.     init
  132. END File.