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) 2019-2020, Anton Krotov
7597 akron1 5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE HOST;
9
 
7597 akron1 10
IMPORT SYSTEM, API, RTL;
6613 leency 11
 
7597 akron1 12
 
6613 leency 13
CONST
14
 
7597 akron1 15
    slash* = "/";
16
    OS* = "LINUX";
6613 leency 17
 
7597 akron1 18
    bit_depth* = RTL.bit_depth;
19
    maxint* = RTL.maxint;
20
    minint* = RTL.minint;
21
 
22
 
6613 leency 23
VAR
24
 
7597 akron1 25
    argc: INTEGER;
6613 leency 26
 
7597 akron1 27
    eol*: ARRAY 2 OF CHAR;
6613 leency 28
 
7983 leency 29
    maxreal*: REAL;
6613 leency 30
 
7983 leency 31
 
7597 akron1 32
PROCEDURE ExitProcess* (code: INTEGER);
6613 leency 33
BEGIN
7597 akron1 34
    API.exit(code)
35
END ExitProcess;
6613 leency 36
 
7597 akron1 37
 
38
PROCEDURE GetArg* (n: INTEGER; VAR s: ARRAY OF CHAR);
39
VAR
40
    i, len, ptr: INTEGER;
41
    c: CHAR;
42
 
6613 leency 43
BEGIN
7597 akron1 44
    i := 0;
45
    len := LEN(s) - 1;
46
    IF (n < argc) & (len > 0) THEN
47
        SYSTEM.GET(API.MainParam + (n + 1) * SYSTEM.SIZE(INTEGER), ptr);
48
        REPEAT
49
            SYSTEM.GET(ptr, c);
50
            s[i] := c;
51
            INC(i);
52
            INC(ptr)
53
        UNTIL (c = 0X) OR (i = len)
54
    END;
55
    s[i] := 0X
56
END GetArg;
6613 leency 57
 
7597 akron1 58
 
59
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
60
VAR
61
    n: INTEGER;
62
 
6613 leency 63
BEGIN
7597 akron1 64
    GetArg(0, path);
65
    n := LENGTH(path) - 1;
66
    WHILE path[n] # slash DO
67
        DEC(n)
68
    END;
69
    path[n + 1] := 0X
70
END GetCurrentDirectory;
6613 leency 71
 
72
 
7696 akron1 73
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
7597 akron1 74
VAR
75
    res: INTEGER;
76
 
6613 leency 77
BEGIN
7696 akron1 78
    res := API.fread(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
7597 akron1 79
    IF res <= 0 THEN
80
        res := -1
81
    END
6613 leency 82
 
7597 akron1 83
    RETURN res
84
END FileRead;
6613 leency 85
 
86
 
7597 akron1 87
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
88
VAR
89
    res: INTEGER;
90
 
6613 leency 91
BEGIN
7696 akron1 92
    res := API.fwrite(SYSTEM.ADR(Buffer[0]), 1, bytes, F);
7597 akron1 93
    IF res <= 0 THEN
94
        res := -1
95
    END
6613 leency 96
 
7597 akron1 97
    RETURN res
98
END FileWrite;
99
 
100
 
101
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
102
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("wb"))
103
END FileCreate;
104
 
105
 
106
PROCEDURE FileClose* (File: INTEGER);
6613 leency 107
BEGIN
7597 akron1 108
    File := API.fclose(File)
109
END FileClose;
6613 leency 110
 
7597 akron1 111
 
112
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
113
    RETURN API.fopen(SYSTEM.ADR(FName[0]), SYSTEM.SADR("rb"))
114
END FileOpen;
115
 
116
 
117
PROCEDURE OutChar* (c: CHAR);
6613 leency 118
BEGIN
7597 akron1 119
    API.putc(c)
120
END OutChar;
6613 leency 121
 
7597 akron1 122
 
123
PROCEDURE GetTickCount* (): INTEGER;
124
VAR
125
    tp:  API.TP;
126
    res: INTEGER;
127
 
6613 leency 128
BEGIN
7597 akron1 129
    IF API.clock_gettime(0, tp) = 0 THEN
130
        res := tp[0] * 100 + tp[1] DIV 10000000
131
    ELSE
132
        res := 0
133
    END
6613 leency 134
 
7597 akron1 135
    RETURN res
136
END GetTickCount;
6613 leency 137
 
7597 akron1 138
 
139
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
140
    RETURN path[0] # slash
141
END isRelative;
142
 
143
 
144
PROCEDURE now* (VAR year, month, day, hour, min, sec: INTEGER);
145
END now;
146
 
147
 
148
PROCEDURE UnixTime* (): INTEGER;
149
    RETURN API.time(0)
150
END UnixTime;
151
 
152
 
7983 leency 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
 
188
 
7597 akron1 189
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
190
VAR
191
    res: INTEGER;
192
 
193
BEGIN
194
    a := 0;
195
    b := 0;
196
    SYSTEM.MOVE(SYSTEM.ADR(x), SYSTEM.ADR(a), 4);
197
    SYSTEM.MOVE(SYSTEM.ADR(x) + 4, SYSTEM.ADR(b), 4);
198
    SYSTEM.GET(SYSTEM.ADR(x), res)
199
    RETURN res
200
END splitf;
201
 
202
 
203
BEGIN
204
    eol := 0AX;
7983 leency 205
    maxreal := 1.9;
206
    PACK(maxreal, 1023);
7597 akron1 207
    SYSTEM.GET(API.MainParam, argc)
7983 leency 208
END HOST.