Subversion Repositories Kolibri OS

Rev

Rev 9073 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. (*
  2.     Copyright 2016, 2018, 2021 Anton Krotov
  3.  
  4.     This program is free software: you can redistribute it and/or modify
  5.     it under the terms of the GNU Lesser General Public License as published by
  6.     the Free Software Foundation, either version 3 of the License, or
  7.     (at your option) any later version.
  8.  
  9.     This program is distributed in the hope that it will be useful,
  10.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.     GNU Lesser General Public License for more details.
  13.  
  14.     You should have received a copy of the GNU Lesser General Public License
  15.     along with this program.  If not, see <http://www.gnu.org/licenses/>.
  16. *)
  17.  
  18. MODULE File;
  19.  
  20. IMPORT sys := SYSTEM, KOSAPI;
  21.  
  22.  
  23. CONST
  24.  
  25.     SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
  26.  
  27.  
  28. TYPE
  29.  
  30.     FNAME* = ARRAY 520 OF CHAR;
  31.  
  32.     FS* = POINTER TO rFS;
  33.  
  34.     rFS* = RECORD
  35.         subfunc*, pos*, hpos*, bytes*, buffer*: INTEGER;
  36.         name*: FNAME
  37.     END;
  38.  
  39.     FD* = POINTER TO rFD;
  40.  
  41.     rFD* = RECORD
  42.         attr*: INTEGER;
  43.         ntyp*: CHAR;
  44.         reserved: ARRAY 3 OF CHAR;
  45.         time_create*, date_create*,
  46.         time_access*, date_access*,
  47.         time_modif*,  date_modif*,
  48.         size*, hsize*: INTEGER;
  49.         name*: FNAME
  50.     END;
  51.  
  52.  
  53. PROCEDURE [stdcall] f_68_27 (file_name: INTEGER; VAR size: INTEGER): INTEGER;
  54. BEGIN
  55.     sys.CODE(
  56.     053H,               (*  push    ebx                    *)
  57.     06AH, 044H,         (*  push    68                     *)
  58.     058H,               (*  pop     eax                    *)
  59.     06AH, 01BH,         (*  push    27                     *)
  60.     05BH,               (*  pop     ebx                    *)
  61.     08BH, 04DH, 008H,   (*  mov     ecx, dword [ebp +  8]  *)
  62.     0CDH, 040H,         (*  int     64                     *)
  63.     08BH, 04DH, 00CH,   (*  mov     ecx, dword [ebp + 12]  *)
  64.     089H, 011H,         (*  mov     dword [ecx], edx       *)
  65.     05BH,               (*  pop     ebx                    *)
  66.     0C9H,               (*  leave                          *)
  67.     0C2H, 008H, 000H    (*  ret     8                      *)
  68.     )
  69.     RETURN 0
  70. END f_68_27;
  71.  
  72.  
  73. PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
  74.     RETURN f_68_27(sys.ADR(FName[0]), size)
  75. END Load;
  76.  
  77.  
  78. PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
  79. VAR
  80.     res2: INTEGER; fs: rFS;
  81.  
  82. BEGIN
  83.     fs.subfunc := 5;
  84.     fs.pos     := 0;
  85.     fs.hpos    := 0;
  86.     fs.bytes   := 0;
  87.     fs.buffer  := sys.ADR(Info);
  88.     COPY(FName, fs.name)
  89.  
  90.     RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
  91. END GetFileInfo;
  92.  
  93.  
  94. PROCEDURE FileSize* (FName: ARRAY OF CHAR): INTEGER;
  95. VAR
  96.     Info: rFD;
  97.     res: INTEGER;
  98. BEGIN
  99.     IF GetFileInfo(FName, Info) THEN
  100.         res := Info.size
  101.     ELSE
  102.         res := -1
  103.     END
  104.     RETURN res
  105. END FileSize;
  106.  
  107.  
  108. PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
  109. VAR
  110.     fd: rFD;
  111. BEGIN
  112.     RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
  113. END Exists;
  114.  
  115.  
  116. PROCEDURE Close* (VAR F: FS);
  117. BEGIN
  118.     IF F # NIL THEN
  119.         DISPOSE(F)
  120.     END
  121. END Close;
  122.  
  123.  
  124. PROCEDURE Open* (FName: ARRAY OF CHAR): FS;
  125. VAR
  126.     F: FS;
  127.  
  128. BEGIN
  129.  
  130.     IF Exists(FName) THEN
  131.         NEW(F);
  132.         IF F # NIL THEN
  133.             F.subfunc := 0;
  134.             F.pos     := 0;
  135.             F.hpos    := 0;
  136.             F.bytes   := 0;
  137.             F.buffer  := 0;
  138.             COPY(FName, F.name)
  139.         END
  140.     ELSE
  141.         F := NIL
  142.     END
  143.  
  144.     RETURN F
  145. END Open;
  146.  
  147.  
  148. PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
  149. VAR
  150.     F: FS;
  151.     res, res2: INTEGER;
  152.  
  153. BEGIN
  154.  
  155.     IF Exists(FName) THEN
  156.         NEW(F);
  157.         IF F # NIL THEN
  158.             F.subfunc := 8;
  159.             F.pos     := 0;
  160.             F.hpos    := 0;
  161.             F.bytes   := 0;
  162.             F.buffer  := 0;
  163.             COPY(FName, F.name);
  164.             res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  165.             DISPOSE(F)
  166.         ELSE
  167.             res := -1
  168.         END
  169.     ELSE
  170.         res := -1
  171.     END
  172.  
  173.     RETURN res = 0
  174. END Delete;
  175.  
  176.  
  177. PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER;
  178. VAR
  179.     res: INTEGER;
  180.     fd: rFD;
  181.  
  182. BEGIN
  183.  
  184.     IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
  185.         CASE Origin OF
  186.         |SEEK_BEG: F.pos := Offset
  187.         |SEEK_CUR: F.pos := F.pos + Offset
  188.         |SEEK_END: F.pos := fd.size + Offset
  189.         ELSE
  190.         END;
  191.         res := F.pos
  192.     ELSE
  193.         res := -1
  194.     END
  195.  
  196.     RETURN res
  197. END Seek;
  198.  
  199.  
  200. PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER;
  201. VAR
  202.     res, res2: INTEGER;
  203.  
  204. BEGIN
  205.  
  206.     IF F # NIL THEN
  207.         F.subfunc := 0;
  208.         F.bytes   := Count;
  209.         F.buffer  := Buffer;
  210.         res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  211.         IF res2 > 0 THEN
  212.             F.pos := F.pos + res2
  213.         END
  214.     ELSE
  215.         res2 := 0
  216.     END
  217.  
  218.     RETURN res2
  219. END Read;
  220.  
  221.  
  222. PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER;
  223. VAR
  224.     res, res2: INTEGER;
  225.  
  226. BEGIN
  227.  
  228.     IF F # NIL THEN
  229.         F.subfunc := 3;
  230.         F.bytes   := Count;
  231.         F.buffer  := Buffer;
  232.         res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  233.         IF res2 > 0 THEN
  234.             F.pos := F.pos + res2
  235.         END
  236.     ELSE
  237.         res2 := 0
  238.     END
  239.  
  240.     RETURN res2
  241. END Write;
  242.  
  243.  
  244. PROCEDURE Create* (FName: ARRAY OF CHAR): FS;
  245. VAR
  246.     F: FS;
  247.     res2: INTEGER;
  248.  
  249. BEGIN
  250.     NEW(F);
  251.  
  252.     IF F # NIL THEN
  253.         F.subfunc := 2;
  254.         F.pos     := 0;
  255.         F.hpos    := 0;
  256.         F.bytes   := 0;
  257.         F.buffer  := 0;
  258.         COPY(FName, F.name);
  259.         IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
  260.             DISPOSE(F)
  261.         END
  262.     END
  263.  
  264.     RETURN F
  265. END Create;
  266.  
  267.  
  268. PROCEDURE Copy* (From, To: ARRAY OF CHAR): BOOLEAN;
  269. VAR
  270.     buf, size: INTEGER;
  271.     outFile: FS;
  272.     res: BOOLEAN;
  273. BEGIN
  274.     res := FALSE;
  275.     size := FileSize(From);
  276.     IF size > 0 THEN
  277.         buf := Load(From, size)
  278.     ELSE
  279.         buf := -1;
  280.         size := 0
  281.     END;
  282.     IF buf # 0 THEN
  283.         outFile := Create(To);
  284.         IF outFile # NIL THEN
  285.             IF size # 0 THEN
  286.                 res := Write(outFile, buf, size) = size
  287.             ELSE
  288.                 res := TRUE
  289.             END;
  290.             Close(outFile)
  291.         END;
  292.         IF size # 0 THEN
  293.             buf := KOSAPI.free(buf)
  294.         END
  295.     END
  296.     RETURN res
  297. END Copy;
  298.  
  299.  
  300. PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
  301. VAR
  302.     fd: rFD;
  303. BEGIN
  304.     RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
  305. END DirExists;
  306.  
  307.  
  308. PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  309. VAR
  310.     F: FS;
  311.     res, res2: INTEGER;
  312.  
  313. BEGIN
  314.     NEW(F);
  315.  
  316.     IF F # NIL THEN
  317.         F.subfunc := 9;
  318.         F.pos     := 0;
  319.         F.hpos    := 0;
  320.         F.bytes   := 0;
  321.         F.buffer  := 0;
  322.         COPY(DirName, F.name);
  323.         res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  324.         DISPOSE(F)
  325.     ELSE
  326.         res := -1
  327.     END
  328.  
  329.     RETURN res = 0
  330. END CreateDir;
  331.  
  332.  
  333. PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN;
  334. VAR
  335.     F: FS;
  336.     res, res2: INTEGER;
  337.  
  338. BEGIN
  339.  
  340.     IF DirExists(DirName) THEN
  341.         NEW(F);
  342.         IF F # NIL THEN
  343.             F.subfunc := 8;
  344.             F.pos := 0;
  345.             F.hpos := 0;
  346.             F.bytes := 0;
  347.             F.buffer := 0;
  348.             COPY(DirName, F.name);
  349.             res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
  350.             DISPOSE(F)
  351.         ELSE
  352.             res := -1
  353.         END
  354.     ELSE
  355.         res := -1
  356.     END
  357.  
  358.     RETURN res = 0
  359. END DeleteDir;
  360.  
  361.  
  362. END File.