Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
7597 akron1 1
(*
2
    BSD 2-Clause License
6613 leency 3
 
7597 akron1 4
    Copyright (c) 2018, 2019, Anton Krotov
5
    All rights reserved.
6613 leency 6
*)
7
 
8
MODULE UTILS;
9
 
7597 akron1 10
IMPORT HOST, UNIXTIME;
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
 
6613 leency 27
VAR
28
 
7597 akron1 29
    time*: INTEGER;
6613 leency 30
 
7597 akron1 31
    eol*:  ARRAY 3 OF CHAR;
6613 leency 32
 
7597 akron1 33
    maxreal*: REAL;
6613 leency 34
 
7693 akron1 35
    target*:
6613 leency 36
 
7693 akron1 37
      RECORD
38
 
39
          bit_depth*,
40
          maxInt*,
41
          minInt*,
42
          maxSet*,
43
          maxHex*:    INTEGER;
44
 
45
          maxReal*:   REAL
46
 
47
      END;
48
 
49
    bit_diff*: INTEGER;
50
 
51
 
7597 akron1 52
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
53
    RETURN HOST.FileRead(F, Buffer, bytes)
54
END FileRead;
6613 leency 55
 
56
 
7597 akron1 57
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
58
    RETURN HOST.FileWrite(F, Buffer, bytes)
59
END FileWrite;
6613 leency 60
 
61
 
7597 akron1 62
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
63
    RETURN HOST.FileCreate(FName)
64
END FileCreate;
6613 leency 65
 
66
 
7597 akron1 67
PROCEDURE FileClose* (F: INTEGER);
6613 leency 68
BEGIN
7597 akron1 69
    HOST.FileClose(F)
70
END FileClose;
6613 leency 71
 
72
 
7597 akron1 73
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
74
    RETURN HOST.FileOpen(FName)
75
END FileOpen;
6613 leency 76
 
77
 
7597 akron1 78
PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
6613 leency 79
BEGIN
7597 akron1 80
    HOST.GetArg(i, str)
81
END GetArg;
6613 leency 82
 
83
 
7597 akron1 84
PROCEDURE Exit* (code: INTEGER);
6613 leency 85
BEGIN
7597 akron1 86
    HOST.ExitProcess(code)
87
END Exit;
6613 leency 88
 
89
 
7597 akron1 90
PROCEDURE GetTickCount* (): INTEGER;
91
    RETURN HOST.GetTickCount()
92
END GetTickCount;
6613 leency 93
 
94
 
7597 akron1 95
PROCEDURE OutChar* (c: CHAR);
6613 leency 96
BEGIN
7597 akron1 97
    HOST.OutChar(c)
98
END OutChar;
6613 leency 99
 
100
 
7597 akron1 101
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
102
    RETURN HOST.splitf(x, a, b)
103
END splitf;
6613 leency 104
 
105
 
7597 akron1 106
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
107
    RETURN HOST.isRelative(path)
108
END isRelative;
6613 leency 109
 
110
 
7597 akron1 111
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
6613 leency 112
BEGIN
7597 akron1 113
    HOST.GetCurrentDirectory(path)
114
END GetCurrentDirectory;
7107 akron1 115
 
6613 leency 116
 
7597 akron1 117
PROCEDURE UnixTime* (): INTEGER;
118
VAR
119
    year, month, day, hour, min, sec: INTEGER;
120
    res: INTEGER;
6613 leency 121
 
122
BEGIN
7597 akron1 123
    IF OS = "LINUX" THEN
124
        res := HOST.UnixTime()
125
    ELSE
126
        HOST.now(year, month, day, hour, min, sec);
127
        res := UNIXTIME.time(year, month, day, hour, min, sec)
128
    END
6613 leency 129
 
7597 akron1 130
    RETURN res
131
END UnixTime;
6613 leency 132
 
133
 
7693 akron1 134
PROCEDURE SetBitDepth* (BitDepth: INTEGER);
6613 leency 135
BEGIN
7693 akron1 136
    ASSERT((BitDepth = 16) OR (BitDepth = 32) OR (BitDepth = 64));
137
    bit_diff := bit_depth - BitDepth;
138
    ASSERT(bit_diff >= 0);
139
 
140
    target.bit_depth := BitDepth;
141
    target.maxSet    := BitDepth - 1;
142
    target.maxHex    := BitDepth DIV 4;
143
    target.minInt    := ASR(minint, bit_diff);
144
    target.maxInt    := ASR(maxint, bit_diff);
145
    target.maxReal   := 1.9;
146
    PACK(target.maxReal, 1023);
147
END SetBitDepth;
148
 
149
 
150
PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
151
    RETURN ASR(n, 8 * idx) MOD 256
152
END Byte;
153
 
154
 
155
PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
156
VAR
157
    res: BOOLEAN;
158
 
159
BEGIN
160
    IF bytes MOD align # 0 THEN
161
        res := maxint - bytes >= align - (bytes MOD align);
162
        IF res THEN
163
            bytes := bytes + align - (bytes MOD align)
164
        END
165
    ELSE
166
        res := TRUE
167
    END
168
 
169
    RETURN res
170
END Align;
171
 
172
 
173
PROCEDURE Long* (value: INTEGER): INTEGER;
174
    RETURN ASR(LSL(value, bit_diff), bit_diff)
175
END Long;
176
 
177
 
178
PROCEDURE Short* (value: INTEGER): INTEGER;
179
    RETURN LSR(LSL(value, bit_diff), bit_diff)
180
END Short;
181
 
182
 
183
PROCEDURE Log2* (x: INTEGER): INTEGER;
184
VAR
185
    n: INTEGER;
186
 
187
BEGIN
188
    ASSERT(x > 0);
189
 
190
    n := 0;
191
    WHILE ~ODD(x) DO
192
        x := x DIV 2;
193
        INC(n)
194
    END;
195
 
196
    IF x # 1 THEN
197
        n := -1
198
    END
199
 
200
    RETURN n
201
END Log2;
202
 
203
 
204
BEGIN
7597 akron1 205
    time := GetTickCount();
206
    COPY(HOST.eol, eol);
207
    maxreal := 1.9;
208
    PACK(maxreal, 1023)
6613 leency 209
END UTILS.