Individual characters.


§1. Character classes.

inchar32_t Characters::tolower(inchar32_t c) {
    return (inchar32_t) tolower((int) c);
}
inchar32_t Characters::toupper(inchar32_t c) {
    return (inchar32_t) toupper((int) c);
}
int Characters::isalpha(inchar32_t c) {
    return isalpha((int) c);
}
int Characters::isdigit(inchar32_t c) {
    return isdigit((int) c);
}
int Characters::isupper(inchar32_t c) {
    return isupper((int) c);
}
int Characters::islower(inchar32_t c) {
    return islower((int) c);
}
int Characters::isalnum(inchar32_t c) {
    return isalnum((int) c);
}
int Characters::iscntrl(inchar32_t c) {
    return (c < 32);
}
int Characters::vowel(inchar32_t c) {
    if ((c == 'a') || (c == 'e') || (c == 'i') || (c == 'o') || (c == 'u')) return TRUE;
    return FALSE;
}

§2. White space classes:

int Characters::is_space_or_tab(inchar32_t c) {
    if ((c == ' ') || (c == '\t')) return TRUE;
    return FALSE;
}
int Characters::is_whitespace(inchar32_t c) {
    if ((c == ' ') || (c == '\t') || (c == '\n')) return TRUE;
    return FALSE;
}

§3. These are all the characters which would come out as whitespace in the sense of the Treaty of Babel rules on leading and trailing spaces in iFiction records.

int Characters::is_babel_whitespace(inchar32_t c) {
    if ((c == ' ') || (c == '\t') || (c == '\x0a')
        || (c == '\x0d') || (c == NEWLINE_IN_STRING)) return TRUE;
    return FALSE;
}

§4. The following covers ASCII white-space characters, and beyond those all non-ASCII Unicode characters of category Zs.

int Characters::is_Unicode_whitespace(inchar32_t c) {
    if (c == 0x0009) return TRUE;
    if (c == 0x000A) return TRUE;
    if (c == 0x000C) return TRUE;
    if (c == 0x000D) return TRUE;
    if (c == 0x0020) return TRUE;
    if (c == 0x00A0) return TRUE;  NO-BREAK SPACE
    if (c == 0x1680) return TRUE;  OGHAM SPACE MARK
    if (c == 0x2000) return TRUE;  EN QUAD
    if (c == 0x2001) return TRUE;  EM QUAD
    if (c == 0x2002) return TRUE;  EN SPACE
    if (c == 0x2003) return TRUE;  EM SPACE
    if (c == 0x2004) return TRUE;  THREE-PER-EM SPACE
    if (c == 0x2005) return TRUE;  FOUR-PER-EM SPACE
    if (c == 0x2006) return TRUE;  SIX-PER-EM SPACE
    if (c == 0x2007) return TRUE;  FIGURE SPACE
    if (c == 0x2008) return TRUE;  PUNCTUATION SPACE
    if (c == 0x2009) return TRUE;  THIN SPACE
    if (c == 0x200A) return TRUE;  HAIR SPACE
    if (c == 0x202F) return TRUE;  NARROW NO-BREAK SPACE
    if (c == 0x205F) return TRUE;  MEDIUM MATHEMATICAL SPACE
    if (c == 0x3000) return TRUE;  IDEOGRAPHIC SPACE
    return FALSE;
}

§5. ASCII-only punctuation characters, using the convenient definition of "ASCII punctuation" from the CommonMark standard:

int Characters::is_ASCII_punctuation(inchar32_t c) {
    if ((c >= 0x0021) && (c <= 0x002F)) return TRUE;
    if ((c >= 0x003A) && (c <= 0x0040)) return TRUE;
    if ((c >= 0x005B) && (c <= 0x0060)) return TRUE;
    if ((c >= 0x007B) && (c <= 0x007E)) return TRUE;
    return FALSE;
}

§6. This extends ASCII punctuation by adding all Unicode characters of category Pc, Pd, Pe, Pf, Pi, Po, or Ps. After all, we wouldn't want to get old Assyrian cuneiform spacing indicators wrong, would we? Or the Imperial Aramaic section sign?

int Characters::is_Unicode_punctuation(inchar32_t c) {
    if (c < 0x80) return Characters::is_ASCII_punctuation(c);
    if (c == 0x00A1) return TRUE;  INVERTED EXCLAMATION MARK
    if (c == 0x00A7) return TRUE;  SECTION SIGN
    if (c == 0x00AB) return TRUE;  LEFT-POINTING DOUBLE ANGLE QUOTATION MARK
    if (c == 0x00B6) return TRUE;  PILCROW SIGN
    if (c == 0x00B7) return TRUE;  MIDDLE DOT
    if (c == 0x00BB) return TRUE;  RIGHT-POINTING DOUBLE ANGLE QUOTATION MARK
    if (c == 0x00BF) return TRUE;  INVERTED QUESTION MARK
    if (c < 0x0100) return FALSE;
    if (c == 0x037E) return TRUE;  GREEK QUESTION MARK
    if (c == 0x0387) return TRUE;  GREEK ANO TELEIA
    if (c == 0x055A) return TRUE;  ARMENIAN APOSTROPHE
    if (c == 0x055B) return TRUE;  ARMENIAN EMPHASIS MARK
    if (c == 0x055C) return TRUE;  ARMENIAN EXCLAMATION MARK
    if (c == 0x055D) return TRUE;  ARMENIAN COMMA
    if (c == 0x055E) return TRUE;  ARMENIAN QUESTION MARK
    if (c == 0x055F) return TRUE;  ARMENIAN ABBREVIATION MARK
    if (c == 0x0589) return TRUE;  ARMENIAN FULL STOP
    if (c == 0x058A) return TRUE;  ARMENIAN HYPHEN
    if (c == 0x05BE) return TRUE;  HEBREW PUNCTUATION MAQAF
    if (c == 0x05C0) return TRUE;  HEBREW PUNCTUATION PASEQ
    if (c == 0x05C3) return TRUE;  HEBREW PUNCTUATION SOF PASUQ
    if (c == 0x05C6) return TRUE;  HEBREW PUNCTUATION NUN HAFUKHA
    if (c == 0x05F3) return TRUE;  HEBREW PUNCTUATION GERESH
    if (c == 0x05F4) return TRUE;  HEBREW PUNCTUATION GERSHAYIM
    if (c == 0x0609) return TRUE;  ARABIC-INDIC PER MILLE SIGN
    if (c == 0x060A) return TRUE;  ARABIC-INDIC PER TEN THOUSAND SIGN
    if (c == 0x060C) return TRUE;  ARABIC COMMA
    if (c == 0x060D) return TRUE;  ARABIC DATE SEPARATOR
    if (c == 0x061B) return TRUE;  ARABIC SEMICOLON
    if (c == 0x061D) return TRUE;  ARABIC END OF TEXT MARK
    if (c == 0x061E) return TRUE;  ARABIC TRIPLE DOT PUNCTUATION MARK
    if (c == 0x061F) return TRUE;  ARABIC QUESTION MARK
    if (c == 0x066A) return TRUE;  ARABIC PERCENT SIGN
    if (c == 0x066B) return TRUE;  ARABIC DECIMAL SEPARATOR
    if (c == 0x066C) return TRUE;  ARABIC THOUSANDS SEPARATOR
    if (c == 0x066D) return TRUE;  ARABIC FIVE POINTED STAR
    if (c == 0x06D4) return TRUE;  ARABIC FULL STOP
    if (c == 0x0700) return TRUE;  SYRIAC END OF PARAGRAPH
    if (c == 0x0701) return TRUE;  SYRIAC SUPRALINEAR FULL STOP
    if (c == 0x0702) return TRUE;  SYRIAC SUBLINEAR FULL STOP
    if (c == 0x0703) return TRUE;  SYRIAC SUPRALINEAR COLON
    if (c == 0x0704) return TRUE;  SYRIAC SUBLINEAR COLON
    if (c == 0x0705) return TRUE;  SYRIAC HORIZONTAL COLON
    if (c == 0x0706) return TRUE;  SYRIAC COLON SKEWED LEFT
    if (c == 0x0707) return TRUE;  SYRIAC COLON SKEWED RIGHT
    if (c == 0x0708) return TRUE;  SYRIAC SUPRALINEAR COLON SKEWED LEFT
    if (c == 0x0709) return TRUE;  SYRIAC SUBLINEAR COLON SKEWED RIGHT
    if (c == 0x070A) return TRUE;  SYRIAC CONTRACTION
    if (c == 0x070B) return TRUE;  SYRIAC HARKLEAN OBELUS
    if (c == 0x070C) return TRUE;  SYRIAC HARKLEAN METOBELUS
    if (c == 0x070D) return TRUE;  SYRIAC HARKLEAN ASTERISCUS
    if (c == 0x07F7) return TRUE;  NKO SYMBOL GBAKURUNEN
    if (c == 0x07F8) return TRUE;  NKO COMMA
    if (c == 0x07F9) return TRUE;  NKO EXCLAMATION MARK
    if (c == 0x0830) return TRUE;  SAMARITAN PUNCTUATION NEQUDAA
    if (c == 0x0831) return TRUE;  SAMARITAN PUNCTUATION AFSAAQ
    if (c == 0x0832) return TRUE;  SAMARITAN PUNCTUATION ANGED
    if (c == 0x0833) return TRUE;  SAMARITAN PUNCTUATION BAU
    if (c == 0x0834) return TRUE;  SAMARITAN PUNCTUATION ATMAAU
    if (c == 0x0835) return TRUE;  SAMARITAN PUNCTUATION SHIYYAALAA
    if (c == 0x0836) return TRUE;  SAMARITAN ABBREVIATION MARK
    if (c == 0x0837) return TRUE;  SAMARITAN PUNCTUATION MELODIC QITSA
    if (c == 0x0838) return TRUE;  SAMARITAN PUNCTUATION ZIQAA
    if (c == 0x0839) return TRUE;  SAMARITAN PUNCTUATION QITSA
    if (c == 0x083A) return TRUE;  SAMARITAN PUNCTUATION ZAEF
    if (c == 0x083B) return TRUE;  SAMARITAN PUNCTUATION TURU
    if (c == 0x083C) return TRUE;  SAMARITAN PUNCTUATION ARKAANU
    if (c == 0x083D) return TRUE;  SAMARITAN PUNCTUATION SOF MASHFAAT
    if (c == 0x083E) return TRUE;  SAMARITAN PUNCTUATION ANNAAU
    if (c == 0x085E) return TRUE;  MANDAIC PUNCTUATION
    if (c == 0x0964) return TRUE;  DEVANAGARI DANDA
    if (c == 0x0965) return TRUE;  DEVANAGARI DOUBLE DANDA
    if (c == 0x0970) return TRUE;  DEVANAGARI ABBREVIATION SIGN
    if (c == 0x09FD) return TRUE;  BENGALI ABBREVIATION SIGN
    if (c == 0x0A76) return TRUE;  GURMUKHI ABBREVIATION SIGN
    if (c == 0x0AF0) return TRUE;  GUJARATI ABBREVIATION SIGN
    if (c == 0x0C77) return TRUE;  TELUGU SIGN SIDDHAM
    if (c == 0x0C84) return TRUE;  KANNADA SIGN SIDDHAM
    if (c == 0x0DF4) return TRUE;  SINHALA PUNCTUATION KUNDDALIYA
    if (c == 0x0E4F) return TRUE;  THAI CHARACTER FONGMAN
    if (c == 0x0E5A) return TRUE;  THAI CHARACTER ANGKHANKHU
    if (c == 0x0E5B) return TRUE;  THAI CHARACTER KHOMUT
    if (c == 0x0F04) return TRUE;  TIBETAN MARK INITIAL YIG MGO MDUN MA
    if (c == 0x0F05) return TRUE;  TIBETAN MARK CLOSING YIG MGO SGAB MA
    if (c == 0x0F06) return TRUE;  TIBETAN MARK CARET YIG MGO PHUR SHAD MA
    if (c == 0x0F07) return TRUE;  TIBETAN MARK YIG MGO TSHEG SHAD MA
    if (c == 0x0F08) return TRUE;  TIBETAN MARK SBRUL SHAD
    if (c == 0x0F09) return TRUE;  TIBETAN MARK BSKUR YIG MGO
    if (c == 0x0F0A) return TRUE;  TIBETAN MARK BKA- SHOG YIG MGO
    if (c == 0x0F0B) return TRUE;  TIBETAN MARK INTERSYLLABIC TSHEG
    if (c == 0x0F0C) return TRUE;  TIBETAN MARK DELIMITER TSHEG BSTAR
    if (c == 0x0F0D) return TRUE;  TIBETAN MARK SHAD
    if (c == 0x0F0E) return TRUE;  TIBETAN MARK NYIS SHAD
    if (c == 0x0F0F) return TRUE;  TIBETAN MARK TSHEG SHAD
    if (c == 0x0F10) return TRUE;  TIBETAN MARK NYIS TSHEG SHAD
    if (c == 0x0F11) return TRUE;  TIBETAN MARK RIN CHEN SPUNGS SHAD
    if (c == 0x0F12) return TRUE;  TIBETAN MARK RGYA GRAM SHAD
    if (c == 0x0F14) return TRUE;  TIBETAN MARK GTER TSHEG
    if (c == 0x0F3A) return TRUE;  TIBETAN MARK GUG RTAGS GYON
    if (c == 0x0F3B) return TRUE;  TIBETAN MARK GUG RTAGS GYAS
    if (c == 0x0F3C) return TRUE;  TIBETAN MARK ANG KHANG GYON
    if (c == 0x0F3D) return TRUE;  TIBETAN MARK ANG KHANG GYAS
    if (c == 0x0F85) return TRUE;  TIBETAN MARK PALUTA
    if (c == 0x0FD0) return TRUE;  TIBETAN MARK BSKA- SHOG GI MGO RGYAN
    if (c == 0x0FD1) return TRUE;  TIBETAN MARK MNYAM YIG GI MGO RGYAN
    if (c == 0x0FD2) return TRUE;  TIBETAN MARK NYIS TSHEG
    if (c == 0x0FD3) return TRUE;  TIBETAN MARK INITIAL BRDA RNYING YIG MGO MDUN MA
    if (c == 0x0FD4) return TRUE;  TIBETAN MARK CLOSING BRDA RNYING YIG MGO SGAB MA
    if (c == 0x0FD9) return TRUE;  TIBETAN MARK LEADING MCHAN RTAGS
    if (c == 0x0FDA) return TRUE;  TIBETAN MARK TRAILING MCHAN RTAGS
    if (c < 0x01000) return FALSE;
    if (c == 0x104A) return TRUE;  MYANMAR SIGN LITTLE SECTION
    if (c == 0x104B) return TRUE;  MYANMAR SIGN SECTION
    if (c == 0x104C) return TRUE;  MYANMAR SYMBOL LOCATIVE
    if (c == 0x104D) return TRUE;  MYANMAR SYMBOL COMPLETED
    if (c == 0x104E) return TRUE;  MYANMAR SYMBOL AFOREMENTIONED
    if (c == 0x104F) return TRUE;  MYANMAR SYMBOL GENITIVE
    if (c == 0x10FB) return TRUE;  GEORGIAN PARAGRAPH SEPARATOR
    if (c == 0x1360) return TRUE;  ETHIOPIC SECTION MARK
    if (c == 0x1361) return TRUE;  ETHIOPIC WORDSPACE
    if (c == 0x1362) return TRUE;  ETHIOPIC FULL STOP
    if (c == 0x1363) return TRUE;  ETHIOPIC COMMA
    if (c == 0x1364) return TRUE;  ETHIOPIC SEMICOLON
    if (c == 0x1365) return TRUE;  ETHIOPIC COLON
    if (c == 0x1366) return TRUE;  ETHIOPIC PREFACE COLON
    if (c == 0x1367) return TRUE;  ETHIOPIC QUESTION MARK
    if (c == 0x1368) return TRUE;  ETHIOPIC PARAGRAPH SEPARATOR
    if (c == 0x1400) return TRUE;  CANADIAN SYLLABICS HYPHEN
    if (c == 0x166E) return TRUE;  CANADIAN SYLLABICS FULL STOP
    if (c == 0x169B) return TRUE;  OGHAM FEATHER MARK
    if (c == 0x169C) return TRUE;  OGHAM REVERSED FEATHER MARK
    if (c == 0x16EB) return TRUE;  RUNIC SINGLE PUNCTUATION
    if (c == 0x16EC) return TRUE;  RUNIC MULTIPLE PUNCTUATION
    if (c == 0x16ED) return TRUE;  RUNIC CROSS PUNCTUATION
    if (c == 0x1735) return TRUE;  PHILIPPINE SINGLE PUNCTUATION
    if (c == 0x1736) return TRUE;  PHILIPPINE DOUBLE PUNCTUATION
    if (c == 0x17D4) return TRUE;  KHMER SIGN KHAN
    if (c == 0x17D5) return TRUE;  KHMER SIGN BARIYOOSAN
    if (c == 0x17D6) return TRUE;  KHMER SIGN CAMNUC PII KUUH
    if (c == 0x17D8) return TRUE;  KHMER SIGN BEYYAL
    if (c == 0x17D9) return TRUE;  KHMER SIGN PHNAEK MUAN
    if (c == 0x17DA) return TRUE;  KHMER SIGN KOOMUUT
    if (c == 0x1800) return TRUE;  MONGOLIAN BIRGA
    if (c == 0x1801) return TRUE;  MONGOLIAN ELLIPSIS
    if (c == 0x1802) return TRUE;  MONGOLIAN COMMA
    if (c == 0x1803) return TRUE;  MONGOLIAN FULL STOP
    if (c == 0x1804) return TRUE;  MONGOLIAN COLON
    if (c == 0x1805) return TRUE;  MONGOLIAN FOUR DOTS
    if (c == 0x1806) return TRUE;  MONGOLIAN TODO SOFT HYPHEN
    if (c == 0x1807) return TRUE;  MONGOLIAN SIBE SYLLABLE BOUNDARY MARKER
    if (c == 0x1808) return TRUE;  MONGOLIAN MANCHU COMMA
    if (c == 0x1809) return TRUE;  MONGOLIAN MANCHU FULL STOP
    if (c == 0x180A) return TRUE;  MONGOLIAN NIRUGU
    if (c == 0x1944) return TRUE;  LIMBU EXCLAMATION MARK
    if (c == 0x1945) return TRUE;  LIMBU QUESTION MARK
    if (c == 0x1A1E) return TRUE;  BUGINESE PALLAWA
    if (c == 0x1A1F) return TRUE;  BUGINESE END OF SECTION
    if (c == 0x1AA0) return TRUE;  TAI THAM SIGN WIANG
    if (c == 0x1AA1) return TRUE;  TAI THAM SIGN WIANGWAAK
    if (c == 0x1AA2) return TRUE;  TAI THAM SIGN SAWAN
    if (c == 0x1AA3) return TRUE;  TAI THAM SIGN KEOW
    if (c == 0x1AA4) return TRUE;  TAI THAM SIGN HOY
    if (c == 0x1AA5) return TRUE;  TAI THAM SIGN DOKMAI
    if (c == 0x1AA6) return TRUE;  TAI THAM SIGN REVERSED ROTATED RANA
    if (c == 0x1AA8) return TRUE;  TAI THAM SIGN KAAN
    if (c == 0x1AA9) return TRUE;  TAI THAM SIGN KAANKUU
    if (c == 0x1AAA) return TRUE;  TAI THAM SIGN SATKAAN
    if (c == 0x1AAB) return TRUE;  TAI THAM SIGN SATKAANKUU
    if (c == 0x1AAC) return TRUE;  TAI THAM SIGN HANG
    if (c == 0x1AAD) return TRUE;  TAI THAM SIGN CAANG
    if (c == 0x1B5A) return TRUE;  BALINESE PANTI
    if (c == 0x1B5B) return TRUE;  BALINESE PAMADA
    if (c == 0x1B5C) return TRUE;  BALINESE WINDU
    if (c == 0x1B5D) return TRUE;  BALINESE CARIK PAMUNGKAH
    if (c == 0x1B5E) return TRUE;  BALINESE CARIK SIKI
    if (c == 0x1B5F) return TRUE;  BALINESE CARIK PAREREN
    if (c == 0x1B60) return TRUE;  BALINESE PAMENENG
    if (c == 0x1B7D) return TRUE;  BALINESE PANTI LANTANG
    if (c == 0x1B7E) return TRUE;  BALINESE PAMADA LANTANG
    if (c == 0x1BFC) return TRUE;  BATAK SYMBOL BINDU NA METEK
    if (c == 0x1BFD) return TRUE;  BATAK SYMBOL BINDU PINARBORAS
    if (c == 0x1BFE) return TRUE;  BATAK SYMBOL BINDU JUDUL
    if (c == 0x1BFF) return TRUE;  BATAK SYMBOL BINDU PANGOLAT
    if (c == 0x1C3B) return TRUE;  LEPCHA PUNCTUATION TA-ROL
    if (c == 0x1C3C) return TRUE;  LEPCHA PUNCTUATION NYET THYOOM TA-ROL
    if (c == 0x1C3D) return TRUE;  LEPCHA PUNCTUATION CER-WA
    if (c == 0x1C3E) return TRUE;  LEPCHA PUNCTUATION TSHOOK CER-WA
    if (c == 0x1C3F) return TRUE;  LEPCHA PUNCTUATION TSHOOK
    if (c == 0x1C7E) return TRUE;  OL CHIKI PUNCTUATION MUCAAD
    if (c == 0x1C7F) return TRUE;  OL CHIKI PUNCTUATION DOUBLE MUCAAD
    if (c == 0x1CC0) return TRUE;  SUNDANESE PUNCTUATION BINDU SURYA
    if (c == 0x1CC1) return TRUE;  SUNDANESE PUNCTUATION BINDU PANGLONG
    if (c == 0x1CC2) return TRUE;  SUNDANESE PUNCTUATION BINDU PURNAMA
    if (c == 0x1CC3) return TRUE;  SUNDANESE PUNCTUATION BINDU CAKRA
    if (c == 0x1CC4) return TRUE;  SUNDANESE PUNCTUATION BINDU LEU SATANGA
    if (c == 0x1CC5) return TRUE;  SUNDANESE PUNCTUATION BINDU KA SATANGA
    if (c == 0x1CC6) return TRUE;  SUNDANESE PUNCTUATION BINDU DA SATANGA
    if (c == 0x1CC7) return TRUE;  SUNDANESE PUNCTUATION BINDU BA SATANGA
    if (c == 0x1CD3) return TRUE;  VEDIC SIGN NIHSHVASA
    if (c == 0x2010) return TRUE;  HYPHEN
    if (c == 0x2011) return TRUE;  NON-BREAKING HYPHEN
    if (c == 0x2012) return TRUE;  FIGURE DASH
    if (c == 0x2013) return TRUE;  EN DASH
    if (c == 0x2014) return TRUE;  EM DASH
    if (c == 0x2015) return TRUE;  HORIZONTAL BAR
    if (c == 0x2016) return TRUE;  DOUBLE VERTICAL LINE
    if (c == 0x2017) return TRUE;  DOUBLE LOW LINE
    if (c == 0x2018) return TRUE;  LEFT SINGLE QUOTATION MARK
    if (c == 0x2019) return TRUE;  RIGHT SINGLE QUOTATION MARK
    if (c == 0x201A) return TRUE;  SINGLE LOW-9 QUOTATION MARK
    if (c == 0x201B) return TRUE;  SINGLE HIGH-REVERSED-9 QUOTATION MARK
    if (c == 0x201C) return TRUE;  LEFT DOUBLE QUOTATION MARK
    if (c == 0x201D) return TRUE;  RIGHT DOUBLE QUOTATION MARK
    if (c == 0x201E) return TRUE;  DOUBLE LOW-9 QUOTATION MARK
    if (c == 0x201F) return TRUE;  DOUBLE HIGH-REVERSED-9 QUOTATION MARK
    if (c == 0x2020) return TRUE;  DAGGER
    if (c == 0x2021) return TRUE;  DOUBLE DAGGER
    if (c == 0x2022) return TRUE;  BULLET
    if (c == 0x2023) return TRUE;  TRIANGULAR BULLET
    if (c == 0x2024) return TRUE;  ONE DOT LEADER
    if (c == 0x2025) return TRUE;  TWO DOT LEADER
    if (c == 0x2026) return TRUE;  HORIZONTAL ELLIPSIS
    if (c == 0x2027) return TRUE;  HYPHENATION POINT
    if (c == 0x2030) return TRUE;  PER MILLE SIGN
    if (c == 0x2031) return TRUE;  PER TEN THOUSAND SIGN
    if (c == 0x2032) return TRUE;  PRIME
    if (c == 0x2033) return TRUE;  DOUBLE PRIME
    if (c == 0x2034) return TRUE;  TRIPLE PRIME
    if (c == 0x2035) return TRUE;  REVERSED PRIME
    if (c == 0x2036) return TRUE;  REVERSED DOUBLE PRIME
    if (c == 0x2037) return TRUE;  REVERSED TRIPLE PRIME
    if (c == 0x2038) return TRUE;  CARET
    if (c == 0x2039) return TRUE;  SINGLE LEFT-POINTING ANGLE QUOTATION MARK
    if (c == 0x203A) return TRUE;  SINGLE RIGHT-POINTING ANGLE QUOTATION MARK
    if (c == 0x203B) return TRUE;  REFERENCE MARK
    if (c == 0x203C) return TRUE;  DOUBLE EXCLAMATION MARK
    if (c == 0x203D) return TRUE;  INTERROBANG
    if (c == 0x203E) return TRUE;  OVERLINE
    if (c == 0x203F) return TRUE;  UNDERTIE
    if (c == 0x2040) return TRUE;  CHARACTER TIE
    if (c == 0x2041) return TRUE;  CARET INSERTION POINT
    if (c == 0x2042) return TRUE;  ASTERISM
    if (c == 0x2043) return TRUE;  HYPHEN BULLET
    if (c == 0x2045) return TRUE;  LEFT SQUARE BRACKET WITH QUILL
    if (c == 0x2046) return TRUE;  RIGHT SQUARE BRACKET WITH QUILL
    if (c == 0x2047) return TRUE;  DOUBLE QUESTION MARK
    if (c == 0x2048) return TRUE;  QUESTION EXCLAMATION MARK
    if (c == 0x2049) return TRUE;  EXCLAMATION QUESTION MARK
    if (c == 0x204A) return TRUE;  TIRONIAN SIGN ET
    if (c == 0x204B) return TRUE;  REVERSED PILCROW SIGN
    if (c == 0x204C) return TRUE;  BLACK LEFTWARDS BULLET
    if (c == 0x204D) return TRUE;  BLACK RIGHTWARDS BULLET
    if (c == 0x204E) return TRUE;  LOW ASTERISK
    if (c == 0x204F) return TRUE;  REVERSED SEMICOLON
    if (c == 0x2050) return TRUE;  CLOSE UP
    if (c == 0x2051) return TRUE;  TWO ASTERISKS ALIGNED VERTICALLY
    if (c == 0x2053) return TRUE;  SWUNG DASH
    if (c == 0x2054) return TRUE;  INVERTED UNDERTIE
    if (c == 0x2055) return TRUE;  FLOWER PUNCTUATION MARK
    if (c == 0x2056) return TRUE;  THREE DOT PUNCTUATION
    if (c == 0x2057) return TRUE;  QUADRUPLE PRIME
    if (c == 0x2058) return TRUE;  FOUR DOT PUNCTUATION
    if (c == 0x2059) return TRUE;  FIVE DOT PUNCTUATION
    if (c == 0x205A) return TRUE;  TWO DOT PUNCTUATION
    if (c == 0x205B) return TRUE;  FOUR DOT MARK
    if (c == 0x205C) return TRUE;  DOTTED CROSS
    if (c == 0x205D) return TRUE;  TRICOLON
    if (c == 0x205E) return TRUE;  VERTICAL FOUR DOTS
    if (c == 0x207D) return TRUE;  SUPERSCRIPT LEFT PARENTHESIS
    if (c == 0x207E) return TRUE;  SUPERSCRIPT RIGHT PARENTHESIS
    if (c == 0x208D) return TRUE;  SUBSCRIPT LEFT PARENTHESIS
    if (c == 0x208E) return TRUE;  SUBSCRIPT RIGHT PARENTHESIS
    if (c == 0x2308) return TRUE;  LEFT CEILING
    if (c == 0x2309) return TRUE;  RIGHT CEILING
    if (c == 0x230A) return TRUE;  LEFT FLOOR
    if (c == 0x230B) return TRUE;  RIGHT FLOOR
    if (c == 0x2329) return TRUE;  LEFT-POINTING ANGLE BRACKET
    if (c == 0x232A) return TRUE;  RIGHT-POINTING ANGLE BRACKET
    if (c == 0x2768) return TRUE;  MEDIUM LEFT PARENTHESIS ORNAMENT
    if (c == 0x2769) return TRUE;  MEDIUM RIGHT PARENTHESIS ORNAMENT
    if (c == 0x276A) return TRUE;  MEDIUM FLATTENED LEFT PARENTHESIS ORNAMENT
    if (c == 0x276B) return TRUE;  MEDIUM FLATTENED RIGHT PARENTHESIS ORNAMENT
    if (c == 0x276C) return TRUE;  MEDIUM LEFT-POINTING ANGLE BRACKET ORNAMENT
    if (c == 0x276D) return TRUE;  MEDIUM RIGHT-POINTING ANGLE BRACKET ORNAMENT
    if (c == 0x276E) return TRUE;  HEAVY LEFT-POINTING ANGLE QUOTATION MARK ORNAMENT
    if (c == 0x276F) return TRUE;  HEAVY RIGHT-POINTING ANGLE QUOTATION MARK ORNAMENT
    if (c == 0x2770) return TRUE;  HEAVY LEFT-POINTING ANGLE BRACKET ORNAMENT
    if (c == 0x2771) return TRUE;  HEAVY RIGHT-POINTING ANGLE BRACKET ORNAMENT
    if (c == 0x2772) return TRUE;  LIGHT LEFT TORTOISE SHELL BRACKET ORNAMENT
    if (c == 0x2773) return TRUE;  LIGHT RIGHT TORTOISE SHELL BRACKET ORNAMENT
    if (c == 0x2774) return TRUE;  MEDIUM LEFT CURLY BRACKET ORNAMENT
    if (c == 0x2775) return TRUE;  MEDIUM RIGHT CURLY BRACKET ORNAMENT
    if (c == 0x27C5) return TRUE;  LEFT S-SHAPED BAG DELIMITER
    if (c == 0x27C6) return TRUE;  RIGHT S-SHAPED BAG DELIMITER
    if (c == 0x27E6) return TRUE;  MATHEMATICAL LEFT WHITE SQUARE BRACKET
    if (c == 0x27E7) return TRUE;  MATHEMATICAL RIGHT WHITE SQUARE BRACKET
    if (c == 0x27E8) return TRUE;  MATHEMATICAL LEFT ANGLE BRACKET
    if (c == 0x27E9) return TRUE;  MATHEMATICAL RIGHT ANGLE BRACKET
    if (c == 0x27EA) return TRUE;  MATHEMATICAL LEFT DOUBLE ANGLE BRACKET
    if (c == 0x27EB) return TRUE;  MATHEMATICAL RIGHT DOUBLE ANGLE BRACKET
    if (c == 0x27EC) return TRUE;  MATHEMATICAL LEFT WHITE TORTOISE SHELL BRACKET
    if (c == 0x27ED) return TRUE;  MATHEMATICAL RIGHT WHITE TORTOISE SHELL BRACKET
    if (c == 0x27EE) return TRUE;  MATHEMATICAL LEFT FLATTENED PARENTHESIS
    if (c == 0x27EF) return TRUE;  MATHEMATICAL RIGHT FLATTENED PARENTHESIS
    if (c == 0x2983) return TRUE;  LEFT WHITE CURLY BRACKET
    if (c == 0x2984) return TRUE;  RIGHT WHITE CURLY BRACKET
    if (c == 0x2985) return TRUE;  LEFT WHITE PARENTHESIS
    if (c == 0x2986) return TRUE;  RIGHT WHITE PARENTHESIS
    if (c == 0x2987) return TRUE;  Z NOTATION LEFT IMAGE BRACKET
    if (c == 0x2988) return TRUE;  Z NOTATION RIGHT IMAGE BRACKET
    if (c == 0x2989) return TRUE;  Z NOTATION LEFT BINDING BRACKET
    if (c == 0x298A) return TRUE;  Z NOTATION RIGHT BINDING BRACKET
    if (c == 0x298B) return TRUE;  LEFT SQUARE BRACKET WITH UNDERBAR
    if (c == 0x298C) return TRUE;  RIGHT SQUARE BRACKET WITH UNDERBAR
    if (c == 0x298D) return TRUE;  LEFT SQUARE BRACKET WITH TICK IN TOP CORNER
    if (c == 0x298E) return TRUE;  RIGHT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
    if (c == 0x298F) return TRUE;  LEFT SQUARE BRACKET WITH TICK IN BOTTOM CORNER
    if (c == 0x2990) return TRUE;  RIGHT SQUARE BRACKET WITH TICK IN TOP CORNER
    if (c == 0x2991) return TRUE;  LEFT ANGLE BRACKET WITH DOT
    if (c == 0x2992) return TRUE;  RIGHT ANGLE BRACKET WITH DOT
    if (c == 0x2993) return TRUE;  LEFT ARC LESS-THAN BRACKET
    if (c == 0x2994) return TRUE;  RIGHT ARC GREATER-THAN BRACKET
    if (c == 0x2995) return TRUE;  DOUBLE LEFT ARC GREATER-THAN BRACKET
    if (c == 0x2996) return TRUE;  DOUBLE RIGHT ARC LESS-THAN BRACKET
    if (c == 0x2997) return TRUE;  LEFT BLACK TORTOISE SHELL BRACKET
    if (c == 0x2998) return TRUE;  RIGHT BLACK TORTOISE SHELL BRACKET
    if (c == 0x29D8) return TRUE;  LEFT WIGGLY FENCE
    if (c == 0x29D9) return TRUE;  RIGHT WIGGLY FENCE
    if (c == 0x29DA) return TRUE;  LEFT DOUBLE WIGGLY FENCE
    if (c == 0x29DB) return TRUE;  RIGHT DOUBLE WIGGLY FENCE
    if (c == 0x29FC) return TRUE;  LEFT-POINTING CURVED ANGLE BRACKET
    if (c == 0x29FD) return TRUE;  RIGHT-POINTING CURVED ANGLE BRACKET
    if (c == 0x2CF9) return TRUE;  COPTIC OLD NUBIAN FULL STOP
    if (c == 0x2CFA) return TRUE;  COPTIC OLD NUBIAN DIRECT QUESTION MARK
    if (c == 0x2CFB) return TRUE;  COPTIC OLD NUBIAN INDIRECT QUESTION MARK
    if (c == 0x2CFC) return TRUE;  COPTIC OLD NUBIAN VERSE DIVIDER
    if (c == 0x2CFE) return TRUE;  COPTIC FULL STOP
    if (c == 0x2CFF) return TRUE;  COPTIC MORPHOLOGICAL DIVIDER
    if (c == 0x2D70) return TRUE;  TIFINAGH SEPARATOR MARK
    if (c == 0x2E00) return TRUE;  RIGHT ANGLE SUBSTITUTION MARKER
    if (c == 0x2E01) return TRUE;  RIGHT ANGLE DOTTED SUBSTITUTION MARKER
    if (c == 0x2E02) return TRUE;  LEFT SUBSTITUTION BRACKET
    if (c == 0x2E03) return TRUE;  RIGHT SUBSTITUTION BRACKET
    if (c == 0x2E04) return TRUE;  LEFT DOTTED SUBSTITUTION BRACKET
    if (c == 0x2E05) return TRUE;  RIGHT DOTTED SUBSTITUTION BRACKET
    if (c == 0x2E06) return TRUE;  RAISED INTERPOLATION MARKER
    if (c == 0x2E07) return TRUE;  RAISED DOTTED INTERPOLATION MARKER
    if (c == 0x2E08) return TRUE;  DOTTED TRANSPOSITION MARKER
    if (c == 0x2E09) return TRUE;  LEFT TRANSPOSITION BRACKET
    if (c == 0x2E0A) return TRUE;  RIGHT TRANSPOSITION BRACKET
    if (c == 0x2E0B) return TRUE;  RAISED SQUARE
    if (c == 0x2E0C) return TRUE;  LEFT RAISED OMISSION BRACKET
    if (c == 0x2E0D) return TRUE;  RIGHT RAISED OMISSION BRACKET
    if (c == 0x2E0E) return TRUE;  EDITORIAL CORONIS
    if (c == 0x2E0F) return TRUE;  PARAGRAPHOS
    if (c == 0x2E10) return TRUE;  FORKED PARAGRAPHOS
    if (c == 0x2E11) return TRUE;  REVERSED FORKED PARAGRAPHOS
    if (c == 0x2E12) return TRUE;  HYPODIASTOLE
    if (c == 0x2E13) return TRUE;  DOTTED OBELOS
    if (c == 0x2E14) return TRUE;  DOWNWARDS ANCORA
    if (c == 0x2E15) return TRUE;  UPWARDS ANCORA
    if (c == 0x2E16) return TRUE;  DOTTED RIGHT-POINTING ANGLE
    if (c == 0x2E17) return TRUE;  DOUBLE OBLIQUE HYPHEN
    if (c == 0x2E18) return TRUE;  INVERTED INTERROBANG
    if (c == 0x2E19) return TRUE;  PALM BRANCH
    if (c == 0x2E1A) return TRUE;  HYPHEN WITH DIAERESIS
    if (c == 0x2E1B) return TRUE;  TILDE WITH RING ABOVE
    if (c == 0x2E1C) return TRUE;  LEFT LOW PARAPHRASE BRACKET
    if (c == 0x2E1D) return TRUE;  RIGHT LOW PARAPHRASE BRACKET
    if (c == 0x2E1E) return TRUE;  TILDE WITH DOT ABOVE
    if (c == 0x2E1F) return TRUE;  TILDE WITH DOT BELOW
    if (c == 0x2E20) return TRUE;  LEFT VERTICAL BAR WITH QUILL
    if (c == 0x2E21) return TRUE;  RIGHT VERTICAL BAR WITH QUILL
    if (c == 0x2E22) return TRUE;  TOP LEFT HALF BRACKET
    if (c == 0x2E23) return TRUE;  TOP RIGHT HALF BRACKET
    if (c == 0x2E24) return TRUE;  BOTTOM LEFT HALF BRACKET
    if (c == 0x2E25) return TRUE;  BOTTOM RIGHT HALF BRACKET
    if (c == 0x2E26) return TRUE;  LEFT SIDEWAYS U BRACKET
    if (c == 0x2E27) return TRUE;  RIGHT SIDEWAYS U BRACKET
    if (c == 0x2E28) return TRUE;  LEFT DOUBLE PARENTHESIS
    if (c == 0x2E29) return TRUE;  RIGHT DOUBLE PARENTHESIS
    if (c == 0x2E2A) return TRUE;  TWO DOTS OVER ONE DOT PUNCTUATION
    if (c == 0x2E2B) return TRUE;  ONE DOT OVER TWO DOTS PUNCTUATION
    if (c == 0x2E2C) return TRUE;  SQUARED FOUR DOT PUNCTUATION
    if (c == 0x2E2D) return TRUE;  FIVE DOT MARK
    if (c == 0x2E2E) return TRUE;  REVERSED QUESTION MARK
    if (c == 0x2E30) return TRUE;  RING POINT
    if (c == 0x2E31) return TRUE;  WORD SEPARATOR MIDDLE DOT
    if (c == 0x2E32) return TRUE;  TURNED COMMA
    if (c == 0x2E33) return TRUE;  RAISED DOT
    if (c == 0x2E34) return TRUE;  RAISED COMMA
    if (c == 0x2E35) return TRUE;  TURNED SEMICOLON
    if (c == 0x2E36) return TRUE;  DAGGER WITH LEFT GUARD
    if (c == 0x2E37) return TRUE;  DAGGER WITH RIGHT GUARD
    if (c == 0x2E38) return TRUE;  TURNED DAGGER
    if (c == 0x2E39) return TRUE;  TOP HALF SECTION SIGN
    if (c == 0x2E3A) return TRUE;  TWO-EM DASH
    if (c == 0x2E3B) return TRUE;  THREE-EM DASH
    if (c == 0x2E3C) return TRUE;  STENOGRAPHIC FULL STOP
    if (c == 0x2E3D) return TRUE;  VERTICAL SIX DOTS
    if (c == 0x2E3E) return TRUE;  WIGGLY VERTICAL LINE
    if (c == 0x2E3F) return TRUE;  CAPITULUM
    if (c == 0x2E40) return TRUE;  DOUBLE HYPHEN
    if (c == 0x2E41) return TRUE;  REVERSED COMMA
    if (c == 0x2E42) return TRUE;  DOUBLE LOW-REVERSED-9 QUOTATION MARK
    if (c == 0x2E43) return TRUE;  DASH WITH LEFT UPTURN
    if (c == 0x2E44) return TRUE;  DOUBLE SUSPENSION MARK
    if (c == 0x2E45) return TRUE;  INVERTED LOW KAVYKA
    if (c == 0x2E46) return TRUE;  INVERTED LOW KAVYKA WITH KAVYKA ABOVE
    if (c == 0x2E47) return TRUE;  LOW KAVYKA
    if (c == 0x2E48) return TRUE;  LOW KAVYKA WITH DOT
    if (c == 0x2E49) return TRUE;  DOUBLE STACKED COMMA
    if (c == 0x2E4A) return TRUE;  DOTTED SOLIDUS
    if (c == 0x2E4B) return TRUE;  TRIPLE DAGGER
    if (c == 0x2E4C) return TRUE;  MEDIEVAL COMMA
    if (c == 0x2E4D) return TRUE;  PARAGRAPHUS MARK
    if (c == 0x2E4E) return TRUE;  PUNCTUS ELEVATUS MARK
    if (c == 0x2E4F) return TRUE;  CORNISH VERSE DIVIDER
    if (c == 0x2E52) return TRUE;  TIRONIAN SIGN CAPITAL ET
    if (c == 0x2E53) return TRUE;  MEDIEVAL EXCLAMATION MARK
    if (c == 0x2E54) return TRUE;  MEDIEVAL QUESTION MARK
    if (c == 0x2E55) return TRUE;  LEFT SQUARE BRACKET WITH STROKE
    if (c == 0x2E56) return TRUE;  RIGHT SQUARE BRACKET WITH STROKE
    if (c == 0x2E57) return TRUE;  LEFT SQUARE BRACKET WITH DOUBLE STROKE
    if (c == 0x2E58) return TRUE;  RIGHT SQUARE BRACKET WITH DOUBLE STROKE
    if (c == 0x2E59) return TRUE;  TOP HALF LEFT PARENTHESIS
    if (c == 0x2E5A) return TRUE;  TOP HALF RIGHT PARENTHESIS
    if (c == 0x2E5B) return TRUE;  BOTTOM HALF LEFT PARENTHESIS
    if (c == 0x2E5C) return TRUE;  BOTTOM HALF RIGHT PARENTHESIS
    if (c == 0x2E5D) return TRUE;  OBLIQUE HYPHEN
    if (c == 0x3001) return TRUE;  IDEOGRAPHIC COMMA
    if (c == 0x3002) return TRUE;  IDEOGRAPHIC FULL STOP
    if (c == 0x3003) return TRUE;  DITTO MARK
    if (c == 0x3008) return TRUE;  LEFT ANGLE BRACKET
    if (c == 0x3009) return TRUE;  RIGHT ANGLE BRACKET
    if (c == 0x300A) return TRUE;  LEFT DOUBLE ANGLE BRACKET
    if (c == 0x300B) return TRUE;  RIGHT DOUBLE ANGLE BRACKET
    if (c == 0x300C) return TRUE;  LEFT CORNER BRACKET
    if (c == 0x300D) return TRUE;  RIGHT CORNER BRACKET
    if (c == 0x300E) return TRUE;  LEFT WHITE CORNER BRACKET
    if (c == 0x300F) return TRUE;  RIGHT WHITE CORNER BRACKET
    if (c == 0x3010) return TRUE;  LEFT BLACK LENTICULAR BRACKET
    if (c == 0x3011) return TRUE;  RIGHT BLACK LENTICULAR BRACKET
    if (c == 0x3014) return TRUE;  LEFT TORTOISE SHELL BRACKET
    if (c == 0x3015) return TRUE;  RIGHT TORTOISE SHELL BRACKET
    if (c == 0x3016) return TRUE;  LEFT WHITE LENTICULAR BRACKET
    if (c == 0x3017) return TRUE;  RIGHT WHITE LENTICULAR BRACKET
    if (c == 0x3018) return TRUE;  LEFT WHITE TORTOISE SHELL BRACKET
    if (c == 0x3019) return TRUE;  RIGHT WHITE TORTOISE SHELL BRACKET
    if (c == 0x301A) return TRUE;  LEFT WHITE SQUARE BRACKET
    if (c == 0x301B) return TRUE;  RIGHT WHITE SQUARE BRACKET
    if (c == 0x301C) return TRUE;  WAVE DASH
    if (c == 0x301D) return TRUE;  REVERSED DOUBLE PRIME QUOTATION MARK
    if (c == 0x301E) return TRUE;  DOUBLE PRIME QUOTATION MARK
    if (c == 0x301F) return TRUE;  LOW DOUBLE PRIME QUOTATION MARK
    if (c == 0x3030) return TRUE;  WAVY DASH
    if (c == 0x303D) return TRUE;  PART ALTERNATION MARK
    if (c == 0x30A0) return TRUE;  KATAKANA-HIRAGANA DOUBLE HYPHEN
    if (c == 0x30FB) return TRUE;  KATAKANA MIDDLE DOT
    if (c == 0xA4FE) return TRUE;  LISU PUNCTUATION COMMA
    if (c == 0xA4FF) return TRUE;  LISU PUNCTUATION FULL STOP
    if (c == 0xA60D) return TRUE;  VAI COMMA
    if (c == 0xA60E) return TRUE;  VAI FULL STOP
    if (c == 0xA60F) return TRUE;  VAI QUESTION MARK
    if (c == 0xA673) return TRUE;  SLAVONIC ASTERISK
    if (c == 0xA67E) return TRUE;  CYRILLIC KAVYKA
    if (c == 0xA6F2) return TRUE;  BAMUM NJAEMLI
    if (c == 0xA6F3) return TRUE;  BAMUM FULL STOP
    if (c == 0xA6F4) return TRUE;  BAMUM COLON
    if (c == 0xA6F5) return TRUE;  BAMUM COMMA
    if (c == 0xA6F6) return TRUE;  BAMUM SEMICOLON
    if (c == 0xA6F7) return TRUE;  BAMUM QUESTION MARK
    if (c == 0xA874) return TRUE;  PHAGS-PA SINGLE HEAD MARK
    if (c == 0xA875) return TRUE;  PHAGS-PA DOUBLE HEAD MARK
    if (c == 0xA876) return TRUE;  PHAGS-PA MARK SHAD
    if (c == 0xA877) return TRUE;  PHAGS-PA MARK DOUBLE SHAD
    if (c == 0xA8CE) return TRUE;  SAURASHTRA DANDA
    if (c == 0xA8CF) return TRUE;  SAURASHTRA DOUBLE DANDA
    if (c == 0xA8F8) return TRUE;  DEVANAGARI SIGN PUSHPIKA
    if (c == 0xA8F9) return TRUE;  DEVANAGARI GAP FILLER
    if (c == 0xA8FA) return TRUE;  DEVANAGARI CARET
    if (c == 0xA8FC) return TRUE;  DEVANAGARI SIGN SIDDHAM
    if (c == 0xA92E) return TRUE;  KAYAH LI SIGN CWI
    if (c == 0xA92F) return TRUE;  KAYAH LI SIGN SHYA
    if (c == 0xA95F) return TRUE;  REJANG SECTION MARK
    if (c == 0xA9C1) return TRUE;  JAVANESE LEFT RERENGGAN
    if (c == 0xA9C2) return TRUE;  JAVANESE RIGHT RERENGGAN
    if (c == 0xA9C3) return TRUE;  JAVANESE PADA ANDAP
    if (c == 0xA9C4) return TRUE;  JAVANESE PADA MADYA
    if (c == 0xA9C5) return TRUE;  JAVANESE PADA LUHUR
    if (c == 0xA9C6) return TRUE;  JAVANESE PADA WINDU
    if (c == 0xA9C7) return TRUE;  JAVANESE PADA PANGKAT
    if (c == 0xA9C8) return TRUE;  JAVANESE PADA LINGSA
    if (c == 0xA9C9) return TRUE;  JAVANESE PADA LUNGSI
    if (c == 0xA9CA) return TRUE;  JAVANESE PADA ADEG
    if (c == 0xA9CB) return TRUE;  JAVANESE PADA ADEG ADEG
    if (c == 0xA9CC) return TRUE;  JAVANESE PADA PISELEH
    if (c == 0xA9CD) return TRUE;  JAVANESE TURNED PADA PISELEH
    if (c == 0xA9DE) return TRUE;  JAVANESE PADA TIRTA TUMETES
    if (c == 0xA9DF) return TRUE;  JAVANESE PADA ISEN-ISEN
    if (c == 0xAA5C) return TRUE;  CHAM PUNCTUATION SPIRAL
    if (c == 0xAA5D) return TRUE;  CHAM PUNCTUATION DANDA
    if (c == 0xAA5E) return TRUE;  CHAM PUNCTUATION DOUBLE DANDA
    if (c == 0xAA5F) return TRUE;  CHAM PUNCTUATION TRIPLE DANDA
    if (c == 0xAADE) return TRUE;  TAI VIET SYMBOL HO HOI
    if (c == 0xAADF) return TRUE;  TAI VIET SYMBOL KOI KOI
    if (c == 0xAAF0) return TRUE;  MEETEI MAYEK CHEIKHAN
    if (c == 0xAAF1) return TRUE;  MEETEI MAYEK AHANG KHUDAM
    if (c == 0xABEB) return TRUE;  MEETEI MAYEK CHEIKHEI
    if (c == 0xFD3E) return TRUE;  ORNATE LEFT PARENTHESIS
    if (c == 0xFD3F) return TRUE;  ORNATE RIGHT PARENTHESIS
    if (c == 0xFE10) return TRUE;  PRESENTATION FORM FOR VERTICAL COMMA
    if (c == 0xFE11) return TRUE;  PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC COMMA
    if (c == 0xFE12) return TRUE;  PRESENTATION FORM FOR VERTICAL IDEOGRAPHIC FULL STOP
    if (c == 0xFE13) return TRUE;  PRESENTATION FORM FOR VERTICAL COLON
    if (c == 0xFE14) return TRUE;  PRESENTATION FORM FOR VERTICAL SEMICOLON
    if (c == 0xFE15) return TRUE;  PRESENTATION FORM FOR VERTICAL EXCLAMATION MARK
    if (c == 0xFE16) return TRUE;  PRESENTATION FORM FOR VERTICAL QUESTION MARK
    if (c == 0xFE17) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT WHITE LENTICULAR BRACKET
    if (c == 0xFE18) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT WHITE LENTICULAR BRAKCET
    if (c == 0xFE19) return TRUE;  PRESENTATION FORM FOR VERTICAL HORIZONTAL ELLIPSIS
    if (c == 0xFE30) return TRUE;  PRESENTATION FORM FOR VERTICAL TWO DOT LEADER
    if (c == 0xFE31) return TRUE;  PRESENTATION FORM FOR VERTICAL EM DASH
    if (c == 0xFE32) return TRUE;  PRESENTATION FORM FOR VERTICAL EN DASH
    if (c == 0xFE33) return TRUE;  PRESENTATION FORM FOR VERTICAL LOW LINE
    if (c == 0xFE34) return TRUE;  PRESENTATION FORM FOR VERTICAL WAVY LOW LINE
    if (c == 0xFE35) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT PARENTHESIS
    if (c == 0xFE36) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT PARENTHESIS
    if (c == 0xFE37) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT CURLY BRACKET
    if (c == 0xFE38) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT CURLY BRACKET
    if (c == 0xFE39) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT TORTOISE SHELL BRACKET
    if (c == 0xFE3A) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT TORTOISE SHELL BRACKET
    if (c == 0xFE3B) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT BLACK LENTICULAR BRACKET
    if (c == 0xFE3C) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT BLACK LENTICULAR BRACKET
    if (c == 0xFE3D) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT DOUBLE ANGLE BRACKET
    if (c == 0xFE3E) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT DOUBLE ANGLE BRACKET
    if (c == 0xFE3F) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT ANGLE BRACKET
    if (c == 0xFE40) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT ANGLE BRACKET
    if (c == 0xFE41) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT CORNER BRACKET
    if (c == 0xFE42) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT CORNER BRACKET
    if (c == 0xFE43) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT WHITE CORNER BRACKET
    if (c == 0xFE44) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT WHITE CORNER BRACKET
    if (c == 0xFE45) return TRUE;  SESAME DOT
    if (c == 0xFE46) return TRUE;  WHITE SESAME DOT
    if (c == 0xFE47) return TRUE;  PRESENTATION FORM FOR VERTICAL LEFT SQUARE BRACKET
    if (c == 0xFE48) return TRUE;  PRESENTATION FORM FOR VERTICAL RIGHT SQUARE BRACKET
    if (c == 0xFE49) return TRUE;  DASHED OVERLINE
    if (c == 0xFE4A) return TRUE;  CENTRELINE OVERLINE
    if (c == 0xFE4B) return TRUE;  WAVY OVERLINE
    if (c == 0xFE4C) return TRUE;  DOUBLE WAVY OVERLINE
    if (c == 0xFE4D) return TRUE;  DASHED LOW LINE
    if (c == 0xFE4E) return TRUE;  CENTRELINE LOW LINE
    if (c == 0xFE4F) return TRUE;  WAVY LOW LINE
    if (c == 0xFE50) return TRUE;  SMALL COMMA
    if (c == 0xFE51) return TRUE;  SMALL IDEOGRAPHIC COMMA
    if (c == 0xFE52) return TRUE;  SMALL FULL STOP
    if (c == 0xFE54) return TRUE;  SMALL SEMICOLON
    if (c == 0xFE55) return TRUE;  SMALL COLON
    if (c == 0xFE56) return TRUE;  SMALL QUESTION MARK
    if (c == 0xFE57) return TRUE;  SMALL EXCLAMATION MARK
    if (c == 0xFE58) return TRUE;  SMALL EM DASH
    if (c == 0xFE59) return TRUE;  SMALL LEFT PARENTHESIS
    if (c == 0xFE5A) return TRUE;  SMALL RIGHT PARENTHESIS
    if (c == 0xFE5B) return TRUE;  SMALL LEFT CURLY BRACKET
    if (c == 0xFE5C) return TRUE;  SMALL RIGHT CURLY BRACKET
    if (c == 0xFE5D) return TRUE;  SMALL LEFT TORTOISE SHELL BRACKET
    if (c == 0xFE5E) return TRUE;  SMALL RIGHT TORTOISE SHELL BRACKET
    if (c == 0xFE5F) return TRUE;  SMALL NUMBER SIGN
    if (c == 0xFE60) return TRUE;  SMALL AMPERSAND
    if (c == 0xFE61) return TRUE;  SMALL ASTERISK
    if (c == 0xFE63) return TRUE;  SMALL HYPHEN-MINUS
    if (c == 0xFE68) return TRUE;  SMALL REVERSE SOLIDUS
    if (c == 0xFE6A) return TRUE;  SMALL PERCENT SIGN
    if (c == 0xFE6B) return TRUE;  SMALL COMMERCIAL AT
    if (c == 0xFF01) return TRUE;  FULLWIDTH EXCLAMATION MARK
    if (c == 0xFF02) return TRUE;  FULLWIDTH QUOTATION MARK
    if (c == 0xFF03) return TRUE;  FULLWIDTH NUMBER SIGN
    if (c == 0xFF05) return TRUE;  FULLWIDTH PERCENT SIGN
    if (c == 0xFF06) return TRUE;  FULLWIDTH AMPERSAND
    if (c == 0xFF07) return TRUE;  FULLWIDTH APOSTROPHE
    if (c == 0xFF08) return TRUE;  FULLWIDTH LEFT PARENTHESIS
    if (c == 0xFF09) return TRUE;  FULLWIDTH RIGHT PARENTHESIS
    if (c == 0xFF0A) return TRUE;  FULLWIDTH ASTERISK
    if (c == 0xFF0C) return TRUE;  FULLWIDTH COMMA
    if (c == 0xFF0D) return TRUE;  FULLWIDTH HYPHEN-MINUS
    if (c == 0xFF0E) return TRUE;  FULLWIDTH FULL STOP
    if (c == 0xFF0F) return TRUE;  FULLWIDTH SOLIDUS
    if (c == 0xFF1A) return TRUE;  FULLWIDTH COLON
    if (c == 0xFF1B) return TRUE;  FULLWIDTH SEMICOLON
    if (c == 0xFF1F) return TRUE;  FULLWIDTH QUESTION MARK
    if (c == 0xFF20) return TRUE;  FULLWIDTH COMMERCIAL AT
    if (c == 0xFF3B) return TRUE;  FULLWIDTH LEFT SQUARE BRACKET
    if (c == 0xFF3C) return TRUE;  FULLWIDTH REVERSE SOLIDUS
    if (c == 0xFF3D) return TRUE;  FULLWIDTH RIGHT SQUARE BRACKET
    if (c == 0xFF3F) return TRUE;  FULLWIDTH LOW LINE
    if (c == 0xFF5B) return TRUE;  FULLWIDTH LEFT CURLY BRACKET
    if (c == 0xFF5D) return TRUE;  FULLWIDTH RIGHT CURLY BRACKET
    if (c == 0xFF5F) return TRUE;  FULLWIDTH LEFT WHITE PARENTHESIS
    if (c == 0xFF60) return TRUE;  FULLWIDTH RIGHT WHITE PARENTHESIS
    if (c == 0xFF61) return TRUE;  HALFWIDTH IDEOGRAPHIC FULL STOP
    if (c == 0xFF62) return TRUE;  HALFWIDTH LEFT CORNER BRACKET
    if (c == 0xFF63) return TRUE;  HALFWIDTH RIGHT CORNER BRACKET
    if (c == 0xFF64) return TRUE;  HALFWIDTH IDEOGRAPHIC COMMA
    if (c == 0xFF65) return TRUE;  HALFWIDTH KATAKANA MIDDLE DOT
    if (c == 0x10100) return TRUE;  AEGEAN WORD SEPARATOR LINE
    if (c == 0x10101) return TRUE;  AEGEAN WORD SEPARATOR DOT
    if (c == 0x10102) return TRUE;  AEGEAN CHECK MARK
    if (c == 0x1039F) return TRUE;  UGARITIC WORD DIVIDER
    if (c == 0x103D0) return TRUE;  OLD PERSIAN WORD DIVIDER
    if (c == 0x1056F) return TRUE;  CAUCASIAN ALBANIAN CITATION MARK
    if (c == 0x10857) return TRUE;  IMPERIAL ARAMAIC SECTION SIGN
    if (c == 0x1091F) return TRUE;  PHOENICIAN WORD SEPARATOR
    if (c == 0x1093F) return TRUE;  LYDIAN TRIANGULAR MARK
    if (c == 0x10A50) return TRUE;  KHAROSHTHI PUNCTUATION DOT
    if (c == 0x10A51) return TRUE;  KHAROSHTHI PUNCTUATION SMALL CIRCLE
    if (c == 0x10A52) return TRUE;  KHAROSHTHI PUNCTUATION CIRCLE
    if (c == 0x10A53) return TRUE;  KHAROSHTHI PUNCTUATION CRESCENT BAR
    if (c == 0x10A54) return TRUE;  KHAROSHTHI PUNCTUATION MANGALAM
    if (c == 0x10A55) return TRUE;  KHAROSHTHI PUNCTUATION LOTUS
    if (c == 0x10A56) return TRUE;  KHAROSHTHI PUNCTUATION DANDA
    if (c == 0x10A57) return TRUE;  KHAROSHTHI PUNCTUATION DOUBLE DANDA
    if (c == 0x10A58) return TRUE;  KHAROSHTHI PUNCTUATION LINES
    if (c == 0x10A7F) return TRUE;  OLD SOUTH ARABIAN NUMERIC INDICATOR
    if (c == 0x10AF0) return TRUE;  MANICHAEAN PUNCTUATION STAR
    if (c == 0x10AF1) return TRUE;  MANICHAEAN PUNCTUATION FLEURON
    if (c == 0x10AF2) return TRUE;  MANICHAEAN PUNCTUATION DOUBLE DOT WITHIN DOT
    if (c == 0x10AF3) return TRUE;  MANICHAEAN PUNCTUATION DOT WITHIN DOT
    if (c == 0x10AF4) return TRUE;  MANICHAEAN PUNCTUATION DOT
    if (c == 0x10AF5) return TRUE;  MANICHAEAN PUNCTUATION TWO DOTS
    if (c == 0x10AF6) return TRUE;  MANICHAEAN PUNCTUATION LINE FILLER
    if (c == 0x10B39) return TRUE;  AVESTAN ABBREVIATION MARK
    if (c == 0x10B3A) return TRUE;  TINY TWO DOTS OVER ONE DOT PUNCTUATION
    if (c == 0x10B3B) return TRUE;  SMALL TWO DOTS OVER ONE DOT PUNCTUATION
    if (c == 0x10B3C) return TRUE;  LARGE TWO DOTS OVER ONE DOT PUNCTUATION
    if (c == 0x10B3D) return TRUE;  LARGE ONE DOT OVER TWO DOTS PUNCTUATION
    if (c == 0x10B3E) return TRUE;  LARGE TWO RINGS OVER ONE RING PUNCTUATION
    if (c == 0x10B3F) return TRUE;  LARGE ONE RING OVER TWO RINGS PUNCTUATION
    if (c == 0x10B99) return TRUE;  PSALTER PAHLAVI SECTION MARK
    if (c == 0x10B9A) return TRUE;  PSALTER PAHLAVI TURNED SECTION MARK
    if (c == 0x10B9B) return TRUE;  PSALTER PAHLAVI FOUR DOTS WITH CROSS
    if (c == 0x10B9C) return TRUE;  PSALTER PAHLAVI FOUR DOTS WITH DOT
    if (c == 0x10EAD) return TRUE;  YEZIDI HYPHENATION MARK
    if (c == 0x10F55) return TRUE;  SOGDIAN PUNCTUATION TWO VERTICAL BARS
    if (c == 0x10F56) return TRUE;  SOGDIAN PUNCTUATION TWO VERTICAL BARS WITH DOTS
    if (c == 0x10F57) return TRUE;  SOGDIAN PUNCTUATION CIRCLE WITH DOT
    if (c == 0x10F58) return TRUE;  SOGDIAN PUNCTUATION TWO CIRCLES WITH DOTS
    if (c == 0x10F59) return TRUE;  SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT
    if (c == 0x10F86) return TRUE;  OLD UYGHUR PUNCTUATION BAR
    if (c == 0x10F87) return TRUE;  OLD UYGHUR PUNCTUATION TWO BARS
    if (c == 0x10F88) return TRUE;  OLD UYGHUR PUNCTUATION TWO DOTS
    if (c == 0x10F89) return TRUE;  OLD UYGHUR PUNCTUATION FOUR DOTS
    if (c == 0x11047) return TRUE;  BRAHMI DANDA
    if (c == 0x11048) return TRUE;  BRAHMI DOUBLE DANDA
    if (c == 0x11049) return TRUE;  BRAHMI PUNCTUATION DOT
    if (c == 0x1104A) return TRUE;  BRAHMI PUNCTUATION DOUBLE DOT
    if (c == 0x1104B) return TRUE;  BRAHMI PUNCTUATION LINE
    if (c == 0x1104C) return TRUE;  BRAHMI PUNCTUATION CRESCENT BAR
    if (c == 0x1104D) return TRUE;  BRAHMI PUNCTUATION LOTUS
    if (c == 0x110BB) return TRUE;  KAITHI ABBREVIATION SIGN
    if (c == 0x110BC) return TRUE;  KAITHI ENUMERATION SIGN
    if (c == 0x110BE) return TRUE;  KAITHI SECTION MARK
    if (c == 0x110BF) return TRUE;  KAITHI DOUBLE SECTION MARK
    if (c == 0x110C0) return TRUE;  KAITHI DANDA
    if (c == 0x110C1) return TRUE;  KAITHI DOUBLE DANDA
    if (c == 0x11140) return TRUE;  CHAKMA SECTION MARK
    if (c == 0x11141) return TRUE;  CHAKMA DANDA
    if (c == 0x11142) return TRUE;  CHAKMA DOUBLE DANDA
    if (c == 0x11143) return TRUE;  CHAKMA QUESTION MARK
    if (c == 0x11174) return TRUE;  MAHAJANI ABBREVIATION SIGN
    if (c == 0x11175) return TRUE;  MAHAJANI SECTION MARK
    if (c == 0x111C5) return TRUE;  SHARADA DANDA
    if (c == 0x111C6) return TRUE;  SHARADA DOUBLE DANDA
    if (c == 0x111C7) return TRUE;  SHARADA ABBREVIATION SIGN
    if (c == 0x111C8) return TRUE;  SHARADA SEPARATOR
    if (c == 0x111CD) return TRUE;  SHARADA SUTRA MARK
    if (c == 0x111DB) return TRUE;  SHARADA SIGN SIDDHAM
    if (c == 0x111DD) return TRUE;  SHARADA CONTINUATION SIGN
    if (c == 0x111DE) return TRUE;  SHARADA SECTION MARK-1
    if (c == 0x111DF) return TRUE;  SHARADA SECTION MARK-2
    if (c == 0x11238) return TRUE;  KHOJKI DANDA
    if (c == 0x11239) return TRUE;  KHOJKI DOUBLE DANDA
    if (c == 0x1123A) return TRUE;  KHOJKI WORD SEPARATOR
    if (c == 0x1123B) return TRUE;  KHOJKI SECTION MARK
    if (c == 0x1123C) return TRUE;  KHOJKI DOUBLE SECTION MARK
    if (c == 0x1123D) return TRUE;  KHOJKI ABBREVIATION SIGN
    if (c == 0x112A9) return TRUE;  MULTANI SECTION MARK
    if (c == 0x1144B) return TRUE;  NEWA DANDA
    if (c == 0x1144C) return TRUE;  NEWA DOUBLE DANDA
    if (c == 0x1144D) return TRUE;  NEWA COMMA
    if (c == 0x1144E) return TRUE;  NEWA GAP FILLER
    if (c == 0x1144F) return TRUE;  NEWA ABBREVIATION SIGN
    if (c == 0x1145A) return TRUE;  NEWA DOUBLE COMMA
    if (c == 0x1145B) return TRUE;  NEWA PLACEHOLDER MARK
    if (c == 0x1145D) return TRUE;  NEWA INSERTION SIGN
    if (c == 0x114C6) return TRUE;  TIRHUTA ABBREVIATION SIGN
    if (c == 0x115C1) return TRUE;  SIDDHAM SIGN SIDDHAM
    if (c == 0x115C2) return TRUE;  SIDDHAM DANDA
    if (c == 0x115C3) return TRUE;  SIDDHAM DOUBLE DANDA
    if (c == 0x115C4) return TRUE;  SIDDHAM SEPARATOR DOT
    if (c == 0x115C5) return TRUE;  SIDDHAM SEPARATOR BAR
    if (c == 0x115C6) return TRUE;  SIDDHAM REPETITION MARK-1
    if (c == 0x115C7) return TRUE;  SIDDHAM REPETITION MARK-2
    if (c == 0x115C8) return TRUE;  SIDDHAM REPETITION MARK-3
    if (c == 0x115C9) return TRUE;  SIDDHAM END OF TEXT MARK
    if (c == 0x115CA) return TRUE;  SIDDHAM SECTION MARK WITH TRIDENT AND U-SHAPED ORNAMENTS
    if (c == 0x115CB) return TRUE;  SIDDHAM SECTION MARK WITH TRIDENT AND DOTTED CRESCENTS
    if (c == 0x115CC) return TRUE;  SIDDHAM SECTION MARK WITH RAYS AND DOTTED CRESCENTS
    if (c == 0x115CD) return TRUE;  SIDDHAM SECTION MARK WITH RAYS AND DOTTED DOUBLE CRESCENTS
    if (c == 0x115CE) return TRUE;  SIDDHAM SECTION MARK WITH RAYS AND DOTTED TRIPLE CRESCENTS
    if (c == 0x115CF) return TRUE;  SIDDHAM SECTION MARK DOUBLE RING
    if (c == 0x115D0) return TRUE;  SIDDHAM SECTION MARK DOUBLE RING WITH RAYS
    if (c == 0x115D1) return TRUE;  SIDDHAM SECTION MARK WITH DOUBLE CRESCENTS
    if (c == 0x115D2) return TRUE;  SIDDHAM SECTION MARK WITH TRIPLE CRESCENTS
    if (c == 0x115D3) return TRUE;  SIDDHAM SECTION MARK WITH QUADRUPLE CRESCENTS
    if (c == 0x115D4) return TRUE;  SIDDHAM SECTION MARK WITH SEPTUPLE CRESCENTS
    if (c == 0x115D5) return TRUE;  SIDDHAM SECTION MARK WITH CIRCLES AND RAYS
    if (c == 0x115D6) return TRUE;  SIDDHAM SECTION MARK WITH CIRCLES AND TWO ENCLOSURES
    if (c == 0x115D7) return TRUE;  SIDDHAM SECTION MARK WITH CIRCLES AND FOUR ENCLOSURES
    if (c == 0x11641) return TRUE;  MODI DANDA
    if (c == 0x11642) return TRUE;  MODI DOUBLE DANDA
    if (c == 0x11643) return TRUE;  MODI ABBREVIATION SIGN
    if (c == 0x11660) return TRUE;  MONGOLIAN BIRGA WITH ORNAMENT
    if (c == 0x11661) return TRUE;  MONGOLIAN ROTATED BIRGA
    if (c == 0x11662) return TRUE;  MONGOLIAN DOUBLE BIRGA WITH ORNAMENT
    if (c == 0x11663) return TRUE;  MONGOLIAN TRIPLE BIRGA WITH ORNAMENT
    if (c == 0x11664) return TRUE;  MONGOLIAN BIRGA WITH DOUBLE ORNAMENT
    if (c == 0x11665) return TRUE;  MONGOLIAN ROTATED BIRGA WITH ORNAMENT
    if (c == 0x11666) return TRUE;  MONGOLIAN ROTATED BIRGA WITH DOUBLE ORNAMENT
    if (c == 0x11667) return TRUE;  MONGOLIAN INVERTED BIRGA
    if (c == 0x11668) return TRUE;  MONGOLIAN INVERTED BIRGA WITH DOUBLE ORNAMENT
    if (c == 0x11669) return TRUE;  MONGOLIAN SWIRL BIRGA
    if (c == 0x1166A) return TRUE;  MONGOLIAN SWIRL BIRGA WITH ORNAMENT
    if (c == 0x1166B) return TRUE;  MONGOLIAN SWIRL BIRGA WITH DOUBLE ORNAMENT
    if (c == 0x1166C) return TRUE;  MONGOLIAN TURNED SWIRL BIRGA WITH DOUBLE ORNAMENT
    if (c == 0x116B9) return TRUE;  TAKRI ABBREVIATION SIGN
    if (c == 0x1173C) return TRUE;  AHOM SIGN SMALL SECTION
    if (c == 0x1173D) return TRUE;  AHOM SIGN SECTION
    if (c == 0x1173E) return TRUE;  AHOM SIGN RULAI
    if (c == 0x1183B) return TRUE;  DOGRA ABBREVIATION SIGN
    if (c == 0x11944) return TRUE;  DIVES AKURU DOUBLE DANDA
    if (c == 0x11945) return TRUE;  DIVES AKURU GAP FILLER
    if (c == 0x11946) return TRUE;  DIVES AKURU END OF TEXT MARK
    if (c == 0x119E2) return TRUE;  NANDINAGARI SIGN SIDDHAM
    if (c == 0x11A3F) return TRUE;  ZANABAZAR SQUARE INITIAL HEAD MARK
    if (c == 0x11A40) return TRUE;  ZANABAZAR SQUARE CLOSING HEAD MARK
    if (c == 0x11A41) return TRUE;  ZANABAZAR SQUARE MARK TSHEG
    if (c == 0x11A42) return TRUE;  ZANABAZAR SQUARE MARK SHAD
    if (c == 0x11A43) return TRUE;  ZANABAZAR SQUARE MARK DOUBLE SHAD
    if (c == 0x11A44) return TRUE;  ZANABAZAR SQUARE MARK LONG TSHEG
    if (c == 0x11A45) return TRUE;  ZANABAZAR SQUARE INITIAL DOUBLE-LINED HEAD MARK
    if (c == 0x11A46) return TRUE;  ZANABAZAR SQUARE CLOSING DOUBLE-LINED HEAD MARK
    if (c == 0x11A9A) return TRUE;  SOYOMBO MARK TSHEG
    if (c == 0x11A9B) return TRUE;  SOYOMBO MARK SHAD
    if (c == 0x11A9C) return TRUE;  SOYOMBO MARK DOUBLE SHAD
    if (c == 0x11A9E) return TRUE;  SOYOMBO HEAD MARK WITH MOON AND SUN AND TRIPLE FLAME
    if (c == 0x11A9F) return TRUE;  SOYOMBO HEAD MARK WITH MOON AND SUN AND FLAME
    if (c == 0x11AA0) return TRUE;  SOYOMBO HEAD MARK WITH MOON AND SUN
    if (c == 0x11AA1) return TRUE;  SOYOMBO TERMINAL MARK-1
    if (c == 0x11AA2) return TRUE;  SOYOMBO TERMINAL MARK-2
    if (c == 0x11B00) return TRUE;  DEVANAGARI HEAD MARK
    if (c == 0x11B01) return TRUE;  DEVANAGARI HEAD MARK WITH HEADSTROKE
    if (c == 0x11B02) return TRUE;  DEVANAGARI SIGN BHALE
    if (c == 0x11B03) return TRUE;  DEVANAGARI SIGN BHALE WITH HOOK
    if (c == 0x11B04) return TRUE;  DEVANAGARI SIGN EXTENDED BHALE
    if (c == 0x11B05) return TRUE;  DEVANAGARI SIGN EXTENDED BHALE WITH HOOK
    if (c == 0x11B06) return TRUE;  DEVANAGARI SIGN WESTERN FIVE-LIKE BHALE
    if (c == 0x11B07) return TRUE;  DEVANAGARI SIGN WESTERN NINE-LIKE BHALE
    if (c == 0x11B08) return TRUE;  DEVANAGARI SIGN REVERSED NINE-LIKE BHALE
    if (c == 0x11B09) return TRUE;  DEVANAGARI SIGN MINDU
    if (c == 0x11C41) return TRUE;  BHAIKSUKI DANDA
    if (c == 0x11C42) return TRUE;  BHAIKSUKI DOUBLE DANDA
    if (c == 0x11C43) return TRUE;  BHAIKSUKI WORD SEPARATOR
    if (c == 0x11C44) return TRUE;  BHAIKSUKI GAP FILLER-1
    if (c == 0x11C45) return TRUE;  BHAIKSUKI GAP FILLER-2
    if (c == 0x11C70) return TRUE;  MARCHEN HEAD MARK
    if (c == 0x11C71) return TRUE;  MARCHEN MARK SHAD
    if (c == 0x11EF7) return TRUE;  MAKASAR PASSIMBANG
    if (c == 0x11EF8) return TRUE;  MAKASAR END OF SECTION
    if (c == 0x11F43) return TRUE;  KAWI DANDA
    if (c == 0x11F44) return TRUE;  KAWI DOUBLE DANDA
    if (c == 0x11F45) return TRUE;  KAWI PUNCTUATION SECTION MARKER
    if (c == 0x11F46) return TRUE;  KAWI PUNCTUATION ALTERNATE SECTION MARKER
    if (c == 0x11F47) return TRUE;  KAWI PUNCTUATION FLOWER
    if (c == 0x11F48) return TRUE;  KAWI PUNCTUATION SPACE FILLER
    if (c == 0x11F49) return TRUE;  KAWI PUNCTUATION DOT
    if (c == 0x11F4A) return TRUE;  KAWI PUNCTUATION DOUBLE DOT
    if (c == 0x11F4B) return TRUE;  KAWI PUNCTUATION TRIPLE DOT
    if (c == 0x11F4C) return TRUE;  KAWI PUNCTUATION CIRCLE
    if (c == 0x11F4D) return TRUE;  KAWI PUNCTUATION FILLED CIRCLE
    if (c == 0x11F4E) return TRUE;  KAWI PUNCTUATION SPIRAL
    if (c == 0x11F4F) return TRUE;  KAWI PUNCTUATION CLOSING SPIRAL
    if (c == 0x11FFF) return TRUE;  TAMIL PUNCTUATION END OF TEXT
    if (c == 0x12470) return TRUE;  CUNEIFORM PUNCTUATION SIGN OLD ASSYRIAN WORD DIVIDER
    if (c == 0x12471) return TRUE;  CUNEIFORM PUNCTUATION SIGN VERTICAL COLON
    if (c == 0x12472) return TRUE;  CUNEIFORM PUNCTUATION SIGN DIAGONAL COLON
    if (c == 0x12473) return TRUE;  CUNEIFORM PUNCTUATION SIGN DIAGONAL TRICOLON
    if (c == 0x12474) return TRUE;  CUNEIFORM PUNCTUATION SIGN DIAGONAL QUADCOLON
    if (c == 0x12FF1) return TRUE;  CYPRO-MINOAN SIGN CM301
    if (c == 0x12FF2) return TRUE;  CYPRO-MINOAN SIGN CM302
    if (c == 0x16A6E) return TRUE;  MRO DANDA
    if (c == 0x16A6F) return TRUE;  MRO DOUBLE DANDA
    if (c == 0x16AF5) return TRUE;  BASSA VAH FULL STOP
    if (c == 0x16B37) return TRUE;  PAHAWH HMONG SIGN VOS THOM
    if (c == 0x16B38) return TRUE;  PAHAWH HMONG SIGN VOS TSHAB CEEB
    if (c == 0x16B39) return TRUE;  PAHAWH HMONG SIGN CIM CHEEM
    if (c == 0x16B3A) return TRUE;  PAHAWH HMONG SIGN VOS THIAB
    if (c == 0x16B3B) return TRUE;  PAHAWH HMONG SIGN VOS FEEM
    if (c == 0x16B44) return TRUE;  PAHAWH HMONG SIGN XAUS
    if (c == 0x16E97) return TRUE;  MEDEFAIDRIN COMMA
    if (c == 0x16E98) return TRUE;  MEDEFAIDRIN FULL STOP
    if (c == 0x16E99) return TRUE;  MEDEFAIDRIN SYMBOL AIVA
    if (c == 0x16E9A) return TRUE;  MEDEFAIDRIN EXCLAMATION OH
    if (c == 0x16FE2) return TRUE;  OLD CHINESE HOOK MARK
    if (c == 0x1BC9F) return TRUE;  DUPLOYAN PUNCTUATION CHINOOK FULL STOP
    if (c == 0x1DA87) return TRUE;  SIGNWRITING COMMA
    if (c == 0x1DA88) return TRUE;  SIGNWRITING FULL STOP
    if (c == 0x1DA89) return TRUE;  SIGNWRITING SEMICOLON
    if (c == 0x1DA8A) return TRUE;  SIGNWRITING COLON
    if (c == 0x1DA8B) return TRUE;  SIGNWRITING PARENTHESIS
    if (c == 0x1E95E) return TRUE;  ADLAM INITIAL EXCLAMATION MARK
    if (c == 0x1E95F) return TRUE;  ADLAM INITIAL QUESTION MARK
    return FALSE;
}

§7. Another epic, mechanically written function, performs the full case folding defined by Unicode 15.0, turning c into a run of up to four characters representing its canonical upper-case form.

void Characters::full_Unicode_fold(inchar32_t c, inchar32_t *F) {
    F[1] = 0; F[2] = 0; F[3] = 0;
    if (c < 0x0100) {
        if ((c >= 0x0041) && (c <= 0x005A)) { F[0] = 0x0061 + (c - 0x0041); return; }  LATIN CAPITAL LETTER A to LATIN CAPITAL LETTER Z
        if (c == 0x00B5) { F[0] = 0x03BC; return; }  MICRO SIGN
        if ((c >= 0x00C0) && (c <= 0x00D6)) { F[0] = 0x00E0 + (c - 0x00C0); return; }  LATIN CAPITAL LETTER A WITH GRAVE to LATIN CAPITAL LETTER O WITH DIAERESIS
        if ((c >= 0x00D8) && (c <= 0x00DE)) { F[0] = 0x00F8 + (c - 0x00D8); return; }  LATIN CAPITAL LETTER O WITH STROKE to LATIN CAPITAL LETTER THORN
        if (c == 0x00DF) { F[0] = 0x0073; F[1] = 0x0073; return; }  LATIN SMALL LETTER SHARP S
    } else if ((c >= 0x0100) && (c < 0x0200)) {
        if (c == 0x0100) { F[0] = 0x0101; return; }  LATIN CAPITAL LETTER A WITH MACRON
        if (c == 0x0102) { F[0] = 0x0103; return; }  LATIN CAPITAL LETTER A WITH BREVE
        if (c == 0x0104) { F[0] = 0x0105; return; }  LATIN CAPITAL LETTER A WITH OGONEK
        if (c == 0x0106) { F[0] = 0x0107; return; }  LATIN CAPITAL LETTER C WITH ACUTE
        if (c == 0x0108) { F[0] = 0x0109; return; }  LATIN CAPITAL LETTER C WITH CIRCUMFLEX
        if (c == 0x010A) { F[0] = 0x010B; return; }  LATIN CAPITAL LETTER C WITH DOT ABOVE
        if (c == 0x010C) { F[0] = 0x010D; return; }  LATIN CAPITAL LETTER C WITH CARON
        if (c == 0x010E) { F[0] = 0x010F; return; }  LATIN CAPITAL LETTER D WITH CARON
        if (c == 0x0110) { F[0] = 0x0111; return; }  LATIN CAPITAL LETTER D WITH STROKE
        if (c == 0x0112) { F[0] = 0x0113; return; }  LATIN CAPITAL LETTER E WITH MACRON
        if (c == 0x0114) { F[0] = 0x0115; return; }  LATIN CAPITAL LETTER E WITH BREVE
        if (c == 0x0116) { F[0] = 0x0117; return; }  LATIN CAPITAL LETTER E WITH DOT ABOVE
        if (c == 0x0118) { F[0] = 0x0119; return; }  LATIN CAPITAL LETTER E WITH OGONEK
        if (c == 0x011A) { F[0] = 0x011B; return; }  LATIN CAPITAL LETTER E WITH CARON
        if (c == 0x011C) { F[0] = 0x011D; return; }  LATIN CAPITAL LETTER G WITH CIRCUMFLEX
        if (c == 0x011E) { F[0] = 0x011F; return; }  LATIN CAPITAL LETTER G WITH BREVE
        if (c == 0x0120) { F[0] = 0x0121; return; }  LATIN CAPITAL LETTER G WITH DOT ABOVE
        if (c == 0x0122) { F[0] = 0x0123; return; }  LATIN CAPITAL LETTER G WITH CEDILLA
        if (c == 0x0124) { F[0] = 0x0125; return; }  LATIN CAPITAL LETTER H WITH CIRCUMFLEX
        if (c == 0x0126) { F[0] = 0x0127; return; }  LATIN CAPITAL LETTER H WITH STROKE
        if (c == 0x0128) { F[0] = 0x0129; return; }  LATIN CAPITAL LETTER I WITH TILDE
        if (c == 0x012A) { F[0] = 0x012B; return; }  LATIN CAPITAL LETTER I WITH MACRON
        if (c == 0x012C) { F[0] = 0x012D; return; }  LATIN CAPITAL LETTER I WITH BREVE
        if (c == 0x012E) { F[0] = 0x012F; return; }  LATIN CAPITAL LETTER I WITH OGONEK
        if (c == 0x0130) { F[0] = 0x0069; F[1] = 0x0307; return; }  LATIN CAPITAL LETTER I WITH DOT ABOVE
        if (c == 0x0132) { F[0] = 0x0133; return; }  LATIN CAPITAL LIGATURE IJ
        if (c == 0x0134) { F[0] = 0x0135; return; }  LATIN CAPITAL LETTER J WITH CIRCUMFLEX
        if (c == 0x0136) { F[0] = 0x0137; return; }  LATIN CAPITAL LETTER K WITH CEDILLA
        if (c == 0x0139) { F[0] = 0x013A; return; }  LATIN CAPITAL LETTER L WITH ACUTE
        if (c == 0x013B) { F[0] = 0x013C; return; }  LATIN CAPITAL LETTER L WITH CEDILLA
        if (c == 0x013D) { F[0] = 0x013E; return; }  LATIN CAPITAL LETTER L WITH CARON
        if (c == 0x013F) { F[0] = 0x0140; return; }  LATIN CAPITAL LETTER L WITH MIDDLE DOT
        if (c == 0x0141) { F[0] = 0x0142; return; }  LATIN CAPITAL LETTER L WITH STROKE
        if (c == 0x0143) { F[0] = 0x0144; return; }  LATIN CAPITAL LETTER N WITH ACUTE
        if (c == 0x0145) { F[0] = 0x0146; return; }  LATIN CAPITAL LETTER N WITH CEDILLA
        if (c == 0x0147) { F[0] = 0x0148; return; }  LATIN CAPITAL LETTER N WITH CARON
        if (c == 0x0149) { F[0] = 0x02BC; F[1] = 0x006E; return; }  LATIN SMALL LETTER N PRECEDED BY APOSTROPHE
        if (c == 0x014A) { F[0] = 0x014B; return; }  LATIN CAPITAL LETTER ENG
        if (c == 0x014C) { F[0] = 0x014D; return; }  LATIN CAPITAL LETTER O WITH MACRON
        if (c == 0x014E) { F[0] = 0x014F; return; }  LATIN CAPITAL LETTER O WITH BREVE
        if (c == 0x0150) { F[0] = 0x0151; return; }  LATIN CAPITAL LETTER O WITH DOUBLE ACUTE
        if (c == 0x0152) { F[0] = 0x0153; return; }  LATIN CAPITAL LIGATURE OE
        if (c == 0x0154) { F[0] = 0x0155; return; }  LATIN CAPITAL LETTER R WITH ACUTE
        if (c == 0x0156) { F[0] = 0x0157; return; }  LATIN CAPITAL LETTER R WITH CEDILLA
        if (c == 0x0158) { F[0] = 0x0159; return; }  LATIN CAPITAL LETTER R WITH CARON
        if (c == 0x015A) { F[0] = 0x015B; return; }  LATIN CAPITAL LETTER S WITH ACUTE
        if (c == 0x015C) { F[0] = 0x015D; return; }  LATIN CAPITAL LETTER S WITH CIRCUMFLEX
        if (c == 0x015E) { F[0] = 0x015F; return; }  LATIN CAPITAL LETTER S WITH CEDILLA
        if (c == 0x0160) { F[0] = 0x0161; return; }  LATIN CAPITAL LETTER S WITH CARON
        if (c == 0x0162) { F[0] = 0x0163; return; }  LATIN CAPITAL LETTER T WITH CEDILLA
        if (c == 0x0164) { F[0] = 0x0165; return; }  LATIN CAPITAL LETTER T WITH CARON
        if (c == 0x0166) { F[0] = 0x0167; return; }  LATIN CAPITAL LETTER T WITH STROKE
        if (c == 0x0168) { F[0] = 0x0169; return; }  LATIN CAPITAL LETTER U WITH TILDE
        if (c == 0x016A) { F[0] = 0x016B; return; }  LATIN CAPITAL LETTER U WITH MACRON
        if (c == 0x016C) { F[0] = 0x016D; return; }  LATIN CAPITAL LETTER U WITH BREVE
        if (c == 0x016E) { F[0] = 0x016F; return; }  LATIN CAPITAL LETTER U WITH RING ABOVE
        if (c == 0x0170) { F[0] = 0x0171; return; }  LATIN CAPITAL LETTER U WITH DOUBLE ACUTE
        if (c == 0x0172) { F[0] = 0x0173; return; }  LATIN CAPITAL LETTER U WITH OGONEK
        if (c == 0x0174) { F[0] = 0x0175; return; }  LATIN CAPITAL LETTER W WITH CIRCUMFLEX
        if (c == 0x0176) { F[0] = 0x0177; return; }  LATIN CAPITAL LETTER Y WITH CIRCUMFLEX
        if (c == 0x0178) { F[0] = 0x00FF; return; }  LATIN CAPITAL LETTER Y WITH DIAERESIS
        if (c == 0x0179) { F[0] = 0x017A; return; }  LATIN CAPITAL LETTER Z WITH ACUTE
        if (c == 0x017B) { F[0] = 0x017C; return; }  LATIN CAPITAL LETTER Z WITH DOT ABOVE
        if (c == 0x017D) { F[0] = 0x017E; return; }  LATIN CAPITAL LETTER Z WITH CARON
        if (c == 0x017F) { F[0] = 0x0073; return; }  LATIN SMALL LETTER LONG S
        if (c == 0x0181) { F[0] = 0x0253; return; }  LATIN CAPITAL LETTER B WITH HOOK
        if (c == 0x0182) { F[0] = 0x0183; return; }  LATIN CAPITAL LETTER B WITH TOPBAR
        if (c == 0x0184) { F[0] = 0x0185; return; }  LATIN CAPITAL LETTER TONE SIX
        if (c == 0x0186) { F[0] = 0x0254; return; }  LATIN CAPITAL LETTER OPEN O
        if (c == 0x0187) { F[0] = 0x0188; return; }  LATIN CAPITAL LETTER C WITH HOOK
        if (c == 0x0189) { F[0] = 0x0256; return; }  LATIN CAPITAL LETTER AFRICAN D
        if (c == 0x018A) { F[0] = 0x0257; return; }  LATIN CAPITAL LETTER D WITH HOOK
        if (c == 0x018B) { F[0] = 0x018C; return; }  LATIN CAPITAL LETTER D WITH TOPBAR
        if (c == 0x018E) { F[0] = 0x01DD; return; }  LATIN CAPITAL LETTER REVERSED E
        if (c == 0x018F) { F[0] = 0x0259; return; }  LATIN CAPITAL LETTER SCHWA
        if (c == 0x0190) { F[0] = 0x025B; return; }  LATIN CAPITAL LETTER OPEN E
        if (c == 0x0191) { F[0] = 0x0192; return; }  LATIN CAPITAL LETTER F WITH HOOK
        if (c == 0x0193) { F[0] = 0x0260; return; }  LATIN CAPITAL LETTER G WITH HOOK
        if (c == 0x0194) { F[0] = 0x0263; return; }  LATIN CAPITAL LETTER GAMMA
        if (c == 0x0196) { F[0] = 0x0269; return; }  LATIN CAPITAL LETTER IOTA
        if (c == 0x0197) { F[0] = 0x0268; return; }  LATIN CAPITAL LETTER I WITH STROKE
        if (c == 0x0198) { F[0] = 0x0199; return; }  LATIN CAPITAL LETTER K WITH HOOK
        if (c == 0x019C) { F[0] = 0x026F; return; }  LATIN CAPITAL LETTER TURNED M
        if (c == 0x019D) { F[0] = 0x0272; return; }  LATIN CAPITAL LETTER N WITH LEFT HOOK
        if (c == 0x019F) { F[0] = 0x0275; return; }  LATIN CAPITAL LETTER O WITH MIDDLE TILDE
        if (c == 0x01A0) { F[0] = 0x01A1; return; }  LATIN CAPITAL LETTER O WITH HORN
        if (c == 0x01A2) { F[0] = 0x01A3; return; }  LATIN CAPITAL LETTER OI
        if (c == 0x01A4) { F[0] = 0x01A5; return; }  LATIN CAPITAL LETTER P WITH HOOK
        if (c == 0x01A6) { F[0] = 0x0280; return; }  LATIN LETTER YR
        if (c == 0x01A7) { F[0] = 0x01A8; return; }  LATIN CAPITAL LETTER TONE TWO
        if (c == 0x01A9) { F[0] = 0x0283; return; }  LATIN CAPITAL LETTER ESH
        if (c == 0x01AC) { F[0] = 0x01AD; return; }  LATIN CAPITAL LETTER T WITH HOOK
        if (c == 0x01AE) { F[0] = 0x0288; return; }  LATIN CAPITAL LETTER T WITH RETROFLEX HOOK
        if (c == 0x01AF) { F[0] = 0x01B0; return; }  LATIN CAPITAL LETTER U WITH HORN
        if (c == 0x01B1) { F[0] = 0x028A; return; }  LATIN CAPITAL LETTER UPSILON
        if (c == 0x01B2) { F[0] = 0x028B; return; }  LATIN CAPITAL LETTER V WITH HOOK
        if (c == 0x01B3) { F[0] = 0x01B4; return; }  LATIN CAPITAL LETTER Y WITH HOOK
        if (c == 0x01B5) { F[0] = 0x01B6; return; }  LATIN CAPITAL LETTER Z WITH STROKE
        if (c == 0x01B7) { F[0] = 0x0292; return; }  LATIN CAPITAL LETTER EZH
        if (c == 0x01B8) { F[0] = 0x01B9; return; }  LATIN CAPITAL LETTER EZH REVERSED
        if (c == 0x01BC) { F[0] = 0x01BD; return; }  LATIN CAPITAL LETTER TONE FIVE
        if (c == 0x01C4) { F[0] = 0x01C6; return; }  LATIN CAPITAL LETTER DZ WITH CARON
        if (c == 0x01C5) { F[0] = 0x01C6; return; }  LATIN CAPITAL LETTER D WITH SMALL LETTER Z WITH CARON
        if (c == 0x01C7) { F[0] = 0x01C9; return; }  LATIN CAPITAL LETTER LJ
        if (c == 0x01C8) { F[0] = 0x01C9; return; }  LATIN CAPITAL LETTER L WITH SMALL LETTER J
        if (c == 0x01CA) { F[0] = 0x01CC; return; }  LATIN CAPITAL LETTER NJ
        if (c == 0x01CB) { F[0] = 0x01CC; return; }  LATIN CAPITAL LETTER N WITH SMALL LETTER J
        if (c == 0x01CD) { F[0] = 0x01CE; return; }  LATIN CAPITAL LETTER A WITH CARON
        if (c == 0x01CF) { F[0] = 0x01D0; return; }  LATIN CAPITAL LETTER I WITH CARON
        if (c == 0x01D1) { F[0] = 0x01D2; return; }  LATIN CAPITAL LETTER O WITH CARON
        if (c == 0x01D3) { F[0] = 0x01D4; return; }  LATIN CAPITAL LETTER U WITH CARON
        if (c == 0x01D5) { F[0] = 0x01D6; return; }  LATIN CAPITAL LETTER U WITH DIAERESIS AND MACRON
        if (c == 0x01D7) { F[0] = 0x01D8; return; }  LATIN CAPITAL LETTER U WITH DIAERESIS AND ACUTE
        if (c == 0x01D9) { F[0] = 0x01DA; return; }  LATIN CAPITAL LETTER U WITH DIAERESIS AND CARON
        if (c == 0x01DB) { F[0] = 0x01DC; return; }  LATIN CAPITAL LETTER U WITH DIAERESIS AND GRAVE
        if (c == 0x01DE) { F[0] = 0x01DF; return; }  LATIN CAPITAL LETTER A WITH DIAERESIS AND MACRON
        if (c == 0x01E0) { F[0] = 0x01E1; return; }  LATIN CAPITAL LETTER A WITH DOT ABOVE AND MACRON
        if (c == 0x01E2) { F[0] = 0x01E3; return; }  LATIN CAPITAL LETTER AE WITH MACRON
        if (c == 0x01E4) { F[0] = 0x01E5; return; }  LATIN CAPITAL LETTER G WITH STROKE
        if (c == 0x01E6) { F[0] = 0x01E7; return; }  LATIN CAPITAL LETTER G WITH CARON
        if (c == 0x01E8) { F[0] = 0x01E9; return; }  LATIN CAPITAL LETTER K WITH CARON
        if (c == 0x01EA) { F[0] = 0x01EB; return; }  LATIN CAPITAL LETTER O WITH OGONEK
        if (c == 0x01EC) { F[0] = 0x01ED; return; }  LATIN CAPITAL LETTER O WITH OGONEK AND MACRON
        if (c == 0x01EE) { F[0] = 0x01EF; return; }  LATIN CAPITAL LETTER EZH WITH CARON
        if (c == 0x01F0) { F[0] = 0x006A; F[1] = 0x030C; return; }  LATIN SMALL LETTER J WITH CARON
        if (c == 0x01F1) { F[0] = 0x01F3; return; }  LATIN CAPITAL LETTER DZ
        if (c == 0x01F2) { F[0] = 0x01F3; return; }  LATIN CAPITAL LETTER D WITH SMALL LETTER Z
        if (c == 0x01F4) { F[0] = 0x01F5; return; }  LATIN CAPITAL LETTER G WITH ACUTE
        if (c == 0x01F6) { F[0] = 0x0195; return; }  LATIN CAPITAL LETTER HWAIR
        if (c == 0x01F7) { F[0] = 0x01BF; return; }  LATIN CAPITAL LETTER WYNN
        if (c == 0x01F8) { F[0] = 0x01F9; return; }  LATIN CAPITAL LETTER N WITH GRAVE
        if (c == 0x01FA) { F[0] = 0x01FB; return; }  LATIN CAPITAL LETTER A WITH RING ABOVE AND ACUTE
        if (c == 0x01FC) { F[0] = 0x01FD; return; }  LATIN CAPITAL LETTER AE WITH ACUTE
        if (c == 0x01FE) { F[0] = 0x01FF; return; }  LATIN CAPITAL LETTER O WITH STROKE AND ACUTE
    } else if ((c >= 0x0200) && (c < 0x0300)) {
        if (c == 0x0200) { F[0] = 0x0201; return; }  LATIN CAPITAL LETTER A WITH DOUBLE GRAVE
        if (c == 0x0202) { F[0] = 0x0203; return; }  LATIN CAPITAL LETTER A WITH INVERTED BREVE
        if (c == 0x0204) { F[0] = 0x0205; return; }  LATIN CAPITAL LETTER E WITH DOUBLE GRAVE
        if (c == 0x0206) { F[0] = 0x0207; return; }  LATIN CAPITAL LETTER E WITH INVERTED BREVE
        if (c == 0x0208) { F[0] = 0x0209; return; }  LATIN CAPITAL LETTER I WITH DOUBLE GRAVE
        if (c == 0x020A) { F[0] = 0x020B; return; }  LATIN CAPITAL LETTER I WITH INVERTED BREVE
        if (c == 0x020C) { F[0] = 0x020D; return; }  LATIN CAPITAL LETTER O WITH DOUBLE GRAVE
        if (c == 0x020E) { F[0] = 0x020F; return; }  LATIN CAPITAL LETTER O WITH INVERTED BREVE
        if (c == 0x0210) { F[0] = 0x0211; return; }  LATIN CAPITAL LETTER R WITH DOUBLE GRAVE
        if (c == 0x0212) { F[0] = 0x0213; return; }  LATIN CAPITAL LETTER R WITH INVERTED BREVE
        if (c == 0x0214) { F[0] = 0x0215; return; }  LATIN CAPITAL LETTER U WITH DOUBLE GRAVE
        if (c == 0x0216) { F[0] = 0x0217; return; }  LATIN CAPITAL LETTER U WITH INVERTED BREVE
        if (c == 0x0218) { F[0] = 0x0219; return; }  LATIN CAPITAL LETTER S WITH COMMA BELOW
        if (c == 0x021A) { F[0] = 0x021B; return; }  LATIN CAPITAL LETTER T WITH COMMA BELOW
        if (c == 0x021C) { F[0] = 0x021D; return; }  LATIN CAPITAL LETTER YOGH
        if (c == 0x021E) { F[0] = 0x021F; return; }  LATIN CAPITAL LETTER H WITH CARON
        if (c == 0x0220) { F[0] = 0x019E; return; }  LATIN CAPITAL LETTER N WITH LONG RIGHT LEG
        if (c == 0x0222) { F[0] = 0x0223; return; }  LATIN CAPITAL LETTER OU
        if (c == 0x0224) { F[0] = 0x0225; return; }  LATIN CAPITAL LETTER Z WITH HOOK
        if (c == 0x0226) { F[0] = 0x0227; return; }  LATIN CAPITAL LETTER A WITH DOT ABOVE
        if (c == 0x0228) { F[0] = 0x0229; return; }  LATIN CAPITAL LETTER E WITH CEDILLA
        if (c == 0x022A) { F[0] = 0x022B; return; }  LATIN CAPITAL LETTER O WITH DIAERESIS AND MACRON
        if (c == 0x022C) { F[0] = 0x022D; return; }  LATIN CAPITAL LETTER O WITH TILDE AND MACRON
        if (c == 0x022E) { F[0] = 0x022F; return; }  LATIN CAPITAL LETTER O WITH DOT ABOVE
        if (c == 0x0230) { F[0] = 0x0231; return; }  LATIN CAPITAL LETTER O WITH DOT ABOVE AND MACRON
        if (c == 0x0232) { F[0] = 0x0233; return; }  LATIN CAPITAL LETTER Y WITH MACRON
        if (c == 0x023A) { F[0] = 0x2C65; return; }  LATIN CAPITAL LETTER A WITH STROKE
        if (c == 0x023B) { F[0] = 0x023C; return; }  LATIN CAPITAL LETTER C WITH STROKE
        if (c == 0x023D) { F[0] = 0x019A; return; }  LATIN CAPITAL LETTER L WITH BAR
        if (c == 0x023E) { F[0] = 0x2C66; return; }  LATIN CAPITAL LETTER T WITH DIAGONAL STROKE
        if (c == 0x0241) { F[0] = 0x0242; return; }  LATIN CAPITAL LETTER GLOTTAL STOP
        if (c == 0x0243) { F[0] = 0x0180; return; }  LATIN CAPITAL LETTER B WITH STROKE
        if (c == 0x0244) { F[0] = 0x0289; return; }  LATIN CAPITAL LETTER U BAR
        if (c == 0x0245) { F[0] = 0x028C; return; }  LATIN CAPITAL LETTER TURNED V
        if (c == 0x0246) { F[0] = 0x0247; return; }  LATIN CAPITAL LETTER E WITH STROKE
        if (c == 0x0248) { F[0] = 0x0249; return; }  LATIN CAPITAL LETTER J WITH STROKE
        if (c == 0x024A) { F[0] = 0x024B; return; }  LATIN CAPITAL LETTER SMALL Q WITH HOOK TAIL
        if (c == 0x024C) { F[0] = 0x024D; return; }  LATIN CAPITAL LETTER R WITH STROKE
        if (c == 0x024E) { F[0] = 0x024F; return; }  LATIN CAPITAL LETTER Y WITH STROKE
    } else if ((c >= 0x0300) && (c < 0x0400)) {
        if (c == 0x0345) { F[0] = 0x03B9; return; }  COMBINING GREEK YPOGEGRAMMENI
        if (c == 0x0370) { F[0] = 0x0371; return; }  GREEK CAPITAL LETTER HETA
        if (c == 0x0372) { F[0] = 0x0373; return; }  GREEK CAPITAL LETTER ARCHAIC SAMPI
        if (c == 0x0376) { F[0] = 0x0377; return; }  GREEK CAPITAL LETTER PAMPHYLIAN DIGAMMA
        if (c == 0x037F) { F[0] = 0x03F3; return; }  GREEK CAPITAL LETTER YOT
        if (c == 0x0386) { F[0] = 0x03AC; return; }  GREEK CAPITAL LETTER ALPHA WITH TONOS
        if ((c >= 0x0388) && (c <= 0x038A)) { F[0] = 0x03AD + (c - 0x0388); return; }  GREEK CAPITAL LETTER EPSILON WITH TONOS to GREEK CAPITAL LETTER IOTA WITH TONOS
        if (c == 0x038C) { F[0] = 0x03CC; return; }  GREEK CAPITAL LETTER OMICRON WITH TONOS
        if (c == 0x038E) { F[0] = 0x03CD; return; }  GREEK CAPITAL LETTER UPSILON WITH TONOS
        if (c == 0x038F) { F[0] = 0x03CE; return; }  GREEK CAPITAL LETTER OMEGA WITH TONOS
        if (c == 0x0390) { F[0] = 0x03B9; F[1] = 0x0308; F[2] = 0x0301; return; }  GREEK SMALL LETTER IOTA WITH DIALYTIKA AND TONOS
        if ((c >= 0x0391) && (c <= 0x03A1)) { F[0] = 0x03B1 + (c - 0x0391); return; }  GREEK CAPITAL LETTER ALPHA to GREEK CAPITAL LETTER RHO
        if ((c >= 0x03A3) && (c <= 0x03AB)) { F[0] = 0x03C3 + (c - 0x03A3); return; }  GREEK CAPITAL LETTER SIGMA to GREEK CAPITAL LETTER UPSILON WITH DIALYTIKA
        if (c == 0x03B0) { F[0] = 0x03C5; F[1] = 0x0308; F[2] = 0x0301; return; }  GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND TONOS
        if (c == 0x03C2) { F[0] = 0x03C3; return; }  GREEK SMALL LETTER FINAL SIGMA
        if (c == 0x03CF) { F[0] = 0x03D7; return; }  GREEK CAPITAL KAI SYMBOL
        if (c == 0x03D0) { F[0] = 0x03B2; return; }  GREEK BETA SYMBOL
        if (c == 0x03D1) { F[0] = 0x03B8; return; }  GREEK THETA SYMBOL
        if (c == 0x03D5) { F[0] = 0x03C6; return; }  GREEK PHI SYMBOL
        if (c == 0x03D6) { F[0] = 0x03C0; return; }  GREEK PI SYMBOL
        if (c == 0x03D8) { F[0] = 0x03D9; return; }  GREEK LETTER ARCHAIC KOPPA
        if (c == 0x03DA) { F[0] = 0x03DB; return; }  GREEK LETTER STIGMA
        if (c == 0x03DC) { F[0] = 0x03DD; return; }  GREEK LETTER DIGAMMA
        if (c == 0x03DE) { F[0] = 0x03DF; return; }  GREEK LETTER KOPPA
        if (c == 0x03E0) { F[0] = 0x03E1; return; }  GREEK LETTER SAMPI
        if (c == 0x03E2) { F[0] = 0x03E3; return; }  COPTIC CAPITAL LETTER SHEI
        if (c == 0x03E4) { F[0] = 0x03E5; return; }  COPTIC CAPITAL LETTER FEI
        if (c == 0x03E6) { F[0] = 0x03E7; return; }  COPTIC CAPITAL LETTER KHEI
        if (c == 0x03E8) { F[0] = 0x03E9; return; }  COPTIC CAPITAL LETTER HORI
        if (c == 0x03EA) { F[0] = 0x03EB; return; }  COPTIC CAPITAL LETTER GANGIA
        if (c == 0x03EC) { F[0] = 0x03ED; return; }  COPTIC CAPITAL LETTER SHIMA
        if (c == 0x03EE) { F[0] = 0x03EF; return; }  COPTIC CAPITAL LETTER DEI
        if (c == 0x03F0) { F[0] = 0x03BA; return; }  GREEK KAPPA SYMBOL
        if (c == 0x03F1) { F[0] = 0x03C1; return; }  GREEK RHO SYMBOL
        if (c == 0x03F4) { F[0] = 0x03B8; return; }  GREEK CAPITAL THETA SYMBOL
        if (c == 0x03F5) { F[0] = 0x03B5; return; }  GREEK LUNATE EPSILON SYMBOL
        if (c == 0x03F7) { F[0] = 0x03F8; return; }  GREEK CAPITAL LETTER SHO
        if (c == 0x03F9) { F[0] = 0x03F2; return; }  GREEK CAPITAL LUNATE SIGMA SYMBOL
        if (c == 0x03FA) { F[0] = 0x03FB; return; }  GREEK CAPITAL LETTER SAN
        if ((c >= 0x03FD) && (c <= 0x03FF)) { F[0] = 0x037B + (c - 0x03FD); return; }  GREEK CAPITAL REVERSED LUNATE SIGMA SYMBOL to GREEK CAPITAL REVERSED DOTTED LUNATE SIGMA SYMBOL
    } else if ((c >= 0x0400) && (c < 0x0500)) {
        if ((c >= 0x0400) && (c <= 0x040F)) { F[0] = 0x0450 + (c - 0x0400); return; }  CYRILLIC CAPITAL LETTER IE WITH GRAVE to CYRILLIC CAPITAL LETTER DZHE
        if ((c >= 0x0410) && (c <= 0x042F)) { F[0] = 0x0430 + (c - 0x0410); return; }  CYRILLIC CAPITAL LETTER A to CYRILLIC CAPITAL LETTER YA
        if (c == 0x0460) { F[0] = 0x0461; return; }  CYRILLIC CAPITAL LETTER OMEGA
        if (c == 0x0462) { F[0] = 0x0463; return; }  CYRILLIC CAPITAL LETTER YAT
        if (c == 0x0464) { F[0] = 0x0465; return; }  CYRILLIC CAPITAL LETTER IOTIFIED E
        if (c == 0x0466) { F[0] = 0x0467; return; }  CYRILLIC CAPITAL LETTER LITTLE YUS
        if (c == 0x0468) { F[0] = 0x0469; return; }  CYRILLIC CAPITAL LETTER IOTIFIED LITTLE YUS
        if (c == 0x046A) { F[0] = 0x046B; return; }  CYRILLIC CAPITAL LETTER BIG YUS
        if (c == 0x046C) { F[0] = 0x046D; return; }  CYRILLIC CAPITAL LETTER IOTIFIED BIG YUS
        if (c == 0x046E) { F[0] = 0x046F; return; }  CYRILLIC CAPITAL LETTER KSI
        if (c == 0x0470) { F[0] = 0x0471; return; }  CYRILLIC CAPITAL LETTER PSI
        if (c == 0x0472) { F[0] = 0x0473; return; }  CYRILLIC CAPITAL LETTER FITA
        if (c == 0x0474) { F[0] = 0x0475; return; }  CYRILLIC CAPITAL LETTER IZHITSA
        if (c == 0x0476) { F[0] = 0x0477; return; }  CYRILLIC CAPITAL LETTER IZHITSA WITH DOUBLE GRAVE ACCENT
        if (c == 0x0478) { F[0] = 0x0479; return; }  CYRILLIC CAPITAL LETTER UK
        if (c == 0x047A) { F[0] = 0x047B; return; }  CYRILLIC CAPITAL LETTER ROUND OMEGA
        if (c == 0x047C) { F[0] = 0x047D; return; }  CYRILLIC CAPITAL LETTER OMEGA WITH TITLO
        if (c == 0x047E) { F[0] = 0x047F; return; }  CYRILLIC CAPITAL LETTER OT
        if (c == 0x0480) { F[0] = 0x0481; return; }  CYRILLIC CAPITAL LETTER KOPPA
        if (c == 0x048A) { F[0] = 0x048B; return; }  CYRILLIC CAPITAL LETTER SHORT I WITH TAIL
        if (c == 0x048C) { F[0] = 0x048D; return; }  CYRILLIC CAPITAL LETTER SEMISOFT SIGN
        if (c == 0x048E) { F[0] = 0x048F; return; }  CYRILLIC CAPITAL LETTER ER WITH TICK
        if (c == 0x0490) { F[0] = 0x0491; return; }  CYRILLIC CAPITAL LETTER GHE WITH UPTURN
        if (c == 0x0492) { F[0] = 0x0493; return; }  CYRILLIC CAPITAL LETTER GHE WITH STROKE
        if (c == 0x0494) { F[0] = 0x0495; return; }  CYRILLIC CAPITAL LETTER GHE WITH MIDDLE HOOK
        if (c == 0x0496) { F[0] = 0x0497; return; }  CYRILLIC CAPITAL LETTER ZHE WITH DESCENDER
        if (c == 0x0498) { F[0] = 0x0499; return; }  CYRILLIC CAPITAL LETTER ZE WITH DESCENDER
        if (c == 0x049A) { F[0] = 0x049B; return; }  CYRILLIC CAPITAL LETTER KA WITH DESCENDER
        if (c == 0x049C) { F[0] = 0x049D; return; }  CYRILLIC CAPITAL LETTER KA WITH VERTICAL STROKE
        if (c == 0x049E) { F[0] = 0x049F; return; }  CYRILLIC CAPITAL LETTER KA WITH STROKE
        if (c == 0x04A0) { F[0] = 0x04A1; return; }  CYRILLIC CAPITAL LETTER BASHKIR KA
        if (c == 0x04A2) { F[0] = 0x04A3; return; }  CYRILLIC CAPITAL LETTER EN WITH DESCENDER
        if (c == 0x04A4) { F[0] = 0x04A5; return; }  CYRILLIC CAPITAL LIGATURE EN GHE
        if (c == 0x04A6) { F[0] = 0x04A7; return; }  CYRILLIC CAPITAL LETTER PE WITH MIDDLE HOOK
        if (c == 0x04A8) { F[0] = 0x04A9; return; }  CYRILLIC CAPITAL LETTER ABKHASIAN HA
        if (c == 0x04AA) { F[0] = 0x04AB; return; }  CYRILLIC CAPITAL LETTER ES WITH DESCENDER
        if (c == 0x04AC) { F[0] = 0x04AD; return; }  CYRILLIC CAPITAL LETTER TE WITH DESCENDER
        if (c == 0x04AE) { F[0] = 0x04AF; return; }  CYRILLIC CAPITAL LETTER STRAIGHT U
        if (c == 0x04B0) { F[0] = 0x04B1; return; }  CYRILLIC CAPITAL LETTER STRAIGHT U WITH STROKE
        if (c == 0x04B2) { F[0] = 0x04B3; return; }  CYRILLIC CAPITAL LETTER HA WITH DESCENDER
        if (c == 0x04B4) { F[0] = 0x04B5; return; }  CYRILLIC CAPITAL LIGATURE TE TSE
        if (c == 0x04B6) { F[0] = 0x04B7; return; }  CYRILLIC CAPITAL LETTER CHE WITH DESCENDER
        if (c == 0x04B8) { F[0] = 0x04B9; return; }  CYRILLIC CAPITAL LETTER CHE WITH VERTICAL STROKE
        if (c == 0x04BA) { F[0] = 0x04BB; return; }  CYRILLIC CAPITAL LETTER SHHA
        if (c == 0x04BC) { F[0] = 0x04BD; return; }  CYRILLIC CAPITAL LETTER ABKHASIAN CHE
        if (c == 0x04BE) { F[0] = 0x04BF; return; }  CYRILLIC CAPITAL LETTER ABKHASIAN CHE WITH DESCENDER
        if (c == 0x04C0) { F[0] = 0x04CF; return; }  CYRILLIC LETTER PALOCHKA
        if (c == 0x04C1) { F[0] = 0x04C2; return; }  CYRILLIC CAPITAL LETTER ZHE WITH BREVE
        if (c == 0x04C3) { F[0] = 0x04C4; return; }  CYRILLIC CAPITAL LETTER KA WITH HOOK
        if (c == 0x04C5) { F[0] = 0x04C6; return; }  CYRILLIC CAPITAL LETTER EL WITH TAIL
        if (c == 0x04C7) { F[0] = 0x04C8; return; }  CYRILLIC CAPITAL LETTER EN WITH HOOK
        if (c == 0x04C9) { F[0] = 0x04CA; return; }  CYRILLIC CAPITAL LETTER EN WITH TAIL
        if (c == 0x04CB) { F[0] = 0x04CC; return; }  CYRILLIC CAPITAL LETTER KHAKASSIAN CHE
        if (c == 0x04CD) { F[0] = 0x04CE; return; }  CYRILLIC CAPITAL LETTER EM WITH TAIL
        if (c == 0x04D0) { F[0] = 0x04D1; return; }  CYRILLIC CAPITAL LETTER A WITH BREVE
        if (c == 0x04D2) { F[0] = 0x04D3; return; }  CYRILLIC CAPITAL LETTER A WITH DIAERESIS
        if (c == 0x04D4) { F[0] = 0x04D5; return; }  CYRILLIC CAPITAL LIGATURE A IE
        if (c == 0x04D6) { F[0] = 0x04D7; return; }  CYRILLIC CAPITAL LETTER IE WITH BREVE
        if (c == 0x04D8) { F[0] = 0x04D9; return; }  CYRILLIC CAPITAL LETTER SCHWA
        if (c == 0x04DA) { F[0] = 0x04DB; return; }  CYRILLIC CAPITAL LETTER SCHWA WITH DIAERESIS
        if (c == 0x04DC) { F[0] = 0x04DD; return; }  CYRILLIC CAPITAL LETTER ZHE WITH DIAERESIS
        if (c == 0x04DE) { F[0] = 0x04DF; return; }  CYRILLIC CAPITAL LETTER ZE WITH DIAERESIS
        if (c == 0x04E0) { F[0] = 0x04E1; return; }  CYRILLIC CAPITAL LETTER ABKHASIAN DZE
        if (c == 0x04E2) { F[0] = 0x04E3; return; }  CYRILLIC CAPITAL LETTER I WITH MACRON
        if (c == 0x04E4) { F[0] = 0x04E5; return; }  CYRILLIC CAPITAL LETTER I WITH DIAERESIS
        if (c == 0x04E6) { F[0] = 0x04E7; return; }  CYRILLIC CAPITAL LETTER O WITH DIAERESIS
        if (c == 0x04E8) { F[0] = 0x04E9; return; }  CYRILLIC CAPITAL LETTER BARRED O
        if (c == 0x04EA) { F[0] = 0x04EB; return; }  CYRILLIC CAPITAL LETTER BARRED O WITH DIAERESIS
        if (c == 0x04EC) { F[0] = 0x04ED; return; }  CYRILLIC CAPITAL LETTER E WITH DIAERESIS
        if (c == 0x04EE) { F[0] = 0x04EF; return; }  CYRILLIC CAPITAL LETTER U WITH MACRON
        if (c == 0x04F0) { F[0] = 0x04F1; return; }  CYRILLIC CAPITAL LETTER U WITH DIAERESIS
        if (c == 0x04F2) { F[0] = 0x04F3; return; }  CYRILLIC CAPITAL LETTER U WITH DOUBLE ACUTE
        if (c == 0x04F4) { F[0] = 0x04F5; return; }  CYRILLIC CAPITAL LETTER CHE WITH DIAERESIS
        if (c == 0x04F6) { F[0] = 0x04F7; return; }  CYRILLIC CAPITAL LETTER GHE WITH DESCENDER
        if (c == 0x04F8) { F[0] = 0x04F9; return; }  CYRILLIC CAPITAL LETTER YERU WITH DIAERESIS
        if (c == 0x04FA) { F[0] = 0x04FB; return; }  CYRILLIC CAPITAL LETTER GHE WITH STROKE AND HOOK
        if (c == 0x04FC) { F[0] = 0x04FD; return; }  CYRILLIC CAPITAL LETTER HA WITH HOOK
        if (c == 0x04FE) { F[0] = 0x04FF; return; }  CYRILLIC CAPITAL LETTER HA WITH STROKE
    } else if ((c >= 0x0500) && (c < 0x0600)) {
        if (c == 0x0500) { F[0] = 0x0501; return; }  CYRILLIC CAPITAL LETTER KOMI DE
        if (c == 0x0502) { F[0] = 0x0503; return; }  CYRILLIC CAPITAL LETTER KOMI DJE
        if (c == 0x0504) { F[0] = 0x0505; return; }  CYRILLIC CAPITAL LETTER KOMI ZJE
        if (c == 0x0506) { F[0] = 0x0507; return; }  CYRILLIC CAPITAL LETTER KOMI DZJE
        if (c == 0x0508) { F[0] = 0x0509; return; }  CYRILLIC CAPITAL LETTER KOMI LJE
        if (c == 0x050A) { F[0] = 0x050B; return; }  CYRILLIC CAPITAL LETTER KOMI NJE
        if (c == 0x050C) { F[0] = 0x050D; return; }  CYRILLIC CAPITAL LETTER KOMI SJE
        if (c == 0x050E) { F[0] = 0x050F; return; }  CYRILLIC CAPITAL LETTER KOMI TJE
        if (c == 0x0510) { F[0] = 0x0511; return; }  CYRILLIC CAPITAL LETTER REVERSED ZE
        if (c == 0x0512) { F[0] = 0x0513; return; }  CYRILLIC CAPITAL LETTER EL WITH HOOK
        if (c == 0x0514) { F[0] = 0x0515; return; }  CYRILLIC CAPITAL LETTER LHA
        if (c == 0x0516) { F[0] = 0x0517; return; }  CYRILLIC CAPITAL LETTER RHA
        if (c == 0x0518) { F[0] = 0x0519; return; }  CYRILLIC CAPITAL LETTER YAE
        if (c == 0x051A) { F[0] = 0x051B; return; }  CYRILLIC CAPITAL LETTER QA
        if (c == 0x051C) { F[0] = 0x051D; return; }  CYRILLIC CAPITAL LETTER WE
        if (c == 0x051E) { F[0] = 0x051F; return; }  CYRILLIC CAPITAL LETTER ALEUT KA
        if (c == 0x0520) { F[0] = 0x0521; return; }  CYRILLIC CAPITAL LETTER EL WITH MIDDLE HOOK
        if (c == 0x0522) { F[0] = 0x0523; return; }  CYRILLIC CAPITAL LETTER EN WITH MIDDLE HOOK
        if (c == 0x0524) { F[0] = 0x0525; return; }  CYRILLIC CAPITAL LETTER PE WITH DESCENDER
        if (c == 0x0526) { F[0] = 0x0527; return; }  CYRILLIC CAPITAL LETTER SHHA WITH DESCENDER
        if (c == 0x0528) { F[0] = 0x0529; return; }  CYRILLIC CAPITAL LETTER EN WITH LEFT HOOK
        if (c == 0x052A) { F[0] = 0x052B; return; }  CYRILLIC CAPITAL LETTER DZZHE
        if (c == 0x052C) { F[0] = 0x052D; return; }  CYRILLIC CAPITAL LETTER DCHE
        if (c == 0x052E) { F[0] = 0x052F; return; }  CYRILLIC CAPITAL LETTER EL WITH DESCENDER
        if ((c >= 0x0531) && (c <= 0x0556)) { F[0] = 0x0561 + (c - 0x0531); return; }  ARMENIAN CAPITAL LETTER AYB to ARMENIAN CAPITAL LETTER FEH
        if (c == 0x0587) { F[0] = 0x0565; F[1] = 0x0582; return; }  ARMENIAN SMALL LIGATURE ECH YIWN
    } else if ((c >= 0x1000) && (c < 0x2000)) {
        if ((c >= 0x10A0) && (c <= 0x10C5)) { F[0] = 0x2D00 + (c - 0x10A0); return; }  GEORGIAN CAPITAL LETTER AN to GEORGIAN CAPITAL LETTER HOE
        if (c == 0x10C7) { F[0] = 0x2D27; return; }  GEORGIAN CAPITAL LETTER YN
        if (c == 0x10CD) { F[0] = 0x2D2D; return; }  GEORGIAN CAPITAL LETTER AEN
        if ((c >= 0x13F8) && (c <= 0x13FD)) { F[0] = 0x13F0 + (c - 0x13F8); return; }  CHEROKEE SMALL LETTER YE to CHEROKEE SMALL LETTER MV
        if (c == 0x1C80) { F[0] = 0x0432; return; }  CYRILLIC SMALL LETTER ROUNDED VE
        if (c == 0x1C81) { F[0] = 0x0434; return; }  CYRILLIC SMALL LETTER LONG-LEGGED DE
        if (c == 0x1C82) { F[0] = 0x043E; return; }  CYRILLIC SMALL LETTER NARROW O
        if (c == 0x1C83) { F[0] = 0x0441; return; }  CYRILLIC SMALL LETTER WIDE ES
        if (c == 0x1C84) { F[0] = 0x0442; return; }  CYRILLIC SMALL LETTER TALL TE
        if (c == 0x1C85) { F[0] = 0x0442; return; }  CYRILLIC SMALL LETTER THREE-LEGGED TE
        if (c == 0x1C86) { F[0] = 0x044A; return; }  CYRILLIC SMALL LETTER TALL HARD SIGN
        if (c == 0x1C87) { F[0] = 0x0463; return; }  CYRILLIC SMALL LETTER TALL YAT
        if (c == 0x1C88) { F[0] = 0xA64B; return; }  CYRILLIC SMALL LETTER UNBLENDED UK
        if ((c >= 0x1C90) && (c <= 0x1CBA)) { F[0] = 0x10D0 + (c - 0x1C90); return; }  GEORGIAN MTAVRULI CAPITAL LETTER AN to GEORGIAN MTAVRULI CAPITAL LETTER AIN
        if ((c >= 0x1CBD) && (c <= 0x1CBF)) { F[0] = 0x10FD + (c - 0x1CBD); return; }  GEORGIAN MTAVRULI CAPITAL LETTER AEN to GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN
        if (c == 0x1E00) { F[0] = 0x1E01; return; }  LATIN CAPITAL LETTER A WITH RING BELOW
        if (c == 0x1E02) { F[0] = 0x1E03; return; }  LATIN CAPITAL LETTER B WITH DOT ABOVE
        if (c == 0x1E04) { F[0] = 0x1E05; return; }  LATIN CAPITAL LETTER B WITH DOT BELOW
        if (c == 0x1E06) { F[0] = 0x1E07; return; }  LATIN CAPITAL LETTER B WITH LINE BELOW
        if (c == 0x1E08) { F[0] = 0x1E09; return; }  LATIN CAPITAL LETTER C WITH CEDILLA AND ACUTE
        if (c == 0x1E0A) { F[0] = 0x1E0B; return; }  LATIN CAPITAL LETTER D WITH DOT ABOVE
        if (c == 0x1E0C) { F[0] = 0x1E0D; return; }  LATIN CAPITAL LETTER D WITH DOT BELOW
        if (c == 0x1E0E) { F[0] = 0x1E0F; return; }  LATIN CAPITAL LETTER D WITH LINE BELOW
        if (c == 0x1E10) { F[0] = 0x1E11; return; }  LATIN CAPITAL LETTER D WITH CEDILLA
        if (c == 0x1E12) { F[0] = 0x1E13; return; }  LATIN CAPITAL LETTER D WITH CIRCUMFLEX BELOW
        if (c == 0x1E14) { F[0] = 0x1E15; return; }  LATIN CAPITAL LETTER E WITH MACRON AND GRAVE
        if (c == 0x1E16) { F[0] = 0x1E17; return; }  LATIN CAPITAL LETTER E WITH MACRON AND ACUTE
        if (c == 0x1E18) { F[0] = 0x1E19; return; }  LATIN CAPITAL LETTER E WITH CIRCUMFLEX BELOW
        if (c == 0x1E1A) { F[0] = 0x1E1B; return; }  LATIN CAPITAL LETTER E WITH TILDE BELOW
        if (c == 0x1E1C) { F[0] = 0x1E1D; return; }  LATIN CAPITAL LETTER E WITH CEDILLA AND BREVE
        if (c == 0x1E1E) { F[0] = 0x1E1F; return; }  LATIN CAPITAL LETTER F WITH DOT ABOVE
        if (c == 0x1E20) { F[0] = 0x1E21; return; }  LATIN CAPITAL LETTER G WITH MACRON
        if (c == 0x1E22) { F[0] = 0x1E23; return; }  LATIN CAPITAL LETTER H WITH DOT ABOVE
        if (c == 0x1E24) { F[0] = 0x1E25; return; }  LATIN CAPITAL LETTER H WITH DOT BELOW
        if (c == 0x1E26) { F[0] = 0x1E27; return; }  LATIN CAPITAL LETTER H WITH DIAERESIS
        if (c == 0x1E28) { F[0] = 0x1E29; return; }  LATIN CAPITAL LETTER H WITH CEDILLA
        if (c == 0x1E2A) { F[0] = 0x1E2B; return; }  LATIN CAPITAL LETTER H WITH BREVE BELOW
        if (c == 0x1E2C) { F[0] = 0x1E2D; return; }  LATIN CAPITAL LETTER I WITH TILDE BELOW
        if (c == 0x1E2E) { F[0] = 0x1E2F; return; }  LATIN CAPITAL LETTER I WITH DIAERESIS AND ACUTE
        if (c == 0x1E30) { F[0] = 0x1E31; return; }  LATIN CAPITAL LETTER K WITH ACUTE
        if (c == 0x1E32) { F[0] = 0x1E33; return; }  LATIN CAPITAL LETTER K WITH DOT BELOW
        if (c == 0x1E34) { F[0] = 0x1E35; return; }  LATIN CAPITAL LETTER K WITH LINE BELOW
        if (c == 0x1E36) { F[0] = 0x1E37; return; }  LATIN CAPITAL LETTER L WITH DOT BELOW
        if (c == 0x1E38) { F[0] = 0x1E39; return; }  LATIN CAPITAL LETTER L WITH DOT BELOW AND MACRON
        if (c == 0x1E3A) { F[0] = 0x1E3B; return; }  LATIN CAPITAL LETTER L WITH LINE BELOW
        if (c == 0x1E3C) { F[0] = 0x1E3D; return; }  LATIN CAPITAL LETTER L WITH CIRCUMFLEX BELOW
        if (c == 0x1E3E) { F[0] = 0x1E3F; return; }  LATIN CAPITAL LETTER M WITH ACUTE
        if (c == 0x1E40) { F[0] = 0x1E41; return; }  LATIN CAPITAL LETTER M WITH DOT ABOVE
        if (c == 0x1E42) { F[0] = 0x1E43; return; }  LATIN CAPITAL LETTER M WITH DOT BELOW
        if (c == 0x1E44) { F[0] = 0x1E45; return; }  LATIN CAPITAL LETTER N WITH DOT ABOVE
        if (c == 0x1E46) { F[0] = 0x1E47; return; }  LATIN CAPITAL LETTER N WITH DOT BELOW
        if (c == 0x1E48) { F[0] = 0x1E49; return; }  LATIN CAPITAL LETTER N WITH LINE BELOW
        if (c == 0x1E4A) { F[0] = 0x1E4B; return; }  LATIN CAPITAL LETTER N WITH CIRCUMFLEX BELOW
        if (c == 0x1E4C) { F[0] = 0x1E4D; return; }  LATIN CAPITAL LETTER O WITH TILDE AND ACUTE
        if (c == 0x1E4E) { F[0] = 0x1E4F; return; }  LATIN CAPITAL LETTER O WITH TILDE AND DIAERESIS
        if (c == 0x1E50) { F[0] = 0x1E51; return; }  LATIN CAPITAL LETTER O WITH MACRON AND GRAVE
        if (c == 0x1E52) { F[0] = 0x1E53; return; }  LATIN CAPITAL LETTER O WITH MACRON AND ACUTE
        if (c == 0x1E54) { F[0] = 0x1E55; return; }  LATIN CAPITAL LETTER P WITH ACUTE
        if (c == 0x1E56) { F[0] = 0x1E57; return; }  LATIN CAPITAL LETTER P WITH DOT ABOVE
        if (c == 0x1E58) { F[0] = 0x1E59; return; }  LATIN CAPITAL LETTER R WITH DOT ABOVE
        if (c == 0x1E5A) { F[0] = 0x1E5B; return; }  LATIN CAPITAL LETTER R WITH DOT BELOW
        if (c == 0x1E5C) { F[0] = 0x1E5D; return; }  LATIN CAPITAL LETTER R WITH DOT BELOW AND MACRON
        if (c == 0x1E5E) { F[0] = 0x1E5F; return; }  LATIN CAPITAL LETTER R WITH LINE BELOW
        if (c == 0x1E60) { F[0] = 0x1E61; return; }  LATIN CAPITAL LETTER S WITH DOT ABOVE
        if (c == 0x1E62) { F[0] = 0x1E63; return; }  LATIN CAPITAL LETTER S WITH DOT BELOW
        if (c == 0x1E64) { F[0] = 0x1E65; return; }  LATIN CAPITAL LETTER S WITH ACUTE AND DOT ABOVE
        if (c == 0x1E66) { F[0] = 0x1E67; return; }  LATIN CAPITAL LETTER S WITH CARON AND DOT ABOVE
        if (c == 0x1E68) { F[0] = 0x1E69; return; }  LATIN CAPITAL LETTER S WITH DOT BELOW AND DOT ABOVE
        if (c == 0x1E6A) { F[0] = 0x1E6B; return; }  LATIN CAPITAL LETTER T WITH DOT ABOVE
        if (c == 0x1E6C) { F[0] = 0x1E6D; return; }  LATIN CAPITAL LETTER T WITH DOT BELOW
        if (c == 0x1E6E) { F[0] = 0x1E6F; return; }  LATIN CAPITAL LETTER T WITH LINE BELOW
        if (c == 0x1E70) { F[0] = 0x1E71; return; }  LATIN CAPITAL LETTER T WITH CIRCUMFLEX BELOW
        if (c == 0x1E72) { F[0] = 0x1E73; return; }  LATIN CAPITAL LETTER U WITH DIAERESIS BELOW
        if (c == 0x1E74) { F[0] = 0x1E75; return; }  LATIN CAPITAL LETTER U WITH TILDE BELOW
        if (c == 0x1E76) { F[0] = 0x1E77; return; }  LATIN CAPITAL LETTER U WITH CIRCUMFLEX BELOW
        if (c == 0x1E78) { F[0] = 0x1E79; return; }  LATIN CAPITAL LETTER U WITH TILDE AND ACUTE
        if (c == 0x1E7A) { F[0] = 0x1E7B; return; }  LATIN CAPITAL LETTER U WITH MACRON AND DIAERESIS
        if (c == 0x1E7C) { F[0] = 0x1E7D; return; }  LATIN CAPITAL LETTER V WITH TILDE
        if (c == 0x1E7E) { F[0] = 0x1E7F; return; }  LATIN CAPITAL LETTER V WITH DOT BELOW
        if (c == 0x1E80) { F[0] = 0x1E81; return; }  LATIN CAPITAL LETTER W WITH GRAVE
        if (c == 0x1E82) { F[0] = 0x1E83; return; }  LATIN CAPITAL LETTER W WITH ACUTE
        if (c == 0x1E84) { F[0] = 0x1E85; return; }  LATIN CAPITAL LETTER W WITH DIAERESIS
        if (c == 0x1E86) { F[0] = 0x1E87; return; }  LATIN CAPITAL LETTER W WITH DOT ABOVE
        if (c == 0x1E88) { F[0] = 0x1E89; return; }  LATIN CAPITAL LETTER W WITH DOT BELOW
        if (c == 0x1E8A) { F[0] = 0x1E8B; return; }  LATIN CAPITAL LETTER X WITH DOT ABOVE
        if (c == 0x1E8C) { F[0] = 0x1E8D; return; }  LATIN CAPITAL LETTER X WITH DIAERESIS
        if (c == 0x1E8E) { F[0] = 0x1E8F; return; }  LATIN CAPITAL LETTER Y WITH DOT ABOVE
        if (c == 0x1E90) { F[0] = 0x1E91; return; }  LATIN CAPITAL LETTER Z WITH CIRCUMFLEX
        if (c == 0x1E92) { F[0] = 0x1E93; return; }  LATIN CAPITAL LETTER Z WITH DOT BELOW
        if (c == 0x1E94) { F[0] = 0x1E95; return; }  LATIN CAPITAL LETTER Z WITH LINE BELOW
        if (c == 0x1E96) { F[0] = 0x0068; F[1] = 0x0331; return; }  LATIN SMALL LETTER H WITH LINE BELOW
        if (c == 0x1E97) { F[0] = 0x0074; F[1] = 0x0308; return; }  LATIN SMALL LETTER T WITH DIAERESIS
        if (c == 0x1E98) { F[0] = 0x0077; F[1] = 0x030A; return; }  LATIN SMALL LETTER W WITH RING ABOVE
        if (c == 0x1E99) { F[0] = 0x0079; F[1] = 0x030A; return; }  LATIN SMALL LETTER Y WITH RING ABOVE
        if (c == 0x1E9A) { F[0] = 0x0061; F[1] = 0x02BE; return; }  LATIN SMALL LETTER A WITH RIGHT HALF RING
        if (c == 0x1E9B) { F[0] = 0x1E61; return; }  LATIN SMALL LETTER LONG S WITH DOT ABOVE
        if (c == 0x1E9E) { F[0] = 0x0073; F[1] = 0x0073; return; }  LATIN CAPITAL LETTER SHARP S
        if (c == 0x1EA0) { F[0] = 0x1EA1; return; }  LATIN CAPITAL LETTER A WITH DOT BELOW
        if (c == 0x1EA2) { F[0] = 0x1EA3; return; }  LATIN CAPITAL LETTER A WITH HOOK ABOVE
        if (c == 0x1EA4) { F[0] = 0x1EA5; return; }  LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND ACUTE
        if (c == 0x1EA6) { F[0] = 0x1EA7; return; }  LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND GRAVE
        if (c == 0x1EA8) { F[0] = 0x1EA9; return; }  LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND HOOK ABOVE
        if (c == 0x1EAA) { F[0] = 0x1EAB; return; }  LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND TILDE
        if (c == 0x1EAC) { F[0] = 0x1EAD; return; }  LATIN CAPITAL LETTER A WITH CIRCUMFLEX AND DOT BELOW
        if (c == 0x1EAE) { F[0] = 0x1EAF; return; }  LATIN CAPITAL LETTER A WITH BREVE AND ACUTE
        if (c == 0x1EB0) { F[0] = 0x1EB1; return; }  LATIN CAPITAL LETTER A WITH BREVE AND GRAVE
        if (c == 0x1EB2) { F[0] = 0x1EB3; return; }  LATIN CAPITAL LETTER A WITH BREVE AND HOOK ABOVE
        if (c == 0x1EB4) { F[0] = 0x1EB5; return; }  LATIN CAPITAL LETTER A WITH BREVE AND TILDE
        if (c == 0x1EB6) { F[0] = 0x1EB7; return; }  LATIN CAPITAL LETTER A WITH BREVE AND DOT BELOW
        if (c == 0x1EB8) { F[0] = 0x1EB9; return; }  LATIN CAPITAL LETTER E WITH DOT BELOW
        if (c == 0x1EBA) { F[0] = 0x1EBB; return; }  LATIN CAPITAL LETTER E WITH HOOK ABOVE
        if (c == 0x1EBC) { F[0] = 0x1EBD; return; }  LATIN CAPITAL LETTER E WITH TILDE
        if (c == 0x1EBE) { F[0] = 0x1EBF; return; }  LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND ACUTE
        if (c == 0x1EC0) { F[0] = 0x1EC1; return; }  LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND GRAVE
        if (c == 0x1EC2) { F[0] = 0x1EC3; return; }  LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND HOOK ABOVE
        if (c == 0x1EC4) { F[0] = 0x1EC5; return; }  LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND TILDE
        if (c == 0x1EC6) { F[0] = 0x1EC7; return; }  LATIN CAPITAL LETTER E WITH CIRCUMFLEX AND DOT BELOW
        if (c == 0x1EC8) { F[0] = 0x1EC9; return; }  LATIN CAPITAL LETTER I WITH HOOK ABOVE
        if (c == 0x1ECA) { F[0] = 0x1ECB; return; }  LATIN CAPITAL LETTER I WITH DOT BELOW
        if (c == 0x1ECC) { F[0] = 0x1ECD; return; }  LATIN CAPITAL LETTER O WITH DOT BELOW
        if (c == 0x1ECE) { F[0] = 0x1ECF; return; }  LATIN CAPITAL LETTER O WITH HOOK ABOVE
        if (c == 0x1ED0) { F[0] = 0x1ED1; return; }  LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND ACUTE
        if (c == 0x1ED2) { F[0] = 0x1ED3; return; }  LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND GRAVE
        if (c == 0x1ED4) { F[0] = 0x1ED5; return; }  LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND HOOK ABOVE
        if (c == 0x1ED6) { F[0] = 0x1ED7; return; }  LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND TILDE
        if (c == 0x1ED8) { F[0] = 0x1ED9; return; }  LATIN CAPITAL LETTER O WITH CIRCUMFLEX AND DOT BELOW
        if (c == 0x1EDA) { F[0] = 0x1EDB; return; }  LATIN CAPITAL LETTER O WITH HORN AND ACUTE
        if (c == 0x1EDC) { F[0] = 0x1EDD; return; }  LATIN CAPITAL LETTER O WITH HORN AND GRAVE
        if (c == 0x1EDE) { F[0] = 0x1EDF; return; }  LATIN CAPITAL LETTER O WITH HORN AND HOOK ABOVE
        if (c == 0x1EE0) { F[0] = 0x1EE1; return; }  LATIN CAPITAL LETTER O WITH HORN AND TILDE
        if (c == 0x1EE2) { F[0] = 0x1EE3; return; }  LATIN CAPITAL LETTER O WITH HORN AND DOT BELOW
        if (c == 0x1EE4) { F[0] = 0x1EE5; return; }  LATIN CAPITAL LETTER U WITH DOT BELOW
        if (c == 0x1EE6) { F[0] = 0x1EE7; return; }  LATIN CAPITAL LETTER U WITH HOOK ABOVE
        if (c == 0x1EE8) { F[0] = 0x1EE9; return; }  LATIN CAPITAL LETTER U WITH HORN AND ACUTE
        if (c == 0x1EEA) { F[0] = 0x1EEB; return; }  LATIN CAPITAL LETTER U WITH HORN AND GRAVE
        if (c == 0x1EEC) { F[0] = 0x1EED; return; }  LATIN CAPITAL LETTER U WITH HORN AND HOOK ABOVE
        if (c == 0x1EEE) { F[0] = 0x1EEF; return; }  LATIN CAPITAL LETTER U WITH HORN AND TILDE
        if (c == 0x1EF0) { F[0] = 0x1EF1; return; }  LATIN CAPITAL LETTER U WITH HORN AND DOT BELOW
        if (c == 0x1EF2) { F[0] = 0x1EF3; return; }  LATIN CAPITAL LETTER Y WITH GRAVE
        if (c == 0x1EF4) { F[0] = 0x1EF5; return; }  LATIN CAPITAL LETTER Y WITH DOT BELOW
        if (c == 0x1EF6) { F[0] = 0x1EF7; return; }  LATIN CAPITAL LETTER Y WITH HOOK ABOVE
        if (c == 0x1EF8) { F[0] = 0x1EF9; return; }  LATIN CAPITAL LETTER Y WITH TILDE
        if (c == 0x1EFA) { F[0] = 0x1EFB; return; }  LATIN CAPITAL LETTER MIDDLE-WELSH LL
        if (c == 0x1EFC) { F[0] = 0x1EFD; return; }  LATIN CAPITAL LETTER MIDDLE-WELSH V
        if (c == 0x1EFE) { F[0] = 0x1EFF; return; }  LATIN CAPITAL LETTER Y WITH LOOP
        if ((c >= 0x1F08) && (c <= 0x1F0F)) { F[0] = 0x1F00 + (c - 0x1F08); return; }  GREEK CAPITAL LETTER ALPHA WITH PSILI to GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI
        if ((c >= 0x1F18) && (c <= 0x1F1D)) { F[0] = 0x1F10 + (c - 0x1F18); return; }  GREEK CAPITAL LETTER EPSILON WITH PSILI to GREEK CAPITAL LETTER EPSILON WITH DASIA AND OXIA
        if ((c >= 0x1F28) && (c <= 0x1F2F)) { F[0] = 0x1F20 + (c - 0x1F28); return; }  GREEK CAPITAL LETTER ETA WITH PSILI to GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI
        if ((c >= 0x1F38) && (c <= 0x1F3F)) { F[0] = 0x1F30 + (c - 0x1F38); return; }  GREEK CAPITAL LETTER IOTA WITH PSILI to GREEK CAPITAL LETTER IOTA WITH DASIA AND PERISPOMENI
        if ((c >= 0x1F48) && (c <= 0x1F4D)) { F[0] = 0x1F40 + (c - 0x1F48); return; }  GREEK CAPITAL LETTER OMICRON WITH PSILI to GREEK CAPITAL LETTER OMICRON WITH DASIA AND OXIA
        if (c == 0x1F50) { F[0] = 0x03C5; F[1] = 0x0313; return; }  GREEK SMALL LETTER UPSILON WITH PSILI
        if (c == 0x1F52) { F[0] = 0x03C5; F[1] = 0x0313; F[2] = 0x0300; return; }  GREEK SMALL LETTER UPSILON WITH PSILI AND VARIA
        if (c == 0x1F54) { F[0] = 0x03C5; F[1] = 0x0313; F[2] = 0x0301; return; }  GREEK SMALL LETTER UPSILON WITH PSILI AND OXIA
        if (c == 0x1F56) { F[0] = 0x03C5; F[1] = 0x0313; F[2] = 0x0342; return; }  GREEK SMALL LETTER UPSILON WITH PSILI AND PERISPOMENI
        if (c == 0x1F59) { F[0] = 0x1F51; return; }  GREEK CAPITAL LETTER UPSILON WITH DASIA
        if (c == 0x1F5B) { F[0] = 0x1F53; return; }  GREEK CAPITAL LETTER UPSILON WITH DASIA AND VARIA
        if (c == 0x1F5D) { F[0] = 0x1F55; return; }  GREEK CAPITAL LETTER UPSILON WITH DASIA AND OXIA
        if (c == 0x1F5F) { F[0] = 0x1F57; return; }  GREEK CAPITAL LETTER UPSILON WITH DASIA AND PERISPOMENI
        if ((c >= 0x1F68) && (c <= 0x1F6F)) { F[0] = 0x1F60 + (c - 0x1F68); return; }  GREEK CAPITAL LETTER OMEGA WITH PSILI to GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI
        if (c == 0x1F80) { F[0] = 0x1F00; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH PSILI AND YPOGEGRAMMENI
        if (c == 0x1F81) { F[0] = 0x1F01; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH DASIA AND YPOGEGRAMMENI
        if (c == 0x1F82) { F[0] = 0x1F02; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH PSILI AND VARIA AND YPOGEGRAMMENI
        if (c == 0x1F83) { F[0] = 0x1F03; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH DASIA AND VARIA AND YPOGEGRAMMENI
        if (c == 0x1F84) { F[0] = 0x1F04; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH PSILI AND OXIA AND YPOGEGRAMMENI
        if (c == 0x1F85) { F[0] = 0x1F05; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH DASIA AND OXIA AND YPOGEGRAMMENI
        if (c == 0x1F86) { F[0] = 0x1F06; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1F87) { F[0] = 0x1F07; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1F88) { F[0] = 0x1F00; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH PSILI AND PROSGEGRAMMENI
        if (c == 0x1F89) { F[0] = 0x1F01; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH DASIA AND PROSGEGRAMMENI
        if (c == 0x1F8A) { F[0] = 0x1F02; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH PSILI AND VARIA AND PROSGEGRAMMENI
        if (c == 0x1F8B) { F[0] = 0x1F03; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH DASIA AND VARIA AND PROSGEGRAMMENI
        if (c == 0x1F8C) { F[0] = 0x1F04; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH PSILI AND OXIA AND PROSGEGRAMMENI
        if (c == 0x1F8D) { F[0] = 0x1F05; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH DASIA AND OXIA AND PROSGEGRAMMENI
        if (c == 0x1F8E) { F[0] = 0x1F06; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
        if (c == 0x1F8F) { F[0] = 0x1F07; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
        if (c == 0x1F90) { F[0] = 0x1F20; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH PSILI AND YPOGEGRAMMENI
        if (c == 0x1F91) { F[0] = 0x1F21; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH DASIA AND YPOGEGRAMMENI
        if (c == 0x1F92) { F[0] = 0x1F22; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH PSILI AND VARIA AND YPOGEGRAMMENI
        if (c == 0x1F93) { F[0] = 0x1F23; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH DASIA AND VARIA AND YPOGEGRAMMENI
        if (c == 0x1F94) { F[0] = 0x1F24; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH PSILI AND OXIA AND YPOGEGRAMMENI
        if (c == 0x1F95) { F[0] = 0x1F25; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH DASIA AND OXIA AND YPOGEGRAMMENI
        if (c == 0x1F96) { F[0] = 0x1F26; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1F97) { F[0] = 0x1F27; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1F98) { F[0] = 0x1F20; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH PSILI AND PROSGEGRAMMENI
        if (c == 0x1F99) { F[0] = 0x1F21; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH DASIA AND PROSGEGRAMMENI
        if (c == 0x1F9A) { F[0] = 0x1F22; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH PSILI AND VARIA AND PROSGEGRAMMENI
        if (c == 0x1F9B) { F[0] = 0x1F23; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH DASIA AND VARIA AND PROSGEGRAMMENI
        if (c == 0x1F9C) { F[0] = 0x1F24; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH PSILI AND OXIA AND PROSGEGRAMMENI
        if (c == 0x1F9D) { F[0] = 0x1F25; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH DASIA AND OXIA AND PROSGEGRAMMENI
        if (c == 0x1F9E) { F[0] = 0x1F26; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
        if (c == 0x1F9F) { F[0] = 0x1F27; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
        if (c == 0x1FA0) { F[0] = 0x1F60; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH PSILI AND YPOGEGRAMMENI
        if (c == 0x1FA1) { F[0] = 0x1F61; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH DASIA AND YPOGEGRAMMENI
        if (c == 0x1FA2) { F[0] = 0x1F62; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH PSILI AND VARIA AND YPOGEGRAMMENI
        if (c == 0x1FA3) { F[0] = 0x1F63; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH DASIA AND VARIA AND YPOGEGRAMMENI
        if (c == 0x1FA4) { F[0] = 0x1F64; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH PSILI AND OXIA AND YPOGEGRAMMENI
        if (c == 0x1FA5) { F[0] = 0x1F65; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH DASIA AND OXIA AND YPOGEGRAMMENI
        if (c == 0x1FA6) { F[0] = 0x1F66; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH PSILI AND PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1FA7) { F[0] = 0x1F67; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH DASIA AND PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1FA8) { F[0] = 0x1F60; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH PSILI AND PROSGEGRAMMENI
        if (c == 0x1FA9) { F[0] = 0x1F61; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH DASIA AND PROSGEGRAMMENI
        if (c == 0x1FAA) { F[0] = 0x1F62; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH PSILI AND VARIA AND PROSGEGRAMMENI
        if (c == 0x1FAB) { F[0] = 0x1F63; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH DASIA AND VARIA AND PROSGEGRAMMENI
        if (c == 0x1FAC) { F[0] = 0x1F64; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH PSILI AND OXIA AND PROSGEGRAMMENI
        if (c == 0x1FAD) { F[0] = 0x1F65; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH DASIA AND OXIA AND PROSGEGRAMMENI
        if (c == 0x1FAE) { F[0] = 0x1F66; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH PSILI AND PERISPOMENI AND PROSGEGRAMMENI
        if (c == 0x1FAF) { F[0] = 0x1F67; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH DASIA AND PERISPOMENI AND PROSGEGRAMMENI
        if (c == 0x1FB2) { F[0] = 0x1F70; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH VARIA AND YPOGEGRAMMENI
        if (c == 0x1FB3) { F[0] = 0x03B1; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH YPOGEGRAMMENI
        if (c == 0x1FB4) { F[0] = 0x03AC; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH OXIA AND YPOGEGRAMMENI
        if (c == 0x1FB6) { F[0] = 0x03B1; F[1] = 0x0342; return; }  GREEK SMALL LETTER ALPHA WITH PERISPOMENI
        if (c == 0x1FB7) { F[0] = 0x03B1; F[1] = 0x0342; F[2] = 0x03B9; return; }  GREEK SMALL LETTER ALPHA WITH PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1FB8) { F[0] = 0x1FB0; return; }  GREEK CAPITAL LETTER ALPHA WITH VRACHY
        if (c == 0x1FB9) { F[0] = 0x1FB1; return; }  GREEK CAPITAL LETTER ALPHA WITH MACRON
        if (c == 0x1FBA) { F[0] = 0x1F70; return; }  GREEK CAPITAL LETTER ALPHA WITH VARIA
        if (c == 0x1FBB) { F[0] = 0x1F71; return; }  GREEK CAPITAL LETTER ALPHA WITH OXIA
        if (c == 0x1FBC) { F[0] = 0x03B1; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ALPHA WITH PROSGEGRAMMENI
        if (c == 0x1FBE) { F[0] = 0x03B9; return; }  GREEK PROSGEGRAMMENI
        if (c == 0x1FC2) { F[0] = 0x1F74; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH VARIA AND YPOGEGRAMMENI
        if (c == 0x1FC3) { F[0] = 0x03B7; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH YPOGEGRAMMENI
        if (c == 0x1FC4) { F[0] = 0x03AE; F[1] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH OXIA AND YPOGEGRAMMENI
        if (c == 0x1FC6) { F[0] = 0x03B7; F[1] = 0x0342; return; }  GREEK SMALL LETTER ETA WITH PERISPOMENI
        if (c == 0x1FC7) { F[0] = 0x03B7; F[1] = 0x0342; F[2] = 0x03B9; return; }  GREEK SMALL LETTER ETA WITH PERISPOMENI AND YPOGEGRAMMENI
        if ((c >= 0x1FC8) && (c <= 0x1FCB)) { F[0] = 0x1F72 + (c - 0x1FC8); return; }  GREEK CAPITAL LETTER EPSILON WITH VARIA to GREEK CAPITAL LETTER ETA WITH OXIA
        if (c == 0x1FCC) { F[0] = 0x03B7; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER ETA WITH PROSGEGRAMMENI
        if (c == 0x1FD2) { F[0] = 0x03B9; F[1] = 0x0308; F[2] = 0x0300; return; }  GREEK SMALL LETTER IOTA WITH DIALYTIKA AND VARIA
        if (c == 0x1FD3) { F[0] = 0x03B9; F[1] = 0x0308; F[2] = 0x0301; return; }  GREEK SMALL LETTER IOTA WITH DIALYTIKA AND OXIA
        if (c == 0x1FD6) { F[0] = 0x03B9; F[1] = 0x0342; return; }  GREEK SMALL LETTER IOTA WITH PERISPOMENI
        if (c == 0x1FD7) { F[0] = 0x03B9; F[1] = 0x0308; F[2] = 0x0342; return; }  GREEK SMALL LETTER IOTA WITH DIALYTIKA AND PERISPOMENI
        if (c == 0x1FD8) { F[0] = 0x1FD0; return; }  GREEK CAPITAL LETTER IOTA WITH VRACHY
        if (c == 0x1FD9) { F[0] = 0x1FD1; return; }  GREEK CAPITAL LETTER IOTA WITH MACRON
        if (c == 0x1FDA) { F[0] = 0x1F76; return; }  GREEK CAPITAL LETTER IOTA WITH VARIA
        if (c == 0x1FDB) { F[0] = 0x1F77; return; }  GREEK CAPITAL LETTER IOTA WITH OXIA
        if (c == 0x1FE2) { F[0] = 0x03C5; F[1] = 0x0308; F[2] = 0x0300; return; }  GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND VARIA
        if (c == 0x1FE3) { F[0] = 0x03C5; F[1] = 0x0308; F[2] = 0x0301; return; }  GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND OXIA
        if (c == 0x1FE4) { F[0] = 0x03C1; F[1] = 0x0313; return; }  GREEK SMALL LETTER RHO WITH PSILI
        if (c == 0x1FE6) { F[0] = 0x03C5; F[1] = 0x0342; return; }  GREEK SMALL LETTER UPSILON WITH PERISPOMENI
        if (c == 0x1FE7) { F[0] = 0x03C5; F[1] = 0x0308; F[2] = 0x0342; return; }  GREEK SMALL LETTER UPSILON WITH DIALYTIKA AND PERISPOMENI
        if (c == 0x1FE8) { F[0] = 0x1FE0; return; }  GREEK CAPITAL LETTER UPSILON WITH VRACHY
        if (c == 0x1FE9) { F[0] = 0x1FE1; return; }  GREEK CAPITAL LETTER UPSILON WITH MACRON
        if (c == 0x1FEA) { F[0] = 0x1F7A; return; }  GREEK CAPITAL LETTER UPSILON WITH VARIA
        if (c == 0x1FEB) { F[0] = 0x1F7B; return; }  GREEK CAPITAL LETTER UPSILON WITH OXIA
        if (c == 0x1FEC) { F[0] = 0x1FE5; return; }  GREEK CAPITAL LETTER RHO WITH DASIA
        if (c == 0x1FF2) { F[0] = 0x1F7C; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH VARIA AND YPOGEGRAMMENI
        if (c == 0x1FF3) { F[0] = 0x03C9; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH YPOGEGRAMMENI
        if (c == 0x1FF4) { F[0] = 0x03CE; F[1] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH OXIA AND YPOGEGRAMMENI
        if (c == 0x1FF6) { F[0] = 0x03C9; F[1] = 0x0342; return; }  GREEK SMALL LETTER OMEGA WITH PERISPOMENI
        if (c == 0x1FF7) { F[0] = 0x03C9; F[1] = 0x0342; F[2] = 0x03B9; return; }  GREEK SMALL LETTER OMEGA WITH PERISPOMENI AND YPOGEGRAMMENI
        if (c == 0x1FF8) { F[0] = 0x1F78; return; }  GREEK CAPITAL LETTER OMICRON WITH VARIA
        if (c == 0x1FF9) { F[0] = 0x1F79; return; }  GREEK CAPITAL LETTER OMICRON WITH OXIA
        if (c == 0x1FFA) { F[0] = 0x1F7C; return; }  GREEK CAPITAL LETTER OMEGA WITH VARIA
        if (c == 0x1FFB) { F[0] = 0x1F7D; return; }  GREEK CAPITAL LETTER OMEGA WITH OXIA
        if (c == 0x1FFC) { F[0] = 0x03C9; F[1] = 0x03B9; return; }  GREEK CAPITAL LETTER OMEGA WITH PROSGEGRAMMENI
    } else if ((c >= 0x2000) && (c < 0x3000)) {
        if (c == 0x2126) { F[0] = 0x03C9; return; }  OHM SIGN
        if (c == 0x212A) { F[0] = 0x006B; return; }  KELVIN SIGN
        if (c == 0x212B) { F[0] = 0x00E5; return; }  ANGSTROM SIGN
        if (c == 0x2132) { F[0] = 0x214E; return; }  TURNED CAPITAL F
        if ((c >= 0x2160) && (c <= 0x216F)) { F[0] = 0x2170 + (c - 0x2160); return; }  ROMAN NUMERAL ONE to ROMAN NUMERAL ONE THOUSAND
        if (c == 0x2183) { F[0] = 0x2184; return; }  ROMAN NUMERAL REVERSED ONE HUNDRED
        if ((c >= 0x24B6) && (c <= 0x24CF)) { F[0] = 0x24D0 + (c - 0x24B6); return; }  CIRCLED LATIN CAPITAL LETTER A to CIRCLED LATIN CAPITAL LETTER Z
        if ((c >= 0x2C00) && (c <= 0x2C2F)) { F[0] = 0x2C30 + (c - 0x2C00); return; }  GLAGOLITIC CAPITAL LETTER AZU to GLAGOLITIC CAPITAL LETTER CAUDATE CHRIVI
        if (c == 0x2C60) { F[0] = 0x2C61; return; }  LATIN CAPITAL LETTER L WITH DOUBLE BAR
        if (c == 0x2C62) { F[0] = 0x026B; return; }  LATIN CAPITAL LETTER L WITH MIDDLE TILDE
        if (c == 0x2C63) { F[0] = 0x1D7D; return; }  LATIN CAPITAL LETTER P WITH STROKE
        if (c == 0x2C64) { F[0] = 0x027D; return; }  LATIN CAPITAL LETTER R WITH TAIL
        if (c == 0x2C67) { F[0] = 0x2C68; return; }  LATIN CAPITAL LETTER H WITH DESCENDER
        if (c == 0x2C69) { F[0] = 0x2C6A; return; }  LATIN CAPITAL LETTER K WITH DESCENDER
        if (c == 0x2C6B) { F[0] = 0x2C6C; return; }  LATIN CAPITAL LETTER Z WITH DESCENDER
        if (c == 0x2C6D) { F[0] = 0x0251; return; }  LATIN CAPITAL LETTER ALPHA
        if (c == 0x2C6E) { F[0] = 0x0271; return; }  LATIN CAPITAL LETTER M WITH HOOK
        if (c == 0x2C6F) { F[0] = 0x0250; return; }  LATIN CAPITAL LETTER TURNED A
        if (c == 0x2C70) { F[0] = 0x0252; return; }  LATIN CAPITAL LETTER TURNED ALPHA
        if (c == 0x2C72) { F[0] = 0x2C73; return; }  LATIN CAPITAL LETTER W WITH HOOK
        if (c == 0x2C75) { F[0] = 0x2C76; return; }  LATIN CAPITAL LETTER HALF H
        if (c == 0x2C7E) { F[0] = 0x023F; return; }  LATIN CAPITAL LETTER S WITH SWASH TAIL
        if (c == 0x2C7F) { F[0] = 0x0240; return; }  LATIN CAPITAL LETTER Z WITH SWASH TAIL
        if (c == 0x2C80) { F[0] = 0x2C81; return; }  COPTIC CAPITAL LETTER ALFA
        if (c == 0x2C82) { F[0] = 0x2C83; return; }  COPTIC CAPITAL LETTER VIDA
        if (c == 0x2C84) { F[0] = 0x2C85; return; }  COPTIC CAPITAL LETTER GAMMA
        if (c == 0x2C86) { F[0] = 0x2C87; return; }  COPTIC CAPITAL LETTER DALDA
        if (c == 0x2C88) { F[0] = 0x2C89; return; }  COPTIC CAPITAL LETTER EIE
        if (c == 0x2C8A) { F[0] = 0x2C8B; return; }  COPTIC CAPITAL LETTER SOU
        if (c == 0x2C8C) { F[0] = 0x2C8D; return; }  COPTIC CAPITAL LETTER ZATA
        if (c == 0x2C8E) { F[0] = 0x2C8F; return; }  COPTIC CAPITAL LETTER HATE
        if (c == 0x2C90) { F[0] = 0x2C91; return; }  COPTIC CAPITAL LETTER THETHE
        if (c == 0x2C92) { F[0] = 0x2C93; return; }  COPTIC CAPITAL LETTER IAUDA
        if (c == 0x2C94) { F[0] = 0x2C95; return; }  COPTIC CAPITAL LETTER KAPA
        if (c == 0x2C96) { F[0] = 0x2C97; return; }  COPTIC CAPITAL LETTER LAULA
        if (c == 0x2C98) { F[0] = 0x2C99; return; }  COPTIC CAPITAL LETTER MI
        if (c == 0x2C9A) { F[0] = 0x2C9B; return; }  COPTIC CAPITAL LETTER NI
        if (c == 0x2C9C) { F[0] = 0x2C9D; return; }  COPTIC CAPITAL LETTER KSI
        if (c == 0x2C9E) { F[0] = 0x2C9F; return; }  COPTIC CAPITAL LETTER O
        if (c == 0x2CA0) { F[0] = 0x2CA1; return; }  COPTIC CAPITAL LETTER PI
        if (c == 0x2CA2) { F[0] = 0x2CA3; return; }  COPTIC CAPITAL LETTER RO
        if (c == 0x2CA4) { F[0] = 0x2CA5; return; }  COPTIC CAPITAL LETTER SIMA
        if (c == 0x2CA6) { F[0] = 0x2CA7; return; }  COPTIC CAPITAL LETTER TAU
        if (c == 0x2CA8) { F[0] = 0x2CA9; return; }  COPTIC CAPITAL LETTER UA
        if (c == 0x2CAA) { F[0] = 0x2CAB; return; }  COPTIC CAPITAL LETTER FI
        if (c == 0x2CAC) { F[0] = 0x2CAD; return; }  COPTIC CAPITAL LETTER KHI
        if (c == 0x2CAE) { F[0] = 0x2CAF; return; }  COPTIC CAPITAL LETTER PSI
        if (c == 0x2CB0) { F[0] = 0x2CB1; return; }  COPTIC CAPITAL LETTER OOU
        if (c == 0x2CB2) { F[0] = 0x2CB3; return; }  COPTIC CAPITAL LETTER DIALECT-P ALEF
        if (c == 0x2CB4) { F[0] = 0x2CB5; return; }  COPTIC CAPITAL LETTER OLD COPTIC AIN
        if (c == 0x2CB6) { F[0] = 0x2CB7; return; }  COPTIC CAPITAL LETTER CRYPTOGRAMMIC EIE
        if (c == 0x2CB8) { F[0] = 0x2CB9; return; }  COPTIC CAPITAL LETTER DIALECT-P KAPA
        if (c == 0x2CBA) { F[0] = 0x2CBB; return; }  COPTIC CAPITAL LETTER DIALECT-P NI
        if (c == 0x2CBC) { F[0] = 0x2CBD; return; }  COPTIC CAPITAL LETTER CRYPTOGRAMMIC NI
        if (c == 0x2CBE) { F[0] = 0x2CBF; return; }  COPTIC CAPITAL LETTER OLD COPTIC OOU
        if (c == 0x2CC0) { F[0] = 0x2CC1; return; }  COPTIC CAPITAL LETTER SAMPI
        if (c == 0x2CC2) { F[0] = 0x2CC3; return; }  COPTIC CAPITAL LETTER CROSSED SHEI
        if (c == 0x2CC4) { F[0] = 0x2CC5; return; }  COPTIC CAPITAL LETTER OLD COPTIC SHEI
        if (c == 0x2CC6) { F[0] = 0x2CC7; return; }  COPTIC CAPITAL LETTER OLD COPTIC ESH
        if (c == 0x2CC8) { F[0] = 0x2CC9; return; }  COPTIC CAPITAL LETTER AKHMIMIC KHEI
        if (c == 0x2CCA) { F[0] = 0x2CCB; return; }  COPTIC CAPITAL LETTER DIALECT-P HORI
        if (c == 0x2CCC) { F[0] = 0x2CCD; return; }  COPTIC CAPITAL LETTER OLD COPTIC HORI
        if (c == 0x2CCE) { F[0] = 0x2CCF; return; }  COPTIC CAPITAL LETTER OLD COPTIC HA
        if (c == 0x2CD0) { F[0] = 0x2CD1; return; }  COPTIC CAPITAL LETTER L-SHAPED HA
        if (c == 0x2CD2) { F[0] = 0x2CD3; return; }  COPTIC CAPITAL LETTER OLD COPTIC HEI
        if (c == 0x2CD4) { F[0] = 0x2CD5; return; }  COPTIC CAPITAL LETTER OLD COPTIC HAT
        if (c == 0x2CD6) { F[0] = 0x2CD7; return; }  COPTIC CAPITAL LETTER OLD COPTIC GANGIA
        if (c == 0x2CD8) { F[0] = 0x2CD9; return; }  COPTIC CAPITAL LETTER OLD COPTIC DJA
        if (c == 0x2CDA) { F[0] = 0x2CDB; return; }  COPTIC CAPITAL LETTER OLD COPTIC SHIMA
        if (c == 0x2CDC) { F[0] = 0x2CDD; return; }  COPTIC CAPITAL LETTER OLD NUBIAN SHIMA
        if (c == 0x2CDE) { F[0] = 0x2CDF; return; }  COPTIC CAPITAL LETTER OLD NUBIAN NGI
        if (c == 0x2CE0) { F[0] = 0x2CE1; return; }  COPTIC CAPITAL LETTER OLD NUBIAN NYI
        if (c == 0x2CE2) { F[0] = 0x2CE3; return; }  COPTIC CAPITAL LETTER OLD NUBIAN WAU
        if (c == 0x2CEB) { F[0] = 0x2CEC; return; }  COPTIC CAPITAL LETTER CRYPTOGRAMMIC SHEI
        if (c == 0x2CED) { F[0] = 0x2CEE; return; }  COPTIC CAPITAL LETTER CRYPTOGRAMMIC GANGIA
        if (c == 0x2CF2) { F[0] = 0x2CF3; return; }  COPTIC CAPITAL LETTER BOHAIRIC KHEI
    } else if (c >= 0x3000) {
        if (c == 0xA640) { F[0] = 0xA641; return; }  CYRILLIC CAPITAL LETTER ZEMLYA
        if (c == 0xA642) { F[0] = 0xA643; return; }  CYRILLIC CAPITAL LETTER DZELO
        if (c == 0xA644) { F[0] = 0xA645; return; }  CYRILLIC CAPITAL LETTER REVERSED DZE
        if (c == 0xA646) { F[0] = 0xA647; return; }  CYRILLIC CAPITAL LETTER IOTA
        if (c == 0xA648) { F[0] = 0xA649; return; }  CYRILLIC CAPITAL LETTER DJERV
        if (c == 0xA64A) { F[0] = 0xA64B; return; }  CYRILLIC CAPITAL LETTER MONOGRAPH UK
        if (c == 0xA64C) { F[0] = 0xA64D; return; }  CYRILLIC CAPITAL LETTER BROAD OMEGA
        if (c == 0xA64E) { F[0] = 0xA64F; return; }  CYRILLIC CAPITAL LETTER NEUTRAL YER
        if (c == 0xA650) { F[0] = 0xA651; return; }  CYRILLIC CAPITAL LETTER YERU WITH BACK YER
        if (c == 0xA652) { F[0] = 0xA653; return; }  CYRILLIC CAPITAL LETTER IOTIFIED YAT
        if (c == 0xA654) { F[0] = 0xA655; return; }  CYRILLIC CAPITAL LETTER REVERSED YU
        if (c == 0xA656) { F[0] = 0xA657; return; }  CYRILLIC CAPITAL LETTER IOTIFIED A
        if (c == 0xA658) { F[0] = 0xA659; return; }  CYRILLIC CAPITAL LETTER CLOSED LITTLE YUS
        if (c == 0xA65A) { F[0] = 0xA65B; return; }  CYRILLIC CAPITAL LETTER BLENDED YUS
        if (c == 0xA65C) { F[0] = 0xA65D; return; }  CYRILLIC CAPITAL LETTER IOTIFIED CLOSED LITTLE YUS
        if (c == 0xA65E) { F[0] = 0xA65F; return; }  CYRILLIC CAPITAL LETTER YN
        if (c == 0xA660) { F[0] = 0xA661; return; }  CYRILLIC CAPITAL LETTER REVERSED TSE
        if (c == 0xA662) { F[0] = 0xA663; return; }  CYRILLIC CAPITAL LETTER SOFT DE
        if (c == 0xA664) { F[0] = 0xA665; return; }  CYRILLIC CAPITAL LETTER SOFT EL
        if (c == 0xA666) { F[0] = 0xA667; return; }  CYRILLIC CAPITAL LETTER SOFT EM
        if (c == 0xA668) { F[0] = 0xA669; return; }  CYRILLIC CAPITAL LETTER MONOCULAR O
        if (c == 0xA66A) { F[0] = 0xA66B; return; }  CYRILLIC CAPITAL LETTER BINOCULAR O
        if (c == 0xA66C) { F[0] = 0xA66D; return; }  CYRILLIC CAPITAL LETTER DOUBLE MONOCULAR O
        if (c == 0xA680) { F[0] = 0xA681; return; }  CYRILLIC CAPITAL LETTER DWE
        if (c == 0xA682) { F[0] = 0xA683; return; }  CYRILLIC CAPITAL LETTER DZWE
        if (c == 0xA684) { F[0] = 0xA685; return; }  CYRILLIC CAPITAL LETTER ZHWE
        if (c == 0xA686) { F[0] = 0xA687; return; }  CYRILLIC CAPITAL LETTER CCHE
        if (c == 0xA688) { F[0] = 0xA689; return; }  CYRILLIC CAPITAL LETTER DZZE
        if (c == 0xA68A) { F[0] = 0xA68B; return; }  CYRILLIC CAPITAL LETTER TE WITH MIDDLE HOOK
        if (c == 0xA68C) { F[0] = 0xA68D; return; }  CYRILLIC CAPITAL LETTER TWE
        if (c == 0xA68E) { F[0] = 0xA68F; return; }  CYRILLIC CAPITAL LETTER TSWE
        if (c == 0xA690) { F[0] = 0xA691; return; }  CYRILLIC CAPITAL LETTER TSSE
        if (c == 0xA692) { F[0] = 0xA693; return; }  CYRILLIC CAPITAL LETTER TCHE
        if (c == 0xA694) { F[0] = 0xA695; return; }  CYRILLIC CAPITAL LETTER HWE
        if (c == 0xA696) { F[0] = 0xA697; return; }  CYRILLIC CAPITAL LETTER SHWE
        if (c == 0xA698) { F[0] = 0xA699; return; }  CYRILLIC CAPITAL LETTER DOUBLE O
        if (c == 0xA69A) { F[0] = 0xA69B; return; }  CYRILLIC CAPITAL LETTER CROSSED O
        if (c == 0xA722) { F[0] = 0xA723; return; }  LATIN CAPITAL LETTER EGYPTOLOGICAL ALEF
        if (c == 0xA724) { F[0] = 0xA725; return; }  LATIN CAPITAL LETTER EGYPTOLOGICAL AIN
        if (c == 0xA726) { F[0] = 0xA727; return; }  LATIN CAPITAL LETTER HENG
        if (c == 0xA728) { F[0] = 0xA729; return; }  LATIN CAPITAL LETTER TZ
        if (c == 0xA72A) { F[0] = 0xA72B; return; }  LATIN CAPITAL LETTER TRESILLO
        if (c == 0xA72C) { F[0] = 0xA72D; return; }  LATIN CAPITAL LETTER CUATRILLO
        if (c == 0xA72E) { F[0] = 0xA72F; return; }  LATIN CAPITAL LETTER CUATRILLO WITH COMMA
        if (c == 0xA732) { F[0] = 0xA733; return; }  LATIN CAPITAL LETTER AA
        if (c == 0xA734) { F[0] = 0xA735; return; }  LATIN CAPITAL LETTER AO
        if (c == 0xA736) { F[0] = 0xA737; return; }  LATIN CAPITAL LETTER AU
        if (c == 0xA738) { F[0] = 0xA739; return; }  LATIN CAPITAL LETTER AV
        if (c == 0xA73A) { F[0] = 0xA73B; return; }  LATIN CAPITAL LETTER AV WITH HORIZONTAL BAR
        if (c == 0xA73C) { F[0] = 0xA73D; return; }  LATIN CAPITAL LETTER AY
        if (c == 0xA73E) { F[0] = 0xA73F; return; }  LATIN CAPITAL LETTER REVERSED C WITH DOT
        if (c == 0xA740) { F[0] = 0xA741; return; }  LATIN CAPITAL LETTER K WITH STROKE
        if (c == 0xA742) { F[0] = 0xA743; return; }  LATIN CAPITAL LETTER K WITH DIAGONAL STROKE
        if (c == 0xA744) { F[0] = 0xA745; return; }  LATIN CAPITAL LETTER K WITH STROKE AND DIAGONAL STROKE
        if (c == 0xA746) { F[0] = 0xA747; return; }  LATIN CAPITAL LETTER BROKEN L
        if (c == 0xA748) { F[0] = 0xA749; return; }  LATIN CAPITAL LETTER L WITH HIGH STROKE
        if (c == 0xA74A) { F[0] = 0xA74B; return; }  LATIN CAPITAL LETTER O WITH LONG STROKE OVERLAY
        if (c == 0xA74C) { F[0] = 0xA74D; return; }  LATIN CAPITAL LETTER O WITH LOOP
        if (c == 0xA74E) { F[0] = 0xA74F; return; }  LATIN CAPITAL LETTER OO
        if (c == 0xA750) { F[0] = 0xA751; return; }  LATIN CAPITAL LETTER P WITH STROKE THROUGH DESCENDER
        if (c == 0xA752) { F[0] = 0xA753; return; }  LATIN CAPITAL LETTER P WITH FLOURISH
        if (c == 0xA754) { F[0] = 0xA755; return; }  LATIN CAPITAL LETTER P WITH SQUIRREL TAIL
        if (c == 0xA756) { F[0] = 0xA757; return; }  LATIN CAPITAL LETTER Q WITH STROKE THROUGH DESCENDER
        if (c == 0xA758) { F[0] = 0xA759; return; }  LATIN CAPITAL LETTER Q WITH DIAGONAL STROKE
        if (c == 0xA75A) { F[0] = 0xA75B; return; }  LATIN CAPITAL LETTER R ROTUNDA
        if (c == 0xA75C) { F[0] = 0xA75D; return; }  LATIN CAPITAL LETTER RUM ROTUNDA
        if (c == 0xA75E) { F[0] = 0xA75F; return; }  LATIN CAPITAL LETTER V WITH DIAGONAL STROKE
        if (c == 0xA760) { F[0] = 0xA761; return; }  LATIN CAPITAL LETTER VY
        if (c == 0xA762) { F[0] = 0xA763; return; }  LATIN CAPITAL LETTER VISIGOTHIC Z
        if (c == 0xA764) { F[0] = 0xA765; return; }  LATIN CAPITAL LETTER THORN WITH STROKE
        if (c == 0xA766) { F[0] = 0xA767; return; }  LATIN CAPITAL LETTER THORN WITH STROKE THROUGH DESCENDER
        if (c == 0xA768) { F[0] = 0xA769; return; }  LATIN CAPITAL LETTER VEND
        if (c == 0xA76A) { F[0] = 0xA76B; return; }  LATIN CAPITAL LETTER ET
        if (c == 0xA76C) { F[0] = 0xA76D; return; }  LATIN CAPITAL LETTER IS
        if (c == 0xA76E) { F[0] = 0xA76F; return; }  LATIN CAPITAL LETTER CON
        if (c == 0xA779) { F[0] = 0xA77A; return; }  LATIN CAPITAL LETTER INSULAR D
        if (c == 0xA77B) { F[0] = 0xA77C; return; }  LATIN CAPITAL LETTER INSULAR F
        if (c == 0xA77D) { F[0] = 0x1D79; return; }  LATIN CAPITAL LETTER INSULAR G
        if (c == 0xA77E) { F[0] = 0xA77F; return; }  LATIN CAPITAL LETTER TURNED INSULAR G
        if (c == 0xA780) { F[0] = 0xA781; return; }  LATIN CAPITAL LETTER TURNED L
        if (c == 0xA782) { F[0] = 0xA783; return; }  LATIN CAPITAL LETTER INSULAR R
        if (c == 0xA784) { F[0] = 0xA785; return; }  LATIN CAPITAL LETTER INSULAR S
        if (c == 0xA786) { F[0] = 0xA787; return; }  LATIN CAPITAL LETTER INSULAR T
        if (c == 0xA78B) { F[0] = 0xA78C; return; }  LATIN CAPITAL LETTER SALTILLO
        if (c == 0xA78D) { F[0] = 0x0265; return; }  LATIN CAPITAL LETTER TURNED H
        if (c == 0xA790) { F[0] = 0xA791; return; }  LATIN CAPITAL LETTER N WITH DESCENDER
        if (c == 0xA792) { F[0] = 0xA793; return; }  LATIN CAPITAL LETTER C WITH BAR
        if (c == 0xA796) { F[0] = 0xA797; return; }  LATIN CAPITAL LETTER B WITH FLOURISH
        if (c == 0xA798) { F[0] = 0xA799; return; }  LATIN CAPITAL LETTER F WITH STROKE
        if (c == 0xA79A) { F[0] = 0xA79B; return; }  LATIN CAPITAL LETTER VOLAPUK AE
        if (c == 0xA79C) { F[0] = 0xA79D; return; }  LATIN CAPITAL LETTER VOLAPUK OE
        if (c == 0xA79E) { F[0] = 0xA79F; return; }  LATIN CAPITAL LETTER VOLAPUK UE
        if (c == 0xA7A0) { F[0] = 0xA7A1; return; }  LATIN CAPITAL LETTER G WITH OBLIQUE STROKE
        if (c == 0xA7A2) { F[0] = 0xA7A3; return; }  LATIN CAPITAL LETTER K WITH OBLIQUE STROKE
        if (c == 0xA7A4) { F[0] = 0xA7A5; return; }  LATIN CAPITAL LETTER N WITH OBLIQUE STROKE
        if (c == 0xA7A6) { F[0] = 0xA7A7; return; }  LATIN CAPITAL LETTER R WITH OBLIQUE STROKE
        if (c == 0xA7A8) { F[0] = 0xA7A9; return; }  LATIN CAPITAL LETTER S WITH OBLIQUE STROKE
        if (c == 0xA7AA) { F[0] = 0x0266; return; }  LATIN CAPITAL LETTER H WITH HOOK
        if (c == 0xA7AB) { F[0] = 0x025C; return; }  LATIN CAPITAL LETTER REVERSED OPEN E
        if (c == 0xA7AC) { F[0] = 0x0261; return; }  LATIN CAPITAL LETTER SCRIPT G
        if (c == 0xA7AD) { F[0] = 0x026C; return; }  LATIN CAPITAL LETTER L WITH BELT
        if (c == 0xA7AE) { F[0] = 0x026A; return; }  LATIN CAPITAL LETTER SMALL CAPITAL I
        if (c == 0xA7B0) { F[0] = 0x029E; return; }  LATIN CAPITAL LETTER TURNED K
        if (c == 0xA7B1) { F[0] = 0x0287; return; }  LATIN CAPITAL LETTER TURNED T
        if (c == 0xA7B2) { F[0] = 0x029D; return; }  LATIN CAPITAL LETTER J WITH CROSSED-TAIL
        if (c == 0xA7B3) { F[0] = 0xAB53; return; }  LATIN CAPITAL LETTER CHI
        if (c == 0xA7B4) { F[0] = 0xA7B5; return; }  LATIN CAPITAL LETTER BETA
        if (c == 0xA7B6) { F[0] = 0xA7B7; return; }  LATIN CAPITAL LETTER OMEGA
        if (c == 0xA7B8) { F[0] = 0xA7B9; return; }  LATIN CAPITAL LETTER U WITH STROKE
        if (c == 0xA7BA) { F[0] = 0xA7BB; return; }  LATIN CAPITAL LETTER GLOTTAL A
        if (c == 0xA7BC) { F[0] = 0xA7BD; return; }  LATIN CAPITAL LETTER GLOTTAL I
        if (c == 0xA7BE) { F[0] = 0xA7BF; return; }  LATIN CAPITAL LETTER GLOTTAL U
        if (c == 0xA7C0) { F[0] = 0xA7C1; return; }  LATIN CAPITAL LETTER OLD POLISH O
        if (c == 0xA7C2) { F[0] = 0xA7C3; return; }  LATIN CAPITAL LETTER ANGLICANA W
        if (c == 0xA7C4) { F[0] = 0xA794; return; }  LATIN CAPITAL LETTER C WITH PALATAL HOOK
        if (c == 0xA7C5) { F[0] = 0x0282; return; }  LATIN CAPITAL LETTER S WITH HOOK
        if (c == 0xA7C6) { F[0] = 0x1D8E; return; }  LATIN CAPITAL LETTER Z WITH PALATAL HOOK
        if (c == 0xA7C7) { F[0] = 0xA7C8; return; }  LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY
        if (c == 0xA7C9) { F[0] = 0xA7CA; return; }  LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY
        if (c == 0xA7D0) { F[0] = 0xA7D1; return; }  LATIN CAPITAL LETTER CLOSED INSULAR G
        if (c == 0xA7D6) { F[0] = 0xA7D7; return; }  LATIN CAPITAL LETTER MIDDLE SCOTS S
        if (c == 0xA7D8) { F[0] = 0xA7D9; return; }  LATIN CAPITAL LETTER SIGMOID S
        if (c == 0xA7F5) { F[0] = 0xA7F6; return; }  LATIN CAPITAL LETTER REVERSED HALF H
        if ((c >= 0xAB70) && (c <= 0xABBF)) { F[0] = 0x13A0 + (c - 0xAB70); return; }  CHEROKEE SMALL LETTER A to CHEROKEE SMALL LETTER YA
        if (c == 0xFB00) { F[0] = 0x0066; F[1] = 0x0066; return; }  LATIN SMALL LIGATURE FF
        if (c == 0xFB01) { F[0] = 0x0066; F[1] = 0x0069; return; }  LATIN SMALL LIGATURE FI
        if (c == 0xFB02) { F[0] = 0x0066; F[1] = 0x006C; return; }  LATIN SMALL LIGATURE FL
        if (c == 0xFB03) { F[0] = 0x0066; F[1] = 0x0066; F[2] = 0x0069; return; }  LATIN SMALL LIGATURE FFI
        if (c == 0xFB04) { F[0] = 0x0066; F[1] = 0x0066; F[2] = 0x006C; return; }  LATIN SMALL LIGATURE FFL
        if (c == 0xFB05) { F[0] = 0x0073; F[1] = 0x0074; return; }  LATIN SMALL LIGATURE LONG S T
        if (c == 0xFB06) { F[0] = 0x0073; F[1] = 0x0074; return; }  LATIN SMALL LIGATURE ST
        if (c == 0xFB13) { F[0] = 0x0574; F[1] = 0x0576; return; }  ARMENIAN SMALL LIGATURE MEN NOW
        if (c == 0xFB14) { F[0] = 0x0574; F[1] = 0x0565; return; }  ARMENIAN SMALL LIGATURE MEN ECH
        if (c == 0xFB15) { F[0] = 0x0574; F[1] = 0x056B; return; }  ARMENIAN SMALL LIGATURE MEN INI
        if (c == 0xFB16) { F[0] = 0x057E; F[1] = 0x0576; return; }  ARMENIAN SMALL LIGATURE VEW NOW
        if (c == 0xFB17) { F[0] = 0x0574; F[1] = 0x056D; return; }  ARMENIAN SMALL LIGATURE MEN XEH
        if ((c >= 0xFF21) && (c <= 0xFF3A)) { F[0] = 0xFF41 + (c - 0xFF21); return; }  FULLWIDTH LATIN CAPITAL LETTER A to FULLWIDTH LATIN CAPITAL LETTER Z
        if ((c >= 0x10400) && (c <= 0x10427)) { F[0] = 0x10428 + (c - 0x10400); return; }  DESERET CAPITAL LETTER LONG I to DESERET CAPITAL LETTER EW
        if ((c >= 0x104B0) && (c <= 0x104D3)) { F[0] = 0x104D8 + (c - 0x104B0); return; }  OSAGE CAPITAL LETTER A to OSAGE CAPITAL LETTER ZHA
        if ((c >= 0x10570) && (c <= 0x1057A)) { F[0] = 0x10597 + (c - 0x10570); return; }  VITHKUQI CAPITAL LETTER A to VITHKUQI CAPITAL LETTER GA
        if ((c >= 0x1057C) && (c <= 0x1058A)) { F[0] = 0x105A3 + (c - 0x1057C); return; }  VITHKUQI CAPITAL LETTER HA to VITHKUQI CAPITAL LETTER RE
        if ((c >= 0x1058C) && (c <= 0x10592)) { F[0] = 0x105B3 + (c - 0x1058C); return; }  VITHKUQI CAPITAL LETTER SE to VITHKUQI CAPITAL LETTER XE
        if (c == 0x10594) { F[0] = 0x105BB; return; }  VITHKUQI CAPITAL LETTER Y
        if (c == 0x10595) { F[0] = 0x105BC; return; }  VITHKUQI CAPITAL LETTER ZE
        if ((c >= 0x10C80) && (c <= 0x10CB2)) { F[0] = 0x10CC0 + (c - 0x10C80); return; }  OLD HUNGARIAN CAPITAL LETTER A to OLD HUNGARIAN CAPITAL LETTER US
        if ((c >= 0x118A0) && (c <= 0x118BF)) { F[0] = 0x118C0 + (c - 0x118A0); return; }  WARANG CITI CAPITAL LETTER NGAA to WARANG CITI CAPITAL LETTER VIYO
        if ((c >= 0x16E40) && (c <= 0x16E5F)) { F[0] = 0x16E60 + (c - 0x16E40); return; }  MEDEFAIDRIN CAPITAL LETTER M to MEDEFAIDRIN CAPITAL LETTER Y
        if ((c >= 0x1E900) && (c <= 0x1E921)) { F[0] = 0x1E922 + (c - 0x1E900); return; }  ADLAM CAPITAL LETTER ALIF to ADLAM CAPITAL LETTER SHA
    }
    F[0] = c; return;
}

§8. Whereas these are fairly unarguable.

int Characters::is_ASCII_letter(inchar32_t c) {
    if ((c >= 'a') && (c <= 'z')) return TRUE;
    if ((c >= 'A') && (c <= 'Z')) return TRUE;
    return FALSE;
}

int Characters::is_ASCII_digit(inchar32_t c) {
    if ((c >= '0') && (c <= '9')) return TRUE;
    return FALSE;
}

int Characters::is_control_character(inchar32_t c) {
    if ((c >= 0x0001) && (c <= 0x001f)) return TRUE;
    if (c == 0x007f) return TRUE;
    return FALSE;
}

§9. Unicode composition. A routine which converts the Unicode combining accents with letters, sufficient correctly to handle all characters in the ZSCII set. Returns a combined character code, or 0 if there is no combining to be done.

inchar32_t Characters::combine_accent(inchar32_t accent, inchar32_t letter) {
    switch(accent) {
        case 0x0300:  Unicode combining grave
            switch(letter) {
                case 'a': return 0xE0; case 'e': return 0xE8; case 'i': return 0xEC;
                case 'o': return 0xF2; case 'u': return 0xF9;
                case 'A': return 0xC0; case 'E': return 0xC8; case 'I': return 0xCC;
                case 'O': return 0xD2; case 'U': return 0xD9;
            }
            break;
        case 0x0301:  Unicode combining acute
            switch(letter) {
                case 'a': return 0xE1; case 'e': return 0xE9; case 'i': return 0xED;
                case 'o': return 0xF3; case 'u': return 0xFA; case 'y': return 0xFF;
                case 'A': return 0xC1; case 'E': return 0xC9; case 'I': return 0xCD;
                case 'O': return 0xD3; case 'U': return 0xDA;
            }
            break;
        case 0x0302:  Unicode combining circumflex
            switch(letter) {
                case 'a': return 0xE2; case 'e': return 0xEA; case 'i': return 0xEE;
                case 'o': return 0xF4; case 'u': return 0xFB;
                case 'A': return 0xC2; case 'E': return 0xCA; case 'I': return 0xCE;
                case 'O': return 0xD4; case 'U': return 0xDB;
            }
            break;
        case 0x0303:  Unicode combining tilde
            switch(letter) {
                case 'a': return 0xE3; case 'n': return 0xF1; case 'o': return 0xF5;
                case 'A': return 0xC3; case 'N': return 0xD1; case 'O': return 0xD5;
            }
            break;
        case 0x0308:  Unicode combining diaeresis
            switch(letter) {
                case 'a': return 0xE4; case 'e': return 0xEB; case 'u': return 0xFC;
                case 'o': return 0xF6; case 'i': return 0xEF;
                case 'A': return 0xC4; case 'E': return 0xCB; case 'U': return 0xDC;
                case 'O': return 0xD6; case 'I': return 0xCF;
            }
            break;
        case 0x0327:  Unicode combining cedilla
            switch(letter) {
                case 'c': return 0xE7; case 'C': return 0xC7;
            }
            break;
    }
    return 0;
}

§10. Accent stripping. It's occasionally useful to simplify text used as a filename by removing the more obvious accents from it.

inchar32_t Characters::make_filename_safe(inchar32_t charcode) {
    charcode = Characters::remove_accent(charcode);
    if (charcode >= 128) charcode = '-';
    return charcode;
}

§11. The following strips the accent, if present, from an ISO Latin-1 character:

inchar32_t Characters::remove_accent(inchar32_t charcode) {
    switch (charcode) {
        case 0xC0: case 0xC1: case 0xC2: case 0xC3:
        case 0xC4: case 0xC5: charcode = 'A'; break;
        case 0xE0: case 0xE1: case 0xE2: case 0xE3:
        case 0xE4: case 0xE5: charcode = 'a'; break;
        case 0xC8: case 0xC9: case 0xCA: case 0xCB: charcode = 'E'; break;
        case 0xE8: case 0xE9: case 0xEA: case 0xEB: charcode = 'e'; break;
        case 0xCC: case 0xCD: case 0xCE: case 0xCF: charcode = 'I'; break;
        case 0xEC: case 0xED: case 0xEE: case 0xEF: charcode = 'i'; break;
        case 0xD2: case 0xD3: case 0xD4: case 0xD5:
        case 0xD6: case 0xD8: charcode = 'O'; break;
        case 0xF2: case 0xF3: case 0xF4: case 0xF5:
        case 0xF6: case 0xF8: charcode = 'o'; break;
        case 0xD9: case 0xDA: case 0xDB: case 0xDC: charcode = 'U'; break;
        case 0xF9: case 0xFA: case 0xFB: case 0xFC: charcode = 'u'; break;
        case 0xDD: charcode = 'Y'; break;
        case 0xFD: charcode = 'y'; break;
        case 0xD1: charcode = 'N'; break;
        case 0xF1: charcode = 'n'; break;
        case 0xC7: charcode = 'C'; break;
        case 0xE7: charcode = 'c'; break;
        case 0xDF: charcode = 's'; break;
    }
    return charcode;
}

§12. This will do until we properly use Unicode character classes some day:

int Characters::isalphabetic(inchar32_t letter) {
    return Characters::isalpha(Characters::remove_accent(letter));
}