Subversion Repositories Kolibri OS

Rev

Rev 7597 | Go to most recent revision | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

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