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 UTILS;
9
 
7696 akron1 10
IMPORT HOST;
6613 leency 11
 
7597 akron1 12
 
6613 leency 13
CONST
14
 
7597 akron1 15
    slash* = HOST.slash;
6613 leency 16
 
7597 akron1 17
    bit_depth* = HOST.bit_depth;
18
    maxint* = HOST.maxint;
19
    minint* = HOST.minint;
7693 akron1 20
 
7597 akron1 21
    OS = HOST.OS;
6613 leency 22
 
7693 akron1 23
    min32* = -2147483647-1;
24
    max32* =  2147483647;
6613 leency 25
 
7983 leency 26
    vMajor* = 1;
27
    vMinor* = 29;
7693 akron1 28
 
7983 leency 29
    FILE_EXT* = ".ob07";
30
    RTL_NAME* = "RTL";
31
 
32
    MAX_GLOBAL_SIZE* = 1600000000;
33
 
34
 
7696 akron1 35
TYPE
36
 
37
    DAYS = ARRAY 12, 31, 2 OF INTEGER;
38
 
39
 
6613 leency 40
VAR
41
 
7597 akron1 42
    time*: INTEGER;
6613 leency 43
 
7597 akron1 44
    eol*:  ARRAY 3 OF CHAR;
6613 leency 45
 
7597 akron1 46
    maxreal*: REAL;
6613 leency 47
 
7693 akron1 48
    target*:
6613 leency 49
 
7693 akron1 50
      RECORD
51
 
52
          bit_depth*,
53
          maxInt*,
54
          minInt*,
55
          maxSet*,
56
          maxHex*:    INTEGER;
57
 
58
          maxReal*:   REAL
59
 
60
      END;
61
 
62
    bit_diff*: INTEGER;
63
 
7696 akron1 64
    days: DAYS;
7693 akron1 65
 
7696 akron1 66
 
67
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
7597 akron1 68
    RETURN HOST.FileRead(F, Buffer, bytes)
69
END FileRead;
6613 leency 70
 
71
 
7597 akron1 72
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
73
    RETURN HOST.FileWrite(F, Buffer, bytes)
74
END FileWrite;
6613 leency 75
 
76
 
7597 akron1 77
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
78
    RETURN HOST.FileCreate(FName)
79
END FileCreate;
6613 leency 80
 
81
 
7597 akron1 82
PROCEDURE FileClose* (F: INTEGER);
6613 leency 83
BEGIN
7597 akron1 84
    HOST.FileClose(F)
85
END FileClose;
6613 leency 86
 
87
 
7597 akron1 88
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
89
    RETURN HOST.FileOpen(FName)
90
END FileOpen;
6613 leency 91
 
92
 
7597 akron1 93
PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
6613 leency 94
BEGIN
7597 akron1 95
    HOST.GetArg(i, str)
96
END GetArg;
6613 leency 97
 
98
 
7597 akron1 99
PROCEDURE Exit* (code: INTEGER);
6613 leency 100
BEGIN
7597 akron1 101
    HOST.ExitProcess(code)
102
END Exit;
6613 leency 103
 
104
 
7597 akron1 105
PROCEDURE GetTickCount* (): INTEGER;
106
    RETURN HOST.GetTickCount()
107
END GetTickCount;
6613 leency 108
 
109
 
7597 akron1 110
PROCEDURE OutChar* (c: CHAR);
6613 leency 111
BEGIN
7597 akron1 112
    HOST.OutChar(c)
113
END OutChar;
6613 leency 114
 
115
 
7597 akron1 116
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
117
    RETURN HOST.splitf(x, a, b)
118
END splitf;
6613 leency 119
 
120
 
7983 leency 121
PROCEDURE d2s* (x: REAL): INTEGER;
122
    RETURN HOST.d2s(x)
123
END d2s;
124
 
125
 
7597 akron1 126
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
127
    RETURN HOST.isRelative(path)
128
END isRelative;
6613 leency 129
 
130
 
7597 akron1 131
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
6613 leency 132
BEGIN
7597 akron1 133
    HOST.GetCurrentDirectory(path)
134
END GetCurrentDirectory;
7107 akron1 135
 
6613 leency 136
 
7696 akron1 137
PROCEDURE GetUnixTime* (year, month, day, hour, min, sec: INTEGER): INTEGER;
138
    RETURN ((year - 1970) * 365 + days[month - 1, day - 1, ORD(year DIV 4 = 0)] + (year - 1969) DIV 4) * 86400 + hour * 3600 + min * 60 + sec
139
END GetUnixTime;
140
 
141
 
7597 akron1 142
PROCEDURE UnixTime* (): INTEGER;
143
VAR
144
    year, month, day, hour, min, sec: INTEGER;
145
    res: INTEGER;
6613 leency 146
 
147
BEGIN
7597 akron1 148
    IF OS = "LINUX" THEN
149
        res := HOST.UnixTime()
150
    ELSE
151
        HOST.now(year, month, day, hour, min, sec);
7696 akron1 152
        res := GetUnixTime(year, month, day, hour, min, sec)
7597 akron1 153
    END
6613 leency 154
 
7597 akron1 155
    RETURN res
156
END UnixTime;
6613 leency 157
 
158
 
7983 leency 159
PROCEDURE SetBitDepth* (BitDepth: INTEGER; Double: BOOLEAN);
6613 leency 160
BEGIN
7693 akron1 161
    ASSERT((BitDepth = 16) OR (BitDepth = 32) OR (BitDepth = 64));
162
    bit_diff := bit_depth - BitDepth;
163
    ASSERT(bit_diff >= 0);
164
 
165
    target.bit_depth := BitDepth;
166
    target.maxSet    := BitDepth - 1;
167
    target.maxHex    := BitDepth DIV 4;
168
    target.minInt    := ASR(minint, bit_diff);
169
    target.maxInt    := ASR(maxint, bit_diff);
7983 leency 170
 
171
    IF Double THEN
172
        target.maxReal := maxreal
173
    ELSE
174
        target.maxReal := 1.9;
175
        PACK(target.maxReal, 127)
176
    END
7693 akron1 177
END SetBitDepth;
178
 
179
 
180
PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
181
    RETURN ASR(n, 8 * idx) MOD 256
182
END Byte;
183
 
184
 
185
PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
186
VAR
187
    res: BOOLEAN;
188
 
189
BEGIN
190
    IF bytes MOD align # 0 THEN
191
        res := maxint - bytes >= align - (bytes MOD align);
192
        IF res THEN
193
            bytes := bytes + align - (bytes MOD align)
194
        END
195
    ELSE
196
        res := TRUE
197
    END
198
 
199
    RETURN res
200
END Align;
201
 
202
 
203
PROCEDURE Long* (value: INTEGER): INTEGER;
204
    RETURN ASR(LSL(value, bit_diff), bit_diff)
205
END Long;
206
 
207
 
208
PROCEDURE Short* (value: INTEGER): INTEGER;
209
    RETURN LSR(LSL(value, bit_diff), bit_diff)
210
END Short;
211
 
212
 
213
PROCEDURE Log2* (x: INTEGER): INTEGER;
214
VAR
215
    n: INTEGER;
216
 
217
BEGIN
218
    n := 0;
219
    WHILE ~ODD(x) DO
220
        x := x DIV 2;
221
        INC(n)
222
    END;
223
 
224
    IF x # 1 THEN
225
        n := -1
226
    END
227
 
228
    RETURN n
229
END Log2;
230
 
231
 
7696 akron1 232
PROCEDURE init (VAR days: DAYS);
233
VAR
234
    i, j, n0, n1: INTEGER;
235
 
7693 akron1 236
BEGIN
7696 akron1 237
 
238
    FOR i := 0 TO 11 DO
239
        FOR j := 0 TO 30 DO
240
            days[i, j, 0] := 0;
241
            days[i, j, 1] := 0;
242
        END
243
    END;
244
 
245
    days[ 1, 28, 0] := -1;
246
 
247
    FOR i := 0 TO 1 DO
248
        days[ 1, 29, i] := -1;
249
        days[ 1, 30, i] := -1;
250
        days[ 3, 30, i] := -1;
251
        days[ 5, 30, i] := -1;
252
        days[ 8, 30, i] := -1;
253
        days[10, 30, i] := -1;
254
    END;
255
 
256
    n0 := 0;
257
    n1 := 0;
258
    FOR i := 0 TO 11 DO
259
        FOR j := 0 TO 30 DO
260
            IF days[i, j, 0] = 0 THEN
261
                days[i, j, 0] := n0;
262
                INC(n0)
263
            END;
264
            IF days[i, j, 1] = 0 THEN
265
                days[i, j, 1] := n1;
266
                INC(n1)
267
            END
268
        END
269
    END
270
 
271
END init;
272
 
273
 
274
BEGIN
7597 akron1 275
    time := GetTickCount();
276
    COPY(HOST.eol, eol);
7983 leency 277
    maxreal := HOST.maxreal;
7696 akron1 278
    init(days)
7983 leency 279
END UTILS.