Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7983 leency 1
(*
8859 leency 2
    Copyright 2016, 2018, 2021 Anton Krotov
6613 leency 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
 
7693 akron1 20
IMPORT sys := SYSTEM, KOSAPI;
6613 leency 21
 
7597 akron1 22
 
6613 leency 23
CONST
24
 
7597 akron1 25
    SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
6613 leency 26
 
7597 akron1 27
 
6613 leency 28
TYPE
29
 
7597 akron1 30
    FNAME* = ARRAY 520 OF CHAR;
6613 leency 31
 
7597 akron1 32
    FS* = POINTER TO rFS;
6613 leency 33
 
7597 akron1 34
    rFS* = RECORD
35
        subfunc*, pos*, hpos*, bytes*, buffer*: INTEGER;
36
        name*: FNAME
37
    END;
6613 leency 38
 
7597 akron1 39
    FD* = POINTER TO rFD;
6613 leency 40
 
7597 akron1 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
7693 akron1 50
    END;
6613 leency 51
 
7597 akron1 52
 
53
PROCEDURE [stdcall] f_68_27 (file_name: INTEGER; VAR size: INTEGER): INTEGER;
6613 leency 54
BEGIN
7597 akron1 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
7693 akron1 70
END f_68_27;
6613 leency 71
 
7597 akron1 72
 
73
PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
74
    RETURN f_68_27(sys.ADR(FName[0]), size)
6613 leency 75
END Load;
76
 
7597 akron1 77
 
78
PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
79
VAR
7693 akron1 80
    res2: INTEGER; fs: rFS;
7597 akron1 81
 
6613 leency 82
BEGIN
7597 akron1 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)
6613 leency 89
 
7597 akron1 90
    RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
7693 akron1 91
END GetFileInfo;
7597 akron1 92
 
93
 
8859 leency 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
 
7597 akron1 108
PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
109
VAR
110
    fd: rFD;
6613 leency 111
BEGIN
7597 akron1 112
    RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
6613 leency 113
END Exists;
114
 
7693 akron1 115
 
7597 akron1 116
PROCEDURE Close* (VAR F: FS);
6613 leency 117
BEGIN
7597 akron1 118
    IF F # NIL THEN
119
        DISPOSE(F)
120
    END
6613 leency 121
END Close;
122
 
7597 akron1 123
 
124
PROCEDURE Open* (FName: ARRAY OF CHAR): FS;
125
VAR
7693 akron1 126
    F: FS;
7597 akron1 127
 
7693 akron1 128
BEGIN
7597 akron1 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
6613 leency 142
    END
143
 
7597 akron1 144
    RETURN F
7693 akron1 145
END Open;
7597 akron1 146
 
147
 
148
PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
149
VAR
150
    F: FS;
151
    res, res2: INTEGER;
152
 
6613 leency 153
BEGIN
7597 akron1 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
6613 leency 169
    ELSE
7597 akron1 170
        res := -1
6613 leency 171
    END
7597 akron1 172
 
173
    RETURN res = 0
6613 leency 174
END Delete;
175
 
7693 akron1 176
 
7597 akron1 177
PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER;
178
VAR
179
    res: INTEGER;
180
    fd: rFD;
181
 
6613 leency 182
BEGIN
7597 akron1 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
6613 leency 192
    ELSE
7597 akron1 193
        res := -1
194
    END
195
 
196
    RETURN res
6613 leency 197
END Seek;
198
 
7597 akron1 199
 
200
PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER;
201
VAR
202
    res, res2: INTEGER;
203
 
6613 leency 204
BEGIN
7597 akron1 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
6613 leency 216
    END
217
 
7597 akron1 218
    RETURN res2
7693 akron1 219
END Read;
7597 akron1 220
 
221
 
222
PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER;
223
VAR
224
    res, res2: INTEGER;
225
 
6613 leency 226
BEGIN
7597 akron1 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
6613 leency 238
    END
7597 akron1 239
 
240
    RETURN res2
6613 leency 241
END Write;
242
 
7693 akron1 243
 
7597 akron1 244
PROCEDURE Create* (FName: ARRAY OF CHAR): FS;
245
VAR
246
    F: FS;
247
    res2: INTEGER;
248
 
6613 leency 249
BEGIN
7597 akron1 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
6613 leency 262
    END
7597 akron1 263
 
264
    RETURN F
6613 leency 265
END Create;
266
 
7693 akron1 267
 
7597 akron1 268
PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
269
VAR
270
    fd: rFD;
6613 leency 271
BEGIN
7597 akron1 272
    RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
7693 akron1 273
END DirExists;
6613 leency 274
 
275
 
7597 akron1 276
PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
277
VAR
278
    F: FS;
279
    res, res2: INTEGER;
280
 
6613 leency 281
BEGIN
282
    NEW(F);
7597 akron1 283
 
6613 leency 284
    IF F # NIL THEN
7597 akron1 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)
6613 leency 293
    ELSE
7597 akron1 294
        res := -1
6613 leency 295
    END
7597 akron1 296
 
297
    RETURN res = 0
298
END CreateDir;
299
 
7693 akron1 300
 
7597 akron1 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
6613 leency 327
END DeleteDir;
328
 
7597 akron1 329
 
7983 leency 330
END File.