1 //===---------- Support/UnicodeCaseFold.cpp -------------------------------===//
2 //
3 // This file was generated by utils/unicode-case-fold.py from the Unicode
4 // case folding database at
5 //    http://www.unicode.org/Public/15.1.0/ucd/CaseFolding.txt
6 //
7 // To regenerate this file, run:
8 //   utils/unicode-case-fold.py \
9 //     "http://www.unicode.org/Public/15.1.0/ucd/CaseFolding.txt" \
10 //     > lib/Support/UnicodeCaseFold.cpp
11 //
12 //===----------------------------------------------------------------------===//
13 
14 #include "llvm/Support/Unicode.h"
15 
foldCharSimple(int C)16 int llvm::sys::unicode::foldCharSimple(int C) {
17   if (C < 0x0041)
18     return C;
19   // 26 characters
20   if (C <= 0x005a)
21     return C + 32;
22   // MICRO SIGN
23   if (C == 0x00b5)
24     return 0x03bc;
25   if (C < 0x00c0)
26     return C;
27   // 23 characters
28   if (C <= 0x00d6)
29     return C + 32;
30   if (C < 0x00d8)
31     return C;
32   // 7 characters
33   if (C <= 0x00de)
34     return C + 32;
35   if (C < 0x0100)
36     return C;
37   // 24 characters
38   if (C <= 0x012e)
39     return C | 1;
40   if (C < 0x0132)
41     return C;
42   // 3 characters
43   if (C <= 0x0136)
44     return C | 1;
45   if (C < 0x0139)
46     return C;
47   // 8 characters
48   if (C <= 0x0147 && C % 2 == 1)
49     return C + 1;
50   if (C < 0x014a)
51     return C;
52   // 23 characters
53   if (C <= 0x0176)
54     return C | 1;
55   // LATIN CAPITAL LETTER Y WITH DIAERESIS
56   if (C == 0x0178)
57     return 0x00ff;
58   if (C < 0x0179)
59     return C;
60   // 3 characters
61   if (C <= 0x017d && C % 2 == 1)
62     return C + 1;
63   // LATIN SMALL LETTER LONG S
64   if (C == 0x017f)
65     return 0x0073;
66   // LATIN CAPITAL LETTER B WITH HOOK
67   if (C == 0x0181)
68     return 0x0253;
69   if (C < 0x0182)
70     return C;
71   // 2 characters
72   if (C <= 0x0184)
73     return C | 1;
74   // LATIN CAPITAL LETTER OPEN O
75   if (C == 0x0186)
76     return 0x0254;
77   // LATIN CAPITAL LETTER C WITH HOOK
78   if (C == 0x0187)
79     return 0x0188;
80   if (C < 0x0189)
81     return C;
82   // 2 characters
83   if (C <= 0x018a)
84     return C + 205;
85   // LATIN CAPITAL LETTER D WITH TOPBAR
86   if (C == 0x018b)
87     return 0x018c;
88   // LATIN CAPITAL LETTER REVERSED E
89   if (C == 0x018e)
90     return 0x01dd;
91   // LATIN CAPITAL LETTER SCHWA
92   if (C == 0x018f)
93     return 0x0259;
94   // LATIN CAPITAL LETTER OPEN E
95   if (C == 0x0190)
96     return 0x025b;
97   // LATIN CAPITAL LETTER F WITH HOOK
98   if (C == 0x0191)
99     return 0x0192;
100   // LATIN CAPITAL LETTER G WITH HOOK
101   if (C == 0x0193)
102     return 0x0260;
103   // LATIN CAPITAL LETTER GAMMA
104   if (C == 0x0194)
105     return 0x0263;
106   // LATIN CAPITAL LETTER IOTA
107   if (C == 0x0196)
108     return 0x0269;
109   // LATIN CAPITAL LETTER I WITH STROKE
110   if (C == 0x0197)
111     return 0x0268;
112   // LATIN CAPITAL LETTER K WITH HOOK
113   if (C == 0x0198)
114     return 0x0199;
115   // LATIN CAPITAL LETTER TURNED M
116   if (C == 0x019c)
117     return 0x026f;
118   // LATIN CAPITAL LETTER N WITH LEFT HOOK
119   if (C == 0x019d)
120     return 0x0272;
121   // LATIN CAPITAL LETTER O WITH MIDDLE TILDE
122   if (C == 0x019f)
123     return 0x0275;
124   if (C < 0x01a0)
125     return C;
126   // 3 characters
127   if (C <= 0x01a4)
128     return C | 1;
129   // LATIN LETTER YR
130   if (C == 0x01a6)
131     return 0x0280;
132   // LATIN CAPITAL LETTER TONE TWO
133   if (C == 0x01a7)
134     return 0x01a8;
135   // LATIN CAPITAL LETTER ESH
136   if (C == 0x01a9)
137     return 0x0283;
138   // LATIN CAPITAL LETTER T WITH HOOK
139   if (C == 0x01ac)
140     return 0x01ad;
141   // LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
142   if (C == 0x01ae)
143     return 0x0288;
144   // LATIN CAPITAL LETTER U WITH HORN
145   if (C == 0x01af)
146     return 0x01b0;
147   if (C < 0x01b1)
148     return C;
149   // 2 characters
150   if (C <= 0x01b2)
151     return C + 217;
152   if (C < 0x01b3)
153     return C;
154   // 2 characters
155   if (C <= 0x01b5 && C % 2 == 1)
156     return C + 1;
157   // LATIN CAPITAL LETTER EZH
158   if (C == 0x01b7)
159     return 0x0292;
160   if (C < 0x01b8)
161     return C;
162   // 2 characters
163   if (C <= 0x01bc && C % 4 == 0)
164     return C + 1;
165   // LATIN CAPITAL LETTER DZ WITH CARON
166   if (C == 0x01c4)
167     return 0x01c6;
168   // LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
169   if (C == 0x01c5)
170     return 0x01c6;
171   // LATIN CAPITAL LETTER LJ
172   if (C == 0x01c7)
173     return 0x01c9;
174   // LATIN CAPITAL LETTER L WITH SMALL LETTER J
175   if (C == 0x01c8)
176     return 0x01c9;
177   // LATIN CAPITAL LETTER NJ
178   if (C == 0x01ca)
179     return 0x01cc;
180   if (C < 0x01cb)
181     return C;
182   // 9 characters
183   if (C <= 0x01db && C % 2 == 1)
184     return C + 1;
185   if (C < 0x01de)
186     return C;
187   // 9 characters
188   if (C <= 0x01ee)
189     return C | 1;
190   // LATIN CAPITAL LETTER DZ
191   if (C == 0x01f1)
192     return 0x01f3;
193   if (C < 0x01f2)
194     return C;
195   // 2 characters
196   if (C <= 0x01f4)
197     return C | 1;
198   // LATIN CAPITAL LETTER HWAIR
199   if (C == 0x01f6)
200     return 0x0195;
201   // LATIN CAPITAL LETTER WYNN
202   if (C == 0x01f7)
203     return 0x01bf;
204   if (C < 0x01f8)
205     return C;
206   // 20 characters
207   if (C <= 0x021e)
208     return C | 1;
209   // LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
210   if (C == 0x0220)
211     return 0x019e;
212   if (C < 0x0222)
213     return C;
214   // 9 characters
215   if (C <= 0x0232)
216     return C | 1;
217   // LATIN CAPITAL LETTER A WITH STROKE
218   if (C == 0x023a)
219     return 0x2c65;
220   // LATIN CAPITAL LETTER C WITH STROKE
221   if (C == 0x023b)
222     return 0x023c;
223   // LATIN CAPITAL LETTER L WITH BAR
224   if (C == 0x023d)
225     return 0x019a;
226   // LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
227   if (C == 0x023e)
228     return 0x2c66;
229   // LATIN CAPITAL LETTER GLOTTAL STOP
230   if (C == 0x0241)
231     return 0x0242;
232   // LATIN CAPITAL LETTER B WITH STROKE
233   if (C == 0x0243)
234     return 0x0180;
235   // LATIN CAPITAL LETTER U BAR
236   if (C == 0x0244)
237     return 0x0289;
238   // LATIN CAPITAL LETTER TURNED V
239   if (C == 0x0245)
240     return 0x028c;
241   if (C < 0x0246)
242     return C;
243   // 5 characters
244   if (C <= 0x024e)
245     return C | 1;
246   // COMBINING GREEK YPOGEGRAMMENI
247   if (C == 0x0345)
248     return 0x03b9;
249   if (C < 0x0370)
250     return C;
251   // 2 characters
252   if (C <= 0x0372)
253     return C | 1;
254   // GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
255   if (C == 0x0376)
256     return 0x0377;
257   // GREEK CAPITAL LETTER YOT
258   if (C == 0x037f)
259     return 0x03f3;
260   // GREEK CAPITAL LETTER ALPHA WITH TONOS
261   if (C == 0x0386)
262     return 0x03ac;
263   if (C < 0x0388)
264     return C;
265   // 3 characters
266   if (C <= 0x038a)
267     return C + 37;
268   // GREEK CAPITAL LETTER OMICRON WITH TONOS
269   if (C == 0x038c)
270     return 0x03cc;
271   if (C < 0x038e)
272     return C;
273   // 2 characters
274   if (C <= 0x038f)
275     return C + 63;
276   if (C < 0x0391)
277     return C;
278   // 17 characters
279   if (C <= 0x03a1)
280     return C + 32;
281   if (C < 0x03a3)
282     return C;
283   // 9 characters
284   if (C <= 0x03ab)
285     return C + 32;
286   // GREEK SMALL LETTER FINAL SIGMA
287   if (C == 0x03c2)
288     return 0x03c3;
289   // GREEK CAPITAL KAI SYMBOL
290   if (C == 0x03cf)
291     return 0x03d7;
292   // GREEK BETA SYMBOL
293   if (C == 0x03d0)
294     return 0x03b2;
295   // GREEK THETA SYMBOL
296   if (C == 0x03d1)
297     return 0x03b8;
298   // GREEK PHI SYMBOL
299   if (C == 0x03d5)
300     return 0x03c6;
301   // GREEK PI SYMBOL
302   if (C == 0x03d6)
303     return 0x03c0;
304   if (C < 0x03d8)
305     return C;
306   // 12 characters
307   if (C <= 0x03ee)
308     return C | 1;
309   // GREEK KAPPA SYMBOL
310   if (C == 0x03f0)
311     return 0x03ba;
312   // GREEK RHO SYMBOL
313   if (C == 0x03f1)
314     return 0x03c1;
315   // GREEK CAPITAL THETA SYMBOL
316   if (C == 0x03f4)
317     return 0x03b8;
318   // GREEK LUNATE EPSILON SYMBOL
319   if (C == 0x03f5)
320     return 0x03b5;
321   // GREEK CAPITAL LETTER SHO
322   if (C == 0x03f7)
323     return 0x03f8;
324   // GREEK CAPITAL LUNATE SIGMA SYMBOL
325   if (C == 0x03f9)
326     return 0x03f2;
327   // GREEK CAPITAL LETTER SAN
328   if (C == 0x03fa)
329     return 0x03fb;
330   if (C < 0x03fd)
331     return C;
332   // 3 characters
333   if (C <= 0x03ff)
334     return C + -130;
335   if (C < 0x0400)
336     return C;
337   // 16 characters
338   if (C <= 0x040f)
339     return C + 80;
340   if (C < 0x0410)
341     return C;
342   // 32 characters
343   if (C <= 0x042f)
344     return C + 32;
345   if (C < 0x0460)
346     return C;
347   // 17 characters
348   if (C <= 0x0480)
349     return C | 1;
350   if (C < 0x048a)
351     return C;
352   // 27 characters
353   if (C <= 0x04be)
354     return C | 1;
355   // CYRILLIC LETTER PALOCHKA
356   if (C == 0x04c0)
357     return 0x04cf;
358   if (C < 0x04c1)
359     return C;
360   // 7 characters
361   if (C <= 0x04cd && C % 2 == 1)
362     return C + 1;
363   if (C < 0x04d0)
364     return C;
365   // 48 characters
366   if (C <= 0x052e)
367     return C | 1;
368   if (C < 0x0531)
369     return C;
370   // 38 characters
371   if (C <= 0x0556)
372     return C + 48;
373   if (C < 0x10a0)
374     return C;
375   // 38 characters
376   if (C <= 0x10c5)
377     return C + 7264;
378   if (C < 0x10c7)
379     return C;
380   // 2 characters
381   if (C <= 0x10cd && C % 6 == 5)
382     return C + 7264;
383   if (C < 0x13f8)
384     return C;
385   // 6 characters
386   if (C <= 0x13fd)
387     return C + -8;
388   // CYRILLIC SMALL LETTER ROUNDED VE
389   if (C == 0x1c80)
390     return 0x0432;
391   // CYRILLIC SMALL LETTER LONG-LEGGED DE
392   if (C == 0x1c81)
393     return 0x0434;
394   // CYRILLIC SMALL LETTER NARROW O
395   if (C == 0x1c82)
396     return 0x043e;
397   if (C < 0x1c83)
398     return C;
399   // 2 characters
400   if (C <= 0x1c84)
401     return C + -6210;
402   // CYRILLIC SMALL LETTER THREE-LEGGED TE
403   if (C == 0x1c85)
404     return 0x0442;
405   // CYRILLIC SMALL LETTER TALL HARD SIGN
406   if (C == 0x1c86)
407     return 0x044a;
408   // CYRILLIC SMALL LETTER TALL YAT
409   if (C == 0x1c87)
410     return 0x0463;
411   // CYRILLIC SMALL LETTER UNBLENDED UK
412   if (C == 0x1c88)
413     return 0xa64b;
414   if (C < 0x1c90)
415     return C;
416   // 43 characters
417   if (C <= 0x1cba)
418     return C + -3008;
419   if (C < 0x1cbd)
420     return C;
421   // 3 characters
422   if (C <= 0x1cbf)
423     return C + -3008;
424   if (C < 0x1e00)
425     return C;
426   // 75 characters
427   if (C <= 0x1e94)
428     return C | 1;
429   // LATIN SMALL LETTER LONG S WITH DOT ABOVE
430   if (C == 0x1e9b)
431     return 0x1e61;
432   // LATIN CAPITAL LETTER SHARP S
433   if (C == 0x1e9e)
434     return 0x00df;
435   if (C < 0x1ea0)
436     return C;
437   // 48 characters
438   if (C <= 0x1efe)
439     return C | 1;
440   if (C < 0x1f08)
441     return C;
442   // 8 characters
443   if (C <= 0x1f0f)
444     return C + -8;
445   if (C < 0x1f18)
446     return C;
447   // 6 characters
448   if (C <= 0x1f1d)
449     return C + -8;
450   if (C < 0x1f28)
451     return C;
452   // 8 characters
453   if (C <= 0x1f2f)
454     return C + -8;
455   if (C < 0x1f38)
456     return C;
457   // 8 characters
458   if (C <= 0x1f3f)
459     return C + -8;
460   if (C < 0x1f48)
461     return C;
462   // 6 characters
463   if (C <= 0x1f4d)
464     return C + -8;
465   if (C < 0x1f59)
466     return C;
467   // 4 characters
468   if (C <= 0x1f5f && C % 2 == 1)
469     return C + -8;
470   if (C < 0x1f68)
471     return C;
472   // 8 characters
473   if (C <= 0x1f6f)
474     return C + -8;
475   if (C < 0x1f88)
476     return C;
477   // 8 characters
478   if (C <= 0x1f8f)
479     return C + -8;
480   if (C < 0x1f98)
481     return C;
482   // 8 characters
483   if (C <= 0x1f9f)
484     return C + -8;
485   if (C < 0x1fa8)
486     return C;
487   // 8 characters
488   if (C <= 0x1faf)
489     return C + -8;
490   if (C < 0x1fb8)
491     return C;
492   // 2 characters
493   if (C <= 0x1fb9)
494     return C + -8;
495   if (C < 0x1fba)
496     return C;
497   // 2 characters
498   if (C <= 0x1fbb)
499     return C + -74;
500   // GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
501   if (C == 0x1fbc)
502     return 0x1fb3;
503   // GREEK PROSGEGRAMMENI
504   if (C == 0x1fbe)
505     return 0x03b9;
506   if (C < 0x1fc8)
507     return C;
508   // 4 characters
509   if (C <= 0x1fcb)
510     return C + -86;
511   // GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
512   if (C == 0x1fcc)
513     return 0x1fc3;
514   // GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
515   if (C == 0x1fd3)
516     return 0x0390;
517   if (C < 0x1fd8)
518     return C;
519   // 2 characters
520   if (C <= 0x1fd9)
521     return C + -8;
522   if (C < 0x1fda)
523     return C;
524   // 2 characters
525   if (C <= 0x1fdb)
526     return C + -100;
527   // GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
528   if (C == 0x1fe3)
529     return 0x03b0;
530   if (C < 0x1fe8)
531     return C;
532   // 2 characters
533   if (C <= 0x1fe9)
534     return C + -8;
535   if (C < 0x1fea)
536     return C;
537   // 2 characters
538   if (C <= 0x1feb)
539     return C + -112;
540   // GREEK CAPITAL LETTER RHO WITH DASIA
541   if (C == 0x1fec)
542     return 0x1fe5;
543   if (C < 0x1ff8)
544     return C;
545   // 2 characters
546   if (C <= 0x1ff9)
547     return C + -128;
548   if (C < 0x1ffa)
549     return C;
550   // 2 characters
551   if (C <= 0x1ffb)
552     return C + -126;
553   // GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
554   if (C == 0x1ffc)
555     return 0x1ff3;
556   // OHM SIGN
557   if (C == 0x2126)
558     return 0x03c9;
559   // KELVIN SIGN
560   if (C == 0x212a)
561     return 0x006b;
562   // ANGSTROM SIGN
563   if (C == 0x212b)
564     return 0x00e5;
565   // TURNED CAPITAL F
566   if (C == 0x2132)
567     return 0x214e;
568   if (C < 0x2160)
569     return C;
570   // 16 characters
571   if (C <= 0x216f)
572     return C + 16;
573   // ROMAN NUMERAL REVERSED ONE HUNDRED
574   if (C == 0x2183)
575     return 0x2184;
576   if (C < 0x24b6)
577     return C;
578   // 26 characters
579   if (C <= 0x24cf)
580     return C + 26;
581   if (C < 0x2c00)
582     return C;
583   // 48 characters
584   if (C <= 0x2c2f)
585     return C + 48;
586   // LATIN CAPITAL LETTER L WITH DOUBLE BAR
587   if (C == 0x2c60)
588     return 0x2c61;
589   // LATIN CAPITAL LETTER L WITH MIDDLE TILDE
590   if (C == 0x2c62)
591     return 0x026b;
592   // LATIN CAPITAL LETTER P WITH STROKE
593   if (C == 0x2c63)
594     return 0x1d7d;
595   // LATIN CAPITAL LETTER R WITH TAIL
596   if (C == 0x2c64)
597     return 0x027d;
598   if (C < 0x2c67)
599     return C;
600   // 3 characters
601   if (C <= 0x2c6b && C % 2 == 1)
602     return C + 1;
603   // LATIN CAPITAL LETTER ALPHA
604   if (C == 0x2c6d)
605     return 0x0251;
606   // LATIN CAPITAL LETTER M WITH HOOK
607   if (C == 0x2c6e)
608     return 0x0271;
609   // LATIN CAPITAL LETTER TURNED A
610   if (C == 0x2c6f)
611     return 0x0250;
612   // LATIN CAPITAL LETTER TURNED ALPHA
613   if (C == 0x2c70)
614     return 0x0252;
615   if (C < 0x2c72)
616     return C;
617   // 2 characters
618   if (C <= 0x2c75 && C % 3 == 2)
619     return C + 1;
620   if (C < 0x2c7e)
621     return C;
622   // 2 characters
623   if (C <= 0x2c7f)
624     return C + -10815;
625   if (C < 0x2c80)
626     return C;
627   // 50 characters
628   if (C <= 0x2ce2)
629     return C | 1;
630   if (C < 0x2ceb)
631     return C;
632   // 2 characters
633   if (C <= 0x2ced && C % 2 == 1)
634     return C + 1;
635   if (C < 0x2cf2)
636     return C;
637   // 2 characters
638   if (C <= 0xa640 && C % 31054 == 11506)
639     return C + 1;
640   if (C < 0xa642)
641     return C;
642   // 22 characters
643   if (C <= 0xa66c)
644     return C | 1;
645   if (C < 0xa680)
646     return C;
647   // 14 characters
648   if (C <= 0xa69a)
649     return C | 1;
650   if (C < 0xa722)
651     return C;
652   // 7 characters
653   if (C <= 0xa72e)
654     return C | 1;
655   if (C < 0xa732)
656     return C;
657   // 31 characters
658   if (C <= 0xa76e)
659     return C | 1;
660   if (C < 0xa779)
661     return C;
662   // 2 characters
663   if (C <= 0xa77b && C % 2 == 1)
664     return C + 1;
665   // LATIN CAPITAL LETTER INSULAR G
666   if (C == 0xa77d)
667     return 0x1d79;
668   if (C < 0xa77e)
669     return C;
670   // 5 characters
671   if (C <= 0xa786)
672     return C | 1;
673   // LATIN CAPITAL LETTER SALTILLO
674   if (C == 0xa78b)
675     return 0xa78c;
676   // LATIN CAPITAL LETTER TURNED H
677   if (C == 0xa78d)
678     return 0x0265;
679   if (C < 0xa790)
680     return C;
681   // 2 characters
682   if (C <= 0xa792)
683     return C | 1;
684   if (C < 0xa796)
685     return C;
686   // 10 characters
687   if (C <= 0xa7a8)
688     return C | 1;
689   // LATIN CAPITAL LETTER H WITH HOOK
690   if (C == 0xa7aa)
691     return 0x0266;
692   // LATIN CAPITAL LETTER REVERSED OPEN E
693   if (C == 0xa7ab)
694     return 0x025c;
695   // LATIN CAPITAL LETTER SCRIPT G
696   if (C == 0xa7ac)
697     return 0x0261;
698   // LATIN CAPITAL LETTER L WITH BELT
699   if (C == 0xa7ad)
700     return 0x026c;
701   // LATIN CAPITAL LETTER SMALL CAPITAL I
702   if (C == 0xa7ae)
703     return 0x026a;
704   // LATIN CAPITAL LETTER TURNED K
705   if (C == 0xa7b0)
706     return 0x029e;
707   // LATIN CAPITAL LETTER TURNED T
708   if (C == 0xa7b1)
709     return 0x0287;
710   // LATIN CAPITAL LETTER J WITH CROSSED-TAIL
711   if (C == 0xa7b2)
712     return 0x029d;
713   // LATIN CAPITAL LETTER CHI
714   if (C == 0xa7b3)
715     return 0xab53;
716   if (C < 0xa7b4)
717     return C;
718   // 8 characters
719   if (C <= 0xa7c2)
720     return C | 1;
721   // LATIN CAPITAL LETTER C WITH PALATAL HOOK
722   if (C == 0xa7c4)
723     return 0xa794;
724   // LATIN CAPITAL LETTER S WITH HOOK
725   if (C == 0xa7c5)
726     return 0x0282;
727   // LATIN CAPITAL LETTER Z WITH PALATAL HOOK
728   if (C == 0xa7c6)
729     return 0x1d8e;
730   if (C < 0xa7c7)
731     return C;
732   // 2 characters
733   if (C <= 0xa7c9 && C % 2 == 1)
734     return C + 1;
735   if (C < 0xa7d0)
736     return C;
737   // 2 characters
738   if (C <= 0xa7d6 && C % 6 == 0)
739     return C + 1;
740   if (C < 0xa7d8)
741     return C;
742   // 2 characters
743   if (C <= 0xa7f5 && C % 29 == 19)
744     return C + 1;
745   if (C < 0xab70)
746     return C;
747   // 80 characters
748   if (C <= 0xabbf)
749     return C + -38864;
750   // LATIN SMALL LIGATURE LONG S T
751   if (C == 0xfb05)
752     return 0xfb06;
753   if (C < 0xff21)
754     return C;
755   // 26 characters
756   if (C <= 0xff3a)
757     return C + 32;
758   if (C < 0x10400)
759     return C;
760   // 40 characters
761   if (C <= 0x10427)
762     return C + 40;
763   if (C < 0x104b0)
764     return C;
765   // 36 characters
766   if (C <= 0x104d3)
767     return C + 40;
768   if (C < 0x10570)
769     return C;
770   // 11 characters
771   if (C <= 0x1057a)
772     return C + 39;
773   if (C < 0x1057c)
774     return C;
775   // 15 characters
776   if (C <= 0x1058a)
777     return C + 39;
778   if (C < 0x1058c)
779     return C;
780   // 7 characters
781   if (C <= 0x10592)
782     return C + 39;
783   if (C < 0x10594)
784     return C;
785   // 2 characters
786   if (C <= 0x10595)
787     return C + 39;
788   if (C < 0x10c80)
789     return C;
790   // 51 characters
791   if (C <= 0x10cb2)
792     return C + 64;
793   if (C < 0x118a0)
794     return C;
795   // 32 characters
796   if (C <= 0x118bf)
797     return C + 32;
798   if (C < 0x16e40)
799     return C;
800   // 32 characters
801   if (C <= 0x16e5f)
802     return C + 32;
803   if (C < 0x1e900)
804     return C;
805   // 34 characters
806   if (C <= 0x1e921)
807     return C + 34;
808 
809   return C;
810 }
811