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
(*
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.