Subversion Repositories Kolibri OS

Rev

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
3
 
7696 akron1 4
    Copyright (c) 2018-2019, 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;
16
BEGIN
17
    n1 := LENGTH(s1);
18
    n2 := LENGTH(s2);
19
 
20
    ASSERT(n1 + n2 < LEN(s1));
21
 
22
    i := 0;
23
    j := n1;
24
    WHILE i < n2 DO
25
        s1[j] := s2[i];
26
        INC(i);
27
        INC(j)
28
    END;
29
 
30
    s1[j] := 0X
31
 
32
END append;
33
 
34
 
35
PROCEDURE reverse* (VAR s: ARRAY OF CHAR);
36
VAR
37
    i, j: INTEGER;
38
    a, b: CHAR;
39
 
40
BEGIN
41
 
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
 
175
PROCEDURE StrToInt* (str: ARRAY OF CHAR; VAR x: INTEGER): BOOLEAN;
176
VAR
177
    i, k: INTEGER;
178
    res: BOOLEAN;
179
 
180
BEGIN
181
    res := TRUE;
182
    i := 0;
183
    x := 0;
184
    k := LENGTH(str);
185
    WHILE i < k DO
186
        IF digit(str[i]) THEN
187
            x := x * 10 + ORD(str[i]) - ORD("0")
188
        ELSE
189
            i := k;
190
            res := FALSE
191
        END;
192
        INC(i)
193
    END
194
 
195
    RETURN res
196
END StrToInt;
197
 
198
 
199
PROCEDURE CheckVer (str: ARRAY OF CHAR): BOOLEAN;
200
VAR
201
    i, k: INTEGER;
202
    res: BOOLEAN;
203
 
204
BEGIN
205
    k := LENGTH(str);
206
    res := k < LEN(str);
207
 
208
    IF res & digit(str[0]) THEN
209
        i := 0;
210
        WHILE (i < k) & digit(str[i]) DO
211
            INC(i)
212
        END;
213
        IF (i < k) & (str[i] = ".") THEN
214
            INC(i);
215
            IF i < k THEN
216
                WHILE (i < k) & digit(str[i]) DO
217
                    INC(i)
218
                END
219
            ELSE
220
                res := FALSE
221
            END
222
        ELSE
223
            res := FALSE
224
        END;
225
 
226
        res := res & (i = k)
227
    ELSE
228
        res := FALSE
229
    END
230
 
231
    RETURN res
232
END CheckVer;
233
 
234
 
235
PROCEDURE StrToVer* (str: ARRAY OF CHAR; VAR major, minor: INTEGER): BOOLEAN;
236
VAR
237
    i: INTEGER;
238
    res: BOOLEAN;
239
 
240
BEGIN
241
    res := CheckVer(str);
242
 
243
    IF res THEN
244
        i := 0;
245
        minor := 0;
246
        major := 0;
247
        WHILE digit(str[i]) DO
248
            major := major * 10 + ORD(str[i]) - ORD("0");
249
            INC(i)
250
        END;
251
        INC(i);
252
        WHILE digit(str[i]) DO
253
            minor := minor * 10 + ORD(str[i]) - ORD("0");
254
            INC(i)
255
        END
256
    END
257
 
258
    RETURN res
259
END StrToVer;
260
 
261
 
262
PROCEDURE Utf8To16* (src: ARRAY OF CHAR; VAR dst: ARRAY OF WCHAR): INTEGER;
263
VAR
264
    i, j, u, srclen, dstlen: INTEGER;
265
    c: CHAR;
266
 
267
BEGIN
268
    srclen := LEN(src);
269
    dstlen := LEN(dst);
270
    i := 0;
271
    j := 0;
272
    WHILE (i < srclen) & (j < dstlen) & (src[i] # 0X) DO
273
        c := src[i];
274
        CASE c OF
275
        |00X..7FX:
276
            u := ORD(c)
277
 
278
        |0C1X..0DFX:
279
            u := LSL(ORD(c) - 0C0H, 6);
280
            IF i + 1 < srclen THEN
7667 akron1 281
                INC(i);
282
                INC(u, ORD(BITS(ORD(src[i])) * {0..5}))
7597 akron1 283
            END
284
 
285
        |0E1X..0EFX:
286
            u := LSL(ORD(c) - 0E0H, 12);
7693 akron1 287
            IF i + 1 < srclen THEN
7667 akron1 288
                INC(i);
289
                INC(u, ORD(BITS(ORD(src[i])) * {0..5}) * 64)
7597 akron1 290
            END;
291
            IF i + 1 < srclen THEN
7693 akron1 292
                INC(i);
7667 akron1 293
                INC(u, ORD(BITS(ORD(src[i])) * {0..5}))
7597 akron1 294
            END
295
(*
296
        |0F1X..0F7X:
297
        |0F9X..0FBX:
298
        |0FDX:
299
        *)
300
        ELSE
301
        END;
302
        INC(i);
303
        dst[j] := WCHR(u);
304
        INC(j)
305
    END;
306
    IF j < dstlen THEN
307
        dst[j] := WCHR(0)
308
    END
309
 
310
    RETURN j
311
END Utf8To16;
312
 
313
 
7696 akron1 314
END STRINGS.