1 | /* |
2 | * This Source Code Form is subject to the terms of the Mozilla Public |
3 | * License, v. 2.0. If a copy of the MPL was not distributed with this |
4 | * file, You can obtain one at http://mozilla.org/MPL/2.0/. |
5 | * |
6 | * Copyright 1997 - July 2008 CWI, August 2008 - 2019 MonetDB B.V. |
7 | */ |
8 | |
9 | /* |
10 | * N.J. Nes, M.L. Kersten |
11 | * The String Module |
12 | * Strings can be created in many ways. Already in the built-in |
13 | * operations each atom can be cast to a string using the str(atom) |
14 | * mil command. The string module gives the possibility of |
15 | * construction string as a substring of the a given string (s). There |
16 | * are two such construction functions. The first is the substring |
17 | * from some position (offset) until the end of the string. The second |
18 | * start again on the given offset position but only copies count |
19 | * number of bytes. The functions fail when the position and count |
20 | * fall out of bounds. A negative position indicates that the position |
21 | * is computed from the end of the source string. |
22 | * |
23 | * The strings can be compared using the "=" and "!=" operators. |
24 | * |
25 | * The operator "+" concatenates a string and an atom. The atom will |
26 | * be converted to a string using the atom to string c function. The |
27 | * string and the result of the conversion are concatenated to form a |
28 | * new string. This string is returned. |
29 | * |
30 | * The length function returns the length of the string. The length is |
31 | * the number of characters in the string. The maximum string length |
32 | * handled by the kernel is 32-bits long. |
33 | * |
34 | * chrAt() returns the character at position index in the string |
35 | * s. The function will fail when the index is out of range. The range |
36 | * is from 0 to length(s)-1. |
37 | * |
38 | * The startsWith and endsWith functions test if the string s starts |
39 | * with or ends with the given prefix or suffix. |
40 | * |
41 | * The toLower and toUpper functions cast the string to lower or upper |
42 | * case characters. |
43 | * |
44 | * The search(str,chr) function searches for the first occurrence of a |
45 | * character from the begining of the string. The search(chr,str) |
46 | * searches for the last occurrence (or first from the end of the |
47 | * string). The last search function locates the position of first |
48 | * occurrence of the string s2 in string s. All search functions |
49 | * return -1 when the search failed. Otherwise the position is |
50 | * returned. |
51 | * |
52 | * All string functions fail when an incorrect string (NULL pointer) |
53 | * is given. In the current implementation, a fail is signaled by |
54 | * returning nil, since this facilitates the use of the string module |
55 | * in bulk operations. |
56 | * |
57 | * All functions in the module have now been converted to |
58 | * Unicode. Internally, we use UTF-8 to store strings as Unicode in |
59 | * zero-terminated byte-sequences. |
60 | */ |
61 | #include "monetdb_config.h" |
62 | #include "str.h" |
63 | #include <string.h> |
64 | |
65 | /* |
66 | * UTF-8 Handling |
67 | * UTF-8 is a way to store Unicode strings in zero-terminated byte |
68 | * sequences, which you can e.g. strcmp() with old 8-bit Latin-1 |
69 | * strcmp() functions and which then gives the same results as doing |
70 | * the strcmp() on equivalent Latin-1 and ASCII character strings |
71 | * stored in simple one-byte sequences. These characteristics make |
72 | * UTF-8 an attractive format for upgrading an ASCII-oriented computer |
73 | * program towards one that supports Unicode. That is why we use UTF-8 |
74 | * in MonetDB. |
75 | * |
76 | * For MonetDB, UTF-8 mostly has no consequences, as strings stored in |
77 | * BATs are regarded as data, and it does not matter for the database |
78 | * kernel whether the zero-terminated byte sequence it is processing |
79 | * has UTF-8 or Latin-1 semantics. This module is the only place where |
80 | * explicit string functionality is located. We {\bf do} have to adapt |
81 | * the behavior of the length(), search(), substring() and the |
82 | * like commands to the fact that one (Unicode) character is now |
83 | * stored in a variable number of bytes (possibly > 1). |
84 | * |
85 | * One of the things that become more complex in Unicode are |
86 | * uppercase/lowercase conversions. The below tables are the simple |
87 | * one-to-one Unicode case mappings. We do not support the special |
88 | * casing mappings (e.g. from one to two letters). |
89 | * |
90 | * References: |
91 | * simple casing: http://www.unicode.org/Public/UNIDATA/UnicodeData.txt |
92 | * complex casing: http://www.unicode.org/Public/UNIDATA/SpecialCasing.txt |
93 | * |
94 | * The Unicode case conversion implementation in MonetDB fills a |
95 | * mapping BAT of int,int combinations, in which we perform |
96 | * high-performance hash-lookup (all code inlined). |
97 | */ |
98 | |
99 | /* These tables were generated from the Unicode 10.0.0 spec. */ |
100 | struct UTF8_lower_upper { |
101 | unsigned int from, to; |
102 | } UTF8_toUpper[] = { /* code points with non-null uppercase conversion */ |
103 | { 0x0061, 0x0041, }, |
104 | { 0x0062, 0x0042, }, |
105 | { 0x0063, 0x0043, }, |
106 | { 0x0064, 0x0044, }, |
107 | { 0x0065, 0x0045, }, |
108 | { 0x0066, 0x0046, }, |
109 | { 0x0067, 0x0047, }, |
110 | { 0x0068, 0x0048, }, |
111 | { 0x0069, 0x0049, }, |
112 | { 0x006A, 0x004A, }, |
113 | { 0x006B, 0x004B, }, |
114 | { 0x006C, 0x004C, }, |
115 | { 0x006D, 0x004D, }, |
116 | { 0x006E, 0x004E, }, |
117 | { 0x006F, 0x004F, }, |
118 | { 0x0070, 0x0050, }, |
119 | { 0x0071, 0x0051, }, |
120 | { 0x0072, 0x0052, }, |
121 | { 0x0073, 0x0053, }, |
122 | { 0x0074, 0x0054, }, |
123 | { 0x0075, 0x0055, }, |
124 | { 0x0076, 0x0056, }, |
125 | { 0x0077, 0x0057, }, |
126 | { 0x0078, 0x0058, }, |
127 | { 0x0079, 0x0059, }, |
128 | { 0x007A, 0x005A, }, |
129 | { 0x00B5, 0x039C, }, |
130 | { 0x00E0, 0x00C0, }, |
131 | { 0x00E1, 0x00C1, }, |
132 | { 0x00E2, 0x00C2, }, |
133 | { 0x00E3, 0x00C3, }, |
134 | { 0x00E4, 0x00C4, }, |
135 | { 0x00E5, 0x00C5, }, |
136 | { 0x00E6, 0x00C6, }, |
137 | { 0x00E7, 0x00C7, }, |
138 | { 0x00E8, 0x00C8, }, |
139 | { 0x00E9, 0x00C9, }, |
140 | { 0x00EA, 0x00CA, }, |
141 | { 0x00EB, 0x00CB, }, |
142 | { 0x00EC, 0x00CC, }, |
143 | { 0x00ED, 0x00CD, }, |
144 | { 0x00EE, 0x00CE, }, |
145 | { 0x00EF, 0x00CF, }, |
146 | { 0x00F0, 0x00D0, }, |
147 | { 0x00F1, 0x00D1, }, |
148 | { 0x00F2, 0x00D2, }, |
149 | { 0x00F3, 0x00D3, }, |
150 | { 0x00F4, 0x00D4, }, |
151 | { 0x00F5, 0x00D5, }, |
152 | { 0x00F6, 0x00D6, }, |
153 | { 0x00F8, 0x00D8, }, |
154 | { 0x00F9, 0x00D9, }, |
155 | { 0x00FA, 0x00DA, }, |
156 | { 0x00FB, 0x00DB, }, |
157 | { 0x00FC, 0x00DC, }, |
158 | { 0x00FD, 0x00DD, }, |
159 | { 0x00FE, 0x00DE, }, |
160 | { 0x00FF, 0x0178, }, |
161 | { 0x0101, 0x0100, }, |
162 | { 0x0103, 0x0102, }, |
163 | { 0x0105, 0x0104, }, |
164 | { 0x0107, 0x0106, }, |
165 | { 0x0109, 0x0108, }, |
166 | { 0x010B, 0x010A, }, |
167 | { 0x010D, 0x010C, }, |
168 | { 0x010F, 0x010E, }, |
169 | { 0x0111, 0x0110, }, |
170 | { 0x0113, 0x0112, }, |
171 | { 0x0115, 0x0114, }, |
172 | { 0x0117, 0x0116, }, |
173 | { 0x0119, 0x0118, }, |
174 | { 0x011B, 0x011A, }, |
175 | { 0x011D, 0x011C, }, |
176 | { 0x011F, 0x011E, }, |
177 | { 0x0121, 0x0120, }, |
178 | { 0x0123, 0x0122, }, |
179 | { 0x0125, 0x0124, }, |
180 | { 0x0127, 0x0126, }, |
181 | { 0x0129, 0x0128, }, |
182 | { 0x012B, 0x012A, }, |
183 | { 0x012D, 0x012C, }, |
184 | { 0x012F, 0x012E, }, |
185 | { 0x0131, 0x0049, }, |
186 | { 0x0133, 0x0132, }, |
187 | { 0x0135, 0x0134, }, |
188 | { 0x0137, 0x0136, }, |
189 | { 0x013A, 0x0139, }, |
190 | { 0x013C, 0x013B, }, |
191 | { 0x013E, 0x013D, }, |
192 | { 0x0140, 0x013F, }, |
193 | { 0x0142, 0x0141, }, |
194 | { 0x0144, 0x0143, }, |
195 | { 0x0146, 0x0145, }, |
196 | { 0x0148, 0x0147, }, |
197 | { 0x014B, 0x014A, }, |
198 | { 0x014D, 0x014C, }, |
199 | { 0x014F, 0x014E, }, |
200 | { 0x0151, 0x0150, }, |
201 | { 0x0153, 0x0152, }, |
202 | { 0x0155, 0x0154, }, |
203 | { 0x0157, 0x0156, }, |
204 | { 0x0159, 0x0158, }, |
205 | { 0x015B, 0x015A, }, |
206 | { 0x015D, 0x015C, }, |
207 | { 0x015F, 0x015E, }, |
208 | { 0x0161, 0x0160, }, |
209 | { 0x0163, 0x0162, }, |
210 | { 0x0165, 0x0164, }, |
211 | { 0x0167, 0x0166, }, |
212 | { 0x0169, 0x0168, }, |
213 | { 0x016B, 0x016A, }, |
214 | { 0x016D, 0x016C, }, |
215 | { 0x016F, 0x016E, }, |
216 | { 0x0171, 0x0170, }, |
217 | { 0x0173, 0x0172, }, |
218 | { 0x0175, 0x0174, }, |
219 | { 0x0177, 0x0176, }, |
220 | { 0x017A, 0x0179, }, |
221 | { 0x017C, 0x017B, }, |
222 | { 0x017E, 0x017D, }, |
223 | { 0x017F, 0x0053, }, |
224 | { 0x0180, 0x0243, }, |
225 | { 0x0183, 0x0182, }, |
226 | { 0x0185, 0x0184, }, |
227 | { 0x0188, 0x0187, }, |
228 | { 0x018C, 0x018B, }, |
229 | { 0x0192, 0x0191, }, |
230 | { 0x0195, 0x01F6, }, |
231 | { 0x0199, 0x0198, }, |
232 | { 0x019A, 0x023D, }, |
233 | { 0x019E, 0x0220, }, |
234 | { 0x01A1, 0x01A0, }, |
235 | { 0x01A3, 0x01A2, }, |
236 | { 0x01A5, 0x01A4, }, |
237 | { 0x01A8, 0x01A7, }, |
238 | { 0x01AD, 0x01AC, }, |
239 | { 0x01B0, 0x01AF, }, |
240 | { 0x01B4, 0x01B3, }, |
241 | { 0x01B6, 0x01B5, }, |
242 | { 0x01B9, 0x01B8, }, |
243 | { 0x01BD, 0x01BC, }, |
244 | { 0x01BF, 0x01F7, }, |
245 | { 0x01C5, 0x01C4, }, |
246 | { 0x01C6, 0x01C4, }, |
247 | { 0x01C8, 0x01C7, }, |
248 | { 0x01C9, 0x01C7, }, |
249 | { 0x01CB, 0x01CA, }, |
250 | { 0x01CC, 0x01CA, }, |
251 | { 0x01CE, 0x01CD, }, |
252 | { 0x01D0, 0x01CF, }, |
253 | { 0x01D2, 0x01D1, }, |
254 | { 0x01D4, 0x01D3, }, |
255 | { 0x01D6, 0x01D5, }, |
256 | { 0x01D8, 0x01D7, }, |
257 | { 0x01DA, 0x01D9, }, |
258 | { 0x01DC, 0x01DB, }, |
259 | { 0x01DD, 0x018E, }, |
260 | { 0x01DF, 0x01DE, }, |
261 | { 0x01E1, 0x01E0, }, |
262 | { 0x01E3, 0x01E2, }, |
263 | { 0x01E5, 0x01E4, }, |
264 | { 0x01E7, 0x01E6, }, |
265 | { 0x01E9, 0x01E8, }, |
266 | { 0x01EB, 0x01EA, }, |
267 | { 0x01ED, 0x01EC, }, |
268 | { 0x01EF, 0x01EE, }, |
269 | { 0x01F2, 0x01F1, }, |
270 | { 0x01F3, 0x01F1, }, |
271 | { 0x01F5, 0x01F4, }, |
272 | { 0x01F9, 0x01F8, }, |
273 | { 0x01FB, 0x01FA, }, |
274 | { 0x01FD, 0x01FC, }, |
275 | { 0x01FF, 0x01FE, }, |
276 | { 0x0201, 0x0200, }, |
277 | { 0x0203, 0x0202, }, |
278 | { 0x0205, 0x0204, }, |
279 | { 0x0207, 0x0206, }, |
280 | { 0x0209, 0x0208, }, |
281 | { 0x020B, 0x020A, }, |
282 | { 0x020D, 0x020C, }, |
283 | { 0x020F, 0x020E, }, |
284 | { 0x0211, 0x0210, }, |
285 | { 0x0213, 0x0212, }, |
286 | { 0x0215, 0x0214, }, |
287 | { 0x0217, 0x0216, }, |
288 | { 0x0219, 0x0218, }, |
289 | { 0x021B, 0x021A, }, |
290 | { 0x021D, 0x021C, }, |
291 | { 0x021F, 0x021E, }, |
292 | { 0x0223, 0x0222, }, |
293 | { 0x0225, 0x0224, }, |
294 | { 0x0227, 0x0226, }, |
295 | { 0x0229, 0x0228, }, |
296 | { 0x022B, 0x022A, }, |
297 | { 0x022D, 0x022C, }, |
298 | { 0x022F, 0x022E, }, |
299 | { 0x0231, 0x0230, }, |
300 | { 0x0233, 0x0232, }, |
301 | { 0x023C, 0x023B, }, |
302 | { 0x023F, 0x2C7E, }, |
303 | { 0x0240, 0x2C7F, }, |
304 | { 0x0242, 0x0241, }, |
305 | { 0x0247, 0x0246, }, |
306 | { 0x0249, 0x0248, }, |
307 | { 0x024B, 0x024A, }, |
308 | { 0x024D, 0x024C, }, |
309 | { 0x024F, 0x024E, }, |
310 | { 0x0250, 0x2C6F, }, |
311 | { 0x0251, 0x2C6D, }, |
312 | { 0x0252, 0x2C70, }, |
313 | { 0x0253, 0x0181, }, |
314 | { 0x0254, 0x0186, }, |
315 | { 0x0256, 0x0189, }, |
316 | { 0x0257, 0x018A, }, |
317 | { 0x0259, 0x018F, }, |
318 | { 0x025B, 0x0190, }, |
319 | { 0x025C, 0xA7AB, }, |
320 | { 0x0260, 0x0193, }, |
321 | { 0x0261, 0xA7AC, }, |
322 | { 0x0263, 0x0194, }, |
323 | { 0x0265, 0xA78D, }, |
324 | { 0x0266, 0xA7AA, }, |
325 | { 0x0268, 0x0197, }, |
326 | { 0x0269, 0x0196, }, |
327 | { 0x026A, 0xA7AE, }, |
328 | { 0x026B, 0x2C62, }, |
329 | { 0x026C, 0xA7AD, }, |
330 | { 0x026F, 0x019C, }, |
331 | { 0x0271, 0x2C6E, }, |
332 | { 0x0272, 0x019D, }, |
333 | { 0x0275, 0x019F, }, |
334 | { 0x027D, 0x2C64, }, |
335 | { 0x0280, 0x01A6, }, |
336 | { 0x0283, 0x01A9, }, |
337 | { 0x0287, 0xA7B1, }, |
338 | { 0x0288, 0x01AE, }, |
339 | { 0x0289, 0x0244, }, |
340 | { 0x028A, 0x01B1, }, |
341 | { 0x028B, 0x01B2, }, |
342 | { 0x028C, 0x0245, }, |
343 | { 0x0292, 0x01B7, }, |
344 | { 0x029D, 0xA7B2, }, |
345 | { 0x029E, 0xA7B0, }, |
346 | { 0x0345, 0x0399, }, |
347 | { 0x0371, 0x0370, }, |
348 | { 0x0373, 0x0372, }, |
349 | { 0x0377, 0x0376, }, |
350 | { 0x037B, 0x03FD, }, |
351 | { 0x037C, 0x03FE, }, |
352 | { 0x037D, 0x03FF, }, |
353 | { 0x03AC, 0x0386, }, |
354 | { 0x03AD, 0x0388, }, |
355 | { 0x03AE, 0x0389, }, |
356 | { 0x03AF, 0x038A, }, |
357 | { 0x03B1, 0x0391, }, |
358 | { 0x03B2, 0x0392, }, |
359 | { 0x03B3, 0x0393, }, |
360 | { 0x03B4, 0x0394, }, |
361 | { 0x03B5, 0x0395, }, |
362 | { 0x03B6, 0x0396, }, |
363 | { 0x03B7, 0x0397, }, |
364 | { 0x03B8, 0x0398, }, |
365 | { 0x03B9, 0x0399, }, |
366 | { 0x03BA, 0x039A, }, |
367 | { 0x03BB, 0x039B, }, |
368 | { 0x03BC, 0x039C, }, |
369 | { 0x03BD, 0x039D, }, |
370 | { 0x03BE, 0x039E, }, |
371 | { 0x03BF, 0x039F, }, |
372 | { 0x03C0, 0x03A0, }, |
373 | { 0x03C1, 0x03A1, }, |
374 | { 0x03C2, 0x03A3, }, |
375 | { 0x03C3, 0x03A3, }, |
376 | { 0x03C4, 0x03A4, }, |
377 | { 0x03C5, 0x03A5, }, |
378 | { 0x03C6, 0x03A6, }, |
379 | { 0x03C7, 0x03A7, }, |
380 | { 0x03C8, 0x03A8, }, |
381 | { 0x03C9, 0x03A9, }, |
382 | { 0x03CA, 0x03AA, }, |
383 | { 0x03CB, 0x03AB, }, |
384 | { 0x03CC, 0x038C, }, |
385 | { 0x03CD, 0x038E, }, |
386 | { 0x03CE, 0x038F, }, |
387 | { 0x03D0, 0x0392, }, |
388 | { 0x03D1, 0x0398, }, |
389 | { 0x03D5, 0x03A6, }, |
390 | { 0x03D6, 0x03A0, }, |
391 | { 0x03D7, 0x03CF, }, |
392 | { 0x03D9, 0x03D8, }, |
393 | { 0x03DB, 0x03DA, }, |
394 | { 0x03DD, 0x03DC, }, |
395 | { 0x03DF, 0x03DE, }, |
396 | { 0x03E1, 0x03E0, }, |
397 | { 0x03E3, 0x03E2, }, |
398 | { 0x03E5, 0x03E4, }, |
399 | { 0x03E7, 0x03E6, }, |
400 | { 0x03E9, 0x03E8, }, |
401 | { 0x03EB, 0x03EA, }, |
402 | { 0x03ED, 0x03EC, }, |
403 | { 0x03EF, 0x03EE, }, |
404 | { 0x03F0, 0x039A, }, |
405 | { 0x03F1, 0x03A1, }, |
406 | { 0x03F2, 0x03F9, }, |
407 | { 0x03F3, 0x037F, }, |
408 | { 0x03F5, 0x0395, }, |
409 | { 0x03F8, 0x03F7, }, |
410 | { 0x03FB, 0x03FA, }, |
411 | { 0x0430, 0x0410, }, |
412 | { 0x0431, 0x0411, }, |
413 | { 0x0432, 0x0412, }, |
414 | { 0x0433, 0x0413, }, |
415 | { 0x0434, 0x0414, }, |
416 | { 0x0435, 0x0415, }, |
417 | { 0x0436, 0x0416, }, |
418 | { 0x0437, 0x0417, }, |
419 | { 0x0438, 0x0418, }, |
420 | { 0x0439, 0x0419, }, |
421 | { 0x043A, 0x041A, }, |
422 | { 0x043B, 0x041B, }, |
423 | { 0x043C, 0x041C, }, |
424 | { 0x043D, 0x041D, }, |
425 | { 0x043E, 0x041E, }, |
426 | { 0x043F, 0x041F, }, |
427 | { 0x0440, 0x0420, }, |
428 | { 0x0441, 0x0421, }, |
429 | { 0x0442, 0x0422, }, |
430 | { 0x0443, 0x0423, }, |
431 | { 0x0444, 0x0424, }, |
432 | { 0x0445, 0x0425, }, |
433 | { 0x0446, 0x0426, }, |
434 | { 0x0447, 0x0427, }, |
435 | { 0x0448, 0x0428, }, |
436 | { 0x0449, 0x0429, }, |
437 | { 0x044A, 0x042A, }, |
438 | { 0x044B, 0x042B, }, |
439 | { 0x044C, 0x042C, }, |
440 | { 0x044D, 0x042D, }, |
441 | { 0x044E, 0x042E, }, |
442 | { 0x044F, 0x042F, }, |
443 | { 0x0450, 0x0400, }, |
444 | { 0x0451, 0x0401, }, |
445 | { 0x0452, 0x0402, }, |
446 | { 0x0453, 0x0403, }, |
447 | { 0x0454, 0x0404, }, |
448 | { 0x0455, 0x0405, }, |
449 | { 0x0456, 0x0406, }, |
450 | { 0x0457, 0x0407, }, |
451 | { 0x0458, 0x0408, }, |
452 | { 0x0459, 0x0409, }, |
453 | { 0x045A, 0x040A, }, |
454 | { 0x045B, 0x040B, }, |
455 | { 0x045C, 0x040C, }, |
456 | { 0x045D, 0x040D, }, |
457 | { 0x045E, 0x040E, }, |
458 | { 0x045F, 0x040F, }, |
459 | { 0x0461, 0x0460, }, |
460 | { 0x0463, 0x0462, }, |
461 | { 0x0465, 0x0464, }, |
462 | { 0x0467, 0x0466, }, |
463 | { 0x0469, 0x0468, }, |
464 | { 0x046B, 0x046A, }, |
465 | { 0x046D, 0x046C, }, |
466 | { 0x046F, 0x046E, }, |
467 | { 0x0471, 0x0470, }, |
468 | { 0x0473, 0x0472, }, |
469 | { 0x0475, 0x0474, }, |
470 | { 0x0477, 0x0476, }, |
471 | { 0x0479, 0x0478, }, |
472 | { 0x047B, 0x047A, }, |
473 | { 0x047D, 0x047C, }, |
474 | { 0x047F, 0x047E, }, |
475 | { 0x0481, 0x0480, }, |
476 | { 0x048B, 0x048A, }, |
477 | { 0x048D, 0x048C, }, |
478 | { 0x048F, 0x048E, }, |
479 | { 0x0491, 0x0490, }, |
480 | { 0x0493, 0x0492, }, |
481 | { 0x0495, 0x0494, }, |
482 | { 0x0497, 0x0496, }, |
483 | { 0x0499, 0x0498, }, |
484 | { 0x049B, 0x049A, }, |
485 | { 0x049D, 0x049C, }, |
486 | { 0x049F, 0x049E, }, |
487 | { 0x04A1, 0x04A0, }, |
488 | { 0x04A3, 0x04A2, }, |
489 | { 0x04A5, 0x04A4, }, |
490 | { 0x04A7, 0x04A6, }, |
491 | { 0x04A9, 0x04A8, }, |
492 | { 0x04AB, 0x04AA, }, |
493 | { 0x04AD, 0x04AC, }, |
494 | { 0x04AF, 0x04AE, }, |
495 | { 0x04B1, 0x04B0, }, |
496 | { 0x04B3, 0x04B2, }, |
497 | { 0x04B5, 0x04B4, }, |
498 | { 0x04B7, 0x04B6, }, |
499 | { 0x04B9, 0x04B8, }, |
500 | { 0x04BB, 0x04BA, }, |
501 | { 0x04BD, 0x04BC, }, |
502 | { 0x04BF, 0x04BE, }, |
503 | { 0x04C2, 0x04C1, }, |
504 | { 0x04C4, 0x04C3, }, |
505 | { 0x04C6, 0x04C5, }, |
506 | { 0x04C8, 0x04C7, }, |
507 | { 0x04CA, 0x04C9, }, |
508 | { 0x04CC, 0x04CB, }, |
509 | { 0x04CE, 0x04CD, }, |
510 | { 0x04CF, 0x04C0, }, |
511 | { 0x04D1, 0x04D0, }, |
512 | { 0x04D3, 0x04D2, }, |
513 | { 0x04D5, 0x04D4, }, |
514 | { 0x04D7, 0x04D6, }, |
515 | { 0x04D9, 0x04D8, }, |
516 | { 0x04DB, 0x04DA, }, |
517 | { 0x04DD, 0x04DC, }, |
518 | { 0x04DF, 0x04DE, }, |
519 | { 0x04E1, 0x04E0, }, |
520 | { 0x04E3, 0x04E2, }, |
521 | { 0x04E5, 0x04E4, }, |
522 | { 0x04E7, 0x04E6, }, |
523 | { 0x04E9, 0x04E8, }, |
524 | { 0x04EB, 0x04EA, }, |
525 | { 0x04ED, 0x04EC, }, |
526 | { 0x04EF, 0x04EE, }, |
527 | { 0x04F1, 0x04F0, }, |
528 | { 0x04F3, 0x04F2, }, |
529 | { 0x04F5, 0x04F4, }, |
530 | { 0x04F7, 0x04F6, }, |
531 | { 0x04F9, 0x04F8, }, |
532 | { 0x04FB, 0x04FA, }, |
533 | { 0x04FD, 0x04FC, }, |
534 | { 0x04FF, 0x04FE, }, |
535 | { 0x0501, 0x0500, }, |
536 | { 0x0503, 0x0502, }, |
537 | { 0x0505, 0x0504, }, |
538 | { 0x0507, 0x0506, }, |
539 | { 0x0509, 0x0508, }, |
540 | { 0x050B, 0x050A, }, |
541 | { 0x050D, 0x050C, }, |
542 | { 0x050F, 0x050E, }, |
543 | { 0x0511, 0x0510, }, |
544 | { 0x0513, 0x0512, }, |
545 | { 0x0515, 0x0514, }, |
546 | { 0x0517, 0x0516, }, |
547 | { 0x0519, 0x0518, }, |
548 | { 0x051B, 0x051A, }, |
549 | { 0x051D, 0x051C, }, |
550 | { 0x051F, 0x051E, }, |
551 | { 0x0521, 0x0520, }, |
552 | { 0x0523, 0x0522, }, |
553 | { 0x0525, 0x0524, }, |
554 | { 0x0527, 0x0526, }, |
555 | { 0x0529, 0x0528, }, |
556 | { 0x052B, 0x052A, }, |
557 | { 0x052D, 0x052C, }, |
558 | { 0x052F, 0x052E, }, |
559 | { 0x0561, 0x0531, }, |
560 | { 0x0562, 0x0532, }, |
561 | { 0x0563, 0x0533, }, |
562 | { 0x0564, 0x0534, }, |
563 | { 0x0565, 0x0535, }, |
564 | { 0x0566, 0x0536, }, |
565 | { 0x0567, 0x0537, }, |
566 | { 0x0568, 0x0538, }, |
567 | { 0x0569, 0x0539, }, |
568 | { 0x056A, 0x053A, }, |
569 | { 0x056B, 0x053B, }, |
570 | { 0x056C, 0x053C, }, |
571 | { 0x056D, 0x053D, }, |
572 | { 0x056E, 0x053E, }, |
573 | { 0x056F, 0x053F, }, |
574 | { 0x0570, 0x0540, }, |
575 | { 0x0571, 0x0541, }, |
576 | { 0x0572, 0x0542, }, |
577 | { 0x0573, 0x0543, }, |
578 | { 0x0574, 0x0544, }, |
579 | { 0x0575, 0x0545, }, |
580 | { 0x0576, 0x0546, }, |
581 | { 0x0577, 0x0547, }, |
582 | { 0x0578, 0x0548, }, |
583 | { 0x0579, 0x0549, }, |
584 | { 0x057A, 0x054A, }, |
585 | { 0x057B, 0x054B, }, |
586 | { 0x057C, 0x054C, }, |
587 | { 0x057D, 0x054D, }, |
588 | { 0x057E, 0x054E, }, |
589 | { 0x057F, 0x054F, }, |
590 | { 0x0580, 0x0550, }, |
591 | { 0x0581, 0x0551, }, |
592 | { 0x0582, 0x0552, }, |
593 | { 0x0583, 0x0553, }, |
594 | { 0x0584, 0x0554, }, |
595 | { 0x0585, 0x0555, }, |
596 | { 0x0586, 0x0556, }, |
597 | { 0x13F8, 0x13F0, }, |
598 | { 0x13F9, 0x13F1, }, |
599 | { 0x13FA, 0x13F2, }, |
600 | { 0x13FB, 0x13F3, }, |
601 | { 0x13FC, 0x13F4, }, |
602 | { 0x13FD, 0x13F5, }, |
603 | { 0x1C80, 0x0412, }, |
604 | { 0x1C81, 0x0414, }, |
605 | { 0x1C82, 0x041E, }, |
606 | { 0x1C83, 0x0421, }, |
607 | { 0x1C84, 0x0422, }, |
608 | { 0x1C85, 0x0422, }, |
609 | { 0x1C86, 0x042A, }, |
610 | { 0x1C87, 0x0462, }, |
611 | { 0x1C88, 0xA64A, }, |
612 | { 0x1D79, 0xA77D, }, |
613 | { 0x1D7D, 0x2C63, }, |
614 | { 0x1E01, 0x1E00, }, |
615 | { 0x1E03, 0x1E02, }, |
616 | { 0x1E05, 0x1E04, }, |
617 | { 0x1E07, 0x1E06, }, |
618 | { 0x1E09, 0x1E08, }, |
619 | { 0x1E0B, 0x1E0A, }, |
620 | { 0x1E0D, 0x1E0C, }, |
621 | { 0x1E0F, 0x1E0E, }, |
622 | { 0x1E11, 0x1E10, }, |
623 | { 0x1E13, 0x1E12, }, |
624 | { 0x1E15, 0x1E14, }, |
625 | { 0x1E17, 0x1E16, }, |
626 | { 0x1E19, 0x1E18, }, |
627 | { 0x1E1B, 0x1E1A, }, |
628 | { 0x1E1D, 0x1E1C, }, |
629 | { 0x1E1F, 0x1E1E, }, |
630 | { 0x1E21, 0x1E20, }, |
631 | { 0x1E23, 0x1E22, }, |
632 | { 0x1E25, 0x1E24, }, |
633 | { 0x1E27, 0x1E26, }, |
634 | { 0x1E29, 0x1E28, }, |
635 | { 0x1E2B, 0x1E2A, }, |
636 | { 0x1E2D, 0x1E2C, }, |
637 | { 0x1E2F, 0x1E2E, }, |
638 | { 0x1E31, 0x1E30, }, |
639 | { 0x1E33, 0x1E32, }, |
640 | { 0x1E35, 0x1E34, }, |
641 | { 0x1E37, 0x1E36, }, |
642 | { 0x1E39, 0x1E38, }, |
643 | { 0x1E3B, 0x1E3A, }, |
644 | { 0x1E3D, 0x1E3C, }, |
645 | { 0x1E3F, 0x1E3E, }, |
646 | { 0x1E41, 0x1E40, }, |
647 | { 0x1E43, 0x1E42, }, |
648 | { 0x1E45, 0x1E44, }, |
649 | { 0x1E47, 0x1E46, }, |
650 | { 0x1E49, 0x1E48, }, |
651 | { 0x1E4B, 0x1E4A, }, |
652 | { 0x1E4D, 0x1E4C, }, |
653 | { 0x1E4F, 0x1E4E, }, |
654 | { 0x1E51, 0x1E50, }, |
655 | { 0x1E53, 0x1E52, }, |
656 | { 0x1E55, 0x1E54, }, |
657 | { 0x1E57, 0x1E56, }, |
658 | { 0x1E59, 0x1E58, }, |
659 | { 0x1E5B, 0x1E5A, }, |
660 | { 0x1E5D, 0x1E5C, }, |
661 | { 0x1E5F, 0x1E5E, }, |
662 | { 0x1E61, 0x1E60, }, |
663 | { 0x1E63, 0x1E62, }, |
664 | { 0x1E65, 0x1E64, }, |
665 | { 0x1E67, 0x1E66, }, |
666 | { 0x1E69, 0x1E68, }, |
667 | { 0x1E6B, 0x1E6A, }, |
668 | { 0x1E6D, 0x1E6C, }, |
669 | { 0x1E6F, 0x1E6E, }, |
670 | { 0x1E71, 0x1E70, }, |
671 | { 0x1E73, 0x1E72, }, |
672 | { 0x1E75, 0x1E74, }, |
673 | { 0x1E77, 0x1E76, }, |
674 | { 0x1E79, 0x1E78, }, |
675 | { 0x1E7B, 0x1E7A, }, |
676 | { 0x1E7D, 0x1E7C, }, |
677 | { 0x1E7F, 0x1E7E, }, |
678 | { 0x1E81, 0x1E80, }, |
679 | { 0x1E83, 0x1E82, }, |
680 | { 0x1E85, 0x1E84, }, |
681 | { 0x1E87, 0x1E86, }, |
682 | { 0x1E89, 0x1E88, }, |
683 | { 0x1E8B, 0x1E8A, }, |
684 | { 0x1E8D, 0x1E8C, }, |
685 | { 0x1E8F, 0x1E8E, }, |
686 | { 0x1E91, 0x1E90, }, |
687 | { 0x1E93, 0x1E92, }, |
688 | { 0x1E95, 0x1E94, }, |
689 | { 0x1E9B, 0x1E60, }, |
690 | { 0x1EA1, 0x1EA0, }, |
691 | { 0x1EA3, 0x1EA2, }, |
692 | { 0x1EA5, 0x1EA4, }, |
693 | { 0x1EA7, 0x1EA6, }, |
694 | { 0x1EA9, 0x1EA8, }, |
695 | { 0x1EAB, 0x1EAA, }, |
696 | { 0x1EAD, 0x1EAC, }, |
697 | { 0x1EAF, 0x1EAE, }, |
698 | { 0x1EB1, 0x1EB0, }, |
699 | { 0x1EB3, 0x1EB2, }, |
700 | { 0x1EB5, 0x1EB4, }, |
701 | { 0x1EB7, 0x1EB6, }, |
702 | { 0x1EB9, 0x1EB8, }, |
703 | { 0x1EBB, 0x1EBA, }, |
704 | { 0x1EBD, 0x1EBC, }, |
705 | { 0x1EBF, 0x1EBE, }, |
706 | { 0x1EC1, 0x1EC0, }, |
707 | { 0x1EC3, 0x1EC2, }, |
708 | { 0x1EC5, 0x1EC4, }, |
709 | { 0x1EC7, 0x1EC6, }, |
710 | { 0x1EC9, 0x1EC8, }, |
711 | { 0x1ECB, 0x1ECA, }, |
712 | { 0x1ECD, 0x1ECC, }, |
713 | { 0x1ECF, 0x1ECE, }, |
714 | { 0x1ED1, 0x1ED0, }, |
715 | { 0x1ED3, 0x1ED2, }, |
716 | { 0x1ED5, 0x1ED4, }, |
717 | { 0x1ED7, 0x1ED6, }, |
718 | { 0x1ED9, 0x1ED8, }, |
719 | { 0x1EDB, 0x1EDA, }, |
720 | { 0x1EDD, 0x1EDC, }, |
721 | { 0x1EDF, 0x1EDE, }, |
722 | { 0x1EE1, 0x1EE0, }, |
723 | { 0x1EE3, 0x1EE2, }, |
724 | { 0x1EE5, 0x1EE4, }, |
725 | { 0x1EE7, 0x1EE6, }, |
726 | { 0x1EE9, 0x1EE8, }, |
727 | { 0x1EEB, 0x1EEA, }, |
728 | { 0x1EED, 0x1EEC, }, |
729 | { 0x1EEF, 0x1EEE, }, |
730 | { 0x1EF1, 0x1EF0, }, |
731 | { 0x1EF3, 0x1EF2, }, |
732 | { 0x1EF5, 0x1EF4, }, |
733 | { 0x1EF7, 0x1EF6, }, |
734 | { 0x1EF9, 0x1EF8, }, |
735 | { 0x1EFB, 0x1EFA, }, |
736 | { 0x1EFD, 0x1EFC, }, |
737 | { 0x1EFF, 0x1EFE, }, |
738 | { 0x1F00, 0x1F08, }, |
739 | { 0x1F01, 0x1F09, }, |
740 | { 0x1F02, 0x1F0A, }, |
741 | { 0x1F03, 0x1F0B, }, |
742 | { 0x1F04, 0x1F0C, }, |
743 | { 0x1F05, 0x1F0D, }, |
744 | { 0x1F06, 0x1F0E, }, |
745 | { 0x1F07, 0x1F0F, }, |
746 | { 0x1F10, 0x1F18, }, |
747 | { 0x1F11, 0x1F19, }, |
748 | { 0x1F12, 0x1F1A, }, |
749 | { 0x1F13, 0x1F1B, }, |
750 | { 0x1F14, 0x1F1C, }, |
751 | { 0x1F15, 0x1F1D, }, |
752 | { 0x1F20, 0x1F28, }, |
753 | { 0x1F21, 0x1F29, }, |
754 | { 0x1F22, 0x1F2A, }, |
755 | { 0x1F23, 0x1F2B, }, |
756 | { 0x1F24, 0x1F2C, }, |
757 | { 0x1F25, 0x1F2D, }, |
758 | { 0x1F26, 0x1F2E, }, |
759 | { 0x1F27, 0x1F2F, }, |
760 | { 0x1F30, 0x1F38, }, |
761 | { 0x1F31, 0x1F39, }, |
762 | { 0x1F32, 0x1F3A, }, |
763 | { 0x1F33, 0x1F3B, }, |
764 | { 0x1F34, 0x1F3C, }, |
765 | { 0x1F35, 0x1F3D, }, |
766 | { 0x1F36, 0x1F3E, }, |
767 | { 0x1F37, 0x1F3F, }, |
768 | { 0x1F40, 0x1F48, }, |
769 | { 0x1F41, 0x1F49, }, |
770 | { 0x1F42, 0x1F4A, }, |
771 | { 0x1F43, 0x1F4B, }, |
772 | { 0x1F44, 0x1F4C, }, |
773 | { 0x1F45, 0x1F4D, }, |
774 | { 0x1F51, 0x1F59, }, |
775 | { 0x1F53, 0x1F5B, }, |
776 | { 0x1F55, 0x1F5D, }, |
777 | { 0x1F57, 0x1F5F, }, |
778 | { 0x1F60, 0x1F68, }, |
779 | { 0x1F61, 0x1F69, }, |
780 | { 0x1F62, 0x1F6A, }, |
781 | { 0x1F63, 0x1F6B, }, |
782 | { 0x1F64, 0x1F6C, }, |
783 | { 0x1F65, 0x1F6D, }, |
784 | { 0x1F66, 0x1F6E, }, |
785 | { 0x1F67, 0x1F6F, }, |
786 | { 0x1F70, 0x1FBA, }, |
787 | { 0x1F71, 0x1FBB, }, |
788 | { 0x1F72, 0x1FC8, }, |
789 | { 0x1F73, 0x1FC9, }, |
790 | { 0x1F74, 0x1FCA, }, |
791 | { 0x1F75, 0x1FCB, }, |
792 | { 0x1F76, 0x1FDA, }, |
793 | { 0x1F77, 0x1FDB, }, |
794 | { 0x1F78, 0x1FF8, }, |
795 | { 0x1F79, 0x1FF9, }, |
796 | { 0x1F7A, 0x1FEA, }, |
797 | { 0x1F7B, 0x1FEB, }, |
798 | { 0x1F7C, 0x1FFA, }, |
799 | { 0x1F7D, 0x1FFB, }, |
800 | { 0x1F80, 0x1F88, }, |
801 | { 0x1F81, 0x1F89, }, |
802 | { 0x1F82, 0x1F8A, }, |
803 | { 0x1F83, 0x1F8B, }, |
804 | { 0x1F84, 0x1F8C, }, |
805 | { 0x1F85, 0x1F8D, }, |
806 | { 0x1F86, 0x1F8E, }, |
807 | { 0x1F87, 0x1F8F, }, |
808 | { 0x1F90, 0x1F98, }, |
809 | { 0x1F91, 0x1F99, }, |
810 | { 0x1F92, 0x1F9A, }, |
811 | { 0x1F93, 0x1F9B, }, |
812 | { 0x1F94, 0x1F9C, }, |
813 | { 0x1F95, 0x1F9D, }, |
814 | { 0x1F96, 0x1F9E, }, |
815 | { 0x1F97, 0x1F9F, }, |
816 | { 0x1FA0, 0x1FA8, }, |
817 | { 0x1FA1, 0x1FA9, }, |
818 | { 0x1FA2, 0x1FAA, }, |
819 | { 0x1FA3, 0x1FAB, }, |
820 | { 0x1FA4, 0x1FAC, }, |
821 | { 0x1FA5, 0x1FAD, }, |
822 | { 0x1FA6, 0x1FAE, }, |
823 | { 0x1FA7, 0x1FAF, }, |
824 | { 0x1FB0, 0x1FB8, }, |
825 | { 0x1FB1, 0x1FB9, }, |
826 | { 0x1FB3, 0x1FBC, }, |
827 | { 0x1FBE, 0x0399, }, |
828 | { 0x1FC3, 0x1FCC, }, |
829 | { 0x1FD0, 0x1FD8, }, |
830 | { 0x1FD1, 0x1FD9, }, |
831 | { 0x1FE0, 0x1FE8, }, |
832 | { 0x1FE1, 0x1FE9, }, |
833 | { 0x1FE5, 0x1FEC, }, |
834 | { 0x1FF3, 0x1FFC, }, |
835 | { 0x214E, 0x2132, }, |
836 | { 0x2170, 0x2160, }, |
837 | { 0x2171, 0x2161, }, |
838 | { 0x2172, 0x2162, }, |
839 | { 0x2173, 0x2163, }, |
840 | { 0x2174, 0x2164, }, |
841 | { 0x2175, 0x2165, }, |
842 | { 0x2176, 0x2166, }, |
843 | { 0x2177, 0x2167, }, |
844 | { 0x2178, 0x2168, }, |
845 | { 0x2179, 0x2169, }, |
846 | { 0x217A, 0x216A, }, |
847 | { 0x217B, 0x216B, }, |
848 | { 0x217C, 0x216C, }, |
849 | { 0x217D, 0x216D, }, |
850 | { 0x217E, 0x216E, }, |
851 | { 0x217F, 0x216F, }, |
852 | { 0x2184, 0x2183, }, |
853 | { 0x24D0, 0x24B6, }, |
854 | { 0x24D1, 0x24B7, }, |
855 | { 0x24D2, 0x24B8, }, |
856 | { 0x24D3, 0x24B9, }, |
857 | { 0x24D4, 0x24BA, }, |
858 | { 0x24D5, 0x24BB, }, |
859 | { 0x24D6, 0x24BC, }, |
860 | { 0x24D7, 0x24BD, }, |
861 | { 0x24D8, 0x24BE, }, |
862 | { 0x24D9, 0x24BF, }, |
863 | { 0x24DA, 0x24C0, }, |
864 | { 0x24DB, 0x24C1, }, |
865 | { 0x24DC, 0x24C2, }, |
866 | { 0x24DD, 0x24C3, }, |
867 | { 0x24DE, 0x24C4, }, |
868 | { 0x24DF, 0x24C5, }, |
869 | { 0x24E0, 0x24C6, }, |
870 | { 0x24E1, 0x24C7, }, |
871 | { 0x24E2, 0x24C8, }, |
872 | { 0x24E3, 0x24C9, }, |
873 | { 0x24E4, 0x24CA, }, |
874 | { 0x24E5, 0x24CB, }, |
875 | { 0x24E6, 0x24CC, }, |
876 | { 0x24E7, 0x24CD, }, |
877 | { 0x24E8, 0x24CE, }, |
878 | { 0x24E9, 0x24CF, }, |
879 | { 0x2C30, 0x2C00, }, |
880 | { 0x2C31, 0x2C01, }, |
881 | { 0x2C32, 0x2C02, }, |
882 | { 0x2C33, 0x2C03, }, |
883 | { 0x2C34, 0x2C04, }, |
884 | { 0x2C35, 0x2C05, }, |
885 | { 0x2C36, 0x2C06, }, |
886 | { 0x2C37, 0x2C07, }, |
887 | { 0x2C38, 0x2C08, }, |
888 | { 0x2C39, 0x2C09, }, |
889 | { 0x2C3A, 0x2C0A, }, |
890 | { 0x2C3B, 0x2C0B, }, |
891 | { 0x2C3C, 0x2C0C, }, |
892 | { 0x2C3D, 0x2C0D, }, |
893 | { 0x2C3E, 0x2C0E, }, |
894 | { 0x2C3F, 0x2C0F, }, |
895 | { 0x2C40, 0x2C10, }, |
896 | { 0x2C41, 0x2C11, }, |
897 | { 0x2C42, 0x2C12, }, |
898 | { 0x2C43, 0x2C13, }, |
899 | { 0x2C44, 0x2C14, }, |
900 | { 0x2C45, 0x2C15, }, |
901 | { 0x2C46, 0x2C16, }, |
902 | { 0x2C47, 0x2C17, }, |
903 | { 0x2C48, 0x2C18, }, |
904 | { 0x2C49, 0x2C19, }, |
905 | { 0x2C4A, 0x2C1A, }, |
906 | { 0x2C4B, 0x2C1B, }, |
907 | { 0x2C4C, 0x2C1C, }, |
908 | { 0x2C4D, 0x2C1D, }, |
909 | { 0x2C4E, 0x2C1E, }, |
910 | { 0x2C4F, 0x2C1F, }, |
911 | { 0x2C50, 0x2C20, }, |
912 | { 0x2C51, 0x2C21, }, |
913 | { 0x2C52, 0x2C22, }, |
914 | { 0x2C53, 0x2C23, }, |
915 | { 0x2C54, 0x2C24, }, |
916 | { 0x2C55, 0x2C25, }, |
917 | { 0x2C56, 0x2C26, }, |
918 | { 0x2C57, 0x2C27, }, |
919 | { 0x2C58, 0x2C28, }, |
920 | { 0x2C59, 0x2C29, }, |
921 | { 0x2C5A, 0x2C2A, }, |
922 | { 0x2C5B, 0x2C2B, }, |
923 | { 0x2C5C, 0x2C2C, }, |
924 | { 0x2C5D, 0x2C2D, }, |
925 | { 0x2C5E, 0x2C2E, }, |
926 | { 0x2C61, 0x2C60, }, |
927 | { 0x2C65, 0x023A, }, |
928 | { 0x2C66, 0x023E, }, |
929 | { 0x2C68, 0x2C67, }, |
930 | { 0x2C6A, 0x2C69, }, |
931 | { 0x2C6C, 0x2C6B, }, |
932 | { 0x2C73, 0x2C72, }, |
933 | { 0x2C76, 0x2C75, }, |
934 | { 0x2C81, 0x2C80, }, |
935 | { 0x2C83, 0x2C82, }, |
936 | { 0x2C85, 0x2C84, }, |
937 | { 0x2C87, 0x2C86, }, |
938 | { 0x2C89, 0x2C88, }, |
939 | { 0x2C8B, 0x2C8A, }, |
940 | { 0x2C8D, 0x2C8C, }, |
941 | { 0x2C8F, 0x2C8E, }, |
942 | { 0x2C91, 0x2C90, }, |
943 | { 0x2C93, 0x2C92, }, |
944 | { 0x2C95, 0x2C94, }, |
945 | { 0x2C97, 0x2C96, }, |
946 | { 0x2C99, 0x2C98, }, |
947 | { 0x2C9B, 0x2C9A, }, |
948 | { 0x2C9D, 0x2C9C, }, |
949 | { 0x2C9F, 0x2C9E, }, |
950 | { 0x2CA1, 0x2CA0, }, |
951 | { 0x2CA3, 0x2CA2, }, |
952 | { 0x2CA5, 0x2CA4, }, |
953 | { 0x2CA7, 0x2CA6, }, |
954 | { 0x2CA9, 0x2CA8, }, |
955 | { 0x2CAB, 0x2CAA, }, |
956 | { 0x2CAD, 0x2CAC, }, |
957 | { 0x2CAF, 0x2CAE, }, |
958 | { 0x2CB1, 0x2CB0, }, |
959 | { 0x2CB3, 0x2CB2, }, |
960 | { 0x2CB5, 0x2CB4, }, |
961 | { 0x2CB7, 0x2CB6, }, |
962 | { 0x2CB9, 0x2CB8, }, |
963 | { 0x2CBB, 0x2CBA, }, |
964 | { 0x2CBD, 0x2CBC, }, |
965 | { 0x2CBF, 0x2CBE, }, |
966 | { 0x2CC1, 0x2CC0, }, |
967 | { 0x2CC3, 0x2CC2, }, |
968 | { 0x2CC5, 0x2CC4, }, |
969 | { 0x2CC7, 0x2CC6, }, |
970 | { 0x2CC9, 0x2CC8, }, |
971 | { 0x2CCB, 0x2CCA, }, |
972 | { 0x2CCD, 0x2CCC, }, |
973 | { 0x2CCF, 0x2CCE, }, |
974 | { 0x2CD1, 0x2CD0, }, |
975 | { 0x2CD3, 0x2CD2, }, |
976 | { 0x2CD5, 0x2CD4, }, |
977 | { 0x2CD7, 0x2CD6, }, |
978 | { 0x2CD9, 0x2CD8, }, |
979 | { 0x2CDB, 0x2CDA, }, |
980 | { 0x2CDD, 0x2CDC, }, |
981 | { 0x2CDF, 0x2CDE, }, |
982 | { 0x2CE1, 0x2CE0, }, |
983 | { 0x2CE3, 0x2CE2, }, |
984 | { 0x2CEC, 0x2CEB, }, |
985 | { 0x2CEE, 0x2CED, }, |
986 | { 0x2CF3, 0x2CF2, }, |
987 | { 0x2D00, 0x10A0, }, |
988 | { 0x2D01, 0x10A1, }, |
989 | { 0x2D02, 0x10A2, }, |
990 | { 0x2D03, 0x10A3, }, |
991 | { 0x2D04, 0x10A4, }, |
992 | { 0x2D05, 0x10A5, }, |
993 | { 0x2D06, 0x10A6, }, |
994 | { 0x2D07, 0x10A7, }, |
995 | { 0x2D08, 0x10A8, }, |
996 | { 0x2D09, 0x10A9, }, |
997 | { 0x2D0A, 0x10AA, }, |
998 | { 0x2D0B, 0x10AB, }, |
999 | { 0x2D0C, 0x10AC, }, |
1000 | { 0x2D0D, 0x10AD, }, |
1001 | { 0x2D0E, 0x10AE, }, |
1002 | { 0x2D0F, 0x10AF, }, |
1003 | { 0x2D10, 0x10B0, }, |
1004 | { 0x2D11, 0x10B1, }, |
1005 | { 0x2D12, 0x10B2, }, |
1006 | { 0x2D13, 0x10B3, }, |
1007 | { 0x2D14, 0x10B4, }, |
1008 | { 0x2D15, 0x10B5, }, |
1009 | { 0x2D16, 0x10B6, }, |
1010 | { 0x2D17, 0x10B7, }, |
1011 | { 0x2D18, 0x10B8, }, |
1012 | { 0x2D19, 0x10B9, }, |
1013 | { 0x2D1A, 0x10BA, }, |
1014 | { 0x2D1B, 0x10BB, }, |
1015 | { 0x2D1C, 0x10BC, }, |
1016 | { 0x2D1D, 0x10BD, }, |
1017 | { 0x2D1E, 0x10BE, }, |
1018 | { 0x2D1F, 0x10BF, }, |
1019 | { 0x2D20, 0x10C0, }, |
1020 | { 0x2D21, 0x10C1, }, |
1021 | { 0x2D22, 0x10C2, }, |
1022 | { 0x2D23, 0x10C3, }, |
1023 | { 0x2D24, 0x10C4, }, |
1024 | { 0x2D25, 0x10C5, }, |
1025 | { 0x2D27, 0x10C7, }, |
1026 | { 0x2D2D, 0x10CD, }, |
1027 | { 0xA641, 0xA640, }, |
1028 | { 0xA643, 0xA642, }, |
1029 | { 0xA645, 0xA644, }, |
1030 | { 0xA647, 0xA646, }, |
1031 | { 0xA649, 0xA648, }, |
1032 | { 0xA64B, 0xA64A, }, |
1033 | { 0xA64D, 0xA64C, }, |
1034 | { 0xA64F, 0xA64E, }, |
1035 | { 0xA651, 0xA650, }, |
1036 | { 0xA653, 0xA652, }, |
1037 | { 0xA655, 0xA654, }, |
1038 | { 0xA657, 0xA656, }, |
1039 | { 0xA659, 0xA658, }, |
1040 | { 0xA65B, 0xA65A, }, |
1041 | { 0xA65D, 0xA65C, }, |
1042 | { 0xA65F, 0xA65E, }, |
1043 | { 0xA661, 0xA660, }, |
1044 | { 0xA663, 0xA662, }, |
1045 | { 0xA665, 0xA664, }, |
1046 | { 0xA667, 0xA666, }, |
1047 | { 0xA669, 0xA668, }, |
1048 | { 0xA66B, 0xA66A, }, |
1049 | { 0xA66D, 0xA66C, }, |
1050 | { 0xA681, 0xA680, }, |
1051 | { 0xA683, 0xA682, }, |
1052 | { 0xA685, 0xA684, }, |
1053 | { 0xA687, 0xA686, }, |
1054 | { 0xA689, 0xA688, }, |
1055 | { 0xA68B, 0xA68A, }, |
1056 | { 0xA68D, 0xA68C, }, |
1057 | { 0xA68F, 0xA68E, }, |
1058 | { 0xA691, 0xA690, }, |
1059 | { 0xA693, 0xA692, }, |
1060 | { 0xA695, 0xA694, }, |
1061 | { 0xA697, 0xA696, }, |
1062 | { 0xA699, 0xA698, }, |
1063 | { 0xA69B, 0xA69A, }, |
1064 | { 0xA723, 0xA722, }, |
1065 | { 0xA725, 0xA724, }, |
1066 | { 0xA727, 0xA726, }, |
1067 | { 0xA729, 0xA728, }, |
1068 | { 0xA72B, 0xA72A, }, |
1069 | { 0xA72D, 0xA72C, }, |
1070 | { 0xA72F, 0xA72E, }, |
1071 | { 0xA733, 0xA732, }, |
1072 | { 0xA735, 0xA734, }, |
1073 | { 0xA737, 0xA736, }, |
1074 | { 0xA739, 0xA738, }, |
1075 | { 0xA73B, 0xA73A, }, |
1076 | { 0xA73D, 0xA73C, }, |
1077 | { 0xA73F, 0xA73E, }, |
1078 | { 0xA741, 0xA740, }, |
1079 | { 0xA743, 0xA742, }, |
1080 | { 0xA745, 0xA744, }, |
1081 | { 0xA747, 0xA746, }, |
1082 | { 0xA749, 0xA748, }, |
1083 | { 0xA74B, 0xA74A, }, |
1084 | { 0xA74D, 0xA74C, }, |
1085 | { 0xA74F, 0xA74E, }, |
1086 | { 0xA751, 0xA750, }, |
1087 | { 0xA753, 0xA752, }, |
1088 | { 0xA755, 0xA754, }, |
1089 | { 0xA757, 0xA756, }, |
1090 | { 0xA759, 0xA758, }, |
1091 | { 0xA75B, 0xA75A, }, |
1092 | { 0xA75D, 0xA75C, }, |
1093 | { 0xA75F, 0xA75E, }, |
1094 | { 0xA761, 0xA760, }, |
1095 | { 0xA763, 0xA762, }, |
1096 | { 0xA765, 0xA764, }, |
1097 | { 0xA767, 0xA766, }, |
1098 | { 0xA769, 0xA768, }, |
1099 | { 0xA76B, 0xA76A, }, |
1100 | { 0xA76D, 0xA76C, }, |
1101 | { 0xA76F, 0xA76E, }, |
1102 | { 0xA77A, 0xA779, }, |
1103 | { 0xA77C, 0xA77B, }, |
1104 | { 0xA77F, 0xA77E, }, |
1105 | { 0xA781, 0xA780, }, |
1106 | { 0xA783, 0xA782, }, |
1107 | { 0xA785, 0xA784, }, |
1108 | { 0xA787, 0xA786, }, |
1109 | { 0xA78C, 0xA78B, }, |
1110 | { 0xA791, 0xA790, }, |
1111 | { 0xA793, 0xA792, }, |
1112 | { 0xA797, 0xA796, }, |
1113 | { 0xA799, 0xA798, }, |
1114 | { 0xA79B, 0xA79A, }, |
1115 | { 0xA79D, 0xA79C, }, |
1116 | { 0xA79F, 0xA79E, }, |
1117 | { 0xA7A1, 0xA7A0, }, |
1118 | { 0xA7A3, 0xA7A2, }, |
1119 | { 0xA7A5, 0xA7A4, }, |
1120 | { 0xA7A7, 0xA7A6, }, |
1121 | { 0xA7A9, 0xA7A8, }, |
1122 | { 0xA7B5, 0xA7B4, }, |
1123 | { 0xA7B7, 0xA7B6, }, |
1124 | { 0xAB53, 0xA7B3, }, |
1125 | { 0xAB70, 0x13A0, }, |
1126 | { 0xAB71, 0x13A1, }, |
1127 | { 0xAB72, 0x13A2, }, |
1128 | { 0xAB73, 0x13A3, }, |
1129 | { 0xAB74, 0x13A4, }, |
1130 | { 0xAB75, 0x13A5, }, |
1131 | { 0xAB76, 0x13A6, }, |
1132 | { 0xAB77, 0x13A7, }, |
1133 | { 0xAB78, 0x13A8, }, |
1134 | { 0xAB79, 0x13A9, }, |
1135 | { 0xAB7A, 0x13AA, }, |
1136 | { 0xAB7B, 0x13AB, }, |
1137 | { 0xAB7C, 0x13AC, }, |
1138 | { 0xAB7D, 0x13AD, }, |
1139 | { 0xAB7E, 0x13AE, }, |
1140 | { 0xAB7F, 0x13AF, }, |
1141 | { 0xAB80, 0x13B0, }, |
1142 | { 0xAB81, 0x13B1, }, |
1143 | { 0xAB82, 0x13B2, }, |
1144 | { 0xAB83, 0x13B3, }, |
1145 | { 0xAB84, 0x13B4, }, |
1146 | { 0xAB85, 0x13B5, }, |
1147 | { 0xAB86, 0x13B6, }, |
1148 | { 0xAB87, 0x13B7, }, |
1149 | { 0xAB88, 0x13B8, }, |
1150 | { 0xAB89, 0x13B9, }, |
1151 | { 0xAB8A, 0x13BA, }, |
1152 | { 0xAB8B, 0x13BB, }, |
1153 | { 0xAB8C, 0x13BC, }, |
1154 | { 0xAB8D, 0x13BD, }, |
1155 | { 0xAB8E, 0x13BE, }, |
1156 | { 0xAB8F, 0x13BF, }, |
1157 | { 0xAB90, 0x13C0, }, |
1158 | { 0xAB91, 0x13C1, }, |
1159 | { 0xAB92, 0x13C2, }, |
1160 | { 0xAB93, 0x13C3, }, |
1161 | { 0xAB94, 0x13C4, }, |
1162 | { 0xAB95, 0x13C5, }, |
1163 | { 0xAB96, 0x13C6, }, |
1164 | { 0xAB97, 0x13C7, }, |
1165 | { 0xAB98, 0x13C8, }, |
1166 | { 0xAB99, 0x13C9, }, |
1167 | { 0xAB9A, 0x13CA, }, |
1168 | { 0xAB9B, 0x13CB, }, |
1169 | { 0xAB9C, 0x13CC, }, |
1170 | { 0xAB9D, 0x13CD, }, |
1171 | { 0xAB9E, 0x13CE, }, |
1172 | { 0xAB9F, 0x13CF, }, |
1173 | { 0xABA0, 0x13D0, }, |
1174 | { 0xABA1, 0x13D1, }, |
1175 | { 0xABA2, 0x13D2, }, |
1176 | { 0xABA3, 0x13D3, }, |
1177 | { 0xABA4, 0x13D4, }, |
1178 | { 0xABA5, 0x13D5, }, |
1179 | { 0xABA6, 0x13D6, }, |
1180 | { 0xABA7, 0x13D7, }, |
1181 | { 0xABA8, 0x13D8, }, |
1182 | { 0xABA9, 0x13D9, }, |
1183 | { 0xABAA, 0x13DA, }, |
1184 | { 0xABAB, 0x13DB, }, |
1185 | { 0xABAC, 0x13DC, }, |
1186 | { 0xABAD, 0x13DD, }, |
1187 | { 0xABAE, 0x13DE, }, |
1188 | { 0xABAF, 0x13DF, }, |
1189 | { 0xABB0, 0x13E0, }, |
1190 | { 0xABB1, 0x13E1, }, |
1191 | { 0xABB2, 0x13E2, }, |
1192 | { 0xABB3, 0x13E3, }, |
1193 | { 0xABB4, 0x13E4, }, |
1194 | { 0xABB5, 0x13E5, }, |
1195 | { 0xABB6, 0x13E6, }, |
1196 | { 0xABB7, 0x13E7, }, |
1197 | { 0xABB8, 0x13E8, }, |
1198 | { 0xABB9, 0x13E9, }, |
1199 | { 0xABBA, 0x13EA, }, |
1200 | { 0xABBB, 0x13EB, }, |
1201 | { 0xABBC, 0x13EC, }, |
1202 | { 0xABBD, 0x13ED, }, |
1203 | { 0xABBE, 0x13EE, }, |
1204 | { 0xABBF, 0x13EF, }, |
1205 | { 0xFF41, 0xFF21, }, |
1206 | { 0xFF42, 0xFF22, }, |
1207 | { 0xFF43, 0xFF23, }, |
1208 | { 0xFF44, 0xFF24, }, |
1209 | { 0xFF45, 0xFF25, }, |
1210 | { 0xFF46, 0xFF26, }, |
1211 | { 0xFF47, 0xFF27, }, |
1212 | { 0xFF48, 0xFF28, }, |
1213 | { 0xFF49, 0xFF29, }, |
1214 | { 0xFF4A, 0xFF2A, }, |
1215 | { 0xFF4B, 0xFF2B, }, |
1216 | { 0xFF4C, 0xFF2C, }, |
1217 | { 0xFF4D, 0xFF2D, }, |
1218 | { 0xFF4E, 0xFF2E, }, |
1219 | { 0xFF4F, 0xFF2F, }, |
1220 | { 0xFF50, 0xFF30, }, |
1221 | { 0xFF51, 0xFF31, }, |
1222 | { 0xFF52, 0xFF32, }, |
1223 | { 0xFF53, 0xFF33, }, |
1224 | { 0xFF54, 0xFF34, }, |
1225 | { 0xFF55, 0xFF35, }, |
1226 | { 0xFF56, 0xFF36, }, |
1227 | { 0xFF57, 0xFF37, }, |
1228 | { 0xFF58, 0xFF38, }, |
1229 | { 0xFF59, 0xFF39, }, |
1230 | { 0xFF5A, 0xFF3A, }, |
1231 | { 0x10428, 0x10400, }, |
1232 | { 0x10429, 0x10401, }, |
1233 | { 0x1042A, 0x10402, }, |
1234 | { 0x1042B, 0x10403, }, |
1235 | { 0x1042C, 0x10404, }, |
1236 | { 0x1042D, 0x10405, }, |
1237 | { 0x1042E, 0x10406, }, |
1238 | { 0x1042F, 0x10407, }, |
1239 | { 0x10430, 0x10408, }, |
1240 | { 0x10431, 0x10409, }, |
1241 | { 0x10432, 0x1040A, }, |
1242 | { 0x10433, 0x1040B, }, |
1243 | { 0x10434, 0x1040C, }, |
1244 | { 0x10435, 0x1040D, }, |
1245 | { 0x10436, 0x1040E, }, |
1246 | { 0x10437, 0x1040F, }, |
1247 | { 0x10438, 0x10410, }, |
1248 | { 0x10439, 0x10411, }, |
1249 | { 0x1043A, 0x10412, }, |
1250 | { 0x1043B, 0x10413, }, |
1251 | { 0x1043C, 0x10414, }, |
1252 | { 0x1043D, 0x10415, }, |
1253 | { 0x1043E, 0x10416, }, |
1254 | { 0x1043F, 0x10417, }, |
1255 | { 0x10440, 0x10418, }, |
1256 | { 0x10441, 0x10419, }, |
1257 | { 0x10442, 0x1041A, }, |
1258 | { 0x10443, 0x1041B, }, |
1259 | { 0x10444, 0x1041C, }, |
1260 | { 0x10445, 0x1041D, }, |
1261 | { 0x10446, 0x1041E, }, |
1262 | { 0x10447, 0x1041F, }, |
1263 | { 0x10448, 0x10420, }, |
1264 | { 0x10449, 0x10421, }, |
1265 | { 0x1044A, 0x10422, }, |
1266 | { 0x1044B, 0x10423, }, |
1267 | { 0x1044C, 0x10424, }, |
1268 | { 0x1044D, 0x10425, }, |
1269 | { 0x1044E, 0x10426, }, |
1270 | { 0x1044F, 0x10427, }, |
1271 | { 0x104D8, 0x104B0, }, |
1272 | { 0x104D9, 0x104B1, }, |
1273 | { 0x104DA, 0x104B2, }, |
1274 | { 0x104DB, 0x104B3, }, |
1275 | { 0x104DC, 0x104B4, }, |
1276 | { 0x104DD, 0x104B5, }, |
1277 | { 0x104DE, 0x104B6, }, |
1278 | { 0x104DF, 0x104B7, }, |
1279 | { 0x104E0, 0x104B8, }, |
1280 | { 0x104E1, 0x104B9, }, |
1281 | { 0x104E2, 0x104BA, }, |
1282 | { 0x104E3, 0x104BB, }, |
1283 | { 0x104E4, 0x104BC, }, |
1284 | { 0x104E5, 0x104BD, }, |
1285 | { 0x104E6, 0x104BE, }, |
1286 | { 0x104E7, 0x104BF, }, |
1287 | { 0x104E8, 0x104C0, }, |
1288 | { 0x104E9, 0x104C1, }, |
1289 | { 0x104EA, 0x104C2, }, |
1290 | { 0x104EB, 0x104C3, }, |
1291 | { 0x104EC, 0x104C4, }, |
1292 | { 0x104ED, 0x104C5, }, |
1293 | { 0x104EE, 0x104C6, }, |
1294 | { 0x104EF, 0x104C7, }, |
1295 | { 0x104F0, 0x104C8, }, |
1296 | { 0x104F1, 0x104C9, }, |
1297 | { 0x104F2, 0x104CA, }, |
1298 | { 0x104F3, 0x104CB, }, |
1299 | { 0x104F4, 0x104CC, }, |
1300 | { 0x104F5, 0x104CD, }, |
1301 | { 0x104F6, 0x104CE, }, |
1302 | { 0x104F7, 0x104CF, }, |
1303 | { 0x104F8, 0x104D0, }, |
1304 | { 0x104F9, 0x104D1, }, |
1305 | { 0x104FA, 0x104D2, }, |
1306 | { 0x104FB, 0x104D3, }, |
1307 | { 0x10CC0, 0x10C80, }, |
1308 | { 0x10CC1, 0x10C81, }, |
1309 | { 0x10CC2, 0x10C82, }, |
1310 | { 0x10CC3, 0x10C83, }, |
1311 | { 0x10CC4, 0x10C84, }, |
1312 | { 0x10CC5, 0x10C85, }, |
1313 | { 0x10CC6, 0x10C86, }, |
1314 | { 0x10CC7, 0x10C87, }, |
1315 | { 0x10CC8, 0x10C88, }, |
1316 | { 0x10CC9, 0x10C89, }, |
1317 | { 0x10CCA, 0x10C8A, }, |
1318 | { 0x10CCB, 0x10C8B, }, |
1319 | { 0x10CCC, 0x10C8C, }, |
1320 | { 0x10CCD, 0x10C8D, }, |
1321 | { 0x10CCE, 0x10C8E, }, |
1322 | { 0x10CCF, 0x10C8F, }, |
1323 | { 0x10CD0, 0x10C90, }, |
1324 | { 0x10CD1, 0x10C91, }, |
1325 | { 0x10CD2, 0x10C92, }, |
1326 | { 0x10CD3, 0x10C93, }, |
1327 | { 0x10CD4, 0x10C94, }, |
1328 | { 0x10CD5, 0x10C95, }, |
1329 | { 0x10CD6, 0x10C96, }, |
1330 | { 0x10CD7, 0x10C97, }, |
1331 | { 0x10CD8, 0x10C98, }, |
1332 | { 0x10CD9, 0x10C99, }, |
1333 | { 0x10CDA, 0x10C9A, }, |
1334 | { 0x10CDB, 0x10C9B, }, |
1335 | { 0x10CDC, 0x10C9C, }, |
1336 | { 0x10CDD, 0x10C9D, }, |
1337 | { 0x10CDE, 0x10C9E, }, |
1338 | { 0x10CDF, 0x10C9F, }, |
1339 | { 0x10CE0, 0x10CA0, }, |
1340 | { 0x10CE1, 0x10CA1, }, |
1341 | { 0x10CE2, 0x10CA2, }, |
1342 | { 0x10CE3, 0x10CA3, }, |
1343 | { 0x10CE4, 0x10CA4, }, |
1344 | { 0x10CE5, 0x10CA5, }, |
1345 | { 0x10CE6, 0x10CA6, }, |
1346 | { 0x10CE7, 0x10CA7, }, |
1347 | { 0x10CE8, 0x10CA8, }, |
1348 | { 0x10CE9, 0x10CA9, }, |
1349 | { 0x10CEA, 0x10CAA, }, |
1350 | { 0x10CEB, 0x10CAB, }, |
1351 | { 0x10CEC, 0x10CAC, }, |
1352 | { 0x10CED, 0x10CAD, }, |
1353 | { 0x10CEE, 0x10CAE, }, |
1354 | { 0x10CEF, 0x10CAF, }, |
1355 | { 0x10CF0, 0x10CB0, }, |
1356 | { 0x10CF1, 0x10CB1, }, |
1357 | { 0x10CF2, 0x10CB2, }, |
1358 | { 0x118C0, 0x118A0, }, |
1359 | { 0x118C1, 0x118A1, }, |
1360 | { 0x118C2, 0x118A2, }, |
1361 | { 0x118C3, 0x118A3, }, |
1362 | { 0x118C4, 0x118A4, }, |
1363 | { 0x118C5, 0x118A5, }, |
1364 | { 0x118C6, 0x118A6, }, |
1365 | { 0x118C7, 0x118A7, }, |
1366 | { 0x118C8, 0x118A8, }, |
1367 | { 0x118C9, 0x118A9, }, |
1368 | { 0x118CA, 0x118AA, }, |
1369 | { 0x118CB, 0x118AB, }, |
1370 | { 0x118CC, 0x118AC, }, |
1371 | { 0x118CD, 0x118AD, }, |
1372 | { 0x118CE, 0x118AE, }, |
1373 | { 0x118CF, 0x118AF, }, |
1374 | { 0x118D0, 0x118B0, }, |
1375 | { 0x118D1, 0x118B1, }, |
1376 | { 0x118D2, 0x118B2, }, |
1377 | { 0x118D3, 0x118B3, }, |
1378 | { 0x118D4, 0x118B4, }, |
1379 | { 0x118D5, 0x118B5, }, |
1380 | { 0x118D6, 0x118B6, }, |
1381 | { 0x118D7, 0x118B7, }, |
1382 | { 0x118D8, 0x118B8, }, |
1383 | { 0x118D9, 0x118B9, }, |
1384 | { 0x118DA, 0x118BA, }, |
1385 | { 0x118DB, 0x118BB, }, |
1386 | { 0x118DC, 0x118BC, }, |
1387 | { 0x118DD, 0x118BD, }, |
1388 | { 0x118DE, 0x118BE, }, |
1389 | { 0x118DF, 0x118BF, }, |
1390 | { 0x1E922, 0x1E900, }, |
1391 | { 0x1E923, 0x1E901, }, |
1392 | { 0x1E924, 0x1E902, }, |
1393 | { 0x1E925, 0x1E903, }, |
1394 | { 0x1E926, 0x1E904, }, |
1395 | { 0x1E927, 0x1E905, }, |
1396 | { 0x1E928, 0x1E906, }, |
1397 | { 0x1E929, 0x1E907, }, |
1398 | { 0x1E92A, 0x1E908, }, |
1399 | { 0x1E92B, 0x1E909, }, |
1400 | { 0x1E92C, 0x1E90A, }, |
1401 | { 0x1E92D, 0x1E90B, }, |
1402 | { 0x1E92E, 0x1E90C, }, |
1403 | { 0x1E92F, 0x1E90D, }, |
1404 | { 0x1E930, 0x1E90E, }, |
1405 | { 0x1E931, 0x1E90F, }, |
1406 | { 0x1E932, 0x1E910, }, |
1407 | { 0x1E933, 0x1E911, }, |
1408 | { 0x1E934, 0x1E912, }, |
1409 | { 0x1E935, 0x1E913, }, |
1410 | { 0x1E936, 0x1E914, }, |
1411 | { 0x1E937, 0x1E915, }, |
1412 | { 0x1E938, 0x1E916, }, |
1413 | { 0x1E939, 0x1E917, }, |
1414 | { 0x1E93A, 0x1E918, }, |
1415 | { 0x1E93B, 0x1E919, }, |
1416 | { 0x1E93C, 0x1E91A, }, |
1417 | { 0x1E93D, 0x1E91B, }, |
1418 | { 0x1E93E, 0x1E91C, }, |
1419 | { 0x1E93F, 0x1E91D, }, |
1420 | { 0x1E940, 0x1E91E, }, |
1421 | { 0x1E941, 0x1E91F, }, |
1422 | { 0x1E942, 0x1E920, }, |
1423 | { 0x1E943, 0x1E921, }, |
1424 | }, UTF8_toLower[] = { /* code points with non-null lowercase conversion */ |
1425 | { 0x0041, 0x0061, }, |
1426 | { 0x0042, 0x0062, }, |
1427 | { 0x0043, 0x0063, }, |
1428 | { 0x0044, 0x0064, }, |
1429 | { 0x0045, 0x0065, }, |
1430 | { 0x0046, 0x0066, }, |
1431 | { 0x0047, 0x0067, }, |
1432 | { 0x0048, 0x0068, }, |
1433 | { 0x0049, 0x0069, }, |
1434 | { 0x004A, 0x006A, }, |
1435 | { 0x004B, 0x006B, }, |
1436 | { 0x004C, 0x006C, }, |
1437 | { 0x004D, 0x006D, }, |
1438 | { 0x004E, 0x006E, }, |
1439 | { 0x004F, 0x006F, }, |
1440 | { 0x0050, 0x0070, }, |
1441 | { 0x0051, 0x0071, }, |
1442 | { 0x0052, 0x0072, }, |
1443 | { 0x0053, 0x0073, }, |
1444 | { 0x0054, 0x0074, }, |
1445 | { 0x0055, 0x0075, }, |
1446 | { 0x0056, 0x0076, }, |
1447 | { 0x0057, 0x0077, }, |
1448 | { 0x0058, 0x0078, }, |
1449 | { 0x0059, 0x0079, }, |
1450 | { 0x005A, 0x007A, }, |
1451 | { 0x00C0, 0x00E0, }, |
1452 | { 0x00C1, 0x00E1, }, |
1453 | { 0x00C2, 0x00E2, }, |
1454 | { 0x00C3, 0x00E3, }, |
1455 | { 0x00C4, 0x00E4, }, |
1456 | { 0x00C5, 0x00E5, }, |
1457 | { 0x00C6, 0x00E6, }, |
1458 | { 0x00C7, 0x00E7, }, |
1459 | { 0x00C8, 0x00E8, }, |
1460 | { 0x00C9, 0x00E9, }, |
1461 | { 0x00CA, 0x00EA, }, |
1462 | { 0x00CB, 0x00EB, }, |
1463 | { 0x00CC, 0x00EC, }, |
1464 | { 0x00CD, 0x00ED, }, |
1465 | { 0x00CE, 0x00EE, }, |
1466 | { 0x00CF, 0x00EF, }, |
1467 | { 0x00D0, 0x00F0, }, |
1468 | { 0x00D1, 0x00F1, }, |
1469 | { 0x00D2, 0x00F2, }, |
1470 | { 0x00D3, 0x00F3, }, |
1471 | { 0x00D4, 0x00F4, }, |
1472 | { 0x00D5, 0x00F5, }, |
1473 | { 0x00D6, 0x00F6, }, |
1474 | { 0x00D8, 0x00F8, }, |
1475 | { 0x00D9, 0x00F9, }, |
1476 | { 0x00DA, 0x00FA, }, |
1477 | { 0x00DB, 0x00FB, }, |
1478 | { 0x00DC, 0x00FC, }, |
1479 | { 0x00DD, 0x00FD, }, |
1480 | { 0x00DE, 0x00FE, }, |
1481 | { 0x0100, 0x0101, }, |
1482 | { 0x0102, 0x0103, }, |
1483 | { 0x0104, 0x0105, }, |
1484 | { 0x0106, 0x0107, }, |
1485 | { 0x0108, 0x0109, }, |
1486 | { 0x010A, 0x010B, }, |
1487 | { 0x010C, 0x010D, }, |
1488 | { 0x010E, 0x010F, }, |
1489 | { 0x0110, 0x0111, }, |
1490 | { 0x0112, 0x0113, }, |
1491 | { 0x0114, 0x0115, }, |
1492 | { 0x0116, 0x0117, }, |
1493 | { 0x0118, 0x0119, }, |
1494 | { 0x011A, 0x011B, }, |
1495 | { 0x011C, 0x011D, }, |
1496 | { 0x011E, 0x011F, }, |
1497 | { 0x0120, 0x0121, }, |
1498 | { 0x0122, 0x0123, }, |
1499 | { 0x0124, 0x0125, }, |
1500 | { 0x0126, 0x0127, }, |
1501 | { 0x0128, 0x0129, }, |
1502 | { 0x012A, 0x012B, }, |
1503 | { 0x012C, 0x012D, }, |
1504 | { 0x012E, 0x012F, }, |
1505 | { 0x0130, 0x0069, }, |
1506 | { 0x0132, 0x0133, }, |
1507 | { 0x0134, 0x0135, }, |
1508 | { 0x0136, 0x0137, }, |
1509 | { 0x0139, 0x013A, }, |
1510 | { 0x013B, 0x013C, }, |
1511 | { 0x013D, 0x013E, }, |
1512 | { 0x013F, 0x0140, }, |
1513 | { 0x0141, 0x0142, }, |
1514 | { 0x0143, 0x0144, }, |
1515 | { 0x0145, 0x0146, }, |
1516 | { 0x0147, 0x0148, }, |
1517 | { 0x014A, 0x014B, }, |
1518 | { 0x014C, 0x014D, }, |
1519 | { 0x014E, 0x014F, }, |
1520 | { 0x0150, 0x0151, }, |
1521 | { 0x0152, 0x0153, }, |
1522 | { 0x0154, 0x0155, }, |
1523 | { 0x0156, 0x0157, }, |
1524 | { 0x0158, 0x0159, }, |
1525 | { 0x015A, 0x015B, }, |
1526 | { 0x015C, 0x015D, }, |
1527 | { 0x015E, 0x015F, }, |
1528 | { 0x0160, 0x0161, }, |
1529 | { 0x0162, 0x0163, }, |
1530 | { 0x0164, 0x0165, }, |
1531 | { 0x0166, 0x0167, }, |
1532 | { 0x0168, 0x0169, }, |
1533 | { 0x016A, 0x016B, }, |
1534 | { 0x016C, 0x016D, }, |
1535 | { 0x016E, 0x016F, }, |
1536 | { 0x0170, 0x0171, }, |
1537 | { 0x0172, 0x0173, }, |
1538 | { 0x0174, 0x0175, }, |
1539 | { 0x0176, 0x0177, }, |
1540 | { 0x0178, 0x00FF, }, |
1541 | { 0x0179, 0x017A, }, |
1542 | { 0x017B, 0x017C, }, |
1543 | { 0x017D, 0x017E, }, |
1544 | { 0x0181, 0x0253, }, |
1545 | { 0x0182, 0x0183, }, |
1546 | { 0x0184, 0x0185, }, |
1547 | { 0x0186, 0x0254, }, |
1548 | { 0x0187, 0x0188, }, |
1549 | { 0x0189, 0x0256, }, |
1550 | { 0x018A, 0x0257, }, |
1551 | { 0x018B, 0x018C, }, |
1552 | { 0x018E, 0x01DD, }, |
1553 | { 0x018F, 0x0259, }, |
1554 | { 0x0190, 0x025B, }, |
1555 | { 0x0191, 0x0192, }, |
1556 | { 0x0193, 0x0260, }, |
1557 | { 0x0194, 0x0263, }, |
1558 | { 0x0196, 0x0269, }, |
1559 | { 0x0197, 0x0268, }, |
1560 | { 0x0198, 0x0199, }, |
1561 | { 0x019C, 0x026F, }, |
1562 | { 0x019D, 0x0272, }, |
1563 | { 0x019F, 0x0275, }, |
1564 | { 0x01A0, 0x01A1, }, |
1565 | { 0x01A2, 0x01A3, }, |
1566 | { 0x01A4, 0x01A5, }, |
1567 | { 0x01A6, 0x0280, }, |
1568 | { 0x01A7, 0x01A8, }, |
1569 | { 0x01A9, 0x0283, }, |
1570 | { 0x01AC, 0x01AD, }, |
1571 | { 0x01AE, 0x0288, }, |
1572 | { 0x01AF, 0x01B0, }, |
1573 | { 0x01B1, 0x028A, }, |
1574 | { 0x01B2, 0x028B, }, |
1575 | { 0x01B3, 0x01B4, }, |
1576 | { 0x01B5, 0x01B6, }, |
1577 | { 0x01B7, 0x0292, }, |
1578 | { 0x01B8, 0x01B9, }, |
1579 | { 0x01BC, 0x01BD, }, |
1580 | { 0x01C4, 0x01C6, }, |
1581 | { 0x01C5, 0x01C6, }, |
1582 | { 0x01C7, 0x01C9, }, |
1583 | { 0x01C8, 0x01C9, }, |
1584 | { 0x01CA, 0x01CC, }, |
1585 | { 0x01CB, 0x01CC, }, |
1586 | { 0x01CD, 0x01CE, }, |
1587 | { 0x01CF, 0x01D0, }, |
1588 | { 0x01D1, 0x01D2, }, |
1589 | { 0x01D3, 0x01D4, }, |
1590 | { 0x01D5, 0x01D6, }, |
1591 | { 0x01D7, 0x01D8, }, |
1592 | { 0x01D9, 0x01DA, }, |
1593 | { 0x01DB, 0x01DC, }, |
1594 | { 0x01DE, 0x01DF, }, |
1595 | { 0x01E0, 0x01E1, }, |
1596 | { 0x01E2, 0x01E3, }, |
1597 | { 0x01E4, 0x01E5, }, |
1598 | { 0x01E6, 0x01E7, }, |
1599 | { 0x01E8, 0x01E9, }, |
1600 | { 0x01EA, 0x01EB, }, |
1601 | { 0x01EC, 0x01ED, }, |
1602 | { 0x01EE, 0x01EF, }, |
1603 | { 0x01F1, 0x01F3, }, |
1604 | { 0x01F2, 0x01F3, }, |
1605 | { 0x01F4, 0x01F5, }, |
1606 | { 0x01F6, 0x0195, }, |
1607 | { 0x01F7, 0x01BF, }, |
1608 | { 0x01F8, 0x01F9, }, |
1609 | { 0x01FA, 0x01FB, }, |
1610 | { 0x01FC, 0x01FD, }, |
1611 | { 0x01FE, 0x01FF, }, |
1612 | { 0x0200, 0x0201, }, |
1613 | { 0x0202, 0x0203, }, |
1614 | { 0x0204, 0x0205, }, |
1615 | { 0x0206, 0x0207, }, |
1616 | { 0x0208, 0x0209, }, |
1617 | { 0x020A, 0x020B, }, |
1618 | { 0x020C, 0x020D, }, |
1619 | { 0x020E, 0x020F, }, |
1620 | { 0x0210, 0x0211, }, |
1621 | { 0x0212, 0x0213, }, |
1622 | { 0x0214, 0x0215, }, |
1623 | { 0x0216, 0x0217, }, |
1624 | { 0x0218, 0x0219, }, |
1625 | { 0x021A, 0x021B, }, |
1626 | { 0x021C, 0x021D, }, |
1627 | { 0x021E, 0x021F, }, |
1628 | { 0x0220, 0x019E, }, |
1629 | { 0x0222, 0x0223, }, |
1630 | { 0x0224, 0x0225, }, |
1631 | { 0x0226, 0x0227, }, |
1632 | { 0x0228, 0x0229, }, |
1633 | { 0x022A, 0x022B, }, |
1634 | { 0x022C, 0x022D, }, |
1635 | { 0x022E, 0x022F, }, |
1636 | { 0x0230, 0x0231, }, |
1637 | { 0x0232, 0x0233, }, |
1638 | { 0x023A, 0x2C65, }, |
1639 | { 0x023B, 0x023C, }, |
1640 | { 0x023D, 0x019A, }, |
1641 | { 0x023E, 0x2C66, }, |
1642 | { 0x0241, 0x0242, }, |
1643 | { 0x0243, 0x0180, }, |
1644 | { 0x0244, 0x0289, }, |
1645 | { 0x0245, 0x028C, }, |
1646 | { 0x0246, 0x0247, }, |
1647 | { 0x0248, 0x0249, }, |
1648 | { 0x024A, 0x024B, }, |
1649 | { 0x024C, 0x024D, }, |
1650 | { 0x024E, 0x024F, }, |
1651 | { 0x0370, 0x0371, }, |
1652 | { 0x0372, 0x0373, }, |
1653 | { 0x0376, 0x0377, }, |
1654 | { 0x037F, 0x03F3, }, |
1655 | { 0x0386, 0x03AC, }, |
1656 | { 0x0388, 0x03AD, }, |
1657 | { 0x0389, 0x03AE, }, |
1658 | { 0x038A, 0x03AF, }, |
1659 | { 0x038C, 0x03CC, }, |
1660 | { 0x038E, 0x03CD, }, |
1661 | { 0x038F, 0x03CE, }, |
1662 | { 0x0391, 0x03B1, }, |
1663 | { 0x0392, 0x03B2, }, |
1664 | { 0x0393, 0x03B3, }, |
1665 | { 0x0394, 0x03B4, }, |
1666 | { 0x0395, 0x03B5, }, |
1667 | { 0x0396, 0x03B6, }, |
1668 | { 0x0397, 0x03B7, }, |
1669 | { 0x0398, 0x03B8, }, |
1670 | { 0x0399, 0x03B9, }, |
1671 | { 0x039A, 0x03BA, }, |
1672 | { 0x039B, 0x03BB, }, |
1673 | { 0x039C, 0x03BC, }, |
1674 | { 0x039D, 0x03BD, }, |
1675 | { 0x039E, 0x03BE, }, |
1676 | { 0x039F, 0x03BF, }, |
1677 | { 0x03A0, 0x03C0, }, |
1678 | { 0x03A1, 0x03C1, }, |
1679 | { 0x03A3, 0x03C3, }, |
1680 | { 0x03A4, 0x03C4, }, |
1681 | { 0x03A5, 0x03C5, }, |
1682 | { 0x03A6, 0x03C6, }, |
1683 | { 0x03A7, 0x03C7, }, |
1684 | { 0x03A8, 0x03C8, }, |
1685 | { 0x03A9, 0x03C9, }, |
1686 | { 0x03AA, 0x03CA, }, |
1687 | { 0x03AB, 0x03CB, }, |
1688 | { 0x03CF, 0x03D7, }, |
1689 | { 0x03D8, 0x03D9, }, |
1690 | { 0x03DA, 0x03DB, }, |
1691 | { 0x03DC, 0x03DD, }, |
1692 | { 0x03DE, 0x03DF, }, |
1693 | { 0x03E0, 0x03E1, }, |
1694 | { 0x03E2, 0x03E3, }, |
1695 | { 0x03E4, 0x03E5, }, |
1696 | { 0x03E6, 0x03E7, }, |
1697 | { 0x03E8, 0x03E9, }, |
1698 | { 0x03EA, 0x03EB, }, |
1699 | { 0x03EC, 0x03ED, }, |
1700 | { 0x03EE, 0x03EF, }, |
1701 | { 0x03F4, 0x03B8, }, |
1702 | { 0x03F7, 0x03F8, }, |
1703 | { 0x03F9, 0x03F2, }, |
1704 | { 0x03FA, 0x03FB, }, |
1705 | { 0x03FD, 0x037B, }, |
1706 | { 0x03FE, 0x037C, }, |
1707 | { 0x03FF, 0x037D, }, |
1708 | { 0x0400, 0x0450, }, |
1709 | { 0x0401, 0x0451, }, |
1710 | { 0x0402, 0x0452, }, |
1711 | { 0x0403, 0x0453, }, |
1712 | { 0x0404, 0x0454, }, |
1713 | { 0x0405, 0x0455, }, |
1714 | { 0x0406, 0x0456, }, |
1715 | { 0x0407, 0x0457, }, |
1716 | { 0x0408, 0x0458, }, |
1717 | { 0x0409, 0x0459, }, |
1718 | { 0x040A, 0x045A, }, |
1719 | { 0x040B, 0x045B, }, |
1720 | { 0x040C, 0x045C, }, |
1721 | { 0x040D, 0x045D, }, |
1722 | { 0x040E, 0x045E, }, |
1723 | { 0x040F, 0x045F, }, |
1724 | { 0x0410, 0x0430, }, |
1725 | { 0x0411, 0x0431, }, |
1726 | { 0x0412, 0x0432, }, |
1727 | { 0x0413, 0x0433, }, |
1728 | { 0x0414, 0x0434, }, |
1729 | { 0x0415, 0x0435, }, |
1730 | { 0x0416, 0x0436, }, |
1731 | { 0x0417, 0x0437, }, |
1732 | { 0x0418, 0x0438, }, |
1733 | { 0x0419, 0x0439, }, |
1734 | { 0x041A, 0x043A, }, |
1735 | { 0x041B, 0x043B, }, |
1736 | { 0x041C, 0x043C, }, |
1737 | { 0x041D, 0x043D, }, |
1738 | { 0x041E, 0x043E, }, |
1739 | { 0x041F, 0x043F, }, |
1740 | { 0x0420, 0x0440, }, |
1741 | { 0x0421, 0x0441, }, |
1742 | { 0x0422, 0x0442, }, |
1743 | { 0x0423, 0x0443, }, |
1744 | { 0x0424, 0x0444, }, |
1745 | { 0x0425, 0x0445, }, |
1746 | { 0x0426, 0x0446, }, |
1747 | { 0x0427, 0x0447, }, |
1748 | { 0x0428, 0x0448, }, |
1749 | { 0x0429, 0x0449, }, |
1750 | { 0x042A, 0x044A, }, |
1751 | { 0x042B, 0x044B, }, |
1752 | { 0x042C, 0x044C, }, |
1753 | { 0x042D, 0x044D, }, |
1754 | { 0x042E, 0x044E, }, |
1755 | { 0x042F, 0x044F, }, |
1756 | { 0x0460, 0x0461, }, |
1757 | { 0x0462, 0x0463, }, |
1758 | { 0x0464, 0x0465, }, |
1759 | { 0x0466, 0x0467, }, |
1760 | { 0x0468, 0x0469, }, |
1761 | { 0x046A, 0x046B, }, |
1762 | { 0x046C, 0x046D, }, |
1763 | { 0x046E, 0x046F, }, |
1764 | { 0x0470, 0x0471, }, |
1765 | { 0x0472, 0x0473, }, |
1766 | { 0x0474, 0x0475, }, |
1767 | { 0x0476, 0x0477, }, |
1768 | { 0x0478, 0x0479, }, |
1769 | { 0x047A, 0x047B, }, |
1770 | { 0x047C, 0x047D, }, |
1771 | { 0x047E, 0x047F, }, |
1772 | { 0x0480, 0x0481, }, |
1773 | { 0x048A, 0x048B, }, |
1774 | { 0x048C, 0x048D, }, |
1775 | { 0x048E, 0x048F, }, |
1776 | { 0x0490, 0x0491, }, |
1777 | { 0x0492, 0x0493, }, |
1778 | { 0x0494, 0x0495, }, |
1779 | { 0x0496, 0x0497, }, |
1780 | { 0x0498, 0x0499, }, |
1781 | { 0x049A, 0x049B, }, |
1782 | { 0x049C, 0x049D, }, |
1783 | { 0x049E, 0x049F, }, |
1784 | { 0x04A0, 0x04A1, }, |
1785 | { 0x04A2, 0x04A3, }, |
1786 | { 0x04A4, 0x04A5, }, |
1787 | { 0x04A6, 0x04A7, }, |
1788 | { 0x04A8, 0x04A9, }, |
1789 | { 0x04AA, 0x04AB, }, |
1790 | { 0x04AC, 0x04AD, }, |
1791 | { 0x04AE, 0x04AF, }, |
1792 | { 0x04B0, 0x04B1, }, |
1793 | { 0x04B2, 0x04B3, }, |
1794 | { 0x04B4, 0x04B5, }, |
1795 | { 0x04B6, 0x04B7, }, |
1796 | { 0x04B8, 0x04B9, }, |
1797 | { 0x04BA, 0x04BB, }, |
1798 | { 0x04BC, 0x04BD, }, |
1799 | { 0x04BE, 0x04BF, }, |
1800 | { 0x04C0, 0x04CF, }, |
1801 | { 0x04C1, 0x04C2, }, |
1802 | { 0x04C3, 0x04C4, }, |
1803 | { 0x04C5, 0x04C6, }, |
1804 | { 0x04C7, 0x04C8, }, |
1805 | { 0x04C9, 0x04CA, }, |
1806 | { 0x04CB, 0x04CC, }, |
1807 | { 0x04CD, 0x04CE, }, |
1808 | { 0x04D0, 0x04D1, }, |
1809 | { 0x04D2, 0x04D3, }, |
1810 | { 0x04D4, 0x04D5, }, |
1811 | { 0x04D6, 0x04D7, }, |
1812 | { 0x04D8, 0x04D9, }, |
1813 | { 0x04DA, 0x04DB, }, |
1814 | { 0x04DC, 0x04DD, }, |
1815 | { 0x04DE, 0x04DF, }, |
1816 | { 0x04E0, 0x04E1, }, |
1817 | { 0x04E2, 0x04E3, }, |
1818 | { 0x04E4, 0x04E5, }, |
1819 | { 0x04E6, 0x04E7, }, |
1820 | { 0x04E8, 0x04E9, }, |
1821 | { 0x04EA, 0x04EB, }, |
1822 | { 0x04EC, 0x04ED, }, |
1823 | { 0x04EE, 0x04EF, }, |
1824 | { 0x04F0, 0x04F1, }, |
1825 | { 0x04F2, 0x04F3, }, |
1826 | { 0x04F4, 0x04F5, }, |
1827 | { 0x04F6, 0x04F7, }, |
1828 | { 0x04F8, 0x04F9, }, |
1829 | { 0x04FA, 0x04FB, }, |
1830 | { 0x04FC, 0x04FD, }, |
1831 | { 0x04FE, 0x04FF, }, |
1832 | { 0x0500, 0x0501, }, |
1833 | { 0x0502, 0x0503, }, |
1834 | { 0x0504, 0x0505, }, |
1835 | { 0x0506, 0x0507, }, |
1836 | { 0x0508, 0x0509, }, |
1837 | { 0x050A, 0x050B, }, |
1838 | { 0x050C, 0x050D, }, |
1839 | { 0x050E, 0x050F, }, |
1840 | { 0x0510, 0x0511, }, |
1841 | { 0x0512, 0x0513, }, |
1842 | { 0x0514, 0x0515, }, |
1843 | { 0x0516, 0x0517, }, |
1844 | { 0x0518, 0x0519, }, |
1845 | { 0x051A, 0x051B, }, |
1846 | { 0x051C, 0x051D, }, |
1847 | { 0x051E, 0x051F, }, |
1848 | { 0x0520, 0x0521, }, |
1849 | { 0x0522, 0x0523, }, |
1850 | { 0x0524, 0x0525, }, |
1851 | { 0x0526, 0x0527, }, |
1852 | { 0x0528, 0x0529, }, |
1853 | { 0x052A, 0x052B, }, |
1854 | { 0x052C, 0x052D, }, |
1855 | { 0x052E, 0x052F, }, |
1856 | { 0x0531, 0x0561, }, |
1857 | { 0x0532, 0x0562, }, |
1858 | { 0x0533, 0x0563, }, |
1859 | { 0x0534, 0x0564, }, |
1860 | { 0x0535, 0x0565, }, |
1861 | { 0x0536, 0x0566, }, |
1862 | { 0x0537, 0x0567, }, |
1863 | { 0x0538, 0x0568, }, |
1864 | { 0x0539, 0x0569, }, |
1865 | { 0x053A, 0x056A, }, |
1866 | { 0x053B, 0x056B, }, |
1867 | { 0x053C, 0x056C, }, |
1868 | { 0x053D, 0x056D, }, |
1869 | { 0x053E, 0x056E, }, |
1870 | { 0x053F, 0x056F, }, |
1871 | { 0x0540, 0x0570, }, |
1872 | { 0x0541, 0x0571, }, |
1873 | { 0x0542, 0x0572, }, |
1874 | { 0x0543, 0x0573, }, |
1875 | { 0x0544, 0x0574, }, |
1876 | { 0x0545, 0x0575, }, |
1877 | { 0x0546, 0x0576, }, |
1878 | { 0x0547, 0x0577, }, |
1879 | { 0x0548, 0x0578, }, |
1880 | { 0x0549, 0x0579, }, |
1881 | { 0x054A, 0x057A, }, |
1882 | { 0x054B, 0x057B, }, |
1883 | { 0x054C, 0x057C, }, |
1884 | { 0x054D, 0x057D, }, |
1885 | { 0x054E, 0x057E, }, |
1886 | { 0x054F, 0x057F, }, |
1887 | { 0x0550, 0x0580, }, |
1888 | { 0x0551, 0x0581, }, |
1889 | { 0x0552, 0x0582, }, |
1890 | { 0x0553, 0x0583, }, |
1891 | { 0x0554, 0x0584, }, |
1892 | { 0x0555, 0x0585, }, |
1893 | { 0x0556, 0x0586, }, |
1894 | { 0x10A0, 0x2D00, }, |
1895 | { 0x10A1, 0x2D01, }, |
1896 | { 0x10A2, 0x2D02, }, |
1897 | { 0x10A3, 0x2D03, }, |
1898 | { 0x10A4, 0x2D04, }, |
1899 | { 0x10A5, 0x2D05, }, |
1900 | { 0x10A6, 0x2D06, }, |
1901 | { 0x10A7, 0x2D07, }, |
1902 | { 0x10A8, 0x2D08, }, |
1903 | { 0x10A9, 0x2D09, }, |
1904 | { 0x10AA, 0x2D0A, }, |
1905 | { 0x10AB, 0x2D0B, }, |
1906 | { 0x10AC, 0x2D0C, }, |
1907 | { 0x10AD, 0x2D0D, }, |
1908 | { 0x10AE, 0x2D0E, }, |
1909 | { 0x10AF, 0x2D0F, }, |
1910 | { 0x10B0, 0x2D10, }, |
1911 | { 0x10B1, 0x2D11, }, |
1912 | { 0x10B2, 0x2D12, }, |
1913 | { 0x10B3, 0x2D13, }, |
1914 | { 0x10B4, 0x2D14, }, |
1915 | { 0x10B5, 0x2D15, }, |
1916 | { 0x10B6, 0x2D16, }, |
1917 | { 0x10B7, 0x2D17, }, |
1918 | { 0x10B8, 0x2D18, }, |
1919 | { 0x10B9, 0x2D19, }, |
1920 | { 0x10BA, 0x2D1A, }, |
1921 | { 0x10BB, 0x2D1B, }, |
1922 | { 0x10BC, 0x2D1C, }, |
1923 | { 0x10BD, 0x2D1D, }, |
1924 | { 0x10BE, 0x2D1E, }, |
1925 | { 0x10BF, 0x2D1F, }, |
1926 | { 0x10C0, 0x2D20, }, |
1927 | { 0x10C1, 0x2D21, }, |
1928 | { 0x10C2, 0x2D22, }, |
1929 | { 0x10C3, 0x2D23, }, |
1930 | { 0x10C4, 0x2D24, }, |
1931 | { 0x10C5, 0x2D25, }, |
1932 | { 0x10C7, 0x2D27, }, |
1933 | { 0x10CD, 0x2D2D, }, |
1934 | { 0x13A0, 0xAB70, }, |
1935 | { 0x13A1, 0xAB71, }, |
1936 | { 0x13A2, 0xAB72, }, |
1937 | { 0x13A3, 0xAB73, }, |
1938 | { 0x13A4, 0xAB74, }, |
1939 | { 0x13A5, 0xAB75, }, |
1940 | { 0x13A6, 0xAB76, }, |
1941 | { 0x13A7, 0xAB77, }, |
1942 | { 0x13A8, 0xAB78, }, |
1943 | { 0x13A9, 0xAB79, }, |
1944 | { 0x13AA, 0xAB7A, }, |
1945 | { 0x13AB, 0xAB7B, }, |
1946 | { 0x13AC, 0xAB7C, }, |
1947 | { 0x13AD, 0xAB7D, }, |
1948 | { 0x13AE, 0xAB7E, }, |
1949 | { 0x13AF, 0xAB7F, }, |
1950 | { 0x13B0, 0xAB80, }, |
1951 | { 0x13B1, 0xAB81, }, |
1952 | { 0x13B2, 0xAB82, }, |
1953 | { 0x13B3, 0xAB83, }, |
1954 | { 0x13B4, 0xAB84, }, |
1955 | { 0x13B5, 0xAB85, }, |
1956 | { 0x13B6, 0xAB86, }, |
1957 | { 0x13B7, 0xAB87, }, |
1958 | { 0x13B8, 0xAB88, }, |
1959 | { 0x13B9, 0xAB89, }, |
1960 | { 0x13BA, 0xAB8A, }, |
1961 | { 0x13BB, 0xAB8B, }, |
1962 | { 0x13BC, 0xAB8C, }, |
1963 | { 0x13BD, 0xAB8D, }, |
1964 | { 0x13BE, 0xAB8E, }, |
1965 | { 0x13BF, 0xAB8F, }, |
1966 | { 0x13C0, 0xAB90, }, |
1967 | { 0x13C1, 0xAB91, }, |
1968 | { 0x13C2, 0xAB92, }, |
1969 | { 0x13C3, 0xAB93, }, |
1970 | { 0x13C4, 0xAB94, }, |
1971 | { 0x13C5, 0xAB95, }, |
1972 | { 0x13C6, 0xAB96, }, |
1973 | { 0x13C7, 0xAB97, }, |
1974 | { 0x13C8, 0xAB98, }, |
1975 | { 0x13C9, 0xAB99, }, |
1976 | { 0x13CA, 0xAB9A, }, |
1977 | { 0x13CB, 0xAB9B, }, |
1978 | { 0x13CC, 0xAB9C, }, |
1979 | { 0x13CD, 0xAB9D, }, |
1980 | { 0x13CE, 0xAB9E, }, |
1981 | { 0x13CF, 0xAB9F, }, |
1982 | { 0x13D0, 0xABA0, }, |
1983 | { 0x13D1, 0xABA1, }, |
1984 | { 0x13D2, 0xABA2, }, |
1985 | { 0x13D3, 0xABA3, }, |
1986 | { 0x13D4, 0xABA4, }, |
1987 | { 0x13D5, 0xABA5, }, |
1988 | { 0x13D6, 0xABA6, }, |
1989 | { 0x13D7, 0xABA7, }, |
1990 | { 0x13D8, 0xABA8, }, |
1991 | { 0x13D9, 0xABA9, }, |
1992 | { 0x13DA, 0xABAA, }, |
1993 | { 0x13DB, 0xABAB, }, |
1994 | { 0x13DC, 0xABAC, }, |
1995 | { 0x13DD, 0xABAD, }, |
1996 | { 0x13DE, 0xABAE, }, |
1997 | { 0x13DF, 0xABAF, }, |
1998 | { 0x13E0, 0xABB0, }, |
1999 | { 0x13E1, 0xABB1, }, |
2000 | { 0x13E2, 0xABB2, }, |
2001 | { 0x13E3, 0xABB3, }, |
2002 | { 0x13E4, 0xABB4, }, |
2003 | { 0x13E5, 0xABB5, }, |
2004 | { 0x13E6, 0xABB6, }, |
2005 | { 0x13E7, 0xABB7, }, |
2006 | { 0x13E8, 0xABB8, }, |
2007 | { 0x13E9, 0xABB9, }, |
2008 | { 0x13EA, 0xABBA, }, |
2009 | { 0x13EB, 0xABBB, }, |
2010 | { 0x13EC, 0xABBC, }, |
2011 | { 0x13ED, 0xABBD, }, |
2012 | { 0x13EE, 0xABBE, }, |
2013 | { 0x13EF, 0xABBF, }, |
2014 | { 0x13F0, 0x13F8, }, |
2015 | { 0x13F1, 0x13F9, }, |
2016 | { 0x13F2, 0x13FA, }, |
2017 | { 0x13F3, 0x13FB, }, |
2018 | { 0x13F4, 0x13FC, }, |
2019 | { 0x13F5, 0x13FD, }, |
2020 | { 0x1E00, 0x1E01, }, |
2021 | { 0x1E02, 0x1E03, }, |
2022 | { 0x1E04, 0x1E05, }, |
2023 | { 0x1E06, 0x1E07, }, |
2024 | { 0x1E08, 0x1E09, }, |
2025 | { 0x1E0A, 0x1E0B, }, |
2026 | { 0x1E0C, 0x1E0D, }, |
2027 | { 0x1E0E, 0x1E0F, }, |
2028 | { 0x1E10, 0x1E11, }, |
2029 | { 0x1E12, 0x1E13, }, |
2030 | { 0x1E14, 0x1E15, }, |
2031 | { 0x1E16, 0x1E17, }, |
2032 | { 0x1E18, 0x1E19, }, |
2033 | { 0x1E1A, 0x1E1B, }, |
2034 | { 0x1E1C, 0x1E1D, }, |
2035 | { 0x1E1E, 0x1E1F, }, |
2036 | { 0x1E20, 0x1E21, }, |
2037 | { 0x1E22, 0x1E23, }, |
2038 | { 0x1E24, 0x1E25, }, |
2039 | { 0x1E26, 0x1E27, }, |
2040 | { 0x1E28, 0x1E29, }, |
2041 | { 0x1E2A, 0x1E2B, }, |
2042 | { 0x1E2C, 0x1E2D, }, |
2043 | { 0x1E2E, 0x1E2F, }, |
2044 | { 0x1E30, 0x1E31, }, |
2045 | { 0x1E32, 0x1E33, }, |
2046 | { 0x1E34, 0x1E35, }, |
2047 | { 0x1E36, 0x1E37, }, |
2048 | { 0x1E38, 0x1E39, }, |
2049 | { 0x1E3A, 0x1E3B, }, |
2050 | { 0x1E3C, 0x1E3D, }, |
2051 | { 0x1E3E, 0x1E3F, }, |
2052 | { 0x1E40, 0x1E41, }, |
2053 | { 0x1E42, 0x1E43, }, |
2054 | { 0x1E44, 0x1E45, }, |
2055 | { 0x1E46, 0x1E47, }, |
2056 | { 0x1E48, 0x1E49, }, |
2057 | { 0x1E4A, 0x1E4B, }, |
2058 | { 0x1E4C, 0x1E4D, }, |
2059 | { 0x1E4E, 0x1E4F, }, |
2060 | { 0x1E50, 0x1E51, }, |
2061 | { 0x1E52, 0x1E53, }, |
2062 | { 0x1E54, 0x1E55, }, |
2063 | { 0x1E56, 0x1E57, }, |
2064 | { 0x1E58, 0x1E59, }, |
2065 | { 0x1E5A, 0x1E5B, }, |
2066 | { 0x1E5C, 0x1E5D, }, |
2067 | { 0x1E5E, 0x1E5F, }, |
2068 | { 0x1E60, 0x1E61, }, |
2069 | { 0x1E62, 0x1E63, }, |
2070 | { 0x1E64, 0x1E65, }, |
2071 | { 0x1E66, 0x1E67, }, |
2072 | { 0x1E68, 0x1E69, }, |
2073 | { 0x1E6A, 0x1E6B, }, |
2074 | { 0x1E6C, 0x1E6D, }, |
2075 | { 0x1E6E, 0x1E6F, }, |
2076 | { 0x1E70, 0x1E71, }, |
2077 | { 0x1E72, 0x1E73, }, |
2078 | { 0x1E74, 0x1E75, }, |
2079 | { 0x1E76, 0x1E77, }, |
2080 | { 0x1E78, 0x1E79, }, |
2081 | { 0x1E7A, 0x1E7B, }, |
2082 | { 0x1E7C, 0x1E7D, }, |
2083 | { 0x1E7E, 0x1E7F, }, |
2084 | { 0x1E80, 0x1E81, }, |
2085 | { 0x1E82, 0x1E83, }, |
2086 | { 0x1E84, 0x1E85, }, |
2087 | { 0x1E86, 0x1E87, }, |
2088 | { 0x1E88, 0x1E89, }, |
2089 | { 0x1E8A, 0x1E8B, }, |
2090 | { 0x1E8C, 0x1E8D, }, |
2091 | { 0x1E8E, 0x1E8F, }, |
2092 | { 0x1E90, 0x1E91, }, |
2093 | { 0x1E92, 0x1E93, }, |
2094 | { 0x1E94, 0x1E95, }, |
2095 | { 0x1E9E, 0x00DF, }, |
2096 | { 0x1EA0, 0x1EA1, }, |
2097 | { 0x1EA2, 0x1EA3, }, |
2098 | { 0x1EA4, 0x1EA5, }, |
2099 | { 0x1EA6, 0x1EA7, }, |
2100 | { 0x1EA8, 0x1EA9, }, |
2101 | { 0x1EAA, 0x1EAB, }, |
2102 | { 0x1EAC, 0x1EAD, }, |
2103 | { 0x1EAE, 0x1EAF, }, |
2104 | { 0x1EB0, 0x1EB1, }, |
2105 | { 0x1EB2, 0x1EB3, }, |
2106 | { 0x1EB4, 0x1EB5, }, |
2107 | { 0x1EB6, 0x1EB7, }, |
2108 | { 0x1EB8, 0x1EB9, }, |
2109 | { 0x1EBA, 0x1EBB, }, |
2110 | { 0x1EBC, 0x1EBD, }, |
2111 | { 0x1EBE, 0x1EBF, }, |
2112 | { 0x1EC0, 0x1EC1, }, |
2113 | { 0x1EC2, 0x1EC3, }, |
2114 | { 0x1EC4, 0x1EC5, }, |
2115 | { 0x1EC6, 0x1EC7, }, |
2116 | { 0x1EC8, 0x1EC9, }, |
2117 | { 0x1ECA, 0x1ECB, }, |
2118 | { 0x1ECC, 0x1ECD, }, |
2119 | { 0x1ECE, 0x1ECF, }, |
2120 | { 0x1ED0, 0x1ED1, }, |
2121 | { 0x1ED2, 0x1ED3, }, |
2122 | { 0x1ED4, 0x1ED5, }, |
2123 | { 0x1ED6, 0x1ED7, }, |
2124 | { 0x1ED8, 0x1ED9, }, |
2125 | { 0x1EDA, 0x1EDB, }, |
2126 | { 0x1EDC, 0x1EDD, }, |
2127 | { 0x1EDE, 0x1EDF, }, |
2128 | { 0x1EE0, 0x1EE1, }, |
2129 | { 0x1EE2, 0x1EE3, }, |
2130 | { 0x1EE4, 0x1EE5, }, |
2131 | { 0x1EE6, 0x1EE7, }, |
2132 | { 0x1EE8, 0x1EE9, }, |
2133 | { 0x1EEA, 0x1EEB, }, |
2134 | { 0x1EEC, 0x1EED, }, |
2135 | { 0x1EEE, 0x1EEF, }, |
2136 | { 0x1EF0, 0x1EF1, }, |
2137 | { 0x1EF2, 0x1EF3, }, |
2138 | { 0x1EF4, 0x1EF5, }, |
2139 | { 0x1EF6, 0x1EF7, }, |
2140 | { 0x1EF8, 0x1EF9, }, |
2141 | { 0x1EFA, 0x1EFB, }, |
2142 | { 0x1EFC, 0x1EFD, }, |
2143 | { 0x1EFE, 0x1EFF, }, |
2144 | { 0x1F08, 0x1F00, }, |
2145 | { 0x1F09, 0x1F01, }, |
2146 | { 0x1F0A, 0x1F02, }, |
2147 | { 0x1F0B, 0x1F03, }, |
2148 | { 0x1F0C, 0x1F04, }, |
2149 | { 0x1F0D, 0x1F05, }, |
2150 | { 0x1F0E, 0x1F06, }, |
2151 | { 0x1F0F, 0x1F07, }, |
2152 | { 0x1F18, 0x1F10, }, |
2153 | { 0x1F19, 0x1F11, }, |
2154 | { 0x1F1A, 0x1F12, }, |
2155 | { 0x1F1B, 0x1F13, }, |
2156 | { 0x1F1C, 0x1F14, }, |
2157 | { 0x1F1D, 0x1F15, }, |
2158 | { 0x1F28, 0x1F20, }, |
2159 | { 0x1F29, 0x1F21, }, |
2160 | { 0x1F2A, 0x1F22, }, |
2161 | { 0x1F2B, 0x1F23, }, |
2162 | { 0x1F2C, 0x1F24, }, |
2163 | { 0x1F2D, 0x1F25, }, |
2164 | { 0x1F2E, 0x1F26, }, |
2165 | { 0x1F2F, 0x1F27, }, |
2166 | { 0x1F38, 0x1F30, }, |
2167 | { 0x1F39, 0x1F31, }, |
2168 | { 0x1F3A, 0x1F32, }, |
2169 | { 0x1F3B, 0x1F33, }, |
2170 | { 0x1F3C, 0x1F34, }, |
2171 | { 0x1F3D, 0x1F35, }, |
2172 | { 0x1F3E, 0x1F36, }, |
2173 | { 0x1F3F, 0x1F37, }, |
2174 | { 0x1F48, 0x1F40, }, |
2175 | { 0x1F49, 0x1F41, }, |
2176 | { 0x1F4A, 0x1F42, }, |
2177 | { 0x1F4B, 0x1F43, }, |
2178 | { 0x1F4C, 0x1F44, }, |
2179 | { 0x1F4D, 0x1F45, }, |
2180 | { 0x1F59, 0x1F51, }, |
2181 | { 0x1F5B, 0x1F53, }, |
2182 | { 0x1F5D, 0x1F55, }, |
2183 | { 0x1F5F, 0x1F57, }, |
2184 | { 0x1F68, 0x1F60, }, |
2185 | { 0x1F69, 0x1F61, }, |
2186 | { 0x1F6A, 0x1F62, }, |
2187 | { 0x1F6B, 0x1F63, }, |
2188 | { 0x1F6C, 0x1F64, }, |
2189 | { 0x1F6D, 0x1F65, }, |
2190 | { 0x1F6E, 0x1F66, }, |
2191 | { 0x1F6F, 0x1F67, }, |
2192 | { 0x1F88, 0x1F80, }, |
2193 | { 0x1F89, 0x1F81, }, |
2194 | { 0x1F8A, 0x1F82, }, |
2195 | { 0x1F8B, 0x1F83, }, |
2196 | { 0x1F8C, 0x1F84, }, |
2197 | { 0x1F8D, 0x1F85, }, |
2198 | { 0x1F8E, 0x1F86, }, |
2199 | { 0x1F8F, 0x1F87, }, |
2200 | { 0x1F98, 0x1F90, }, |
2201 | { 0x1F99, 0x1F91, }, |
2202 | { 0x1F9A, 0x1F92, }, |
2203 | { 0x1F9B, 0x1F93, }, |
2204 | { 0x1F9C, 0x1F94, }, |
2205 | { 0x1F9D, 0x1F95, }, |
2206 | { 0x1F9E, 0x1F96, }, |
2207 | { 0x1F9F, 0x1F97, }, |
2208 | { 0x1FA8, 0x1FA0, }, |
2209 | { 0x1FA9, 0x1FA1, }, |
2210 | { 0x1FAA, 0x1FA2, }, |
2211 | { 0x1FAB, 0x1FA3, }, |
2212 | { 0x1FAC, 0x1FA4, }, |
2213 | { 0x1FAD, 0x1FA5, }, |
2214 | { 0x1FAE, 0x1FA6, }, |
2215 | { 0x1FAF, 0x1FA7, }, |
2216 | { 0x1FB8, 0x1FB0, }, |
2217 | { 0x1FB9, 0x1FB1, }, |
2218 | { 0x1FBA, 0x1F70, }, |
2219 | { 0x1FBB, 0x1F71, }, |
2220 | { 0x1FBC, 0x1FB3, }, |
2221 | { 0x1FC8, 0x1F72, }, |
2222 | { 0x1FC9, 0x1F73, }, |
2223 | { 0x1FCA, 0x1F74, }, |
2224 | { 0x1FCB, 0x1F75, }, |
2225 | { 0x1FCC, 0x1FC3, }, |
2226 | { 0x1FD8, 0x1FD0, }, |
2227 | { 0x1FD9, 0x1FD1, }, |
2228 | { 0x1FDA, 0x1F76, }, |
2229 | { 0x1FDB, 0x1F77, }, |
2230 | { 0x1FE8, 0x1FE0, }, |
2231 | { 0x1FE9, 0x1FE1, }, |
2232 | { 0x1FEA, 0x1F7A, }, |
2233 | { 0x1FEB, 0x1F7B, }, |
2234 | { 0x1FEC, 0x1FE5, }, |
2235 | { 0x1FF8, 0x1F78, }, |
2236 | { 0x1FF9, 0x1F79, }, |
2237 | { 0x1FFA, 0x1F7C, }, |
2238 | { 0x1FFB, 0x1F7D, }, |
2239 | { 0x1FFC, 0x1FF3, }, |
2240 | { 0x2126, 0x03C9, }, |
2241 | { 0x212A, 0x006B, }, |
2242 | { 0x212B, 0x00E5, }, |
2243 | { 0x2132, 0x214E, }, |
2244 | { 0x2160, 0x2170, }, |
2245 | { 0x2161, 0x2171, }, |
2246 | { 0x2162, 0x2172, }, |
2247 | { 0x2163, 0x2173, }, |
2248 | { 0x2164, 0x2174, }, |
2249 | { 0x2165, 0x2175, }, |
2250 | { 0x2166, 0x2176, }, |
2251 | { 0x2167, 0x2177, }, |
2252 | { 0x2168, 0x2178, }, |
2253 | { 0x2169, 0x2179, }, |
2254 | { 0x216A, 0x217A, }, |
2255 | { 0x216B, 0x217B, }, |
2256 | { 0x216C, 0x217C, }, |
2257 | { 0x216D, 0x217D, }, |
2258 | { 0x216E, 0x217E, }, |
2259 | { 0x216F, 0x217F, }, |
2260 | { 0x2183, 0x2184, }, |
2261 | { 0x24B6, 0x24D0, }, |
2262 | { 0x24B7, 0x24D1, }, |
2263 | { 0x24B8, 0x24D2, }, |
2264 | { 0x24B9, 0x24D3, }, |
2265 | { 0x24BA, 0x24D4, }, |
2266 | { 0x24BB, 0x24D5, }, |
2267 | { 0x24BC, 0x24D6, }, |
2268 | { 0x24BD, 0x24D7, }, |
2269 | { 0x24BE, 0x24D8, }, |
2270 | { 0x24BF, 0x24D9, }, |
2271 | { 0x24C0, 0x24DA, }, |
2272 | { 0x24C1, 0x24DB, }, |
2273 | { 0x24C2, 0x24DC, }, |
2274 | { 0x24C3, 0x24DD, }, |
2275 | { 0x24C4, 0x24DE, }, |
2276 | { 0x24C5, 0x24DF, }, |
2277 | { 0x24C6, 0x24E0, }, |
2278 | { 0x24C7, 0x24E1, }, |
2279 | { 0x24C8, 0x24E2, }, |
2280 | { 0x24C9, 0x24E3, }, |
2281 | { 0x24CA, 0x24E4, }, |
2282 | { 0x24CB, 0x24E5, }, |
2283 | { 0x24CC, 0x24E6, }, |
2284 | { 0x24CD, 0x24E7, }, |
2285 | { 0x24CE, 0x24E8, }, |
2286 | { 0x24CF, 0x24E9, }, |
2287 | { 0x2C00, 0x2C30, }, |
2288 | { 0x2C01, 0x2C31, }, |
2289 | { 0x2C02, 0x2C32, }, |
2290 | { 0x2C03, 0x2C33, }, |
2291 | { 0x2C04, 0x2C34, }, |
2292 | { 0x2C05, 0x2C35, }, |
2293 | { 0x2C06, 0x2C36, }, |
2294 | { 0x2C07, 0x2C37, }, |
2295 | { 0x2C08, 0x2C38, }, |
2296 | { 0x2C09, 0x2C39, }, |
2297 | { 0x2C0A, 0x2C3A, }, |
2298 | { 0x2C0B, 0x2C3B, }, |
2299 | { 0x2C0C, 0x2C3C, }, |
2300 | { 0x2C0D, 0x2C3D, }, |
2301 | { 0x2C0E, 0x2C3E, }, |
2302 | { 0x2C0F, 0x2C3F, }, |
2303 | { 0x2C10, 0x2C40, }, |
2304 | { 0x2C11, 0x2C41, }, |
2305 | { 0x2C12, 0x2C42, }, |
2306 | { 0x2C13, 0x2C43, }, |
2307 | { 0x2C14, 0x2C44, }, |
2308 | { 0x2C15, 0x2C45, }, |
2309 | { 0x2C16, 0x2C46, }, |
2310 | { 0x2C17, 0x2C47, }, |
2311 | { 0x2C18, 0x2C48, }, |
2312 | { 0x2C19, 0x2C49, }, |
2313 | { 0x2C1A, 0x2C4A, }, |
2314 | { 0x2C1B, 0x2C4B, }, |
2315 | { 0x2C1C, 0x2C4C, }, |
2316 | { 0x2C1D, 0x2C4D, }, |
2317 | { 0x2C1E, 0x2C4E, }, |
2318 | { 0x2C1F, 0x2C4F, }, |
2319 | { 0x2C20, 0x2C50, }, |
2320 | { 0x2C21, 0x2C51, }, |
2321 | { 0x2C22, 0x2C52, }, |
2322 | { 0x2C23, 0x2C53, }, |
2323 | { 0x2C24, 0x2C54, }, |
2324 | { 0x2C25, 0x2C55, }, |
2325 | { 0x2C26, 0x2C56, }, |
2326 | { 0x2C27, 0x2C57, }, |
2327 | { 0x2C28, 0x2C58, }, |
2328 | { 0x2C29, 0x2C59, }, |
2329 | { 0x2C2A, 0x2C5A, }, |
2330 | { 0x2C2B, 0x2C5B, }, |
2331 | { 0x2C2C, 0x2C5C, }, |
2332 | { 0x2C2D, 0x2C5D, }, |
2333 | { 0x2C2E, 0x2C5E, }, |
2334 | { 0x2C60, 0x2C61, }, |
2335 | { 0x2C62, 0x026B, }, |
2336 | { 0x2C63, 0x1D7D, }, |
2337 | { 0x2C64, 0x027D, }, |
2338 | { 0x2C67, 0x2C68, }, |
2339 | { 0x2C69, 0x2C6A, }, |
2340 | { 0x2C6B, 0x2C6C, }, |
2341 | { 0x2C6D, 0x0251, }, |
2342 | { 0x2C6E, 0x0271, }, |
2343 | { 0x2C6F, 0x0250, }, |
2344 | { 0x2C70, 0x0252, }, |
2345 | { 0x2C72, 0x2C73, }, |
2346 | { 0x2C75, 0x2C76, }, |
2347 | { 0x2C7E, 0x023F, }, |
2348 | { 0x2C7F, 0x0240, }, |
2349 | { 0x2C80, 0x2C81, }, |
2350 | { 0x2C82, 0x2C83, }, |
2351 | { 0x2C84, 0x2C85, }, |
2352 | { 0x2C86, 0x2C87, }, |
2353 | { 0x2C88, 0x2C89, }, |
2354 | { 0x2C8A, 0x2C8B, }, |
2355 | { 0x2C8C, 0x2C8D, }, |
2356 | { 0x2C8E, 0x2C8F, }, |
2357 | { 0x2C90, 0x2C91, }, |
2358 | { 0x2C92, 0x2C93, }, |
2359 | { 0x2C94, 0x2C95, }, |
2360 | { 0x2C96, 0x2C97, }, |
2361 | { 0x2C98, 0x2C99, }, |
2362 | { 0x2C9A, 0x2C9B, }, |
2363 | { 0x2C9C, 0x2C9D, }, |
2364 | { 0x2C9E, 0x2C9F, }, |
2365 | { 0x2CA0, 0x2CA1, }, |
2366 | { 0x2CA2, 0x2CA3, }, |
2367 | { 0x2CA4, 0x2CA5, }, |
2368 | { 0x2CA6, 0x2CA7, }, |
2369 | { 0x2CA8, 0x2CA9, }, |
2370 | { 0x2CAA, 0x2CAB, }, |
2371 | { 0x2CAC, 0x2CAD, }, |
2372 | { 0x2CAE, 0x2CAF, }, |
2373 | { 0x2CB0, 0x2CB1, }, |
2374 | { 0x2CB2, 0x2CB3, }, |
2375 | { 0x2CB4, 0x2CB5, }, |
2376 | { 0x2CB6, 0x2CB7, }, |
2377 | { 0x2CB8, 0x2CB9, }, |
2378 | { 0x2CBA, 0x2CBB, }, |
2379 | { 0x2CBC, 0x2CBD, }, |
2380 | { 0x2CBE, 0x2CBF, }, |
2381 | { 0x2CC0, 0x2CC1, }, |
2382 | { 0x2CC2, 0x2CC3, }, |
2383 | { 0x2CC4, 0x2CC5, }, |
2384 | { 0x2CC6, 0x2CC7, }, |
2385 | { 0x2CC8, 0x2CC9, }, |
2386 | { 0x2CCA, 0x2CCB, }, |
2387 | { 0x2CCC, 0x2CCD, }, |
2388 | { 0x2CCE, 0x2CCF, }, |
2389 | { 0x2CD0, 0x2CD1, }, |
2390 | { 0x2CD2, 0x2CD3, }, |
2391 | { 0x2CD4, 0x2CD5, }, |
2392 | { 0x2CD6, 0x2CD7, }, |
2393 | { 0x2CD8, 0x2CD9, }, |
2394 | { 0x2CDA, 0x2CDB, }, |
2395 | { 0x2CDC, 0x2CDD, }, |
2396 | { 0x2CDE, 0x2CDF, }, |
2397 | { 0x2CE0, 0x2CE1, }, |
2398 | { 0x2CE2, 0x2CE3, }, |
2399 | { 0x2CEB, 0x2CEC, }, |
2400 | { 0x2CED, 0x2CEE, }, |
2401 | { 0x2CF2, 0x2CF3, }, |
2402 | { 0xA640, 0xA641, }, |
2403 | { 0xA642, 0xA643, }, |
2404 | { 0xA644, 0xA645, }, |
2405 | { 0xA646, 0xA647, }, |
2406 | { 0xA648, 0xA649, }, |
2407 | { 0xA64A, 0xA64B, }, |
2408 | { 0xA64C, 0xA64D, }, |
2409 | { 0xA64E, 0xA64F, }, |
2410 | { 0xA650, 0xA651, }, |
2411 | { 0xA652, 0xA653, }, |
2412 | { 0xA654, 0xA655, }, |
2413 | { 0xA656, 0xA657, }, |
2414 | { 0xA658, 0xA659, }, |
2415 | { 0xA65A, 0xA65B, }, |
2416 | { 0xA65C, 0xA65D, }, |
2417 | { 0xA65E, 0xA65F, }, |
2418 | { 0xA660, 0xA661, }, |
2419 | { 0xA662, 0xA663, }, |
2420 | { 0xA664, 0xA665, }, |
2421 | { 0xA666, 0xA667, }, |
2422 | { 0xA668, 0xA669, }, |
2423 | { 0xA66A, 0xA66B, }, |
2424 | { 0xA66C, 0xA66D, }, |
2425 | { 0xA680, 0xA681, }, |
2426 | { 0xA682, 0xA683, }, |
2427 | { 0xA684, 0xA685, }, |
2428 | { 0xA686, 0xA687, }, |
2429 | { 0xA688, 0xA689, }, |
2430 | { 0xA68A, 0xA68B, }, |
2431 | { 0xA68C, 0xA68D, }, |
2432 | { 0xA68E, 0xA68F, }, |
2433 | { 0xA690, 0xA691, }, |
2434 | { 0xA692, 0xA693, }, |
2435 | { 0xA694, 0xA695, }, |
2436 | { 0xA696, 0xA697, }, |
2437 | { 0xA698, 0xA699, }, |
2438 | { 0xA69A, 0xA69B, }, |
2439 | { 0xA722, 0xA723, }, |
2440 | { 0xA724, 0xA725, }, |
2441 | { 0xA726, 0xA727, }, |
2442 | { 0xA728, 0xA729, }, |
2443 | { 0xA72A, 0xA72B, }, |
2444 | { 0xA72C, 0xA72D, }, |
2445 | { 0xA72E, 0xA72F, }, |
2446 | { 0xA732, 0xA733, }, |
2447 | { 0xA734, 0xA735, }, |
2448 | { 0xA736, 0xA737, }, |
2449 | { 0xA738, 0xA739, }, |
2450 | { 0xA73A, 0xA73B, }, |
2451 | { 0xA73C, 0xA73D, }, |
2452 | { 0xA73E, 0xA73F, }, |
2453 | { 0xA740, 0xA741, }, |
2454 | { 0xA742, 0xA743, }, |
2455 | { 0xA744, 0xA745, }, |
2456 | { 0xA746, 0xA747, }, |
2457 | { 0xA748, 0xA749, }, |
2458 | { 0xA74A, 0xA74B, }, |
2459 | { 0xA74C, 0xA74D, }, |
2460 | { 0xA74E, 0xA74F, }, |
2461 | { 0xA750, 0xA751, }, |
2462 | { 0xA752, 0xA753, }, |
2463 | { 0xA754, 0xA755, }, |
2464 | { 0xA756, 0xA757, }, |
2465 | { 0xA758, 0xA759, }, |
2466 | { 0xA75A, 0xA75B, }, |
2467 | { 0xA75C, 0xA75D, }, |
2468 | { 0xA75E, 0xA75F, }, |
2469 | { 0xA760, 0xA761, }, |
2470 | { 0xA762, 0xA763, }, |
2471 | { 0xA764, 0xA765, }, |
2472 | { 0xA766, 0xA767, }, |
2473 | { 0xA768, 0xA769, }, |
2474 | { 0xA76A, 0xA76B, }, |
2475 | { 0xA76C, 0xA76D, }, |
2476 | { 0xA76E, 0xA76F, }, |
2477 | { 0xA779, 0xA77A, }, |
2478 | { 0xA77B, 0xA77C, }, |
2479 | { 0xA77D, 0x1D79, }, |
2480 | { 0xA77E, 0xA77F, }, |
2481 | { 0xA780, 0xA781, }, |
2482 | { 0xA782, 0xA783, }, |
2483 | { 0xA784, 0xA785, }, |
2484 | { 0xA786, 0xA787, }, |
2485 | { 0xA78B, 0xA78C, }, |
2486 | { 0xA78D, 0x0265, }, |
2487 | { 0xA790, 0xA791, }, |
2488 | { 0xA792, 0xA793, }, |
2489 | { 0xA796, 0xA797, }, |
2490 | { 0xA798, 0xA799, }, |
2491 | { 0xA79A, 0xA79B, }, |
2492 | { 0xA79C, 0xA79D, }, |
2493 | { 0xA79E, 0xA79F, }, |
2494 | { 0xA7A0, 0xA7A1, }, |
2495 | { 0xA7A2, 0xA7A3, }, |
2496 | { 0xA7A4, 0xA7A5, }, |
2497 | { 0xA7A6, 0xA7A7, }, |
2498 | { 0xA7A8, 0xA7A9, }, |
2499 | { 0xA7AA, 0x0266, }, |
2500 | { 0xA7AB, 0x025C, }, |
2501 | { 0xA7AC, 0x0261, }, |
2502 | { 0xA7AD, 0x026C, }, |
2503 | { 0xA7AE, 0x026A, }, |
2504 | { 0xA7B0, 0x029E, }, |
2505 | { 0xA7B1, 0x0287, }, |
2506 | { 0xA7B2, 0x029D, }, |
2507 | { 0xA7B3, 0xAB53, }, |
2508 | { 0xA7B4, 0xA7B5, }, |
2509 | { 0xA7B6, 0xA7B7, }, |
2510 | { 0xFF21, 0xFF41, }, |
2511 | { 0xFF22, 0xFF42, }, |
2512 | { 0xFF23, 0xFF43, }, |
2513 | { 0xFF24, 0xFF44, }, |
2514 | { 0xFF25, 0xFF45, }, |
2515 | { 0xFF26, 0xFF46, }, |
2516 | { 0xFF27, 0xFF47, }, |
2517 | { 0xFF28, 0xFF48, }, |
2518 | { 0xFF29, 0xFF49, }, |
2519 | { 0xFF2A, 0xFF4A, }, |
2520 | { 0xFF2B, 0xFF4B, }, |
2521 | { 0xFF2C, 0xFF4C, }, |
2522 | { 0xFF2D, 0xFF4D, }, |
2523 | { 0xFF2E, 0xFF4E, }, |
2524 | { 0xFF2F, 0xFF4F, }, |
2525 | { 0xFF30, 0xFF50, }, |
2526 | { 0xFF31, 0xFF51, }, |
2527 | { 0xFF32, 0xFF52, }, |
2528 | { 0xFF33, 0xFF53, }, |
2529 | { 0xFF34, 0xFF54, }, |
2530 | { 0xFF35, 0xFF55, }, |
2531 | { 0xFF36, 0xFF56, }, |
2532 | { 0xFF37, 0xFF57, }, |
2533 | { 0xFF38, 0xFF58, }, |
2534 | { 0xFF39, 0xFF59, }, |
2535 | { 0xFF3A, 0xFF5A, }, |
2536 | { 0x10400, 0x10428, }, |
2537 | { 0x10401, 0x10429, }, |
2538 | { 0x10402, 0x1042A, }, |
2539 | { 0x10403, 0x1042B, }, |
2540 | { 0x10404, 0x1042C, }, |
2541 | { 0x10405, 0x1042D, }, |
2542 | { 0x10406, 0x1042E, }, |
2543 | { 0x10407, 0x1042F, }, |
2544 | { 0x10408, 0x10430, }, |
2545 | { 0x10409, 0x10431, }, |
2546 | { 0x1040A, 0x10432, }, |
2547 | { 0x1040B, 0x10433, }, |
2548 | { 0x1040C, 0x10434, }, |
2549 | { 0x1040D, 0x10435, }, |
2550 | { 0x1040E, 0x10436, }, |
2551 | { 0x1040F, 0x10437, }, |
2552 | { 0x10410, 0x10438, }, |
2553 | { 0x10411, 0x10439, }, |
2554 | { 0x10412, 0x1043A, }, |
2555 | { 0x10413, 0x1043B, }, |
2556 | { 0x10414, 0x1043C, }, |
2557 | { 0x10415, 0x1043D, }, |
2558 | { 0x10416, 0x1043E, }, |
2559 | { 0x10417, 0x1043F, }, |
2560 | { 0x10418, 0x10440, }, |
2561 | { 0x10419, 0x10441, }, |
2562 | { 0x1041A, 0x10442, }, |
2563 | { 0x1041B, 0x10443, }, |
2564 | { 0x1041C, 0x10444, }, |
2565 | { 0x1041D, 0x10445, }, |
2566 | { 0x1041E, 0x10446, }, |
2567 | { 0x1041F, 0x10447, }, |
2568 | { 0x10420, 0x10448, }, |
2569 | { 0x10421, 0x10449, }, |
2570 | { 0x10422, 0x1044A, }, |
2571 | { 0x10423, 0x1044B, }, |
2572 | { 0x10424, 0x1044C, }, |
2573 | { 0x10425, 0x1044D, }, |
2574 | { 0x10426, 0x1044E, }, |
2575 | { 0x10427, 0x1044F, }, |
2576 | { 0x104B0, 0x104D8, }, |
2577 | { 0x104B1, 0x104D9, }, |
2578 | { 0x104B2, 0x104DA, }, |
2579 | { 0x104B3, 0x104DB, }, |
2580 | { 0x104B4, 0x104DC, }, |
2581 | { 0x104B5, 0x104DD, }, |
2582 | { 0x104B6, 0x104DE, }, |
2583 | { 0x104B7, 0x104DF, }, |
2584 | { 0x104B8, 0x104E0, }, |
2585 | { 0x104B9, 0x104E1, }, |
2586 | { 0x104BA, 0x104E2, }, |
2587 | { 0x104BB, 0x104E3, }, |
2588 | { 0x104BC, 0x104E4, }, |
2589 | { 0x104BD, 0x104E5, }, |
2590 | { 0x104BE, 0x104E6, }, |
2591 | { 0x104BF, 0x104E7, }, |
2592 | { 0x104C0, 0x104E8, }, |
2593 | { 0x104C1, 0x104E9, }, |
2594 | { 0x104C2, 0x104EA, }, |
2595 | { 0x104C3, 0x104EB, }, |
2596 | { 0x104C4, 0x104EC, }, |
2597 | { 0x104C5, 0x104ED, }, |
2598 | { 0x104C6, 0x104EE, }, |
2599 | { 0x104C7, 0x104EF, }, |
2600 | { 0x104C8, 0x104F0, }, |
2601 | { 0x104C9, 0x104F1, }, |
2602 | { 0x104CA, 0x104F2, }, |
2603 | { 0x104CB, 0x104F3, }, |
2604 | { 0x104CC, 0x104F4, }, |
2605 | { 0x104CD, 0x104F5, }, |
2606 | { 0x104CE, 0x104F6, }, |
2607 | { 0x104CF, 0x104F7, }, |
2608 | { 0x104D0, 0x104F8, }, |
2609 | { 0x104D1, 0x104F9, }, |
2610 | { 0x104D2, 0x104FA, }, |
2611 | { 0x104D3, 0x104FB, }, |
2612 | { 0x10C80, 0x10CC0, }, |
2613 | { 0x10C81, 0x10CC1, }, |
2614 | { 0x10C82, 0x10CC2, }, |
2615 | { 0x10C83, 0x10CC3, }, |
2616 | { 0x10C84, 0x10CC4, }, |
2617 | { 0x10C85, 0x10CC5, }, |
2618 | { 0x10C86, 0x10CC6, }, |
2619 | { 0x10C87, 0x10CC7, }, |
2620 | { 0x10C88, 0x10CC8, }, |
2621 | { 0x10C89, 0x10CC9, }, |
2622 | { 0x10C8A, 0x10CCA, }, |
2623 | { 0x10C8B, 0x10CCB, }, |
2624 | { 0x10C8C, 0x10CCC, }, |
2625 | { 0x10C8D, 0x10CCD, }, |
2626 | { 0x10C8E, 0x10CCE, }, |
2627 | { 0x10C8F, 0x10CCF, }, |
2628 | { 0x10C90, 0x10CD0, }, |
2629 | { 0x10C91, 0x10CD1, }, |
2630 | { 0x10C92, 0x10CD2, }, |
2631 | { 0x10C93, 0x10CD3, }, |
2632 | { 0x10C94, 0x10CD4, }, |
2633 | { 0x10C95, 0x10CD5, }, |
2634 | { 0x10C96, 0x10CD6, }, |
2635 | { 0x10C97, 0x10CD7, }, |
2636 | { 0x10C98, 0x10CD8, }, |
2637 | { 0x10C99, 0x10CD9, }, |
2638 | { 0x10C9A, 0x10CDA, }, |
2639 | { 0x10C9B, 0x10CDB, }, |
2640 | { 0x10C9C, 0x10CDC, }, |
2641 | { 0x10C9D, 0x10CDD, }, |
2642 | { 0x10C9E, 0x10CDE, }, |
2643 | { 0x10C9F, 0x10CDF, }, |
2644 | { 0x10CA0, 0x10CE0, }, |
2645 | { 0x10CA1, 0x10CE1, }, |
2646 | { 0x10CA2, 0x10CE2, }, |
2647 | { 0x10CA3, 0x10CE3, }, |
2648 | { 0x10CA4, 0x10CE4, }, |
2649 | { 0x10CA5, 0x10CE5, }, |
2650 | { 0x10CA6, 0x10CE6, }, |
2651 | { 0x10CA7, 0x10CE7, }, |
2652 | { 0x10CA8, 0x10CE8, }, |
2653 | { 0x10CA9, 0x10CE9, }, |
2654 | { 0x10CAA, 0x10CEA, }, |
2655 | { 0x10CAB, 0x10CEB, }, |
2656 | { 0x10CAC, 0x10CEC, }, |
2657 | { 0x10CAD, 0x10CED, }, |
2658 | { 0x10CAE, 0x10CEE, }, |
2659 | { 0x10CAF, 0x10CEF, }, |
2660 | { 0x10CB0, 0x10CF0, }, |
2661 | { 0x10CB1, 0x10CF1, }, |
2662 | { 0x10CB2, 0x10CF2, }, |
2663 | { 0x118A0, 0x118C0, }, |
2664 | { 0x118A1, 0x118C1, }, |
2665 | { 0x118A2, 0x118C2, }, |
2666 | { 0x118A3, 0x118C3, }, |
2667 | { 0x118A4, 0x118C4, }, |
2668 | { 0x118A5, 0x118C5, }, |
2669 | { 0x118A6, 0x118C6, }, |
2670 | { 0x118A7, 0x118C7, }, |
2671 | { 0x118A8, 0x118C8, }, |
2672 | { 0x118A9, 0x118C9, }, |
2673 | { 0x118AA, 0x118CA, }, |
2674 | { 0x118AB, 0x118CB, }, |
2675 | { 0x118AC, 0x118CC, }, |
2676 | { 0x118AD, 0x118CD, }, |
2677 | { 0x118AE, 0x118CE, }, |
2678 | { 0x118AF, 0x118CF, }, |
2679 | { 0x118B0, 0x118D0, }, |
2680 | { 0x118B1, 0x118D1, }, |
2681 | { 0x118B2, 0x118D2, }, |
2682 | { 0x118B3, 0x118D3, }, |
2683 | { 0x118B4, 0x118D4, }, |
2684 | { 0x118B5, 0x118D5, }, |
2685 | { 0x118B6, 0x118D6, }, |
2686 | { 0x118B7, 0x118D7, }, |
2687 | { 0x118B8, 0x118D8, }, |
2688 | { 0x118B9, 0x118D9, }, |
2689 | { 0x118BA, 0x118DA, }, |
2690 | { 0x118BB, 0x118DB, }, |
2691 | { 0x118BC, 0x118DC, }, |
2692 | { 0x118BD, 0x118DD, }, |
2693 | { 0x118BE, 0x118DE, }, |
2694 | { 0x118BF, 0x118DF, }, |
2695 | { 0x1E900, 0x1E922, }, |
2696 | { 0x1E901, 0x1E923, }, |
2697 | { 0x1E902, 0x1E924, }, |
2698 | { 0x1E903, 0x1E925, }, |
2699 | { 0x1E904, 0x1E926, }, |
2700 | { 0x1E905, 0x1E927, }, |
2701 | { 0x1E906, 0x1E928, }, |
2702 | { 0x1E907, 0x1E929, }, |
2703 | { 0x1E908, 0x1E92A, }, |
2704 | { 0x1E909, 0x1E92B, }, |
2705 | { 0x1E90A, 0x1E92C, }, |
2706 | { 0x1E90B, 0x1E92D, }, |
2707 | { 0x1E90C, 0x1E92E, }, |
2708 | { 0x1E90D, 0x1E92F, }, |
2709 | { 0x1E90E, 0x1E930, }, |
2710 | { 0x1E90F, 0x1E931, }, |
2711 | { 0x1E910, 0x1E932, }, |
2712 | { 0x1E911, 0x1E933, }, |
2713 | { 0x1E912, 0x1E934, }, |
2714 | { 0x1E913, 0x1E935, }, |
2715 | { 0x1E914, 0x1E936, }, |
2716 | { 0x1E915, 0x1E937, }, |
2717 | { 0x1E916, 0x1E938, }, |
2718 | { 0x1E917, 0x1E939, }, |
2719 | { 0x1E918, 0x1E93A, }, |
2720 | { 0x1E919, 0x1E93B, }, |
2721 | { 0x1E91A, 0x1E93C, }, |
2722 | { 0x1E91B, 0x1E93D, }, |
2723 | { 0x1E91C, 0x1E93E, }, |
2724 | { 0x1E91D, 0x1E93F, }, |
2725 | { 0x1E91E, 0x1E940, }, |
2726 | { 0x1E91F, 0x1E941, }, |
2727 | { 0x1E920, 0x1E942, }, |
2728 | { 0x1E921, 0x1E943, }, |
2729 | }; |
2730 | |
2731 | static BAT *UTF8_toUpperFrom = NULL, *UTF8_toUpperTo = NULL, |
2732 | *UTF8_toLowerFrom = NULL, *UTF8_toLowerTo = NULL; |
2733 | |
2734 | #ifndef NDEBUG |
2735 | static void |
2736 | UTF8_assert(const char *s) |
2737 | { |
2738 | int c; |
2739 | |
2740 | if (s == NULL) |
2741 | return; |
2742 | if (*s == '\200' && s[1] == '\0') |
2743 | return; /* str_nil */ |
2744 | while ((c = *s++) != '\0') { |
2745 | if ((c & 0x80) == 0) |
2746 | continue; |
2747 | if ((*s++ & 0xC0) != 0x80) |
2748 | assert(0); |
2749 | if ((c & 0xE0) == 0xC0) |
2750 | continue; |
2751 | if ((*s++ & 0xC0) != 0x80) |
2752 | assert(0); |
2753 | if ((c & 0xF0) == 0xE0) |
2754 | continue; |
2755 | if ((*s++ & 0xC0) != 0x80) |
2756 | assert(0); |
2757 | if ((c & 0xF8) == 0xF0) |
2758 | continue; |
2759 | assert(0); |
2760 | } |
2761 | } |
2762 | #else |
2763 | #define UTF8_assert(s) ((void) 0) |
2764 | #endif |
2765 | |
2766 | str |
2767 | strPrelude(void *ret) |
2768 | { |
2769 | (void) ret; |
2770 | if (UTF8_toUpperFrom == NULL) { |
2771 | size_t i; |
2772 | |
2773 | UTF8_toUpperFrom = COLnew(0, TYPE_int, 1500, TRANSIENT); |
2774 | UTF8_toUpperTo = COLnew(0, TYPE_int, 1500, TRANSIENT); |
2775 | UTF8_toLowerFrom = COLnew(0, TYPE_int, 1500, TRANSIENT); |
2776 | UTF8_toLowerTo = COLnew(0, TYPE_int, 1500, TRANSIENT); |
2777 | if (UTF8_toUpperFrom == NULL || UTF8_toUpperTo == NULL || |
2778 | UTF8_toLowerFrom == NULL || UTF8_toLowerTo == NULL) { |
2779 | goto bailout; |
2780 | } |
2781 | |
2782 | for (i = 0; i < sizeof(UTF8_toUpper) / sizeof(UTF8_toUpper[0]); i++) { |
2783 | if (BUNappend(UTF8_toUpperFrom, &UTF8_toUpper[i].from, false) != GDK_SUCCEED || |
2784 | BUNappend(UTF8_toUpperTo, &UTF8_toUpper[i].to, false) != GDK_SUCCEED) |
2785 | goto bailout; |
2786 | } |
2787 | |
2788 | for (i = 0; i < sizeof(UTF8_toLower) / sizeof(UTF8_toLower[0]); i++) { |
2789 | if (BUNappend(UTF8_toLowerFrom, &UTF8_toLower[i].from, false) != GDK_SUCCEED || |
2790 | BUNappend(UTF8_toLowerTo, &UTF8_toLower[i].to, false) != GDK_SUCCEED) |
2791 | goto bailout; |
2792 | } |
2793 | |
2794 | if (BBPrename(UTF8_toUpperFrom->batCacheid, "monet_unicode_upper_from" ) != 0 || |
2795 | BBPrename(UTF8_toUpperTo->batCacheid, "monet_unicode_upper_to" ) != 0 || |
2796 | BBPrename(UTF8_toLowerFrom->batCacheid, "monet_unicode_lower_from" ) != 0 || |
2797 | BBPrename(UTF8_toLowerTo->batCacheid, "monet_unicode_lower_to" ) != 0) { |
2798 | goto bailout; |
2799 | } |
2800 | } |
2801 | return MAL_SUCCEED; |
2802 | |
2803 | bailout: |
2804 | BBPreclaim(UTF8_toUpperFrom); |
2805 | BBPreclaim(UTF8_toUpperTo); |
2806 | BBPreclaim(UTF8_toLowerFrom); |
2807 | BBPreclaim(UTF8_toLowerTo); |
2808 | UTF8_toUpperFrom = NULL; |
2809 | UTF8_toUpperTo = NULL; |
2810 | UTF8_toLowerFrom = NULL; |
2811 | UTF8_toLowerTo = NULL; |
2812 | throw(MAL, "str.prelude" , GDK_EXCEPTION); |
2813 | } |
2814 | |
2815 | str |
2816 | strEpilogue(void *ret) |
2817 | { |
2818 | (void) ret; |
2819 | if (UTF8_toUpperFrom) |
2820 | BBPunfix(UTF8_toUpperFrom->batCacheid); |
2821 | if (UTF8_toUpperTo) |
2822 | BBPunfix(UTF8_toUpperTo->batCacheid); |
2823 | if (UTF8_toLowerFrom) |
2824 | BBPunfix(UTF8_toLowerFrom->batCacheid); |
2825 | if (UTF8_toLowerTo) |
2826 | BBPunfix(UTF8_toLowerTo->batCacheid); |
2827 | UTF8_toUpperFrom = NULL; |
2828 | UTF8_toUpperTo = NULL; |
2829 | UTF8_toLowerFrom = NULL; |
2830 | UTF8_toLowerTo = NULL; |
2831 | return MAL_SUCCEED; |
2832 | } |
2833 | |
2834 | /* Get the last char in (X2), and #bytes it takes, but do not decrease |
2835 | * the pos in (X2). See gdk_atoms.c for UTF-8 encoding */ |
2836 | #define UTF8_LASTCHAR(X1, SZ, X2, SZ2) \ |
2837 | do { \ |
2838 | if (((X2)[SZ2-1] & 0x80) == 0) { \ |
2839 | (X1) = (X2)[SZ2-1]; \ |
2840 | (SZ) = 1; \ |
2841 | } else if (((X2)[SZ2-2] & 0xE0) == 0xC0) { \ |
2842 | (X1) = ((X2)[SZ2-2] & 0x1F) << 6; \ |
2843 | (X1) |= ((X2)[SZ2-1] & 0x3F); \ |
2844 | (SZ) = 2; \ |
2845 | } else if (((X2)[SZ2-3] & 0xF0) == 0xE0) { \ |
2846 | (X1) = ((X2)[SZ2-3] & 0x0F) << 12; \ |
2847 | (X1) |= ((X2)[SZ2-2] & 0x3F) << 6; \ |
2848 | (X1) |= ((X2)[SZ2-1] & 0x3F); \ |
2849 | (SZ) = 3; \ |
2850 | } else if (((X2)[SZ2-4] & 0xF8) == 0xF0) { \ |
2851 | (X1) = ((X2)[SZ2-4] & 0x07) << 18; \ |
2852 | (X1) |= ((X2)[SZ2-3] & 0x3F) << 12; \ |
2853 | (X1) |= ((X2)[SZ2-2] & 0x3F) << 6; \ |
2854 | (X1) |= ((X2)[SZ2-1] & 0x3F); \ |
2855 | (SZ) = 4; \ |
2856 | } else { \ |
2857 | (X1) = int_nil; \ |
2858 | (SZ) = 0; \ |
2859 | } \ |
2860 | } while (0) |
2861 | |
2862 | /* Get the first char in (X2), and #bytes it takes, but do not |
2863 | * increase the pos in (X2) */ |
2864 | #define UTF8_NEXTCHAR(X1, SZ, X2) \ |
2865 | do { \ |
2866 | if (((X2)[0] & 0x80) == 0) { \ |
2867 | (X1) = (X2)[0]; \ |
2868 | (SZ) = 1; \ |
2869 | } else if (((X2)[0] & 0xE0) == 0xC0) { \ |
2870 | (X1) = ((X2)[0] & 0x1F) << 6; \ |
2871 | (X1) |= ((X2)[1] & 0x3F); \ |
2872 | (SZ) = 2; \ |
2873 | } else if (((X2)[0] & 0xF0) == 0xE0) { \ |
2874 | (X1) = ((X2)[0] & 0x0F) << 12; \ |
2875 | (X1) |= ((X2)[1] & 0x3F) << 6; \ |
2876 | (X1) |= ((X2)[2] & 0x3F); \ |
2877 | (SZ) = 3; \ |
2878 | } else if (((X2)[0] & 0xF8) == 0xF0) { \ |
2879 | (X1) = ((X2)[0] & 0x07) << 18; \ |
2880 | (X1) |= ((X2)[1] & 0x3F) << 12; \ |
2881 | (X1) |= ((X2)[2] & 0x3F) << 6; \ |
2882 | (X1) |= ((X2)[3] & 0x3F); \ |
2883 | (SZ) = 4; \ |
2884 | } else { \ |
2885 | (X1) = int_nil; \ |
2886 | (SZ) = 0; \ |
2887 | } \ |
2888 | } while (0) |
2889 | |
2890 | #define UTF8_GETCHAR(X1, X2) \ |
2891 | do { \ |
2892 | if ((*(X2) & 0x80) == 0) { \ |
2893 | (X1) = *(X2)++; \ |
2894 | } else if ((*(X2) & 0xE0) == 0xC0) { \ |
2895 | (X1) = (*(X2)++ & 0x1F) << 6; \ |
2896 | (X1) |= (*(X2)++ & 0x3F); \ |
2897 | } else if ((*(X2) & 0xF0) == 0xE0) { \ |
2898 | (X1) = (*(X2)++ & 0x0F) << 12; \ |
2899 | (X1) |= (*(X2)++ & 0x3F) << 6; \ |
2900 | (X1) |= (*(X2)++ & 0x3F); \ |
2901 | } else if ((*(X2) & 0xF8) == 0xF0) { \ |
2902 | (X1) = (*(X2)++ & 0x07) << 18; \ |
2903 | (X1) |= (*(X2)++ & 0x3F) << 12; \ |
2904 | (X1) |= (*(X2)++ & 0x3F) << 6; \ |
2905 | (X1) |= (*(X2)++ & 0x3F); \ |
2906 | if ((X1) > 0x10FFFF || ((X1) & 0x1FF800) == 0xD800) \ |
2907 | goto illegal; \ |
2908 | } else { \ |
2909 | (X1) = int_nil; \ |
2910 | } \ |
2911 | } while (0) |
2912 | |
2913 | #define UTF8_PUTCHAR(X1, X2) \ |
2914 | do { \ |
2915 | if ((X1) < 0 || (X1) > 0x10FFFF || ((X1) & 0x1FF800) == 0xD800) { \ |
2916 | goto illegal; \ |
2917 | } else if ((X1) <= 0x7F) { \ |
2918 | *(X2)++ = (X1); \ |
2919 | } else if ((X1) <= 0x7FF) { \ |
2920 | *(X2)++ = 0xC0 | ((X1) >> 6); \ |
2921 | *(X2)++ = 0x80 | ((X1) & 0x3F); \ |
2922 | } else if ((X1) <= 0xFFFF) { \ |
2923 | *(X2)++ = 0xE0 | ((X1) >> 12); \ |
2924 | *(X2)++ = 0x80 | (((X1) >> 6) & 0x3F); \ |
2925 | *(X2)++ = 0x80 | ((X1) & 0x3F); \ |
2926 | } else { \ |
2927 | *(X2)++ = 0xF0 | ((X1) >> 18); \ |
2928 | *(X2)++ = 0x80 | (((X1) >> 12) & 0x3F); \ |
2929 | *(X2)++ = 0x80 | (((X1) >> 6) & 0x3F); \ |
2930 | *(X2)++ = 0x80 | ((X1) & 0x3F); \ |
2931 | } \ |
2932 | } while (0) |
2933 | |
2934 | #define UTF8_CHARLEN(UC) \ |
2935 | ((UC) <= 0x7F ? 1 : (UC) <= 0x7FF ? 2 : (UC) <= 0xFFFF ? 3 : 4) |
2936 | // (1 + ((UC) > 0x7F) + ((UC) > 0x7FF) + ((UC) > 0xFFFF)) |
2937 | |
2938 | static inline size_t |
2939 | UTF8_strlen(const char *s) |
2940 | { |
2941 | size_t pos = 0; |
2942 | |
2943 | UTF8_assert(s); |
2944 | |
2945 | if (GDK_STRNIL(s)) |
2946 | return 1; |
2947 | |
2948 | while (*s) { |
2949 | /* just count leading bytes of encoded code points; only works |
2950 | * for correctly encoded UTF-8 */ |
2951 | pos += (*s++ & 0xC0) != 0x80; |
2952 | } |
2953 | return pos; |
2954 | } |
2955 | |
2956 | static inline int |
2957 | UTF8_strpos(const char *s, const char *end) |
2958 | { |
2959 | int pos = 0; |
2960 | |
2961 | UTF8_assert(s); |
2962 | |
2963 | if (s > end) { |
2964 | return -1; |
2965 | } |
2966 | while (s < end) { |
2967 | /* just count leading bytes of encoded code points; only works |
2968 | * for correctly encoded UTF-8 */ |
2969 | pos += (*s++ & 0xC0) != 0x80; |
2970 | } |
2971 | return pos; |
2972 | } |
2973 | |
2974 | static inline str |
2975 | UTF8_strtail(const char *s, int pos) |
2976 | { |
2977 | UTF8_assert(s); |
2978 | while (*s) { |
2979 | if ((*s & 0xC0) != 0x80) { |
2980 | if (pos <= 0) |
2981 | break; |
2982 | pos--; |
2983 | } |
2984 | s++; |
2985 | } |
2986 | return (str) s; |
2987 | } |
2988 | |
2989 | static str |
2990 | convertCase(BAT *from, BAT *to, str *res, const char *src, const char *malfunc) |
2991 | { |
2992 | BATiter toi = bat_iterator(to); |
2993 | BATiter fromi = bat_iterator(from); |
2994 | size_t len = strlen(src); |
2995 | char *dst; |
2996 | const char *end = src + len; |
2997 | BUN UTF8_CONV_r; |
2998 | bool lower_to_upper = from == UTF8_toUpperFrom; |
2999 | |
3000 | if (strNil(src)) { |
3001 | *res = GDKstrdup(str_nil); |
3002 | } else { |
3003 | *res = GDKmalloc(len + 1); |
3004 | if (*res != NULL) { |
3005 | dst = *res; |
3006 | while (src < end) { |
3007 | int c; |
3008 | |
3009 | UTF8_GETCHAR(c, src); |
3010 | if ((c & 0x80) == 0) { |
3011 | /* for ASCII characters we don't need to do a hash |
3012 | * lookup */ |
3013 | if (lower_to_upper) { |
3014 | if ('a' <= c && c <= 'z') |
3015 | c += 'A' - 'a'; |
3016 | } else { |
3017 | if ('A' <= c && c <= 'Z') |
3018 | c += 'a' - 'A'; |
3019 | } |
3020 | } else { |
3021 | /* use hash, even though BAT is sorted */ |
3022 | HASHfnd_int(UTF8_CONV_r, fromi, &c); |
3023 | if (UTF8_CONV_r != BUN_NONE) |
3024 | c = *(int*) BUNtloc(toi, UTF8_CONV_r); |
3025 | } |
3026 | if (dst + UTF8_CHARLEN(c) > *res + len) { |
3027 | /* doesn't fit, so allocate more space; |
3028 | * also allocate enough for the rest of the |
3029 | * source */ |
3030 | size_t off = dst - *res; |
3031 | |
3032 | dst = GDKrealloc(*res, (len += 4 + (end - src)) + 1); |
3033 | if (dst == NULL) { |
3034 | /* if realloc fails, original buffer is still |
3035 | * allocated, so free it */ |
3036 | GDKfree(*res); |
3037 | goto hashfnd_failed; |
3038 | } |
3039 | *res = dst; |
3040 | dst = *res + off; |
3041 | } |
3042 | UTF8_PUTCHAR(c, dst); |
3043 | } |
3044 | *dst = 0; |
3045 | } |
3046 | } |
3047 | if (*res != NULL) |
3048 | return MAL_SUCCEED; |
3049 | hashfnd_failed: |
3050 | throw(MAL, malfunc, SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3051 | illegal: |
3052 | throw(MAL, malfunc, SQLSTATE(42000) "Illegal Unicode code point" ); |
3053 | } |
3054 | |
3055 | /* |
3056 | * Here you find the wrappers around the version 4 library code |
3057 | * It also contains the direct implementation of the string |
3058 | * matching support routines. |
3059 | */ |
3060 | #include "mal_exception.h" |
3061 | |
3062 | /* |
3063 | * The SQL like function return a boolean |
3064 | */ |
3065 | static int |
3066 | STRlike(const char *s, const char *pat, const char *esc) |
3067 | { |
3068 | const char *t, *p; |
3069 | |
3070 | t = s; |
3071 | for (p = pat; *p && *t; p++) { |
3072 | if (esc && *p == *esc) { |
3073 | p++; |
3074 | if (*p != *t) |
3075 | return FALSE; |
3076 | t++; |
3077 | } else if (*p == '_') |
3078 | t++; |
3079 | else if (*p == '%') { |
3080 | p++; |
3081 | while (*p == '%') |
3082 | p++; |
3083 | if (*p == 0) |
3084 | return TRUE; /* tail is acceptable */ |
3085 | for (; *p && *t; t++) |
3086 | if (STRlike(t, p, esc)) |
3087 | return TRUE; |
3088 | if (*p == 0 && *t == 0) |
3089 | return TRUE; |
3090 | return FALSE; |
3091 | } else if (*p == *t) |
3092 | t++; |
3093 | else |
3094 | return FALSE; |
3095 | } |
3096 | if (*p == '%' && *(p + 1) == 0) |
3097 | return TRUE; |
3098 | return *t == 0 && *p == 0; |
3099 | } |
3100 | |
3101 | str |
3102 | STRlikewrap(bit *ret, const str *s, const str *pat, const str *esc) |
3103 | { |
3104 | *ret = STRlike(*s, *pat, *esc); |
3105 | return MAL_SUCCEED; |
3106 | } |
3107 | |
3108 | str |
3109 | STRlikewrap2(bit *ret, const str *s, const str *pat) |
3110 | { |
3111 | *ret = STRlike(*s, *pat, NULL); |
3112 | return MAL_SUCCEED; |
3113 | } |
3114 | |
3115 | str |
3116 | STRtostr(str *res, const str *src) |
3117 | { |
3118 | if( *src == 0) |
3119 | *res= GDKstrdup(str_nil); |
3120 | else |
3121 | *res = GDKstrdup(*src); |
3122 | if (*res == NULL) |
3123 | throw(MAL, "str.str" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3124 | return MAL_SUCCEED; |
3125 | } |
3126 | |
3127 | str |
3128 | STRConcat(str *res, const str *val1, const str *val2) |
3129 | { |
3130 | size_t l1, l2; |
3131 | const char *s1 = *val1; |
3132 | const char *s2 = *val2; |
3133 | |
3134 | if (strNil(s1) || strNil(s2)) { |
3135 | *res = GDKstrdup(str_nil); |
3136 | } else { |
3137 | l1 = strlen(s1); |
3138 | l2 = strlen(s2); |
3139 | if ((*res = GDKmalloc(l1 + l2 + 1)) != NULL) { |
3140 | memcpy(*res, s1, l1); |
3141 | memcpy(*res + l1, s2, l2); |
3142 | (*res)[l1 + l2] = '\0'; |
3143 | } |
3144 | } |
3145 | if (*res == NULL) |
3146 | throw(MAL, "str.concat" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3147 | return MAL_SUCCEED; |
3148 | } |
3149 | |
3150 | str |
3151 | STRLength(int *res, const str *arg1) |
3152 | { |
3153 | size_t l; |
3154 | const char *s = *arg1; |
3155 | |
3156 | if (strNil(s)) { |
3157 | *res = int_nil; |
3158 | return MAL_SUCCEED; |
3159 | } |
3160 | l = UTF8_strlen(s); |
3161 | assert(l < INT_MAX); |
3162 | if (l > INT_MAX) |
3163 | l = INT_MAX; |
3164 | *res = (int) l; |
3165 | return MAL_SUCCEED; |
3166 | } |
3167 | |
3168 | str |
3169 | STRBytes(int *res, const str *arg1) |
3170 | { |
3171 | size_t l; |
3172 | |
3173 | l = strlen(*arg1); |
3174 | assert(l < INT_MAX); |
3175 | *res = (int) l; |
3176 | return MAL_SUCCEED; |
3177 | } |
3178 | |
3179 | str |
3180 | STRTail(str *res, const str *arg1, const int *offset) |
3181 | { |
3182 | int off = *offset; |
3183 | const char *s = *arg1; |
3184 | |
3185 | if (strNil(s) || is_int_nil(off)) { |
3186 | *res = GDKstrdup(str_nil); |
3187 | } else { |
3188 | if (off < 0) { |
3189 | size_t len = UTF8_strlen(s); |
3190 | |
3191 | assert(len <= INT_MAX); |
3192 | off += (int) len; |
3193 | if (off < 0) |
3194 | off = 0; |
3195 | } |
3196 | *res = GDKstrdup(UTF8_strtail(s, off)); |
3197 | } |
3198 | if (*res == NULL) |
3199 | throw(MAL, "str.tail" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3200 | return MAL_SUCCEED; |
3201 | } |
3202 | |
3203 | str |
3204 | STRSubString(str *res, const str *arg1, const int *offset, const int *length) |
3205 | { |
3206 | size_t len; |
3207 | int off = *offset, l = *length; |
3208 | const char *s = *arg1; |
3209 | |
3210 | if (strNil(s) || is_int_nil(off) || is_int_nil(l)) { |
3211 | *res = GDKstrdup(str_nil); |
3212 | if (*res == NULL) |
3213 | throw(MAL, "str.substring" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3214 | return MAL_SUCCEED; |
3215 | } |
3216 | if (off < 0) { |
3217 | len = UTF8_strlen(s); |
3218 | assert(len <= INT_MAX); |
3219 | if (len > INT_MAX) |
3220 | len = INT_MAX; |
3221 | off += (int) len; |
3222 | if (off < 0) { |
3223 | l += off; |
3224 | off = 0; |
3225 | } |
3226 | } |
3227 | /* here, off >= 0 */ |
3228 | if (l < 0) { |
3229 | *res = GDKstrdup("" ); |
3230 | if (*res == NULL) |
3231 | throw(MAL, "str.substring" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3232 | return MAL_SUCCEED; |
3233 | } |
3234 | s = UTF8_strtail(s, off); |
3235 | len = (size_t) (UTF8_strtail(s, l) - s); |
3236 | *res = GDKmalloc(len + 1); |
3237 | if (*res == NULL) |
3238 | throw(MAL, "str.substring" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3239 | strcpy_len(*res, s, len + 1); |
3240 | return MAL_SUCCEED; |
3241 | } |
3242 | |
3243 | str |
3244 | STRFromWChr(str *res, const int *c) |
3245 | { |
3246 | str s; |
3247 | |
3248 | if (is_int_nil(*c)) { |
3249 | *res = GDKstrdup(str_nil); |
3250 | if (*res == NULL) |
3251 | throw(MAL, "str.unicode" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3252 | return MAL_SUCCEED; |
3253 | } |
3254 | |
3255 | s = *res = GDKmalloc(5); |
3256 | if (*res == NULL) |
3257 | throw(MAL, "str.unicode" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3258 | UTF8_PUTCHAR(*c, s); |
3259 | *s = 0; |
3260 | return MAL_SUCCEED; |
3261 | illegal: |
3262 | GDKfree(*res); |
3263 | *res = NULL; |
3264 | throw(MAL, "str.unicode" , SQLSTATE(42000) "Illegal Unicode code point" ); |
3265 | } |
3266 | |
3267 | /* return the Unicode code point of arg1 at position at */ |
3268 | str |
3269 | STRWChrAt(int *res, const str *arg1, const int *at) |
3270 | { |
3271 | /* 64bit: should have lng arg */ |
3272 | const char *s = *arg1; |
3273 | |
3274 | if (strNil(s) || is_int_nil(*at) || *at < 0) { |
3275 | *res = int_nil; |
3276 | return MAL_SUCCEED; |
3277 | } |
3278 | s = UTF8_strtail(s, *at); |
3279 | if (s == NULL || *s == 0) { |
3280 | *res = int_nil; |
3281 | return MAL_SUCCEED; |
3282 | } |
3283 | UTF8_GETCHAR(*res, s); |
3284 | return MAL_SUCCEED; |
3285 | illegal: |
3286 | throw(MAL, "str.unicodeAt" , SQLSTATE(42000) "Illegal Unicode code point" ); |
3287 | } |
3288 | |
3289 | /* returns whether arg1 starts with arg2 */ |
3290 | str |
3291 | STRPrefix(bit *res, const str *arg1, const str *arg2) |
3292 | { |
3293 | const char *s = *arg1; |
3294 | const char *prefix = *arg2; |
3295 | |
3296 | if (strNil(s) || strNil(prefix)) { |
3297 | *res = bit_nil; |
3298 | return MAL_SUCCEED; |
3299 | } |
3300 | *res = strncmp(s, prefix, strlen(prefix)) == 0; |
3301 | return MAL_SUCCEED; |
3302 | } |
3303 | |
3304 | /* returns whether arg1 ends with arg2 */ |
3305 | str |
3306 | STRSuffix(bit *res, const str *arg1, const str *arg2) |
3307 | { |
3308 | size_t sl, sul; |
3309 | const char *s = *arg1; |
3310 | const char *suffix = *arg2; |
3311 | |
3312 | if (strNil(s) || strNil(suffix)) { |
3313 | *res = bit_nil; |
3314 | return MAL_SUCCEED; |
3315 | } |
3316 | sl = strlen(s); |
3317 | sul = strlen(suffix); |
3318 | |
3319 | if (sl < sul) |
3320 | *res = 0; |
3321 | else |
3322 | *res = strcmp(s + sl - sul, suffix) == 0; |
3323 | return MAL_SUCCEED; |
3324 | } |
3325 | |
3326 | str |
3327 | STRLower(str *res, const str *arg1) |
3328 | { |
3329 | return convertCase(UTF8_toLowerFrom, UTF8_toLowerTo, res, *arg1, "str.lower" ); |
3330 | } |
3331 | |
3332 | str |
3333 | STRUpper(str *res, const str *arg1) |
3334 | { |
3335 | return convertCase(UTF8_toUpperFrom, UTF8_toUpperTo, res, *arg1, "str.upper" ); |
3336 | } |
3337 | |
3338 | /* find first occurrence of needle in haystack */ |
3339 | str |
3340 | STRstrSearch(int *res, const str *haystack, const str *needle) |
3341 | { |
3342 | /* 64bit: should return lng */ |
3343 | const char *s = *haystack; |
3344 | const char *s2 = *needle; |
3345 | |
3346 | if (strNil(s) || strNil(s2)) { |
3347 | *res = int_nil; |
3348 | return MAL_SUCCEED; |
3349 | } |
3350 | if ((s2 = strstr(s, s2)) != NULL) |
3351 | *res = UTF8_strpos(s, s2); |
3352 | else |
3353 | *res = -1; |
3354 | return MAL_SUCCEED; |
3355 | } |
3356 | |
3357 | /* find last occurrence of arg2 in arg1 */ |
3358 | str |
3359 | STRReverseStrSearch(int *res, const str *arg1, const str *arg2) |
3360 | { |
3361 | /* 64bit: should return lng */ |
3362 | size_t len, slen; |
3363 | const char *s = *arg1; |
3364 | const char *s2 = *arg2; |
3365 | |
3366 | if (strNil(s) || strNil(s2)) { |
3367 | *res = int_nil; |
3368 | return MAL_SUCCEED; |
3369 | } |
3370 | *res = -1; |
3371 | len = strlen(s); |
3372 | slen = strlen(s2); |
3373 | *res = -1; /* changed if found */ |
3374 | if (len >= slen) { |
3375 | const char *p = s + len - slen; |
3376 | do { |
3377 | if (strncmp(p, s2, slen) == 0) { |
3378 | *res = UTF8_strpos(s, p); |
3379 | break; |
3380 | } |
3381 | } while (p-- > s); |
3382 | } |
3383 | return MAL_SUCCEED; |
3384 | } |
3385 | |
3386 | str |
3387 | STRsplitpart(str *res, str *haystack, str *needle, int *field) |
3388 | { |
3389 | size_t len; |
3390 | int f = *field; |
3391 | char *p; |
3392 | const char *s = *haystack; |
3393 | const char *s2 = *needle; |
3394 | |
3395 | if (strNil(s) || is_int_nil(*field)) { |
3396 | *res = GDKstrdup(str_nil); |
3397 | if (*res == NULL) |
3398 | throw(MAL, "str.splitpart" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3399 | return MAL_SUCCEED; |
3400 | } |
3401 | |
3402 | if (*field <= 0) { |
3403 | throw(MAL, "str.splitpart" , SQLSTATE(42000) "field position must be greater than zero" ); |
3404 | } |
3405 | |
3406 | len = strlen(s2); |
3407 | |
3408 | while ((p = strstr(s, s2)) != NULL && f > 1) { |
3409 | s = p + len; |
3410 | f--; |
3411 | } |
3412 | |
3413 | if (f != 1) { |
3414 | *res = GDKstrdup("" ); |
3415 | if (*res == NULL) |
3416 | throw(MAL, "str.splitpart" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3417 | return MAL_SUCCEED; |
3418 | } |
3419 | |
3420 | if (p == NULL) { |
3421 | len = strlen(s); |
3422 | } else { |
3423 | len = (size_t) (p - s); |
3424 | } |
3425 | |
3426 | *res = GDKstrndup(s, len); |
3427 | if (*res == NULL) |
3428 | throw(MAL, "str.splitpart" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3429 | return MAL_SUCCEED; |
3430 | } |
3431 | |
3432 | /* returns number of bytes to remove from left to strip the codepoints in rm */ |
3433 | static size_t |
3434 | lstrip(const char *s, size_t len, const int *rm, size_t nrm) |
3435 | { |
3436 | int c; |
3437 | size_t i, n, skip = 0; |
3438 | |
3439 | while (len > 0) { |
3440 | UTF8_NEXTCHAR(c, n, s); |
3441 | assert(n > 0 && n <= len); |
3442 | for (i = 0; i < nrm; i++) { |
3443 | if (rm[i] == c) { |
3444 | s += n; |
3445 | skip += n; |
3446 | len -= n; |
3447 | break; |
3448 | } |
3449 | } |
3450 | if (i == nrm) |
3451 | break; |
3452 | } |
3453 | return skip; |
3454 | } |
3455 | |
3456 | /* returns the resulting length of s after stripping codepoints in rm |
3457 | * from the right */ |
3458 | static size_t |
3459 | rstrip(const char *s, size_t len, const int *rm, size_t nrm) |
3460 | { |
3461 | int c; |
3462 | size_t i, n; |
3463 | |
3464 | while (len > 0) { |
3465 | UTF8_LASTCHAR(c, n, s, len); |
3466 | assert(n > 0 && n <= len); |
3467 | for (i = 0; i < nrm; i++) { |
3468 | if (rm[i] == c) { |
3469 | len -= n; |
3470 | break; |
3471 | } |
3472 | } |
3473 | if (i == nrm) |
3474 | break; |
3475 | } |
3476 | return len; |
3477 | } |
3478 | |
3479 | const int whitespace[] = { |
3480 | ' ', /* space */ |
3481 | '\t', /* tab (character tabulation) */ |
3482 | '\n', /* line feed */ |
3483 | '\r', /* carriage return */ |
3484 | '\f', /* form feed */ |
3485 | '\v', /* vertical tab (line tabulation) */ |
3486 | /* below the code points that have the Unicode Zs (space separator) property */ |
3487 | 0x00A0, /* no-break space */ |
3488 | 0x1680, /* ogham space mark */ |
3489 | 0x2000, /* en quad */ |
3490 | 0x2001, /* em quad */ |
3491 | 0x2002, /* en space */ |
3492 | 0x2003, /* em space */ |
3493 | 0x2004, /* three-per-em space */ |
3494 | 0x2005, /* four-per-em space */ |
3495 | 0x2006, /* six-per-em space */ |
3496 | 0x2007, /* figure space */ |
3497 | 0x2008, /* punctuation space */ |
3498 | 0x2009, /* thin space */ |
3499 | 0x200A, /* hair space */ |
3500 | 0x202F, /* narrow no-break space */ |
3501 | 0x205F, /* medium mathematical space */ |
3502 | 0x3000, /* ideographic space */ |
3503 | }; |
3504 | #define NSPACES (sizeof(whitespace) / sizeof(whitespace[0])) |
3505 | |
3506 | /* remove all whitespace from either side of arg1 */ |
3507 | str |
3508 | STRStrip(str *res, const str *arg1) |
3509 | { |
3510 | const char *s = *arg1; |
3511 | size_t len; |
3512 | size_t n; |
3513 | |
3514 | if (GDK_STRNIL(s)) { |
3515 | *res = GDKstrdup(str_nil); |
3516 | } else { |
3517 | len = strlen(s); |
3518 | n = lstrip(s, len, whitespace, NSPACES); |
3519 | s += n; |
3520 | len -= n; |
3521 | n = rstrip(s, len, whitespace, NSPACES); |
3522 | *res = GDKstrndup(s, n); |
3523 | } |
3524 | if (*res == NULL) |
3525 | throw(MAL, "str.trim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3526 | return MAL_SUCCEED; |
3527 | } |
3528 | |
3529 | /* remove all whitespace from the start (left) of arg1 */ |
3530 | str |
3531 | STRLtrim(str *res, const str *arg1) |
3532 | { |
3533 | const char *s = *arg1; |
3534 | size_t len; |
3535 | size_t n; |
3536 | |
3537 | if (GDK_STRNIL(s)) { |
3538 | *res = GDKstrdup(str_nil); |
3539 | } else { |
3540 | len = strlen(s); |
3541 | n = lstrip(s, len, whitespace, NSPACES); |
3542 | *res = GDKstrndup(s + n, len - n); |
3543 | } |
3544 | if (*res == NULL) |
3545 | throw(MAL, "str.ltrim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3546 | return MAL_SUCCEED; |
3547 | } |
3548 | |
3549 | /* remove all whitespace from the end (right) of arg1 */ |
3550 | str |
3551 | STRRtrim(str *res, const str *arg1) |
3552 | { |
3553 | const char *s = *arg1; |
3554 | size_t len; |
3555 | size_t n; |
3556 | |
3557 | if (GDK_STRNIL(s)) { |
3558 | *res = GDKstrdup(str_nil); |
3559 | } else { |
3560 | len = strlen(s); |
3561 | n = rstrip(s, len, whitespace, NSPACES); |
3562 | *res = GDKstrndup(s, n); |
3563 | } |
3564 | if (*res == NULL) |
3565 | throw(MAL, "str.rtrim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3566 | return MAL_SUCCEED; |
3567 | } |
3568 | |
3569 | /* return a list of codepoints in s */ |
3570 | static int * |
3571 | trimchars(const char *s, size_t *n) |
3572 | { |
3573 | size_t len = 0; |
3574 | int *chars = GDKmalloc(strlen(s) * sizeof(int)); |
3575 | int c; |
3576 | |
3577 | if (chars == NULL) |
3578 | return NULL; |
3579 | |
3580 | while (*s) { |
3581 | UTF8_GETCHAR(c, s); |
3582 | assert(!is_int_nil(c)); |
3583 | chars[len++] = c; |
3584 | } |
3585 | *n = len; |
3586 | return chars; |
3587 | illegal: |
3588 | GDKfree(chars); |
3589 | return NULL; |
3590 | } |
3591 | |
3592 | /* remove the longest string containing only characters from arg2 from |
3593 | * either side of arg1 */ |
3594 | str |
3595 | STRStrip2(str *res, const str *arg1, const str *arg2) |
3596 | { |
3597 | const char *s = *arg1; |
3598 | size_t len; |
3599 | size_t n; |
3600 | size_t nchars; |
3601 | int *chars; |
3602 | |
3603 | if (GDK_STRNIL(s)) { |
3604 | *res = GDKstrdup(str_nil); |
3605 | } else { |
3606 | chars = trimchars(*arg2, &nchars); |
3607 | if (chars == NULL) |
3608 | throw(MAL, "str.trim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3609 | len = strlen(s); |
3610 | n = lstrip(s, len, chars, nchars); |
3611 | s += n; |
3612 | len -= n; |
3613 | n = rstrip(s, len, chars, nchars); |
3614 | GDKfree(chars); |
3615 | *res = GDKstrndup(s, n); |
3616 | } |
3617 | if (*res == NULL) |
3618 | throw(MAL, "str.trim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3619 | return MAL_SUCCEED; |
3620 | } |
3621 | |
3622 | /* remove the longest string containing only characters from arg2 from |
3623 | * the start (left) of arg1 */ |
3624 | str |
3625 | STRLtrim2(str *res, const str *arg1, const str *arg2) |
3626 | { |
3627 | const char *s = *arg1; |
3628 | size_t len; |
3629 | size_t n; |
3630 | size_t nchars; |
3631 | int *chars; |
3632 | |
3633 | if (GDK_STRNIL(s)) { |
3634 | *res = GDKstrdup(str_nil); |
3635 | } else { |
3636 | chars = trimchars(*arg2, &nchars); |
3637 | if (chars == NULL) |
3638 | throw(MAL, "str.trim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3639 | len = strlen(s); |
3640 | n = lstrip(s, len, chars, nchars); |
3641 | GDKfree(chars); |
3642 | *res = GDKstrndup(s + n, len - n); |
3643 | } |
3644 | if (*res == NULL) |
3645 | throw(MAL, "str.ltrim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3646 | return MAL_SUCCEED; |
3647 | } |
3648 | |
3649 | /* remove the longest string containing only characters from arg2 from |
3650 | * the end (right) of arg1 */ |
3651 | str |
3652 | STRRtrim2(str *res, const str *arg1, const str *arg2) |
3653 | { |
3654 | const char *s = *arg1; |
3655 | size_t len; |
3656 | size_t n; |
3657 | size_t nchars; |
3658 | int *chars; |
3659 | |
3660 | if (GDK_STRNIL(s)) { |
3661 | *res = GDKstrdup(str_nil); |
3662 | } else { |
3663 | chars = trimchars(*arg2, &nchars); |
3664 | if (chars == NULL) |
3665 | throw(MAL, "str.trim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3666 | len = strlen(s); |
3667 | n = rstrip(s, len, chars, nchars); |
3668 | GDKfree(chars); |
3669 | *res = GDKstrndup(s, n); |
3670 | } |
3671 | if (*res == NULL) |
3672 | throw(MAL, "str.rtrim" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3673 | return MAL_SUCCEED; |
3674 | } |
3675 | |
3676 | static char * |
3677 | pad(const char *s, const char *pad, int len, int left) |
3678 | { |
3679 | size_t slen, padlen, repeats, residual, i; |
3680 | char *res; |
3681 | |
3682 | if (GDK_STRNIL(s) || GDK_STRNIL(pad) || is_int_nil(len)) |
3683 | return GDKstrdup(str_nil); |
3684 | |
3685 | if (len < 0) |
3686 | len = 0; |
3687 | |
3688 | slen = UTF8_strlen(s); |
3689 | |
3690 | if (slen > (size_t) len) { |
3691 | /* truncate */ |
3692 | pad = UTF8_strtail(s, len); |
3693 | return GDKstrndup(s, pad - s); |
3694 | } |
3695 | |
3696 | padlen = UTF8_strlen(pad); |
3697 | if (slen == (size_t) len || padlen == 0) { |
3698 | /* nothing to do (no padding if there is no pad string) */ |
3699 | return GDKstrdup(s); |
3700 | } |
3701 | |
3702 | repeats = ((size_t) len - slen) / padlen; |
3703 | residual = ((size_t) len - slen) % padlen; |
3704 | if (residual > 0) |
3705 | residual = (size_t) (UTF8_strtail(pad, (int) residual) - pad); |
3706 | padlen = strlen(pad); |
3707 | slen = strlen(s); |
3708 | res = GDKmalloc(slen + repeats * padlen + residual + 1); |
3709 | if (res == NULL) |
3710 | return NULL; |
3711 | if (left) { |
3712 | for (i = 0; i < repeats; i++) |
3713 | memcpy(res + i * padlen, pad, padlen); |
3714 | if (residual > 0) |
3715 | memcpy(res + repeats * padlen, pad, residual); |
3716 | if (slen > 0) |
3717 | memcpy(res + repeats * padlen + residual, s, slen); |
3718 | } else { |
3719 | if (slen > 0) |
3720 | memcpy(res, s, slen); |
3721 | for (i = 0; i < repeats; i++) |
3722 | memcpy(res + slen + i * padlen, pad, padlen); |
3723 | if (residual > 0) |
3724 | memcpy(res + slen + repeats * padlen, pad, residual); |
3725 | } |
3726 | res[repeats * padlen + residual + slen] = 0; |
3727 | return res; |
3728 | } |
3729 | |
3730 | /* Fill up 'arg1' to length 'len' by prepending whitespaces. |
3731 | * If 'arg1' is already longer than 'len', then it's truncated on the right |
3732 | * (NB: this is the PostgreSQL definition). |
3733 | * |
3734 | * Example: lpad('hi', 5) |
3735 | * Result: ' hi' |
3736 | */ |
3737 | str |
3738 | STRLpad(str *res, const str *arg1, const int *len) |
3739 | { |
3740 | *res = pad(*arg1, " " , *len, 1); |
3741 | if (*res == NULL) |
3742 | throw(MAL, "str.lpad" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3743 | return MAL_SUCCEED; |
3744 | } |
3745 | |
3746 | /* Fill up 'arg1' to length 'len' by appending whitespaces. |
3747 | * If 'arg1' is already longer than 'len', then it's truncated (on the right) |
3748 | * (NB: this is the PostgreSQL definition). |
3749 | * |
3750 | * Example: rpad('hi', 5) |
3751 | * Result: 'hi ' |
3752 | */ |
3753 | str |
3754 | STRRpad(str *res, const str *arg1, const int *len) |
3755 | { |
3756 | *res = pad(*arg1, " " , *len, 0); |
3757 | if (*res == NULL) |
3758 | throw(MAL, "str.rpad" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3759 | return MAL_SUCCEED; |
3760 | } |
3761 | |
3762 | /* Fill up 'arg1' to length 'len' by prepending characters from 'arg2' |
3763 | * If 'arg1' is already longer than 'len', then it's truncated on the right |
3764 | * (NB: this is the PostgreSQL definition). |
3765 | * |
3766 | * Example: lpad('hi', 5, 'xy') |
3767 | * Result: xyxhi |
3768 | */ |
3769 | str |
3770 | STRLpad2(str *res, const str *arg1, const int *len, const str *arg2) |
3771 | { |
3772 | if (**arg2 == 0) |
3773 | throw(MAL, "str.lpad" , SQLSTATE(42000) ILLEGAL_ARGUMENT ": pad string is empty" ); |
3774 | |
3775 | *res = pad(*arg1, *arg2, *len, 1); |
3776 | if (*res == NULL) |
3777 | throw(MAL, "str.lpad" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3778 | return MAL_SUCCEED; |
3779 | } |
3780 | |
3781 | /* Fill up 'arg1' to length 'len' by appending characters from 'arg2' |
3782 | * If 'arg1' is already longer than 'len', then it's truncated (on the right) |
3783 | * (NB: this is the PostgreSQL definition). |
3784 | * |
3785 | * Example: rpad('hi', 5, 'xy') |
3786 | * Result: hixyx |
3787 | */ |
3788 | str |
3789 | STRRpad2(str *res, const str *arg1, const int *len, const str *arg2) |
3790 | { |
3791 | if (**arg2 == 0) |
3792 | throw(MAL, "str.rpad" , SQLSTATE(42000) ILLEGAL_ARGUMENT ": pad string is empty" ); |
3793 | |
3794 | *res = pad(*arg1, *arg2, *len, 0); |
3795 | if (*res == NULL) |
3796 | throw(MAL, "str.rpad" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3797 | return MAL_SUCCEED; |
3798 | } |
3799 | |
3800 | str |
3801 | STRSubstitute(str *res, const str *arg1, const str *arg2, const str *arg3, const bit *g) |
3802 | { |
3803 | const char *s = *arg1; |
3804 | const char *src = *arg2 ? *arg2 : "" ; |
3805 | const char *dst = *arg3 ? *arg3 : "" ; |
3806 | int repeat = *g; |
3807 | size_t lsrc = strlen(src); |
3808 | size_t ldst = strlen(dst); |
3809 | size_t l = strLen(s); |
3810 | size_t n; |
3811 | char *buf; |
3812 | const char *pfnd; |
3813 | char *fnd; |
3814 | |
3815 | if (s == NULL || strcmp(s, str_nil) == 0) { |
3816 | if ((*res = GDKstrdup(str_nil)) == NULL) |
3817 | throw(MAL, "str.substitute" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3818 | return MAL_SUCCEED; |
3819 | } |
3820 | |
3821 | n = l + ldst; |
3822 | if (repeat && ldst > lsrc && lsrc) { |
3823 | n = (ldst * l) / lsrc; /* max length */ |
3824 | } |
3825 | buf = *res = GDKmalloc(n); |
3826 | if (*res == NULL) |
3827 | throw(MAL, "str.substitute" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3828 | |
3829 | pfnd = s; |
3830 | if (lsrc == 0) |
3831 | lsrc = 1; /* make sure we make progress */ |
3832 | do { |
3833 | fnd = strstr(pfnd, src); |
3834 | if (fnd == NULL) |
3835 | break; |
3836 | n = fnd - pfnd; |
3837 | if (n > 0) { |
3838 | strncpy(buf, pfnd, n); |
3839 | buf += n; |
3840 | } |
3841 | if (ldst > 0) { |
3842 | strncpy(buf, dst, ldst); |
3843 | buf += ldst; |
3844 | } |
3845 | if (*fnd == 0) |
3846 | break; |
3847 | pfnd = fnd + lsrc; |
3848 | } while (repeat); |
3849 | strcpy(buf, pfnd); |
3850 | return MAL_SUCCEED; |
3851 | } |
3852 | |
3853 | str |
3854 | STRascii(int *ret, const str *s){ |
3855 | int offset=0; |
3856 | return STRWChrAt(ret,s,&offset); |
3857 | } |
3858 | |
3859 | str |
3860 | STRsubstringTail(str *ret, const str *s, const int *start) |
3861 | { |
3862 | int offset= *start; |
3863 | if( offset <1) offset =1; |
3864 | offset--; |
3865 | return STRTail(ret, s, &offset); |
3866 | } |
3867 | |
3868 | str |
3869 | STRsubstring(str *ret, const str *s, const int *start, const int *l) |
3870 | { |
3871 | int offset= *start; |
3872 | if( offset <1) offset =1; |
3873 | offset--; |
3874 | return STRSubString(ret, s, &offset, l); |
3875 | } |
3876 | str |
3877 | STRprefix(str *ret, const str *s, const int *l){ |
3878 | int start =0; |
3879 | return STRSubString(ret,s,&start,l); |
3880 | } |
3881 | str |
3882 | STRsuffix(str *ret, const str *s, const int *l){ |
3883 | int start = (int) (strlen(*s)- *l); |
3884 | return STRSubString(ret,s,&start,l); |
3885 | } |
3886 | |
3887 | str |
3888 | STRlocate2(int *ret, const str *needle, const str *haystack, const int *start) |
3889 | { |
3890 | int off = *start <= 0 ? 1 : *start; |
3891 | char *s = UTF8_strtail(*haystack, off - 1); |
3892 | int res; |
3893 | |
3894 | STRstrSearch(&res, &s, needle); |
3895 | *ret = res >= 0 ? res + off : 0; |
3896 | return MAL_SUCCEED; |
3897 | } |
3898 | |
3899 | str |
3900 | STRlocate(int *ret, const str *needle, const str *haystack) |
3901 | { |
3902 | int p = 1; |
3903 | return STRlocate2(ret, needle, haystack, &p); |
3904 | } |
3905 | |
3906 | str |
3907 | STRinsert(str *ret, const str *s, const int *start, const int *l, const str *s2) |
3908 | { |
3909 | str v; |
3910 | int strt = *start; |
3911 | if (strcmp(*s2, str_nil) == 0 || strcmp(*s, str_nil) == 0) { |
3912 | if ((*ret = GDKstrdup(str_nil)) == NULL) |
3913 | throw(MAL, "str.insert" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3914 | } else { |
3915 | size_t l1 = strlen(*s); |
3916 | size_t l2 = strlen(*s2); |
3917 | |
3918 | if (l1 + l2 + 1 >= INT_MAX) { |
3919 | throw(MAL, "str.insert" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3920 | } |
3921 | if (*l < 0) |
3922 | throw(MAL, "str.insert" , SQLSTATE(42000) ILLEGAL_ARGUMENT); |
3923 | if (strt < 0) { |
3924 | if ((size_t) -strt <= l1) |
3925 | strt = (int) (l1 + strt); |
3926 | else |
3927 | strt = 0; |
3928 | } |
3929 | if ((size_t) strt > l1) |
3930 | strt = (int) l1; |
3931 | v = *ret = GDKmalloc(strlen(*s) + strlen(*s2) + 1); |
3932 | if (v == NULL) |
3933 | throw(MAL, "str.insert" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3934 | if (strt > 0) |
3935 | strncpy(v, *s, strt); |
3936 | v[strt] = 0; |
3937 | strcpy(v + strt, *s2); |
3938 | if (strt + *l < (int) l1) |
3939 | strcat(v, *s + strt + *l); |
3940 | } |
3941 | return MAL_SUCCEED; |
3942 | } |
3943 | |
3944 | str |
3945 | STRreplace(str *ret, const str *s1, const str *s2, const str *s3){ |
3946 | bit flag= TRUE; |
3947 | return STRSubstitute(ret,s1,s2,s3,&flag); |
3948 | } |
3949 | |
3950 | str |
3951 | STRrepeat(str *ret, const str *s, const int *c) |
3952 | { |
3953 | str t; |
3954 | int i; |
3955 | size_t l; |
3956 | |
3957 | if (*c < 0 || strcmp(*s, str_nil) == 0) { |
3958 | if ((*ret = GDKstrdup(str_nil)) == NULL) |
3959 | throw(MAL, "str.repeat" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3960 | } else { |
3961 | l = strlen(*s); |
3962 | if (l >= INT_MAX) |
3963 | throw(MAL, "str.repeat" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3964 | t = *ret = GDKmalloc( *c * l + 1); |
3965 | |
3966 | if (!t) |
3967 | throw(MAL, "str.repeat" , SQLSTATE(HY001) MAL_MALLOC_FAIL); |
3968 | *t = 0; |
3969 | for(i = *c; i>0; i--, t += l) |
3970 | strcpy(t, *s); |
3971 | } |
3972 | return MAL_SUCCEED; |
3973 | } |
3974 | str |
3975 | STRspace(str *ret, const int *l){ |
3976 | char buf[]= " " , *s= buf; |
3977 | return STRrepeat(ret,&s,l); |
3978 | } |
3979 | |