Subversion Repositories Kolibri OS

Rev

Rev 6613 | Go to most recent revision | Show entire file | Regard 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 17... Line 17...
17
 
17
 
Line 18... Line 18...
18
MODULE File;
18
MODULE File;
Line -... Line 19...
-
 
19
 
19
 
20
IMPORT sys := SYSTEM, KOSAPI; 
Line 20... Line 21...
20
IMPORT sys := SYSTEM, KOSAPI;
21
 
Line -... Line 22...
-
 
22
 
21
 
23
CONST
Line 22... Line 24...
22
CONST
24
 
Line 23... Line 25...
23
 
25
    SEEK_BEG* = 0; SEEK_CUR* = 1; SEEK_END* = 2;
Line 45... Line 47...
45
    time_modif*,  date_modif*,
47
        time_modif*,  date_modif*,
46
    size*, hsize*: INTEGER;
48
        size*, hsize*: INTEGER;
47
    name*: FNAME
49
        name*: FNAME
48
  END;
50
    END; 
Line -... Line 51...
-
 
51
 
49
 
52
 
50
PROCEDURE [stdcall] f_68_27(file_name: INTEGER; VAR size: INTEGER): INTEGER;
53
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                     *)
56
  sys.CODE("5B");               (* pop     ebx              *)
60
    05BH,               (*  pop     ebx                    *)
57
  sys.CODE("8B4D08");           (* mov     ecx, [ebp + 08h] *)
61
    08BH, 04DH, 008H,   (*  mov     ecx, dword [ebp +  8]  *)
58
  sys.CODE("CD40");             (* int     40h              *)
62
    0CDH, 040H,         (*  int     64                     *)
59
  sys.CODE("8B4D0C");           (* mov     ecx, [ebp + 0Ch] *)
63
    08BH, 04DH, 00CH,   (*  mov     ecx, dword [ebp + 12]  *)
60
  sys.CODE("8911");             (* mov     [ecx], edx       *)
64
    089H, 011H,         (*  mov     dword [ecx], edx       *)
61
  sys.CODE("5B");               (* pop     ebx              *)
65
    05BH,               (*  pop     ebx                    *)
62
  sys.CODE("C9");               (* leave                    *)
66
    0C9H,               (*  leave                          *)
-
 
67
    0C2H, 008H, 000H    (*  ret     8                      *)
63
  sys.CODE("C20800");           (* ret     08h              *)
68
    )
64
  RETURN 0
69
    RETURN 0
Line -... Line 70...
-
 
70
END f_68_27; 
65
END f_68_27;
71
 
66
 
72
 
67
PROCEDURE Load*(FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
73
PROCEDURE Load* (FName: ARRAY OF CHAR; VAR size: INTEGER): INTEGER;
Line -... Line 74...
-
 
74
    RETURN f_68_27(sys.ADR(FName[0]), size)
68
  RETURN f_68_27(sys.ADR(FName[0]), size)
75
END Load;
-
 
76
 
69
END Load;
77
 
-
 
78
PROCEDURE GetFileInfo* (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
70
 
79
VAR
71
PROCEDURE GetFileInfo*(FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
80
    res2: INTEGER; fs: rFS;  
72
VAR res2: INTEGER; fs: rFS;
81
 
73
BEGIN
82
BEGIN
74
  fs.subfunc := 5;
83
    fs.subfunc := 5;
75
  fs.pos := 0;
84
    fs.pos     := 0;
76
  fs.hpos := 0;
85
    fs.hpos    := 0;
-
 
86
    fs.bytes   := 0;
77
  fs.bytes := 0;
87
    fs.buffer  := sys.ADR(Info);
78
  fs.buffer := sys.ADR(Info);
88
    COPY(FName, fs.name)
Line -... Line 89...
-
 
89
 
79
  COPY(FName, fs.name)
90
    RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
-
 
91
END GetFileInfo;  
80
  RETURN KOSAPI.sysfunc22(70, sys.ADR(fs), res2) = 0
92
 
81
END GetFileInfo;
93
 
82
 
94
PROCEDURE Exists* (FName: ARRAY OF CHAR): BOOLEAN;
83
PROCEDURE Exists*(FName: ARRAY OF CHAR): BOOLEAN;
95
VAR
Line -... Line 96...
-
 
96
    fd: rFD;
84
VAR fd: rFD;
97
BEGIN
85
BEGIN
98
    RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
86
  RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
99
END Exists;
87
END Exists;
100
              
88
 
101
 
89
PROCEDURE Close*(VAR F: FS);
102
PROCEDURE Close* (VAR F: FS);
Line -... Line 103...
-
 
103
BEGIN
90
BEGIN
104
    IF F # NIL THEN
-
 
105
        DISPOSE(F)
91
  IF F # NIL THEN
106
    END
-
 
107
END Close;
92
    DISPOSE(F)
108
 
-
 
109
 
93
  END
110
PROCEDURE Open* (FName: ARRAY OF CHAR): FS;
94
END Close;
111
VAR
95
 
112
    F: FS;     
96
PROCEDURE Open*(FName: ARRAY OF CHAR): FS;
113
 
97
VAR F: FS;
114
BEGIN   
Line 107... Line 124...
107
      COPY(FName, F.name)
124
            COPY(FName, F.name)
108
    END
125
        END
109
  ELSE
126
    ELSE
110
    F := NIL
127
        F := NIL
111
  END
128
    END
-
 
129
 
112
  RETURN F
130
    RETURN F
113
END Open;
131
END Open;     
Line -... Line 132...
-
 
132
 
114
 
133
 
-
 
134
PROCEDURE Delete* (FName: ARRAY OF CHAR): BOOLEAN;
-
 
135
VAR
115
PROCEDURE Delete*(FName: ARRAY OF CHAR): BOOLEAN;
136
    F: FS;
-
 
137
    res, res2: INTEGER;
116
VAR F: FS; res, res2: INTEGER;
138
 
-
 
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
121
      F.subfunc := 8;
144
            F.subfunc := 8;
Line 130... Line 153...
130
      res := -1
153
            res := -1
131
    END
154
        END
132
  ELSE
155
    ELSE
133
    res := -1
156
        res := -1
134
  END
157
    END
-
 
158
 
135
  RETURN res = 0
159
    RETURN res = 0
136
END Delete;
160
END Delete;
Line -... Line 161...
-
 
161
  
137
 
162
 
-
 
163
PROCEDURE Seek* (F: FS; Offset, Origin: INTEGER): INTEGER;
138
PROCEDURE Seek*(F: FS; Offset, Origin: INTEGER): INTEGER;
164
VAR
-
 
165
    res: INTEGER;
-
 
166
    fd: rFD;
139
VAR res: INTEGER; fd: rFD;
167
 
-
 
168
BEGIN
140
BEGIN
169
 
141
  IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
170
    IF (F # NIL) & GetFileInfo(F.name, fd) & (BITS(fd.attr) * {4} = {}) THEN
142
    CASE Origin OF
171
        CASE Origin OF
143
    |SEEK_BEG: F.pos := Offset
172
        |SEEK_BEG: F.pos := Offset
144
    |SEEK_CUR: F.pos := F.pos + Offset
173
        |SEEK_CUR: F.pos := F.pos + Offset
Line 147... Line 176...
147
    END;
176
        END;
148
    res := F.pos
177
        res := F.pos
149
  ELSE
178
    ELSE
150
    res := -1
179
        res := -1
151
  END
180
    END
-
 
181
 
152
  RETURN res
182
    RETURN res
153
END Seek;
183
END Seek;
Line -... Line 184...
-
 
184
 
154
 
185
 
-
 
186
PROCEDURE Read* (F: FS; Buffer, Count: INTEGER): INTEGER;
155
PROCEDURE Read*(F: FS; Buffer, Count: INTEGER): INTEGER;
187
VAR
-
 
188
    res, res2: INTEGER;
156
VAR res, res2: INTEGER;
189
 
-
 
190
BEGIN
157
BEGIN
191
 
158
  IF F # NIL THEN
192
    IF F # NIL THEN
159
    F.subfunc := 0;
193
        F.subfunc := 0;
160
    F.bytes := Count;
194
        F.bytes   := Count;
161
    F.buffer := Buffer;
195
        F.buffer  := Buffer;
Line 164... Line 198...
164
      F.pos := F.pos + res2
198
            F.pos := F.pos + res2
165
    END
199
        END
166
  ELSE
200
    ELSE
167
    res2 := 0
201
        res2 := 0
168
  END
202
    END
-
 
203
 
169
  RETURN res2
204
    RETURN res2
170
END Read;
205
END Read;    
Line -... Line 206...
-
 
206
 
171
 
207
 
-
 
208
PROCEDURE Write* (F: FS; Buffer, Count: INTEGER): INTEGER;
172
PROCEDURE Write*(F: FS; Buffer, Count: INTEGER): INTEGER;
209
VAR
-
 
210
    res, res2: INTEGER;
173
VAR res, res2: INTEGER;
211
 
-
 
212
BEGIN
174
BEGIN
213
 
175
  IF F # NIL THEN
214
    IF F # NIL THEN
176
    F.subfunc := 3;
215
        F.subfunc := 3;
177
    F.bytes := Count;
216
        F.bytes   := Count;
178
    F.buffer := Buffer;
217
        F.buffer  := Buffer;
Line 181... Line 220...
181
      F.pos := F.pos + res2
220
            F.pos := F.pos + res2
182
    END
221
        END
183
  ELSE
222
    ELSE
184
    res2 := 0
223
        res2 := 0
185
  END
224
    END
-
 
225
 
186
  RETURN res2
226
    RETURN res2
187
END Write;
227
END Write;
Line -... Line 228...
-
 
228
                   
188
 
229
 
-
 
230
PROCEDURE Create* (FName: ARRAY OF CHAR): FS;
-
 
231
VAR
189
PROCEDURE Create*(FName: ARRAY OF CHAR): FS;
232
    F: FS;
-
 
233
    res2: INTEGER;
190
VAR F: FS; res2: INTEGER;
234
 
191
BEGIN
235
BEGIN
-
 
236
    NEW(F);
192
  NEW(F);
237
 
193
  IF F # NIL THEN
238
    IF F # NIL THEN
194
    F.subfunc := 2;
239
        F.subfunc := 2;
195
    F.pos := 0;
240
        F.pos     := 0;
196
    F.hpos := 0;
241
        F.hpos    := 0;
Line 199... Line 244...
199
    COPY(FName, F.name);
244
        COPY(FName, F.name);
200
    IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
245
        IF KOSAPI.sysfunc22(70, sys.ADR(F^), res2) # 0 THEN
201
      DISPOSE(F)
246
            DISPOSE(F)
202
    END
247
        END
203
  END
248
    END
-
 
249
 
204
  RETURN F
250
    RETURN F
205
END Create;
251
END Create;
Line -... Line 252...
-
 
252
    
206
 
253
 
-
 
254
PROCEDURE DirExists* (FName: ARRAY OF CHAR): BOOLEAN;
207
PROCEDURE DirExists*(FName: ARRAY OF CHAR): BOOLEAN;
255
VAR
208
VAR fd: rFD;
256
    fd: rFD;
209
BEGIN
257
BEGIN
210
  RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
258
    RETURN GetFileInfo(FName, fd) & (4 IN BITS(fd.attr))
Line -... Line 259...
-
 
259
END DirExists;       
211
END DirExists;
260
 
-
 
261
 
-
 
262
PROCEDURE CreateDir* (DirName: ARRAY OF CHAR): BOOLEAN;
212
 
263
VAR
-
 
264
    F: FS;
213
PROCEDURE CreateDir*(DirName: ARRAY OF CHAR): BOOLEAN;
265
    res, res2: INTEGER;
214
VAR F: FS; res, res2: INTEGER;
266
 
-
 
267
BEGIN
215
BEGIN
268
    NEW(F);
216
  NEW(F);
269
 
217
  IF F # NIL THEN
270
    IF F # NIL THEN
218
    F.subfunc := 9;
271
        F.subfunc := 9;
219
    F.pos := 0;
272
        F.pos     := 0;
Line 224... Line 277...
224
    res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
277
        res := KOSAPI.sysfunc22(70, sys.ADR(F^), res2);
225
    DISPOSE(F)
278
        DISPOSE(F)
226
  ELSE
279
    ELSE
227
    res := -1
280
        res := -1
228
  END
281
    END
-
 
282
 
229
  RETURN res = 0
283
    RETURN res = 0
230
END CreateDir;
284
END CreateDir;
Line -... Line 285...
-
 
285
                            
231
 
286
 
-
 
287
PROCEDURE DeleteDir* (DirName: ARRAY OF CHAR): BOOLEAN;
-
 
288
VAR
232
PROCEDURE DeleteDir*(DirName: ARRAY OF CHAR): BOOLEAN;
289
    F: FS;
-
 
290
    res, res2: INTEGER;
233
VAR F: FS; res, res2: INTEGER;
291
 
-
 
292
BEGIN
234
BEGIN
293
 
235
  IF DirExists(DirName) THEN
294
    IF DirExists(DirName) THEN
236
    NEW(F);
295
        NEW(F);
237
    IF F # NIL THEN
296
        IF F # NIL THEN
238
      F.subfunc := 8;
297
            F.subfunc := 8;
Line 247... Line 306...
247
      res := -1
306
            res := -1
248
    END
307
        END
249
  ELSE
308
    ELSE
250
    res := -1
309
        res := -1
251
  END
310
    END
-
 
311
 
252
  RETURN res = 0
312
    RETURN res = 0
253
END DeleteDir;
313
END DeleteDir;
Line -... Line 314...
-
 
314
 
254
 
315
 
255
END File.
316
END File.