Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
9896 akron1 1
(*
2
    Copyright 2016, 2022 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 .
18
*)
19
 
20
MODULE ReadFile;
21
 
22
IMPORT sys := SYSTEM, K := KOSAPI, S := Strings, File, SU := SysUtils, Encode;
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: Encode.CP);
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.