Subversion Repositories Kolibri OS

Rev

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

Rev 7696 Rev 7983
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
3
 
3
 
4
    Copyright (c) 2019, Anton Krotov
4
    Copyright (c) 2019-2020, 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, API, RTL;
10
IMPORT SYSTEM, API, RTL;
11
 
11
 
12
 
12
 
13
CONST
13
CONST
14
 
14
 
15
    slash* = "/";
15
    slash* = "/";
16
    OS* = "LINUX";
16
    OS* = "LINUX";
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
 
22
 
23
VAR
23
VAR
24
 
24
 
25
    argc: INTEGER;
25
    argc: INTEGER;
26
 
26
 
27
    eol*: ARRAY 2 OF CHAR;
27
    eol*: ARRAY 2 OF CHAR;
-
 
28
 
-
 
29
    maxreal*: REAL;
28
 
30
 
29
 
31
 
30
PROCEDURE ExitProcess* (code: INTEGER);
32
PROCEDURE ExitProcess* (code: INTEGER);
31
BEGIN
33
BEGIN
32
    API.exit(code)
34
    API.exit(code)
33
END ExitProcess;
35
END ExitProcess;
34
 
36
 
35
 
37
 
36
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
38
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
37
VAR
39
VAR
38
    i, len, ptr: INTEGER;
40
    i, len, ptr: INTEGER;
39
    c: CHAR;
41
    c: CHAR;
40
 
42
 
41
BEGIN
43
BEGIN
42
    i := 0;
44
    i := 0;
43
    len := LEN(s) - 1;
45
    len := LEN(s) - 1;
44
    IF (n < argc) & (len > 0) THEN
46
    IF (n < argc) & (len > 0) THEN
45
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
47
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
46
        REPEAT
48
        REPEAT
47
            SYSTEM.GET(ptr, c);
49
            SYSTEM.GET(ptr, c);
48
            s[i] := c;
50
            s[i] := c;
49
            INC(i);
51
            INC(i);
50
            INC(ptr)
52
            INC(ptr)
51
        UNTIL (c = 0X) OR (i = len)
53
        UNTIL (c = 0X) OR (i = len)
52
    END;
54
    END;
53
    s[i] := 0X
55
    s[i] := 0X
54
END GetArg;
56
END GetArg;
55
 
57
 
56
 
58
 
57
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
59
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
58
VAR
60
VAR
59
    n: INTEGER;
61
    n: INTEGER;
60
 
62
 
61
BEGIN
63
BEGIN
62
    GetArg(0, path);
64
    GetArg(0, path);
63
    n := LENGTH(path) - 1;
65
    n := LENGTH(path) - 1;
64
    WHILE path[n] # slash DO
66
    WHILE path[n] # slash DO
65
        DEC(n)
67
        DEC(n)
66
    END;
68
    END;
67
    path[n + 1] := 0X
69
    path[n + 1] := 0X
68
END GetCurrentDirectory;
70
END GetCurrentDirectory;
69
 
71
 
70
 
72
 
71
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
73
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
72
VAR
74
VAR
73
    res: INTEGER;
75
    res: INTEGER;
74
 
76
 
75
BEGIN
77
BEGIN
76
    res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
78
    res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
77
    IF res <= 0 THEN
79
    IF res <= 0 THEN
78
        res := -1
80
        res := -1
79
    END
81
    END
80
 
82
 
81
    RETURN res
83
    RETURN res
82
END FileRead;
84
END FileRead;
83
 
85
 
84
 
86
 
85
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
87
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
86
VAR
88
VAR
87
    res: INTEGER;
89
    res: INTEGER;
88
 
90
 
89
BEGIN
91
BEGIN
90
    res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
92
    res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
91
    IF res <= 0 THEN
93
    IF res <= 0 THEN
92
        res := -1
94
        res := -1
93
    END
95
    END
94
 
96
 
95
    RETURN res
97
    RETURN res
96
END FileWrite;
98
END FileWrite;
97
 
99
 
98
 
100
 
99
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
101
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
100
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
102
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
101
END FileCreate;
103
END FileCreate;
102
 
104
 
103
 
105
 
104
PROCEDURE FileClose* (File: INTEGER);
106
PROCEDURE FileClose* (File: INTEGER);
105
BEGIN
107
BEGIN
106
    File := API.fclose(File)
108
    File := API.fclose(File)
107
END FileClose;
109
END FileClose;
108
 
110
 
109
 
111
 
110
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
112
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
111
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
113
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
112
END FileOpen;
114
END FileOpen;
113
 
115
 
114
 
116
 
115
PROCEDURE OutChar* (c: CHAR);
117
PROCEDURE OutChar* (c: CHAR);
116
BEGIN
118
BEGIN
117
    API.putc(c)
119
    API.putc(c)
118
END OutChar;
120
END OutChar;
119
 
121
 
120
 
122
 
121
PROCEDURE GetTickCount* (): INTEGER;
123
PROCEDURE GetTickCount* (): INTEGER;
122
VAR
124
VAR
123
    tp:  API.TP;
125
    tp:  API.TP;
124
    res: INTEGER;
126
    res: INTEGER;
125
 
127
 
126
BEGIN
128
BEGIN
127
    IF API.clock_gettime(0, tp) = 0 THEN
129
    IF API.clock_gettime(0, tp) = 0 THEN
128
        res := tp[0] * 100 + tp[1] DIV 10000000
130
        res := tp[0] * 100 + tp[1] DIV 10000000
129
    ELSE
131
    ELSE
130
        res := 0
132
        res := 0
131
    END
133
    END
132
 
134
 
133
    RETURN res
135
    RETURN res
134
END GetTickCount;
136
END GetTickCount;
135
 
137
 
136
 
138
 
137
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
139
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
138
    RETURN path[0] # slash
140
    RETURN path[0] # slash
139
END isRelative;
141
END isRelative;
140
 
142
 
141
 
143
 
142
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
144
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
143
END now;
145
END now;
144
 
146
 
145
 
147
 
146
PROCEDURE UnixTime* (): INTEGER;
148
PROCEDURE UnixTime* (): INTEGER;
147
    RETURN API.time(0)
149
    RETURN API.time(0)
148
END UnixTime;
150
END UnixTime;
149
 
151
 
-
 
152
 
-
 
153
PROCEDURE d2s* (x: REAL): INTEGER;
-
 
154
VAR
-
 
155
    h, l, s, e: INTEGER;
-
 
156
 
-
 
157
BEGIN
-
 
158
    SYSTEM.GET(SYSTEM.ADR(x), l);
-
 
159
    SYSTEM.GET(SYSTEM.ADR(x) + 4, h);
-
 
160
 
-
 
161
    s := ASR(h, 31) MOD 2;
-
 
162
    e := (h DIV 100000H) MOD 2048;
-
 
163
    IF e <= 896 THEN
-
 
164
        h := (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8 + 800000H;
-
 
165
        REPEAT
-
 
166
            h := h DIV 2;
-
 
167
            INC(e)
-
 
168
        UNTIL e = 897;
-
 
169
        e := 896;
-
 
170
        l := (h MOD 8) * 20000000H;
-
 
171
        h := h DIV 8
-
 
172
    ELSIF (1151 <= e) & (e < 2047) THEN
-
 
173
        e := 1151;
-
 
174
        h := 0;
-
 
175
        l := 0
-
 
176
    ELSIF e = 2047 THEN
-
 
177
        e := 1151;
-
 
178
        IF (h MOD 100000H # 0) OR (l # 0) THEN
-
 
179
            h := 80000H;
-
 
180
            l := 0
-
 
181
        END
-
 
182
    END;
-
 
183
    DEC(e, 896)
-
 
184
 
-
 
185
    RETURN LSL(s, 31) + LSL(e, 23) + (h MOD 100000H) * 8 + (l DIV 20000000H) MOD 8
-
 
186
END d2s;
-
 
187
 
150
 
188
 
151
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
189
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
152
VAR
190
VAR
153
    res: INTEGER;
191
    res: INTEGER;
154
 
192
 
155
BEGIN
193
BEGIN
156
    a := 0;
194
    a := 0;
157
    b := 0;
195
    b := 0;
158
    SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
196
    SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
159
    SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
197
    SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
160
    SYSTEM.GET(SYSTEM.ADR(x), res)
198
    SYSTEM.GET(SYSTEM.ADR(x), res)
161
    RETURN res
199
    RETURN res
162
END splitf;
200
END splitf;
163
 
201
 
164
 
202
 
165
BEGIN
203
BEGIN
166
    eol := 0AX;
204
    eol := 0AX;
-
 
205
    maxreal := 1.9;
-
 
206
    PACK(maxreal, 1023);
167
    SYSTEM.GET(API.MainParam, argc)
207
    SYSTEM.GET(API.MainParam, argc)
168
END HOST.
208
END HOST.