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.>=>=>=>=>> |