Subversion Repositories Kolibri OS

Rev

Rev 7107 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 7107 Rev 7597
Line 1... Line 1...
1
(*
1
(*
2
    Copyright 2016, 2017 Anton Krotov
2
    BSD 2-Clause License
Line 3... Line -...
3
 
-
 
4
    This program is free software: you can redistribute it and/or modify
-
 
5
    it under the terms of the GNU Lesser General Public License as published by
3
 
6
    the Free Software Foundation, either version 3 of the License, or
4
    Copyright (c) 2018, 2019, Anton Krotov
7
    (at your option) any later version.
-
 
8
 
-
 
9
    This program is distributed in the hope that it will be useful,
-
 
10
    but WITHOUT ANY WARRANTY; without even the implied warranty of
-
 
11
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-
 
12
    GNU Lesser General Public License for more details.
-
 
13
 
-
 
14
    You should have received a copy of the GNU Lesser General Public License
-
 
15
    along with this program.  If not, see .
5
    All rights reserved.
Line 16... Line 6...
16
*)
6
*)
Line 17... Line 7...
17
 
7
 
-
 
8
MODULE HOST;
Line 18... Line 9...
18
MODULE HOST;
9
 
Line -... Line 10...
-
 
10
IMPORT SYSTEM, RTL;
19
 
11
 
-
 
12
 
-
 
13
CONST
-
 
14
 
-
 
15
    slash* = "\";
-
 
16
    OS* = "WINDOWS";
20
IMPORT sys := SYSTEM, API;
17
 
Line 21... Line 18...
21
 
18
    bit_depth* = RTL.bit_depth;
Line -... Line 19...
-
 
19
    maxint* = RTL.maxint;
22
CONST
20
    minint* = RTL.minint;
Line -... Line 21...
-
 
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
 
23
 
33
        Internal:       INTEGER;
-
 
34
        InternalHigh:   INTEGER;
24
  OS* = "WIN";
35
        Offset:         INTEGER;
25
  Slash* = "\";
36
        OffsetHigh:     INTEGER;
26
 
37
        hEvent:         INTEGER
27
  OFS_MAXPATHNAME = 128;
38
 
28
 
39
    END;
29
TYPE
40
 
-
 
41
    OFSTRUCT = RECORD
30
 
42
 
Line -... Line 43...
-
 
43
        cBytes:         CHAR;
-
 
44
        fFixedDisk:     CHAR;
-
 
45
        nErrCode:       SYSTEM.CARD16;
-
 
46
        Reserved1:      SYSTEM.CARD16;
-
 
47
        Reserved2:      SYSTEM.CARD16;
-
 
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,
31
  OFSTRUCT = RECORD
67
        Day,
Line 32... Line 68...
32
    cBytes: CHAR;
68
        Hour,
-
 
69
        Min,
-
 
70
        Sec,
-
 
71
        MSec:  WCHAR
-
 
72
 
-
 
73
    END;
-
 
74
 
-
 
75
 
-
 
76
VAR
-
 
77
 
-
 
78
    hConsoleOutput: INTEGER;
-
 
79
 
-
 
80
    Params: ARRAY MAX_PARAM, 2 OF INTEGER;
-
 
81
    argc: INTEGER;
-
 
82
 
-
 
83
    eol*: ARRAY 3 OF CHAR;
-
 
84
 
-
 
85
 
-
 
86
PROCEDURE [windows-, "kernel32.dll", "GetTickCount"]
-
 
87
    _GetTickCount (): INTEGER;
-
 
88
 
-
 
89
PROCEDURE [windows-, "kernel32.dll", "GetStdHandle"]
-
 
90
    _GetStdHandle (nStdHandle: INTEGER): INTEGER;
-
 
91
 
-
 
92
PROCEDURE [windows-, "kernel32.dll", "GetCommandLineA"]
-
 
93
    _GetCommandLine (): INTEGER;
-
 
94
 
-
 
95
PROCEDURE [windows-, "kernel32.dll", "ReadFile"]
-
 
96
    _ReadFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
-
 
97
 
-
 
98
PROCEDURE [windows-, "kernel32.dll", "WriteFile"]
-
 
99
    _WriteFile (hFile, Buffer, nNumberOfBytesToRW: INTEGER; VAR NumberOfBytesRW: INTEGER; lpOverlapped: POverlapped): INTEGER;
-
 
100
 
-
 
101
PROCEDURE [windows-, "kernel32.dll", "CloseHandle"]
-
 
102
    _CloseHandle (hObject: INTEGER): INTEGER;
-
 
103
 
-
 
104
PROCEDURE [windows-, "kernel32.dll", "CreateFileA"]
-
 
105
    _CreateFile (
-
 
106
        lpFileName, dwDesiredAccess, dwShareMode: INTEGER;
-
 
107
        lpSecurityAttributes: PSecurityAttributes;
-
 
108
        dwCreationDisposition, dwFlagsAndAttributes,
-
 
109
        hTemplateFile: INTEGER): INTEGER;
-
 
110
 
-
 
111
PROCEDURE [windows-, "kernel32.dll", "OpenFile"]
-
 
112
    _OpenFile (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER;
-
 
113
 
-
 
114
PROCEDURE [windows-, "kernel32.dll", "GetCurrentDirectoryA"]
-
 
115
    _GetCurrentDirectory (nBufferLength, lpBuffer: INTEGER): INTEGER;
-
 
116
 
-
 
117
PROCEDURE [windows-, "kernel32.dll", "GetSystemTime"]
-
 
118
    _GetSystemTime (T: TSystemTime);
-
 
119
 
-
 
120
PROCEDURE [windows-, "kernel32.dll", "ExitProcess"]
-
 
121
    _ExitProcess (code: INTEGER);
-
 
122
 
-
 
123
 
-
 
124
PROCEDURE ExitProcess* (code: INTEGER);
-
 
125
BEGIN
-
 
126
    _ExitProcess(code)
-
 
127
END ExitProcess;
-
 
128
 
-
 
129
 
-
 
130
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
-
 
131
VAR
-
 
132
    n: INTEGER;
-
 
133
 
-
 
134
BEGIN
-
 
135
    n := _GetCurrentDirectory(LEN(path), SYSTEM.ADR(path[0]));
-
 
136
    path[n] := slash;
-
 
137
    path[n + 1] := 0X
-
 
138
END GetCurrentDirectory;
-
 
139
 
-
 
140
 
-
 
141
PROCEDURE GetChar (adr: INTEGER): CHAR;
-
 
142
VAR
-
 
143
    res: CHAR;
-
 
144
 
Line 33... Line -...
33
    fFixedDisk: CHAR;
-
 
34
    nErrCode: sys.CARD16;
-
 
35
    Reserved1: sys.CARD16;
-
 
36
    Reserved2: sys.CARD16;
-
 
37
    szPathName: ARRAY OFS_MAXPATHNAME OF CHAR
-
 
38
  END;
-
 
39
 
-
 
40
VAR
-
 
41
 
-
 
42
  sec*, dsec*, hConsoleOutput: INTEGER;
-
 
Line 43... Line 145...
43
 
145
BEGIN
44
  GetStdHandle: PROCEDURE [winapi] (nStdHandle: INTEGER): INTEGER;
-
 
45
  CloseFile*: PROCEDURE [winapi] (hObject: INTEGER): INTEGER;
146
    SYSTEM.GET(adr, res)
-
 
147
    RETURN res
-
 
148
END GetChar;
46
  _CreateFile*: PROCEDURE [winapi] (lpFileName, dwDesiredAccess, dwShareMode, lpSecurityAttributes,
149
 
-
 
150
 
47
    dwCreationDisposition, dwFlagsAndAttributes, hTemplateFile: INTEGER): INTEGER;
151
PROCEDURE ParamParse;
-
 
152
VAR
48
  _OpenFile*: PROCEDURE [winapi] (lpFileName: INTEGER; lpReOpenBuff: OFSTRUCT; uStyle: INTEGER): INTEGER;
153
    p, count, cond: INTEGER;
49
  ReadFile, WriteFile: PROCEDURE [winapi] (hFile, Buffer, nNumberOfBytesToRead, lpNumberOfBytesRead, lpOverlapped: INTEGER): INTEGER;
154
    c: CHAR;
50
  GetCommandLine*: PROCEDURE [winapi] (): INTEGER;
155
 
51
  GetTickCount: PROCEDURE [winapi] (): INTEGER;
156
 
52
  ExitProcess*: PROCEDURE [winapi] (code: INTEGER);
157
    PROCEDURE ChangeCond (A, B, C: INTEGER; VAR cond: INTEGER; c: CHAR);
Line 53... Line -...
53
  SetFilePointer: PROCEDURE [winapi] (hFile, lDistanceToMove, lpDistanceToMoveHigh, dwMoveMethod: INTEGER): INTEGER;
-
 
54
 
-
 
55
PROCEDURE FileRW*(hFile, Buffer, nNumberOfBytes: INTEGER; write: BOOLEAN): INTEGER;
158
    BEGIN
-
 
159
        IF (c <= 20X) & (c # 0X) THEN
-
 
160
            cond := A
-
 
161
        ELSIF c = 22X THEN
-
 
162
            cond := B
-
 
163
        ELSIF c = 0X THEN
-
 
164
            cond := 6
56
VAR res: INTEGER;
165
        ELSE
-
 
166
            cond := C
-
 
167
        END
-
 
168
    END ChangeCond;
-
 
169
 
-
 
170
 
-
 
171
BEGIN
-
 
172
    p := _GetCommandLine();
-
 
173
    cond := 0;
-
 
174
    count := 0;
57
BEGIN
175
    WHILE (count < MAX_PARAM) & (cond # 6) DO
-
 
176
        c := GetChar(p);
-
 
177
        CASE cond OF
-
 
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
-
 
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
Line 58... Line -...
58
  IF write THEN
-
 
59
    WriteFile(hFile, Buffer, nNumberOfBytes, sys.ADR(res), 0)
-
 
60
  ELSE
182
        |5: ChangeCond(5, 1, 5, cond, c); IF cond = 6 THEN Params[count, 1] := p - 1; INC(count) END
-
 
183
        |6:
-
 
184
        END;
-
 
185
        INC(p)
-
 
186
    END;
61
    ReadFile(hFile, Buffer, nNumberOfBytes, sys.ADR(res), 0)
187
    argc := count
-
 
188
END ParamParse;
-
 
189
 
-
 
190
 
62
  END
191
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
63
  RETURN res
192
VAR
-
 
193
    i, j, len: INTEGER;
64
END FileRW;
194
    c: CHAR;
-
 
195
 
-
 
196
BEGIN
-
 
197
    j := 0;
-
 
198
    IF n < argc THEN
-
 
199
        len := LEN(s) - 1;
-
 
200
        i := Params[n, 0];
-
 
201
        WHILE (j < len) & (i <= Params[n, 1]) DO
-
 
202
            c := GetChar(i);
-
 
203
            IF c # 22X THEN
-
 
204
                s[j] := c;
-
 
205
                INC(j)
-
 
206
            END;
-
 
207
            INC(i)
-
 
208
        END
-
 
209
    END;
-
 
210
    s[j] := 0X
65
 
211
END GetArg;
66
PROCEDURE OutString* (str: ARRAY OF CHAR);
212
 
-
 
213
 
-
 
214
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
-
 
215
VAR
-
 
216
    res, n: INTEGER;
-
 
217
 
Line 67... Line -...
67
VAR res: INTEGER;
-
 
68
BEGIN
-
 
69
  res := FileRW(hConsoleOutput, sys.ADR(str[0]), LENGTH(str), TRUE)
218
BEGIN
70
END OutString;
219
    IF _ReadFile(F, SYSTEM.ADR(Buffer[0]), bytes, n, NIL) = 0 THEN
71
 
220
        res := -1
-
 
221
    ELSE
72
PROCEDURE CreateFile* (FName: ARRAY OF CHAR): INTEGER;
222
        res := n
73
VAR res: INTEGER;
223
    END
-
 
224
 
74
BEGIN
225
    RETURN res
75
  res := _CreateFile(sys.ADR(FName[0]), 0C0000000H, 0, 0, 2, 80H, 0);
226
END FileRead;
-
 
227
 
-
 
228
 
-
 
229
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
-
 
230
VAR
-
 
231
    res, n: INTEGER;
Line -... Line 232...
-
 
232
 
76
  IF res = -1 THEN
233
BEGIN
77
    res := 0
-
 
78
  END
234
    IF _WriteFile(F, SYSTEM.ADR(Buffer[0]), bytes, n, NIL) = 0 THEN
-
 
235
        res := -1
-
 
236
    ELSE
-
 
237
        res := n
-
 
238
    END
-
 
239
 
-
 
240
    RETURN res
-
 
241
END FileWrite;
-
 
242
 
-
 
243
 
-
 
244
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
79
  RETURN res
245
    RETURN _CreateFile(SYSTEM.ADR(FName[0]), 0C0000000H, 0, NIL, 2, 80H, 0)
80
END CreateFile;
246
END FileCreate;
-
 
247
 
-
 
248
 
-
 
249
PROCEDURE FileClose* (F: INTEGER);
81
 
250
BEGIN
82
PROCEDURE OpenFile* (FName: ARRAY OF CHAR): INTEGER;
251
    _CloseHandle(F)
-
 
252
END FileClose;
-
 
253
 
-
 
254
 
-
 
255
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
-
 
256
VAR
-
 
257
    ofstr: OFSTRUCT;
-
 
258
    res:   INTEGER;
-
 
259
 
-
 
260
BEGIN
-
 
261
    res := _OpenFile(SYSTEM.ADR(FName[0]), ofstr, 0);
-
 
262
    IF res = 0FFFFFFFFH THEN
-
 
263
        res := -1
-
 
264
    END
-
 
265
 
-
 
266
    RETURN res
-
 
267
END FileOpen;
-
 
268
 
-
 
269
 
-
 
270
PROCEDURE OutChar* (c: CHAR);
-
 
271
VAR
-
 
272
    count: INTEGER;
-
 
273
BEGIN
-
 
274
    _WriteFile(hConsoleOutput, SYSTEM.ADR(c), 1, count, NIL)
-
 
275
END OutChar;
-
 
276
 
-
 
277
 
-
 
278
PROCEDURE GetTickCount* (): INTEGER;
-
 
279
    RETURN _GetTickCount() DIV 10
Line 83... Line -...
83
VAR res: INTEGER; ofstr: OFSTRUCT;
-
 
84
BEGIN
280
END GetTickCount;
-
 
281
 
85
  res := _OpenFile(sys.ADR(FName[0]), ofstr, 0);
282
 
-
 
283
PROCEDURE letter (c: CHAR): BOOLEAN;
-
 
284
    RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z")
-
 
285
END letter;
-
 
286
 
-
 
287
 
86
  IF res = -1 THEN
288
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
Line 87... Line -...
87
    res := 0
-
 
88
  END
-
 
89
  RETURN res
-
 
90
END OpenFile;
-
 
91
 
-
 
92
PROCEDURE FileSize*(F: INTEGER): INTEGER;
-
 
93
VAR res: INTEGER;
-
 
94
BEGIN
-
 
95
  res := SetFilePointer(F, 0, 0, 2);
-
 
96
  SetFilePointer(F, 0, 0, 0)
-
 
97
  RETURN res
-
 
98
END FileSize;
-
 
99
 
-
 
100
PROCEDURE GetProc(name: ARRAY OF CHAR; hMOD, adr: INTEGER);
-
 
101
BEGIN
-
 
102
  sys.PUT(adr, API.GetProcAddress(hMOD, sys.ADR(name[0])))
-
 
103
END GetProc;
-
 
104
 
-
 
105
PROCEDURE Time*(VAR sec, dsec: INTEGER);
-
 
106
VAR t: INTEGER;
-
 
107
BEGIN
-
 
108
  t := GetTickCount() DIV 10;
-
 
109
  sec := t DIV 100;
-
 
110
  dsec := t MOD 100
-
 
111
END Time;
-
 
112
 
-
 
113
PROCEDURE malloc*(size: INTEGER): INTEGER;
-
 
114
  RETURN API.Alloc(64, size)
-
 
115
END malloc;
-
 
Line 116... Line 289...
116
 
289
    RETURN ~(letter(path[0]) & (path[1] = ":"))
117
PROCEDURE init*;
290
END isRelative;
118
VAR lib: INTEGER;
291
 
-
 
292
 
Line -... Line 293...
-
 
293
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
-
 
294
VAR
-
 
295
    T: TSystemTime;
-
 
296
 
-
 
297
BEGIN
-
 
298
    _GetSystemTime(T);
-
 
299
    year  := ORD(T.Year);
-
 
300
    month := ORD(T.Month);
-
 
301
    day   := ORD(T.Day);
-
 
302
    hour  := ORD(T.Hour);
-
 
303
    min   := ORD(T.Min);
-
 
304
    sec   := ORD(T.Sec)
-
 
305
END now;
-
 
306
 
-
 
307
 
-
 
308
PROCEDURE UnixTime* (): INTEGER;
-
 
309
    RETURN 0
-
 
310
END UnixTime;
119
BEGIN
311
 
120
  lib := API.LoadLibraryA(sys.ADR("kernel32.dll"));
312