Subversion Repositories Kolibri OS

Rev

Rev 9893 | Only display areas with differences | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 9893 Rev 9895
1
(*
1
(*
2
    BSD 2-Clause License
2
    BSD 2-Clause License
3
 
3
 
4
    Copyright (c) 2018-2023, Anton Krotov
4
    Copyright (c) 2018-2023, Anton Krotov
5
    All rights reserved.
5
    All rights reserved.
6
*)
6
*)
7
 
7
 
8
MODULE UTILS;
8
MODULE UTILS;
9
 
9
 
10
IMPORT HOST;
10
IMPORT HOST;
11
 
11
 
12
 
12
 
13
CONST
13
CONST
14
 
14
 
15
    slash* = HOST.slash;
15
    slash* = HOST.slash;
16
    eol* = HOST.eol;
16
    eol* = HOST.eol;
17
 
17
 
18
    bit_depth* = HOST.bit_depth;
18
    bit_depth* = HOST.bit_depth;
19
    maxint* = HOST.maxint;
19
    maxint* = HOST.maxint;
20
    minint* = HOST.minint;
20
    minint* = HOST.minint;
21
 
21
 
22
    min32* = -2147483647-1;
22
    min32* = -2147483647-1;
23
    max32* =  2147483647;
23
    max32* =  2147483647;
24
 
24
 
25
    vMajor* = 1;
25
    vMajor* = 1;
26
    vMinor* = 63;
26
    vMinor* = 64;
27
    Date* = "21-jan-2023";
27
    Date* = "22-jan-2023";
28
 
28
 
29
    FILE_EXT* = ".ob07";
29
    FILE_EXT* = ".ob07";
30
    RTL_NAME* = "RTL";
30
    RTL_NAME* = "RTL";
31
 
31
 
32
    MAX_GLOBAL_SIZE* = 1600000000;
32
    MAX_GLOBAL_SIZE* = 1600000000;
33
 
33
 
34
 
34
 
35
VAR
35
VAR
36
 
36
 
37
    time*: INTEGER;
37
    time*: INTEGER;
38
 
38
 
39
    maxreal*, inf*: REAL;
39
    maxreal*, inf*: REAL;
40
 
40
 
41
    target*:
41
    target*:
42
 
42
 
43
      RECORD
43
      RECORD
44
 
44
 
45
          bit_depth*,
45
          bit_depth*,
46
          maxInt*,
46
          maxInt*,
47
          minInt*,
47
          minInt*,
48
          maxSet*,
48
          maxSet*,
49
          maxHex*:    INTEGER;
49
          maxHex*:    INTEGER;
50
 
50
 
51
          maxReal*:   REAL
51
          maxReal*:   REAL
52
 
52
 
53
      END;
53
      END;
54
 
54
 
55
    bit_diff*: INTEGER;
55
    bit_diff*: INTEGER;
56
 
56
 
57
 
57
 
58
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
58
PROCEDURE FileRead* (F: INTEGER; VAR Buffer: ARRAY OF CHAR; bytes: INTEGER): INTEGER;
59
    RETURN HOST.FileRead(F, Buffer, bytes)
59
    RETURN HOST.FileRead(F, Buffer, bytes)
60
END FileRead;
60
END FileRead;
61
 
61
 
62
 
62
 
63
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
63
PROCEDURE FileWrite* (F: INTEGER; Buffer: ARRAY OF BYTE; bytes: INTEGER): INTEGER;
64
    RETURN HOST.FileWrite(F, Buffer, bytes)
64
    RETURN HOST.FileWrite(F, Buffer, bytes)
65
END FileWrite;
65
END FileWrite;
66
 
66
 
67
 
67
 
68
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
68
PROCEDURE FileCreate* (FName: ARRAY OF CHAR): INTEGER;
69
    RETURN HOST.FileCreate(FName)
69
    RETURN HOST.FileCreate(FName)
70
END FileCreate;
70
END FileCreate;
71
 
71
 
72
 
72
 
73
PROCEDURE FileClose* (F: INTEGER);
73
PROCEDURE FileClose* (F: INTEGER);
74
BEGIN
74
BEGIN
75
    HOST.FileClose(F)
75
    HOST.FileClose(F)
76
END FileClose;
76
END FileClose;
77
 
77
 
78
 
78
 
79
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
79
PROCEDURE FileOpen* (FName: ARRAY OF CHAR): INTEGER;
80
    RETURN HOST.FileOpen(FName)
80
    RETURN HOST.FileOpen(FName)
81
END FileOpen;
81
END FileOpen;
82
 
82
 
83
 
83
 
84
PROCEDURE chmod* (FName: ARRAY OF CHAR);
84
PROCEDURE chmod* (FName: ARRAY OF CHAR);
85
BEGIN
85
BEGIN
86
    HOST.chmod(FName)
86
    HOST.chmod(FName)
87
END chmod;
87
END chmod;
88
 
88
 
89
 
89
 
90
PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
90
PROCEDURE GetArg* (i: INTEGER; VAR str: ARRAY OF CHAR);
91
BEGIN
91
BEGIN
92
    HOST.GetArg(i, str)
92
    HOST.GetArg(i, str)
93
END GetArg;
93
END GetArg;
94
 
94
 
95
 
95
 
96
PROCEDURE Exit* (code: INTEGER);
96
PROCEDURE Exit* (code: INTEGER);
97
BEGIN
97
BEGIN
98
    HOST.ExitProcess(code)
98
    HOST.ExitProcess(code)
99
END Exit;
99
END Exit;
100
 
100
 
101
 
101
 
102
PROCEDURE GetTickCount* (): INTEGER;
102
PROCEDURE GetTickCount* (): INTEGER;
103
    RETURN HOST.GetTickCount()
103
    RETURN HOST.GetTickCount()
104
END GetTickCount;
104
END GetTickCount;
105
 
105
 
106
 
106
 
107
PROCEDURE OutChar* (c: CHAR);
107
PROCEDURE OutChar* (c: CHAR);
108
BEGIN
108
BEGIN
109
    HOST.OutChar(c)
109
    HOST.OutChar(c)
110
END OutChar;
110
END OutChar;
111
 
111
 
112
 
112
 
113
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
113
PROCEDURE splitf* (x: REAL; VAR a, b: INTEGER): INTEGER;
114
    RETURN HOST.splitf(x, a, b)
114
    RETURN HOST.splitf(x, a, b)
115
END splitf;
115
END splitf;
116
 
116
 
117
 
117
 
118
PROCEDURE d2s* (x: REAL): INTEGER;
118
PROCEDURE d2s* (x: REAL): INTEGER;
119
    RETURN HOST.d2s(x)
119
    RETURN HOST.d2s(x)
120
END d2s;
120
END d2s;
121
 
121
 
122
 
122
 
123
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
123
PROCEDURE isRelative* (path: ARRAY OF CHAR): BOOLEAN;
124
    RETURN HOST.isRelative(path)
124
    RETURN HOST.isRelative(path)
125
END isRelative;
125
END isRelative;
126
 
126
 
127
 
127
 
128
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
128
PROCEDURE GetCurrentDirectory* (VAR path: ARRAY OF CHAR);
129
BEGIN
129
BEGIN
130
    HOST.GetCurrentDirectory(path)
130
    HOST.GetCurrentDirectory(path)
131
END GetCurrentDirectory;
131
END GetCurrentDirectory;
132
 
132
 
133
 
133
 
134
PROCEDURE UnixTime* (): INTEGER;
134
PROCEDURE UnixTime* (): INTEGER;
135
    RETURN HOST.UnixTime()
135
    RETURN HOST.UnixTime()
136
END UnixTime;
136
END UnixTime;
137
 
137
 
138
 
138
 
139
PROCEDURE SetBitDepth* (BitDepth: INTEGER; Double: BOOLEAN);
139
PROCEDURE SetBitDepth* (BitDepth: INTEGER; Double: BOOLEAN);
140
BEGIN
140
BEGIN
141
    ASSERT((BitDepth = 16) OR (BitDepth = 32) OR (BitDepth = 64));
141
    ASSERT((BitDepth = 16) OR (BitDepth = 32) OR (BitDepth = 64));
142
    bit_diff := bit_depth - BitDepth;
142
    bit_diff := bit_depth - BitDepth;
143
    ASSERT(bit_diff >= 0);
143
    ASSERT(bit_diff >= 0);
144
 
144
 
145
    target.bit_depth := BitDepth;
145
    target.bit_depth := BitDepth;
146
    target.maxSet    := BitDepth - 1;
146
    target.maxSet    := BitDepth - 1;
147
    target.maxHex    := BitDepth DIV 4;
147
    target.maxHex    := BitDepth DIV 4;
148
    target.minInt    := ASR(minint, bit_diff);
148
    target.minInt    := ASR(minint, bit_diff);
149
    target.maxInt    := ASR(maxint, bit_diff);
149
    target.maxInt    := ASR(maxint, bit_diff);
150
 
150
 
151
    IF Double THEN
151
    IF Double THEN
152
        target.maxReal := maxreal
152
        target.maxReal := maxreal
153
    ELSE
153
    ELSE
154
        target.maxReal := 1.9;
154
        target.maxReal := 1.9;
155
        PACK(target.maxReal, 127)
155
        PACK(target.maxReal, 127)
156
    END
156
    END
157
END SetBitDepth;
157
END SetBitDepth;
158
 
158
 
159
 
159
 
160
PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
160
PROCEDURE Byte* (n: INTEGER; idx: INTEGER): BYTE;
161
    RETURN ASR(n, 8 * idx) MOD 256
161
    RETURN ASR(n, 8 * idx) MOD 256
162
END Byte;
162
END Byte;
163
 
163
 
164
 
164
 
165
PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
165
PROCEDURE Align* (VAR bytes: INTEGER; align: INTEGER): BOOLEAN;
166
BEGIN
166
BEGIN
167
    INC(bytes, (-bytes) MOD align)
167
    INC(bytes, (-bytes) MOD align)
168
    RETURN bytes >= 0
168
    RETURN bytes >= 0
169
END Align;
169
END Align;
170
 
170
 
171
 
171
 
172
PROCEDURE Long* (value: INTEGER): INTEGER;
172
PROCEDURE Long* (value: INTEGER): INTEGER;
173
    RETURN ASR(LSL(value, bit_diff), bit_diff)
173
    RETURN ASR(LSL(value, bit_diff), bit_diff)
174
END Long;
174
END Long;
175
 
175
 
176
 
176
 
177
PROCEDURE Short* (value: INTEGER): INTEGER;
177
PROCEDURE Short* (value: INTEGER): INTEGER;
178
    RETURN LSR(LSL(value, bit_diff), bit_diff)
178
    RETURN LSR(LSL(value, bit_diff), bit_diff)
179
END Short;
179
END Short;
180
 
180
 
181
 
181
 
182
PROCEDURE Log2* (x: INTEGER): INTEGER;
182
PROCEDURE Log2* (x: INTEGER): INTEGER;
183
VAR
183
VAR
184
    n: INTEGER;
184
    n: INTEGER;
185
 
185
 
186
BEGIN
186
BEGIN
187
    n := 0;
187
    n := 0;
188
    WHILE ~ODD(x) DO
188
    WHILE ~ODD(x) DO
189
        x := x DIV 2;
189
        x := x DIV 2;
190
        INC(n)
190
        INC(n)
191
    END;
191
    END;
192
 
192
 
193
    IF x # 1 THEN
193
    IF x # 1 THEN
194
        n := -1
194
        n := -1
195
    END
195
    END
196
 
196
 
197
    RETURN n
197
    RETURN n
198
END Log2;
198
END Log2;
199
 
199
 
200
 
200
 
201
PROCEDURE hexdgt* (n: BYTE): BYTE;
201
PROCEDURE hexdgt* (n: BYTE): BYTE;
202
BEGIN
202
BEGIN
203
    IF n < 10 THEN
203
    IF n < 10 THEN
204
        INC(n, ORD("0"))
204
        INC(n, ORD("0"))
205
    ELSE
205
    ELSE
206
        INC(n, ORD("A") - 10)
206
        INC(n, ORD("A") - 10)
207
    END
207
    END
208
 
208
 
209
    RETURN n
209
    RETURN n
210
END hexdgt;
210
END hexdgt;
211
 
211
 
212
 
212
 
213
BEGIN
213
BEGIN
214
    time := HOST.GetTickCount();
214
    time := HOST.GetTickCount();
215
    inf := HOST.inf;
215
    inf := HOST.inf;
216
    maxreal := HOST.maxreal
216
    maxreal := HOST.maxreal
217
END UTILS.
217
END UTILS.