Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8728 leency 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 .
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
 
9073 leency 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
9174 akron1 287
            ELSE
288
            	res := TRUE
9073 leency 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
 
8728 leency 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.