Subversion Repositories Kolibri OS

Rev

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
3
 
7983 leency 4
    Copyright (c) 2018-2020, Anton Krotov
7597 akron1 5
    All rights reserved.
6
*)
7
 
8
MODULE STRINGS;
9
 
10
IMPORT UTILS;
11
 
12
 
13
PROCEDURE append* (VAR s1: ARRAY OF CHAR; s2: ARRAY OF CHAR);
14
VAR
15
    n1, n2, i, j: INTEGER;
7983 leency 16
 
7597 akron1 17
BEGIN
18
    n1 := LENGTH(s1);
19
    n2 := LENGTH(s2);
20
 
21
    ASSERT(n1 + n2 < LEN(s1));
22
 
23
    i := 0;
24
    j := n1;
25
    WHILE i < n2 DO
26
        s1[j] := s2[i];
27
        INC(i);
28
        INC(j)
29
    END;
30
 
31
    s1[j] := 0X
32
 
33
END append;
34
 
35
 
7983 leency 36
PROCEDURE reverse (VAR s: ARRAY OF CHAR);
7597 akron1 37
VAR
38
    i, j: INTEGER;
39
    a, b: CHAR;
40
 
41
BEGIN
42
    i := 0;
43
    j := LENGTH(s) - 1;
44
 
45
    WHILE i < j DO
46
        a := s[i];
47
        b := s[j];
48
        s[i] := b;
49
        s[j] := a;
50
        INC(i);
51
        DEC(j)
52
    END
53
END reverse;
54
 
55
 
56
PROCEDURE IntToStr* (x: INTEGER; VAR str: ARRAY OF CHAR);
57
VAR
58
    i, a: INTEGER;
59
    minus: BOOLEAN;
60
 
61
BEGIN
62
    IF x = UTILS.minint THEN
63
        IF UTILS.bit_depth = 32 THEN
64
            COPY("-2147483648", str)
65
        ELSIF UTILS.bit_depth = 64 THEN
66
            COPY("-9223372036854775808", str)
67
        END
68
 
69
    ELSE
70
 
71
        minus := x < 0;
72
        IF minus THEN
73
            x := -x
74
        END;
75
        i := 0;
76
        a := 0;
77
        REPEAT
78
            str[i] := CHR(x MOD 10 + ORD("0"));
79
            x := x DIV 10;
80
            INC(i)
81
        UNTIL x = 0;
82
 
83
        IF minus THEN
84
            str[i] := "-";
85
            INC(i)
86
        END;
87
 
88
        str[i] := 0X;
89
        reverse(str)
90
 
91
    END
92
END IntToStr;
93
 
94
 
7693 akron1 95
PROCEDURE hexdgt (n: BYTE): BYTE;
96
BEGIN
97
    IF n < 10 THEN
98
        n := n + ORD("0")
99
    ELSE
100
        n := n - 10 + ORD("A")
101
    END
102
 
103
    RETURN n
104
END hexdgt;
105
 
106
 
107
PROCEDURE IntToHex* (x: INTEGER; VAR str: ARRAY OF CHAR; n: INTEGER);
108
BEGIN
109
    str[n] := 0X;
110
    WHILE n > 0 DO
111
        str[n - 1] := CHR(hexdgt(x MOD 16));
112
        x := x DIV 16;
113
        DEC(n)
114
    END
115
END IntToHex;
116
 
117
 
7597 akron1 118
PROCEDURE copy* (src: ARRAY OF CHAR; VAR dst: ARRAY OF CHAR; spos, dpos, count: INTEGER);
119
BEGIN
120
    WHILE count > 0 DO
121
        dst[dpos] := src[spos];
122
        INC(spos);
123
        INC(dpos);
124
        DEC(count)
125
    END
126
END copy;
127
 
128
 
129
PROCEDURE search* (s: ARRAY OF CHAR; VAR pos: INTEGER; c: CHAR; forward: BOOLEAN);
130
VAR
131
    length: INTEGER;
132
 
133
BEGIN
134
    length := LENGTH(s);
135
 
136
    IF (0 <= pos) & (pos < length) THEN
137
        IF forward THEN
138
            WHILE (pos < length) & (s[pos] # c) DO
139
                INC(pos)
140
            END;
141
            IF pos = length THEN
142
                pos := -1
143
            END
144
        ELSE
145
            WHILE (pos >= 0) & (s[pos] # c) DO
146
                DEC(pos)
147
            END
148
        END
149
    ELSE
150
        pos := -1
151
    END
152
END search;
153
 
154
 
155
PROCEDURE letter* (c: CHAR): BOOLEAN;
156
    RETURN ("a" <= c) & (c <= "z") OR ("A" <= c) & (c <= "Z") OR (c = "_")
157
END letter;
158
 
159
 
160
PROCEDURE digit* (c: CHAR): BOOLEAN;
161
    RETURN ("0" <= c) & (c <= "9")
162
END digit;
163
 
164
 
165
PROCEDURE hexdigit* (c: CHAR): BOOLEAN;
166
    RETURN ("0" <= c) & (c <= "9") OR ("A" <= c) & (c <= "F")
167
END hexdigit;
168
 
169
 
170
PROCEDURE space* (c: CHAR): BOOLEAN;
171
    RETURN (0X < c) & (c <= 20X)
172
END space;
173
 
174
 
7983 leency 175
PROCEDURE cap (VAR c: CHAR);
176
BEGIN
177
    IF ("a" <= c) & (c <= "z") THEN
178
        c := CHR(ORD(c) - 32)
179
    END
180
END cap;
181
 
182
 
183
PROCEDURE UpCase* (VAR str: ARRAY OF CHAR);
184
VAR
185
    i: INTEGER;
186
 
187
BEGIN
188
    i := 0;
189
    WHILE (i < LEN(str)) & (str[i] # 0X) DO
190
        cap(str[i]);
191
        INC(i)
192
    END
193
END UpCase;
194
 
195
 
7597 akron1 196
PROCEDURE StrToInt* (str: ARRAY OF CHAR; VAR x: INTEGER): BOOLEAN;
197
VAR
198
    i, k: INTEGER;
199
    res: BOOLEAN;
200
 
201
BEGIN
202
    res := TRUE;
203
    i := 0;
204
    x := 0;
205
    k := LENGTH(str);
206
    WHILE i < k DO
207
        IF digit(str[i]) THEN
208
            x := x * 10 + ORD(str[i]) - ORD("0")
209
        ELSE
210
            i := k;
211
            res := FALSE
212
        END;
213
        INC(i)
214
    END
215
 
216
    RETURN res
217
END StrToInt;
218
 
219
 
220
PROCEDURE CheckVer (str: ARRAY OF CHAR): BOOLEAN;
221
VAR
222
    i, k: INTEGER;
223
    res: BOOLEAN;
224
 
225
BEGIN
226
    k := LENGTH(str);
227
    res := k < LEN(str);
228
 
229
    IF res & digit(str[0]) THEN
230
        i := 0;
231
        WHILE (i < k) & digit(str[i]) DO
232
            INC(i)
233
        END;
234
        IF (i < k) & (str[i] = ".") THEN
235
            INC(i);
236
            IF i < k THEN
237
                WHILE (i < k) & digit(str[i]) DO
238
                    INC(i)
239
                END
240
            ELSE
241
                res := FALSE
242
            END
243
        ELSE
244
            res := FALSE
245
        END;
246
 
247
        res := res & (i = k)
248
    ELSE
249
        res := FALSE
250
    END
251
 
252
    RETURN res
253
END CheckVer;
254
 
255
 
256
PROCEDURE StrToVer* (str: ARRAY OF CHAR; VAR major, minor: INTEGER): BOOLEAN;
257
VAR
258
    i: INTEGER;
259
    res: BOOLEAN;
260
 
261
BEGIN
262
    res := CheckVer(str);
263
 
264
    IF res THEN
265
        i := 0;
266
        minor := 0;
267
        major := 0;
268
        WHILE digit(str[i]) DO
269
            major := major * 10 + ORD(str[i]) - ORD("0");
270
            INC(i)
271
        END;
272
        INC(i);
273
        WHILE digit(str[i]) DO
274
            minor := minor * 10 + ORD(str[i]) - ORD("0");
275
            INC(i)
276
        END
277
    END
278
 
279
    RETURN res
280
END StrToVer;
281
 
282
 
283
PROCEDURE Utf8To16* (src: ARRAY OF CHAR; VAR dst: ARRAY OF WCHAR): INTEGER;
284
VAR
285
    i, j, u, srclen, dstlen: INTEGER;
286
    c: CHAR;
287
 
288
BEGIN
289
    srclen := LEN(src);
290
    dstlen := LEN(dst);
291
    i := 0;
292
    j := 0;
293
    WHILE (i < srclen) & (j < dstlen) & (src[i] # 0X) DO
294
        c := src[i];
295
        CASE c OF
296
        |00X..7FX:
297
            u := ORD(c)
298
 
299
        |0C1X..0DFX:
7983 leency 300
            u := (ORD(c) - 0C0H) * 64;
7597 akron1 301
            IF i + 1 < srclen THEN
7667 akron1 302
                INC(i);
7983 leency 303
                INC(u, ORD(src[i]) MOD 64)
7597 akron1 304
            END
305
 
306
        |0E1X..0EFX:
7983 leency 307
            u := (ORD(c) - 0E0H) * 4096;
7693 akron1 308
            IF i + 1 < srclen THEN
7667 akron1 309
                INC(i);
7983 leency 310
                INC(u, (ORD(src[i]) MOD 64) * 64)
7597 akron1 311
            END;
312
            IF i + 1 < srclen THEN
7693 akron1 313
                INC(i);
7983 leency 314
                INC(u, ORD(src[i]) MOD 64)
7597 akron1 315
            END
316
(*
317
        |0F1X..0F7X:
318
        |0F9X..0FBX:
319
        |0FDX:
320
        *)
321
        ELSE
322
        END;
323
        INC(i);
324
        dst[j] := WCHR(u);
325
        INC(j)
326
    END;
327
    IF j < dstlen THEN
328
        dst[j] := WCHR(0)
329
    END
330
 
331
    RETURN j
332
END Utf8To16;
333
 
334
 
7983 leency 335
END STRINGS.