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