Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 6613 Rev 7597
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016 Anton Krotov
2
    Copyright 2016, 2018 Anton Krotov
Line 3... Line 3...
3
 
3
 
4
    This program is free software: you can redistribute it and/or modify
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
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
6
    the Free Software Foundation, either version 3 of the License, or
Line 15... Line 15...
15
    along with this program.  If not, see .
15
    along with this program.  If not, see .
16
*)
16
*)
Line 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
MODULE File;
18
MODULE File;
-
 
19
 
Line 19... Line 20...
19
 
20
IMPORT sys := SYSTEM, KOSAPI; 
Line 20... Line 21...
20
IMPORT sys := SYSTEM, KOSAPI;
21
 
-
 
22
 
Line 21... Line 23...
21
 
23
CONST
Line 22... Line 24...
22
CONST
24
 
-
 
25
    SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
-
 
26
 
-
 
27
 
-
 
28
TYPE
-
 
29
 
-
 
30
    FNAME* = ARRAY 520 OF CHAR;
-
 
31
 
Line 23... Line 32...
23
 
32
    FS* = POINTER TO rFS;
Line 24... Line -...
24
  SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
-
 
25
 
-
 
26
TYPE
-
 
27
 
-
 
28
  FNAME* = ARRAY 520 OF CHAR;
-
 
29
 
-
 
30
  FS* = POINTER TO rFS;
-
 
31
 
33
 
32
  rFS* = RECORD
34
    rFS* = RECORD
33
    subfunc*, pos*, hpos*, bytes*, buffer*: INTEGER;
35
        subfunc*, pos*, hpos*, bytes*, buffer*: INTEGER;
34
    name*: FNAME
36
        name*: FNAME
35
  END;
37
    END;
36
 
38
 
37
  FD* = POINTER TO rFD;
39
    FD* = POINTER TO rFD;
38
 
40
 
39
  rFD* = RECORD
41
    rFD* = RECORD
40
    attr*: INTEGER;
42
        attr*: INTEGER;
-
 
43
        ntyp*: CHAR;
41
    ntyp*: CHAR;
44
        reserved: ARRAY 3 OF CHAR;
42
    reserved: ARRAY 3 OF CHAR;
45
        time_create*, date_create*,
43
    time_create*, date_create*,
46
        time_access*, date_access*,
-
 
47
        time_modif*,  date_modif*,
44
    time_access*, date_access*,
48
        size*, hsize*: INTEGER;
45
    time_modif*,  date_modif*,
49
        name*: FNAME
46
    size*, hsize*: INTEGER;
50
    END; 
47
    name*: FNAME
51
 
48
  END;
52
 
49
 
53
PROCEDURE [stdcall] f_68_27 (file_name: INTEGER; VAR size: INTEGER): INTEGER;
50
PROCEDURE [stdcall] f_68_27(file_name: INTEGER; VAR size: INTEGER): INTEGER;
54
BEGIN
51
BEGIN
55
    sys.CODE(
52
  sys.CODE("53");               (* push    ebx              *)
56
    053H,               (*  push    ebx                    *)
53
  sys.CODE("6A44");             (* push    68               *)
57
    06AH, 044H,         (*  push    68                     *)
54
  sys.CODE("58");               (* pop     eax              *)
58
    058H,               (*  pop     eax                    *)
55
  sys.CODE("6A1B");             (* push    27               *)
59
    06AH, 01BH,         (*  push    27                     *)
-
 
60
    05BH,               (*  pop     ebx                    *)
56
  sys.CODE("5B");               (* pop     ebx              *)
61
    08BH, 04DH, 008H,   (*  mov     ecx, dword [ebp +  8]  *)
57
  sys.CODE("8B4D08");           (* mov     ecx, [ebp + 08h] *)
62
    0CDH, 040H,         (*  int     64                     *)
Line -... Line 63...
-
 
63
    08BH, 04DH, 00CH,   (*  mov     ecx, dword [ebp + 12]  *)
58
  sys.CODE("CD40");             (* int     40h              *)
64
    089H, 011H,         (*  mov     dword [ecx], edx       *)
59
  sys.CODE("8B4D0C");           (* mov     ecx, [ebp + 0Ch] *)
65
    05BH,               (*  pop     ebx                    *)
60
  sys.CODE("8911");             (* mov     [ecx], edx       *)
66
    0C9H,               (*  leave                          *)
Line -... Line 67...
-
 
67
    0C2H, 008H, 000H    (*  ret     8                      *)
61
  sys.CODE("5B");               (* pop     ebx              *)
68
    )
-
 
69
    RETURN 0
62
  sys.CODE("C9");               (* leave                    *)
70
END f_68_27; 
-
 
71
 
63
  sys.CODE("C20800");           (* ret     08h              *)
72
 
64
  RETURN 0
73
PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
65
END f_68_27;
74
    RETURN f_68_27(sys.ADR(FName[0]), size)
66
 
75
END Load;
67
PROCEDURE Load*(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
76
 
68
  RETURN f_68_27(sys.ADR(FName[0]), size)
77
 
69
END Load;
78
PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
-
 
79
VAR
70
 
80
    res2: INTEGER; fs: rFS;  
71
PROCEDURE GetFileInfo*(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
81
 
Line -... Line 82...
-
 
82
BEGIN
72
VAR res2: INTEGER; fs: rFS;
83
    fs.subfunc := 5;
-
 
84
    fs.pos     := 0;
73
BEGIN
85
    fs.hpos    := 0;
74
  fs.subfunc := 5;
86
    fs.bytes   := 0;
75
  fs.pos := 0;
87
    fs.buffer  := sys.ADR(Info);
76
  fs.hpos := 0;
88
    COPY(FName, fs.name)
-
 
89
 
Line 77... Line 90...
77
  fs.bytes := 0;
90
    RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
78
  fs.buffer := sys.ADR(Info);
91
END GetFileInfo;  
79
  COPY(FName, fs.name)
92
 
80
  RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
93
 
81
END GetFileInfo;
94
PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
82
 
95
VAR
Line 83... Line -...
83
PROCEDURE Exists*(FName: ARRAY OF CHAR): BOOLEAN;
-
 
84
VAR fd: rFD;
-
 
85
BEGIN
-
 
86
  RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
-
 
87
END Exists;
-
 
88
 
-
 
89
PROCEDURE Close*(VAR F: FS);
-
 
90
BEGIN
-
 
91
  IF F # NIL THEN
-
 
92
    DISPOSE(F)
-
 
93
  END
-
 
94
END Close;
-
 
95
 
-
 
96
PROCEDURE Open*(FName: ARRAY OF CHAR): FS;
-
 
97
VAR F: FS;
-
 
98
BEGIN
-
 
99
  IF Exists(FName) THEN
-
 
100
    NEW(F);
-
 
Line -... Line 96...
-
 
96
    fd: rFD;
-
 
97
BEGIN
-
 
98
    RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
-
 
99
END Exists;
-
 
100
              
-
 
101
 
-
 
102
PROCEDURE Close* (VAR F: FS);
-
 
103
BEGIN
-
 
104
    IF F # NIL THEN
-
 
105
        DISPOSE(F)
-
 
106
    END
-
 
107
END Close;
-
 
108
 
-
 
109
 
-
 
110
PROCEDURE Open* (FName: ARRAY OF CHAR): FS;
-
 
111
VAR
-
 
112
    F: FS;     
-
 
113
 
-
 
114
BEGIN   
-
 
115
 
-
 
116
    IF Exists(FName) THEN
-
 
117
        NEW(F);
-
 
118
        IF F # NIL THEN
-
 
119
            F.subfunc := 0;
101
    IF F # NIL THEN
120
            F.pos     := 0;
-
 
121
            F.hpos    := 0;
-
 
122
            F.bytes   := 0;
102
      F.subfunc := 0;
123
            F.buffer  := 0;
-
 
124
            COPY(FName, F.name)
103
      F.pos := 0;
125
        END
-
 
126
    ELSE
104
      F.hpos := 0;
127
        F := NIL
105
      F.bytes := 0;
128
    END
106
      F.buffer := 0;
129
 
107
      COPY(FName, F.name)
130
    RETURN F
108
    END
131
END Open;     
109
  ELSE
132
 
110
    F := NIL
133
 
111
  END
134
PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
112
  RETURN F
135
VAR
113
END Open;
136
    F: FS;
114
 
137
    res, res2: INTEGER;
115
PROCEDURE Delete*(FName: ARRAY OF CHAR): BOOLEAN;
138
 
116
VAR F: FS; res, res2: INTEGER;
139
BEGIN
117
BEGIN
140
 
118
  IF Exists(FName) THEN
141
    IF Exists(FName) THEN
119
    NEW(F);
142
        NEW(F);
120
    IF F # NIL THEN
143
        IF F # NIL THEN
-
 
144
            F.subfunc := 8;
121
      F.subfunc := 8;
145
            F.pos     := 0;
122
      F.pos := 0;
146
            F.hpos    := 0;
-
 
147
            F.bytes   := 0;
-
 
148
            F.buffer  := 0;
-
 
149
            COPY(FName, F.name);
-
 
150
            res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
-
 
151
            DISPOSE(F)
-
 
152
        ELSE
Line 123... Line -...
123
      F.hpos := 0;
-
 
124
      F.bytes := 0;
-
 
125
      F.buffer := 0;
153
            res := -1
-
 
154
        END
126
      COPY(FName, F.name);
155
    ELSE
127
      res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
156
        res := -1
128
      DISPOSE(F)
157
    END
129
    ELSE
158
 
130
      res := -1
159
    RETURN res = 0
-
 
160
END Delete;
-
 
161
  
-
 
162
 
131
    END
163
PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER;
132
  ELSE
-
 
133
    res := -1
-
 
134
  END
-
 
135
  RETURN res = 0
164
VAR
136
END Delete;
165
    res: INTEGER;
-
 
166
    fd: rFD;
137
 
167
 
138
PROCEDURE Seek*(F: FS; Offset, Origin: INTEGER): INTEGER;
168
BEGIN
Line -... Line 169...
-
 
169
 
139
VAR res: INTEGER; fd: rFD;
170
    IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
-
 
171
        CASE Origin OF
140
BEGIN
172
        |SEEK_BEG: F.pos := Offset
-
 
173
        |SEEK_CUR: F.pos := F.pos + Offset
141
  IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
174
        |SEEK_END: F.pos := fd.size + Offset
-
 
175
        ELSE
142
    CASE Origin OF
176
        END;
143
    |SEEK_BEG: F.pos := Offset
177
        res := F.pos
144
    |SEEK_CUR: F.pos := F.pos + Offset
178
    ELSE
145
    |SEEK_END: F.pos := fd.size + Offset
179
        res := -1
146
    ELSE
180
    END
147
    END;
181
 
148
    res := F.pos
182
    RETURN res
149
  ELSE
183
END Seek;
150
    res := -1
184
 
151
  END
185
 
152
  RETURN res
186
PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER;
-
 
187
VAR
153
END Seek;
188
    res, res2: INTEGER;
154
 
189
 
-
 
190
BEGIN
155
PROCEDURE Read*(F: FS; Buffer, Count: INTEGER): INTEGER;
191
 
156
VAR res, res2: INTEGER;
192
    IF F # NIL THEN
-
 
193
        F.subfunc := 0;
157
BEGIN
194
        F.bytes   := Count;
-
 
195
        F.buffer  := Buffer;
158
  IF F # NIL THEN
196
        res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
-
 
197
        IF res2 > 0 THEN
159
    F.subfunc := 0;
198
            F.pos := F.pos + res2
160
    F.bytes := Count;
199
        END
161
    F.buffer := Buffer;
200
    ELSE
162
    res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
201
        res2 := 0
163
    IF res2 > 0 THEN
202
    END
164
      F.pos := F.pos + res2
203
 
165
    END
204
    RETURN res2
166
  ELSE
205
END Read;    
167
    res2 := 0
206
 
168
  END
207
 
169
  RETURN res2
208
PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER;
-
 
209
VAR
170
END Read;
210
    res, res2: INTEGER;
171
 
211
 
-
 
212
BEGIN
-
 
213
 
-
 
214
    IF F # NIL THEN
-
 
215
        F.subfunc := 3;
-
 
216
        F.bytes   := Count;
-
 
217
        F.buffer  := Buffer;
Line 172... Line -...
172
PROCEDURE Write*(F: FS; Buffer, Count: INTEGER): INTEGER;
-
 
173
VAR res, res2: INTEGER;
-
 
174
BEGIN
218
        res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
175
  IF F # NIL THEN
219
        IF res2 > 0 THEN
-
 
220
            F.pos := F.pos + res2
176
    F.subfunc := 3;
221
        END
177
    F.bytes := Count;
222
    ELSE
178
    F.buffer := Buffer;
223
        res2 := 0
179
    res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
224
    END
180
    IF res2 > 0 THEN
225
 
181
      F.pos := F.pos + res2
226
    RETURN res2
182
    END
227
END Write;
183
  ELSE
228
                   
184
    res2 := 0
229
 
-
 
230
PROCEDURE Create* (FName: ARRAY OF CHAR): FS;
185
  END
231
VAR
186
  RETURN res2
232
    F: FS;
187
END Write;
233
    res2: INTEGER;
188
 
234
 
-
 
235
BEGIN
Line 189... Line 236...
189
PROCEDURE Create*(FName: ARRAY OF CHAR): FS;
236
    NEW(F);
-
 
237
 
190
VAR F: FS; res2: INTEGER;
238
    IF F # NIL THEN
191
BEGIN
239
        F.subfunc := 2;
192
  NEW(F);
240
        F.pos     := 0;
193
  IF F # NIL THEN
241
        F.hpos    := 0;
Line 194... Line -...
194
    F.subfunc := 2;
-
 
195
    F.pos := 0;
-
 
196
    F.hpos := 0;
-
 
197
    F.bytes := 0;
-
 
198
    F.buffer := 0;
-
 
199
    COPY(FName, F.name);
-
 
200
    IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
-
 
201
      DISPOSE(F)
-
 
202
    END
-
 
203
  END
-
 
204
  RETURN F
-
 
205
END Create;
-
 
206
 
-
 
207
PROCEDURE DirExists*(FName: ARRAY OF CHAR): BOOLEAN;
-
 
208
VAR fd: rFD;
-
 
209
BEGIN
-
 
210
  RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
-
 
211
END DirExists;
-
 
Line 212... Line 242...
212
 
242
        F.bytes   := 0;
-
 
243
        F.buffer  := 0;
-
 
244
        COPY(FName, F.name);
213
PROCEDURE CreateDir*(DirName: ARRAY OF CHAR): BOOLEAN;
245
        IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
-
 
246
            DISPOSE(F)
214
VAR F: FS; res, res2: INTEGER;
247
        END
215
BEGIN
-
 
216
  NEW(F);
248
    END
-
 
249
 
217
  IF F # NIL THEN
250
    RETURN F
218
    F.subfunc := 9;
251
END Create;
219
    F.pos := 0;
252
    
220
    F.hpos := 0;
253
 
221
    F.bytes := 0;
254
PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
222
    F.buffer := 0;
255
VAR
223
    COPY(DirName, F.name);
256
    fd: rFD;
224
    res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
257
BEGIN
225
    DISPOSE(F)
258
    RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
226
  ELSE
259
END DirExists;       
227
    res := -1
260
 
228
  END
261
 
-
 
262
PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
-
 
263
VAR
-
 
264
    F: FS;
-
 
265
    res, res2: INTEGER;
-
 
266
 
-
 
267
BEGIN
-
 
268
    NEW(F);
-
 
269
 
-
 
270
    IF F # NIL THEN
-
 
271
        F.subfunc := 9;
-
 
272
        F.pos     := 0;
-
 
273
        F.hpos    := 0;
-
 
274
        F.bytes   := 0;
-
 
275
        F.buffer  := 0;
-
 
276
        COPY(DirName, F.name);
-
 
277
        res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
-
 
278
        DISPOSE(F)
-
 
279
    ELSE
-
 
280
        res := -1
-
 
281
    END
-
 
282
 
-
 
283
    RETURN res = 0
-
 
284
END CreateDir;
-
 
285
                            
-
 
286
 
-
 
287
PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN;
229
  RETURN res = 0
288
VAR
230
END CreateDir;
289
    F: FS;
231
 
290
    res, res2: INTEGER;
-
 
291
 
232
PROCEDURE DeleteDir*(DirName: ARRAY OF CHAR): BOOLEAN;
292
BEGIN
233
VAR F: FS; res, res2: INTEGER;
293
 
Line -... Line 294...
-
 
294
    IF DirExists(DirName) THEN
234
BEGIN
295
        NEW(F);
235
  IF DirExists(DirName) THEN
296
        IF F # NIL THEN