Subversion Repositories Kolibri OS

Rev

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

Rev 7209 Rev 7597
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016, 2017 Anton Krotov
2
    BSD 2-Clause License
Line 3... Line -...
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
3
 
6
    the Free Software Foundation, either version 3 of the License, or
4
    Copyright (c) 2018, 2019, Anton Krotov
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 .
5
    All rights reserved.
Line 16... Line 6...
16
*)
6
*)
Line 17... Line 7...
17
 
7
 
-
 
8
MODULE HOST;
Line 18... Line 9...
18
MODULE HOST;
9
 
Line -... Line 10...
-
 
10
IMPORT SYSTEM, K := KOSAPI, API, RTL;
19
 
11
 
-
 
12
 
-
 
13
CONST
-
 
14
 
-
 
15
    slash* = "/";
-
 
16
    OS* = "KOS";
20
IMPORT sys := SYSTEM, API;
17
 
-
 
18
    bit_depth* = RTL.bit_depth;
Line 21... Line 19...
21
 
19
    maxint* = RTL.maxint;
Line 22... Line 20...
22
CONST
20
    minint* = RTL.minint;
Line -... Line 21...
-
 
21
 
-
 
22
    MAX_PARAM = 1024;
23
 
23
 
24
  OS* = "KOS";
24
 
25
  Slash* = "/";
25
TYPE
26
 
26
 
Line -... Line 27...
-
 
27
    FNAME = ARRAY 520 OF CHAR;
-
 
28
 
-
 
29
    FS = POINTER TO rFS;
-
 
30
 
-
 
31
    rFS = RECORD
-
 
32
        subfunc, pos, hpos, bytes, buffer: INTEGER;
-
 
33
        name: FNAME
-
 
34
    END;
-
 
35
 
-
 
36
    FD = POINTER TO rFD;
-
 
37
 
-
 
38
    rFD = RECORD
-
 
39
        attr: INTEGER;
-
 
40
        ntyp: CHAR;
27
TYPE
41
        reserved: ARRAY 3 OF CHAR;
Line 28... Line -...
28
 
-
 
29
  FILENAME = ARRAY 2048 OF CHAR;
-
 
30
 
-
 
Line 31... Line 42...
31
  OFSTRUCT = RECORD
42
        time_create, date_create,
Line -... Line 43...
-
 
43
        time_access, date_access,
-
 
44
        time_modif,  date_modif,
-
 
45
        size, hsize: INTEGER;
-
 
46
        name: FNAME
-
 
47
    END;
-
 
48
 
-
 
49
 
-
 
50
VAR
-
 
51
 
-
 
52
 
32
    subfunc, pos, hpos, bytes, buf: INTEGER;
53
    Console: BOOLEAN;
-
 
54
 
-
 
55
    Params: ARRAY MAX_PARAM, 2 OF INTEGER;
-
 
56
    argc*: INTEGER;
33
    name: FILENAME
57
 
-
 
58
    eol*: ARRAY 3 OF CHAR;
34
  END;
59
 
-
 
60
 
-
 
61
PROCEDURE [stdcall, "Console.obj", "con_init"] con_init (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
-
 
62
 
-
 
63
PROCEDURE [stdcall, "Console.obj", "con_exit"] con_exit (bCloseWindow: BOOLEAN);
-
 
64
 
-
 
65
PROCEDURE [stdcall, "Console.obj", "con_write_string"] con_write_string (string, length: INTEGER);
-
 
66
 
-
 
67
 
35
 
68
PROCEDURE ExitProcess* (p1: INTEGER);
-
 
69
BEGIN
36
VAR
70
    IF Console THEN
-
 
71
        con_exit(FALSE)
-
 
72
    END;
-
 
73
    K.sysfunc1(-1)
-
 
74
END ExitProcess;
37
 
75
 
-
 
76
 
-
 
77
PROCEDURE OutChar* (c: CHAR);
-
 
78
BEGIN
-
 
79
    IF Console THEN
-
 
80
        con_write_string(SYSTEM.ADR(c), 1)
-
 
81
    ELSE
-
 
82
        K.sysfunc3(63, 1, ORD(c))
-
 
83
    END
-
 
84
END OutChar;
38
  con_init		 : PROCEDURE [stdcall] (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
85
 
39
  con_exit		 : PROCEDURE [stdcall] (bCloseWindow: BOOLEAN);
86
 
40
  con_write_asciiz	 : PROCEDURE [stdcall] (string: INTEGER);
87
PROCEDURE GetFileInfo (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
-
 
88
VAR
-
 
89
    res2: INTEGER;
-
 
90
    fs:   rFS;
41
 
91
 
-
 
92
BEGIN
-
 
93
    fs.subfunc := 5;
-
 
94
    fs.pos := 0;
-
 
95
    fs.hpos := 0;
42
  fsize, sec*, dsec*: INTEGER;
96
    fs.bytes := 0;
-
 
97
    fs.buffer := SYSTEM.ADR(Info);
-
 
98
    COPY(FName, fs.name)
-
 
99
    RETURN K.sysfunc22(70, SYSTEM.ADR(fs), res2) = 0
-
 
100
END GetFileInfo;
-
 
101
 
-
 
102
 
-
 
103
PROCEDURE Exists (FName: ARRAY OF CHAR): BOOLEAN;
43
 
104
VAR
44
PROCEDURE [stdcall] sysfunc22(arg1, arg2: INTEGER; VAR res2: INTEGER): INTEGER;
105
    fd: rFD;
Line 45... Line -...
45
BEGIN
-
 
46
  sys.CODE("53");               (* push    ebx              *)
-
 
Line 47... Line 106...
47
  sys.CODE("8B4508");           (* mov     eax, [ebp + 08h] *)
106
 
-
 
107
BEGIN
48
  sys.CODE("8B5D0C");           (* mov     ebx, [ebp + 0Ch] *)
108
    RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
-
 
109
END Exists;
49
  sys.CODE("CD40");             (* int     40h              *)
110
 
-
 
111
 
50
  sys.CODE("8B4D10");           (* mov     ecx, [ebp + 10h] *)
112
PROCEDURE Close (VAR F: FS);
51
  sys.CODE("8919");             (* mov     [ecx], ebx       *)
113
BEGIN
52
  sys.CODE("5B");               (* pop     ebx              *)
114
    IF F # NIL THEN
53
  sys.CODE("C9");               (* leave                    *)
115
        DISPOSE(F)
-
 
116
    END
-
 
117
END Close;
-
 
118
 
-
 
119
 
54
  sys.CODE("C20C00");           (* ret     0Ch              *)
120
PROCEDURE Open (FName: ARRAY OF CHAR): FS;
-
 
121
VAR
55
  RETURN 0
122
    F: FS;
-
 
123
 
-
 
124
BEGIN
56
END sysfunc22;
125
    IF Exists(FName) THEN
57
 
126
        NEW(F);
-
 
127
        IF F # NIL THEN
-
 
128
            F.subfunc := 0;
-
 
129
            F.pos := 0;
-
 
130
            F.hpos := 0;
-
 
131
            F.bytes := 0;
Line 58... Line 132...
58
PROCEDURE GetProcAdr(name: ARRAY OF CHAR; lib: INTEGER): INTEGER;
132
            F.buffer := 0;
59
VAR cur, procname, adr: INTEGER;
-
 
60
 
133
            COPY(FName, F.name)
61
  PROCEDURE streq(str1, str2: INTEGER): BOOLEAN;
134
        END
62
  VAR c1, c2: CHAR;
-
 
63
  BEGIN
135
    ELSE
64
    REPEAT
136
        F := NIL
65
      sys.GET(str1, c1);
137
    END
66
      sys.GET(str2, c2);
138
 
67
      INC(str1);
139
    RETURN F
68
      INC(str2)
140
END Open;
-
 
141
 
-
 
142
 
69
    UNTIL (c1 # c2) OR (c1 = 0X)
143
PROCEDURE Read (F: FS; Buffer, Count: INTEGER): INTEGER;
70
    RETURN c1 = c2
-
 
71
  END streq;
-
 
Line -... Line 144...
-
 
144
VAR
-
 
145
    res, res2: INTEGER;
-
 
146
 
-
 
147
BEGIN
72
 
148
    IF F # NIL THEN
-
 
149
        F.subfunc := 0;
73
BEGIN
150
        F.bytes := Count;
-
 
151
        F.buffer := Buffer;
74
  adr := 0;
152
        res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
-
 
153
        IF res2 > 0 THEN
75
  IF (lib # 0) & (name # "") THEN
154
            F.pos := F.pos + res2
-
 
155
        END
-
 
156
    ELSE
-
 
157
        res2 := 0
-
 
158
    END
-
 
159
 
76
    cur := lib;
160
    RETURN res2
-
 
161
END Read;
77
    REPEAT
162
 
-
 
163
 
-
 
164
PROCEDURE Write (F: FS; Buffer, Count: INTEGER): INTEGER;
-
 
165
VAR
78
      sys.GET(cur, procname);
166
    res, res2: INTEGER;
Line 79... Line -...
79
      INC(cur, 8)
-
 
80
    UNTIL (procname = 0) OR streq(procname, sys.ADR(name[0]));
-
 
Line 81... Line 167...
81
    IF procname # 0 THEN
167
 
-
 
168
BEGIN
-
 
169
    IF F # NIL THEN
82
      sys.GET(cur - 4, adr)
170
        F.subfunc := 3;
-
 
171
        F.bytes := Count;
83
    END
172
        F.buffer := Buffer;
-
 
173
        res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
-
 
174
        IF res2 > 0 THEN
-
 
175
            F.pos := F.pos + res2
-
 
176
        END
-
 
177
    ELSE
-
 
178
        res2 := 0
-
 
179
    END
84
  END
180
 
-
 
181
    RETURN res2
-
 
182
END Write;
-
 
183
 
-
 
184
 
-
 
185
PROCEDURE Create (FName: ARRAY OF CHAR): FS;
85
  RETURN adr
186
VAR
86
END GetProcAdr;
187
    F:    FS;
-
 
188
    res2: INTEGER;
-
 
189
 
-
 
190
BEGIN
-
 
191
    NEW(F);
-
 
192
    IF F # NIL THEN
-
 
193
        F.subfunc := 2;
Line 87... Line 194...
87
 
194
        F.pos := 0;
88
PROCEDURE Time*(VAR sec, dsec: INTEGER);
195
        F.hpos := 0;
89
VAR t: INTEGER;
196
        F.bytes := 0;
90
BEGIN
197
        F.buffer := 0;
91
  t := API.sysfunc2(26, 9);
-
 
92
  sec := t DIV 100;
-
 
93
  dsec := t MOD 100
-
 
94
END Time;
198
        COPY(FName, F.name);
95
 
-
 
96
PROCEDURE init*;
199
        IF K.sysfunc22(70, SYSTEM.ADR(F^), res2) # 0 THEN
-
 
200
            DISPOSE(F)
-
 
201
        END
-
 
202
    END
-
 
203
 
-
 
204
    RETURN F
-
 
205
END Create;
-
 
206
 
-
 
207
 
-
 
208
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
-
 
209
VAR
-
 
210
    n: INTEGER;
-
 
211
    fs: FS;
-
 
212
 
-
 
213
BEGIN
-
 
214
    SYSTEM.GET(SYSTEM.ADR(F), fs);
97
VAR Lib: INTEGER;
215
    n := Read(fs, SYSTEM.ADR(Buffer[0]), bytes);
98
 
-
 
Line -... Line 216...
-
 
216
    IF n = 0 THEN
-
 
217
        n := -1
-
 
218
    END
-
 
219
 
99
  PROCEDURE GetProc(v: INTEGER; name: ARRAY OF CHAR);
220
    RETURN n
-
 
221
END FileRead;
-
 
222
 
-
 
223
 
-
 
224
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
100
  VAR a: INTEGER;
225
VAR
101
  BEGIN
226
    n: INTEGER;
-
 
227
    fs: FS;
-
 
228
 
-
 
229
BEGIN
-
 
230
    SYSTEM.GET(SYSTEM.ADR(F), fs);
-
 
231
    n := Write(fs, SYSTEM.ADR(Buffer[0]), bytes);
-
 
232
    IF n = 0 THEN
-
 
233
        n := -1
-
 
234
    END
-
 
235
 
-
 
236
    RETURN n
-
 
237
END FileWrite;
102
    a := GetProcAdr(name, Lib);
238
 
-
 
239
 
-
 
240
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
-
 
241
VAR
-
 
242
    fs: FS;
-
 
243
    res: INTEGER;
-
 
244
 
-
 
245
BEGIN
-
 
246
    fs := Create(FName);
103
    sys.PUT(v, a)
247
    SYSTEM.GET(SYSTEM.ADR(fs), res)
-
 
248
    RETURN res
-
 
249
END FileCreate;
104
  END GetProc;
250
 
105
 
251
 
-
 
252
PROCEDURE FileClose* (F: INTEGER);
-
 
253
VAR
-
 
254
    fs: FS;
-
 
255
 
-
 
256
BEGIN
-
 
257
    SYSTEM.GET(SYSTEM.ADR(F), fs);
Line 106... Line 258...
106
BEGIN
258
    Close(fs)
107
  Time(sec, dsec);
259
END FileClose;
108
  Lib := API.sysfunc3(68, 19, sys.ADR("/rd/1/lib/console.obj"));
260
 
109
  IF Lib # 0 THEN
261
 
-
 
262
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
110
    GetProc(sys.ADR(con_init),	       "con_init");
263
VAR
111
    GetProc(sys.ADR(con_exit),	       "con_exit");
264
    fs: FS;
112
    GetProc(sys.ADR(con_write_asciiz), "con_write_asciiz");
265
    res: INTEGER;
113
    IF con_init # NIL THEN
266
 
114
      con_init(-1, -1, -1, -1, sys.ADR("Oberon-07/11 for KolibriOS"))
267
BEGIN
Line -... Line 268...
-
 
268
    fs := Open(FName);
115
    END
269
    SYSTEM.GET(SYSTEM.ADR(fs), res)
-
 
270
    RETURN res
116
  END
271
END FileOpen;
-
 
272
 
117
END init;
273
 
118
 
274
PROCEDURE GetTickCount* (): INTEGER;
119
PROCEDURE ExitProcess* (n: INTEGER);
275
    RETURN K.sysfunc2(26, 9)
120
BEGIN
276
END GetTickCount;
Line -... Line 277...
-
 
277
 
121
  IF con_exit # NIL THEN
278
 
-
 
279
PROCEDURE AppAdr (): INTEGER;
122
    con_exit(FALSE)
280
VAR
-
 
281
    buf: ARRAY 1024 OF CHAR;
123
  END;
282
    a: INTEGER;
124
  API.ExitProcess(0)
283
 
125
END ExitProcess;
284
BEGIN
126
 
285
    a := K.sysfunc3(9, SYSTEM.ADR(buf), -1);
Line 127... Line -...
127
PROCEDURE AppAdr(): INTEGER;
-
 
128
VAR
-
 
129
    buf: ARRAY 1024 OF CHAR;
-
 
130
    a: INTEGER;
-
 
131
BEGIN
-
 
132
    a := API.sysfunc3(9, sys.ADR(buf), -1);
-
 
133
    sys.GET(sys.ADR(buf) + 22, a)
-
 
134
    RETURN a
-
 
135
END AppAdr;
-
 
136
 
-
 
137
PROCEDURE GetCommandLine*(): INTEGER;
-
 
138
VAR param: INTEGER;
-
 
139
BEGIN
-
 
140
  sys.GET(28 + AppAdr(), param)
-
 
141
  RETURN param
-
 
142
END GetCommandLine;
-
 
143
 
-
 
144
PROCEDURE GetName*(): INTEGER;
-
 
145
VAR name: INTEGER;
-
 
146
BEGIN
-
 
147
  sys.GET(32 + AppAdr(), name)
-
 
148
  RETURN name
-
 
149
END GetName;
-
 
150
 
-
 
151
PROCEDURE malloc*(size: INTEGER): INTEGER;
-
 
152
  RETURN API.sysfunc3(68, 12, size)
-
 
153
END malloc;
-
 
154
 
-
 
Line 155... Line 286...
155
PROCEDURE CloseFile*(hObject: INTEGER);
286
    SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
-
 
287
    RETURN a
156
VAR pFS: POINTER TO OFSTRUCT;
288
END AppAdr;
-
 
289
 
157
BEGIN
290
 
158
  sys.PUT(sys.ADR(pFS), hObject);
-
 
159
  DISPOSE(pFS)
-
 
160
END CloseFile;
-
 
161
 
-
 
162
PROCEDURE _OCFile(FileName: ARRAY OF CHAR; VAR FS: OFSTRUCT; mode: INTEGER; VAR fsize: INTEGER): INTEGER;
-
 
163
VAR buf: ARRAY 40 OF CHAR; res: INTEGER;
-
 
164
BEGIN
-
 
165
  FS.subfunc := mode;
291
PROCEDURE GetCommandLine (): INTEGER;
166
  FS.pos := 0;
292
VAR
167
  FS.hpos := 0;
293
    param: INTEGER;
-
 
294
 
-
 
295
BEGIN
-
 
296
    SYSTEM.GET(28 + AppAdr(), param)
-
 
297
    RETURN param
-
 
298
END GetCommandLine;
-
 
299
 
Line -... Line 300...
-
 
300
 
168
  FS.bytes := 0;
301
PROCEDURE GetName (): INTEGER;
169
  FS.buf := sys.ADR(buf);
-
 
170
  COPY(FileName, FS.name);
302
VAR
171
  IF sysfunc22(70, sys.ADR(FS), res) = 0 THEN
303
    name: INTEGER;
172
    res := sys.ADR(FS);
304
 
173
    sys.GET(sys.ADR(buf) + 32, fsize)
305
BEGIN
174
  ELSE
306
    SYSTEM.GET(32 + AppAdr(), name)
175
    res := 0
-
 
176
  END
307
    RETURN name
177
  RETURN res
308
END GetName;
178
END _OCFile;
-
 
179
 
309
 
180
PROCEDURE IOFile(VAR FS: OFSTRUCT; Buffer, bytes, io: INTEGER): INTEGER;
310
 
181
VAR res1, res: INTEGER;
311
PROCEDURE GetChar (adr: INTEGER): CHAR;
182
BEGIN
-
 
183
  FS.subfunc := io;
312
VAR
Line 184... Line -...
184
  FS.bytes := bytes;
-
 
185
  FS.buf := Buffer;
-
 
186
  res1 := sysfunc22(70, sys.ADR(FS), res);
-
 
187
  IF res = -1 THEN
-
 
188
    res := 0
-
 
189
  END;
-
 
190
  FS.pos := FS.pos + res
-
 
191
  RETURN res
-
 
192
END IOFile;
-
 
193
 
-
 
194
PROCEDURE OCFile(FName: ARRAY OF CHAR; mode: INTEGER): INTEGER;
-
 
195
VAR FS: OFSTRUCT; pFS: POINTER TO OFSTRUCT; res: INTEGER;
-
 
196
BEGIN
-
 
197
  IF _OCFile(FName, FS, mode, fsize) # 0 THEN
-
 
198
    NEW(pFS);
-
 
199
    IF pFS = NIL THEN
-
 
200
      res := 0
-
 
201
    ELSE
-
 
202
      sys.GET(sys.ADR(pFS), res);
-
 
203
      pFS^ := FS
-
 
204
    END
-
 
205
  ELSE
-
 
206
    res := 0
-
 
Line 207... Line -...
207
  END
-
 
208
  RETURN res
-
 
209
END OCFile;
313
    res: CHAR;
-
 
314
 
-
 
315
BEGIN
210
 
316
    SYSTEM.GET(adr, res)
211
PROCEDURE CreateFile* (FName: ARRAY OF CHAR): INTEGER;
317
    RETURN res
-
 
318
END GetChar;
-
 
319
 
-
 
320
 
-
 
321
PROCEDURE ParamParse;
-
 
322
VAR
212
  RETURN OCFile(FName, 2)
323
    p, count, name, cond: INTEGER;
-
 
324
    c: CHAR;
-
 
325
 
-
 
326
 
-
 
327
    PROCEDURE ChangeCond (A, B, C: INTEGER; c: CHAR; VAR cond: INTEGER);
-
 
328
    BEGIN
-
 
329
        IF (c <= 20X) & (c # 0X) THEN
-
 
330
            cond := A
-
 
331
        ELSIF c = 22X THEN
-
 
332
            cond := B
-
 
333
        ELSIF c = 0X THEN
213
END CreateFile;
334
            cond := 6
-
 
335
        ELSE
-
 
336
            cond := C
-
 
337
        END
-
 
338
    END ChangeCond;
-
 
339
 
-
 
340
 
-
 
341
BEGIN
-
 
342
    p := GetCommandLine();
-
 
343
    name := GetName();
-
 
344
    Params[0, 0] := name;
-
 
345
    WHILE GetChar(name) # 0X DO
-
 
346
        INC(name)
-
 
347
    END;
214
 
348
    Params[0, 1] := name - 1;
-
 
349
    cond := 0;
-
 
350
    count := 1;
-
 
351
    WHILE (argc < MAX_PARAM) & (cond # 6) DO
-
 
352
        c := GetChar(p);
-
 
353
        CASE cond OF
-
 
354
        |0: ChangeCond(0, 4, 1, c, cond); IF cond = 1 THEN Params[count, 0] := p END
-
 
355
        |1: ChangeCond(0, 3, 1, c, cond); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
-
 
356
        |3: ChangeCond(3, 1, 3, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
215
PROCEDURE OpenFile* (FName: ARRAY OF CHAR): INTEGER;
357
        |4: ChangeCond(5, 0, 5, c, cond); IF cond = 5 THEN Params[count, 0] := p END
-
 
358
        |5: ChangeCond(5, 1, 5, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
216
  RETURN OCFile(FName, 5)
359
        |6:
-
 
360
        END;
-
 
361
        INC(p)
-
 
362
    END;
-
 
363
    argc := count
-
 
364
END ParamParse;
-
 
365
 
-
 
366
 
-
 
367
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
-
 
368
VAR
-
 
369
    i, j, len: INTEGER;
-
 
370
    c: CHAR;
-
 
371
 
-
 
372
BEGIN
-
 
373
    j := 0;
-
 
374
    IF n < argc THEN
-
 
375
        len := LEN(s) - 1;
-
 
376
        i := Params[n, 0];
-
 
377
        WHILE (j < len) & (i <= Params[n, 1]) DO
-
 
378
            c := GetChar(i);
-
 
379
            IF c # 22X THEN
-
 
380
                s[j] := c;
-
 
381
                INC(j)
-
 
382
            END;
-
 
383
            INC(i);
-
 
384
        END;
-
 
385
    END;
-
 
386
    s[j] := 0X
-
 
387
END GetArg;
-
 
388
 
-
 
389
 
-
 
390
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
-
 
391
VAR
-
 
392
    n: INTEGER;
-
 
393
 
-
 
394
BEGIN
-
 
395
    GetArg(0, path);
-
 
396
    n := LENGTH(path) - 1;
-
 
397
    WHILE path[n] # slash DO
-
 
398
        DEC(n)
-
 
399
    END;
-
 
400
    path[n + 1] := 0X
-
 
401
END GetCurrentDirectory;
-
 
402
 
-
 
403
 
-
 
404
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
-
 
405
    RETURN path[0] # slash
-
 
406
END isRelative;
-
 
407
 
-
 
408
 
-
 
409
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
-
 
410
VAR
-
 
411
    date, time: INTEGER;
-
 
412
 
-
 
413
BEGIN
-
 
414
    date  := K.sysfunc1(29);
-
 
415
    time  := K.sysfunc1(3);
-
 
416
 
-
 
417
    year  := date MOD 16;
-
 
418
    date  := date DIV 16;
-
 
419
    year  := (date MOD 16) * 10 + year;
-
 
420
    date  := date DIV 16;
Line -... Line 421...
-
 
421
 
-
 
422
    month := date MOD 16;
-
 
423
    date  := date DIV 16;
-
 
424
    month := (date MOD 16) * 10 + month;
-
 
425
    date  := date DIV 16;
-
 
426
 
-
 
427
    day   := date MOD 16;
-
 
428
    date  := date DIV 16;
-
 
429
    day   := (date MOD 16) * 10 + day;
-
 
430
    date  := date DIV 16;
-
 
431
 
-
 
432
    hour  := time MOD 16;
-
 
433
    time  := time DIV 16;
-
 
434
    hour  := (time MOD 16) * 10 + hour;
-
 
435
    time  := time DIV 16;
-
 
436
 
-
 
437
    min   := time MOD 16;
-
 
438
    time  := time DIV 16;
-
 
439
    min   := (time MOD 16) * 10 + min;
-
 
440
    time  := time DIV 16;
-
 
441
 
217
END OpenFile;
442
    sec   := time MOD 16;
218
 
443
    time  := time DIV 16;