Subversion Repositories Kolibri OS

Rev

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

  1. (*
  2.     Copyright 2016, 2022, 2023 Anton Krotov
  3.  
  4.     This file is part of fb2read.
  5.  
  6.     fb2read is free software: you can redistribute it and/or modify
  7.     it under the terms of the GNU General Public License as published by
  8.     the Free Software Foundation, either version 3 of the License, or
  9.     (at your option) any later version.
  10.  
  11.     fb2read is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with fb2read. If not, see <http://www.gnu.org/licenses/>.
  18. *)
  19.  
  20. MODULE ReadFile;
  21.  
  22. IMPORT sys := SYSTEM, K := KOSAPI, S := Strings, File, SU := SysUtils, Encoding;
  23.  
  24.  
  25. VAR
  26.  
  27.   Mem, Pos, Size, FSize*: INTEGER;
  28.  
  29.   Error*: BOOLEAN;
  30.  
  31.  
  32. PROCEDURE Adr*(): INTEGER;
  33.   RETURN Mem + Pos
  34. END Adr;
  35.  
  36.  
  37. PROCEDURE Next*(VAR ch: CHAR);
  38. BEGIN
  39.   INC(Pos);
  40.   sys.GET(Mem + Pos, ch)
  41. END Next;
  42.  
  43.  
  44. PROCEDURE Progress*(): REAL;
  45. VAR res: REAL;
  46. BEGIN
  47.   res := FLT(Pos) / FLT(Size);
  48.   IF res < 0.0 THEN
  49.     res := 0.0
  50.   END;
  51.   IF res > 1.0 THEN
  52.     res := 1.0
  53.   END
  54.   RETURN res
  55. END Progress;
  56.  
  57.  
  58. PROCEDURE Load*(FileName: S.STRING);
  59. VAR F: File.FS; pos, FileSize: INTEGER;
  60. BEGIN
  61.   Error := TRUE;
  62.   Mem := 0;
  63.   F := File.Open(FileName);
  64.   SU.ErrorIf(F = NIL, 1);
  65.   FileSize := File.Seek(F, 0, File.SEEK_END);
  66.   Size := FileSize;
  67.   SU.ErrorIf(FileSize <= 0, 1);
  68.   pos := File.Seek(F, 0, File.SEEK_BEG);
  69.   SU.ErrorIf(pos # 0, 1);
  70.   Mem := K.malloc(FileSize + 1024);
  71.   SU.MemError(Mem = 0);
  72.   pos := File.Read(F, Mem, FileSize);
  73.   SU.ErrorIf(pos # FileSize, 1);
  74.   sys.PUT(Mem + FileSize, 0X);
  75.   File.Close(F);
  76.   Pos := -1;
  77.   Error := FALSE;
  78.   FSize := FileSize
  79. END Load;
  80.  
  81.  
  82. PROCEDURE Free*;
  83. BEGIN
  84.   IF Mem # 0 THEN
  85.     Mem := K.free(Mem)
  86.   END
  87. END Free;
  88.  
  89.  
  90. PROCEDURE Conv*(cp: Encoding.tCodePage);
  91. VAR m, nov, mem2, k: INTEGER; c: CHAR;
  92. BEGIN
  93.   m := Mem;
  94.   k := 0;
  95.   REPEAT
  96.     sys.GET(m, c); INC(m);
  97.     k := k + cp[ORD(c)].len
  98.   UNTIL c = 0X;
  99.   nov := K.malloc(k + 1024);
  100.   SU.MemError(nov = 0);
  101.   Size := k;
  102.   mem2 := nov;
  103.   m := Mem;
  104.   REPEAT
  105.     sys.GET(m, c); INC(m);
  106.     sys.MOVE(sys.ADR(cp[ORD(c)].utf8), nov, cp[ORD(c)].len);
  107.     nov := nov + cp[ORD(c)].len
  108.   UNTIL c = 0X;
  109.   Pos := -1;
  110.   Mem := K.free(Mem);
  111.   Mem := mem2;
  112. END Conv;
  113.  
  114.  
  115. PROCEDURE SeekBeg*;
  116. BEGIN
  117.   Pos := -1
  118. END SeekBeg;
  119.  
  120.  
  121. PROCEDURE Int*(): INTEGER;
  122. VAR i: INTEGER;
  123. BEGIN
  124.   sys.GET(Mem + Pos, i)
  125.   RETURN i
  126. END Int;
  127.  
  128.  
  129. PROCEDURE FileSize*(name: S.STRING): INTEGER;
  130. VAR F: File.FS; res: INTEGER;
  131. BEGIN
  132.   F := File.Open(name);
  133.   res := File.Seek(F, 0, 2);
  134.   File.Close(F)
  135.   RETURN res
  136. END FileSize;
  137.  
  138.  
  139. PROCEDURE ChkSum* (name: S.STRING): INTEGER;
  140. VAR
  141.         ptr, size, res: INTEGER;
  142.         b: BYTE;
  143. BEGIN
  144.         res := 0;
  145.         ptr := File.Load(name, size);
  146.         IF ptr # 0 THEN
  147.                 WHILE size > 0 DO
  148.                         sys.GET(ptr, b);
  149.                         INC(res, b);
  150.                         INC(ptr);
  151.                         DEC(size)
  152.                 END;
  153.                 ptr := K.free(ptr)
  154.         END
  155.         RETURN res
  156. END ChkSum;
  157.  
  158.  
  159. END ReadFile.
  160.