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) 2018-2020, Anton Krotov |
||
5 | All rights reserved. |
||
6 | *) |
||
7 | |||
8 | MODULE HOST; |
||
9 | |||
10 | IMPORT SYSTEM, RTL; |
||
11 | |||
12 | |||
13 | CONST |
||
14 | |||
15 | slash* = "\"; |
||
8097 | maxcodehac | 16 | eol* = 0DX + 0AX; |
7983 | leency | 17 | |
18 | bit_depth* = RTL.bit_depth; |
||
19 | maxint* = RTL.maxint; |
||
20 | minint* = RTL.minint; |
||
21 | |||
22 | MAX_PARAM = 1024; |
||
23 | |||
24 | OFS_MAXPATHNAME = 128; |
||
25 | |||
26 | |||
27 | TYPE |
||
28 | |||
29 | POverlapped = POINTER TO OVERLAPPED; |
||
30 | |||
31 | OVERLAPPED = RECORD |
||
32 | |||
33 | Internal: INTEGER; |
||
34 | InternalHigh: INTEGER; |
||
35 | Offset: INTEGER; |
||
36 | OffsetHigh: INTEGER; |
||
37 | hEvent: INTEGER |
||
38 | |||
39 | END; |
||
40 | |||
41 | OFSTRUCT = RECORD |
||
42 | |||
43 | cBytes: CHAR; |
||
44 | fFixedDisk: CHAR; |
||
45 | nErrCode: WCHAR; |
||
46 | Reserved1: WCHAR; |
||
47 | Reserved2: WCHAR; |
||
48 | szPathName: ARRAY OFS_MAXPATHNAME OF CHAR |
||
49 | |||
50 | END; |
||
51 | |||
52 | PSecurityAttributes = POINTER TO TSecurityAttributes; |
||
53 | |||
54 | TSecurityAttributes = RECORD |
||
55 | |||
56 | nLength: INTEGER; |
||
57 | lpSecurityDescriptor: INTEGER; |
||
58 | bInheritHandle: INTEGER |
||
59 | |||
60 | END; |
||
61 | |||
62 | |||
63 | VAR |
||
64 | |||
65 | hConsoleOutput: INTEGER; |
||
66 | |||
67 | Params: ARRAY MAX_PARAM, 2 OF INTEGER; |
||
68 | argc: INTEGER; |
||
69 | |||
70 | maxreal*: REAL; |
||
71 | |||
72 | |||
73 | PROCEDURE [windows-, "kernel32.dll", "GetTickCount"] |
||
74 | _GetTickCount (): INTEGER; |
||
75 | |||
76 | PROCEDURE [windows-, "kernel32.dll", "GetStdHandle"] |
||
77 | _GetStdHandle (nStdHandle: INTEGER): INTEGER; |
||
78 | |||
79 | PROCEDURE [windows-, "kernel32.dll", "GetCommandLineA"] |
||
80 | _GetCommandLine (): INTEGER; |
||
81 | |||
82 | PROCEDURE [windows-, "kernel32.dll", "ReadFile"] |
||
83 | _ReadFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER; |
||
84 | |||
85 | PROCEDURE [windows-, "kernel32.dll", "WriteFile"] |
||
86 | _WriteFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER; |
||
87 | |||
88 | PROCEDURE [windows-, "kernel32.dll", "CloseHandle"] |
||
89 | _CloseHandle (hObject: INTEGER): INTEGER; |
||
90 | |||
91 | PROCEDURE [windows-, "kernel32.dll", "CreateFileA"] |
||
92 | _CreateFile ( |
||
93 | lpFileName, dwDesiredAccess, dwShareMode: INTEGER; |
||
94 | lpSecurityAttributes: PSecurityAttributes; |
||
95 | dwCreationDisposition, dwFlagsAndAttributes, |
||
96 | hTemplateFile: INTEGER): INTEGER; |
||
97 | |||
98 | PROCEDURE [windows-, "kernel32.dll", "OpenFile"] |
||
99 | _OpenFile (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER; |
||
100 | |||
101 | PROCEDURE [windows-, "kernel32.dll", "GetCurrentDirectoryA"] |
||
102 | _GetCurrentDirectory (nBufferLength, lpBuffer: INTEGER): INTEGER; |
||
103 | |||
8097 | maxcodehac | 104 | PROCEDURE [windows, "kernel32.dll", "ExitProcess"] |
7983 | leency | 105 | _ExitProcess (code: INTEGER); |
106 | |||
8097 | maxcodehac | 107 | PROCEDURE [windows, "msvcrt.dll", "time"] |
108 | _time (ptr: INTEGER): INTEGER; |
||
7983 | leency | 109 | |
8097 | maxcodehac | 110 | |
7983 | leency | 111 | PROCEDURE ExitProcess* (code: INTEGER); |
112 | BEGIN |
||
113 | _ExitProcess(code) |
||
114 | END ExitProcess; |
||
115 | |||
116 | |||
117 | PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR); |
||
118 | VAR |
||
119 | n: INTEGER; |
||
120 | |||
121 | BEGIN |
||
122 | n := _GetCurrentDirectory(LEN(path), SYSTEM.ADR(path[0])); |
||
123 | path[n] := slash; |
||
124 | path[n + 1] := 0X |
||
125 | END GetCurrentDirectory; |
||
126 | |||
127 | |||
128 | PROCEDURE GetChar (adr: INTEGER): CHAR; |
||
129 | VAR |
||
130 | res: CHAR; |
||
131 | |||
132 | BEGIN |
||
133 | SYSTEM.GET(adr, res) |
||
134 | RETURN res |
||
135 | END GetChar; |
||
136 | |||
137 | |||
138 | PROCEDURE ParamParse; |
||
139 | VAR |
||
140 | p, count, cond: INTEGER; |
||
141 | c: CHAR; |
||
142 | |||
143 | |||
144 | PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR); |
||
145 | BEGIN |
||
146 | IF (c <= 20X) & (c # 0X) THEN |
||
147 | cond := A |
||
148 | ELSIF c = 22X THEN |
||
149 | cond := B |
||
150 | ELSIF c = 0X THEN |
||
151 | cond := 6 |
||
152 | ELSE |
||
153 | cond := C |
||
154 | END |
||
155 | END ChangeCond; |
||
156 | |||
157 | |||
158 | BEGIN |
||
159 | p := _GetCommandLine(); |
||
160 | cond := 0; |
||
161 | count := 0; |
||
162 | WHILE (count < MAX_PARAM) & (cond # 6) DO |
||
163 | c := GetChar(p); |
||
164 | CASE cond OF |
||
165 | |0: ChangeCond(0, 4, 1, cond, c); IF cond = 1 THEN Params[count, 0] := p END |
||
166 | |1: ChangeCond(0, 3, 1, cond, c); IF cond IN {0, 6} THEN Params[count, 1] := p - 1; INC(count) END |
||
167 | |3: ChangeCond(3, 1, 3, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END |
||
168 | |4: ChangeCond(5, 0, 5, cond, c); IF cond = 5 THEN Params[count, 0] := p END |
||
169 | |5: ChangeCond(5, 1, 5, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END |
||
170 | |6: |
||
171 | END; |
||
172 | INC(p) |
||
173 | END; |
||
174 | argc := count |
||
175 | END ParamParse; |
||
176 | |||
177 | |||
178 | PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR); |
||
179 | VAR |
||
180 | i, j, len: INTEGER; |
||
181 | c: CHAR; |
||
182 | |||
183 | BEGIN |
||
184 | j := 0; |
||
185 | IF n < argc THEN |
||
186 | len := LEN(s) - 1; |
||
187 | i := Params[n, 0]; |
||
188 | WHILE (j < len) & (i <= Params[n, 1]) DO |
||
189 | c := GetChar(i); |
||
190 | IF c # 22X THEN |
||
191 | s[j] := c; |
||
192 | INC(j) |
||
193 | END; |
||
194 | INC(i) |
||
195 | END |
||
196 | END; |
||
197 | s[j] := 0X |
||
198 | END GetArg; |
||
199 | |||
200 | |||
201 | PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER; |
||
202 | VAR |
||
8097 | maxcodehac | 203 | res: INTEGER; |
7983 | leency | 204 | |
205 | BEGIN |
||
8097 | maxcodehac | 206 | IF _ReadFile(F, SYSTEM.ADR(Buffer[0]), bytes, res, NIL) = 0 THEN |
7983 | leency | 207 | res := -1 |
208 | END |
||
209 | |||
210 | RETURN res |
||
211 | END FileRead; |
||
212 | |||
213 | |||
214 | PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER; |
||
215 | VAR |
||
8097 | maxcodehac | 216 | res: INTEGER; |
7983 | leency | 217 | |
218 | BEGIN |
||
8097 | maxcodehac | 219 | IF _WriteFile(F, SYSTEM.ADR(Buffer[0]), bytes, res, NIL) = 0 THEN |
7983 | leency | 220 | res := -1 |
221 | END |
||
222 | |||
223 | RETURN res |
||
224 | END FileWrite; |
||
225 | |||
226 | |||
227 | PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER; |
||
228 | RETURN _CreateFile(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0) |
||
229 | END FileCreate; |
||
230 | |||
231 | |||
232 | PROCEDURE FileClose* (F: INTEGER); |
||
233 | BEGIN |
||
234 | _CloseHandle(F) |
||
235 | END FileClose; |
||
236 | |||
237 | |||
238 | PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER; |
||
239 | VAR |
||
240 | ofstr: OFSTRUCT; |
||
241 | res: INTEGER; |
||
242 | |||
243 | BEGIN |
||
244 | res := _OpenFile(SYSTEM.ADR(FName[0]), ofstr, 0); |
||
245 | IF res = 0FFFFFFFFH THEN |
||
246 | res := -1 |
||
247 | END |
||
248 | |||
249 | RETURN res |
||
250 | END FileOpen; |
||
251 | |||
252 | |||
8097 | maxcodehac | 253 | PROCEDURE chmod* (FName: ARRAY OF CHAR); |
254 | END chmod; |
||
255 | |||
256 | |||
7983 | leency | 257 | PROCEDURE OutChar* (c: CHAR); |
258 | VAR |
||
259 | count: INTEGER; |
||
260 | BEGIN |
||
261 | _WriteFile(hConsoleOutput, SYSTEM.ADR(c), 1, count, NIL) |
||
262 | END OutChar; |
||
263 | |||
264 | |||
265 | PROCEDURE GetTickCount* (): INTEGER; |
||
266 | RETURN _GetTickCount() DIV 10 |
||
267 | END GetTickCount; |
||
268 | |||
269 | |||
270 | PROCEDURE letter (c: CHAR): BOOLEAN; |
||
271 | RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z") |
||
272 | END letter; |
||
273 | |||
274 | |||
275 | PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN; |
||
276 | RETURN ~(letter(path[0]) & (path[1] = ":")) |
||
277 | END isRelative; |
||
278 | |||
279 | |||
8097 | maxcodehac | 280 | PROCEDURE UnixTime* (): INTEGER; |
281 | RETURN _time(0) |
||
282 | END UnixTime; |
||
283 | |||
284 | |||
285 | PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER; |
||
7983 | leency | 286 | VAR |
8097 | maxcodehac | 287 | res: INTEGER; |
7983 | leency | 288 | |
289 | BEGIN |
||
8097 | maxcodehac | 290 | a := 0; |
291 | b := 0; |
||
292 | SYSTEM.GET32(SYSTEM.ADR(x), a); |
||
293 | SYSTEM.GET32(SYSTEM.ADR(x) + 4, b); |
||
294 | SYSTEM.GET(SYSTEM.ADR(x), res) |
||
295 | RETURN res |
||
296 | END splitf; |
||
7983 | leency | 297 | |
298 | |||
299 | PROCEDURE d2s* (x: REAL): INTEGER; |
||
300 | VAR |
||
301 | h, l, s, e: INTEGER; |
||
302 | |||
303 | BEGIN |
||
8097 | maxcodehac | 304 | e := splitf(x, l, h); |
7983 | leency | 305 | |
306 | s := ASR(h, 31) MOD 2; |
||
307 | e := (h DIV 100000H) MOD 2048; |
||
308 | IF e <= 896 THEN |
||
309 | h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H; |
||
310 | REPEAT |
||
311 | h := h DIV 2; |
||
312 | INC(e) |
||
313 | UNTIL e = 897; |
||
314 | e := 896; |
||
315 | l := (h MOD 8) * 20000000H; |
||
316 | h := h DIV 8 |
||
317 | ELSIF (1151 <= e) & (e < 2047) THEN |
||
318 | e := 1151; |
||
319 | h := 0; |
||
320 | l := 0 |
||
321 | ELSIF e = 2047 THEN |
||
322 | e := 1151; |
||
323 | IF (h MOD 100000H # 0) OR (BITS(l) * {0..31} # {}) THEN |
||
324 | h := 80000H; |
||
325 | l := 0 |
||
326 | END |
||
327 | END; |
||
328 | DEC(e, 896) |
||
329 | |||
330 | RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 |
||
331 | END d2s; |
||
332 | |||
333 | |||
334 | BEGIN |
||
335 | maxreal := 1.9; |
||
336 | PACK(maxreal, 1023); |
||
337 | hConsoleOutput := _GetStdHandle(-11); |
||
338 | ParamParse |
||
339 | END HOST.>=>=>=>=>=>=>=>>>>=> |