Subversion Repositories Kolibri OS

Rev

Rev 7983 | 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) 2019-2020, Anton Krotov
7597 akron1 5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE HOST;
9
 
7597 akron1 10
IMPORT SYSTEM, API, RTL;
6613 leency 11
 
7597 akron1 12
 
6613 leency 13
CONST
14
 
7597 akron1 15
    slash* = "/";
8097 maxcodehac 16
    eol* = 0AX;
6613 leency 17
 
7597 akron1 18
    bit_depth* = RTL.bit_depth;
19
    maxint* = RTL.maxint;
20
    minint* = RTL.minint;
21
 
8097 maxcodehac 22
    RTLD_LAZY = 1;
7597 akron1 23
 
8097 maxcodehac 24
 
25
TYPE
26
 
27
    TP = ARRAY 2 OF INTEGER;
28
 
29
 
6613 leency 30
VAR
31
 
8097 maxcodehac 32
    maxreal*: REAL;
33
 
7597 akron1 34
    argc: INTEGER;
6613 leency 35
 
8097 maxcodehac 36
    libc, librt: INTEGER;
6613 leency 37
 
8097 maxcodehac 38
    stdout: INTEGER;
6613 leency 39
 
8097 maxcodehac 40
    fread, fwrite : PROCEDURE [linux] (buffer, bytes, blocks, file: INTEGER): INTEGER;
41
    fopen         : PROCEDURE [linux] (fname, fmode: INTEGER): INTEGER;
42
    fclose        : PROCEDURE [linux] (file: INTEGER): INTEGER;
43
    _chmod        : PROCEDURE [linux] (fname: INTEGER; mode: SET): INTEGER;
44
    time          : PROCEDURE [linux] (ptr: INTEGER): INTEGER;
45
    clock_gettime : PROCEDURE [linux] (clock_id: INTEGER; VAR tp: TP): INTEGER;
46
    exit          : PROCEDURE [linux] (code: INTEGER);
7983 leency 47
 
8097 maxcodehac 48
 
7597 akron1 49
PROCEDURE ExitProcess* (code: INTEGER);
6613 leency 50
BEGIN
8097 maxcodehac 51
    exit(code)
7597 akron1 52
END ExitProcess;
6613 leency 53
 
7597 akron1 54
 
55
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
56
VAR
57
    i, len, ptr: INTEGER;
58
    c: CHAR;
59
 
6613 leency 60
BEGIN
7597 akron1 61
    i := 0;
62
    len := LEN(s) - 1;
63
    IF (n < argc) & (len > 0) THEN
64
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
65
        REPEAT
66
            SYSTEM.GET(ptr, c);
67
            s[i] := c;
68
            INC(i);
69
            INC(ptr)
70
        UNTIL (c = 0X) OR (i = len)
71
    END;
72
    s[i] := 0X
73
END GetArg;
6613 leency 74
 
7597 akron1 75
 
76
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
77
VAR
78
    n: INTEGER;
79
 
6613 leency 80
BEGIN
7597 akron1 81
    GetArg(0, path);
82
    n := LENGTH(path) - 1;
83
    WHILE path[n] # slash DO
84
        DEC(n)
85
    END;
86
    path[n + 1] := 0X
87
END GetCurrentDirectory;
6613 leency 88
 
89
 
7696 akron1 90
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
7597 akron1 91
VAR
92
    res: INTEGER;
93
 
6613 leency 94
BEGIN
8097 maxcodehac 95
    res := fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
7597 akron1 96
    IF res <= 0 THEN
97
        res := -1
98
    END
6613 leency 99
 
7597 akron1 100
    RETURN res
101
END FileRead;
6613 leency 102
 
103
 
7597 akron1 104
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
105
VAR
106
    res: INTEGER;
107
 
6613 leency 108
BEGIN
8097 maxcodehac 109
    res := fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
7597 akron1 110
    IF res <= 0 THEN
111
        res := -1
112
    END
6613 leency 113
 
7597 akron1 114
    RETURN res
115
END FileWrite;
116
 
117
 
118
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
8097 maxcodehac 119
    RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
7597 akron1 120
END FileCreate;
121
 
122
 
123
PROCEDURE FileClose* (File: INTEGER);
6613 leency 124
BEGIN
8097 maxcodehac 125
    File := fclose(File)
7597 akron1 126
END FileClose;
6613 leency 127
 
7597 akron1 128
 
8097 maxcodehac 129
PROCEDURE chmod* (FName: ARRAY OF CHAR);
130
VAR
131
    res: INTEGER;
132
BEGIN
133
    res := _chmod(SYSTEM.ADR(FName[0]), {0, 2..8}) (* rwxrwxr-x *)
134
END chmod;
135
 
136
 
7597 akron1 137
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
8097 maxcodehac 138
    RETURN fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
7597 akron1 139
END FileOpen;
140
 
141
 
142
PROCEDURE OutChar* (c: CHAR);
8097 maxcodehac 143
VAR
144
    res: INTEGER;
145
 
6613 leency 146
BEGIN
8097 maxcodehac 147
    res := fwrite(SYSTEM.ADR(c), 1, 1, stdout)
7597 akron1 148
END OutChar;
6613 leency 149
 
7597 akron1 150
 
151
PROCEDURE GetTickCount* (): INTEGER;
152
VAR
8097 maxcodehac 153
    tp:  TP;
7597 akron1 154
    res: INTEGER;
155
 
6613 leency 156
BEGIN
8097 maxcodehac 157
    IF clock_gettime(0, tp) = 0 THEN
7597 akron1 158
        res := tp[0] * 100 + tp[1] DIV 10000000
159
    ELSE
160
        res := 0
161
    END
6613 leency 162
 
7597 akron1 163
    RETURN res
164
END GetTickCount;
6613 leency 165
 
7597 akron1 166
 
167
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
168
    RETURN path[0] # slash
169
END isRelative;
170
 
171
 
172
PROCEDURE UnixTime* (): INTEGER;
8097 maxcodehac 173
    RETURN time(0)
7597 akron1 174
END UnixTime;
175
 
176
 
8097 maxcodehac 177
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
178
BEGIN
179
    SYSTEM.GET32(SYSTEM.ADR(x), a);
180
    SYSTEM.GET32(SYSTEM.ADR(x) + 4, b)
181
    RETURN a
182
END splitf;
183
 
184
 
7983 leency 185
PROCEDURE d2s* (x: REAL): INTEGER;
186
VAR
187
    h, l, s, e: INTEGER;
188
 
189
BEGIN
8097 maxcodehac 190
    e := splitf(x, l, h);
7983 leency 191
 
192
    s := ASR(h, 31) MOD 2;
193
    e := (h DIV 100000H) MOD 2048;
194
    IF e <= 896 THEN
195
        h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
196
        REPEAT
197
            h := h DIV 2;
198
            INC(e)
199
        UNTIL e = 897;
200
        e := 896;
201
        l := (h MOD 8) * 20000000H;
202
        h := h DIV 8
203
    ELSIF (1151 <= e) & (e < 2047) THEN
204
        e := 1151;
205
        h := 0;
206
        l := 0
207
    ELSIF e = 2047 THEN
208
        e := 1151;
8097 maxcodehac 209
        IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN
7983 leency 210
            h := 80000H;
211
            l := 0
212
        END
213
    END;
214
    DEC(e, 896)
215
 
216
    RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
217
END d2s;
218
 
219
 
8097 maxcodehac 220
PROCEDURE GetSym (lib: INTEGER; name: ARRAY OF CHAR; VarAdr: INTEGER);
7597 akron1 221
VAR
8097 maxcodehac 222
    sym: INTEGER;
7597 akron1 223
 
224
BEGIN
8097 maxcodehac 225
    sym := API.dlsym(lib, SYSTEM.ADR(name[0]));
226
    ASSERT(sym # 0);
227
    SYSTEM.PUT(VarAdr, sym)
228
END GetSym;
7597 akron1 229
 
230
 
231
BEGIN
7983 leency 232
    maxreal := 1.9;
233
    PACK(maxreal, 1023);
8097 maxcodehac 234
    SYSTEM.GET(API.MainParam, argc);
235
 
236
    libc := API.libc;
237
    GetSym(libc, "fread",  SYSTEM.ADR(fread));
238
    GetSym(libc, "fwrite", SYSTEM.ADR(fwrite));
239
    GetSym(libc, "fopen",  SYSTEM.ADR(fopen));
240
    GetSym(libc, "fclose", SYSTEM.ADR(fclose));
241
    GetSym(libc, "chmod",  SYSTEM.ADR(_chmod));
242
    GetSym(libc, "time",   SYSTEM.ADR(time));
243
    GetSym(libc, "exit",   SYSTEM.ADR(exit));
244
    GetSym(libc, "stdout", SYSTEM.ADR(stdout)); SYSTEM.GET(stdout - SYSTEM.SIZE(INTEGER), stdout);
245
 
246
    librt := API.dlopen(SYSTEM.SADR("librt.so.1"), RTLD_LAZY);
247
    GetSym(librt, "clock_gettime", SYSTEM.ADR(clock_gettime))
7983 leency 248
END HOST.