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. |