Subversion Repositories Kolibri OS

Rev

Rev 7693 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

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