Subversion Repositories Kolibri OS

Rev

Rev 7696 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
7983 leency 1
(*
7597 akron1 2
    BSD 2-Clause License
6613 leency 3
 
7983 leency 4
    Copyright (c) 2018-2020, Anton Krotov
7597 akron1 5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE HOST;
9
 
7597 akron1 10
IMPORT SYSTEM, K := KOSAPI, API, RTL;
6613 leency 11
 
7597 akron1 12
 
6613 leency 13
CONST
14
 
7597 akron1 15
    slash* = "/";
16
    OS* = "KOS";
6613 leency 17
 
7597 akron1 18
    bit_depth* = RTL.bit_depth;
19
    maxint* = RTL.maxint;
20
    minint* = RTL.minint;
21
 
22
    MAX_PARAM = 1024;
23
 
24
 
6613 leency 25
TYPE
26
 
7597 akron1 27
    FNAME = ARRAY 520 OF CHAR;
6613 leency 28
 
7597 akron1 29
    FS = POINTER TO rFS;
6613 leency 30
 
7597 akron1 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;
41
        reserved: ARRAY 3 OF CHAR;
42
        time_create, date_create,
43
        time_access, date_access,
44
        time_modif,  date_modif,
45
        size, hsize: INTEGER;
46
        name: FNAME
47
    END;
48
 
49
 
6613 leency 50
VAR
51
 
52
 
7597 akron1 53
    Console: BOOLEAN;
6613 leency 54
 
7597 akron1 55
    Params: ARRAY MAX_PARAM, 2 OF INTEGER;
56
    argc*: INTEGER;
57
 
58
    eol*: ARRAY 3 OF CHAR;
59
 
7983 leency 60
    maxreal*: REAL;
7597 akron1 61
 
7983 leency 62
 
7597 akron1 63
PROCEDURE [stdcall, "Console.obj", "con_init"] con_init (wnd_width, wnd_height, scr_width, scr_height, title: INTEGER);
64
 
65
PROCEDURE [stdcall, "Console.obj", "con_exit"] con_exit (bCloseWindow: BOOLEAN);
66
 
67
PROCEDURE [stdcall, "Console.obj", "con_write_string"] con_write_string (string, length: INTEGER);
68
 
69
 
70
PROCEDURE ExitProcess* (p1: INTEGER);
6613 leency 71
BEGIN
7597 akron1 72
    IF Console THEN
73
        con_exit(FALSE)
74
    END;
75
    K.sysfunc1(-1)
76
END ExitProcess;
6613 leency 77
 
78
 
7597 akron1 79
PROCEDURE OutChar* (c: CHAR);
80
BEGIN
81
    IF Console THEN
82
        con_write_string(SYSTEM.ADR(c), 1)
83
    ELSE
84
        K.sysfunc3(63, 1, ORD(c))
85
    END
86
END OutChar;
6613 leency 87
 
7597 akron1 88
 
89
PROCEDURE GetFileInfo (FName: ARRAY OF CHAR; VAR Info: rFD): BOOLEAN;
90
VAR
91
    res2: INTEGER;
92
    fs:   rFS;
93
 
6613 leency 94
BEGIN
7597 akron1 95
    fs.subfunc := 5;
96
    fs.pos := 0;
97
    fs.hpos := 0;
98
    fs.bytes := 0;
99
    fs.buffer := SYSTEM.ADR(Info);
100
    COPY(FName, fs.name)
101
    RETURN K.sysfunc22(70, SYSTEM.ADR(fs), res2) = 0
102
END GetFileInfo;
103
 
104
 
105
PROCEDURE Exists (FName: ARRAY OF CHAR): BOOLEAN;
106
VAR
107
    fd: rFD;
108
 
109
BEGIN
110
    RETURN GetFileInfo(FName, fd) & ~(4 IN BITS(fd.attr))
111
END Exists;
112
 
113
 
114
PROCEDURE Close (VAR F: FS);
115
BEGIN
116
    IF F # NIL THEN
117
        DISPOSE(F)
6613 leency 118
    END
7597 akron1 119
END Close;
6613 leency 120
 
7597 akron1 121
 
122
PROCEDURE Open (FName: ARRAY OF CHAR): FS;
123
VAR
124
    F: FS;
125
 
6613 leency 126
BEGIN
7597 akron1 127
    IF Exists(FName) THEN
128
        NEW(F);
129
        IF F # NIL THEN
130
            F.subfunc := 0;
131
            F.pos := 0;
132
            F.hpos := 0;
133
            F.bytes := 0;
134
            F.buffer := 0;
135
            COPY(FName, F.name)
136
        END
137
    ELSE
138
        F := NIL
139
    END
6613 leency 140
 
7597 akron1 141
    RETURN F
142
END Open;
6613 leency 143
 
144
 
7597 akron1 145
PROCEDURE Read (F: FS; Buffer, Count: INTEGER): INTEGER;
146
VAR
147
    res, res2: INTEGER;
148
 
6613 leency 149
BEGIN
7597 akron1 150
    IF F # NIL THEN
151
        F.subfunc := 0;
152
        F.bytes := Count;
153
        F.buffer := Buffer;
154
        res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
155
        IF res2 > 0 THEN
156
            F.pos := F.pos + res2
157
        END
158
    ELSE
159
        res2 := 0
6613 leency 160
    END
161
 
7597 akron1 162
    RETURN res2
163
END Read;
164
 
165
 
166
PROCEDURE Write (F: FS; Buffer, Count: INTEGER): INTEGER;
167
VAR
168
    res, res2: INTEGER;
169
 
6613 leency 170
BEGIN
7597 akron1 171
    IF F # NIL THEN
172
        F.subfunc := 3;
173
        F.bytes := Count;
174
        F.buffer := Buffer;
175
        res := K.sysfunc22(70, SYSTEM.ADR(F^), res2);
176
        IF res2 > 0 THEN
177
            F.pos := F.pos + res2
178
        END
179
    ELSE
180
        res2 := 0
181
    END
6613 leency 182
 
7597 akron1 183
    RETURN res2
184
END Write;
185
 
186
 
187
PROCEDURE Create (FName: ARRAY OF CHAR): FS;
7209 akron1 188
VAR
7597 akron1 189
    F:    FS;
190
    res2: INTEGER;
191
 
192
BEGIN
193
    NEW(F);
194
    IF F # NIL THEN
195
        F.subfunc := 2;
196
        F.pos := 0;
197
        F.hpos := 0;
198
        F.bytes := 0;
199
        F.buffer := 0;
200
        COPY(FName, F.name);
201
        IF K.sysfunc22(70, SYSTEM.ADR(F^), res2) # 0 THEN
202
            DISPOSE(F)
203
        END
204
    END
205
 
206
    RETURN F
207
END Create;
208
 
209
 
7696 akron1 210
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
7597 akron1 211
VAR
212
    n: INTEGER;
213
    fs: FS;
214
 
215
BEGIN
216
    SYSTEM.GET(SYSTEM.ADR(F), fs);
217
    n := Read(fs, SYSTEM.ADR(Buffer[0]), bytes);
218
    IF n = 0 THEN
219
        n := -1
220
    END
221
 
222
    RETURN n
223
END FileRead;
224
 
225
 
226
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
227
VAR
228
    n: INTEGER;
229
    fs: FS;
230
 
231
BEGIN
232
    SYSTEM.GET(SYSTEM.ADR(F), fs);
233
    n := Write(fs, SYSTEM.ADR(Buffer[0]), bytes);
234
    IF n = 0 THEN
235
        n := -1
236
    END
237
 
238
    RETURN n
239
END FileWrite;
240
 
241
 
242
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
243
VAR
244
    fs: FS;
245
    res: INTEGER;
246
 
247
BEGIN
248
    fs := Create(FName);
249
    SYSTEM.GET(SYSTEM.ADR(fs), res)
250
    RETURN res
251
END FileCreate;
252
 
253
 
254
PROCEDURE FileClose* (F: INTEGER);
255
VAR
256
    fs: FS;
257
 
258
BEGIN
259
    SYSTEM.GET(SYSTEM.ADR(F), fs);
260
    Close(fs)
261
END FileClose;
262
 
263
 
264
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
265
VAR
266
    fs: FS;
267
    res: INTEGER;
268
 
269
BEGIN
270
    fs := Open(FName);
271
    SYSTEM.GET(SYSTEM.ADR(fs), res)
272
    RETURN res
273
END FileOpen;
274
 
275
 
276
PROCEDURE GetTickCount* (): INTEGER;
277
    RETURN K.sysfunc2(26, 9)
278
END GetTickCount;
279
 
280
 
281
PROCEDURE AppAdr (): INTEGER;
282
VAR
7209 akron1 283
    buf: ARRAY 1024 OF CHAR;
284
    a: INTEGER;
7597 akron1 285
 
7209 akron1 286
BEGIN
7597 akron1 287
    a := K.sysfunc3(9, SYSTEM.ADR(buf), -1);
288
    SYSTEM.GET(SYSTEM.ADR(buf) + 22, a)
7209 akron1 289
    RETURN a
290
END AppAdr;
291
 
7597 akron1 292
 
293
PROCEDURE GetCommandLine (): INTEGER;
294
VAR
295
    param: INTEGER;
296
 
6613 leency 297
BEGIN
7597 akron1 298
    SYSTEM.GET(28 + AppAdr(), param)
299
    RETURN param
6613 leency 300
END GetCommandLine;
301
 
7597 akron1 302
 
303
PROCEDURE GetName (): INTEGER;
304
VAR
305
    name: INTEGER;
306
 
6613 leency 307
BEGIN
7597 akron1 308
    SYSTEM.GET(32 + AppAdr(), name)
309
    RETURN name
6613 leency 310
END GetName;
311
 
312
 
7597 akron1 313
PROCEDURE GetChar (adr: INTEGER): CHAR;
314
VAR
315
    res: CHAR;
316
 
6613 leency 317
BEGIN
7597 akron1 318
    SYSTEM.GET(adr, res)
319
    RETURN res
320
END GetChar;
6613 leency 321
 
7597 akron1 322
 
323
PROCEDURE ParamParse;
324
VAR
325
    p, count, name, cond: INTEGER;
326
    c: CHAR;
327
 
328
 
329
    PROCEDURE ChangeCond (A, B, C: INTEGER; c: CHAR; VAR cond: INTEGER);
330
    BEGIN
331
        IF (c <= 20X) & (c # 0X) THEN
332
            cond := A
333
        ELSIF c = 22X THEN
334
            cond := B
335
        ELSIF c = 0X THEN
336
            cond := 6
337
        ELSE
338
            cond := C
339
        END
340
    END ChangeCond;
341
 
342
 
6613 leency 343
BEGIN
7597 akron1 344
    p := GetCommandLine();
345
    name := GetName();
346
    Params[0, 0] := name;
347
    WHILE GetChar(name) # 0X DO
348
        INC(name)
349
    END;
350
    Params[0, 1] := name - 1;
351
    cond := 0;
352
    count := 1;
353
    WHILE (argc < MAX_PARAM) & (cond # 6) DO
354
        c := GetChar(p);
355
        CASE cond OF
356
        |0: ChangeCond(0, 4, 1, c, cond); IF cond = 1 THEN Params[count, 0] := p END
357
        |1: ChangeCond(0, 3, 1, c, cond); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END
358
        |3: ChangeCond(3, 1, 3, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
359
        |4: ChangeCond(5, 0, 5, c, cond); IF cond = 5 THEN Params[count, 0] := p END
360
        |5: ChangeCond(5, 1, 5, c, cond); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
361
        |6:
362
        END;
363
        INC(p)
364
    END;
365
    argc := count
366
END ParamParse;
6613 leency 367
 
7597 akron1 368
 
369
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
370
VAR
371
    i, j, len: INTEGER;
372
    c: CHAR;
373
 
6613 leency 374
BEGIN
7597 akron1 375
    j := 0;
376
    IF n < argc THEN
377
        len := LEN(s) - 1;
378
        i := Params[n, 0];
379
        WHILE (j < len) & (i <= Params[n, 1]) DO
380
            c := GetChar(i);
381
            IF c # 22X THEN
382
                s[j] := c;
383
                INC(j)
384
            END;
385
            INC(i);
386
        END;
387
    END;
388
    s[j] := 0X
389
END GetArg;
6613 leency 390
 
7597 akron1 391
 
392
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
393
VAR
394
    n: INTEGER;
395
 
6613 leency 396
BEGIN
7597 akron1 397
    GetArg(0, path);
398
    n := LENGTH(path) - 1;
399
    WHILE path[n] # slash DO
400
        DEC(n)
401
    END;
402
    path[n + 1] := 0X
403
END GetCurrentDirectory;
6613 leency 404
 
405
 
7597 akron1 406
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
407
    RETURN path[0] # slash
408
END isRelative;
6613 leency 409
 
410
 
7597 akron1 411
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
412
VAR
413
    date, time: INTEGER;
414
 
6613 leency 415
BEGIN
7597 akron1 416
    date  := K.sysfunc1(29);
417
    time  := K.sysfunc1(3);
6613 leency 418
 
7597 akron1 419
    year  := date MOD 16;
420
    date  := date DIV 16;
421
    year  := (date MOD 16) * 10 + year;
422
    date  := date DIV 16;
423
 
424
    month := date MOD 16;
425
    date  := date DIV 16;
426
    month := (date MOD 16) * 10 + month;
427
    date  := date DIV 16;
428
 
429
    day   := date MOD 16;
430
    date  := date DIV 16;
431
    day   := (date MOD 16) * 10 + day;
432
    date  := date DIV 16;
433
 
434
    hour  := time MOD 16;
435
    time  := time DIV 16;
436
    hour  := (time MOD 16) * 10 + hour;
437
    time  := time DIV 16;
438
 
439
    min   := time MOD 16;
440
    time  := time DIV 16;
441
    min   := (time MOD 16) * 10 + min;
442
    time  := time DIV 16;
443
 
444
    sec   := time MOD 16;
445
    time  := time DIV 16;
446
    sec   := (time MOD 16) * 10 + sec;
447
    time  := time DIV 16;
448
 
449
    year := year + 2000
450
END now;
451
 
452
 
453
PROCEDURE UnixTime* (): INTEGER;
454
    RETURN 0
455
END UnixTime;
456
 
457
 
7983 leency 458
PROCEDURE d2s* (x: REAL): INTEGER;
459
VAR
460
    h, l, s, e: INTEGER;
461
 
462
BEGIN
463
    SYSTEM.GET(SYSTEM.ADR(x), l);
464
    SYSTEM.GET(SYSTEM.ADR(x) + 4, h);
465
 
466
    s := ASR(h, 31) MOD 2;
467
    e := (h DIV 100000H) MOD 2048;
468
    IF e <= 896 THEN
469
        h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
470
        REPEAT
471
            h := h DIV 2;
472
            INC(e)
473
        UNTIL e = 897;
474
        e := 896;
475
        l := (h MOD 8) * 20000000H;
476
        h := h DIV 8
477
    ELSIF (1151 <= e) & (e < 2047) THEN
478
        e := 1151;
479
        h := 0;
480
        l := 0
481
    ELSIF e = 2047 THEN
482
        e := 1151;
483
        IF (h MOD 100000H # 0) OR (l # 0) THEN
484
            h := 80000H;
485
            l := 0
486
        END
487
    END;
488
    DEC(e, 896)
489
 
490
    RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
491
END d2s;
492
 
493
 
7597 akron1 494
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
6613 leency 495
BEGIN
7597 akron1 496
    SYSTEM.GET(SYSTEM.ADR(x),     a);
497
    SYSTEM.GET(SYSTEM.ADR(x) + 4, b)
498
    RETURN a
499
END splitf;
6613 leency 500
 
7597 akron1 501
 
502
BEGIN
503
    eol[0] := 0DX; eol[1] := 0AX; eol[2] := 0X;
7983 leency 504
    maxreal := 1.9;
505
    PACK(maxreal, 1023);
7597 akron1 506
    Console := API.import;
507
    IF Console THEN
508
        con_init(-1, -1, -1, -1, SYSTEM.SADR("Oberon-07 for KolibriOS"))
509
    END;
510
    ParamParse
7983 leency 511
END HOST.