xref: /freebsd-src/contrib/llvm-project/llvm/lib/Support/UnicodeCaseFold.cpp (revision 7a6dacaca14b62ca4b74406814becb87a3fefac0)
10b57cec5SDimitry Andric //===---------- Support/UnicodeCaseFold.cpp -------------------------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // This file was generated by utils/unicode-case-fold.py from the Unicode
40b57cec5SDimitry Andric // case folding database at
5*7a6dacacSDimitry Andric //    http://www.unicode.org/Public/15.1.0/ucd/CaseFolding.txt
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric // To regenerate this file, run:
80b57cec5SDimitry Andric //   utils/unicode-case-fold.py \
9*7a6dacacSDimitry Andric //     "http://www.unicode.org/Public/15.1.0/ucd/CaseFolding.txt" \
100b57cec5SDimitry Andric //     > lib/Support/UnicodeCaseFold.cpp
110b57cec5SDimitry Andric //
120b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
130b57cec5SDimitry Andric 
140b57cec5SDimitry Andric #include "llvm/Support/Unicode.h"
150b57cec5SDimitry Andric 
foldCharSimple(int C)160b57cec5SDimitry Andric int llvm::sys::unicode::foldCharSimple(int C) {
170b57cec5SDimitry Andric   if (C < 0x0041)
180b57cec5SDimitry Andric     return C;
190b57cec5SDimitry Andric   // 26 characters
200b57cec5SDimitry Andric   if (C <= 0x005a)
210b57cec5SDimitry Andric     return C + 32;
220b57cec5SDimitry Andric   // MICRO SIGN
230b57cec5SDimitry Andric   if (C == 0x00b5)
240b57cec5SDimitry Andric     return 0x03bc;
250b57cec5SDimitry Andric   if (C < 0x00c0)
260b57cec5SDimitry Andric     return C;
270b57cec5SDimitry Andric   // 23 characters
280b57cec5SDimitry Andric   if (C <= 0x00d6)
290b57cec5SDimitry Andric     return C + 32;
300b57cec5SDimitry Andric   if (C < 0x00d8)
310b57cec5SDimitry Andric     return C;
320b57cec5SDimitry Andric   // 7 characters
330b57cec5SDimitry Andric   if (C <= 0x00de)
340b57cec5SDimitry Andric     return C + 32;
350b57cec5SDimitry Andric   if (C < 0x0100)
360b57cec5SDimitry Andric     return C;
370b57cec5SDimitry Andric   // 24 characters
380b57cec5SDimitry Andric   if (C <= 0x012e)
390b57cec5SDimitry Andric     return C | 1;
400b57cec5SDimitry Andric   if (C < 0x0132)
410b57cec5SDimitry Andric     return C;
420b57cec5SDimitry Andric   // 3 characters
430b57cec5SDimitry Andric   if (C <= 0x0136)
440b57cec5SDimitry Andric     return C | 1;
450b57cec5SDimitry Andric   if (C < 0x0139)
460b57cec5SDimitry Andric     return C;
470b57cec5SDimitry Andric   // 8 characters
480b57cec5SDimitry Andric   if (C <= 0x0147 && C % 2 == 1)
490b57cec5SDimitry Andric     return C + 1;
500b57cec5SDimitry Andric   if (C < 0x014a)
510b57cec5SDimitry Andric     return C;
520b57cec5SDimitry Andric   // 23 characters
530b57cec5SDimitry Andric   if (C <= 0x0176)
540b57cec5SDimitry Andric     return C | 1;
550b57cec5SDimitry Andric   // LATIN CAPITAL LETTER Y WITH DIAERESIS
560b57cec5SDimitry Andric   if (C == 0x0178)
570b57cec5SDimitry Andric     return 0x00ff;
580b57cec5SDimitry Andric   if (C < 0x0179)
590b57cec5SDimitry Andric     return C;
600b57cec5SDimitry Andric   // 3 characters
610b57cec5SDimitry Andric   if (C <= 0x017d && C % 2 == 1)
620b57cec5SDimitry Andric     return C + 1;
630b57cec5SDimitry Andric   // LATIN SMALL LETTER LONG S
640b57cec5SDimitry Andric   if (C == 0x017f)
650b57cec5SDimitry Andric     return 0x0073;
660b57cec5SDimitry Andric   // LATIN CAPITAL LETTER B WITH HOOK
670b57cec5SDimitry Andric   if (C == 0x0181)
680b57cec5SDimitry Andric     return 0x0253;
690b57cec5SDimitry Andric   if (C < 0x0182)
700b57cec5SDimitry Andric     return C;
710b57cec5SDimitry Andric   // 2 characters
720b57cec5SDimitry Andric   if (C <= 0x0184)
730b57cec5SDimitry Andric     return C | 1;
740b57cec5SDimitry Andric   // LATIN CAPITAL LETTER OPEN O
750b57cec5SDimitry Andric   if (C == 0x0186)
760b57cec5SDimitry Andric     return 0x0254;
770b57cec5SDimitry Andric   // LATIN CAPITAL LETTER C WITH HOOK
780b57cec5SDimitry Andric   if (C == 0x0187)
790b57cec5SDimitry Andric     return 0x0188;
800b57cec5SDimitry Andric   if (C < 0x0189)
810b57cec5SDimitry Andric     return C;
820b57cec5SDimitry Andric   // 2 characters
830b57cec5SDimitry Andric   if (C <= 0x018a)
840b57cec5SDimitry Andric     return C + 205;
850b57cec5SDimitry Andric   // LATIN CAPITAL LETTER D WITH TOPBAR
860b57cec5SDimitry Andric   if (C == 0x018b)
870b57cec5SDimitry Andric     return 0x018c;
880b57cec5SDimitry Andric   // LATIN CAPITAL LETTER REVERSED E
890b57cec5SDimitry Andric   if (C == 0x018e)
900b57cec5SDimitry Andric     return 0x01dd;
910b57cec5SDimitry Andric   // LATIN CAPITAL LETTER SCHWA
920b57cec5SDimitry Andric   if (C == 0x018f)
930b57cec5SDimitry Andric     return 0x0259;
940b57cec5SDimitry Andric   // LATIN CAPITAL LETTER OPEN E
950b57cec5SDimitry Andric   if (C == 0x0190)
960b57cec5SDimitry Andric     return 0x025b;
970b57cec5SDimitry Andric   // LATIN CAPITAL LETTER F WITH HOOK
980b57cec5SDimitry Andric   if (C == 0x0191)
990b57cec5SDimitry Andric     return 0x0192;
1000b57cec5SDimitry Andric   // LATIN CAPITAL LETTER G WITH HOOK
1010b57cec5SDimitry Andric   if (C == 0x0193)
1020b57cec5SDimitry Andric     return 0x0260;
1030b57cec5SDimitry Andric   // LATIN CAPITAL LETTER GAMMA
1040b57cec5SDimitry Andric   if (C == 0x0194)
1050b57cec5SDimitry Andric     return 0x0263;
1060b57cec5SDimitry Andric   // LATIN CAPITAL LETTER IOTA
1070b57cec5SDimitry Andric   if (C == 0x0196)
1080b57cec5SDimitry Andric     return 0x0269;
1090b57cec5SDimitry Andric   // LATIN CAPITAL LETTER I WITH STROKE
1100b57cec5SDimitry Andric   if (C == 0x0197)
1110b57cec5SDimitry Andric     return 0x0268;
1120b57cec5SDimitry Andric   // LATIN CAPITAL LETTER K WITH HOOK
1130b57cec5SDimitry Andric   if (C == 0x0198)
1140b57cec5SDimitry Andric     return 0x0199;
1150b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED M
1160b57cec5SDimitry Andric   if (C == 0x019c)
1170b57cec5SDimitry Andric     return 0x026f;
1180b57cec5SDimitry Andric   // LATIN CAPITAL LETTER N WITH LEFT HOOK
1190b57cec5SDimitry Andric   if (C == 0x019d)
1200b57cec5SDimitry Andric     return 0x0272;
1210b57cec5SDimitry Andric   // LATIN CAPITAL LETTER O WITH MIDDLE TILDE
1220b57cec5SDimitry Andric   if (C == 0x019f)
1230b57cec5SDimitry Andric     return 0x0275;
1240b57cec5SDimitry Andric   if (C < 0x01a0)
1250b57cec5SDimitry Andric     return C;
1260b57cec5SDimitry Andric   // 3 characters
1270b57cec5SDimitry Andric   if (C <= 0x01a4)
1280b57cec5SDimitry Andric     return C | 1;
1290b57cec5SDimitry Andric   // LATIN LETTER YR
1300b57cec5SDimitry Andric   if (C == 0x01a6)
1310b57cec5SDimitry Andric     return 0x0280;
1320b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TONE TWO
1330b57cec5SDimitry Andric   if (C == 0x01a7)
1340b57cec5SDimitry Andric     return 0x01a8;
1350b57cec5SDimitry Andric   // LATIN CAPITAL LETTER ESH
1360b57cec5SDimitry Andric   if (C == 0x01a9)
1370b57cec5SDimitry Andric     return 0x0283;
1380b57cec5SDimitry Andric   // LATIN CAPITAL LETTER T WITH HOOK
1390b57cec5SDimitry Andric   if (C == 0x01ac)
1400b57cec5SDimitry Andric     return 0x01ad;
1410b57cec5SDimitry Andric   // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
1420b57cec5SDimitry Andric   if (C == 0x01ae)
1430b57cec5SDimitry Andric     return 0x0288;
1440b57cec5SDimitry Andric   // LATIN CAPITAL LETTER U WITH HORN
1450b57cec5SDimitry Andric   if (C == 0x01af)
1460b57cec5SDimitry Andric     return 0x01b0;
1470b57cec5SDimitry Andric   if (C < 0x01b1)
1480b57cec5SDimitry Andric     return C;
1490b57cec5SDimitry Andric   // 2 characters
1500b57cec5SDimitry Andric   if (C <= 0x01b2)
1510b57cec5SDimitry Andric     return C + 217;
1520b57cec5SDimitry Andric   if (C < 0x01b3)
1530b57cec5SDimitry Andric     return C;
1540b57cec5SDimitry Andric   // 2 characters
1550b57cec5SDimitry Andric   if (C <= 0x01b5 && C % 2 == 1)
1560b57cec5SDimitry Andric     return C + 1;
1570b57cec5SDimitry Andric   // LATIN CAPITAL LETTER EZH
1580b57cec5SDimitry Andric   if (C == 0x01b7)
1590b57cec5SDimitry Andric     return 0x0292;
1600b57cec5SDimitry Andric   if (C < 0x01b8)
1610b57cec5SDimitry Andric     return C;
1620b57cec5SDimitry Andric   // 2 characters
1630b57cec5SDimitry Andric   if (C <= 0x01bc && C % 4 == 0)
1640b57cec5SDimitry Andric     return C + 1;
1650b57cec5SDimitry Andric   // LATIN CAPITAL LETTER DZ WITH CARON
1660b57cec5SDimitry Andric   if (C == 0x01c4)
1670b57cec5SDimitry Andric     return 0x01c6;
1680b57cec5SDimitry Andric   // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
1690b57cec5SDimitry Andric   if (C == 0x01c5)
1700b57cec5SDimitry Andric     return 0x01c6;
1710b57cec5SDimitry Andric   // LATIN CAPITAL LETTER LJ
1720b57cec5SDimitry Andric   if (C == 0x01c7)
1730b57cec5SDimitry Andric     return 0x01c9;
1740b57cec5SDimitry Andric   // LATIN CAPITAL LETTER L WITH SMALL LETTER J
1750b57cec5SDimitry Andric   if (C == 0x01c8)
1760b57cec5SDimitry Andric     return 0x01c9;
1770b57cec5SDimitry Andric   // LATIN CAPITAL LETTER NJ
1780b57cec5SDimitry Andric   if (C == 0x01ca)
1790b57cec5SDimitry Andric     return 0x01cc;
1800b57cec5SDimitry Andric   if (C < 0x01cb)
1810b57cec5SDimitry Andric     return C;
1820b57cec5SDimitry Andric   // 9 characters
1830b57cec5SDimitry Andric   if (C <= 0x01db && C % 2 == 1)
1840b57cec5SDimitry Andric     return C + 1;
1850b57cec5SDimitry Andric   if (C < 0x01de)
1860b57cec5SDimitry Andric     return C;
1870b57cec5SDimitry Andric   // 9 characters
1880b57cec5SDimitry Andric   if (C <= 0x01ee)
1890b57cec5SDimitry Andric     return C | 1;
1900b57cec5SDimitry Andric   // LATIN CAPITAL LETTER DZ
1910b57cec5SDimitry Andric   if (C == 0x01f1)
1920b57cec5SDimitry Andric     return 0x01f3;
1930b57cec5SDimitry Andric   if (C < 0x01f2)
1940b57cec5SDimitry Andric     return C;
1950b57cec5SDimitry Andric   // 2 characters
1960b57cec5SDimitry Andric   if (C <= 0x01f4)
1970b57cec5SDimitry Andric     return C | 1;
1980b57cec5SDimitry Andric   // LATIN CAPITAL LETTER HWAIR
1990b57cec5SDimitry Andric   if (C == 0x01f6)
2000b57cec5SDimitry Andric     return 0x0195;
2010b57cec5SDimitry Andric   // LATIN CAPITAL LETTER WYNN
2020b57cec5SDimitry Andric   if (C == 0x01f7)
2030b57cec5SDimitry Andric     return 0x01bf;
2040b57cec5SDimitry Andric   if (C < 0x01f8)
2050b57cec5SDimitry Andric     return C;
2060b57cec5SDimitry Andric   // 20 characters
2070b57cec5SDimitry Andric   if (C <= 0x021e)
2080b57cec5SDimitry Andric     return C | 1;
2090b57cec5SDimitry Andric   // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
2100b57cec5SDimitry Andric   if (C == 0x0220)
2110b57cec5SDimitry Andric     return 0x019e;
2120b57cec5SDimitry Andric   if (C < 0x0222)
2130b57cec5SDimitry Andric     return C;
2140b57cec5SDimitry Andric   // 9 characters
2150b57cec5SDimitry Andric   if (C <= 0x0232)
2160b57cec5SDimitry Andric     return C | 1;
2170b57cec5SDimitry Andric   // LATIN CAPITAL LETTER A WITH STROKE
2180b57cec5SDimitry Andric   if (C == 0x023a)
2190b57cec5SDimitry Andric     return 0x2c65;
2200b57cec5SDimitry Andric   // LATIN CAPITAL LETTER C WITH STROKE
2210b57cec5SDimitry Andric   if (C == 0x023b)
2220b57cec5SDimitry Andric     return 0x023c;
2230b57cec5SDimitry Andric   // LATIN CAPITAL LETTER L WITH BAR
2240b57cec5SDimitry Andric   if (C == 0x023d)
2250b57cec5SDimitry Andric     return 0x019a;
2260b57cec5SDimitry Andric   // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
2270b57cec5SDimitry Andric   if (C == 0x023e)
2280b57cec5SDimitry Andric     return 0x2c66;
2290b57cec5SDimitry Andric   // LATIN CAPITAL LETTER GLOTTAL STOP
2300b57cec5SDimitry Andric   if (C == 0x0241)
2310b57cec5SDimitry Andric     return 0x0242;
2320b57cec5SDimitry Andric   // LATIN CAPITAL LETTER B WITH STROKE
2330b57cec5SDimitry Andric   if (C == 0x0243)
2340b57cec5SDimitry Andric     return 0x0180;
2350b57cec5SDimitry Andric   // LATIN CAPITAL LETTER U BAR
2360b57cec5SDimitry Andric   if (C == 0x0244)
2370b57cec5SDimitry Andric     return 0x0289;
2380b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED V
2390b57cec5SDimitry Andric   if (C == 0x0245)
2400b57cec5SDimitry Andric     return 0x028c;
2410b57cec5SDimitry Andric   if (C < 0x0246)
2420b57cec5SDimitry Andric     return C;
2430b57cec5SDimitry Andric   // 5 characters
2440b57cec5SDimitry Andric   if (C <= 0x024e)
2450b57cec5SDimitry Andric     return C | 1;
2460b57cec5SDimitry Andric   // COMBINING GREEK YPOGEGRAMMENI
2470b57cec5SDimitry Andric   if (C == 0x0345)
2480b57cec5SDimitry Andric     return 0x03b9;
2490b57cec5SDimitry Andric   if (C < 0x0370)
2500b57cec5SDimitry Andric     return C;
2510b57cec5SDimitry Andric   // 2 characters
2520b57cec5SDimitry Andric   if (C <= 0x0372)
2530b57cec5SDimitry Andric     return C | 1;
2540b57cec5SDimitry Andric   // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
2550b57cec5SDimitry Andric   if (C == 0x0376)
2560b57cec5SDimitry Andric     return 0x0377;
2570b57cec5SDimitry Andric   // GREEK CAPITAL LETTER YOT
2580b57cec5SDimitry Andric   if (C == 0x037f)
2590b57cec5SDimitry Andric     return 0x03f3;
2600b57cec5SDimitry Andric   // GREEK CAPITAL LETTER ALPHA WITH TONOS
2610b57cec5SDimitry Andric   if (C == 0x0386)
2620b57cec5SDimitry Andric     return 0x03ac;
2630b57cec5SDimitry Andric   if (C < 0x0388)
2640b57cec5SDimitry Andric     return C;
2650b57cec5SDimitry Andric   // 3 characters
2660b57cec5SDimitry Andric   if (C <= 0x038a)
2670b57cec5SDimitry Andric     return C + 37;
2680b57cec5SDimitry Andric   // GREEK CAPITAL LETTER OMICRON WITH TONOS
2690b57cec5SDimitry Andric   if (C == 0x038c)
2700b57cec5SDimitry Andric     return 0x03cc;
2710b57cec5SDimitry Andric   if (C < 0x038e)
2720b57cec5SDimitry Andric     return C;
2730b57cec5SDimitry Andric   // 2 characters
2740b57cec5SDimitry Andric   if (C <= 0x038f)
2750b57cec5SDimitry Andric     return C + 63;
2760b57cec5SDimitry Andric   if (C < 0x0391)
2770b57cec5SDimitry Andric     return C;
2780b57cec5SDimitry Andric   // 17 characters
2790b57cec5SDimitry Andric   if (C <= 0x03a1)
2800b57cec5SDimitry Andric     return C + 32;
2810b57cec5SDimitry Andric   if (C < 0x03a3)
2820b57cec5SDimitry Andric     return C;
2830b57cec5SDimitry Andric   // 9 characters
2840b57cec5SDimitry Andric   if (C <= 0x03ab)
2850b57cec5SDimitry Andric     return C + 32;
2860b57cec5SDimitry Andric   // GREEK SMALL LETTER FINAL SIGMA
2870b57cec5SDimitry Andric   if (C == 0x03c2)
2880b57cec5SDimitry Andric     return 0x03c3;
2890b57cec5SDimitry Andric   // GREEK CAPITAL KAI SYMBOL
2900b57cec5SDimitry Andric   if (C == 0x03cf)
2910b57cec5SDimitry Andric     return 0x03d7;
2920b57cec5SDimitry Andric   // GREEK BETA SYMBOL
2930b57cec5SDimitry Andric   if (C == 0x03d0)
2940b57cec5SDimitry Andric     return 0x03b2;
2950b57cec5SDimitry Andric   // GREEK THETA SYMBOL
2960b57cec5SDimitry Andric   if (C == 0x03d1)
2970b57cec5SDimitry Andric     return 0x03b8;
2980b57cec5SDimitry Andric   // GREEK PHI SYMBOL
2990b57cec5SDimitry Andric   if (C == 0x03d5)
3000b57cec5SDimitry Andric     return 0x03c6;
3010b57cec5SDimitry Andric   // GREEK PI SYMBOL
3020b57cec5SDimitry Andric   if (C == 0x03d6)
3030b57cec5SDimitry Andric     return 0x03c0;
3040b57cec5SDimitry Andric   if (C < 0x03d8)
3050b57cec5SDimitry Andric     return C;
3060b57cec5SDimitry Andric   // 12 characters
3070b57cec5SDimitry Andric   if (C <= 0x03ee)
3080b57cec5SDimitry Andric     return C | 1;
3090b57cec5SDimitry Andric   // GREEK KAPPA SYMBOL
3100b57cec5SDimitry Andric   if (C == 0x03f0)
3110b57cec5SDimitry Andric     return 0x03ba;
3120b57cec5SDimitry Andric   // GREEK RHO SYMBOL
3130b57cec5SDimitry Andric   if (C == 0x03f1)
3140b57cec5SDimitry Andric     return 0x03c1;
3150b57cec5SDimitry Andric   // GREEK CAPITAL THETA SYMBOL
3160b57cec5SDimitry Andric   if (C == 0x03f4)
3170b57cec5SDimitry Andric     return 0x03b8;
3180b57cec5SDimitry Andric   // GREEK LUNATE EPSILON SYMBOL
3190b57cec5SDimitry Andric   if (C == 0x03f5)
3200b57cec5SDimitry Andric     return 0x03b5;
3210b57cec5SDimitry Andric   // GREEK CAPITAL LETTER SHO
3220b57cec5SDimitry Andric   if (C == 0x03f7)
3230b57cec5SDimitry Andric     return 0x03f8;
3240b57cec5SDimitry Andric   // GREEK CAPITAL LUNATE SIGMA SYMBOL
3250b57cec5SDimitry Andric   if (C == 0x03f9)
3260b57cec5SDimitry Andric     return 0x03f2;
3270b57cec5SDimitry Andric   // GREEK CAPITAL LETTER SAN
3280b57cec5SDimitry Andric   if (C == 0x03fa)
3290b57cec5SDimitry Andric     return 0x03fb;
3300b57cec5SDimitry Andric   if (C < 0x03fd)
3310b57cec5SDimitry Andric     return C;
3320b57cec5SDimitry Andric   // 3 characters
3330b57cec5SDimitry Andric   if (C <= 0x03ff)
3340b57cec5SDimitry Andric     return C + -130;
3350b57cec5SDimitry Andric   if (C < 0x0400)
3360b57cec5SDimitry Andric     return C;
3370b57cec5SDimitry Andric   // 16 characters
3380b57cec5SDimitry Andric   if (C <= 0x040f)
3390b57cec5SDimitry Andric     return C + 80;
3400b57cec5SDimitry Andric   if (C < 0x0410)
3410b57cec5SDimitry Andric     return C;
3420b57cec5SDimitry Andric   // 32 characters
3430b57cec5SDimitry Andric   if (C <= 0x042f)
3440b57cec5SDimitry Andric     return C + 32;
3450b57cec5SDimitry Andric   if (C < 0x0460)
3460b57cec5SDimitry Andric     return C;
3470b57cec5SDimitry Andric   // 17 characters
3480b57cec5SDimitry Andric   if (C <= 0x0480)
3490b57cec5SDimitry Andric     return C | 1;
3500b57cec5SDimitry Andric   if (C < 0x048a)
3510b57cec5SDimitry Andric     return C;
3520b57cec5SDimitry Andric   // 27 characters
3530b57cec5SDimitry Andric   if (C <= 0x04be)
3540b57cec5SDimitry Andric     return C | 1;
3550b57cec5SDimitry Andric   // CYRILLIC LETTER PALOCHKA
3560b57cec5SDimitry Andric   if (C == 0x04c0)
3570b57cec5SDimitry Andric     return 0x04cf;
3580b57cec5SDimitry Andric   if (C < 0x04c1)
3590b57cec5SDimitry Andric     return C;
3600b57cec5SDimitry Andric   // 7 characters
3610b57cec5SDimitry Andric   if (C <= 0x04cd && C % 2 == 1)
3620b57cec5SDimitry Andric     return C + 1;
3630b57cec5SDimitry Andric   if (C < 0x04d0)
3640b57cec5SDimitry Andric     return C;
3650b57cec5SDimitry Andric   // 48 characters
3660b57cec5SDimitry Andric   if (C <= 0x052e)
3670b57cec5SDimitry Andric     return C | 1;
3680b57cec5SDimitry Andric   if (C < 0x0531)
3690b57cec5SDimitry Andric     return C;
3700b57cec5SDimitry Andric   // 38 characters
3710b57cec5SDimitry Andric   if (C <= 0x0556)
3720b57cec5SDimitry Andric     return C + 48;
3730b57cec5SDimitry Andric   if (C < 0x10a0)
3740b57cec5SDimitry Andric     return C;
3750b57cec5SDimitry Andric   // 38 characters
3760b57cec5SDimitry Andric   if (C <= 0x10c5)
3770b57cec5SDimitry Andric     return C + 7264;
3780b57cec5SDimitry Andric   if (C < 0x10c7)
3790b57cec5SDimitry Andric     return C;
3800b57cec5SDimitry Andric   // 2 characters
3810b57cec5SDimitry Andric   if (C <= 0x10cd && C % 6 == 5)
3820b57cec5SDimitry Andric     return C + 7264;
3830b57cec5SDimitry Andric   if (C < 0x13f8)
3840b57cec5SDimitry Andric     return C;
3850b57cec5SDimitry Andric   // 6 characters
3860b57cec5SDimitry Andric   if (C <= 0x13fd)
3870b57cec5SDimitry Andric     return C + -8;
3880b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER ROUNDED VE
3890b57cec5SDimitry Andric   if (C == 0x1c80)
3900b57cec5SDimitry Andric     return 0x0432;
3910b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER LONG-LEGGED DE
3920b57cec5SDimitry Andric   if (C == 0x1c81)
3930b57cec5SDimitry Andric     return 0x0434;
3940b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER NARROW O
3950b57cec5SDimitry Andric   if (C == 0x1c82)
3960b57cec5SDimitry Andric     return 0x043e;
3970b57cec5SDimitry Andric   if (C < 0x1c83)
3980b57cec5SDimitry Andric     return C;
3990b57cec5SDimitry Andric   // 2 characters
4000b57cec5SDimitry Andric   if (C <= 0x1c84)
4010b57cec5SDimitry Andric     return C + -6210;
4020b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER THREE-LEGGED TE
4030b57cec5SDimitry Andric   if (C == 0x1c85)
4040b57cec5SDimitry Andric     return 0x0442;
4050b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER TALL HARD SIGN
4060b57cec5SDimitry Andric   if (C == 0x1c86)
4070b57cec5SDimitry Andric     return 0x044a;
4080b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER TALL YAT
4090b57cec5SDimitry Andric   if (C == 0x1c87)
4100b57cec5SDimitry Andric     return 0x0463;
4110b57cec5SDimitry Andric   // CYRILLIC SMALL LETTER UNBLENDED UK
4120b57cec5SDimitry Andric   if (C == 0x1c88)
4130b57cec5SDimitry Andric     return 0xa64b;
414bdd1243dSDimitry Andric   if (C < 0x1c90)
415bdd1243dSDimitry Andric     return C;
416bdd1243dSDimitry Andric   // 43 characters
417bdd1243dSDimitry Andric   if (C <= 0x1cba)
418bdd1243dSDimitry Andric     return C + -3008;
419bdd1243dSDimitry Andric   if (C < 0x1cbd)
420bdd1243dSDimitry Andric     return C;
421bdd1243dSDimitry Andric   // 3 characters
422bdd1243dSDimitry Andric   if (C <= 0x1cbf)
423bdd1243dSDimitry Andric     return C + -3008;
4240b57cec5SDimitry Andric   if (C < 0x1e00)
4250b57cec5SDimitry Andric     return C;
4260b57cec5SDimitry Andric   // 75 characters
4270b57cec5SDimitry Andric   if (C <= 0x1e94)
4280b57cec5SDimitry Andric     return C | 1;
4290b57cec5SDimitry Andric   // LATIN SMALL LETTER LONG S WITH DOT ABOVE
4300b57cec5SDimitry Andric   if (C == 0x1e9b)
4310b57cec5SDimitry Andric     return 0x1e61;
4320b57cec5SDimitry Andric   // LATIN CAPITAL LETTER SHARP S
4330b57cec5SDimitry Andric   if (C == 0x1e9e)
4340b57cec5SDimitry Andric     return 0x00df;
4350b57cec5SDimitry Andric   if (C < 0x1ea0)
4360b57cec5SDimitry Andric     return C;
4370b57cec5SDimitry Andric   // 48 characters
4380b57cec5SDimitry Andric   if (C <= 0x1efe)
4390b57cec5SDimitry Andric     return C | 1;
4400b57cec5SDimitry Andric   if (C < 0x1f08)
4410b57cec5SDimitry Andric     return C;
4420b57cec5SDimitry Andric   // 8 characters
4430b57cec5SDimitry Andric   if (C <= 0x1f0f)
4440b57cec5SDimitry Andric     return C + -8;
4450b57cec5SDimitry Andric   if (C < 0x1f18)
4460b57cec5SDimitry Andric     return C;
4470b57cec5SDimitry Andric   // 6 characters
4480b57cec5SDimitry Andric   if (C <= 0x1f1d)
4490b57cec5SDimitry Andric     return C + -8;
4500b57cec5SDimitry Andric   if (C < 0x1f28)
4510b57cec5SDimitry Andric     return C;
4520b57cec5SDimitry Andric   // 8 characters
4530b57cec5SDimitry Andric   if (C <= 0x1f2f)
4540b57cec5SDimitry Andric     return C + -8;
4550b57cec5SDimitry Andric   if (C < 0x1f38)
4560b57cec5SDimitry Andric     return C;
4570b57cec5SDimitry Andric   // 8 characters
4580b57cec5SDimitry Andric   if (C <= 0x1f3f)
4590b57cec5SDimitry Andric     return C + -8;
4600b57cec5SDimitry Andric   if (C < 0x1f48)
4610b57cec5SDimitry Andric     return C;
4620b57cec5SDimitry Andric   // 6 characters
4630b57cec5SDimitry Andric   if (C <= 0x1f4d)
4640b57cec5SDimitry Andric     return C + -8;
4650b57cec5SDimitry Andric   if (C < 0x1f59)
4660b57cec5SDimitry Andric     return C;
4670b57cec5SDimitry Andric   // 4 characters
4680b57cec5SDimitry Andric   if (C <= 0x1f5f && C % 2 == 1)
4690b57cec5SDimitry Andric     return C + -8;
4700b57cec5SDimitry Andric   if (C < 0x1f68)
4710b57cec5SDimitry Andric     return C;
4720b57cec5SDimitry Andric   // 8 characters
4730b57cec5SDimitry Andric   if (C <= 0x1f6f)
4740b57cec5SDimitry Andric     return C + -8;
4750b57cec5SDimitry Andric   if (C < 0x1f88)
4760b57cec5SDimitry Andric     return C;
4770b57cec5SDimitry Andric   // 8 characters
4780b57cec5SDimitry Andric   if (C <= 0x1f8f)
4790b57cec5SDimitry Andric     return C + -8;
4800b57cec5SDimitry Andric   if (C < 0x1f98)
4810b57cec5SDimitry Andric     return C;
4820b57cec5SDimitry Andric   // 8 characters
4830b57cec5SDimitry Andric   if (C <= 0x1f9f)
4840b57cec5SDimitry Andric     return C + -8;
4850b57cec5SDimitry Andric   if (C < 0x1fa8)
4860b57cec5SDimitry Andric     return C;
4870b57cec5SDimitry Andric   // 8 characters
4880b57cec5SDimitry Andric   if (C <= 0x1faf)
4890b57cec5SDimitry Andric     return C + -8;
4900b57cec5SDimitry Andric   if (C < 0x1fb8)
4910b57cec5SDimitry Andric     return C;
4920b57cec5SDimitry Andric   // 2 characters
4930b57cec5SDimitry Andric   if (C <= 0x1fb9)
4940b57cec5SDimitry Andric     return C + -8;
4950b57cec5SDimitry Andric   if (C < 0x1fba)
4960b57cec5SDimitry Andric     return C;
4970b57cec5SDimitry Andric   // 2 characters
4980b57cec5SDimitry Andric   if (C <= 0x1fbb)
4990b57cec5SDimitry Andric     return C + -74;
5000b57cec5SDimitry Andric   // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
5010b57cec5SDimitry Andric   if (C == 0x1fbc)
5020b57cec5SDimitry Andric     return 0x1fb3;
5030b57cec5SDimitry Andric   // GREEK PROSGEGRAMMENI
5040b57cec5SDimitry Andric   if (C == 0x1fbe)
5050b57cec5SDimitry Andric     return 0x03b9;
5060b57cec5SDimitry Andric   if (C < 0x1fc8)
5070b57cec5SDimitry Andric     return C;
5080b57cec5SDimitry Andric   // 4 characters
5090b57cec5SDimitry Andric   if (C <= 0x1fcb)
5100b57cec5SDimitry Andric     return C + -86;
5110b57cec5SDimitry Andric   // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
5120b57cec5SDimitry Andric   if (C == 0x1fcc)
5130b57cec5SDimitry Andric     return 0x1fc3;
514*7a6dacacSDimitry Andric   // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
515*7a6dacacSDimitry Andric   if (C == 0x1fd3)
516*7a6dacacSDimitry Andric     return 0x0390;
5170b57cec5SDimitry Andric   if (C < 0x1fd8)
5180b57cec5SDimitry Andric     return C;
5190b57cec5SDimitry Andric   // 2 characters
5200b57cec5SDimitry Andric   if (C <= 0x1fd9)
5210b57cec5SDimitry Andric     return C + -8;
5220b57cec5SDimitry Andric   if (C < 0x1fda)
5230b57cec5SDimitry Andric     return C;
5240b57cec5SDimitry Andric   // 2 characters
5250b57cec5SDimitry Andric   if (C <= 0x1fdb)
5260b57cec5SDimitry Andric     return C + -100;
527*7a6dacacSDimitry Andric   // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
528*7a6dacacSDimitry Andric   if (C == 0x1fe3)
529*7a6dacacSDimitry Andric     return 0x03b0;
5300b57cec5SDimitry Andric   if (C < 0x1fe8)
5310b57cec5SDimitry Andric     return C;
5320b57cec5SDimitry Andric   // 2 characters
5330b57cec5SDimitry Andric   if (C <= 0x1fe9)
5340b57cec5SDimitry Andric     return C + -8;
5350b57cec5SDimitry Andric   if (C < 0x1fea)
5360b57cec5SDimitry Andric     return C;
5370b57cec5SDimitry Andric   // 2 characters
5380b57cec5SDimitry Andric   if (C <= 0x1feb)
5390b57cec5SDimitry Andric     return C + -112;
5400b57cec5SDimitry Andric   // GREEK CAPITAL LETTER RHO WITH DASIA
5410b57cec5SDimitry Andric   if (C == 0x1fec)
5420b57cec5SDimitry Andric     return 0x1fe5;
5430b57cec5SDimitry Andric   if (C < 0x1ff8)
5440b57cec5SDimitry Andric     return C;
5450b57cec5SDimitry Andric   // 2 characters
5460b57cec5SDimitry Andric   if (C <= 0x1ff9)
5470b57cec5SDimitry Andric     return C + -128;
5480b57cec5SDimitry Andric   if (C < 0x1ffa)
5490b57cec5SDimitry Andric     return C;
5500b57cec5SDimitry Andric   // 2 characters
5510b57cec5SDimitry Andric   if (C <= 0x1ffb)
5520b57cec5SDimitry Andric     return C + -126;
5530b57cec5SDimitry Andric   // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
5540b57cec5SDimitry Andric   if (C == 0x1ffc)
5550b57cec5SDimitry Andric     return 0x1ff3;
5560b57cec5SDimitry Andric   // OHM SIGN
5570b57cec5SDimitry Andric   if (C == 0x2126)
5580b57cec5SDimitry Andric     return 0x03c9;
5590b57cec5SDimitry Andric   // KELVIN SIGN
5600b57cec5SDimitry Andric   if (C == 0x212a)
5610b57cec5SDimitry Andric     return 0x006b;
5620b57cec5SDimitry Andric   // ANGSTROM SIGN
5630b57cec5SDimitry Andric   if (C == 0x212b)
5640b57cec5SDimitry Andric     return 0x00e5;
5650b57cec5SDimitry Andric   // TURNED CAPITAL F
5660b57cec5SDimitry Andric   if (C == 0x2132)
5670b57cec5SDimitry Andric     return 0x214e;
5680b57cec5SDimitry Andric   if (C < 0x2160)
5690b57cec5SDimitry Andric     return C;
5700b57cec5SDimitry Andric   // 16 characters
5710b57cec5SDimitry Andric   if (C <= 0x216f)
5720b57cec5SDimitry Andric     return C + 16;
5730b57cec5SDimitry Andric   // ROMAN NUMERAL REVERSED ONE HUNDRED
5740b57cec5SDimitry Andric   if (C == 0x2183)
5750b57cec5SDimitry Andric     return 0x2184;
5760b57cec5SDimitry Andric   if (C < 0x24b6)
5770b57cec5SDimitry Andric     return C;
5780b57cec5SDimitry Andric   // 26 characters
5790b57cec5SDimitry Andric   if (C <= 0x24cf)
5800b57cec5SDimitry Andric     return C + 26;
5810b57cec5SDimitry Andric   if (C < 0x2c00)
5820b57cec5SDimitry Andric     return C;
583bdd1243dSDimitry Andric   // 48 characters
584bdd1243dSDimitry Andric   if (C <= 0x2c2f)
5850b57cec5SDimitry Andric     return C + 48;
5860b57cec5SDimitry Andric   // LATIN CAPITAL LETTER L WITH DOUBLE BAR
5870b57cec5SDimitry Andric   if (C == 0x2c60)
5880b57cec5SDimitry Andric     return 0x2c61;
5890b57cec5SDimitry Andric   // LATIN CAPITAL LETTER L WITH MIDDLE TILDE
5900b57cec5SDimitry Andric   if (C == 0x2c62)
5910b57cec5SDimitry Andric     return 0x026b;
5920b57cec5SDimitry Andric   // LATIN CAPITAL LETTER P WITH STROKE
5930b57cec5SDimitry Andric   if (C == 0x2c63)
5940b57cec5SDimitry Andric     return 0x1d7d;
5950b57cec5SDimitry Andric   // LATIN CAPITAL LETTER R WITH TAIL
5960b57cec5SDimitry Andric   if (C == 0x2c64)
5970b57cec5SDimitry Andric     return 0x027d;
5980b57cec5SDimitry Andric   if (C < 0x2c67)
5990b57cec5SDimitry Andric     return C;
6000b57cec5SDimitry Andric   // 3 characters
6010b57cec5SDimitry Andric   if (C <= 0x2c6b && C % 2 == 1)
6020b57cec5SDimitry Andric     return C + 1;
6030b57cec5SDimitry Andric   // LATIN CAPITAL LETTER ALPHA
6040b57cec5SDimitry Andric   if (C == 0x2c6d)
6050b57cec5SDimitry Andric     return 0x0251;
6060b57cec5SDimitry Andric   // LATIN CAPITAL LETTER M WITH HOOK
6070b57cec5SDimitry Andric   if (C == 0x2c6e)
6080b57cec5SDimitry Andric     return 0x0271;
6090b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED A
6100b57cec5SDimitry Andric   if (C == 0x2c6f)
6110b57cec5SDimitry Andric     return 0x0250;
6120b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED ALPHA
6130b57cec5SDimitry Andric   if (C == 0x2c70)
6140b57cec5SDimitry Andric     return 0x0252;
6150b57cec5SDimitry Andric   if (C < 0x2c72)
6160b57cec5SDimitry Andric     return C;
6170b57cec5SDimitry Andric   // 2 characters
6180b57cec5SDimitry Andric   if (C <= 0x2c75 && C % 3 == 2)
6190b57cec5SDimitry Andric     return C + 1;
6200b57cec5SDimitry Andric   if (C < 0x2c7e)
6210b57cec5SDimitry Andric     return C;
6220b57cec5SDimitry Andric   // 2 characters
6230b57cec5SDimitry Andric   if (C <= 0x2c7f)
6240b57cec5SDimitry Andric     return C + -10815;
6250b57cec5SDimitry Andric   if (C < 0x2c80)
6260b57cec5SDimitry Andric     return C;
6270b57cec5SDimitry Andric   // 50 characters
6280b57cec5SDimitry Andric   if (C <= 0x2ce2)
6290b57cec5SDimitry Andric     return C | 1;
6300b57cec5SDimitry Andric   if (C < 0x2ceb)
6310b57cec5SDimitry Andric     return C;
6320b57cec5SDimitry Andric   // 2 characters
6330b57cec5SDimitry Andric   if (C <= 0x2ced && C % 2 == 1)
6340b57cec5SDimitry Andric     return C + 1;
6350b57cec5SDimitry Andric   if (C < 0x2cf2)
6360b57cec5SDimitry Andric     return C;
6370b57cec5SDimitry Andric   // 2 characters
6380b57cec5SDimitry Andric   if (C <= 0xa640 && C % 31054 == 11506)
6390b57cec5SDimitry Andric     return C + 1;
6400b57cec5SDimitry Andric   if (C < 0xa642)
6410b57cec5SDimitry Andric     return C;
6420b57cec5SDimitry Andric   // 22 characters
6430b57cec5SDimitry Andric   if (C <= 0xa66c)
6440b57cec5SDimitry Andric     return C | 1;
6450b57cec5SDimitry Andric   if (C < 0xa680)
6460b57cec5SDimitry Andric     return C;
6470b57cec5SDimitry Andric   // 14 characters
6480b57cec5SDimitry Andric   if (C <= 0xa69a)
6490b57cec5SDimitry Andric     return C | 1;
6500b57cec5SDimitry Andric   if (C < 0xa722)
6510b57cec5SDimitry Andric     return C;
6520b57cec5SDimitry Andric   // 7 characters
6530b57cec5SDimitry Andric   if (C <= 0xa72e)
6540b57cec5SDimitry Andric     return C | 1;
6550b57cec5SDimitry Andric   if (C < 0xa732)
6560b57cec5SDimitry Andric     return C;
6570b57cec5SDimitry Andric   // 31 characters
6580b57cec5SDimitry Andric   if (C <= 0xa76e)
6590b57cec5SDimitry Andric     return C | 1;
6600b57cec5SDimitry Andric   if (C < 0xa779)
6610b57cec5SDimitry Andric     return C;
6620b57cec5SDimitry Andric   // 2 characters
6630b57cec5SDimitry Andric   if (C <= 0xa77b && C % 2 == 1)
6640b57cec5SDimitry Andric     return C + 1;
6650b57cec5SDimitry Andric   // LATIN CAPITAL LETTER INSULAR G
6660b57cec5SDimitry Andric   if (C == 0xa77d)
6670b57cec5SDimitry Andric     return 0x1d79;
6680b57cec5SDimitry Andric   if (C < 0xa77e)
6690b57cec5SDimitry Andric     return C;
6700b57cec5SDimitry Andric   // 5 characters
6710b57cec5SDimitry Andric   if (C <= 0xa786)
6720b57cec5SDimitry Andric     return C | 1;
6730b57cec5SDimitry Andric   // LATIN CAPITAL LETTER SALTILLO
6740b57cec5SDimitry Andric   if (C == 0xa78b)
6750b57cec5SDimitry Andric     return 0xa78c;
6760b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED H
6770b57cec5SDimitry Andric   if (C == 0xa78d)
6780b57cec5SDimitry Andric     return 0x0265;
6790b57cec5SDimitry Andric   if (C < 0xa790)
6800b57cec5SDimitry Andric     return C;
6810b57cec5SDimitry Andric   // 2 characters
6820b57cec5SDimitry Andric   if (C <= 0xa792)
6830b57cec5SDimitry Andric     return C | 1;
6840b57cec5SDimitry Andric   if (C < 0xa796)
6850b57cec5SDimitry Andric     return C;
6860b57cec5SDimitry Andric   // 10 characters
6870b57cec5SDimitry Andric   if (C <= 0xa7a8)
6880b57cec5SDimitry Andric     return C | 1;
6890b57cec5SDimitry Andric   // LATIN CAPITAL LETTER H WITH HOOK
6900b57cec5SDimitry Andric   if (C == 0xa7aa)
6910b57cec5SDimitry Andric     return 0x0266;
6920b57cec5SDimitry Andric   // LATIN CAPITAL LETTER REVERSED OPEN E
6930b57cec5SDimitry Andric   if (C == 0xa7ab)
6940b57cec5SDimitry Andric     return 0x025c;
6950b57cec5SDimitry Andric   // LATIN CAPITAL LETTER SCRIPT G
6960b57cec5SDimitry Andric   if (C == 0xa7ac)
6970b57cec5SDimitry Andric     return 0x0261;
6980b57cec5SDimitry Andric   // LATIN CAPITAL LETTER L WITH BELT
6990b57cec5SDimitry Andric   if (C == 0xa7ad)
7000b57cec5SDimitry Andric     return 0x026c;
7010b57cec5SDimitry Andric   // LATIN CAPITAL LETTER SMALL CAPITAL I
7020b57cec5SDimitry Andric   if (C == 0xa7ae)
7030b57cec5SDimitry Andric     return 0x026a;
7040b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED K
7050b57cec5SDimitry Andric   if (C == 0xa7b0)
7060b57cec5SDimitry Andric     return 0x029e;
7070b57cec5SDimitry Andric   // LATIN CAPITAL LETTER TURNED T
7080b57cec5SDimitry Andric   if (C == 0xa7b1)
7090b57cec5SDimitry Andric     return 0x0287;
7100b57cec5SDimitry Andric   // LATIN CAPITAL LETTER J WITH CROSSED-TAIL
7110b57cec5SDimitry Andric   if (C == 0xa7b2)
7120b57cec5SDimitry Andric     return 0x029d;
7130b57cec5SDimitry Andric   // LATIN CAPITAL LETTER CHI
7140b57cec5SDimitry Andric   if (C == 0xa7b3)
7150b57cec5SDimitry Andric     return 0xab53;
7160b57cec5SDimitry Andric   if (C < 0xa7b4)
7170b57cec5SDimitry Andric     return C;
718bdd1243dSDimitry Andric   // 8 characters
719bdd1243dSDimitry Andric   if (C <= 0xa7c2)
7200b57cec5SDimitry Andric     return C | 1;
721bdd1243dSDimitry Andric   // LATIN CAPITAL LETTER C WITH PALATAL HOOK
722bdd1243dSDimitry Andric   if (C == 0xa7c4)
723bdd1243dSDimitry Andric     return 0xa794;
724bdd1243dSDimitry Andric   // LATIN CAPITAL LETTER S WITH HOOK
725bdd1243dSDimitry Andric   if (C == 0xa7c5)
726bdd1243dSDimitry Andric     return 0x0282;
727bdd1243dSDimitry Andric   // LATIN CAPITAL LETTER Z WITH PALATAL HOOK
728bdd1243dSDimitry Andric   if (C == 0xa7c6)
729bdd1243dSDimitry Andric     return 0x1d8e;
730bdd1243dSDimitry Andric   if (C < 0xa7c7)
731bdd1243dSDimitry Andric     return C;
732bdd1243dSDimitry Andric   // 2 characters
733bdd1243dSDimitry Andric   if (C <= 0xa7c9 && C % 2 == 1)
734bdd1243dSDimitry Andric     return C + 1;
735bdd1243dSDimitry Andric   if (C < 0xa7d0)
736bdd1243dSDimitry Andric     return C;
737bdd1243dSDimitry Andric   // 2 characters
738bdd1243dSDimitry Andric   if (C <= 0xa7d6 && C % 6 == 0)
739bdd1243dSDimitry Andric     return C + 1;
740bdd1243dSDimitry Andric   if (C < 0xa7d8)
741bdd1243dSDimitry Andric     return C;
742bdd1243dSDimitry Andric   // 2 characters
743bdd1243dSDimitry Andric   if (C <= 0xa7f5 && C % 29 == 19)
744bdd1243dSDimitry Andric     return C + 1;
7450b57cec5SDimitry Andric   if (C < 0xab70)
7460b57cec5SDimitry Andric     return C;
7470b57cec5SDimitry Andric   // 80 characters
7480b57cec5SDimitry Andric   if (C <= 0xabbf)
7490b57cec5SDimitry Andric     return C + -38864;
750*7a6dacacSDimitry Andric   // LATIN SMALL LIGATURE LONG S T
751*7a6dacacSDimitry Andric   if (C == 0xfb05)
752*7a6dacacSDimitry Andric     return 0xfb06;
7530b57cec5SDimitry Andric   if (C < 0xff21)
7540b57cec5SDimitry Andric     return C;
7550b57cec5SDimitry Andric   // 26 characters
7560b57cec5SDimitry Andric   if (C <= 0xff3a)
7570b57cec5SDimitry Andric     return C + 32;
7580b57cec5SDimitry Andric   if (C < 0x10400)
7590b57cec5SDimitry Andric     return C;
7600b57cec5SDimitry Andric   // 40 characters
7610b57cec5SDimitry Andric   if (C <= 0x10427)
7620b57cec5SDimitry Andric     return C + 40;
7630b57cec5SDimitry Andric   if (C < 0x104b0)
7640b57cec5SDimitry Andric     return C;
7650b57cec5SDimitry Andric   // 36 characters
7660b57cec5SDimitry Andric   if (C <= 0x104d3)
7670b57cec5SDimitry Andric     return C + 40;
768bdd1243dSDimitry Andric   if (C < 0x10570)
769bdd1243dSDimitry Andric     return C;
770bdd1243dSDimitry Andric   // 11 characters
771bdd1243dSDimitry Andric   if (C <= 0x1057a)
772bdd1243dSDimitry Andric     return C + 39;
773bdd1243dSDimitry Andric   if (C < 0x1057c)
774bdd1243dSDimitry Andric     return C;
775bdd1243dSDimitry Andric   // 15 characters
776bdd1243dSDimitry Andric   if (C <= 0x1058a)
777bdd1243dSDimitry Andric     return C + 39;
778bdd1243dSDimitry Andric   if (C < 0x1058c)
779bdd1243dSDimitry Andric     return C;
780bdd1243dSDimitry Andric   // 7 characters
781bdd1243dSDimitry Andric   if (C <= 0x10592)
782bdd1243dSDimitry Andric     return C + 39;
783bdd1243dSDimitry Andric   if (C < 0x10594)
784bdd1243dSDimitry Andric     return C;
785bdd1243dSDimitry Andric   // 2 characters
786bdd1243dSDimitry Andric   if (C <= 0x10595)
787bdd1243dSDimitry Andric     return C + 39;
7880b57cec5SDimitry Andric   if (C < 0x10c80)
7890b57cec5SDimitry Andric     return C;
7900b57cec5SDimitry Andric   // 51 characters
7910b57cec5SDimitry Andric   if (C <= 0x10cb2)
7920b57cec5SDimitry Andric     return C + 64;
7930b57cec5SDimitry Andric   if (C < 0x118a0)
7940b57cec5SDimitry Andric     return C;
7950b57cec5SDimitry Andric   // 32 characters
7960b57cec5SDimitry Andric   if (C <= 0x118bf)
7970b57cec5SDimitry Andric     return C + 32;
798bdd1243dSDimitry Andric   if (C < 0x16e40)
799bdd1243dSDimitry Andric     return C;
800bdd1243dSDimitry Andric   // 32 characters
801bdd1243dSDimitry Andric   if (C <= 0x16e5f)
802bdd1243dSDimitry Andric     return C + 32;
8030b57cec5SDimitry Andric   if (C < 0x1e900)
8040b57cec5SDimitry Andric     return C;
8050b57cec5SDimitry Andric   // 34 characters
8060b57cec5SDimitry Andric   if (C <= 0x1e921)
8070b57cec5SDimitry Andric     return C + 34;
8080b57cec5SDimitry Andric 
8090b57cec5SDimitry Andric   return C;
8100b57cec5SDimitry Andric }
811