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