Subversion Repositories Kolibri OS

Rev

Rev 9073 | Go to most recent revision | Details | 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
 
268
PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
269
VAR
270
    fd: rFD;
271
BEGIN
272
    RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
273
END DirExists;
274
 
275
 
276
PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
277
VAR
278
    F: FS;
279
    res, res2: INTEGER;
280
 
281
BEGIN
282
    NEW(F);
283
 
284
    IF F # NIL THEN
285
        F.subfunc := 9;
286
        F.pos     := 0;
287
        F.hpos    := 0;
288
        F.bytes   := 0;
289
        F.buffer  := 0;
290
        COPY(DirName, F.name);
291
        res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
292
        DISPOSE(F)
293
    ELSE
294
        res := -1
295
    END
296
 
297
    RETURN res = 0
298
END CreateDir;
299
 
300
 
301
PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN;
302
VAR
303
    F: FS;
304
    res, res2: INTEGER;
305
 
306
BEGIN
307
 
308
    IF DirExists(DirName) THEN
309
        NEW(F);
310
        IF F # NIL THEN
311
            F.subfunc := 8;
312
            F.pos := 0;
313
            F.hpos := 0;
314
            F.bytes := 0;
315
            F.buffer := 0;
316
            COPY(DirName, F.name);
317
            res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
318
            DISPOSE(F)
319
        ELSE
320
            res := -1
321
        END
322
    ELSE
323
        res := -1
324
    END
325
 
326
    RETURN res = 0
327
END DeleteDir;
328
 
329
 
330
END File.