Ruby 4.1.0dev (2026-04-18 revision 3803204fd3a863c4936b3580b28940dd4ce22236)
encoding.c
1#include "prism/internal/encoding.h"
2
4#include "prism/internal/strncasecmp.h"
5
6#include <assert.h>
7
8typedef uint32_t pm_unicode_codepoint_t;
9
10#define UNICODE_ALPHA_CODEPOINTS_LENGTH 1508
11static const pm_unicode_codepoint_t unicode_alpha_codepoints[UNICODE_ALPHA_CODEPOINTS_LENGTH] = {
12 0x100, 0x2C1,
13 0x2C6, 0x2D1,
14 0x2E0, 0x2E4,
15 0x2EC, 0x2EC,
16 0x2EE, 0x2EE,
17 0x345, 0x345,
18 0x363, 0x374,
19 0x376, 0x377,
20 0x37A, 0x37D,
21 0x37F, 0x37F,
22 0x386, 0x386,
23 0x388, 0x38A,
24 0x38C, 0x38C,
25 0x38E, 0x3A1,
26 0x3A3, 0x3F5,
27 0x3F7, 0x481,
28 0x48A, 0x52F,
29 0x531, 0x556,
30 0x559, 0x559,
31 0x560, 0x588,
32 0x5B0, 0x5BD,
33 0x5BF, 0x5BF,
34 0x5C1, 0x5C2,
35 0x5C4, 0x5C5,
36 0x5C7, 0x5C7,
37 0x5D0, 0x5EA,
38 0x5EF, 0x5F2,
39 0x610, 0x61A,
40 0x620, 0x657,
41 0x659, 0x65F,
42 0x66E, 0x6D3,
43 0x6D5, 0x6DC,
44 0x6E1, 0x6E8,
45 0x6ED, 0x6EF,
46 0x6FA, 0x6FC,
47 0x6FF, 0x6FF,
48 0x710, 0x73F,
49 0x74D, 0x7B1,
50 0x7CA, 0x7EA,
51 0x7F4, 0x7F5,
52 0x7FA, 0x7FA,
53 0x800, 0x817,
54 0x81A, 0x82C,
55 0x840, 0x858,
56 0x860, 0x86A,
57 0x870, 0x887,
58 0x889, 0x88F,
59 0x897, 0x897,
60 0x8A0, 0x8C9,
61 0x8D4, 0x8DF,
62 0x8E3, 0x8E9,
63 0x8F0, 0x93B,
64 0x93D, 0x94C,
65 0x94E, 0x950,
66 0x955, 0x963,
67 0x971, 0x983,
68 0x985, 0x98C,
69 0x98F, 0x990,
70 0x993, 0x9A8,
71 0x9AA, 0x9B0,
72 0x9B2, 0x9B2,
73 0x9B6, 0x9B9,
74 0x9BD, 0x9C4,
75 0x9C7, 0x9C8,
76 0x9CB, 0x9CC,
77 0x9CE, 0x9CE,
78 0x9D7, 0x9D7,
79 0x9DC, 0x9DD,
80 0x9DF, 0x9E3,
81 0x9F0, 0x9F1,
82 0x9FC, 0x9FC,
83 0xA01, 0xA03,
84 0xA05, 0xA0A,
85 0xA0F, 0xA10,
86 0xA13, 0xA28,
87 0xA2A, 0xA30,
88 0xA32, 0xA33,
89 0xA35, 0xA36,
90 0xA38, 0xA39,
91 0xA3E, 0xA42,
92 0xA47, 0xA48,
93 0xA4B, 0xA4C,
94 0xA51, 0xA51,
95 0xA59, 0xA5C,
96 0xA5E, 0xA5E,
97 0xA70, 0xA75,
98 0xA81, 0xA83,
99 0xA85, 0xA8D,
100 0xA8F, 0xA91,
101 0xA93, 0xAA8,
102 0xAAA, 0xAB0,
103 0xAB2, 0xAB3,
104 0xAB5, 0xAB9,
105 0xABD, 0xAC5,
106 0xAC7, 0xAC9,
107 0xACB, 0xACC,
108 0xAD0, 0xAD0,
109 0xAE0, 0xAE3,
110 0xAF9, 0xAFC,
111 0xB01, 0xB03,
112 0xB05, 0xB0C,
113 0xB0F, 0xB10,
114 0xB13, 0xB28,
115 0xB2A, 0xB30,
116 0xB32, 0xB33,
117 0xB35, 0xB39,
118 0xB3D, 0xB44,
119 0xB47, 0xB48,
120 0xB4B, 0xB4C,
121 0xB56, 0xB57,
122 0xB5C, 0xB5D,
123 0xB5F, 0xB63,
124 0xB71, 0xB71,
125 0xB82, 0xB83,
126 0xB85, 0xB8A,
127 0xB8E, 0xB90,
128 0xB92, 0xB95,
129 0xB99, 0xB9A,
130 0xB9C, 0xB9C,
131 0xB9E, 0xB9F,
132 0xBA3, 0xBA4,
133 0xBA8, 0xBAA,
134 0xBAE, 0xBB9,
135 0xBBE, 0xBC2,
136 0xBC6, 0xBC8,
137 0xBCA, 0xBCC,
138 0xBD0, 0xBD0,
139 0xBD7, 0xBD7,
140 0xC00, 0xC0C,
141 0xC0E, 0xC10,
142 0xC12, 0xC28,
143 0xC2A, 0xC39,
144 0xC3D, 0xC44,
145 0xC46, 0xC48,
146 0xC4A, 0xC4C,
147 0xC55, 0xC56,
148 0xC58, 0xC5A,
149 0xC5C, 0xC5D,
150 0xC60, 0xC63,
151 0xC80, 0xC83,
152 0xC85, 0xC8C,
153 0xC8E, 0xC90,
154 0xC92, 0xCA8,
155 0xCAA, 0xCB3,
156 0xCB5, 0xCB9,
157 0xCBD, 0xCC4,
158 0xCC6, 0xCC8,
159 0xCCA, 0xCCC,
160 0xCD5, 0xCD6,
161 0xCDC, 0xCDE,
162 0xCE0, 0xCE3,
163 0xCF1, 0xCF3,
164 0xD00, 0xD0C,
165 0xD0E, 0xD10,
166 0xD12, 0xD3A,
167 0xD3D, 0xD44,
168 0xD46, 0xD48,
169 0xD4A, 0xD4C,
170 0xD4E, 0xD4E,
171 0xD54, 0xD57,
172 0xD5F, 0xD63,
173 0xD7A, 0xD7F,
174 0xD81, 0xD83,
175 0xD85, 0xD96,
176 0xD9A, 0xDB1,
177 0xDB3, 0xDBB,
178 0xDBD, 0xDBD,
179 0xDC0, 0xDC6,
180 0xDCF, 0xDD4,
181 0xDD6, 0xDD6,
182 0xDD8, 0xDDF,
183 0xDF2, 0xDF3,
184 0xE01, 0xE3A,
185 0xE40, 0xE46,
186 0xE4D, 0xE4D,
187 0xE81, 0xE82,
188 0xE84, 0xE84,
189 0xE86, 0xE8A,
190 0xE8C, 0xEA3,
191 0xEA5, 0xEA5,
192 0xEA7, 0xEB9,
193 0xEBB, 0xEBD,
194 0xEC0, 0xEC4,
195 0xEC6, 0xEC6,
196 0xECD, 0xECD,
197 0xEDC, 0xEDF,
198 0xF00, 0xF00,
199 0xF40, 0xF47,
200 0xF49, 0xF6C,
201 0xF71, 0xF83,
202 0xF88, 0xF97,
203 0xF99, 0xFBC,
204 0x1000, 0x1036,
205 0x1038, 0x1038,
206 0x103B, 0x103F,
207 0x1050, 0x108F,
208 0x109A, 0x109D,
209 0x10A0, 0x10C5,
210 0x10C7, 0x10C7,
211 0x10CD, 0x10CD,
212 0x10D0, 0x10FA,
213 0x10FC, 0x1248,
214 0x124A, 0x124D,
215 0x1250, 0x1256,
216 0x1258, 0x1258,
217 0x125A, 0x125D,
218 0x1260, 0x1288,
219 0x128A, 0x128D,
220 0x1290, 0x12B0,
221 0x12B2, 0x12B5,
222 0x12B8, 0x12BE,
223 0x12C0, 0x12C0,
224 0x12C2, 0x12C5,
225 0x12C8, 0x12D6,
226 0x12D8, 0x1310,
227 0x1312, 0x1315,
228 0x1318, 0x135A,
229 0x1380, 0x138F,
230 0x13A0, 0x13F5,
231 0x13F8, 0x13FD,
232 0x1401, 0x166C,
233 0x166F, 0x167F,
234 0x1681, 0x169A,
235 0x16A0, 0x16EA,
236 0x16EE, 0x16F8,
237 0x1700, 0x1713,
238 0x171F, 0x1733,
239 0x1740, 0x1753,
240 0x1760, 0x176C,
241 0x176E, 0x1770,
242 0x1772, 0x1773,
243 0x1780, 0x17B3,
244 0x17B6, 0x17C8,
245 0x17D7, 0x17D7,
246 0x17DC, 0x17DC,
247 0x1820, 0x1878,
248 0x1880, 0x18AA,
249 0x18B0, 0x18F5,
250 0x1900, 0x191E,
251 0x1920, 0x192B,
252 0x1930, 0x1938,
253 0x1950, 0x196D,
254 0x1970, 0x1974,
255 0x1980, 0x19AB,
256 0x19B0, 0x19C9,
257 0x1A00, 0x1A1B,
258 0x1A20, 0x1A5E,
259 0x1A61, 0x1A74,
260 0x1AA7, 0x1AA7,
261 0x1ABF, 0x1AC0,
262 0x1ACC, 0x1ACE,
263 0x1B00, 0x1B33,
264 0x1B35, 0x1B43,
265 0x1B45, 0x1B4C,
266 0x1B80, 0x1BA9,
267 0x1BAC, 0x1BAF,
268 0x1BBA, 0x1BE5,
269 0x1BE7, 0x1BF1,
270 0x1C00, 0x1C36,
271 0x1C4D, 0x1C4F,
272 0x1C5A, 0x1C7D,
273 0x1C80, 0x1C8A,
274 0x1C90, 0x1CBA,
275 0x1CBD, 0x1CBF,
276 0x1CE9, 0x1CEC,
277 0x1CEE, 0x1CF3,
278 0x1CF5, 0x1CF6,
279 0x1CFA, 0x1CFA,
280 0x1D00, 0x1DBF,
281 0x1DD3, 0x1DF4,
282 0x1E00, 0x1F15,
283 0x1F18, 0x1F1D,
284 0x1F20, 0x1F45,
285 0x1F48, 0x1F4D,
286 0x1F50, 0x1F57,
287 0x1F59, 0x1F59,
288 0x1F5B, 0x1F5B,
289 0x1F5D, 0x1F5D,
290 0x1F5F, 0x1F7D,
291 0x1F80, 0x1FB4,
292 0x1FB6, 0x1FBC,
293 0x1FBE, 0x1FBE,
294 0x1FC2, 0x1FC4,
295 0x1FC6, 0x1FCC,
296 0x1FD0, 0x1FD3,
297 0x1FD6, 0x1FDB,
298 0x1FE0, 0x1FEC,
299 0x1FF2, 0x1FF4,
300 0x1FF6, 0x1FFC,
301 0x2071, 0x2071,
302 0x207F, 0x207F,
303 0x2090, 0x209C,
304 0x2102, 0x2102,
305 0x2107, 0x2107,
306 0x210A, 0x2113,
307 0x2115, 0x2115,
308 0x2119, 0x211D,
309 0x2124, 0x2124,
310 0x2126, 0x2126,
311 0x2128, 0x2128,
312 0x212A, 0x212D,
313 0x212F, 0x2139,
314 0x213C, 0x213F,
315 0x2145, 0x2149,
316 0x214E, 0x214E,
317 0x2160, 0x2188,
318 0x24B6, 0x24E9,
319 0x2C00, 0x2CE4,
320 0x2CEB, 0x2CEE,
321 0x2CF2, 0x2CF3,
322 0x2D00, 0x2D25,
323 0x2D27, 0x2D27,
324 0x2D2D, 0x2D2D,
325 0x2D30, 0x2D67,
326 0x2D6F, 0x2D6F,
327 0x2D80, 0x2D96,
328 0x2DA0, 0x2DA6,
329 0x2DA8, 0x2DAE,
330 0x2DB0, 0x2DB6,
331 0x2DB8, 0x2DBE,
332 0x2DC0, 0x2DC6,
333 0x2DC8, 0x2DCE,
334 0x2DD0, 0x2DD6,
335 0x2DD8, 0x2DDE,
336 0x2DE0, 0x2DFF,
337 0x2E2F, 0x2E2F,
338 0x3005, 0x3007,
339 0x3021, 0x3029,
340 0x3031, 0x3035,
341 0x3038, 0x303C,
342 0x3041, 0x3096,
343 0x309D, 0x309F,
344 0x30A1, 0x30FA,
345 0x30FC, 0x30FF,
346 0x3105, 0x312F,
347 0x3131, 0x318E,
348 0x31A0, 0x31BF,
349 0x31F0, 0x31FF,
350 0x3400, 0x4DBF,
351 0x4E00, 0xA48C,
352 0xA4D0, 0xA4FD,
353 0xA500, 0xA60C,
354 0xA610, 0xA61F,
355 0xA62A, 0xA62B,
356 0xA640, 0xA66E,
357 0xA674, 0xA67B,
358 0xA67F, 0xA6EF,
359 0xA717, 0xA71F,
360 0xA722, 0xA788,
361 0xA78B, 0xA7DC,
362 0xA7F1, 0xA805,
363 0xA807, 0xA827,
364 0xA840, 0xA873,
365 0xA880, 0xA8C3,
366 0xA8C5, 0xA8C5,
367 0xA8F2, 0xA8F7,
368 0xA8FB, 0xA8FB,
369 0xA8FD, 0xA8FF,
370 0xA90A, 0xA92A,
371 0xA930, 0xA952,
372 0xA960, 0xA97C,
373 0xA980, 0xA9B2,
374 0xA9B4, 0xA9BF,
375 0xA9CF, 0xA9CF,
376 0xA9E0, 0xA9EF,
377 0xA9FA, 0xA9FE,
378 0xAA00, 0xAA36,
379 0xAA40, 0xAA4D,
380 0xAA60, 0xAA76,
381 0xAA7A, 0xAABE,
382 0xAAC0, 0xAAC0,
383 0xAAC2, 0xAAC2,
384 0xAADB, 0xAADD,
385 0xAAE0, 0xAAEF,
386 0xAAF2, 0xAAF5,
387 0xAB01, 0xAB06,
388 0xAB09, 0xAB0E,
389 0xAB11, 0xAB16,
390 0xAB20, 0xAB26,
391 0xAB28, 0xAB2E,
392 0xAB30, 0xAB5A,
393 0xAB5C, 0xAB69,
394 0xAB70, 0xABEA,
395 0xAC00, 0xD7A3,
396 0xD7B0, 0xD7C6,
397 0xD7CB, 0xD7FB,
398 0xF900, 0xFA6D,
399 0xFA70, 0xFAD9,
400 0xFB00, 0xFB06,
401 0xFB13, 0xFB17,
402 0xFB1D, 0xFB28,
403 0xFB2A, 0xFB36,
404 0xFB38, 0xFB3C,
405 0xFB3E, 0xFB3E,
406 0xFB40, 0xFB41,
407 0xFB43, 0xFB44,
408 0xFB46, 0xFBB1,
409 0xFBD3, 0xFD3D,
410 0xFD50, 0xFD8F,
411 0xFD92, 0xFDC7,
412 0xFDF0, 0xFDFB,
413 0xFE70, 0xFE74,
414 0xFE76, 0xFEFC,
415 0xFF21, 0xFF3A,
416 0xFF41, 0xFF5A,
417 0xFF66, 0xFFBE,
418 0xFFC2, 0xFFC7,
419 0xFFCA, 0xFFCF,
420 0xFFD2, 0xFFD7,
421 0xFFDA, 0xFFDC,
422 0x10000, 0x1000B,
423 0x1000D, 0x10026,
424 0x10028, 0x1003A,
425 0x1003C, 0x1003D,
426 0x1003F, 0x1004D,
427 0x10050, 0x1005D,
428 0x10080, 0x100FA,
429 0x10140, 0x10174,
430 0x10280, 0x1029C,
431 0x102A0, 0x102D0,
432 0x10300, 0x1031F,
433 0x1032D, 0x1034A,
434 0x10350, 0x1037A,
435 0x10380, 0x1039D,
436 0x103A0, 0x103C3,
437 0x103C8, 0x103CF,
438 0x103D1, 0x103D5,
439 0x10400, 0x1049D,
440 0x104B0, 0x104D3,
441 0x104D8, 0x104FB,
442 0x10500, 0x10527,
443 0x10530, 0x10563,
444 0x10570, 0x1057A,
445 0x1057C, 0x1058A,
446 0x1058C, 0x10592,
447 0x10594, 0x10595,
448 0x10597, 0x105A1,
449 0x105A3, 0x105B1,
450 0x105B3, 0x105B9,
451 0x105BB, 0x105BC,
452 0x105C0, 0x105F3,
453 0x10600, 0x10736,
454 0x10740, 0x10755,
455 0x10760, 0x10767,
456 0x10780, 0x10785,
457 0x10787, 0x107B0,
458 0x107B2, 0x107BA,
459 0x10800, 0x10805,
460 0x10808, 0x10808,
461 0x1080A, 0x10835,
462 0x10837, 0x10838,
463 0x1083C, 0x1083C,
464 0x1083F, 0x10855,
465 0x10860, 0x10876,
466 0x10880, 0x1089E,
467 0x108E0, 0x108F2,
468 0x108F4, 0x108F5,
469 0x10900, 0x10915,
470 0x10920, 0x10939,
471 0x10940, 0x10959,
472 0x10980, 0x109B7,
473 0x109BE, 0x109BF,
474 0x10A00, 0x10A03,
475 0x10A05, 0x10A06,
476 0x10A0C, 0x10A13,
477 0x10A15, 0x10A17,
478 0x10A19, 0x10A35,
479 0x10A60, 0x10A7C,
480 0x10A80, 0x10A9C,
481 0x10AC0, 0x10AC7,
482 0x10AC9, 0x10AE4,
483 0x10B00, 0x10B35,
484 0x10B40, 0x10B55,
485 0x10B60, 0x10B72,
486 0x10B80, 0x10B91,
487 0x10C00, 0x10C48,
488 0x10C80, 0x10CB2,
489 0x10CC0, 0x10CF2,
490 0x10D00, 0x10D27,
491 0x10D4A, 0x10D65,
492 0x10D69, 0x10D69,
493 0x10D6F, 0x10D85,
494 0x10E80, 0x10EA9,
495 0x10EAB, 0x10EAC,
496 0x10EB0, 0x10EB1,
497 0x10EC2, 0x10EC7,
498 0x10EFA, 0x10EFC,
499 0x10F00, 0x10F1C,
500 0x10F27, 0x10F27,
501 0x10F30, 0x10F45,
502 0x10F70, 0x10F81,
503 0x10FB0, 0x10FC4,
504 0x10FE0, 0x10FF6,
505 0x11000, 0x11045,
506 0x11071, 0x11075,
507 0x11080, 0x110B8,
508 0x110C2, 0x110C2,
509 0x110D0, 0x110E8,
510 0x11100, 0x11132,
511 0x11144, 0x11147,
512 0x11150, 0x11172,
513 0x11176, 0x11176,
514 0x11180, 0x111BF,
515 0x111C1, 0x111C4,
516 0x111CE, 0x111CF,
517 0x111DA, 0x111DA,
518 0x111DC, 0x111DC,
519 0x11200, 0x11211,
520 0x11213, 0x11234,
521 0x11237, 0x11237,
522 0x1123E, 0x11241,
523 0x11280, 0x11286,
524 0x11288, 0x11288,
525 0x1128A, 0x1128D,
526 0x1128F, 0x1129D,
527 0x1129F, 0x112A8,
528 0x112B0, 0x112E8,
529 0x11300, 0x11303,
530 0x11305, 0x1130C,
531 0x1130F, 0x11310,
532 0x11313, 0x11328,
533 0x1132A, 0x11330,
534 0x11332, 0x11333,
535 0x11335, 0x11339,
536 0x1133D, 0x11344,
537 0x11347, 0x11348,
538 0x1134B, 0x1134C,
539 0x11350, 0x11350,
540 0x11357, 0x11357,
541 0x1135D, 0x11363,
542 0x11380, 0x11389,
543 0x1138B, 0x1138B,
544 0x1138E, 0x1138E,
545 0x11390, 0x113B5,
546 0x113B7, 0x113C0,
547 0x113C2, 0x113C2,
548 0x113C5, 0x113C5,
549 0x113C7, 0x113CA,
550 0x113CC, 0x113CD,
551 0x113D1, 0x113D1,
552 0x113D3, 0x113D3,
553 0x11400, 0x11441,
554 0x11443, 0x11445,
555 0x11447, 0x1144A,
556 0x1145F, 0x11461,
557 0x11480, 0x114C1,
558 0x114C4, 0x114C5,
559 0x114C7, 0x114C7,
560 0x11580, 0x115B5,
561 0x115B8, 0x115BE,
562 0x115D8, 0x115DD,
563 0x11600, 0x1163E,
564 0x11640, 0x11640,
565 0x11644, 0x11644,
566 0x11680, 0x116B5,
567 0x116B8, 0x116B8,
568 0x11700, 0x1171A,
569 0x1171D, 0x1172A,
570 0x11740, 0x11746,
571 0x11800, 0x11838,
572 0x118A0, 0x118DF,
573 0x118FF, 0x11906,
574 0x11909, 0x11909,
575 0x1190C, 0x11913,
576 0x11915, 0x11916,
577 0x11918, 0x11935,
578 0x11937, 0x11938,
579 0x1193B, 0x1193C,
580 0x1193F, 0x11942,
581 0x119A0, 0x119A7,
582 0x119AA, 0x119D7,
583 0x119DA, 0x119DF,
584 0x119E1, 0x119E1,
585 0x119E3, 0x119E4,
586 0x11A00, 0x11A32,
587 0x11A35, 0x11A3E,
588 0x11A50, 0x11A97,
589 0x11A9D, 0x11A9D,
590 0x11AB0, 0x11AF8,
591 0x11B60, 0x11B67,
592 0x11BC0, 0x11BE0,
593 0x11C00, 0x11C08,
594 0x11C0A, 0x11C36,
595 0x11C38, 0x11C3E,
596 0x11C40, 0x11C40,
597 0x11C72, 0x11C8F,
598 0x11C92, 0x11CA7,
599 0x11CA9, 0x11CB6,
600 0x11D00, 0x11D06,
601 0x11D08, 0x11D09,
602 0x11D0B, 0x11D36,
603 0x11D3A, 0x11D3A,
604 0x11D3C, 0x11D3D,
605 0x11D3F, 0x11D41,
606 0x11D43, 0x11D43,
607 0x11D46, 0x11D47,
608 0x11D60, 0x11D65,
609 0x11D67, 0x11D68,
610 0x11D6A, 0x11D8E,
611 0x11D90, 0x11D91,
612 0x11D93, 0x11D96,
613 0x11D98, 0x11D98,
614 0x11DB0, 0x11DDB,
615 0x11EE0, 0x11EF6,
616 0x11F00, 0x11F10,
617 0x11F12, 0x11F3A,
618 0x11F3E, 0x11F40,
619 0x11FB0, 0x11FB0,
620 0x12000, 0x12399,
621 0x12400, 0x1246E,
622 0x12480, 0x12543,
623 0x12F90, 0x12FF0,
624 0x13000, 0x1342F,
625 0x13441, 0x13446,
626 0x13460, 0x143FA,
627 0x14400, 0x14646,
628 0x16100, 0x1612E,
629 0x16800, 0x16A38,
630 0x16A40, 0x16A5E,
631 0x16A70, 0x16ABE,
632 0x16AD0, 0x16AED,
633 0x16B00, 0x16B2F,
634 0x16B40, 0x16B43,
635 0x16B63, 0x16B77,
636 0x16B7D, 0x16B8F,
637 0x16D40, 0x16D6C,
638 0x16E40, 0x16E7F,
639 0x16EA0, 0x16EB8,
640 0x16EBB, 0x16ED3,
641 0x16F00, 0x16F4A,
642 0x16F4F, 0x16F87,
643 0x16F8F, 0x16F9F,
644 0x16FE0, 0x16FE1,
645 0x16FE3, 0x16FE3,
646 0x16FF0, 0x16FF6,
647 0x17000, 0x18CD5,
648 0x18CFF, 0x18D1E,
649 0x18D80, 0x18DF2,
650 0x1AFF0, 0x1AFF3,
651 0x1AFF5, 0x1AFFB,
652 0x1AFFD, 0x1AFFE,
653 0x1B000, 0x1B122,
654 0x1B132, 0x1B132,
655 0x1B150, 0x1B152,
656 0x1B155, 0x1B155,
657 0x1B164, 0x1B167,
658 0x1B170, 0x1B2FB,
659 0x1BC00, 0x1BC6A,
660 0x1BC70, 0x1BC7C,
661 0x1BC80, 0x1BC88,
662 0x1BC90, 0x1BC99,
663 0x1BC9E, 0x1BC9E,
664 0x1D400, 0x1D454,
665 0x1D456, 0x1D49C,
666 0x1D49E, 0x1D49F,
667 0x1D4A2, 0x1D4A2,
668 0x1D4A5, 0x1D4A6,
669 0x1D4A9, 0x1D4AC,
670 0x1D4AE, 0x1D4B9,
671 0x1D4BB, 0x1D4BB,
672 0x1D4BD, 0x1D4C3,
673 0x1D4C5, 0x1D505,
674 0x1D507, 0x1D50A,
675 0x1D50D, 0x1D514,
676 0x1D516, 0x1D51C,
677 0x1D51E, 0x1D539,
678 0x1D53B, 0x1D53E,
679 0x1D540, 0x1D544,
680 0x1D546, 0x1D546,
681 0x1D54A, 0x1D550,
682 0x1D552, 0x1D6A5,
683 0x1D6A8, 0x1D6C0,
684 0x1D6C2, 0x1D6DA,
685 0x1D6DC, 0x1D6FA,
686 0x1D6FC, 0x1D714,
687 0x1D716, 0x1D734,
688 0x1D736, 0x1D74E,
689 0x1D750, 0x1D76E,
690 0x1D770, 0x1D788,
691 0x1D78A, 0x1D7A8,
692 0x1D7AA, 0x1D7C2,
693 0x1D7C4, 0x1D7CB,
694 0x1DF00, 0x1DF1E,
695 0x1DF25, 0x1DF2A,
696 0x1E000, 0x1E006,
697 0x1E008, 0x1E018,
698 0x1E01B, 0x1E021,
699 0x1E023, 0x1E024,
700 0x1E026, 0x1E02A,
701 0x1E030, 0x1E06D,
702 0x1E08F, 0x1E08F,
703 0x1E100, 0x1E12C,
704 0x1E137, 0x1E13D,
705 0x1E14E, 0x1E14E,
706 0x1E290, 0x1E2AD,
707 0x1E2C0, 0x1E2EB,
708 0x1E4D0, 0x1E4EB,
709 0x1E5D0, 0x1E5ED,
710 0x1E5F0, 0x1E5F0,
711 0x1E6C0, 0x1E6DE,
712 0x1E6E0, 0x1E6F5,
713 0x1E6FE, 0x1E6FF,
714 0x1E7E0, 0x1E7E6,
715 0x1E7E8, 0x1E7EB,
716 0x1E7ED, 0x1E7EE,
717 0x1E7F0, 0x1E7FE,
718 0x1E800, 0x1E8C4,
719 0x1E900, 0x1E943,
720 0x1E947, 0x1E947,
721 0x1E94B, 0x1E94B,
722 0x1EE00, 0x1EE03,
723 0x1EE05, 0x1EE1F,
724 0x1EE21, 0x1EE22,
725 0x1EE24, 0x1EE24,
726 0x1EE27, 0x1EE27,
727 0x1EE29, 0x1EE32,
728 0x1EE34, 0x1EE37,
729 0x1EE39, 0x1EE39,
730 0x1EE3B, 0x1EE3B,
731 0x1EE42, 0x1EE42,
732 0x1EE47, 0x1EE47,
733 0x1EE49, 0x1EE49,
734 0x1EE4B, 0x1EE4B,
735 0x1EE4D, 0x1EE4F,
736 0x1EE51, 0x1EE52,
737 0x1EE54, 0x1EE54,
738 0x1EE57, 0x1EE57,
739 0x1EE59, 0x1EE59,
740 0x1EE5B, 0x1EE5B,
741 0x1EE5D, 0x1EE5D,
742 0x1EE5F, 0x1EE5F,
743 0x1EE61, 0x1EE62,
744 0x1EE64, 0x1EE64,
745 0x1EE67, 0x1EE6A,
746 0x1EE6C, 0x1EE72,
747 0x1EE74, 0x1EE77,
748 0x1EE79, 0x1EE7C,
749 0x1EE7E, 0x1EE7E,
750 0x1EE80, 0x1EE89,
751 0x1EE8B, 0x1EE9B,
752 0x1EEA1, 0x1EEA3,
753 0x1EEA5, 0x1EEA9,
754 0x1EEAB, 0x1EEBB,
755 0x1F130, 0x1F149,
756 0x1F150, 0x1F169,
757 0x1F170, 0x1F189,
758 0x20000, 0x2A6DF,
759 0x2A700, 0x2B81D,
760 0x2B820, 0x2CEAD,
761 0x2CEB0, 0x2EBE0,
762 0x2EBF0, 0x2EE5D,
763 0x2F800, 0x2FA1D,
764 0x30000, 0x3134A,
765 0x31350, 0x33479,
766};
767
768#define UNICODE_ALNUM_CODEPOINTS_LENGTH 1598
769static const pm_unicode_codepoint_t unicode_alnum_codepoints[UNICODE_ALNUM_CODEPOINTS_LENGTH] = {
770 0x100, 0x2C1,
771 0x2C6, 0x2D1,
772 0x2E0, 0x2E4,
773 0x2EC, 0x2EC,
774 0x2EE, 0x2EE,
775 0x345, 0x345,
776 0x363, 0x374,
777 0x376, 0x377,
778 0x37A, 0x37D,
779 0x37F, 0x37F,
780 0x386, 0x386,
781 0x388, 0x38A,
782 0x38C, 0x38C,
783 0x38E, 0x3A1,
784 0x3A3, 0x3F5,
785 0x3F7, 0x481,
786 0x48A, 0x52F,
787 0x531, 0x556,
788 0x559, 0x559,
789 0x560, 0x588,
790 0x5B0, 0x5BD,
791 0x5BF, 0x5BF,
792 0x5C1, 0x5C2,
793 0x5C4, 0x5C5,
794 0x5C7, 0x5C7,
795 0x5D0, 0x5EA,
796 0x5EF, 0x5F2,
797 0x610, 0x61A,
798 0x620, 0x657,
799 0x659, 0x669,
800 0x66E, 0x6D3,
801 0x6D5, 0x6DC,
802 0x6E1, 0x6E8,
803 0x6ED, 0x6FC,
804 0x6FF, 0x6FF,
805 0x710, 0x73F,
806 0x74D, 0x7B1,
807 0x7C0, 0x7EA,
808 0x7F4, 0x7F5,
809 0x7FA, 0x7FA,
810 0x800, 0x817,
811 0x81A, 0x82C,
812 0x840, 0x858,
813 0x860, 0x86A,
814 0x870, 0x887,
815 0x889, 0x88F,
816 0x897, 0x897,
817 0x8A0, 0x8C9,
818 0x8D4, 0x8DF,
819 0x8E3, 0x8E9,
820 0x8F0, 0x93B,
821 0x93D, 0x94C,
822 0x94E, 0x950,
823 0x955, 0x963,
824 0x966, 0x96F,
825 0x971, 0x983,
826 0x985, 0x98C,
827 0x98F, 0x990,
828 0x993, 0x9A8,
829 0x9AA, 0x9B0,
830 0x9B2, 0x9B2,
831 0x9B6, 0x9B9,
832 0x9BD, 0x9C4,
833 0x9C7, 0x9C8,
834 0x9CB, 0x9CC,
835 0x9CE, 0x9CE,
836 0x9D7, 0x9D7,
837 0x9DC, 0x9DD,
838 0x9DF, 0x9E3,
839 0x9E6, 0x9F1,
840 0x9FC, 0x9FC,
841 0xA01, 0xA03,
842 0xA05, 0xA0A,
843 0xA0F, 0xA10,
844 0xA13, 0xA28,
845 0xA2A, 0xA30,
846 0xA32, 0xA33,
847 0xA35, 0xA36,
848 0xA38, 0xA39,
849 0xA3E, 0xA42,
850 0xA47, 0xA48,
851 0xA4B, 0xA4C,
852 0xA51, 0xA51,
853 0xA59, 0xA5C,
854 0xA5E, 0xA5E,
855 0xA66, 0xA75,
856 0xA81, 0xA83,
857 0xA85, 0xA8D,
858 0xA8F, 0xA91,
859 0xA93, 0xAA8,
860 0xAAA, 0xAB0,
861 0xAB2, 0xAB3,
862 0xAB5, 0xAB9,
863 0xABD, 0xAC5,
864 0xAC7, 0xAC9,
865 0xACB, 0xACC,
866 0xAD0, 0xAD0,
867 0xAE0, 0xAE3,
868 0xAE6, 0xAEF,
869 0xAF9, 0xAFC,
870 0xB01, 0xB03,
871 0xB05, 0xB0C,
872 0xB0F, 0xB10,
873 0xB13, 0xB28,
874 0xB2A, 0xB30,
875 0xB32, 0xB33,
876 0xB35, 0xB39,
877 0xB3D, 0xB44,
878 0xB47, 0xB48,
879 0xB4B, 0xB4C,
880 0xB56, 0xB57,
881 0xB5C, 0xB5D,
882 0xB5F, 0xB63,
883 0xB66, 0xB6F,
884 0xB71, 0xB71,
885 0xB82, 0xB83,
886 0xB85, 0xB8A,
887 0xB8E, 0xB90,
888 0xB92, 0xB95,
889 0xB99, 0xB9A,
890 0xB9C, 0xB9C,
891 0xB9E, 0xB9F,
892 0xBA3, 0xBA4,
893 0xBA8, 0xBAA,
894 0xBAE, 0xBB9,
895 0xBBE, 0xBC2,
896 0xBC6, 0xBC8,
897 0xBCA, 0xBCC,
898 0xBD0, 0xBD0,
899 0xBD7, 0xBD7,
900 0xBE6, 0xBEF,
901 0xC00, 0xC0C,
902 0xC0E, 0xC10,
903 0xC12, 0xC28,
904 0xC2A, 0xC39,
905 0xC3D, 0xC44,
906 0xC46, 0xC48,
907 0xC4A, 0xC4C,
908 0xC55, 0xC56,
909 0xC58, 0xC5A,
910 0xC5C, 0xC5D,
911 0xC60, 0xC63,
912 0xC66, 0xC6F,
913 0xC80, 0xC83,
914 0xC85, 0xC8C,
915 0xC8E, 0xC90,
916 0xC92, 0xCA8,
917 0xCAA, 0xCB3,
918 0xCB5, 0xCB9,
919 0xCBD, 0xCC4,
920 0xCC6, 0xCC8,
921 0xCCA, 0xCCC,
922 0xCD5, 0xCD6,
923 0xCDC, 0xCDE,
924 0xCE0, 0xCE3,
925 0xCE6, 0xCEF,
926 0xCF1, 0xCF3,
927 0xD00, 0xD0C,
928 0xD0E, 0xD10,
929 0xD12, 0xD3A,
930 0xD3D, 0xD44,
931 0xD46, 0xD48,
932 0xD4A, 0xD4C,
933 0xD4E, 0xD4E,
934 0xD54, 0xD57,
935 0xD5F, 0xD63,
936 0xD66, 0xD6F,
937 0xD7A, 0xD7F,
938 0xD81, 0xD83,
939 0xD85, 0xD96,
940 0xD9A, 0xDB1,
941 0xDB3, 0xDBB,
942 0xDBD, 0xDBD,
943 0xDC0, 0xDC6,
944 0xDCF, 0xDD4,
945 0xDD6, 0xDD6,
946 0xDD8, 0xDDF,
947 0xDE6, 0xDEF,
948 0xDF2, 0xDF3,
949 0xE01, 0xE3A,
950 0xE40, 0xE46,
951 0xE4D, 0xE4D,
952 0xE50, 0xE59,
953 0xE81, 0xE82,
954 0xE84, 0xE84,
955 0xE86, 0xE8A,
956 0xE8C, 0xEA3,
957 0xEA5, 0xEA5,
958 0xEA7, 0xEB9,
959 0xEBB, 0xEBD,
960 0xEC0, 0xEC4,
961 0xEC6, 0xEC6,
962 0xECD, 0xECD,
963 0xED0, 0xED9,
964 0xEDC, 0xEDF,
965 0xF00, 0xF00,
966 0xF20, 0xF29,
967 0xF40, 0xF47,
968 0xF49, 0xF6C,
969 0xF71, 0xF83,
970 0xF88, 0xF97,
971 0xF99, 0xFBC,
972 0x1000, 0x1036,
973 0x1038, 0x1038,
974 0x103B, 0x1049,
975 0x1050, 0x109D,
976 0x10A0, 0x10C5,
977 0x10C7, 0x10C7,
978 0x10CD, 0x10CD,
979 0x10D0, 0x10FA,
980 0x10FC, 0x1248,
981 0x124A, 0x124D,
982 0x1250, 0x1256,
983 0x1258, 0x1258,
984 0x125A, 0x125D,
985 0x1260, 0x1288,
986 0x128A, 0x128D,
987 0x1290, 0x12B0,
988 0x12B2, 0x12B5,
989 0x12B8, 0x12BE,
990 0x12C0, 0x12C0,
991 0x12C2, 0x12C5,
992 0x12C8, 0x12D6,
993 0x12D8, 0x1310,
994 0x1312, 0x1315,
995 0x1318, 0x135A,
996 0x1380, 0x138F,
997 0x13A0, 0x13F5,
998 0x13F8, 0x13FD,
999 0x1401, 0x166C,
1000 0x166F, 0x167F,
1001 0x1681, 0x169A,
1002 0x16A0, 0x16EA,
1003 0x16EE, 0x16F8,
1004 0x1700, 0x1713,
1005 0x171F, 0x1733,
1006 0x1740, 0x1753,
1007 0x1760, 0x176C,
1008 0x176E, 0x1770,
1009 0x1772, 0x1773,
1010 0x1780, 0x17B3,
1011 0x17B6, 0x17C8,
1012 0x17D7, 0x17D7,
1013 0x17DC, 0x17DC,
1014 0x17E0, 0x17E9,
1015 0x1810, 0x1819,
1016 0x1820, 0x1878,
1017 0x1880, 0x18AA,
1018 0x18B0, 0x18F5,
1019 0x1900, 0x191E,
1020 0x1920, 0x192B,
1021 0x1930, 0x1938,
1022 0x1946, 0x196D,
1023 0x1970, 0x1974,
1024 0x1980, 0x19AB,
1025 0x19B0, 0x19C9,
1026 0x19D0, 0x19D9,
1027 0x1A00, 0x1A1B,
1028 0x1A20, 0x1A5E,
1029 0x1A61, 0x1A74,
1030 0x1A80, 0x1A89,
1031 0x1A90, 0x1A99,
1032 0x1AA7, 0x1AA7,
1033 0x1ABF, 0x1AC0,
1034 0x1ACC, 0x1ACE,
1035 0x1B00, 0x1B33,
1036 0x1B35, 0x1B43,
1037 0x1B45, 0x1B4C,
1038 0x1B50, 0x1B59,
1039 0x1B80, 0x1BA9,
1040 0x1BAC, 0x1BE5,
1041 0x1BE7, 0x1BF1,
1042 0x1C00, 0x1C36,
1043 0x1C40, 0x1C49,
1044 0x1C4D, 0x1C7D,
1045 0x1C80, 0x1C8A,
1046 0x1C90, 0x1CBA,
1047 0x1CBD, 0x1CBF,
1048 0x1CE9, 0x1CEC,
1049 0x1CEE, 0x1CF3,
1050 0x1CF5, 0x1CF6,
1051 0x1CFA, 0x1CFA,
1052 0x1D00, 0x1DBF,
1053 0x1DD3, 0x1DF4,
1054 0x1E00, 0x1F15,
1055 0x1F18, 0x1F1D,
1056 0x1F20, 0x1F45,
1057 0x1F48, 0x1F4D,
1058 0x1F50, 0x1F57,
1059 0x1F59, 0x1F59,
1060 0x1F5B, 0x1F5B,
1061 0x1F5D, 0x1F5D,
1062 0x1F5F, 0x1F7D,
1063 0x1F80, 0x1FB4,
1064 0x1FB6, 0x1FBC,
1065 0x1FBE, 0x1FBE,
1066 0x1FC2, 0x1FC4,
1067 0x1FC6, 0x1FCC,
1068 0x1FD0, 0x1FD3,
1069 0x1FD6, 0x1FDB,
1070 0x1FE0, 0x1FEC,
1071 0x1FF2, 0x1FF4,
1072 0x1FF6, 0x1FFC,
1073 0x2071, 0x2071,
1074 0x207F, 0x207F,
1075 0x2090, 0x209C,
1076 0x2102, 0x2102,
1077 0x2107, 0x2107,
1078 0x210A, 0x2113,
1079 0x2115, 0x2115,
1080 0x2119, 0x211D,
1081 0x2124, 0x2124,
1082 0x2126, 0x2126,
1083 0x2128, 0x2128,
1084 0x212A, 0x212D,
1085 0x212F, 0x2139,
1086 0x213C, 0x213F,
1087 0x2145, 0x2149,
1088 0x214E, 0x214E,
1089 0x2160, 0x2188,
1090 0x24B6, 0x24E9,
1091 0x2C00, 0x2CE4,
1092 0x2CEB, 0x2CEE,
1093 0x2CF2, 0x2CF3,
1094 0x2D00, 0x2D25,
1095 0x2D27, 0x2D27,
1096 0x2D2D, 0x2D2D,
1097 0x2D30, 0x2D67,
1098 0x2D6F, 0x2D6F,
1099 0x2D80, 0x2D96,
1100 0x2DA0, 0x2DA6,
1101 0x2DA8, 0x2DAE,
1102 0x2DB0, 0x2DB6,
1103 0x2DB8, 0x2DBE,
1104 0x2DC0, 0x2DC6,
1105 0x2DC8, 0x2DCE,
1106 0x2DD0, 0x2DD6,
1107 0x2DD8, 0x2DDE,
1108 0x2DE0, 0x2DFF,
1109 0x2E2F, 0x2E2F,
1110 0x3005, 0x3007,
1111 0x3021, 0x3029,
1112 0x3031, 0x3035,
1113 0x3038, 0x303C,
1114 0x3041, 0x3096,
1115 0x309D, 0x309F,
1116 0x30A1, 0x30FA,
1117 0x30FC, 0x30FF,
1118 0x3105, 0x312F,
1119 0x3131, 0x318E,
1120 0x31A0, 0x31BF,
1121 0x31F0, 0x31FF,
1122 0x3400, 0x4DBF,
1123 0x4E00, 0xA48C,
1124 0xA4D0, 0xA4FD,
1125 0xA500, 0xA60C,
1126 0xA610, 0xA62B,
1127 0xA640, 0xA66E,
1128 0xA674, 0xA67B,
1129 0xA67F, 0xA6EF,
1130 0xA717, 0xA71F,
1131 0xA722, 0xA788,
1132 0xA78B, 0xA7DC,
1133 0xA7F1, 0xA805,
1134 0xA807, 0xA827,
1135 0xA840, 0xA873,
1136 0xA880, 0xA8C3,
1137 0xA8C5, 0xA8C5,
1138 0xA8D0, 0xA8D9,
1139 0xA8F2, 0xA8F7,
1140 0xA8FB, 0xA8FB,
1141 0xA8FD, 0xA92A,
1142 0xA930, 0xA952,
1143 0xA960, 0xA97C,
1144 0xA980, 0xA9B2,
1145 0xA9B4, 0xA9BF,
1146 0xA9CF, 0xA9D9,
1147 0xA9E0, 0xA9FE,
1148 0xAA00, 0xAA36,
1149 0xAA40, 0xAA4D,
1150 0xAA50, 0xAA59,
1151 0xAA60, 0xAA76,
1152 0xAA7A, 0xAABE,
1153 0xAAC0, 0xAAC0,
1154 0xAAC2, 0xAAC2,
1155 0xAADB, 0xAADD,
1156 0xAAE0, 0xAAEF,
1157 0xAAF2, 0xAAF5,
1158 0xAB01, 0xAB06,
1159 0xAB09, 0xAB0E,
1160 0xAB11, 0xAB16,
1161 0xAB20, 0xAB26,
1162 0xAB28, 0xAB2E,
1163 0xAB30, 0xAB5A,
1164 0xAB5C, 0xAB69,
1165 0xAB70, 0xABEA,
1166 0xABF0, 0xABF9,
1167 0xAC00, 0xD7A3,
1168 0xD7B0, 0xD7C6,
1169 0xD7CB, 0xD7FB,
1170 0xF900, 0xFA6D,
1171 0xFA70, 0xFAD9,
1172 0xFB00, 0xFB06,
1173 0xFB13, 0xFB17,
1174 0xFB1D, 0xFB28,
1175 0xFB2A, 0xFB36,
1176 0xFB38, 0xFB3C,
1177 0xFB3E, 0xFB3E,
1178 0xFB40, 0xFB41,
1179 0xFB43, 0xFB44,
1180 0xFB46, 0xFBB1,
1181 0xFBD3, 0xFD3D,
1182 0xFD50, 0xFD8F,
1183 0xFD92, 0xFDC7,
1184 0xFDF0, 0xFDFB,
1185 0xFE70, 0xFE74,
1186 0xFE76, 0xFEFC,
1187 0xFF10, 0xFF19,
1188 0xFF21, 0xFF3A,
1189 0xFF41, 0xFF5A,
1190 0xFF66, 0xFFBE,
1191 0xFFC2, 0xFFC7,
1192 0xFFCA, 0xFFCF,
1193 0xFFD2, 0xFFD7,
1194 0xFFDA, 0xFFDC,
1195 0x10000, 0x1000B,
1196 0x1000D, 0x10026,
1197 0x10028, 0x1003A,
1198 0x1003C, 0x1003D,
1199 0x1003F, 0x1004D,
1200 0x10050, 0x1005D,
1201 0x10080, 0x100FA,
1202 0x10140, 0x10174,
1203 0x10280, 0x1029C,
1204 0x102A0, 0x102D0,
1205 0x10300, 0x1031F,
1206 0x1032D, 0x1034A,
1207 0x10350, 0x1037A,
1208 0x10380, 0x1039D,
1209 0x103A0, 0x103C3,
1210 0x103C8, 0x103CF,
1211 0x103D1, 0x103D5,
1212 0x10400, 0x1049D,
1213 0x104A0, 0x104A9,
1214 0x104B0, 0x104D3,
1215 0x104D8, 0x104FB,
1216 0x10500, 0x10527,
1217 0x10530, 0x10563,
1218 0x10570, 0x1057A,
1219 0x1057C, 0x1058A,
1220 0x1058C, 0x10592,
1221 0x10594, 0x10595,
1222 0x10597, 0x105A1,
1223 0x105A3, 0x105B1,
1224 0x105B3, 0x105B9,
1225 0x105BB, 0x105BC,
1226 0x105C0, 0x105F3,
1227 0x10600, 0x10736,
1228 0x10740, 0x10755,
1229 0x10760, 0x10767,
1230 0x10780, 0x10785,
1231 0x10787, 0x107B0,
1232 0x107B2, 0x107BA,
1233 0x10800, 0x10805,
1234 0x10808, 0x10808,
1235 0x1080A, 0x10835,
1236 0x10837, 0x10838,
1237 0x1083C, 0x1083C,
1238 0x1083F, 0x10855,
1239 0x10860, 0x10876,
1240 0x10880, 0x1089E,
1241 0x108E0, 0x108F2,
1242 0x108F4, 0x108F5,
1243 0x10900, 0x10915,
1244 0x10920, 0x10939,
1245 0x10940, 0x10959,
1246 0x10980, 0x109B7,
1247 0x109BE, 0x109BF,
1248 0x10A00, 0x10A03,
1249 0x10A05, 0x10A06,
1250 0x10A0C, 0x10A13,
1251 0x10A15, 0x10A17,
1252 0x10A19, 0x10A35,
1253 0x10A60, 0x10A7C,
1254 0x10A80, 0x10A9C,
1255 0x10AC0, 0x10AC7,
1256 0x10AC9, 0x10AE4,
1257 0x10B00, 0x10B35,
1258 0x10B40, 0x10B55,
1259 0x10B60, 0x10B72,
1260 0x10B80, 0x10B91,
1261 0x10C00, 0x10C48,
1262 0x10C80, 0x10CB2,
1263 0x10CC0, 0x10CF2,
1264 0x10D00, 0x10D27,
1265 0x10D30, 0x10D39,
1266 0x10D40, 0x10D65,
1267 0x10D69, 0x10D69,
1268 0x10D6F, 0x10D85,
1269 0x10E80, 0x10EA9,
1270 0x10EAB, 0x10EAC,
1271 0x10EB0, 0x10EB1,
1272 0x10EC2, 0x10EC7,
1273 0x10EFA, 0x10EFC,
1274 0x10F00, 0x10F1C,
1275 0x10F27, 0x10F27,
1276 0x10F30, 0x10F45,
1277 0x10F70, 0x10F81,
1278 0x10FB0, 0x10FC4,
1279 0x10FE0, 0x10FF6,
1280 0x11000, 0x11045,
1281 0x11066, 0x1106F,
1282 0x11071, 0x11075,
1283 0x11080, 0x110B8,
1284 0x110C2, 0x110C2,
1285 0x110D0, 0x110E8,
1286 0x110F0, 0x110F9,
1287 0x11100, 0x11132,
1288 0x11136, 0x1113F,
1289 0x11144, 0x11147,
1290 0x11150, 0x11172,
1291 0x11176, 0x11176,
1292 0x11180, 0x111BF,
1293 0x111C1, 0x111C4,
1294 0x111CE, 0x111DA,
1295 0x111DC, 0x111DC,
1296 0x11200, 0x11211,
1297 0x11213, 0x11234,
1298 0x11237, 0x11237,
1299 0x1123E, 0x11241,
1300 0x11280, 0x11286,
1301 0x11288, 0x11288,
1302 0x1128A, 0x1128D,
1303 0x1128F, 0x1129D,
1304 0x1129F, 0x112A8,
1305 0x112B0, 0x112E8,
1306 0x112F0, 0x112F9,
1307 0x11300, 0x11303,
1308 0x11305, 0x1130C,
1309 0x1130F, 0x11310,
1310 0x11313, 0x11328,
1311 0x1132A, 0x11330,
1312 0x11332, 0x11333,
1313 0x11335, 0x11339,
1314 0x1133D, 0x11344,
1315 0x11347, 0x11348,
1316 0x1134B, 0x1134C,
1317 0x11350, 0x11350,
1318 0x11357, 0x11357,
1319 0x1135D, 0x11363,
1320 0x11380, 0x11389,
1321 0x1138B, 0x1138B,
1322 0x1138E, 0x1138E,
1323 0x11390, 0x113B5,
1324 0x113B7, 0x113C0,
1325 0x113C2, 0x113C2,
1326 0x113C5, 0x113C5,
1327 0x113C7, 0x113CA,
1328 0x113CC, 0x113CD,
1329 0x113D1, 0x113D1,
1330 0x113D3, 0x113D3,
1331 0x11400, 0x11441,
1332 0x11443, 0x11445,
1333 0x11447, 0x1144A,
1334 0x11450, 0x11459,
1335 0x1145F, 0x11461,
1336 0x11480, 0x114C1,
1337 0x114C4, 0x114C5,
1338 0x114C7, 0x114C7,
1339 0x114D0, 0x114D9,
1340 0x11580, 0x115B5,
1341 0x115B8, 0x115BE,
1342 0x115D8, 0x115DD,
1343 0x11600, 0x1163E,
1344 0x11640, 0x11640,
1345 0x11644, 0x11644,
1346 0x11650, 0x11659,
1347 0x11680, 0x116B5,
1348 0x116B8, 0x116B8,
1349 0x116C0, 0x116C9,
1350 0x116D0, 0x116E3,
1351 0x11700, 0x1171A,
1352 0x1171D, 0x1172A,
1353 0x11730, 0x11739,
1354 0x11740, 0x11746,
1355 0x11800, 0x11838,
1356 0x118A0, 0x118E9,
1357 0x118FF, 0x11906,
1358 0x11909, 0x11909,
1359 0x1190C, 0x11913,
1360 0x11915, 0x11916,
1361 0x11918, 0x11935,
1362 0x11937, 0x11938,
1363 0x1193B, 0x1193C,
1364 0x1193F, 0x11942,
1365 0x11950, 0x11959,
1366 0x119A0, 0x119A7,
1367 0x119AA, 0x119D7,
1368 0x119DA, 0x119DF,
1369 0x119E1, 0x119E1,
1370 0x119E3, 0x119E4,
1371 0x11A00, 0x11A32,
1372 0x11A35, 0x11A3E,
1373 0x11A50, 0x11A97,
1374 0x11A9D, 0x11A9D,
1375 0x11AB0, 0x11AF8,
1376 0x11B60, 0x11B67,
1377 0x11BC0, 0x11BE0,
1378 0x11BF0, 0x11BF9,
1379 0x11C00, 0x11C08,
1380 0x11C0A, 0x11C36,
1381 0x11C38, 0x11C3E,
1382 0x11C40, 0x11C40,
1383 0x11C50, 0x11C59,
1384 0x11C72, 0x11C8F,
1385 0x11C92, 0x11CA7,
1386 0x11CA9, 0x11CB6,
1387 0x11D00, 0x11D06,
1388 0x11D08, 0x11D09,
1389 0x11D0B, 0x11D36,
1390 0x11D3A, 0x11D3A,
1391 0x11D3C, 0x11D3D,
1392 0x11D3F, 0x11D41,
1393 0x11D43, 0x11D43,
1394 0x11D46, 0x11D47,
1395 0x11D50, 0x11D59,
1396 0x11D60, 0x11D65,
1397 0x11D67, 0x11D68,
1398 0x11D6A, 0x11D8E,
1399 0x11D90, 0x11D91,
1400 0x11D93, 0x11D96,
1401 0x11D98, 0x11D98,
1402 0x11DA0, 0x11DA9,
1403 0x11DB0, 0x11DDB,
1404 0x11DE0, 0x11DE9,
1405 0x11EE0, 0x11EF6,
1406 0x11F00, 0x11F10,
1407 0x11F12, 0x11F3A,
1408 0x11F3E, 0x11F40,
1409 0x11F50, 0x11F59,
1410 0x11FB0, 0x11FB0,
1411 0x12000, 0x12399,
1412 0x12400, 0x1246E,
1413 0x12480, 0x12543,
1414 0x12F90, 0x12FF0,
1415 0x13000, 0x1342F,
1416 0x13441, 0x13446,
1417 0x13460, 0x143FA,
1418 0x14400, 0x14646,
1419 0x16100, 0x1612E,
1420 0x16130, 0x16139,
1421 0x16800, 0x16A38,
1422 0x16A40, 0x16A5E,
1423 0x16A60, 0x16A69,
1424 0x16A70, 0x16ABE,
1425 0x16AC0, 0x16AC9,
1426 0x16AD0, 0x16AED,
1427 0x16B00, 0x16B2F,
1428 0x16B40, 0x16B43,
1429 0x16B50, 0x16B59,
1430 0x16B63, 0x16B77,
1431 0x16B7D, 0x16B8F,
1432 0x16D40, 0x16D6C,
1433 0x16D70, 0x16D79,
1434 0x16E40, 0x16E7F,
1435 0x16EA0, 0x16EB8,
1436 0x16EBB, 0x16ED3,
1437 0x16F00, 0x16F4A,
1438 0x16F4F, 0x16F87,
1439 0x16F8F, 0x16F9F,
1440 0x16FE0, 0x16FE1,
1441 0x16FE3, 0x16FE3,
1442 0x16FF0, 0x16FF6,
1443 0x17000, 0x18CD5,
1444 0x18CFF, 0x18D1E,
1445 0x18D80, 0x18DF2,
1446 0x1AFF0, 0x1AFF3,
1447 0x1AFF5, 0x1AFFB,
1448 0x1AFFD, 0x1AFFE,
1449 0x1B000, 0x1B122,
1450 0x1B132, 0x1B132,
1451 0x1B150, 0x1B152,
1452 0x1B155, 0x1B155,
1453 0x1B164, 0x1B167,
1454 0x1B170, 0x1B2FB,
1455 0x1BC00, 0x1BC6A,
1456 0x1BC70, 0x1BC7C,
1457 0x1BC80, 0x1BC88,
1458 0x1BC90, 0x1BC99,
1459 0x1BC9E, 0x1BC9E,
1460 0x1CCF0, 0x1CCF9,
1461 0x1D400, 0x1D454,
1462 0x1D456, 0x1D49C,
1463 0x1D49E, 0x1D49F,
1464 0x1D4A2, 0x1D4A2,
1465 0x1D4A5, 0x1D4A6,
1466 0x1D4A9, 0x1D4AC,
1467 0x1D4AE, 0x1D4B9,
1468 0x1D4BB, 0x1D4BB,
1469 0x1D4BD, 0x1D4C3,
1470 0x1D4C5, 0x1D505,
1471 0x1D507, 0x1D50A,
1472 0x1D50D, 0x1D514,
1473 0x1D516, 0x1D51C,
1474 0x1D51E, 0x1D539,
1475 0x1D53B, 0x1D53E,
1476 0x1D540, 0x1D544,
1477 0x1D546, 0x1D546,
1478 0x1D54A, 0x1D550,
1479 0x1D552, 0x1D6A5,
1480 0x1D6A8, 0x1D6C0,
1481 0x1D6C2, 0x1D6DA,
1482 0x1D6DC, 0x1D6FA,
1483 0x1D6FC, 0x1D714,
1484 0x1D716, 0x1D734,
1485 0x1D736, 0x1D74E,
1486 0x1D750, 0x1D76E,
1487 0x1D770, 0x1D788,
1488 0x1D78A, 0x1D7A8,
1489 0x1D7AA, 0x1D7C2,
1490 0x1D7C4, 0x1D7CB,
1491 0x1D7CE, 0x1D7FF,
1492 0x1DF00, 0x1DF1E,
1493 0x1DF25, 0x1DF2A,
1494 0x1E000, 0x1E006,
1495 0x1E008, 0x1E018,
1496 0x1E01B, 0x1E021,
1497 0x1E023, 0x1E024,
1498 0x1E026, 0x1E02A,
1499 0x1E030, 0x1E06D,
1500 0x1E08F, 0x1E08F,
1501 0x1E100, 0x1E12C,
1502 0x1E137, 0x1E13D,
1503 0x1E140, 0x1E149,
1504 0x1E14E, 0x1E14E,
1505 0x1E290, 0x1E2AD,
1506 0x1E2C0, 0x1E2EB,
1507 0x1E2F0, 0x1E2F9,
1508 0x1E4D0, 0x1E4EB,
1509 0x1E4F0, 0x1E4F9,
1510 0x1E5D0, 0x1E5ED,
1511 0x1E5F0, 0x1E5FA,
1512 0x1E6C0, 0x1E6DE,
1513 0x1E6E0, 0x1E6F5,
1514 0x1E6FE, 0x1E6FF,
1515 0x1E7E0, 0x1E7E6,
1516 0x1E7E8, 0x1E7EB,
1517 0x1E7ED, 0x1E7EE,
1518 0x1E7F0, 0x1E7FE,
1519 0x1E800, 0x1E8C4,
1520 0x1E900, 0x1E943,
1521 0x1E947, 0x1E947,
1522 0x1E94B, 0x1E94B,
1523 0x1E950, 0x1E959,
1524 0x1EE00, 0x1EE03,
1525 0x1EE05, 0x1EE1F,
1526 0x1EE21, 0x1EE22,
1527 0x1EE24, 0x1EE24,
1528 0x1EE27, 0x1EE27,
1529 0x1EE29, 0x1EE32,
1530 0x1EE34, 0x1EE37,
1531 0x1EE39, 0x1EE39,
1532 0x1EE3B, 0x1EE3B,
1533 0x1EE42, 0x1EE42,
1534 0x1EE47, 0x1EE47,
1535 0x1EE49, 0x1EE49,
1536 0x1EE4B, 0x1EE4B,
1537 0x1EE4D, 0x1EE4F,
1538 0x1EE51, 0x1EE52,
1539 0x1EE54, 0x1EE54,
1540 0x1EE57, 0x1EE57,
1541 0x1EE59, 0x1EE59,
1542 0x1EE5B, 0x1EE5B,
1543 0x1EE5D, 0x1EE5D,
1544 0x1EE5F, 0x1EE5F,
1545 0x1EE61, 0x1EE62,
1546 0x1EE64, 0x1EE64,
1547 0x1EE67, 0x1EE6A,
1548 0x1EE6C, 0x1EE72,
1549 0x1EE74, 0x1EE77,
1550 0x1EE79, 0x1EE7C,
1551 0x1EE7E, 0x1EE7E,
1552 0x1EE80, 0x1EE89,
1553 0x1EE8B, 0x1EE9B,
1554 0x1EEA1, 0x1EEA3,
1555 0x1EEA5, 0x1EEA9,
1556 0x1EEAB, 0x1EEBB,
1557 0x1F130, 0x1F149,
1558 0x1F150, 0x1F169,
1559 0x1F170, 0x1F189,
1560 0x1FBF0, 0x1FBF9,
1561 0x20000, 0x2A6DF,
1562 0x2A700, 0x2B81D,
1563 0x2B820, 0x2CEAD,
1564 0x2CEB0, 0x2EBE0,
1565 0x2EBF0, 0x2EE5D,
1566 0x2F800, 0x2FA1D,
1567 0x30000, 0x3134A,
1568 0x31350, 0x33479,
1569};
1570
1571#define UNICODE_ISUPPER_CODEPOINTS_LENGTH 1320
1572static const pm_unicode_codepoint_t unicode_isupper_codepoints[UNICODE_ISUPPER_CODEPOINTS_LENGTH] = {
1573 0x100, 0x100,
1574 0x102, 0x102,
1575 0x104, 0x104,
1576 0x106, 0x106,
1577 0x108, 0x108,
1578 0x10A, 0x10A,
1579 0x10C, 0x10C,
1580 0x10E, 0x10E,
1581 0x110, 0x110,
1582 0x112, 0x112,
1583 0x114, 0x114,
1584 0x116, 0x116,
1585 0x118, 0x118,
1586 0x11A, 0x11A,
1587 0x11C, 0x11C,
1588 0x11E, 0x11E,
1589 0x120, 0x120,
1590 0x122, 0x122,
1591 0x124, 0x124,
1592 0x126, 0x126,
1593 0x128, 0x128,
1594 0x12A, 0x12A,
1595 0x12C, 0x12C,
1596 0x12E, 0x12E,
1597 0x130, 0x130,
1598 0x132, 0x132,
1599 0x134, 0x134,
1600 0x136, 0x136,
1601 0x139, 0x139,
1602 0x13B, 0x13B,
1603 0x13D, 0x13D,
1604 0x13F, 0x13F,
1605 0x141, 0x141,
1606 0x143, 0x143,
1607 0x145, 0x145,
1608 0x147, 0x147,
1609 0x14A, 0x14A,
1610 0x14C, 0x14C,
1611 0x14E, 0x14E,
1612 0x150, 0x150,
1613 0x152, 0x152,
1614 0x154, 0x154,
1615 0x156, 0x156,
1616 0x158, 0x158,
1617 0x15A, 0x15A,
1618 0x15C, 0x15C,
1619 0x15E, 0x15E,
1620 0x160, 0x160,
1621 0x162, 0x162,
1622 0x164, 0x164,
1623 0x166, 0x166,
1624 0x168, 0x168,
1625 0x16A, 0x16A,
1626 0x16C, 0x16C,
1627 0x16E, 0x16E,
1628 0x170, 0x170,
1629 0x172, 0x172,
1630 0x174, 0x174,
1631 0x176, 0x176,
1632 0x178, 0x179,
1633 0x17B, 0x17B,
1634 0x17D, 0x17D,
1635 0x181, 0x182,
1636 0x184, 0x184,
1637 0x186, 0x187,
1638 0x189, 0x18B,
1639 0x18E, 0x191,
1640 0x193, 0x194,
1641 0x196, 0x198,
1642 0x19C, 0x19D,
1643 0x19F, 0x1A0,
1644 0x1A2, 0x1A2,
1645 0x1A4, 0x1A4,
1646 0x1A6, 0x1A7,
1647 0x1A9, 0x1A9,
1648 0x1AC, 0x1AC,
1649 0x1AE, 0x1AF,
1650 0x1B1, 0x1B3,
1651 0x1B5, 0x1B5,
1652 0x1B7, 0x1B8,
1653 0x1BC, 0x1BC,
1654 0x1C4, 0x1C5,
1655 0x1C7, 0x1C8,
1656 0x1CA, 0x1CB,
1657 0x1CD, 0x1CD,
1658 0x1CF, 0x1CF,
1659 0x1D1, 0x1D1,
1660 0x1D3, 0x1D3,
1661 0x1D5, 0x1D5,
1662 0x1D7, 0x1D7,
1663 0x1D9, 0x1D9,
1664 0x1DB, 0x1DB,
1665 0x1DE, 0x1DE,
1666 0x1E0, 0x1E0,
1667 0x1E2, 0x1E2,
1668 0x1E4, 0x1E4,
1669 0x1E6, 0x1E6,
1670 0x1E8, 0x1E8,
1671 0x1EA, 0x1EA,
1672 0x1EC, 0x1EC,
1673 0x1EE, 0x1EE,
1674 0x1F1, 0x1F2,
1675 0x1F4, 0x1F4,
1676 0x1F6, 0x1F8,
1677 0x1FA, 0x1FA,
1678 0x1FC, 0x1FC,
1679 0x1FE, 0x1FE,
1680 0x200, 0x200,
1681 0x202, 0x202,
1682 0x204, 0x204,
1683 0x206, 0x206,
1684 0x208, 0x208,
1685 0x20A, 0x20A,
1686 0x20C, 0x20C,
1687 0x20E, 0x20E,
1688 0x210, 0x210,
1689 0x212, 0x212,
1690 0x214, 0x214,
1691 0x216, 0x216,
1692 0x218, 0x218,
1693 0x21A, 0x21A,
1694 0x21C, 0x21C,
1695 0x21E, 0x21E,
1696 0x220, 0x220,
1697 0x222, 0x222,
1698 0x224, 0x224,
1699 0x226, 0x226,
1700 0x228, 0x228,
1701 0x22A, 0x22A,
1702 0x22C, 0x22C,
1703 0x22E, 0x22E,
1704 0x230, 0x230,
1705 0x232, 0x232,
1706 0x23A, 0x23B,
1707 0x23D, 0x23E,
1708 0x241, 0x241,
1709 0x243, 0x246,
1710 0x248, 0x248,
1711 0x24A, 0x24A,
1712 0x24C, 0x24C,
1713 0x24E, 0x24E,
1714 0x370, 0x370,
1715 0x372, 0x372,
1716 0x376, 0x376,
1717 0x37F, 0x37F,
1718 0x386, 0x386,
1719 0x388, 0x38A,
1720 0x38C, 0x38C,
1721 0x38E, 0x38F,
1722 0x391, 0x3A1,
1723 0x3A3, 0x3AB,
1724 0x3CF, 0x3CF,
1725 0x3D2, 0x3D4,
1726 0x3D8, 0x3D8,
1727 0x3DA, 0x3DA,
1728 0x3DC, 0x3DC,
1729 0x3DE, 0x3DE,
1730 0x3E0, 0x3E0,
1731 0x3E2, 0x3E2,
1732 0x3E4, 0x3E4,
1733 0x3E6, 0x3E6,
1734 0x3E8, 0x3E8,
1735 0x3EA, 0x3EA,
1736 0x3EC, 0x3EC,
1737 0x3EE, 0x3EE,
1738 0x3F4, 0x3F4,
1739 0x3F7, 0x3F7,
1740 0x3F9, 0x3FA,
1741 0x3FD, 0x42F,
1742 0x460, 0x460,
1743 0x462, 0x462,
1744 0x464, 0x464,
1745 0x466, 0x466,
1746 0x468, 0x468,
1747 0x46A, 0x46A,
1748 0x46C, 0x46C,
1749 0x46E, 0x46E,
1750 0x470, 0x470,
1751 0x472, 0x472,
1752 0x474, 0x474,
1753 0x476, 0x476,
1754 0x478, 0x478,
1755 0x47A, 0x47A,
1756 0x47C, 0x47C,
1757 0x47E, 0x47E,
1758 0x480, 0x480,
1759 0x48A, 0x48A,
1760 0x48C, 0x48C,
1761 0x48E, 0x48E,
1762 0x490, 0x490,
1763 0x492, 0x492,
1764 0x494, 0x494,
1765 0x496, 0x496,
1766 0x498, 0x498,
1767 0x49A, 0x49A,
1768 0x49C, 0x49C,
1769 0x49E, 0x49E,
1770 0x4A0, 0x4A0,
1771 0x4A2, 0x4A2,
1772 0x4A4, 0x4A4,
1773 0x4A6, 0x4A6,
1774 0x4A8, 0x4A8,
1775 0x4AA, 0x4AA,
1776 0x4AC, 0x4AC,
1777 0x4AE, 0x4AE,
1778 0x4B0, 0x4B0,
1779 0x4B2, 0x4B2,
1780 0x4B4, 0x4B4,
1781 0x4B6, 0x4B6,
1782 0x4B8, 0x4B8,
1783 0x4BA, 0x4BA,
1784 0x4BC, 0x4BC,
1785 0x4BE, 0x4BE,
1786 0x4C0, 0x4C1,
1787 0x4C3, 0x4C3,
1788 0x4C5, 0x4C5,
1789 0x4C7, 0x4C7,
1790 0x4C9, 0x4C9,
1791 0x4CB, 0x4CB,
1792 0x4CD, 0x4CD,
1793 0x4D0, 0x4D0,
1794 0x4D2, 0x4D2,
1795 0x4D4, 0x4D4,
1796 0x4D6, 0x4D6,
1797 0x4D8, 0x4D8,
1798 0x4DA, 0x4DA,
1799 0x4DC, 0x4DC,
1800 0x4DE, 0x4DE,
1801 0x4E0, 0x4E0,
1802 0x4E2, 0x4E2,
1803 0x4E4, 0x4E4,
1804 0x4E6, 0x4E6,
1805 0x4E8, 0x4E8,
1806 0x4EA, 0x4EA,
1807 0x4EC, 0x4EC,
1808 0x4EE, 0x4EE,
1809 0x4F0, 0x4F0,
1810 0x4F2, 0x4F2,
1811 0x4F4, 0x4F4,
1812 0x4F6, 0x4F6,
1813 0x4F8, 0x4F8,
1814 0x4FA, 0x4FA,
1815 0x4FC, 0x4FC,
1816 0x4FE, 0x4FE,
1817 0x500, 0x500,
1818 0x502, 0x502,
1819 0x504, 0x504,
1820 0x506, 0x506,
1821 0x508, 0x508,
1822 0x50A, 0x50A,
1823 0x50C, 0x50C,
1824 0x50E, 0x50E,
1825 0x510, 0x510,
1826 0x512, 0x512,
1827 0x514, 0x514,
1828 0x516, 0x516,
1829 0x518, 0x518,
1830 0x51A, 0x51A,
1831 0x51C, 0x51C,
1832 0x51E, 0x51E,
1833 0x520, 0x520,
1834 0x522, 0x522,
1835 0x524, 0x524,
1836 0x526, 0x526,
1837 0x528, 0x528,
1838 0x52A, 0x52A,
1839 0x52C, 0x52C,
1840 0x52E, 0x52E,
1841 0x531, 0x556,
1842 0x10A0, 0x10C5,
1843 0x10C7, 0x10C7,
1844 0x10CD, 0x10CD,
1845 0x13A0, 0x13F5,
1846 0x1C89, 0x1C89,
1847 0x1C90, 0x1CBA,
1848 0x1CBD, 0x1CBF,
1849 0x1E00, 0x1E00,
1850 0x1E02, 0x1E02,
1851 0x1E04, 0x1E04,
1852 0x1E06, 0x1E06,
1853 0x1E08, 0x1E08,
1854 0x1E0A, 0x1E0A,
1855 0x1E0C, 0x1E0C,
1856 0x1E0E, 0x1E0E,
1857 0x1E10, 0x1E10,
1858 0x1E12, 0x1E12,
1859 0x1E14, 0x1E14,
1860 0x1E16, 0x1E16,
1861 0x1E18, 0x1E18,
1862 0x1E1A, 0x1E1A,
1863 0x1E1C, 0x1E1C,
1864 0x1E1E, 0x1E1E,
1865 0x1E20, 0x1E20,
1866 0x1E22, 0x1E22,
1867 0x1E24, 0x1E24,
1868 0x1E26, 0x1E26,
1869 0x1E28, 0x1E28,
1870 0x1E2A, 0x1E2A,
1871 0x1E2C, 0x1E2C,
1872 0x1E2E, 0x1E2E,
1873 0x1E30, 0x1E30,
1874 0x1E32, 0x1E32,
1875 0x1E34, 0x1E34,
1876 0x1E36, 0x1E36,
1877 0x1E38, 0x1E38,
1878 0x1E3A, 0x1E3A,
1879 0x1E3C, 0x1E3C,
1880 0x1E3E, 0x1E3E,
1881 0x1E40, 0x1E40,
1882 0x1E42, 0x1E42,
1883 0x1E44, 0x1E44,
1884 0x1E46, 0x1E46,
1885 0x1E48, 0x1E48,
1886 0x1E4A, 0x1E4A,
1887 0x1E4C, 0x1E4C,
1888 0x1E4E, 0x1E4E,
1889 0x1E50, 0x1E50,
1890 0x1E52, 0x1E52,
1891 0x1E54, 0x1E54,
1892 0x1E56, 0x1E56,
1893 0x1E58, 0x1E58,
1894 0x1E5A, 0x1E5A,
1895 0x1E5C, 0x1E5C,
1896 0x1E5E, 0x1E5E,
1897 0x1E60, 0x1E60,
1898 0x1E62, 0x1E62,
1899 0x1E64, 0x1E64,
1900 0x1E66, 0x1E66,
1901 0x1E68, 0x1E68,
1902 0x1E6A, 0x1E6A,
1903 0x1E6C, 0x1E6C,
1904 0x1E6E, 0x1E6E,
1905 0x1E70, 0x1E70,
1906 0x1E72, 0x1E72,
1907 0x1E74, 0x1E74,
1908 0x1E76, 0x1E76,
1909 0x1E78, 0x1E78,
1910 0x1E7A, 0x1E7A,
1911 0x1E7C, 0x1E7C,
1912 0x1E7E, 0x1E7E,
1913 0x1E80, 0x1E80,
1914 0x1E82, 0x1E82,
1915 0x1E84, 0x1E84,
1916 0x1E86, 0x1E86,
1917 0x1E88, 0x1E88,
1918 0x1E8A, 0x1E8A,
1919 0x1E8C, 0x1E8C,
1920 0x1E8E, 0x1E8E,
1921 0x1E90, 0x1E90,
1922 0x1E92, 0x1E92,
1923 0x1E94, 0x1E94,
1924 0x1E9E, 0x1E9E,
1925 0x1EA0, 0x1EA0,
1926 0x1EA2, 0x1EA2,
1927 0x1EA4, 0x1EA4,
1928 0x1EA6, 0x1EA6,
1929 0x1EA8, 0x1EA8,
1930 0x1EAA, 0x1EAA,
1931 0x1EAC, 0x1EAC,
1932 0x1EAE, 0x1EAE,
1933 0x1EB0, 0x1EB0,
1934 0x1EB2, 0x1EB2,
1935 0x1EB4, 0x1EB4,
1936 0x1EB6, 0x1EB6,
1937 0x1EB8, 0x1EB8,
1938 0x1EBA, 0x1EBA,
1939 0x1EBC, 0x1EBC,
1940 0x1EBE, 0x1EBE,
1941 0x1EC0, 0x1EC0,
1942 0x1EC2, 0x1EC2,
1943 0x1EC4, 0x1EC4,
1944 0x1EC6, 0x1EC6,
1945 0x1EC8, 0x1EC8,
1946 0x1ECA, 0x1ECA,
1947 0x1ECC, 0x1ECC,
1948 0x1ECE, 0x1ECE,
1949 0x1ED0, 0x1ED0,
1950 0x1ED2, 0x1ED2,
1951 0x1ED4, 0x1ED4,
1952 0x1ED6, 0x1ED6,
1953 0x1ED8, 0x1ED8,
1954 0x1EDA, 0x1EDA,
1955 0x1EDC, 0x1EDC,
1956 0x1EDE, 0x1EDE,
1957 0x1EE0, 0x1EE0,
1958 0x1EE2, 0x1EE2,
1959 0x1EE4, 0x1EE4,
1960 0x1EE6, 0x1EE6,
1961 0x1EE8, 0x1EE8,
1962 0x1EEA, 0x1EEA,
1963 0x1EEC, 0x1EEC,
1964 0x1EEE, 0x1EEE,
1965 0x1EF0, 0x1EF0,
1966 0x1EF2, 0x1EF2,
1967 0x1EF4, 0x1EF4,
1968 0x1EF6, 0x1EF6,
1969 0x1EF8, 0x1EF8,
1970 0x1EFA, 0x1EFA,
1971 0x1EFC, 0x1EFC,
1972 0x1EFE, 0x1EFE,
1973 0x1F08, 0x1F0F,
1974 0x1F18, 0x1F1D,
1975 0x1F28, 0x1F2F,
1976 0x1F38, 0x1F3F,
1977 0x1F48, 0x1F4D,
1978 0x1F59, 0x1F59,
1979 0x1F5B, 0x1F5B,
1980 0x1F5D, 0x1F5D,
1981 0x1F5F, 0x1F5F,
1982 0x1F68, 0x1F6F,
1983 0x1F88, 0x1F8F,
1984 0x1F98, 0x1F9F,
1985 0x1FA8, 0x1FAF,
1986 0x1FB8, 0x1FBC,
1987 0x1FC8, 0x1FCC,
1988 0x1FD8, 0x1FDB,
1989 0x1FE8, 0x1FEC,
1990 0x1FF8, 0x1FFC,
1991 0x2102, 0x2102,
1992 0x2107, 0x2107,
1993 0x210B, 0x210D,
1994 0x2110, 0x2112,
1995 0x2115, 0x2115,
1996 0x2119, 0x211D,
1997 0x2124, 0x2124,
1998 0x2126, 0x2126,
1999 0x2128, 0x2128,
2000 0x212A, 0x212D,
2001 0x2130, 0x2133,
2002 0x213E, 0x213F,
2003 0x2145, 0x2145,
2004 0x2160, 0x216F,
2005 0x2183, 0x2183,
2006 0x24B6, 0x24CF,
2007 0x2C00, 0x2C2F,
2008 0x2C60, 0x2C60,
2009 0x2C62, 0x2C64,
2010 0x2C67, 0x2C67,
2011 0x2C69, 0x2C69,
2012 0x2C6B, 0x2C6B,
2013 0x2C6D, 0x2C70,
2014 0x2C72, 0x2C72,
2015 0x2C75, 0x2C75,
2016 0x2C7E, 0x2C80,
2017 0x2C82, 0x2C82,
2018 0x2C84, 0x2C84,
2019 0x2C86, 0x2C86,
2020 0x2C88, 0x2C88,
2021 0x2C8A, 0x2C8A,
2022 0x2C8C, 0x2C8C,
2023 0x2C8E, 0x2C8E,
2024 0x2C90, 0x2C90,
2025 0x2C92, 0x2C92,
2026 0x2C94, 0x2C94,
2027 0x2C96, 0x2C96,
2028 0x2C98, 0x2C98,
2029 0x2C9A, 0x2C9A,
2030 0x2C9C, 0x2C9C,
2031 0x2C9E, 0x2C9E,
2032 0x2CA0, 0x2CA0,
2033 0x2CA2, 0x2CA2,
2034 0x2CA4, 0x2CA4,
2035 0x2CA6, 0x2CA6,
2036 0x2CA8, 0x2CA8,
2037 0x2CAA, 0x2CAA,
2038 0x2CAC, 0x2CAC,
2039 0x2CAE, 0x2CAE,
2040 0x2CB0, 0x2CB0,
2041 0x2CB2, 0x2CB2,
2042 0x2CB4, 0x2CB4,
2043 0x2CB6, 0x2CB6,
2044 0x2CB8, 0x2CB8,
2045 0x2CBA, 0x2CBA,
2046 0x2CBC, 0x2CBC,
2047 0x2CBE, 0x2CBE,
2048 0x2CC0, 0x2CC0,
2049 0x2CC2, 0x2CC2,
2050 0x2CC4, 0x2CC4,
2051 0x2CC6, 0x2CC6,
2052 0x2CC8, 0x2CC8,
2053 0x2CCA, 0x2CCA,
2054 0x2CCC, 0x2CCC,
2055 0x2CCE, 0x2CCE,
2056 0x2CD0, 0x2CD0,
2057 0x2CD2, 0x2CD2,
2058 0x2CD4, 0x2CD4,
2059 0x2CD6, 0x2CD6,
2060 0x2CD8, 0x2CD8,
2061 0x2CDA, 0x2CDA,
2062 0x2CDC, 0x2CDC,
2063 0x2CDE, 0x2CDE,
2064 0x2CE0, 0x2CE0,
2065 0x2CE2, 0x2CE2,
2066 0x2CEB, 0x2CEB,
2067 0x2CED, 0x2CED,
2068 0x2CF2, 0x2CF2,
2069 0xA640, 0xA640,
2070 0xA642, 0xA642,
2071 0xA644, 0xA644,
2072 0xA646, 0xA646,
2073 0xA648, 0xA648,
2074 0xA64A, 0xA64A,
2075 0xA64C, 0xA64C,
2076 0xA64E, 0xA64E,
2077 0xA650, 0xA650,
2078 0xA652, 0xA652,
2079 0xA654, 0xA654,
2080 0xA656, 0xA656,
2081 0xA658, 0xA658,
2082 0xA65A, 0xA65A,
2083 0xA65C, 0xA65C,
2084 0xA65E, 0xA65E,
2085 0xA660, 0xA660,
2086 0xA662, 0xA662,
2087 0xA664, 0xA664,
2088 0xA666, 0xA666,
2089 0xA668, 0xA668,
2090 0xA66A, 0xA66A,
2091 0xA66C, 0xA66C,
2092 0xA680, 0xA680,
2093 0xA682, 0xA682,
2094 0xA684, 0xA684,
2095 0xA686, 0xA686,
2096 0xA688, 0xA688,
2097 0xA68A, 0xA68A,
2098 0xA68C, 0xA68C,
2099 0xA68E, 0xA68E,
2100 0xA690, 0xA690,
2101 0xA692, 0xA692,
2102 0xA694, 0xA694,
2103 0xA696, 0xA696,
2104 0xA698, 0xA698,
2105 0xA69A, 0xA69A,
2106 0xA722, 0xA722,
2107 0xA724, 0xA724,
2108 0xA726, 0xA726,
2109 0xA728, 0xA728,
2110 0xA72A, 0xA72A,
2111 0xA72C, 0xA72C,
2112 0xA72E, 0xA72E,
2113 0xA732, 0xA732,
2114 0xA734, 0xA734,
2115 0xA736, 0xA736,
2116 0xA738, 0xA738,
2117 0xA73A, 0xA73A,
2118 0xA73C, 0xA73C,
2119 0xA73E, 0xA73E,
2120 0xA740, 0xA740,
2121 0xA742, 0xA742,
2122 0xA744, 0xA744,
2123 0xA746, 0xA746,
2124 0xA748, 0xA748,
2125 0xA74A, 0xA74A,
2126 0xA74C, 0xA74C,
2127 0xA74E, 0xA74E,
2128 0xA750, 0xA750,
2129 0xA752, 0xA752,
2130 0xA754, 0xA754,
2131 0xA756, 0xA756,
2132 0xA758, 0xA758,
2133 0xA75A, 0xA75A,
2134 0xA75C, 0xA75C,
2135 0xA75E, 0xA75E,
2136 0xA760, 0xA760,
2137 0xA762, 0xA762,
2138 0xA764, 0xA764,
2139 0xA766, 0xA766,
2140 0xA768, 0xA768,
2141 0xA76A, 0xA76A,
2142 0xA76C, 0xA76C,
2143 0xA76E, 0xA76E,
2144 0xA779, 0xA779,
2145 0xA77B, 0xA77B,
2146 0xA77D, 0xA77E,
2147 0xA780, 0xA780,
2148 0xA782, 0xA782,
2149 0xA784, 0xA784,
2150 0xA786, 0xA786,
2151 0xA78B, 0xA78B,
2152 0xA78D, 0xA78D,
2153 0xA790, 0xA790,
2154 0xA792, 0xA792,
2155 0xA796, 0xA796,
2156 0xA798, 0xA798,
2157 0xA79A, 0xA79A,
2158 0xA79C, 0xA79C,
2159 0xA79E, 0xA79E,
2160 0xA7A0, 0xA7A0,
2161 0xA7A2, 0xA7A2,
2162 0xA7A4, 0xA7A4,
2163 0xA7A6, 0xA7A6,
2164 0xA7A8, 0xA7A8,
2165 0xA7AA, 0xA7AE,
2166 0xA7B0, 0xA7B4,
2167 0xA7B6, 0xA7B6,
2168 0xA7B8, 0xA7B8,
2169 0xA7BA, 0xA7BA,
2170 0xA7BC, 0xA7BC,
2171 0xA7BE, 0xA7BE,
2172 0xA7C0, 0xA7C0,
2173 0xA7C2, 0xA7C2,
2174 0xA7C4, 0xA7C7,
2175 0xA7C9, 0xA7C9,
2176 0xA7CB, 0xA7CC,
2177 0xA7CE, 0xA7CE,
2178 0xA7D0, 0xA7D0,
2179 0xA7D2, 0xA7D2,
2180 0xA7D4, 0xA7D4,
2181 0xA7D6, 0xA7D6,
2182 0xA7D8, 0xA7D8,
2183 0xA7DA, 0xA7DA,
2184 0xA7DC, 0xA7DC,
2185 0xA7F5, 0xA7F5,
2186 0xFF21, 0xFF3A,
2187 0x10400, 0x10427,
2188 0x104B0, 0x104D3,
2189 0x10570, 0x1057A,
2190 0x1057C, 0x1058A,
2191 0x1058C, 0x10592,
2192 0x10594, 0x10595,
2193 0x10C80, 0x10CB2,
2194 0x10D50, 0x10D65,
2195 0x118A0, 0x118BF,
2196 0x16E40, 0x16E5F,
2197 0x16EA0, 0x16EB8,
2198 0x1D400, 0x1D419,
2199 0x1D434, 0x1D44D,
2200 0x1D468, 0x1D481,
2201 0x1D49C, 0x1D49C,
2202 0x1D49E, 0x1D49F,
2203 0x1D4A2, 0x1D4A2,
2204 0x1D4A5, 0x1D4A6,
2205 0x1D4A9, 0x1D4AC,
2206 0x1D4AE, 0x1D4B5,
2207 0x1D4D0, 0x1D4E9,
2208 0x1D504, 0x1D505,
2209 0x1D507, 0x1D50A,
2210 0x1D50D, 0x1D514,
2211 0x1D516, 0x1D51C,
2212 0x1D538, 0x1D539,
2213 0x1D53B, 0x1D53E,
2214 0x1D540, 0x1D544,
2215 0x1D546, 0x1D546,
2216 0x1D54A, 0x1D550,
2217 0x1D56C, 0x1D585,
2218 0x1D5A0, 0x1D5B9,
2219 0x1D5D4, 0x1D5ED,
2220 0x1D608, 0x1D621,
2221 0x1D63C, 0x1D655,
2222 0x1D670, 0x1D689,
2223 0x1D6A8, 0x1D6C0,
2224 0x1D6E2, 0x1D6FA,
2225 0x1D71C, 0x1D734,
2226 0x1D756, 0x1D76E,
2227 0x1D790, 0x1D7A8,
2228 0x1D7CA, 0x1D7CA,
2229 0x1E900, 0x1E921,
2230 0x1F130, 0x1F149,
2231 0x1F150, 0x1F169,
2232 0x1F170, 0x1F189,
2233};
2234
2242const uint8_t pm_encoding_unicode_table[256] = {
2243// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2244 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2245 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2246 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2247 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2248 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2249 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2250 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2251 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2252 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2253 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2254 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Ax
2255 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Bx
2256 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
2257 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
2258 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
2259 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
2260};
2261
2266static bool
2267pm_unicode_codepoint_match(pm_unicode_codepoint_t codepoint, const pm_unicode_codepoint_t *codepoints, size_t size) {
2268 size_t start = 0;
2269 size_t end = size;
2270
2271 while (start < end) {
2272 size_t middle = start + (end - start) / 2;
2273 if ((middle % 2) != 0) middle--;
2274
2275 if (codepoint >= codepoints[middle] && codepoint <= codepoints[middle + 1]) {
2276 return true;
2277 }
2278
2279 if (codepoint < codepoints[middle]) {
2280 end = middle;
2281 } else {
2282 start = middle + 2;
2283 }
2284 }
2285
2286 return false;
2287}
2288
2312static const uint8_t pm_utf_8_dfa[] = {
2313 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 00..1f
2314 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 20..3f
2315 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 40..5f
2316 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, // 60..7f
2317 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9,9, // 80..9f
2318 7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7, // a0..bf
2319 8,8,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, // c0..df
2320 0xa,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x3,0x4,0x3,0x3, // e0..ef
2321 0xb,0x6,0x6,0x6,0x5,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8,0x8, // f0..ff
2322 0x0,0x1,0x2,0x3,0x5,0x8,0x7,0x1,0x1,0x1,0x4,0x6,0x1,0x1,0x1,0x1, // s0..s0
2323 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,1,1,1,1,0,1,0,1,1,1,1,1,1, // s1..s2
2324 1,2,1,1,1,1,1,2,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1, // s3..s4
2325 1,2,1,1,1,1,1,1,1,2,1,1,1,1,1,1,1,1,1,1,1,1,1,3,1,3,1,1,1,1,1,1, // s5..s6
2326 1,3,1,1,1,1,1,3,1,3,1,1,1,1,1,1,1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1, // s7..s8
2327};
2328
2334static pm_unicode_codepoint_t
2335pm_utf_8_codepoint(const uint8_t *b, ptrdiff_t n, size_t *width) {
2336 assert(n >= 0);
2337
2338 size_t maximum = (n > 4) ? 4 : ((size_t) n);
2339 uint32_t codepoint;
2340 uint32_t state = 0;
2341
2342 for (size_t index = 0; index < maximum; index++) {
2343 uint32_t byte = b[index];
2344 uint32_t type = pm_utf_8_dfa[byte];
2345
2346 codepoint = (state != 0) ?
2347 (byte & 0x3fu) | (codepoint << 6) :
2348 (0xffu >> type) & (byte);
2349
2350 state = pm_utf_8_dfa[256 + (state * 16) + type];
2351 if (state == 0) {
2352 *width = index + 1;
2353 return (pm_unicode_codepoint_t) codepoint;
2354 }
2355 }
2356
2357 *width = 0;
2358 return 0;
2359}
2360
2364size_t
2365pm_encoding_utf_8_char_width(const uint8_t *b, ptrdiff_t n) {
2366 assert(n >= 0);
2367
2368 size_t maximum = (n > 4) ? 4 : ((size_t) n);
2369 uint32_t state = 0;
2370
2371 for (size_t index = 0; index < maximum; index++) {
2372 state = pm_utf_8_dfa[256 + (state * 16) + pm_utf_8_dfa[b[index]]];
2373 if (state == 0) return index + 1;
2374 }
2375
2376 return 0;
2377}
2378
2383size_t
2384pm_encoding_utf_8_alpha_char(const uint8_t *b, ptrdiff_t n) {
2385 if (n == 0) {
2386 return 0;
2387 }
2388
2389 if (*b < 0x80) {
2390 return (pm_encoding_unicode_table[*b] & PRISM_ENCODING_ALPHABETIC_BIT) ? 1 : 0;
2391 }
2392
2393 size_t width;
2394 pm_unicode_codepoint_t codepoint = pm_utf_8_codepoint(b, n, &width);
2395
2396 if (codepoint <= 0xFF) {
2397 return (pm_encoding_unicode_table[(uint8_t) codepoint] & PRISM_ENCODING_ALPHABETIC_BIT) ? width : 0;
2398 } else {
2399 return pm_unicode_codepoint_match(codepoint, unicode_alpha_codepoints, UNICODE_ALPHA_CODEPOINTS_LENGTH) ? width : 0;
2400 }
2401}
2402
2407size_t
2408pm_encoding_utf_8_alnum_char(const uint8_t *b, ptrdiff_t n) {
2409 if (n == 0) {
2410 return 0;
2411 }
2412
2413 if (*b < 0x80) {
2414 return (pm_encoding_unicode_table[*b] & (PRISM_ENCODING_ALPHANUMERIC_BIT)) ? 1 : 0;
2415 }
2416
2417 size_t width;
2418 pm_unicode_codepoint_t codepoint = pm_utf_8_codepoint(b, n, &width);
2419
2420 if (codepoint <= 0xFF) {
2421 return (pm_encoding_unicode_table[(uint8_t) codepoint] & (PRISM_ENCODING_ALPHANUMERIC_BIT)) ? width : 0;
2422 } else {
2423 return pm_unicode_codepoint_match(codepoint, unicode_alnum_codepoints, UNICODE_ALNUM_CODEPOINTS_LENGTH) ? width : 0;
2424 }
2425}
2426
2431bool
2432pm_encoding_utf_8_isupper_char(const uint8_t *b, ptrdiff_t n) {
2433 if (n == 0) {
2434 return 0;
2435 }
2436
2437 if (*b < 0x80) {
2438 return (pm_encoding_unicode_table[*b] & PRISM_ENCODING_UPPERCASE_BIT) ? true : false;
2439 }
2440
2441 size_t width;
2442 pm_unicode_codepoint_t codepoint = pm_utf_8_codepoint(b, n, &width);
2443
2444 if (codepoint <= 0xFF) {
2445 return (pm_encoding_unicode_table[(uint8_t) codepoint] & PRISM_ENCODING_UPPERCASE_BIT) ? true : false;
2446 } else {
2447 return pm_unicode_codepoint_match(codepoint, unicode_isupper_codepoints, UNICODE_ISUPPER_CODEPOINTS_LENGTH) ? true : false;
2448 }
2449}
2450
2451#ifndef PRISM_ENCODING_EXCLUDE_FULL
2452
2453static pm_unicode_codepoint_t
2454pm_cesu_8_codepoint(const uint8_t *b, ptrdiff_t n, size_t *width) {
2455
2456 if ((n > 0) && (b[0] < 0x80)) {
2457 *width = 1;
2458 return (pm_unicode_codepoint_t) b[0];
2459 }
2460
2461 if (n > 1 && b[0] >= 0xC2 && b[0] <= 0xDF && b[1] >= 0x80 && b[1] <= 0xBF) {
2462 *width = 2;
2463
2464 // 110xxxxx 10xxxxxx
2465 return (pm_unicode_codepoint_t) (((b[0] & 0x1F) << 6) | (b[1] & 0x3F));
2466 }
2467
2468 if (n > 5 && b[0] == 0xED && b[1] >= 0xA0 && b[1] <= 0xAF && b[2] >= 0x80 && b[2] <= 0xBF && b[3] == 0xED && b[4] >= 0xB0 && b[4] <= 0xBF && b[5] >= 0x80 && b[5] <= 0xBF) {
2469 *width = 6;
2470
2471 // 11101101 1010xxxx 10xxxxxx 11101101 1011xxxx 10xxxxxx
2472 return (pm_unicode_codepoint_t) (0x10000 + (((b[1] & 0xF) << 16) | ((b[2] & 0x3F) << 10) | ((b[4] & 0xF) << 6) | (b[5] & 0x3F)));
2473 }
2474
2475 if (n > 2 && b[0] == 0xED && b[1] >= 0xA0 && b[1] <= 0xBF) {
2476 *width = 3;
2477
2478 // 11101101 1010xxxx 10xxxxx
2479 return (pm_unicode_codepoint_t) (0x10000 + (((b[0] & 0x03) << 16) | ((b[1] & 0x3F) << 10) | (b[2] & 0x3F)));
2480 }
2481
2482 if (n > 2 && ((b[0] == 0xE0 && b[1] >= 0xA0) || (b[0] >= 0xE1 && b[0] <= 0xEF && b[1] >= 0x80)) && b[1] <= 0xBF && b[2] >= 0x80 && b[2] <= 0xBF) {
2483 *width = 3;
2484
2485 // 1110xxxx 10xxxxxx 10xxxxx
2486 return (pm_unicode_codepoint_t) (((b[0] & 0xF) << 12) | ((b[1] & 0x3F) << 6) | (b[2] & 0x3F));
2487 }
2488
2489 *width = 0;
2490 return 0;
2491}
2492
2493static size_t
2494pm_encoding_cesu_8_char_width(const uint8_t *b, ptrdiff_t n) {
2495 if (n == 0) {
2496 return 0;
2497 }
2498
2499 size_t width;
2500 pm_cesu_8_codepoint(b, n, &width);
2501 return width;
2502}
2503
2504static size_t
2505pm_encoding_cesu_8_alpha_char(const uint8_t *b, ptrdiff_t n) {
2506 if (n == 0) {
2507 return 0;
2508 }
2509
2510 if (*b < 0x80) {
2511 return (pm_encoding_unicode_table[*b] & PRISM_ENCODING_ALPHABETIC_BIT) ? 1 : 0;
2512 }
2513
2514 size_t width;
2515 pm_unicode_codepoint_t codepoint = pm_cesu_8_codepoint(b, n, &width);
2516
2517 if (codepoint <= 0xFF) {
2518 return (pm_encoding_unicode_table[(uint8_t) codepoint] & PRISM_ENCODING_ALPHABETIC_BIT) ? width : 0;
2519 } else {
2520 return pm_unicode_codepoint_match(codepoint, unicode_alpha_codepoints, UNICODE_ALPHA_CODEPOINTS_LENGTH) ? width : 0;
2521 }
2522}
2523
2524static size_t
2525pm_encoding_cesu_8_alnum_char(const uint8_t *b, ptrdiff_t n) {
2526 if (n == 0) {
2527 return 0;
2528 }
2529
2530 if (*b < 0x80) {
2531 return (pm_encoding_unicode_table[*b] & (PRISM_ENCODING_ALPHANUMERIC_BIT)) ? 1 : 0;
2532 }
2533
2534 size_t width;
2535 pm_unicode_codepoint_t codepoint = pm_cesu_8_codepoint(b, n, &width);
2536
2537 if (codepoint <= 0xFF) {
2538 return (pm_encoding_unicode_table[(uint8_t) codepoint] & (PRISM_ENCODING_ALPHANUMERIC_BIT)) ? width : 0;
2539 } else {
2540 return pm_unicode_codepoint_match(codepoint, unicode_alnum_codepoints, UNICODE_ALNUM_CODEPOINTS_LENGTH) ? width : 0;
2541 }
2542}
2543
2544static bool
2545pm_encoding_cesu_8_isupper_char(const uint8_t *b, ptrdiff_t n) {
2546 if (n == 0) {
2547 return 0;
2548 }
2549
2550 if (*b < 0x80) {
2551 return (pm_encoding_unicode_table[*b] & PRISM_ENCODING_UPPERCASE_BIT) ? true : false;
2552 }
2553
2554 size_t width;
2555 pm_unicode_codepoint_t codepoint = pm_cesu_8_codepoint(b, n, &width);
2556
2557 if (codepoint <= 0xFF) {
2558 return (pm_encoding_unicode_table[(uint8_t) codepoint] & PRISM_ENCODING_UPPERCASE_BIT) ? true : false;
2559 } else {
2560 return pm_unicode_codepoint_match(codepoint, unicode_isupper_codepoints, UNICODE_ISUPPER_CODEPOINTS_LENGTH) ? true : false;
2561 }
2562}
2563
2564#endif
2565
2566#undef UNICODE_ALPHA_CODEPOINTS_LENGTH
2567#undef UNICODE_ALNUM_CODEPOINTS_LENGTH
2568#undef UNICODE_ISUPPER_CODEPOINTS_LENGTH
2569
2574static const uint8_t pm_encoding_ascii_table[256] = {
2575// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2576 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2578 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2579 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2580 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2581 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2582 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2583 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2584 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2585 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2586 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2587 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2589 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2590 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2591 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2592};
2593
2594#ifndef PRISM_ENCODING_EXCLUDE_FULL
2595
2600static const uint8_t pm_encoding_cp850_table[256] = {
2601// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2602 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2603 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2604 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2605 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2606 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2607 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2608 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2609 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2610 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2613 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2614 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2615 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2616 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2617 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2618};
2619
2624static const uint8_t pm_encoding_cp852_table[256] = {
2625// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2626 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2627 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2628 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2629 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2630 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2631 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2632 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2633 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2634 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2635 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2636 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2637 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2638 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2639 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2640 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2641 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2642};
2643
2648static const uint8_t pm_encoding_cp855_table[256] = {
2649// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2650 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2651 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2652 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2653 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2654 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2655 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2656 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2657 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2658 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2659 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2660 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2661 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2662 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2663 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2664 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2665 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2666};
2667
2672static const uint8_t pm_encoding_gb1988_table[256] = {
2673// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2674 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2675 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2676 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2677 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2678 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2679 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2680 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2681 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2682 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2683 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2684 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2685 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2686 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2687 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2688 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2689 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2690};
2691
2696static const uint8_t pm_encoding_ibm437_table[256] = {
2697// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2698 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2699 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2700 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2701 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2702 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2703 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2704 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2705 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2706 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2707 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2708 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2709 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2710 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2711 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2712 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2713 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2714};
2715
2720static const uint8_t pm_encoding_ibm720_table[256] = {
2721// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2722 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2723 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2724 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2725 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2726 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2727 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2728 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2729 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2730 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2731 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2732 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2733 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2734 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2735 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2736 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2737 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2738};
2739
2744static const uint8_t pm_encoding_ibm737_table[256] = {
2745// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2746 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2747 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2748 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2749 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2750 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2751 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2752 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2753 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2754 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2756 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2757 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2758 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2759 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2760 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2761 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2762};
2763
2768static const uint8_t pm_encoding_ibm775_table[256] = {
2769// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2770 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2771 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2772 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2773 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2774 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2775 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2776 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2777 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2778 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2779 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2780 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2781 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2782 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2783 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2784 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2785 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2786};
2787
2792static const uint8_t pm_encoding_ibm852_table[256] = {
2793// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2794 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2795 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2796 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2797 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2798 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2799 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2800 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2801 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2802 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2803 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2804 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2805 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2806 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2807 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2808 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2809 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2810};
2811
2816static const uint8_t pm_encoding_ibm855_table[256] = {
2817// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2818 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2819 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2820 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2821 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2822 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2823 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2824 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2825 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2826 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2827 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2828 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2829 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2830 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2831 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2832 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2833 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2834};
2835
2840static const uint8_t pm_encoding_ibm857_table[256] = {
2841// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2842 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2843 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2844 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2845 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2846 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2847 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2848 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2849 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2850 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2851 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2852 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2853 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2854 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2855 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2856 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2857 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2858};
2859
2864static const uint8_t pm_encoding_ibm860_table[256] = {
2865// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2866 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2867 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2868 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2869 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2870 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2871 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2872 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2873 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2874 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2875 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2876 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2877 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2878 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2879 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2880 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2881 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2882};
2883
2888static const uint8_t pm_encoding_ibm861_table[256] = {
2889// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2890 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2891 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2892 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2893 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2894 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2895 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2896 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2897 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2898 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2899 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2900 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2901 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2902 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2903 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2904 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2905 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2906};
2907
2912static const uint8_t pm_encoding_ibm862_table[256] = {
2913// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2914 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2915 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2916 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2917 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2918 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2919 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2920 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2921 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2922 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2923 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2924 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2925 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2926 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2927 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2928 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2929 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2930};
2931
2936static const uint8_t pm_encoding_ibm863_table[256] = {
2937// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2938 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2939 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2940 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2941 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2942 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2943 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2944 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2945 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2946 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2947 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2948 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2949 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2950 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2951 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2952 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2953 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2954};
2955
2960static const uint8_t pm_encoding_ibm864_table[256] = {
2961// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2962 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2963 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2964 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2965 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2966 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2967 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2968 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2969 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2970 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2971 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2972 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2973 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2974 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2975 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
2976 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
2977 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
2978};
2979
2984static const uint8_t pm_encoding_ibm865_table[256] = {
2985// 0 1 2 3 4 5 6 7 8 9 A B C D E F
2986 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
2987 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
2988 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
2989 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
2990 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
2991 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
2992 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
2993 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
2994 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
2995 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
2996 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
2997 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
2998 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
2999 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3000 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3001 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3002};
3003
3008static const uint8_t pm_encoding_ibm866_table[256] = {
3009// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3010 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3011 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3012 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3013 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3014 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3015 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3016 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3017 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3018 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3019 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3020 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3021 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3022 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3023 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3024 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3025 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3026};
3027
3032static const uint8_t pm_encoding_ibm869_table[256] = {
3033// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3034 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3035 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3036 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3037 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3038 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3039 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3040 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3041 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3042 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3043 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3044 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3045 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3046 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3047 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3048 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3049 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3050};
3051
3056static const uint8_t pm_encoding_iso_8859_1_table[256] = {
3057// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3058 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3059 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3060 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3061 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3062 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3063 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3064 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3065 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3066 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3067 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3068 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Ax
3069 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Bx
3070 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3071 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3072 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3073 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3074};
3075
3080static const uint8_t pm_encoding_iso_8859_2_table[256] = {
3081// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3082 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3083 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3084 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3085 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3086 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3087 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3088 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3089 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3090 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3091 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3092 0, 7, 0, 7, 0, 7, 7, 0, 0, 7, 7, 7, 7, 0, 7, 7, // Ax
3093 0, 3, 0, 3, 0, 3, 3, 0, 0, 3, 3, 3, 3, 0, 3, 3, // Bx
3094 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3095 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3096 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3097 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3098};
3099
3104static const uint8_t pm_encoding_iso_8859_3_table[256] = {
3105// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3106 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3109 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3110 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3111 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3112 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3113 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3115 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3116 0, 7, 0, 0, 0, 0, 7, 0, 0, 7, 7, 7, 7, 0, 0, 7, // Ax
3117 0, 3, 0, 0, 0, 3, 3, 0, 0, 3, 3, 3, 3, 0, 0, 3, // Bx
3118 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3119 0, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3120 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3121 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3122};
3123
3128static const uint8_t pm_encoding_iso_8859_4_table[256] = {
3129// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3130 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3131 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3132 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3133 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3134 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3135 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3136 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3137 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3138 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3139 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3140 0, 7, 3, 7, 0, 7, 7, 0, 0, 7, 7, 7, 7, 0, 7, 0, // Ax
3141 0, 3, 0, 3, 0, 3, 3, 0, 0, 3, 3, 3, 3, 7, 3, 3, // Bx
3142 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3143 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3144 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3145 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3146};
3147
3152static const uint8_t pm_encoding_iso_8859_5_table[256] = {
3153// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3154 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3155 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3156 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3157 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3158 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3159 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3160 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3161 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3162 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3163 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3164 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, // Ax
3165 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Bx
3166 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3167 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Dx
3168 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3169 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, // Fx
3170};
3171
3176static const uint8_t pm_encoding_iso_8859_6_table[256] = {
3177// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3178 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3179 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3180 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3181 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3182 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3183 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3184 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3185 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3186 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3187 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3188 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3189 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3190 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Cx
3191 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // Dx
3192 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3193 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3194};
3195
3200static const uint8_t pm_encoding_iso_8859_7_table[256] = {
3201// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3202 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3203 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3204 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3205 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3206 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3207 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3208 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3209 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3210 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3211 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3212 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3213 0, 0, 0, 0, 0, 0, 7, 0, 7, 7, 7, 0, 7, 0, 7, 7, // Bx
3214 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3215 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, // Dx
3216 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3217 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3218};
3219
3224static const uint8_t pm_encoding_iso_8859_8_table[256] = {
3225// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3226 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3227 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3228 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3229 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3230 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3231 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3232 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3233 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3234 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3235 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3236 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3237 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3238 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3239 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3240 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3241 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // Fx
3242};
3243
3248static const uint8_t pm_encoding_iso_8859_9_table[256] = {
3249// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3250 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3251 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3252 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3253 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3254 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3255 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3256 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3257 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3258 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3259 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3260 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Ax
3261 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Bx
3262 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3263 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3264 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3265 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3266};
3267
3272static const uint8_t pm_encoding_iso_8859_10_table[256] = {
3273// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3274 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3275 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3276 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3277 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3278 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3279 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3280 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3281 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3282 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3283 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3284 0, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 0, 7, 7, // Ax
3285 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 0, 3, 3, // Bx
3286 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3287 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3288 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3289 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3290};
3291
3296static const uint8_t pm_encoding_iso_8859_11_table[256] = {
3297// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3298 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3299 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3300 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3301 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3302 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3303 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3304 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3305 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3306 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3307 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3308 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ax
3309 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Bx
3310 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Cx
3311 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, // Dx
3312 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3313 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, // Fx
3314};
3315
3320static const uint8_t pm_encoding_iso_8859_13_table[256] = {
3321// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3322 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3323 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3324 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3325 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3326 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3327 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3328 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3329 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3330 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3331 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3332 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 7, // Ax
3333 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, // Bx
3334 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3335 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3336 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3337 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3338};
3339
3344static const uint8_t pm_encoding_iso_8859_14_table[256] = {
3345// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3346 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3347 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3348 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3349 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3350 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3351 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3352 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3353 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3354 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3355 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3356 0, 7, 3, 0, 7, 3, 7, 0, 7, 0, 7, 3, 7, 0, 0, 7, // Ax
3357 7, 3, 7, 3, 7, 3, 0, 7, 3, 3, 3, 7, 3, 7, 3, 3, // Bx
3358 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3359 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3360 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3361 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3362};
3363
3368static const uint8_t pm_encoding_iso_8859_15_table[256] = {
3369// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3370 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3371 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3372 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3373 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3374 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3375 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3376 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3377 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3378 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3379 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3380 0, 0, 0, 0, 0, 0, 7, 0, 3, 0, 3, 0, 0, 0, 0, 0, // Ax
3381 0, 0, 0, 0, 7, 3, 0, 0, 3, 0, 3, 0, 7, 3, 7, 0, // Bx
3382 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3383 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3384 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3385 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3386};
3387
3392static const uint8_t pm_encoding_iso_8859_16_table[256] = {
3393// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3394 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3395 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3396 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3397 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3398 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3399 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3400 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3401 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3402 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3403 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3404 0, 7, 3, 7, 0, 0, 7, 0, 3, 0, 7, 0, 7, 0, 3, 7, // Ax
3405 0, 0, 7, 3, 7, 0, 0, 0, 3, 3, 3, 0, 7, 3, 7, 3, // Bx
3406 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3407 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3408 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3409 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3410};
3411
3416static const uint8_t pm_encoding_koi8_r_table[256] = {
3417// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3418 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3419 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3420 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3421 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3422 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3423 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3424 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3425 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3426 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3427 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3428 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3429 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3430 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Cx
3431 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Dx
3432 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Ex
3433 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Fx
3434};
3435
3440static const uint8_t pm_encoding_koi8_u_table[256] = {
3441// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3442 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3443 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3444 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3445 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3446 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3447 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3448 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3449 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3450 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3451 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3452 0, 0, 0, 3, 3, 0, 3, 3, 0, 0, 0, 0, 0, 3, 0, 0, // Ax
3453 0, 0, 0, 7, 7, 0, 7, 7, 0, 0, 0, 0, 0, 7, 0, 0, // Bx
3454 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Cx
3455 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Dx
3456 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Ex
3457 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Fx
3458};
3459
3464static const uint8_t pm_encoding_mac_cent_euro_table[256] = {
3465// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3466 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3467 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3468 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3469 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3470 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3471 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3472 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3473 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3474 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3475 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3476 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3477 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3478 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3479 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3480 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3481 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3482};
3483
3488static const uint8_t pm_encoding_mac_croatian_table[256] = {
3489// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3490 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3491 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3492 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3493 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3494 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3495 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3496 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3497 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3498 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3499 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3500 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3501 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3502 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3503 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3504 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3505 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3506};
3507
3512static const uint8_t pm_encoding_mac_cyrillic_table[256] = {
3513// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3514 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3515 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3516 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3517 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3518 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3519 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3520 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3521 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3522 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3523 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3524 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3525 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3526 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3527 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3528 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3529 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3530};
3531
3536static const uint8_t pm_encoding_mac_greek_table[256] = {
3537// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3538 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3539 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3540 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3541 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3542 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3543 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3544 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3545 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3546 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3547 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3548 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3549 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3550 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3551 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3552 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3553 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3554};
3555
3560static const uint8_t pm_encoding_mac_iceland_table[256] = {
3561// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3562 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3563 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3564 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3565 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3566 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3567 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3568 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3569 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3570 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3571 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3572 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3573 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3574 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3575 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3576 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3577 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3578};
3579
3584static const uint8_t pm_encoding_mac_roman_table[256] = {
3585// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3586 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3587 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3588 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3589 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3590 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3591 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3592 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3593 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3594 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3595 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3596 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3597 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3598 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3599 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3600 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3601 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3602};
3603
3608static const uint8_t pm_encoding_mac_romania_table[256] = {
3609// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3610 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3611 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3612 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3613 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3614 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3615 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3616 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3617 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3618 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3619 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3620 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3621 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3622 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3623 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3624 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3625 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3626};
3627
3632static const uint8_t pm_encoding_mac_thai_table[256] = {
3633// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3634 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3635 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3636 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3637 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3638 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3639 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3640 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3641 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3642 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3643 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3644 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3645 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3646 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3647 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3648 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3649 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3650};
3651
3656static const uint8_t pm_encoding_tis_620_table[256] = {
3657// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3658 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3659 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3660 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3661 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3662 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3663 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3664 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3665 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3666 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3667 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3668 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ax
3669 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Bx
3670 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Cx
3671 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 3, // Dx
3672 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3673 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, // Fx
3674};
3675
3680static const uint8_t pm_encoding_mac_turkish_table[256] = {
3681// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3682 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3683 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3684 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3685 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3686 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3687 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3688 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3689 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3690 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3691 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3692 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3693 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3694 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3695 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3696 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3697 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3698};
3699
3704static const uint8_t pm_encoding_mac_ukraine_table[256] = {
3705// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3706 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3707 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3708 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3709 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3710 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3711 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3712 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3713 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3714 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3715 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3716 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3717 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3718 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3719 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3720 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3721 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3722};
3723
3728static const uint8_t pm_encoding_windows_1250_table[256] = {
3729// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3730 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3731 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3732 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3733 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3734 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3735 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3736 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3737 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3738 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 7, 7, 7, // 8x
3739 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, // 9x
3740 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 7, 0, 0, 0, 0, 7, // Ax
3741 0, 0, 0, 3, 0, 3, 0, 0, 0, 3, 3, 0, 7, 0, 3, 3, // Bx
3742 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3743 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3744 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3745 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3746};
3747
3752static const uint8_t pm_encoding_windows_1251_table[256] = {
3753// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3754 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3755 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3756 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3757 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3758 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3759 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3760 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3761 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3762 7, 7, 0, 3, 0, 0, 0, 0, 0, 0, 7, 0, 7, 7, 7, 7, // 8x
3763 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 3, 3, 3, // 9x
3764 0, 7, 3, 7, 0, 7, 0, 0, 7, 0, 7, 0, 0, 0, 0, 7, // Ax
3765 0, 0, 7, 3, 3, 3, 0, 0, 3, 0, 3, 0, 3, 7, 3, 3, // Bx
3766 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3767 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Dx
3768 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3769 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3770};
3771
3776static const uint8_t pm_encoding_windows_1252_table[256] = {
3777// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3778 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3779 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3780 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3781 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3782 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3783 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3784 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3785 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3786 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 7, 0, // 8x
3787 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 3, 7, // 9x
3788 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Ax
3789 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Bx
3790 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3791 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3792 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3793 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3794};
3795
3800static const uint8_t pm_encoding_windows_1253_table[256] = {
3801// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3802 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3803 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3804 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3805 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3806 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3807 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3808 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3809 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3810 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3811 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3812 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3813 0, 0, 0, 0, 0, 3, 7, 0, 7, 7, 7, 0, 7, 0, 7, 7, // Bx
3814 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3815 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 3, 3, 3, 3, // Dx
3816 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3817 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3818};
3819
3824static const uint8_t pm_encoding_windows_1254_table[256] = {
3825// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3826 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3827 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3828 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3829 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3830 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3831 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3832 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3833 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3834 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, // 8x
3835 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 0, 7, // 9x
3836 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Ax
3837 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, // Bx
3838 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3839 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3840 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3841 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, // Fx
3842};
3843
3848static const uint8_t pm_encoding_windows_1255_table[256] = {
3849// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3850 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3851 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3852 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3853 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3854 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3855 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3856 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3857 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3858 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3859 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3860 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3861 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3862 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3863 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3864 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3865 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // Fx
3866};
3867
3872static const uint8_t pm_encoding_windows_1256_table[256] = {
3873// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3874 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3875 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3876 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3877 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3878 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3879 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3880 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3881 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3882 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3883 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3884 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3885 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3886 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Cx
3887 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // Dx
3888 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3889 3, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3890};
3891
3896static const uint8_t pm_encoding_windows_1257_table[256] = {
3897// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3898 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3899 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3900 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3901 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3902 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3903 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3904 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3905 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3906 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3907 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3908 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 7, 0, 0, 0, 0, 7, // Ax
3909 0, 0, 0, 0, 0, 3, 0, 0, 3, 0, 3, 0, 0, 0, 0, 3, // Bx
3910 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // Cx
3911 7, 7, 7, 7, 7, 7, 7, 0, 7, 7, 7, 7, 7, 7, 7, 3, // Dx
3912 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // Ex
3913 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 0, // Fx
3914};
3915
3920static const uint8_t pm_encoding_windows_1258_table[256] = {
3921// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3922 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3923 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3924 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3925 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3926 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3927 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3928 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3929 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3930 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3931 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3932 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3933 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3934 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3935 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3936 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3937 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3938};
3939
3944static const uint8_t pm_encoding_windows_874_table[256] = {
3945// 0 1 2 3 4 5 6 7 8 9 A B C D E F
3946 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 0x
3947 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 1x
3948 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 2x
3949 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, // 3x
3950 0, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, // 4x
3951 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 0, 0, 0, 0, 0, // 5x
3952 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, // 6x
3953 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 0, 0, 0, // 7x
3954 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 8x
3955 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // 9x
3956 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ax
3957 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Bx
3958 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Cx
3959 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Dx
3960 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Ex
3961 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // Fx
3962};
3963
3964#define PRISM_ENCODING_TABLE(name) \
3965 static size_t pm_encoding_ ##name ## _alpha_char(const uint8_t *b, ptrdiff_t n) { \
3966 return ((n > 0) && (pm_encoding_ ##name ## _table[*b] & PRISM_ENCODING_ALPHABETIC_BIT)); \
3967 } \
3968 static size_t pm_encoding_ ##name ## _alnum_char(const uint8_t *b, ptrdiff_t n) { \
3969 return ((n > 0) && (pm_encoding_ ##name ## _table[*b] & PRISM_ENCODING_ALPHANUMERIC_BIT)) ? 1 : 0; \
3970 } \
3971 static bool pm_encoding_ ##name ## _isupper_char(const uint8_t *b, ptrdiff_t n) { \
3972 return ((n > 0) && (pm_encoding_ ##name ## _table[*b] & PRISM_ENCODING_UPPERCASE_BIT)); \
3973 }
3974
3975PRISM_ENCODING_TABLE(cp850)
3976PRISM_ENCODING_TABLE(cp852)
3977PRISM_ENCODING_TABLE(cp855)
3978PRISM_ENCODING_TABLE(gb1988)
3979PRISM_ENCODING_TABLE(ibm437)
3980PRISM_ENCODING_TABLE(ibm720)
3981PRISM_ENCODING_TABLE(ibm737)
3982PRISM_ENCODING_TABLE(ibm775)
3983PRISM_ENCODING_TABLE(ibm852)
3984PRISM_ENCODING_TABLE(ibm855)
3985PRISM_ENCODING_TABLE(ibm857)
3986PRISM_ENCODING_TABLE(ibm860)
3987PRISM_ENCODING_TABLE(ibm861)
3988PRISM_ENCODING_TABLE(ibm862)
3989PRISM_ENCODING_TABLE(ibm863)
3990PRISM_ENCODING_TABLE(ibm864)
3991PRISM_ENCODING_TABLE(ibm865)
3992PRISM_ENCODING_TABLE(ibm866)
3993PRISM_ENCODING_TABLE(ibm869)
3994PRISM_ENCODING_TABLE(iso_8859_1)
3995PRISM_ENCODING_TABLE(iso_8859_2)
3996PRISM_ENCODING_TABLE(iso_8859_3)
3997PRISM_ENCODING_TABLE(iso_8859_4)
3998PRISM_ENCODING_TABLE(iso_8859_5)
3999PRISM_ENCODING_TABLE(iso_8859_6)
4000PRISM_ENCODING_TABLE(iso_8859_7)
4001PRISM_ENCODING_TABLE(iso_8859_8)
4002PRISM_ENCODING_TABLE(iso_8859_9)
4003PRISM_ENCODING_TABLE(iso_8859_10)
4004PRISM_ENCODING_TABLE(iso_8859_11)
4005PRISM_ENCODING_TABLE(iso_8859_13)
4006PRISM_ENCODING_TABLE(iso_8859_14)
4007PRISM_ENCODING_TABLE(iso_8859_15)
4008PRISM_ENCODING_TABLE(iso_8859_16)
4009PRISM_ENCODING_TABLE(koi8_r)
4010PRISM_ENCODING_TABLE(koi8_u)
4011PRISM_ENCODING_TABLE(mac_cent_euro)
4012PRISM_ENCODING_TABLE(mac_croatian)
4013PRISM_ENCODING_TABLE(mac_cyrillic)
4014PRISM_ENCODING_TABLE(mac_greek)
4015PRISM_ENCODING_TABLE(mac_iceland)
4016PRISM_ENCODING_TABLE(mac_roman)
4017PRISM_ENCODING_TABLE(mac_romania)
4018PRISM_ENCODING_TABLE(mac_thai)
4019PRISM_ENCODING_TABLE(mac_turkish)
4020PRISM_ENCODING_TABLE(mac_ukraine)
4021PRISM_ENCODING_TABLE(tis_620)
4022PRISM_ENCODING_TABLE(windows_1250)
4023PRISM_ENCODING_TABLE(windows_1251)
4024PRISM_ENCODING_TABLE(windows_1252)
4025PRISM_ENCODING_TABLE(windows_1253)
4026PRISM_ENCODING_TABLE(windows_1254)
4027PRISM_ENCODING_TABLE(windows_1255)
4028PRISM_ENCODING_TABLE(windows_1256)
4029PRISM_ENCODING_TABLE(windows_1257)
4030PRISM_ENCODING_TABLE(windows_1258)
4031PRISM_ENCODING_TABLE(windows_874)
4032
4033#undef PRISM_ENCODING_TABLE
4034#endif
4035
4040static size_t
4041pm_encoding_ascii_char_width(const uint8_t *b, ptrdiff_t n) {
4042 return ((n > 0) && (*b < 0x80)) ? 1 : 0;
4043}
4044
4049static size_t
4050pm_encoding_ascii_alpha_char(const uint8_t *b, ptrdiff_t n) {
4051 return (n > 0) ? (pm_encoding_ascii_table[*b] & PRISM_ENCODING_ALPHABETIC_BIT) : 0;
4052}
4053
4059static size_t
4060pm_encoding_ascii_alpha_char_7bit(const uint8_t *b, ptrdiff_t n) {
4061 return ((n > 0) && (*b < 0x80)) ? pm_encoding_ascii_alpha_char(b, n) : 0;
4062}
4063
4068static size_t
4069pm_encoding_ascii_alnum_char(const uint8_t *b, ptrdiff_t n) {
4070 return ((n > 0) && (pm_encoding_ascii_table[*b] & PRISM_ENCODING_ALPHANUMERIC_BIT)) ? 1 : 0;
4071}
4072
4078static size_t
4079pm_encoding_ascii_alnum_char_7bit(const uint8_t *b, ptrdiff_t n) {
4080 return ((n > 0) && (*b < 0x80)) ? pm_encoding_ascii_alnum_char(b, n) : 0;
4081}
4082
4087static bool
4088pm_encoding_ascii_isupper_char(const uint8_t *b, ptrdiff_t n) {
4089 return (n > 0) && (pm_encoding_ascii_table[*b] & PRISM_ENCODING_UPPERCASE_BIT);
4090}
4091
4096static size_t
4097pm_encoding_single_char_width(PRISM_UNUSED const uint8_t *b, PRISM_UNUSED ptrdiff_t n) {
4098 return 1;
4099}
4100
4105static size_t
4106pm_encoding_euc_jp_char_width(const uint8_t *b, ptrdiff_t n) {
4107 // These are the single byte characters.
4108 if ((n > 0) && (*b < 0x80)) {
4109 return 1;
4110 }
4111
4112 // These are the double byte characters.
4113 if ((n > 1) && ((b[0] == 0x8E) || (b[0] >= 0xA1 && b[0] <= 0xFE)) && (b[1] >= 0xA1 && b[1] <= 0xFE)) {
4114 return 2;
4115 }
4116
4117 // These are the triple byte characters.
4118 if ((n > 2) && (b[0] == 0x8F) && (b[1] >= 0xA1 && b[2] <= 0xFE) && (b[2] >= 0xA1 && b[2] <= 0xFE)) {
4119 return 3;
4120 }
4121
4122 return 0;
4123}
4124
4129static bool
4130pm_encoding_euc_jp_isupper_char(const uint8_t *b, ptrdiff_t n) {
4131 size_t width = pm_encoding_euc_jp_char_width(b, n);
4132
4133 if (width == 1) {
4134 return pm_encoding_ascii_isupper_char(b, n);
4135 } else if (width == 2) {
4136 return (
4137 (b[0] == 0xA3 && b[1] >= 0xC1 && b[1] <= 0xDA) ||
4138 (b[0] == 0xA6 && b[1] >= 0xA1 && b[1] <= 0xB8) ||
4139 (b[0] == 0xA7 && b[1] >= 0xA1 && b[1] <= 0xC1)
4140 );
4141 } else {
4142 return false;
4143 }
4144}
4145
4150static size_t
4151pm_encoding_shift_jis_char_width(const uint8_t *b, ptrdiff_t n) {
4152 if (n == 0) {
4153 return 0;
4154 }
4155 // These are the single byte characters.
4156 if (b[0] < 0x80 || (b[0] >= 0xA1 && b[0] <= 0xDF)) {
4157 return 1;
4158 }
4159
4160 // These are the double byte characters.
4161 if ((n > 1) && ((b[0] >= 0x81 && b[0] <= 0x9F) || (b[0] >= 0xE0 && b[0] <= 0xFC)) && (b[1] >= 0x40 && b[1] <= 0xFC && b[1] != 0x7F)) {
4162 return 2;
4163 }
4164
4165 return 0;
4166}
4167
4172static size_t
4173pm_encoding_shift_jis_alnum_char(const uint8_t *b, ptrdiff_t n) {
4174 size_t width = pm_encoding_shift_jis_char_width(b, n);
4175 return width == 1 ? ((b[0] >= 0x80) || pm_encoding_ascii_alnum_char(b, n)) : width;
4176}
4177
4182static size_t
4183pm_encoding_shift_jis_alpha_char(const uint8_t *b, ptrdiff_t n) {
4184 size_t width = pm_encoding_shift_jis_char_width(b, n);
4185 return width == 1 ? ((b[0] >= 0x80) || pm_encoding_ascii_alpha_char(b, n)) : width;
4186}
4187
4192static bool
4193pm_encoding_shift_jis_isupper_char(const uint8_t *b, ptrdiff_t n) {
4194 size_t width = pm_encoding_shift_jis_char_width(b, n);
4195
4196 if (width == 1) {
4197 return pm_encoding_ascii_isupper_char(b, n);
4198 } else if (width == 2) {
4199 return (
4200 ((b[0] == 0x82) && (b[1] >= 0x60 && b[1] <= 0x79)) ||
4201 ((b[0] == 0x83) && (b[1] >= 0x9F && b[1] <= 0xB6)) ||
4202 ((b[0] == 0x84) && (b[1] >= 0x40 && b[1] <= 0x60))
4203 );
4204 } else {
4205 return width;
4206 }
4207}
4208
4209#ifndef PRISM_ENCODING_EXCLUDE_FULL
4210
4216static bool
4217pm_encoding_ascii_isupper_char_7bit(const uint8_t *b, ptrdiff_t n) {
4218 return (n > 0) && (*b < 0x80) && pm_encoding_ascii_isupper_char(b, n);
4219}
4220
4225static size_t
4226pm_encoding_big5_char_width(const uint8_t *b, ptrdiff_t n) {
4227 // These are the single byte characters.
4228 if ((n > 0) && (*b < 0x80)) {
4229 return 1;
4230 }
4231
4232 // These are the double byte characters.
4233 if ((n > 1) && (b[0] >= 0xA1 && b[0] <= 0xFE) && ((b[1] >= 0x40 && b[1] <= 0x7E) || (b[1] >= 0xA1 && b[1] <= 0xFE))) {
4234 return 2;
4235 }
4236
4237 return 0;
4238}
4239
4244static size_t
4245pm_encoding_cp949_char_width(const uint8_t *b, ptrdiff_t n) {
4246 // These are the single byte characters
4247 if ((n > 0) && (*b <= 0x80)) {
4248 return 1;
4249 }
4250
4251 // These are the double byte characters
4252 if ((n > 1) && (b[0] >= 0x81 && b[0] <= 0xFE) && ((b[1] >= 0x41 && b[1] <= 0x5A) || (b[1] >= 0x61 && b[1] <= 0x7A) || (b[1] >= 0x81 && b[1] <= 0xFE))) {
4253 return 2;
4254 }
4255
4256 return 0;
4257}
4258
4263static size_t
4264pm_encoding_emacs_mule_char_width(const uint8_t *b, ptrdiff_t n) {
4265 // These are the 1 byte characters.
4266 if ((n > 0) && (*b < 0x80)) {
4267 return 1;
4268 }
4269
4270 // These are the 2 byte characters.
4271 if ((n > 1) && (b[0] >= 0x81 && b[0] <= 0x8F) && (b[1] >= 0xA0)) {
4272 return 2;
4273 }
4274
4275 // These are the 3 byte characters.
4276 if (
4277 (n > 2) &&
4278 (
4279 ((b[0] >= 0x90 && b[0] <= 0x99) && (b[1] >= 0xA0)) ||
4280 ((b[0] == 0x9A || b[0] == 0x9B) && (b[1] >= 0xE0 && b[1] <= 0xEF))
4281 ) &&
4282 (b[2] >= 0xA0)
4283 ) {
4284 return 3;
4285 }
4286
4287 // These are the 4 byte characters.
4288 if (
4289 (n > 3) &&
4290 (
4291 ((b[0] == 0x9C) && (b[1] >= 0xF0) && (b[1] <= 0xF4)) ||
4292 ((b[0] == 0x9D) && (b[1] >= 0xF5) && (b[1] <= 0xFE))
4293 ) &&
4294 (b[2] >= 0xA0) && (b[3] >= 0xA0)
4295 ) {
4296 return 4;
4297 }
4298
4299 return 0;
4300}
4301
4306static size_t
4307pm_encoding_euc_kr_char_width(const uint8_t *b, ptrdiff_t n) {
4308 // These are the single byte characters.
4309 if ((n > 0) && (*b < 0x80)) {
4310 return 1;
4311 }
4312
4313 // These are the double byte characters.
4314 if ((n > 1) && (b[0] >= 0xA1 && b[0] <= 0xFE) && (b[1] >= 0xA1 && b[1] <= 0xFE)) {
4315 return 2;
4316 }
4317
4318 return 0;
4319}
4320
4325static size_t
4326pm_encoding_euc_tw_char_width(const uint8_t *b, ptrdiff_t n) {
4327 // These are the single byte characters.
4328 if ((n > 0) && (*b < 0x80)) {
4329 return 1;
4330 }
4331
4332 // These are the double byte characters.
4333 if ((n > 1) && (b[0] >= 0xA1) && (b[0] <= 0xFE) && (b[1] >= 0xA1) && (b[1] <= 0xFE)) {
4334 return 2;
4335 }
4336
4337 // These are the quadruple byte characters.
4338 if ((n > 3) && (b[0] == 0x8E) && (b[1] >= 0xA1) && (b[1] <= 0xB0) && (b[2] >= 0xA1) && (b[2] <= 0xFE) && (b[3] >= 0xA1) && (b[3] <= 0xFE)) {
4339 return 4;
4340 }
4341
4342 return 0;
4343}
4344
4349static size_t
4350pm_encoding_gb18030_char_width(const uint8_t *b, ptrdiff_t n) {
4351 // These are the 1 byte characters.
4352 if ((n > 0) && (*b < 0x80)) {
4353 return 1;
4354 }
4355
4356 // These are the 2 byte characters.
4357 if ((n > 1) && (b[0] >= 0x81 && b[0] <= 0xFE) && (b[1] >= 0x40 && b[1] <= 0xFE && b[1] != 0x7F)) {
4358 return 2;
4359 }
4360
4361 // These are the 4 byte characters.
4362 if ((n > 3) && ((b[0] >= 0x81 && b[0] <= 0xFE) && (b[1] >= 0x30 && b[1] <= 0x39) && (b[2] >= 0x81 && b[2] <= 0xFE) && (b[3] >= 0x30 && b[3] <= 0x39))) {
4363 return 4;
4364 }
4365
4366 return 0;
4367}
4368
4373static size_t
4374pm_encoding_gbk_char_width(const uint8_t *b, ptrdiff_t n) {
4375 // These are the single byte characters.
4376 if ((n > 0) && (*b <= 0x80)) {
4377 return 1;
4378 }
4379
4380 // These are the double byte characters.
4381 if (
4382 (n > 1) &&
4383 (
4384 ((b[0] >= 0xA1 && b[0] <= 0xA9) && (b[1] >= 0xA1 && b[1] <= 0xFE)) || // GBK/1
4385 ((b[0] >= 0xB0 && b[0] <= 0xF7) && (b[1] >= 0xA1 && b[1] <= 0xFE)) || // GBK/2
4386 ((b[0] >= 0x81 && b[0] <= 0xA0) && (b[1] >= 0x40 && b[1] <= 0xFE) && (b[1] != 0x7F)) || // GBK/3
4387 ((b[0] >= 0xAA && b[0] <= 0xFE) && (b[1] >= 0x40 && b[1] <= 0xA0) && (b[1] != 0x7F)) || // GBK/4
4388 ((b[0] >= 0xA8 && b[0] <= 0xA9) && (b[1] >= 0x40 && b[1] <= 0xA0) && (b[1] != 0x7F)) || // GBK/5
4389 ((b[0] >= 0xAA && b[0] <= 0xAF) && (b[1] >= 0xA1 && b[1] <= 0xFE)) || // user-defined 1
4390 ((b[0] >= 0xF8 && b[0] <= 0xFE) && (b[1] >= 0xA1 && b[1] <= 0xFE)) || // user-defined 2
4391 ((b[0] >= 0xA1 && b[0] <= 0xA7) && (b[1] >= 0x40 && b[1] <= 0xA0) && (b[1] != 0x7F)) // user-defined 3
4392 )
4393 ) {
4394 return 2;
4395 }
4396
4397 return 0;
4398}
4399
4400#endif
4401
4405const pm_encoding_t pm_encodings[] = {
4406 [PM_ENCODING_UTF_8] = {
4407 .name = "UTF-8",
4408 .char_width = pm_encoding_utf_8_char_width,
4409 .alnum_char = pm_encoding_utf_8_alnum_char,
4410 .alpha_char = pm_encoding_utf_8_alpha_char,
4411 .isupper_char = pm_encoding_utf_8_isupper_char,
4412 .multibyte = true
4413 },
4414 [PM_ENCODING_US_ASCII] = {
4415 .name = "US-ASCII",
4416 .char_width = pm_encoding_ascii_char_width,
4417 .alnum_char = pm_encoding_ascii_alnum_char,
4418 .alpha_char = pm_encoding_ascii_alpha_char,
4419 .isupper_char = pm_encoding_ascii_isupper_char,
4420 .multibyte = false
4421 },
4422 [PM_ENCODING_ASCII_8BIT] = {
4423 .name = "ASCII-8BIT",
4424 .char_width = pm_encoding_single_char_width,
4425 .alnum_char = pm_encoding_ascii_alnum_char,
4426 .alpha_char = pm_encoding_ascii_alpha_char,
4427 .isupper_char = pm_encoding_ascii_isupper_char,
4428 .multibyte = false
4429 },
4430 [PM_ENCODING_EUC_JP] = {
4431 .name = "EUC-JP",
4432 .char_width = pm_encoding_euc_jp_char_width,
4433 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4434 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4435 .isupper_char = pm_encoding_euc_jp_isupper_char,
4436 .multibyte = true
4437 },
4438 [PM_ENCODING_WINDOWS_31J] = {
4439 .name = "Windows-31J",
4440 .char_width = pm_encoding_shift_jis_char_width,
4441 .alnum_char = pm_encoding_shift_jis_alnum_char,
4442 .alpha_char = pm_encoding_shift_jis_alpha_char,
4443 .isupper_char = pm_encoding_shift_jis_isupper_char,
4444 .multibyte = true
4445 },
4446
4447#ifndef PRISM_ENCODING_EXCLUDE_FULL
4448 [PM_ENCODING_BIG5] = {
4449 .name = "Big5",
4450 .char_width = pm_encoding_big5_char_width,
4451 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4452 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4453 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4454 .multibyte = true
4455 },
4456 [PM_ENCODING_BIG5_HKSCS] = {
4457 .name = "Big5-HKSCS",
4458 .char_width = pm_encoding_big5_char_width,
4459 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4460 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4461 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4462 .multibyte = true
4463 },
4464 [PM_ENCODING_BIG5_UAO] = {
4465 .name = "Big5-UAO",
4466 .char_width = pm_encoding_big5_char_width,
4467 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4468 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4469 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4470 .multibyte = true
4471 },
4472 [PM_ENCODING_CESU_8] = {
4473 .name = "CESU-8",
4474 .char_width = pm_encoding_cesu_8_char_width,
4475 .alnum_char = pm_encoding_cesu_8_alnum_char,
4476 .alpha_char = pm_encoding_cesu_8_alpha_char,
4477 .isupper_char = pm_encoding_cesu_8_isupper_char,
4478 .multibyte = true
4479 },
4480 [PM_ENCODING_CP51932] = {
4481 .name = "CP51932",
4482 .char_width = pm_encoding_euc_jp_char_width,
4483 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4484 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4485 .isupper_char = pm_encoding_euc_jp_isupper_char,
4486 .multibyte = true
4487 },
4488 [PM_ENCODING_CP850] = {
4489 .name = "CP850",
4490 .char_width = pm_encoding_single_char_width,
4491 .alnum_char = pm_encoding_cp850_alnum_char,
4492 .alpha_char = pm_encoding_cp850_alpha_char,
4493 .isupper_char = pm_encoding_cp850_isupper_char,
4494 .multibyte = false
4495 },
4496 [PM_ENCODING_CP852] = {
4497 .name = "CP852",
4498 .char_width = pm_encoding_single_char_width,
4499 .alnum_char = pm_encoding_cp852_alnum_char,
4500 .alpha_char = pm_encoding_cp852_alpha_char,
4501 .isupper_char = pm_encoding_cp852_isupper_char,
4502 .multibyte = false
4503 },
4504 [PM_ENCODING_CP855] = {
4505 .name = "CP855",
4506 .char_width = pm_encoding_single_char_width,
4507 .alnum_char = pm_encoding_cp855_alnum_char,
4508 .alpha_char = pm_encoding_cp855_alpha_char,
4509 .isupper_char = pm_encoding_cp855_isupper_char,
4510 .multibyte = false
4511 },
4512 [PM_ENCODING_CP949] = {
4513 .name = "CP949",
4514 .char_width = pm_encoding_cp949_char_width,
4515 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4516 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4517 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4518 .multibyte = true
4519 },
4520 [PM_ENCODING_CP950] = {
4521 .name = "CP950",
4522 .char_width = pm_encoding_big5_char_width,
4523 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4524 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4525 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4526 .multibyte = true
4527 },
4528 [PM_ENCODING_CP951] = {
4529 .name = "CP951",
4530 .char_width = pm_encoding_big5_char_width,
4531 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4532 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4533 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4534 .multibyte = true
4535 },
4536 [PM_ENCODING_EMACS_MULE] = {
4537 .name = "Emacs-Mule",
4538 .char_width = pm_encoding_emacs_mule_char_width,
4539 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4540 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4541 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4542 .multibyte = true
4543 },
4544 [PM_ENCODING_EUC_JP_MS] = {
4545 .name = "eucJP-ms",
4546 .char_width = pm_encoding_euc_jp_char_width,
4547 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4548 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4549 .isupper_char = pm_encoding_euc_jp_isupper_char,
4550 .multibyte = true
4551 },
4552 [PM_ENCODING_EUC_JIS_2004] = {
4553 .name = "EUC-JIS-2004",
4554 .char_width = pm_encoding_euc_jp_char_width,
4555 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4556 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4557 .isupper_char = pm_encoding_euc_jp_isupper_char,
4558 .multibyte = true
4559 },
4560 [PM_ENCODING_EUC_KR] = {
4561 .name = "EUC-KR",
4562 .char_width = pm_encoding_euc_kr_char_width,
4563 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4564 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4565 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4566 .multibyte = true
4567 },
4568 [PM_ENCODING_EUC_TW] = {
4569 .name = "EUC-TW",
4570 .char_width = pm_encoding_euc_tw_char_width,
4571 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4572 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4573 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4574 .multibyte = true
4575 },
4576 [PM_ENCODING_GB12345] = {
4577 .name = "GB12345",
4578 .char_width = pm_encoding_euc_kr_char_width,
4579 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4580 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4581 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4582 .multibyte = true
4583 },
4584 [PM_ENCODING_GB18030] = {
4585 .name = "GB18030",
4586 .char_width = pm_encoding_gb18030_char_width,
4587 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4588 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4589 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4590 .multibyte = true
4591 },
4592 [PM_ENCODING_GB1988] = {
4593 .name = "GB1988",
4594 .char_width = pm_encoding_single_char_width,
4595 .alnum_char = pm_encoding_gb1988_alnum_char,
4596 .alpha_char = pm_encoding_gb1988_alpha_char,
4597 .isupper_char = pm_encoding_gb1988_isupper_char,
4598 .multibyte = false
4599 },
4600 [PM_ENCODING_GB2312] = {
4601 .name = "GB2312",
4602 .char_width = pm_encoding_euc_kr_char_width,
4603 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4604 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4605 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4606 .multibyte = true
4607 },
4608 [PM_ENCODING_GBK] = {
4609 .name = "GBK",
4610 .char_width = pm_encoding_gbk_char_width,
4611 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4612 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4613 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4614 .multibyte = true
4615 },
4616 [PM_ENCODING_IBM437] = {
4617 .name = "IBM437",
4618 .char_width = pm_encoding_single_char_width,
4619 .alnum_char = pm_encoding_ibm437_alnum_char,
4620 .alpha_char = pm_encoding_ibm437_alpha_char,
4621 .isupper_char = pm_encoding_ibm437_isupper_char,
4622 .multibyte = false
4623 },
4624 [PM_ENCODING_IBM720] = {
4625 .name = "IBM720",
4626 .char_width = pm_encoding_single_char_width,
4627 .alnum_char = pm_encoding_ibm720_alnum_char,
4628 .alpha_char = pm_encoding_ibm720_alpha_char,
4629 .isupper_char = pm_encoding_ibm720_isupper_char,
4630 .multibyte = false
4631 },
4632 [PM_ENCODING_IBM737] = {
4633 .name = "IBM737",
4634 .char_width = pm_encoding_single_char_width,
4635 .alnum_char = pm_encoding_ibm737_alnum_char,
4636 .alpha_char = pm_encoding_ibm737_alpha_char,
4637 .isupper_char = pm_encoding_ibm737_isupper_char,
4638 .multibyte = false
4639 },
4640 [PM_ENCODING_IBM775] = {
4641 .name = "IBM775",
4642 .char_width = pm_encoding_single_char_width,
4643 .alnum_char = pm_encoding_ibm775_alnum_char,
4644 .alpha_char = pm_encoding_ibm775_alpha_char,
4645 .isupper_char = pm_encoding_ibm775_isupper_char,
4646 .multibyte = false
4647 },
4648 [PM_ENCODING_IBM852] = {
4649 .name = "IBM852",
4650 .char_width = pm_encoding_single_char_width,
4651 .alnum_char = pm_encoding_ibm852_alnum_char,
4652 .alpha_char = pm_encoding_ibm852_alpha_char,
4653 .isupper_char = pm_encoding_ibm852_isupper_char,
4654 .multibyte = false
4655 },
4656 [PM_ENCODING_IBM855] = {
4657 .name = "IBM855",
4658 .char_width = pm_encoding_single_char_width,
4659 .alnum_char = pm_encoding_ibm855_alnum_char,
4660 .alpha_char = pm_encoding_ibm855_alpha_char,
4661 .isupper_char = pm_encoding_ibm855_isupper_char,
4662 .multibyte = false
4663 },
4664 [PM_ENCODING_IBM857] = {
4665 .name = "IBM857",
4666 .char_width = pm_encoding_single_char_width,
4667 .alnum_char = pm_encoding_ibm857_alnum_char,
4668 .alpha_char = pm_encoding_ibm857_alpha_char,
4669 .isupper_char = pm_encoding_ibm857_isupper_char,
4670 .multibyte = false
4671 },
4672 [PM_ENCODING_IBM860] = {
4673 .name = "IBM860",
4674 .char_width = pm_encoding_single_char_width,
4675 .alnum_char = pm_encoding_ibm860_alnum_char,
4676 .alpha_char = pm_encoding_ibm860_alpha_char,
4677 .isupper_char = pm_encoding_ibm860_isupper_char,
4678 .multibyte = false
4679 },
4680 [PM_ENCODING_IBM861] = {
4681 .name = "IBM861",
4682 .char_width = pm_encoding_single_char_width,
4683 .alnum_char = pm_encoding_ibm861_alnum_char,
4684 .alpha_char = pm_encoding_ibm861_alpha_char,
4685 .isupper_char = pm_encoding_ibm861_isupper_char,
4686 .multibyte = false
4687 },
4688 [PM_ENCODING_IBM862] = {
4689 .name = "IBM862",
4690 .char_width = pm_encoding_single_char_width,
4691 .alnum_char = pm_encoding_ibm862_alnum_char,
4692 .alpha_char = pm_encoding_ibm862_alpha_char,
4693 .isupper_char = pm_encoding_ibm862_isupper_char,
4694 .multibyte = false
4695 },
4696 [PM_ENCODING_IBM863] = {
4697 .name = "IBM863",
4698 .char_width = pm_encoding_single_char_width,
4699 .alnum_char = pm_encoding_ibm863_alnum_char,
4700 .alpha_char = pm_encoding_ibm863_alpha_char,
4701 .isupper_char = pm_encoding_ibm863_isupper_char,
4702 .multibyte = false
4703 },
4704 [PM_ENCODING_IBM864] = {
4705 .name = "IBM864",
4706 .char_width = pm_encoding_single_char_width,
4707 .alnum_char = pm_encoding_ibm864_alnum_char,
4708 .alpha_char = pm_encoding_ibm864_alpha_char,
4709 .isupper_char = pm_encoding_ibm864_isupper_char,
4710 .multibyte = false
4711 },
4712 [PM_ENCODING_IBM865] = {
4713 .name = "IBM865",
4714 .char_width = pm_encoding_single_char_width,
4715 .alnum_char = pm_encoding_ibm865_alnum_char,
4716 .alpha_char = pm_encoding_ibm865_alpha_char,
4717 .isupper_char = pm_encoding_ibm865_isupper_char,
4718 .multibyte = false
4719 },
4720 [PM_ENCODING_IBM866] = {
4721 .name = "IBM866",
4722 .char_width = pm_encoding_single_char_width,
4723 .alnum_char = pm_encoding_ibm866_alnum_char,
4724 .alpha_char = pm_encoding_ibm866_alpha_char,
4725 .isupper_char = pm_encoding_ibm866_isupper_char,
4726 .multibyte = false
4727 },
4728 [PM_ENCODING_IBM869] = {
4729 .name = "IBM869",
4730 .char_width = pm_encoding_single_char_width,
4731 .alnum_char = pm_encoding_ibm869_alnum_char,
4732 .alpha_char = pm_encoding_ibm869_alpha_char,
4733 .isupper_char = pm_encoding_ibm869_isupper_char,
4734 .multibyte = false
4735 },
4736 [PM_ENCODING_ISO_8859_1] = {
4737 .name = "ISO-8859-1",
4738 .char_width = pm_encoding_single_char_width,
4739 .alnum_char = pm_encoding_iso_8859_1_alnum_char,
4740 .alpha_char = pm_encoding_iso_8859_1_alpha_char,
4741 .isupper_char = pm_encoding_iso_8859_1_isupper_char,
4742 .multibyte = false
4743 },
4744 [PM_ENCODING_ISO_8859_2] = {
4745 .name = "ISO-8859-2",
4746 .char_width = pm_encoding_single_char_width,
4747 .alnum_char = pm_encoding_iso_8859_2_alnum_char,
4748 .alpha_char = pm_encoding_iso_8859_2_alpha_char,
4749 .isupper_char = pm_encoding_iso_8859_2_isupper_char,
4750 .multibyte = false
4751 },
4752 [PM_ENCODING_ISO_8859_3] = {
4753 .name = "ISO-8859-3",
4754 .char_width = pm_encoding_single_char_width,
4755 .alnum_char = pm_encoding_iso_8859_3_alnum_char,
4756 .alpha_char = pm_encoding_iso_8859_3_alpha_char,
4757 .isupper_char = pm_encoding_iso_8859_3_isupper_char,
4758 .multibyte = false
4759 },
4760 [PM_ENCODING_ISO_8859_4] = {
4761 .name = "ISO-8859-4",
4762 .char_width = pm_encoding_single_char_width,
4763 .alnum_char = pm_encoding_iso_8859_4_alnum_char,
4764 .alpha_char = pm_encoding_iso_8859_4_alpha_char,
4765 .isupper_char = pm_encoding_iso_8859_4_isupper_char,
4766 .multibyte = false
4767 },
4768 [PM_ENCODING_ISO_8859_5] = {
4769 .name = "ISO-8859-5",
4770 .char_width = pm_encoding_single_char_width,
4771 .alnum_char = pm_encoding_iso_8859_5_alnum_char,
4772 .alpha_char = pm_encoding_iso_8859_5_alpha_char,
4773 .isupper_char = pm_encoding_iso_8859_5_isupper_char,
4774 .multibyte = false
4775 },
4776 [PM_ENCODING_ISO_8859_6] = {
4777 .name = "ISO-8859-6",
4778 .char_width = pm_encoding_single_char_width,
4779 .alnum_char = pm_encoding_iso_8859_6_alnum_char,
4780 .alpha_char = pm_encoding_iso_8859_6_alpha_char,
4781 .isupper_char = pm_encoding_iso_8859_6_isupper_char,
4782 .multibyte = false
4783 },
4784 [PM_ENCODING_ISO_8859_7] = {
4785 .name = "ISO-8859-7",
4786 .char_width = pm_encoding_single_char_width,
4787 .alnum_char = pm_encoding_iso_8859_7_alnum_char,
4788 .alpha_char = pm_encoding_iso_8859_7_alpha_char,
4789 .isupper_char = pm_encoding_iso_8859_7_isupper_char,
4790 .multibyte = false
4791 },
4792 [PM_ENCODING_ISO_8859_8] = {
4793 .name = "ISO-8859-8",
4794 .char_width = pm_encoding_single_char_width,
4795 .alnum_char = pm_encoding_iso_8859_8_alnum_char,
4796 .alpha_char = pm_encoding_iso_8859_8_alpha_char,
4797 .isupper_char = pm_encoding_iso_8859_8_isupper_char,
4798 .multibyte = false
4799 },
4800 [PM_ENCODING_ISO_8859_9] = {
4801 .name = "ISO-8859-9",
4802 .char_width = pm_encoding_single_char_width,
4803 .alnum_char = pm_encoding_iso_8859_9_alnum_char,
4804 .alpha_char = pm_encoding_iso_8859_9_alpha_char,
4805 .isupper_char = pm_encoding_iso_8859_9_isupper_char,
4806 .multibyte = false
4807 },
4808 [PM_ENCODING_ISO_8859_10] = {
4809 .name = "ISO-8859-10",
4810 .char_width = pm_encoding_single_char_width,
4811 .alnum_char = pm_encoding_iso_8859_10_alnum_char,
4812 .alpha_char = pm_encoding_iso_8859_10_alpha_char,
4813 .isupper_char = pm_encoding_iso_8859_10_isupper_char,
4814 .multibyte = false
4815 },
4816 [PM_ENCODING_ISO_8859_11] = {
4817 .name = "ISO-8859-11",
4818 .char_width = pm_encoding_single_char_width,
4819 .alnum_char = pm_encoding_iso_8859_11_alnum_char,
4820 .alpha_char = pm_encoding_iso_8859_11_alpha_char,
4821 .isupper_char = pm_encoding_iso_8859_11_isupper_char,
4822 .multibyte = false
4823 },
4824 [PM_ENCODING_ISO_8859_13] = {
4825 .name = "ISO-8859-13",
4826 .char_width = pm_encoding_single_char_width,
4827 .alnum_char = pm_encoding_iso_8859_13_alnum_char,
4828 .alpha_char = pm_encoding_iso_8859_13_alpha_char,
4829 .isupper_char = pm_encoding_iso_8859_13_isupper_char,
4830 .multibyte = false
4831 },
4832 [PM_ENCODING_ISO_8859_14] = {
4833 .name = "ISO-8859-14",
4834 .char_width = pm_encoding_single_char_width,
4835 .alnum_char = pm_encoding_iso_8859_14_alnum_char,
4836 .alpha_char = pm_encoding_iso_8859_14_alpha_char,
4837 .isupper_char = pm_encoding_iso_8859_14_isupper_char,
4838 .multibyte = false
4839 },
4840 [PM_ENCODING_ISO_8859_15] = {
4841 .name = "ISO-8859-15",
4842 .char_width = pm_encoding_single_char_width,
4843 .alnum_char = pm_encoding_iso_8859_15_alnum_char,
4844 .alpha_char = pm_encoding_iso_8859_15_alpha_char,
4845 .isupper_char = pm_encoding_iso_8859_15_isupper_char,
4846 .multibyte = false
4847 },
4848 [PM_ENCODING_ISO_8859_16] = {
4849 .name = "ISO-8859-16",
4850 .char_width = pm_encoding_single_char_width,
4851 .alnum_char = pm_encoding_iso_8859_16_alnum_char,
4852 .alpha_char = pm_encoding_iso_8859_16_alpha_char,
4853 .isupper_char = pm_encoding_iso_8859_16_isupper_char,
4854 .multibyte = false
4855 },
4856 [PM_ENCODING_KOI8_R] = {
4857 .name = "KOI8-R",
4858 .char_width = pm_encoding_single_char_width,
4859 .alnum_char = pm_encoding_koi8_r_alnum_char,
4860 .alpha_char = pm_encoding_koi8_r_alpha_char,
4861 .isupper_char = pm_encoding_koi8_r_isupper_char,
4862 .multibyte = false
4863 },
4864 [PM_ENCODING_KOI8_U] = {
4865 .name = "KOI8-U",
4866 .char_width = pm_encoding_single_char_width,
4867 .alnum_char = pm_encoding_koi8_u_alnum_char,
4868 .alpha_char = pm_encoding_koi8_u_alpha_char,
4869 .isupper_char = pm_encoding_koi8_u_isupper_char,
4870 .multibyte = false
4871 },
4872 [PM_ENCODING_MAC_CENT_EURO] = {
4873 .name = "macCentEuro",
4874 .char_width = pm_encoding_single_char_width,
4875 .alnum_char = pm_encoding_mac_cent_euro_alnum_char,
4876 .alpha_char = pm_encoding_mac_cent_euro_alpha_char,
4877 .isupper_char = pm_encoding_mac_cent_euro_isupper_char,
4878 .multibyte = false
4879 },
4880 [PM_ENCODING_MAC_CROATIAN] = {
4881 .name = "macCroatian",
4882 .char_width = pm_encoding_single_char_width,
4883 .alnum_char = pm_encoding_mac_croatian_alnum_char,
4884 .alpha_char = pm_encoding_mac_croatian_alpha_char,
4885 .isupper_char = pm_encoding_mac_croatian_isupper_char,
4886 .multibyte = false
4887 },
4888 [PM_ENCODING_MAC_CYRILLIC] = {
4889 .name = "macCyrillic",
4890 .char_width = pm_encoding_single_char_width,
4891 .alnum_char = pm_encoding_mac_cyrillic_alnum_char,
4892 .alpha_char = pm_encoding_mac_cyrillic_alpha_char,
4893 .isupper_char = pm_encoding_mac_cyrillic_isupper_char,
4894 .multibyte = false
4895 },
4896 [PM_ENCODING_MAC_GREEK] = {
4897 .name = "macGreek",
4898 .char_width = pm_encoding_single_char_width,
4899 .alnum_char = pm_encoding_mac_greek_alnum_char,
4900 .alpha_char = pm_encoding_mac_greek_alpha_char,
4901 .isupper_char = pm_encoding_mac_greek_isupper_char,
4902 .multibyte = false
4903 },
4904 [PM_ENCODING_MAC_ICELAND] = {
4905 .name = "macIceland",
4906 .char_width = pm_encoding_single_char_width,
4907 .alnum_char = pm_encoding_mac_iceland_alnum_char,
4908 .alpha_char = pm_encoding_mac_iceland_alpha_char,
4909 .isupper_char = pm_encoding_mac_iceland_isupper_char,
4910 .multibyte = false
4911 },
4912 [PM_ENCODING_MAC_JAPANESE] = {
4913 .name = "MacJapanese",
4914 .char_width = pm_encoding_shift_jis_char_width,
4915 .alnum_char = pm_encoding_shift_jis_alnum_char,
4916 .alpha_char = pm_encoding_shift_jis_alpha_char,
4917 .isupper_char = pm_encoding_shift_jis_isupper_char,
4918 .multibyte = true
4919 },
4920 [PM_ENCODING_MAC_ROMAN] = {
4921 .name = "macRoman",
4922 .char_width = pm_encoding_single_char_width,
4923 .alnum_char = pm_encoding_mac_roman_alnum_char,
4924 .alpha_char = pm_encoding_mac_roman_alpha_char,
4925 .isupper_char = pm_encoding_mac_roman_isupper_char,
4926 .multibyte = false
4927 },
4928 [PM_ENCODING_MAC_ROMANIA] = {
4929 .name = "macRomania",
4930 .char_width = pm_encoding_single_char_width,
4931 .alnum_char = pm_encoding_mac_romania_alnum_char,
4932 .alpha_char = pm_encoding_mac_romania_alpha_char,
4933 .isupper_char = pm_encoding_mac_romania_isupper_char,
4934 .multibyte = false
4935 },
4936 [PM_ENCODING_MAC_THAI] = {
4937 .name = "macThai",
4938 .char_width = pm_encoding_single_char_width,
4939 .alnum_char = pm_encoding_mac_thai_alnum_char,
4940 .alpha_char = pm_encoding_mac_thai_alpha_char,
4941 .isupper_char = pm_encoding_mac_thai_isupper_char,
4942 .multibyte = false
4943 },
4944 [PM_ENCODING_MAC_TURKISH] = {
4945 .name = "macTurkish",
4946 .char_width = pm_encoding_single_char_width,
4947 .alnum_char = pm_encoding_mac_turkish_alnum_char,
4948 .alpha_char = pm_encoding_mac_turkish_alpha_char,
4949 .isupper_char = pm_encoding_mac_turkish_isupper_char,
4950 .multibyte = false
4951 },
4952 [PM_ENCODING_MAC_UKRAINE] = {
4953 .name = "macUkraine",
4954 .char_width = pm_encoding_single_char_width,
4955 .alnum_char = pm_encoding_mac_ukraine_alnum_char,
4956 .alpha_char = pm_encoding_mac_ukraine_alpha_char,
4957 .isupper_char = pm_encoding_mac_ukraine_isupper_char,
4958 .multibyte = false
4959 },
4960 [PM_ENCODING_SHIFT_JIS] = {
4961 .name = "Shift_JIS",
4962 .char_width = pm_encoding_shift_jis_char_width,
4963 .alnum_char = pm_encoding_shift_jis_alnum_char,
4964 .alpha_char = pm_encoding_shift_jis_alpha_char,
4965 .isupper_char = pm_encoding_shift_jis_isupper_char,
4966 .multibyte = true
4967 },
4968 [PM_ENCODING_SJIS_DOCOMO] = {
4969 .name = "SJIS-DoCoMo",
4970 .char_width = pm_encoding_shift_jis_char_width,
4971 .alnum_char = pm_encoding_shift_jis_alnum_char,
4972 .alpha_char = pm_encoding_shift_jis_alpha_char,
4973 .isupper_char = pm_encoding_shift_jis_isupper_char,
4974 .multibyte = true
4975 },
4976 [PM_ENCODING_SJIS_KDDI] = {
4977 .name = "SJIS-KDDI",
4978 .char_width = pm_encoding_shift_jis_char_width,
4979 .alnum_char = pm_encoding_shift_jis_alnum_char,
4980 .alpha_char = pm_encoding_shift_jis_alpha_char,
4981 .isupper_char = pm_encoding_shift_jis_isupper_char,
4982 .multibyte = true
4983 },
4984 [PM_ENCODING_SJIS_SOFTBANK] = {
4985 .name = "SJIS-SoftBank",
4986 .char_width = pm_encoding_shift_jis_char_width,
4987 .alnum_char = pm_encoding_shift_jis_alnum_char,
4988 .alpha_char = pm_encoding_shift_jis_alpha_char,
4989 .isupper_char = pm_encoding_shift_jis_isupper_char,
4990 .multibyte = true
4991 },
4992 [PM_ENCODING_STATELESS_ISO_2022_JP] = {
4993 .name = "stateless-ISO-2022-JP",
4994 .char_width = pm_encoding_emacs_mule_char_width,
4995 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
4996 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
4997 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
4998 .multibyte = true
4999 },
5000 [PM_ENCODING_STATELESS_ISO_2022_JP_KDDI] = {
5001 .name = "stateless-ISO-2022-JP-KDDI",
5002 .char_width = pm_encoding_emacs_mule_char_width,
5003 .alnum_char = pm_encoding_ascii_alnum_char_7bit,
5004 .alpha_char = pm_encoding_ascii_alpha_char_7bit,
5005 .isupper_char = pm_encoding_ascii_isupper_char_7bit,
5006 .multibyte = true
5007 },
5008 [PM_ENCODING_TIS_620] = {
5009 .name = "TIS-620",
5010 .char_width = pm_encoding_single_char_width,
5011 .alnum_char = pm_encoding_tis_620_alnum_char,
5012 .alpha_char = pm_encoding_tis_620_alpha_char,
5013 .isupper_char = pm_encoding_tis_620_isupper_char,
5014 .multibyte = false
5015 },
5016 [PM_ENCODING_UTF8_MAC] = {
5017 .name = "UTF8-MAC",
5018 .char_width = pm_encoding_utf_8_char_width,
5019 .alnum_char = pm_encoding_utf_8_alnum_char,
5020 .alpha_char = pm_encoding_utf_8_alpha_char,
5021 .isupper_char = pm_encoding_utf_8_isupper_char,
5022 .multibyte = true
5023 },
5024 [PM_ENCODING_UTF8_DOCOMO] = {
5025 .name = "UTF8-DoCoMo",
5026 .char_width = pm_encoding_utf_8_char_width,
5027 .alnum_char = pm_encoding_utf_8_alnum_char,
5028 .alpha_char = pm_encoding_utf_8_alpha_char,
5029 .isupper_char = pm_encoding_utf_8_isupper_char,
5030 .multibyte = true
5031 },
5032 [PM_ENCODING_UTF8_KDDI] = {
5033 .name = "UTF8-KDDI",
5034 .char_width = pm_encoding_utf_8_char_width,
5035 .alnum_char = pm_encoding_utf_8_alnum_char,
5036 .alpha_char = pm_encoding_utf_8_alpha_char,
5037 .isupper_char = pm_encoding_utf_8_isupper_char,
5038 .multibyte = true
5039 },
5040 [PM_ENCODING_UTF8_SOFTBANK] = {
5041 .name = "UTF8-SoftBank",
5042 .char_width = pm_encoding_utf_8_char_width,
5043 .alnum_char = pm_encoding_utf_8_alnum_char,
5044 .alpha_char = pm_encoding_utf_8_alpha_char,
5045 .isupper_char = pm_encoding_utf_8_isupper_char,
5046 .multibyte = true
5047 },
5048 [PM_ENCODING_WINDOWS_1250] = {
5049 .name = "Windows-1250",
5050 .char_width = pm_encoding_single_char_width,
5051 .alnum_char = pm_encoding_windows_1250_alnum_char,
5052 .alpha_char = pm_encoding_windows_1250_alpha_char,
5053 .isupper_char = pm_encoding_windows_1250_isupper_char,
5054 .multibyte = false
5055 },
5056 [PM_ENCODING_WINDOWS_1251] = {
5057 .name = "Windows-1251",
5058 .char_width = pm_encoding_single_char_width,
5059 .alnum_char = pm_encoding_windows_1251_alnum_char,
5060 .alpha_char = pm_encoding_windows_1251_alpha_char,
5061 .isupper_char = pm_encoding_windows_1251_isupper_char,
5062 .multibyte = false
5063 },
5064 [PM_ENCODING_WINDOWS_1252] = {
5065 .name = "Windows-1252",
5066 .char_width = pm_encoding_single_char_width,
5067 .alnum_char = pm_encoding_windows_1252_alnum_char,
5068 .alpha_char = pm_encoding_windows_1252_alpha_char,
5069 .isupper_char = pm_encoding_windows_1252_isupper_char,
5070 .multibyte = false
5071 },
5072 [PM_ENCODING_WINDOWS_1253] = {
5073 .name = "Windows-1253",
5074 .char_width = pm_encoding_single_char_width,
5075 .alnum_char = pm_encoding_windows_1253_alnum_char,
5076 .alpha_char = pm_encoding_windows_1253_alpha_char,
5077 .isupper_char = pm_encoding_windows_1253_isupper_char,
5078 .multibyte = false
5079 },
5080 [PM_ENCODING_WINDOWS_1254] = {
5081 .name = "Windows-1254",
5082 .char_width = pm_encoding_single_char_width,
5083 .alnum_char = pm_encoding_windows_1254_alnum_char,
5084 .alpha_char = pm_encoding_windows_1254_alpha_char,
5085 .isupper_char = pm_encoding_windows_1254_isupper_char,
5086 .multibyte = false
5087 },
5088 [PM_ENCODING_WINDOWS_1255] = {
5089 .name = "Windows-1255",
5090 .char_width = pm_encoding_single_char_width,
5091 .alnum_char = pm_encoding_windows_1255_alnum_char,
5092 .alpha_char = pm_encoding_windows_1255_alpha_char,
5093 .isupper_char = pm_encoding_windows_1255_isupper_char,
5094 .multibyte = false
5095 },
5096 [PM_ENCODING_WINDOWS_1256] = {
5097 .name = "Windows-1256",
5098 .char_width = pm_encoding_single_char_width,
5099 .alnum_char = pm_encoding_windows_1256_alnum_char,
5100 .alpha_char = pm_encoding_windows_1256_alpha_char,
5101 .isupper_char = pm_encoding_windows_1256_isupper_char,
5102 .multibyte = false
5103 },
5104 [PM_ENCODING_WINDOWS_1257] = {
5105 .name = "Windows-1257",
5106 .char_width = pm_encoding_single_char_width,
5107 .alnum_char = pm_encoding_windows_1257_alnum_char,
5108 .alpha_char = pm_encoding_windows_1257_alpha_char,
5109 .isupper_char = pm_encoding_windows_1257_isupper_char,
5110 .multibyte = false
5111 },
5112 [PM_ENCODING_WINDOWS_1258] = {
5113 .name = "Windows-1258",
5114 .char_width = pm_encoding_single_char_width,
5115 .alnum_char = pm_encoding_windows_1258_alnum_char,
5116 .alpha_char = pm_encoding_windows_1258_alpha_char,
5117 .isupper_char = pm_encoding_windows_1258_isupper_char,
5118 .multibyte = false
5119 },
5120 [PM_ENCODING_WINDOWS_874] = {
5121 .name = "Windows-874",
5122 .char_width = pm_encoding_single_char_width,
5123 .alnum_char = pm_encoding_windows_874_alnum_char,
5124 .alpha_char = pm_encoding_windows_874_alpha_char,
5125 .isupper_char = pm_encoding_windows_874_isupper_char,
5126 .multibyte = false
5127 }
5128#endif
5129};
5130
5135const pm_encoding_t *
5136pm_encoding_find(const uint8_t *start, const uint8_t *end) {
5137 size_t width = (size_t) (end - start);
5138
5139 // First, we're going to check for UTF-8. This is the most common encoding.
5140 // UTF-8 can contain extra information at the end about the platform it is
5141 // encoded on, such as UTF-8-MAC or UTF-8-UNIX. We'll ignore those suffixes.
5142 if ((start + 5 <= end) && (pm_strncasecmp(start, (const uint8_t *) "UTF-8", 5) == 0)) {
5143#ifndef PRISM_ENCODING_EXCLUDE_FULL
5144 // We need to explicitly handle UTF-8-HFS, as that one needs to switch
5145 // over to being UTF8-MAC.
5146 if (width == 9 && (pm_strncasecmp(start + 5, (const uint8_t *) "-HFS", 4) == 0)) {
5147 return &pm_encodings[PM_ENCODING_UTF8_MAC];
5148 }
5149#endif
5150
5151 // Otherwise we'll return the default UTF-8 encoding.
5152 return PM_ENCODING_UTF_8_ENTRY;
5153 }
5154
5155 // Next, we're going to loop through each of the encodings that we handle
5156 // explicitly. If we found one that we understand, we'll use that value.
5157#define ENCODING1(name, encoding) if (width == sizeof(name) - 1 && pm_strncasecmp(start, (const uint8_t *) name, width) == 0) return &pm_encodings[encoding];
5158#define ENCODING2(name1, name2, encoding) ENCODING1(name1, encoding) ENCODING1(name2, encoding)
5159
5160 if (width >= 3) {
5161 switch (*start) {
5162 case 'A': case 'a':
5163 ENCODING1("ASCII", PM_ENCODING_US_ASCII);
5164 ENCODING1("ASCII-8BIT", PM_ENCODING_ASCII_8BIT);
5165 ENCODING1("ANSI_X3.4-1968", PM_ENCODING_US_ASCII);
5166 break;
5167 case 'B': case 'b':
5168 ENCODING1("BINARY", PM_ENCODING_ASCII_8BIT);
5169#ifndef PRISM_ENCODING_EXCLUDE_FULL
5170 ENCODING1("Big5", PM_ENCODING_BIG5);
5171 ENCODING2("Big5-HKSCS", "Big5-HKSCS:2008", PM_ENCODING_BIG5_HKSCS);
5172 ENCODING1("Big5-UAO", PM_ENCODING_BIG5_UAO);
5173#endif
5174 break;
5175 case 'C': case 'c':
5176 ENCODING1("CP65001", PM_ENCODING_UTF_8);
5177 ENCODING2("CP932", "csWindows31J", PM_ENCODING_WINDOWS_31J);
5178#ifndef PRISM_ENCODING_EXCLUDE_FULL
5179 ENCODING1("CESU-8", PM_ENCODING_CESU_8);
5180 ENCODING1("CP437", PM_ENCODING_IBM437);
5181 ENCODING1("CP720", PM_ENCODING_IBM720);
5182 ENCODING1("CP737", PM_ENCODING_IBM737);
5183 ENCODING1("CP775", PM_ENCODING_IBM775);
5184 ENCODING1("CP850", PM_ENCODING_CP850);
5185 ENCODING1("CP852", PM_ENCODING_CP852);
5186 ENCODING1("CP855", PM_ENCODING_CP855);
5187 ENCODING1("CP857", PM_ENCODING_IBM857);
5188 ENCODING1("CP860", PM_ENCODING_IBM860);
5189 ENCODING1("CP861", PM_ENCODING_IBM861);
5190 ENCODING1("CP862", PM_ENCODING_IBM862);
5191 ENCODING1("CP864", PM_ENCODING_IBM864);
5192 ENCODING1("CP865", PM_ENCODING_IBM865);
5193 ENCODING1("CP866", PM_ENCODING_IBM866);
5194 ENCODING1("CP869", PM_ENCODING_IBM869);
5195 ENCODING1("CP874", PM_ENCODING_WINDOWS_874);
5196 ENCODING1("CP878", PM_ENCODING_KOI8_R);
5197 ENCODING1("CP863", PM_ENCODING_IBM863);
5198 ENCODING1("CP936", PM_ENCODING_GBK);
5199 ENCODING1("CP949", PM_ENCODING_CP949);
5200 ENCODING1("CP950", PM_ENCODING_CP950);
5201 ENCODING1("CP951", PM_ENCODING_CP951);
5202 ENCODING1("CP1250", PM_ENCODING_WINDOWS_1250);
5203 ENCODING1("CP1251", PM_ENCODING_WINDOWS_1251);
5204 ENCODING1("CP1252", PM_ENCODING_WINDOWS_1252);
5205 ENCODING1("CP1253", PM_ENCODING_WINDOWS_1253);
5206 ENCODING1("CP1254", PM_ENCODING_WINDOWS_1254);
5207 ENCODING1("CP1255", PM_ENCODING_WINDOWS_1255);
5208 ENCODING1("CP1256", PM_ENCODING_WINDOWS_1256);
5209 ENCODING1("CP1257", PM_ENCODING_WINDOWS_1257);
5210 ENCODING1("CP1258", PM_ENCODING_WINDOWS_1258);
5211 ENCODING1("CP51932", PM_ENCODING_CP51932);
5212#endif
5213 break;
5214 case 'E': case 'e':
5215 ENCODING2("EUC-JP", "eucJP", PM_ENCODING_EUC_JP);
5216#ifndef PRISM_ENCODING_EXCLUDE_FULL
5217 ENCODING2("eucJP-ms", "euc-jp-ms", PM_ENCODING_EUC_JP_MS);
5218 ENCODING2("EUC-JIS-2004", "EUC-JISX0213", PM_ENCODING_EUC_JIS_2004);
5219 ENCODING2("EUC-KR", "eucKR", PM_ENCODING_EUC_KR);
5220 ENCODING2("EUC-CN", "eucCN", PM_ENCODING_GB2312);
5221 ENCODING2("EUC-TW", "eucTW", PM_ENCODING_EUC_TW);
5222 ENCODING1("Emacs-Mule", PM_ENCODING_EMACS_MULE);
5223#endif
5224 break;
5225 case 'G': case 'g':
5226#ifndef PRISM_ENCODING_EXCLUDE_FULL
5227 ENCODING1("GBK", PM_ENCODING_GBK);
5228 ENCODING1("GB12345", PM_ENCODING_GB12345);
5229 ENCODING1("GB18030", PM_ENCODING_GB18030);
5230 ENCODING1("GB1988", PM_ENCODING_GB1988);
5231 ENCODING1("GB2312", PM_ENCODING_GB2312);
5232#endif
5233 break;
5234 case 'I': case 'i':
5235#ifndef PRISM_ENCODING_EXCLUDE_FULL
5236 ENCODING1("IBM437", PM_ENCODING_IBM437);
5237 ENCODING1("IBM720", PM_ENCODING_IBM720);
5238 ENCODING1("IBM737", PM_ENCODING_IBM737);
5239 ENCODING1("IBM775", PM_ENCODING_IBM775);
5240 ENCODING1("IBM850", PM_ENCODING_CP850);
5241 ENCODING1("IBM852", PM_ENCODING_IBM852);
5242 ENCODING1("IBM855", PM_ENCODING_IBM855);
5243 ENCODING1("IBM857", PM_ENCODING_IBM857);
5244 ENCODING1("IBM860", PM_ENCODING_IBM860);
5245 ENCODING1("IBM861", PM_ENCODING_IBM861);
5246 ENCODING1("IBM862", PM_ENCODING_IBM862);
5247 ENCODING1("IBM863", PM_ENCODING_IBM863);
5248 ENCODING1("IBM864", PM_ENCODING_IBM864);
5249 ENCODING1("IBM865", PM_ENCODING_IBM865);
5250 ENCODING1("IBM866", PM_ENCODING_IBM866);
5251 ENCODING1("IBM869", PM_ENCODING_IBM869);
5252 ENCODING2("ISO-8859-1", "ISO8859-1", PM_ENCODING_ISO_8859_1);
5253 ENCODING2("ISO-8859-2", "ISO8859-2", PM_ENCODING_ISO_8859_2);
5254 ENCODING2("ISO-8859-3", "ISO8859-3", PM_ENCODING_ISO_8859_3);
5255 ENCODING2("ISO-8859-4", "ISO8859-4", PM_ENCODING_ISO_8859_4);
5256 ENCODING2("ISO-8859-5", "ISO8859-5", PM_ENCODING_ISO_8859_5);
5257 ENCODING2("ISO-8859-6", "ISO8859-6", PM_ENCODING_ISO_8859_6);
5258 ENCODING2("ISO-8859-7", "ISO8859-7", PM_ENCODING_ISO_8859_7);
5259 ENCODING2("ISO-8859-8", "ISO8859-8", PM_ENCODING_ISO_8859_8);
5260 ENCODING2("ISO-8859-9", "ISO8859-9", PM_ENCODING_ISO_8859_9);
5261 ENCODING2("ISO-8859-10", "ISO8859-10", PM_ENCODING_ISO_8859_10);
5262 ENCODING2("ISO-8859-11", "ISO8859-11", PM_ENCODING_ISO_8859_11);
5263 ENCODING2("ISO-8859-13", "ISO8859-13", PM_ENCODING_ISO_8859_13);
5264 ENCODING2("ISO-8859-14", "ISO8859-14", PM_ENCODING_ISO_8859_14);
5265 ENCODING2("ISO-8859-15", "ISO8859-15", PM_ENCODING_ISO_8859_15);
5266 ENCODING2("ISO-8859-16", "ISO8859-16", PM_ENCODING_ISO_8859_16);
5267#endif
5268 break;
5269 case 'K': case 'k':
5270#ifndef PRISM_ENCODING_EXCLUDE_FULL
5271 ENCODING1("KOI8-R", PM_ENCODING_KOI8_R);
5272 ENCODING1("KOI8-U", PM_ENCODING_KOI8_U);
5273#endif
5274 break;
5275 case 'M': case 'm':
5276#ifndef PRISM_ENCODING_EXCLUDE_FULL
5277 ENCODING1("macCentEuro", PM_ENCODING_MAC_CENT_EURO);
5278 ENCODING1("macCroatian", PM_ENCODING_MAC_CROATIAN);
5279 ENCODING1("macCyrillic", PM_ENCODING_MAC_CYRILLIC);
5280 ENCODING1("macGreek", PM_ENCODING_MAC_GREEK);
5281 ENCODING1("macIceland", PM_ENCODING_MAC_ICELAND);
5282 ENCODING1("MacJapanese", PM_ENCODING_MAC_JAPANESE);
5283 ENCODING1("MacJapan", PM_ENCODING_MAC_JAPANESE);
5284 ENCODING1("macRoman", PM_ENCODING_MAC_ROMAN);
5285 ENCODING1("macRomania", PM_ENCODING_MAC_ROMANIA);
5286 ENCODING1("macThai", PM_ENCODING_MAC_THAI);
5287 ENCODING1("macTurkish", PM_ENCODING_MAC_TURKISH);
5288 ENCODING1("macUkraine", PM_ENCODING_MAC_UKRAINE);
5289#endif
5290 break;
5291 case 'P': case 'p':
5292 ENCODING1("PCK", PM_ENCODING_WINDOWS_31J);
5293 break;
5294 case 'S': case 's':
5295 ENCODING1("SJIS", PM_ENCODING_WINDOWS_31J);
5296#ifndef PRISM_ENCODING_EXCLUDE_FULL
5297 ENCODING1("Shift_JIS", PM_ENCODING_SHIFT_JIS);
5298 ENCODING1("SJIS-DoCoMo", PM_ENCODING_SJIS_DOCOMO);
5299 ENCODING1("SJIS-KDDI", PM_ENCODING_SJIS_KDDI);
5300 ENCODING1("SJIS-SoftBank", PM_ENCODING_SJIS_SOFTBANK);
5301 ENCODING1("stateless-ISO-2022-JP", PM_ENCODING_STATELESS_ISO_2022_JP);
5302 ENCODING1("stateless-ISO-2022-JP-KDDI", PM_ENCODING_STATELESS_ISO_2022_JP_KDDI);
5303#endif
5304 break;
5305 case 'T': case 't':
5306#ifndef PRISM_ENCODING_EXCLUDE_FULL
5307 ENCODING1("TIS-620", PM_ENCODING_TIS_620);
5308#endif
5309 break;
5310 case 'U': case 'u':
5311 ENCODING1("US-ASCII", PM_ENCODING_US_ASCII);
5312#ifndef PRISM_ENCODING_EXCLUDE_FULL
5313 ENCODING2("UTF8-MAC", "UTF-8-HFS", PM_ENCODING_UTF8_MAC);
5314 ENCODING1("UTF8-DoCoMo", PM_ENCODING_UTF8_DOCOMO);
5315 ENCODING1("UTF8-KDDI", PM_ENCODING_UTF8_KDDI);
5316 ENCODING1("UTF8-SoftBank", PM_ENCODING_UTF8_SOFTBANK);
5317#endif
5318 break;
5319 case 'W': case 'w':
5320 ENCODING1("Windows-31J", PM_ENCODING_WINDOWS_31J);
5321#ifndef PRISM_ENCODING_EXCLUDE_FULL
5322 ENCODING1("Windows-874", PM_ENCODING_WINDOWS_874);
5323 ENCODING1("Windows-1250", PM_ENCODING_WINDOWS_1250);
5324 ENCODING1("Windows-1251", PM_ENCODING_WINDOWS_1251);
5325 ENCODING1("Windows-1252", PM_ENCODING_WINDOWS_1252);
5326 ENCODING1("Windows-1253", PM_ENCODING_WINDOWS_1253);
5327 ENCODING1("Windows-1254", PM_ENCODING_WINDOWS_1254);
5328 ENCODING1("Windows-1255", PM_ENCODING_WINDOWS_1255);
5329 ENCODING1("Windows-1256", PM_ENCODING_WINDOWS_1256);
5330 ENCODING1("Windows-1257", PM_ENCODING_WINDOWS_1257);
5331 ENCODING1("Windows-1258", PM_ENCODING_WINDOWS_1258);
5332#endif
5333 break;
5334 case '6':
5335 ENCODING1("646", PM_ENCODING_US_ASCII);
5336 break;
5337 }
5338 }
5339
5340#undef ENCODING2
5341#undef ENCODING1
5342
5343 // If we didn't match any encodings, return NULL.
5344 return NULL;
5345}
VALUE type(ANYARGS)
ANYARGS-ed function type.
#define PRISM_UNUSED
GCC will warn if you specify a function or parameter that is unused at runtime.
Definition unused.h:13