Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
8728 leency 1
(*
9628 akron1 2
    Copyright 2021, 2022 Anton Krotov
8728 leency 3
 
4
    This file is part of CEdit.
5
 
6
    CEdit is free software: you can redistribute it and/or modify
7
    it under the terms of the GNU General Public License as published by
8
    the Free Software Foundation, either version 3 of the License, or
9
    (at your option) any later version.
10
 
11
    CEdit is distributed in the hope that it will be useful,
12
    but WITHOUT ANY WARRANTY; without even the implied warranty of
13
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14
    GNU General Public License for more details.
15
 
16
    You should have received a copy of the GNU General Public License
17
    along with CEdit. If not, see .
18
*)
19
 
20
MODULE Utils;
21
 
22
IMPORT SYSTEM;
23
 
24
CONST
25
 
26
    SPACE* = 20X;
27
    SLASH* = "/";
28
 
29
    OS* = "KOS";
30
 
31
 
32
PROCEDURE streq* (s1, s2: INTEGER; n: INTEGER): BOOLEAN;
33
VAR
34
    c1, c2: WCHAR;
35
BEGIN
36
    WHILE n > 0 DO
37
        SYSTEM.GET(s1, c1);
38
        SYSTEM.GET(s2, c2);
39
        INC(s1, 2);
40
        INC(s2, 2);
41
        IF c1 = c2 THEN
42
            DEC(n)
43
        ELSE
44
            n := 0
45
        END
46
    END
47
    RETURN c1 = c2
48
END streq;
49
 
50
 
51
PROCEDURE append* (VAR s1: ARRAY OF WCHAR; s2: ARRAY OF WCHAR);
52
VAR
53
    n1, n2, i, j: INTEGER;
54
BEGIN
55
    n1 := LENGTH(s1);
56
    n2 := LENGTH(s2);
57
 
58
    ASSERT(n1 + n2 < LEN(s1));
59
 
60
    i := 0;
61
    j := n1;
62
    WHILE i < n2 DO
63
        s1[j] := s2[i];
64
        INC(i);
65
        INC(j)
66
    END;
67
 
68
    s1[j] := 0X
69
END append;
70
 
71
 
72
PROCEDURE append8* (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR);
73
VAR
74
    n1, n2, i, j: INTEGER;
75
BEGIN
76
    n1 := LENGTH(s1);
77
    n2 := LENGTH(s2);
78
 
79
    ASSERT(n1 + n2 < LEN(s1));
80
 
81
    i := 0;
82
    j := n1;
83
    WHILE i < n2 DO
84
        s1[j] := s2[i];
85
        INC(i);
86
        INC(j)
87
    END;
88
 
89
    s1[j] := 0X
90
END append8;
91
 
92
 
93
PROCEDURE reverse* (VAR s: ARRAY OF WCHAR);
94
VAR
95
    ch: WCHAR;
96
    i, j: INTEGER;
97
BEGIN
98
    i := 0;
99
    j := LENGTH(s) - 1;
100
    WHILE i < j DO
101
        ch := s[i];
102
        s[i] := s[j];
103
        s[j] := ch;
104
        INC(i);
105
        DEC(j)
106
    END
107
END reverse;
108
 
109
 
110
PROCEDURE reverse8* (VAR s: ARRAY OF CHAR);
111
VAR
112
    ch: CHAR;
113
    i, j: INTEGER;
114
BEGIN
115
    i := 0;
116
    j := LENGTH(s) - 1;
117
    WHILE i < j DO
118
        ch := s[i];
119
        s[i] := s[j];
120
        s[j] := ch;
121
        INC(i);
122
        DEC(j)
123
    END
124
END reverse8;
125
 
126
 
127
PROCEDURE int2str* (val: INTEGER; VAR s: ARRAY OF WCHAR);
128
VAR
129
    i: INTEGER;
130
BEGIN
131
    i := 0;
132
    REPEAT
133
        s[i] := WCHR(ORD("0") + val MOD 10);
134
        INC(i);
135
        val := val DIV 10
136
    UNTIL val = 0;
137
    s[i] := 0X;
138
    reverse(s)
139
END int2str;
140
 
141
 
142
PROCEDURE isDigit* (ch: WCHAR): BOOLEAN;
143
    RETURN ("0" <= ch) & (ch <= "9")
144
END isDigit;
145
 
146
 
9413 akron1 147
PROCEDURE isOct* (ch: WCHAR): BOOLEAN;
148
    RETURN ("0" <= ch) & (ch <= "7")
149
END isOct;
150
 
151
 
8728 leency 152
PROCEDURE isHex* (ch: WCHAR): BOOLEAN;
153
    RETURN ("0" <= ch) & (ch <= "9") OR ("A" <= ch) & (ch <= "F")
154
END isHex;
155
 
156
 
157
PROCEDURE isLetter* (ch: WCHAR): BOOLEAN;
158
    RETURN ("a" <= ch) & (ch <= "z") OR ("A" <= ch) & (ch <= "Z")
159
END isLetter;
160
 
161
 
162
PROCEDURE cap* (VAR ch: WCHAR): BOOLEAN;
163
VAR
164
    res: BOOLEAN;
165
BEGIN
166
    IF ("a" <= ch) & (ch <= "z") THEN
167
        ch := WCHR(ORD(ch) - (ORD("z") - ORD("Z")));
168
        res := TRUE
169
    ELSIF (430H <= ORD(ch)) & (ORD(ch) <= 44FH) THEN
170
        ch := WCHR(ORD(ch) - 20H);
171
        res := TRUE
172
    ELSIF (450H <= ORD(ch)) & (ORD(ch) <= 45FH) THEN
173
        ch := WCHR(ORD(ch) - 50H);
174
        res := TRUE
175
    ELSIF ch = 491X THEN
176
        ch := 490X;
177
        res := TRUE
178
    ELSE
179
        res := FALSE
180
    END
181
    RETURN res
182
END cap;
183
 
184
 
185
PROCEDURE cap8 (VAR ch: CHAR): BOOLEAN;
186
VAR
187
    res: BOOLEAN;
188
BEGIN
189
    IF ("a" <= ch) & (ch <= "z") THEN
190
        ch := CHR(ORD(ch) - (ORD("z") - ORD("Z")));
191
        res := TRUE
192
    ELSE
193
        res := FALSE
194
    END
195
    RETURN res
196
END cap8;
197
 
198
 
199
PROCEDURE upcase* (VAR s: ARRAY OF CHAR);
200
VAR
201
    i: INTEGER;
202
BEGIN
203
    i := LENGTH(s) - 1;
204
    WHILE i >= 0 DO
205
        IF cap8(s[i]) THEN
206
        END;
207
        DEC(i)
9210 akron1 208
    END
8728 leency 209
END upcase;
210
 
211
 
212
PROCEDURE upcase16* (VAR s: ARRAY OF WCHAR);
213
VAR
214
    i: INTEGER;
215
BEGIN
216
    i := LENGTH(s) - 1;
217
    WHILE i >= 0 DO
218
        IF cap(s[i]) THEN
219
        END;
220
        DEC(i)
221
    END
222
END upcase16;
223
 
224
 
225
PROCEDURE low* (VAR ch: WCHAR): BOOLEAN;
226
VAR
227
    res: BOOLEAN;
228
BEGIN
229
    IF ("A" <= ch) & (ch <= "Z") THEN
230
        ch := WCHR(ORD(ch) + (ORD("z") - ORD("Z")));
231
        res := TRUE
232
    ELSIF (410H <= ORD(ch)) & (ORD(ch) <= 42FH) THEN
233
        ch := WCHR(ORD(ch) + 20H);
234
        res := TRUE
235
    ELSIF (400H <= ORD(ch)) & (ORD(ch) <= 40FH) THEN
236
        ch := WCHR(ORD(ch) + 50H);
237
        res := TRUE
238
    ELSIF ch = 490X THEN
239
        ch := 491X;
240
        res := TRUE
241
    ELSE
242
        res := FALSE
243
    END
244
    RETURN res
245
END low;
246
 
247
 
9210 akron1 248
PROCEDURE lowcase* (VAR s: ARRAY OF CHAR);
249
VAR
250
    i: INTEGER;
251
BEGIN
252
    i := LENGTH(s) - 1;
253
    WHILE i >= 0 DO
254
        IF ("A" <= s[i]) & (s[i] <= "Z") THEN
255
        	s[i] := CHR(ORD(s[i]) + 32)
256
        END;
257
        DEC(i)
258
    END
259
END lowcase;
260
 
261
 
8728 leency 262
PROCEDURE str2int* (s: ARRAY OF WCHAR; VAR val: INTEGER): BOOLEAN;
263
VAR
264
    i, temp: INTEGER;
265
    res, neg: BOOLEAN;
266
BEGIN
267
    temp := 0;
268
    res := TRUE;
269
    neg := FALSE;
270
    i := 0;
271
    WHILE (s[i] # 0X) & (s[i] = SPACE) DO
272
        INC(i)
273
    END;
274
 
275
    IF s[i] = "-" THEN
276
        INC(i);
277
        neg := TRUE
278
    ELSIF s[i] = "+" THEN
279
        INC(i)
280
    END;
281
 
282
    IF isDigit(s[i]) THEN
283
        REPEAT
9210 akron1 284
            temp := temp*10 + ORD(s[i]) - ORD("0");
8728 leency 285
            INC(i)
286
        UNTIL ~isDigit(s[i]);
287
        IF neg THEN
288
            temp := -temp
289
        END;
290
        val := temp
291
    ELSE
292
        res := FALSE
293
    END
294
 
295
    RETURN res
296
END str2int;
297
 
298
 
299
PROCEDURE getFileName* (path: ARRAY OF CHAR; VAR name: ARRAY OF CHAR; ch: CHAR);
300
VAR
301
    i, j: INTEGER;
302
BEGIN
303
    j := 0;
304
    i := LENGTH(path) - 1;
305
    WHILE (i >= 0) & (path[i] # ch) DO
306
        name[j] := path[i];
307
        DEC(i);
308
        INC(j)
309
    END;
310
    name[j] := 0X;
311
    reverse8(name)
312
END getFileName;
313
 
314
 
315
PROCEDURE getPath* (fname: ARRAY OF CHAR; VAR path: ARRAY OF CHAR);
316
VAR
317
    i, j: INTEGER;
318
BEGIN
319
    j := 0;
320
    i := LENGTH(fname) - 1;
321
    WHILE (i >= 0) & (fname[i] # SLASH) DO
322
        DEC(i)
323
    END;
324
    path := fname;
325
    path[i] := 0X
326
END getPath;
327
 
328
 
329
PROCEDURE lg10* (n: INTEGER): INTEGER;
330
VAR
331
    res: INTEGER;
332
BEGIN
333
    res := 0;
334
    WHILE n >= 10 DO
335
        n := n DIV 10;
336
        INC(res)
337
    END
338
    RETURN res
339
END lg10;
340
 
341
 
342
PROCEDURE sgn* (x: INTEGER): INTEGER;
343
BEGIN
344
    IF x > 0 THEN
345
        x := 1
346
    ELSIF x < 0 THEN
347
        x := -1
348
    ELSE
349
        x := 0
350
    END
351
    RETURN x
352
END sgn;
353
 
354
 
9187 akron1 355
PROCEDURE between* (a, b, c: INTEGER): BOOLEAN;
356
	RETURN (a <= b) & (b <= c)
357
END between;
358
 
359
 
9413 akron1 360
PROCEDURE inString* (c: WCHAR; s: ARRAY OF WCHAR): BOOLEAN;
361
VAR
362
	i, L: INTEGER;
363
BEGIN
364
	L := LENGTH(s);
365
	i := 0;
366
	WHILE (i < L) & (c # s[i]) DO
367
		INC(i)
368
	END
369
	RETURN i < L
370
END inString;
371
 
372
 
8728 leency 373
END Utils.