Subversion Repositories Kolibri OS

Rev

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