Subversion Repositories Kolibri OS

Rev

Rev 7983 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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