m3core/src/types/Unicode.m3


---------------------------------------------------------------------------*\
 *  Copyright (c) 2003 - 2004 by Dirk Muysers.
 *  For details see file copying.txt
 *
 *  MODULE:    Unicode.m3
 *  PURPOSE:   Unicode character set
 *  HISTORY:
 *    DATE          PROGRAMMER       DESCRIPTION
 *    30-Nov-2003   Dirk Muysers     Initial creation
 *
 *  NOTE:
 *    The data tables in this module are based on the file 
 *    UnicodeData-3.2.0.txt.
\*---------------------------------------------------------------------------
MODULE Unicode;
---------------------------------------------------------------------------*} * DESCRIPTION: * * This implementation admittedly uses a brute force approach. * * Normally, UNICODE character properties should be provided by the operating * system, which is not the case for the majority of the existing Win32 * platforms. This implementation, while being a performance hog, has the * advantage of having a minimal memory footprint. Most operating system * implementations that offer good performance require at least 2 MB of * memory for hosting the corresponding property tables. * * Reference: Optimal Unicode 3.x Character Attributes and Access Methods * <http://developers.sun.com/dev/gadc/technicalpublications/presentations/ * iuc19-optimalunicode.pdf> * {*---------------------------------------------------------------------------

===========================================================================*} * TYPES {*===========================================================================

TYPE
  Ord = BITS 16 FOR [0..16_FFFF];
  Tuple = ARRAY OF Ord;
  T1 = ARRAY [0..0] OF Ord;
  T2 = ARRAY [0..1] OF Ord;
  T3 = ARRAY [0..2] OF Ord;
===========================================================================*} * DATA {*===========================================================================

CONST
---------------------------------------------------------------------------*} * Spaces {*---------------------------------------------------------------------------

space2 = ARRAY OF T2 {
    T2{16_0009, 16_000D}, (* tab, form feed, newline and carriage return *)
    T2{16_0020, 16_0020}, (* space *)
    T2{16_00a0, 16_00A0}, (* non-break space *)
    T2{16_2000, 16_200B}, (*   - ​ *)
    T2{16_2028, 16_2029}, (* 
 - 
 *)
    T2{16_3000, 16_3000}, (*   *)
    T2{16_FEFF, 16_FEFF}  (* byte order mark *)
    };
---------------------------------------------------------------------------*} * Letter ranges (covers only those ranges that are not in lower or upper) {*---------------------------------------------------------------------------

alpha2 = ARRAY OF T2 {
    T2{16_00D8,  16_00F6},  (* Ø - ö *)
    T2{16_00F8,  16_01F5},  (* ø - ǵ *)
    T2{16_0250,  16_02A8},  (* ɐ - ʨ *)
    T2{16_038E,  16_03A1},  (* Ύ - Ρ *)
    T2{16_03A3,  16_03CE},  (* Σ - ώ *)
    T2{16_03D0,  16_03D6},  (* ϐ - ϖ *)
    T2{16_03E2,  16_03F3},  (* Ϣ - ϳ *)
    T2{16_0490,  16_04C4},  (* Ґ - ӄ *)
    T2{16_0561,  16_0587},  (* ա - և *)
    T2{16_05D0,  16_05EA},  (* א - ת *)
    T2{16_05F0,  16_05F2},  (* װ - ײ *)
    T2{16_0621,  16_063A},  (* ء - غ *)
    T2{16_0640,  16_064A},  (* ـ - ي *)
    T2{16_0671,  16_06B7},  (* ٱ - ڷ *)
    T2{16_06BA,  16_06BE},  (* ں - ھ *)
    T2{16_06C0,  16_06CE},  (* ۀ - ێ *)
    T2{16_06D0,  16_06D3},  (* ې - ۓ *)
    T2{16_0905,  16_0939},  (* अ - ह *)
    T2{16_0958,  16_0961},  (* क़ - ॡ *)
    T2{16_0985,  16_098C},  (* অ - ঌ *)
    T2{16_098F,  16_0990},  (* এ - ঐ *)
    T2{16_0993,  16_09A8},  (* ও - ন *)
    T2{16_09AA,  16_09B0},  (* প - র *)
    T2{16_09B6,  16_09B9},  (* শ - হ *)
    T2{16_09DC,  16_09DD},  (* ড় - ঢ় *)
    T2{16_09DF,  16_09E1},  (* য় - ৡ *)
    T2{16_09F0,  16_09F1},  (* ৰ - ৱ *)
    T2{16_0A05,  16_0A0A},  (* ਅ - ਊ *)
    T2{16_0A0F,  16_0A10},  (* ਏ - ਐ *)
    T2{16_0A13,  16_0A28},  (* ਓ - ਨ *)
    T2{16_0A2A,  16_0A30},  (* ਪ - ਰ *)
    T2{16_0A32,  16_0A33},  (* ਲ - ਲ਼ *)
    T2{16_0A35,  16_0A36},  (* ਵ - ਸ਼ *)
    T2{16_0A38,  16_0A39},  (* ਸ - ਹ *)
    T2{16_0A59,  16_0A5C},  (* ਖ਼ - ੜ *)
    T2{16_0A85,  16_0A8B},  (* અ - ઋ *)
    T2{16_0A8F,  16_0A91},  (* એ - ઑ *)
    T2{16_0A93,  16_0AA8},  (* ઓ - ન *)
    T2{16_0AAA,  16_0AB0},  (* પ - ર *)
    T2{16_0AB2,  16_0AB3},  (* લ - ળ *)
    T2{16_0AB5,  16_0AB9},  (* વ - હ *)
    T2{16_0B05,  16_0B0C},  (* ଅ - ଌ *)
    T2{16_0B0F,  16_0B10},  (* ଏ - ଐ *)
    T2{16_0B13,  16_0B28},  (* ଓ - ନ *)
    T2{16_0B2A,  16_0B30},  (* ପ - ର *)
    T2{16_0B32,  16_0B33},  (* ଲ - ଳ *)
    T2{16_0B36,  16_0B39},  (* ଶ - ହ *)
    T2{16_0B5C,  16_0B5D},  (* ଡ଼ - ଢ଼ *)
    T2{16_0B5F,  16_0B61},  (* ୟ - ୡ *)
    T2{16_0B85,  16_0B8A},  (* அ - ஊ *)
    T2{16_0B8E,  16_0B90},  (* எ - ஐ *)
    T2{16_0B92,  16_0B95},  (* ஒ - க *)
    T2{16_0B99,  16_0B9A},  (* ங - ச *)
    T2{16_0B9E,  16_0B9F},  (* ஞ - ட *)
    T2{16_0BA3,  16_0BA4},  (* ண - த *)
    T2{16_0BA8,  16_0BAA},  (* ந - ப *)
    T2{16_0BAE,  16_0BB5},  (* ம - வ *)
    T2{16_0BB7,  16_0BB9},  (* ஷ - ஹ *)
    T2{16_0C05,  16_0C0C},  (* అ - ఌ *)
    T2{16_0C0E,  16_0C10},  (* ఎ - ఐ *)
    T2{16_0C12,  16_0C28},  (* ఒ - న *)
    T2{16_0C2A,  16_0C33},  (* ప - ళ *)
    T2{16_0C35,  16_0C39},  (* వ - హ *)
    T2{16_0C60,  16_0C61},  (* ౠ - ౡ *)
    T2{16_0C85,  16_0C8C},  (* ಅ - ಌ *)
    T2{16_0C8E,  16_0C90},  (* ಎ - ಐ *)
    T2{16_0C92,  16_0CA8},  (* ಒ - ನ *)
    T2{16_0CAA,  16_0CB3},  (* ಪ - ಳ *)
    T2{16_0CB5,  16_0CB9},  (* ವ - ಹ *)
    T2{16_0CE0,  16_0CE1},  (* ೠ - ೡ *)
    T2{16_0D05,  16_0D0C},  (* അ - ഌ *)
    T2{16_0D0E,  16_0D10},  (* എ - ഐ *)
    T2{16_0D12,  16_0D28},  (* ഒ - ന *)
    T2{16_0D2A,  16_0D39},  (* പ - ഹ *)
    T2{16_0D60,  16_0D61},  (* ൠ - ൡ *)
    T2{16_0E01,  16_0E30},  (* ก - ะ *)
    T2{16_0E32,  16_0E33},  (* า - ำ *)
    T2{16_0E40,  16_0E46},  (* เ - ๆ *)
    T2{16_0E5A,  16_0E5B},  (* ๚ - ๛ *)
    T2{16_0E81,  16_0E82},  (* ກ - ຂ *)
    T2{16_0E87,  16_0E88},  (* ງ - ຈ *)
    T2{16_0E94,  16_0E97},  (* ດ - ທ *)
    T2{16_0E99,  16_0E9F},  (* ນ - ຟ *)
    T2{16_0EA1,  16_0EA3},  (* ມ - ຣ *)
    T2{16_0EAA,  16_0EAB},  (* ສ - ຫ *)
    T2{16_0EAD,  16_0EAE},  (* ອ - ຮ *)
    T2{16_0EB2,  16_0EB3},  (* າ - ຳ *)
    T2{16_0EC0,  16_0EC4},  (* ເ - ໄ *)
    T2{16_0EDC,  16_0EDD},  (* ໜ - ໝ *)
    T2{16_0F18,  16_0F19},  (* ༘ - ༙ *)
    T2{16_0F40,  16_0F47},  (* ཀ - ཇ *)
    T2{16_0F49,  16_0F69},  (* ཉ - ཀྵ *)
    T2{16_10D0,  16_10F6},  (* ა - ჶ *)
    T2{16_1100,  16_1159},  (* ᄀ - ᅙ *)
    T2{16_115F,  16_11A2},  (* ᅟ - ᆢ *)
    T2{16_11A8,  16_11F9},  (* ᆨ - ᇹ *)
    T2{16_1E00,  16_1E9B},  (* Ḁ - ẛ *)
    T2{16_1F50,  16_1F57},  (* ὐ - ὗ *)
    T2{16_1F80,  16_1FB4},  (* ᾀ - ᾴ *)
    T2{16_1FB6,  16_1FBC},  (* ᾶ - ᾼ *)
    T2{16_1FC2,  16_1FC4},  (* ῂ - ῄ *)
    T2{16_1FC6,  16_1FCC},  (* ῆ - ῌ *)
    T2{16_1FD0,  16_1FD3},  (* ῐ - ΐ *)
    T2{16_1FD6,  16_1FDB},  (* ῖ - Ί *)
    T2{16_1FE0,  16_1FEC},  (* ῠ - Ῥ *)
    T2{16_1FF2,  16_1FF4},  (* ῲ - ῴ *)
    T2{16_1FF6,  16_1FFC},  (* ῶ - ῼ *)
    T2{16_210A,  16_2113},  (* ℊ - ℓ *)
    T2{16_2115,  16_211D},  (* ℕ - ℝ *)
    T2{16_2120,  16_2122},  (* ℠ - ™ *)
    T2{16_212A,  16_2131},  (* K - ℱ *)
    T2{16_2133,  16_2138},  (* ℳ - ℸ *)
    T2{16_3041,  16_3094},  (* ぁ - ゔ *)
    T2{16_30A1,  16_30FA},  (* ァ - ヺ *)
    T2{16_3105,  16_312C},  (* ㄅ - ㄬ *)
    T2{16_3131,  16_318E},  (* ㄱ - ㆎ *)
    T2{16_3192,  16_319F},  (* ㆒ - ㆟ *)
    T2{16_3260,  16_327B},  (* ㉠ - ㉻ *)
    T2{16_328A,  16_32B0},  (* ㊊ - ㊰ *)
    T2{16_32D0,  16_32FE},  (* ㋐ - ㋾ *)
    T2{16_3300,  16_3357},  (* ㌀ - ㍗ *)
    T2{16_3371,  16_3376},  (* ㍱ - ㍶ *)
    T2{16_337B,  16_3394},  (* ㍻ - ㎔ *)
    T2{16_3399,  16_339E},  (* ㎙ - ㎞ *)
    T2{16_33A9,  16_33AD},  (* ㎩ - ㎭ *)
    T2{16_33B0,  16_33C1},  (* ㎰ - ㏁ *)
    T2{16_33C3,  16_33C5},  (* ㏃ - ㏅ *)
    T2{16_33C7,  16_33D7},  (* ㏇ - ㏗ *)
    T2{16_33D9,  16_33DD},  (* ㏙ - ㏝ *)
    T2{16_4E00,  16_9FFF},  (* 一 - 鿿 *)
    T2{16_AC00,  16_D7A3},  (* 가 - 힣 *)
    T2{16_F900,  16_FB06},  (* 豈 - st *)
    T2{16_FB13,  16_FB17},  (* ﬓ - ﬗ *)
    T2{16_FB1F,  16_FB28},  (* ײַ - ﬨ *)
    T2{16_FB2A,  16_FB36},  (* שׁ - זּ *)
    T2{16_FB38,  16_FB3C},  (* טּ - לּ *)
    T2{16_FB40,  16_FB41},  (* נּ - סּ *)
    T2{16_FB43,  16_FB44},  (* ףּ - פּ *)
    T2{16_FB46,  16_FBB1},  (* צּ - ﮱ *)
    T2{16_FBD3,  16_FD3D},  (* ﯓ - ﴽ *)
    T2{16_FD50,  16_FD8F},  (* ﵐ - ﶏ *)
    T2{16_FD92,  16_FDC7},  (* ﶒ - ﷇ *)
    T2{16_FDF0,  16_FDF9},  (* ﷰ - ﷹ *)
    T2{16_FE70,  16_FE72},  (* ﹰ - ﹲ *)
    T2{16_FE76,  16_FEFC},  (* ﹶ - ﻼ *)
    T2{16_FF66,  16_FF6F},  (* ヲ - ッ *)
    T2{16_FF71,  16_FF9D},  (* ア - ン *)
    T2{16_FFA0,  16_FFBE},  (* ᅠ - ᄒ *)
    T2{16_FFC2,  16_FFC7},  (* ᅡ - ᅦ *)
    T2{16_FFCA,  16_FFCF},  (* ᅧ - ᅬ *)
    T2{16_FFD2,  16_FFD7},  (* ᅭ - ᅲ *)
    T2{16_FFDA,  16_FFDC}  (* ᅳ - ᅵ *)
    };
---------------------------------------------------------------------------*} * Letter singletons (only covers those letters that are not in upper/lower) {*---------------------------------------------------------------------------

alpha1 = ARRAY OF T1 {
    T1{16_00AA}, (* ª *)
    T1{16_00B5}, (* µ *)
    T1{16_00BA}, (* º *)
    T1{16_03DA}, (* Ϛ *)
    T1{16_03DC}, (* Ϝ *)
    T1{16_03DE}, (* Ϟ *)
    T1{16_03E0}, (* Ϡ *)
    T1{16_06D5}, (* ە *)
    T1{16_09B2}, (* ল *)
    T1{16_0A5E}, (* ਫ਼ *)
    T1{16_0A8D}, (* ઍ *)
    T1{16_0AE0}, (* ૠ *)
    T1{16_0B9C}, (* ஜ *)
    T1{16_0CDE}, (* ೞ *)
    T1{16_0E4F}, (* ๏ *)
    T1{16_0E84}, (* ຄ *)
    T1{16_0E8A}, (* ຊ *)
    T1{16_0E8D}, (* ຍ *)
    T1{16_0EA5}, (* ລ *)
    T1{16_0EA7}, (* ວ *)
    T1{16_0EB0}, (* ະ *)
    T1{16_0EBD}, (* ຽ *)
    T1{16_1FBE}, (* ι *)
    T1{16_207F}, (* ⁿ *)
    T1{16_20A8}, (* ₨ *)
    T1{16_2102}, (* ℂ *)
    T1{16_2107}, (* ℇ *)
    T1{16_2124}, (* ℤ *)
    T1{16_2126}, (* Ω *)
    T1{16_2128}, (* ℨ *)
    T1{16_FB3E}, (* מּ *)
    T1{16_FE74}  (* ﹴ *)
    };
---------------------------------------------------------------------------*} * Decimal digit ranges {*---------------------------------------------------------------------------

digit2 = ARRAY OF T2 {
    T2{16_0030, 16_0039}, (* Digit *)
    T2{16_0660, 16_0669}, (* Arabic Indic *)
    T2{16_06F0, 16_06F9}, (* Extended Arabic Indic *)
    T2{16_0966, 16_096F}, (* Devanagari *)
    T2{16_09E6, 16_09EF}, (* Bengali *)
    T2{16_0A66, 16_0A6F}, (* Gurmukhi *)
    T2{16_0AE6, 16_0AEF}, (* Gujarati *)
    T2{16_0B66, 16_0B6F}, (* Oriya *)
    T2{16_0BE7, 16_0BEF}, (* Tamil [1..9] :-( *)
    T2{16_0C66, 16_0C6F}, (* Telugu *)
    T2{16_0CE6, 16_0CEF}, (* Kannara *)
    T2{16_0D66, 16_0D6F}, (* Malyalam *)
    T2{16_0E50, 16_0E59}, (* Thai *)
    T2{16_0ED0, 16_0ED9}, (* Lao *)
    T2{16_0F20, 16_0F29}, (* Tibetan *)
    T2{16_1040, 16_1049}, (* Burmese *)
    T2{16_1369, 16_1371}, (* Ethiopian [1..9] :-( *)
    T2{16_17E0, 16_17E9}, (* Khmer *)
    T2{16_1810, 16_1819}, (* Gurmukhi *)
    T2{16_0A66, 16_0A6F}, (* Mongolian *)
    T2{16_FF10, 16_FF19}  (* Fullwidth digit *)
    };
---------------------------------------------------------------------------*} * Upper-case ranges (3rd column is conversion excess 500) {*---------------------------------------------------------------------------

tolower3 = ARRAY OF T3 {
    T3{16_0041, 16_005A, 532}, (* A-Z a-z *)
    T3{16_00C0, 16_00D6, 532}, (* À-Ö à-ö *)
    T3{16_00D8, 16_00DE, 532}, (* Ø-Þ ø-þ *)
    T3{16_0189, 16_018A, 705}, (* Ɖ-Ɗ ɖ-ɗ *)
    T3{16_018E, 16_018F, 702}, (* Ǝ-Ə ɘ-ə *)
    T3{16_01B1, 16_01B2, 717}, (* Ʊ-Ʋ ʊ-ʋ *)
    T3{16_0388, 16_038A, 537}, (* Έ-Ί έ-ί *)
    T3{16_038E, 16_038F, 563}, (* Ύ-Ώ ύ-ώ *)
    T3{16_0391, 16_03A1, 532}, (* Α-Ρ α-ρ *)
    T3{16_03A3, 16_03AB, 532}, (* Σ-Ϋ σ-ϋ *)
    T3{16_0401, 16_040C, 580}, (* Ё-Ќ ё-ќ *)
    T3{16_040E, 16_040F, 580}, (* Ў-Џ ў-џ *)
    T3{16_0410, 16_042F, 532}, (* А-Я а-я *)
    T3{16_0531, 16_0556, 548}, (* Ա-Ֆ ա-ֆ *)
    T3{16_10A0, 16_10C5, 548}, (* Ⴀ-Ⴥ ა-ჵ *)
    T3{16_1F08, 16_1F0F, 492}, (* Ἀ-Ἇ ἀ-ἇ *)
    T3{16_1F18, 16_1F1D, 492}, (* Ἐ-Ἕ ἐ-ἕ *)
    T3{16_1F28, 16_1F2F, 492}, (* Ἠ-Ἧ ἠ-ἧ *)
    T3{16_1F38, 16_1F3F, 492}, (* Ἰ-Ἷ ἰ-ἷ *)
    T3{16_1F48, 16_1F4D, 492}, (* Ὀ-Ὅ ὀ-ὅ *)
    T3{16_1F68, 16_1F6F, 492}, (* Ὠ-Ὧ ὠ-ὧ *)
    T3{16_1F88, 16_1F8F, 492}, (* -ᾏ ᾀ-ᾇ *)
    T3{16_1F98, 16_1F9F, 492}, (* ᾘ-ᾟ ᾐ-ᾗ *)
    T3{16_1FA8, 16_1FAF, 492}, (* ᾨ-ᾯ ᾠ-ᾧ *)
    T3{16_1FB8, 16_1FB9, 492}, (* Ᾰ-Ᾱ ᾰ-ᾱ *)
    T3{16_1FBA, 16_1FBB, 426}, (* Ὰ-Ά ὰ-ά *)
    T3{16_1FC8, 16_1FCB, 414}, (* Ὲ-Ή ὲ-ή *)
    T3{16_1FD8, 16_1FD9, 492}, (* Ῐ-Ῑ ῐ-ῑ *)
    T3{16_1FDA, 16_1FDB, 400}, (* Ὶ-Ί ὶ-ί *)
    T3{16_1FE8, 16_1FE9, 492}, (* Ῠ-Ῡ ῠ-ῡ *)
    T3{16_1FEA, 16_1FEB, 388}, (* Ὺ-Ύ ὺ-ύ *)
    T3{16_1FF8, 16_1FF9, 372}, (* Ὸ-Ό ὸ-ό *)
    T3{16_1FFA, 16_1FFB, 374}, (* Ὼ-Ώ ὼ-ώ *)
    T3{16_2160, 16_216F, 516}, (* Ⅰ-Ⅿ ⅰ-ⅿ *)
    T3{16_24B6, 16_24CF, 526}, (* Ⓐ-Ⓩ ⓐ-ⓩ *)
    T3{16_FF21, 16_FF3A, 532}  (* A-Z a-z *)
    };
---------------------------------------------------------------------------*} * Upper-case Singletons (2nd column is conversion excess 500 {*---------------------------------------------------------------------------

tolower2 = ARRAY OF T2 {
    T2{16_0100, 501}, (* Ā ā *)
    T2{16_0102, 501}, (* Ă ă *)
    T2{16_0104, 501}, (* Ą ą *)
    T2{16_0106, 501}, (* Ć ć *)
    T2{16_0108, 501}, (* Ĉ ĉ *)
    T2{16_010A, 501}, (* Ċ ċ *)
    T2{16_010C, 501}, (* Č č *)
    T2{16_010E, 501}, (* Ď ď *)
    T2{16_0110, 501}, (* Đ đ *)
    T2{16_0112, 501}, (* Ē ē *)
    T2{16_0114, 501}, (* Ĕ ĕ *)
    T2{16_0116, 501}, (* Ė ė *)
    T2{16_0118, 501}, (* Ę ę *)
    T2{16_011A, 501}, (* Ě ě *)
    T2{16_011C, 501}, (* Ĝ ĝ *)
    T2{16_011E, 501}, (* Ğ ğ *)
    T2{16_0120, 501}, (* Ġ ġ *)
    T2{16_0122, 501}, (* Ģ ģ *)
    T2{16_0124, 501}, (* Ĥ ĥ *)
    T2{16_0126, 501}, (* Ħ ħ *)
    T2{16_0128, 501}, (* Ĩ ĩ *)
    T2{16_012A, 501}, (* Ī ī *)
    T2{16_012C, 501}, (* Ĭ ĭ *)
    T2{16_012E, 501}, (* Į į *)
    T2{16_0130, 301}, (* İ i *)
    T2{16_0132, 501}, (* IJ ij *)
    T2{16_0134, 501}, (* Ĵ ĵ *)
    T2{16_0136, 501}, (* Ķ ķ *)
    T2{16_0139, 501}, (* Ĺ ĺ *)
    T2{16_013B, 501}, (* Ļ ļ *)
    T2{16_013D, 501}, (* Ľ ľ *)
    T2{16_013F, 501}, (* Ŀ ŀ *)
    T2{16_0141, 501}, (* Ł ł *)
    T2{16_0143, 501}, (* Ń ń *)
    T2{16_0145, 501}, (* Ņ ņ *)
    T2{16_0147, 501}, (* Ň ň *)
    T2{16_014A, 501}, (* Ŋ ŋ *)
    T2{16_014C, 501}, (* Ō ō *)
    T2{16_014E, 501}, (* Ŏ ŏ *)
    T2{16_0150, 501}, (* Ő ő *)
    T2{16_0152, 501}, (* Œ œ *)
    T2{16_0154, 501}, (* Ŕ ŕ *)
    T2{16_0156, 501}, (* Ŗ ŗ *)
    T2{16_0158, 501}, (* Ř ř *)
    T2{16_015A, 501}, (* Ś ś *)
    T2{16_015C, 501}, (* Ŝ ŝ *)
    T2{16_015E, 501}, (* Ş ş *)
    T2{16_0160, 501}, (* Š š *)
    T2{16_0162, 501}, (* Ţ ţ *)
    T2{16_0164, 501}, (* Ť ť *)
    T2{16_0166, 501}, (* Ŧ ŧ *)
    T2{16_0168, 501}, (* Ũ ũ *)
    T2{16_016A, 501}, (* Ū ū *)
    T2{16_016C, 501}, (* Ŭ ŭ *)
    T2{16_016E, 501}, (* Ů ů *)
    T2{16_0170, 501}, (* Ű ű *)
    T2{16_0172, 501}, (* Ų ų *)
    T2{16_0174, 501}, (* Ŵ ŵ *)
    T2{16_0176, 501}, (* Ŷ ŷ *)
    T2{16_0178, 379}, (* Ÿ ÿ *)
    T2{16_0179, 501}, (* Ź ź *)
    T2{16_017B, 501}, (* Ż ż *)
    T2{16_017D, 501}, (* Ž ž *)
    T2{16_0181, 710}, (* Ɓ ɓ *)
    T2{16_0182, 501}, (* Ƃ ƃ *)
    T2{16_0184, 501}, (* Ƅ ƅ *)
    T2{16_0186, 706}, (* Ɔ ɔ *)
    T2{16_0187, 501}, (* Ƈ ƈ *)
    T2{16_018B, 501}, (* Ƌ ƌ *)
    T2{16_0190, 703}, (* Ɛ ɛ *)
    T2{16_0191, 501}, (* Ƒ ƒ *)
    T2{16_0193, 705}, (* Ɠ ɠ *)
    T2{16_0194, 707}, (* Ɣ ɣ *)
    T2{16_0196, 711}, (* Ɩ ɩ *)
    T2{16_0197, 709}, (* Ɨ ɨ *)
    T2{16_0198, 501}, (* Ƙ ƙ *)
    T2{16_019C, 711}, (* Ɯ ɯ *)
    T2{16_019D, 713}, (* Ɲ ɲ *)
    T2{16_01A0, 501}, (* Ơ ơ *)
    T2{16_01A2, 501}, (* Ƣ ƣ *)
    T2{16_01A4, 501}, (* Ƥ ƥ *)
    T2{16_01A7, 501}, (* Ƨ ƨ *)
    T2{16_01A9, 718}, (* Ʃ ʃ *)
    T2{16_01AC, 501}, (* Ƭ ƭ *)
    T2{16_01AE, 718}, (* Ʈ ʈ *)
    T2{16_01AF, 501}, (* Ư ư *)
    T2{16_01B3, 501}, (* Ƴ ƴ *)
    T2{16_01B5, 501}, (* Ƶ ƶ *)
    T2{16_01B7, 719}, (* Ʒ ʒ *)
    T2{16_01B8, 501}, (* Ƹ ƹ *)
    T2{16_01BC, 501}, (* Ƽ ƽ *)
    T2{16_01C4, 502}, (* DŽ dž *)
    T2{16_01C5, 501}, (* Dž dž *)
    T2{16_01C7, 502}, (* LJ lj *)
    T2{16_01C8, 501}, (* Lj lj *)
    T2{16_01CA, 502}, (* NJ nj *)
    T2{16_01CB, 501}, (* Nj nj *)
    T2{16_01CD, 501}, (* Ǎ ǎ *)
    T2{16_01CF, 501}, (* Ǐ ǐ *)
    T2{16_01D1, 501}, (* Ǒ ǒ *)
    T2{16_01D3, 501}, (* Ǔ ǔ *)
    T2{16_01D5, 501}, (* Ǖ ǖ *)
    T2{16_01D7, 501}, (* Ǘ ǘ *)
    T2{16_01D9, 501}, (* Ǚ ǚ *)
    T2{16_01DB, 501}, (* Ǜ ǜ *)
    T2{16_01DE, 501}, (* Ǟ ǟ *)
    T2{16_01E0, 501}, (* Ǡ ǡ *)
    T2{16_01E2, 501}, (* Ǣ ǣ *)
    T2{16_01E4, 501}, (* Ǥ ǥ *)
    T2{16_01E6, 501}, (* Ǧ ǧ *)
    T2{16_01E8, 501}, (* Ǩ ǩ *)
    T2{16_01EA, 501}, (* Ǫ ǫ *)
    T2{16_01EC, 501}, (* Ǭ ǭ *)
    T2{16_01EE, 501}, (* Ǯ ǯ *)
    T2{16_01F1, 502}, (* DZ dz *)
    T2{16_01F2, 501}, (* Dz dz *)
    T2{16_01F4, 501}, (* Ǵ ǵ *)
    T2{16_01FA, 501}, (* Ǻ ǻ *)
    T2{16_01FC, 501}, (* Ǽ ǽ *)
    T2{16_01FE, 501}, (* Ǿ ǿ *)
    T2{16_0200, 501}, (* Ȁ ȁ *)
    T2{16_0202, 501}, (* Ȃ ȃ *)
    T2{16_0204, 501}, (* Ȅ ȅ *)
    T2{16_0206, 501}, (* Ȇ ȇ *)
    T2{16_0208, 501}, (* Ȉ ȉ *)
    T2{16_020A, 501}, (* Ȋ ȋ *)
    T2{16_020C, 501}, (* Ȍ ȍ *)
    T2{16_020E, 501}, (* Ȏ ȏ *)
    T2{16_0210, 501}, (* Ȑ ȑ *)
    T2{16_0212, 501}, (* Ȓ ȓ *)
    T2{16_0214, 501}, (* Ȕ ȕ *)
    T2{16_0216, 501}, (* Ȗ ȗ *)
    T2{16_0386, 538}, (* Ά ά *)
    T2{16_038C, 564}, (* Ό ό *)
    T2{16_03E2, 501}, (* Ϣ ϣ *)
    T2{16_03E4, 501}, (* Ϥ ϥ *)
    T2{16_03E6, 501}, (* Ϧ ϧ *)
    T2{16_03E8, 501}, (* Ϩ ϩ *)
    T2{16_03EA, 501}, (* Ϫ ϫ *)
    T2{16_03EC, 501}, (* Ϭ ϭ *)
    T2{16_03EE, 501}, (* Ϯ ϯ *)
    T2{16_0460, 501}, (* Ѡ ѡ *)
    T2{16_0462, 501}, (* Ѣ ѣ *)
    T2{16_0464, 501}, (* Ѥ ѥ *)
    T2{16_0466, 501}, (* Ѧ ѧ *)
    T2{16_0468, 501}, (* Ѩ ѩ *)
    T2{16_046A, 501}, (* Ѫ ѫ *)
    T2{16_046C, 501}, (* Ѭ ѭ *)
    T2{16_046E, 501}, (* Ѯ ѯ *)
    T2{16_0470, 501}, (* Ѱ ѱ *)
    T2{16_0472, 501}, (* Ѳ ѳ *)
    T2{16_0474, 501}, (* Ѵ ѵ *)
    T2{16_0476, 501}, (* Ѷ ѷ *)
    T2{16_0478, 501}, (* Ѹ ѹ *)
    T2{16_047A, 501}, (* Ѻ ѻ *)
    T2{16_047C, 501}, (* Ѽ ѽ *)
    T2{16_047E, 501}, (* Ѿ ѿ *)
    T2{16_0480, 501}, (* Ҁ ҁ *)
    T2{16_0490, 501}, (* Ґ ґ *)
    T2{16_0492, 501}, (* Ғ ғ *)
    T2{16_0494, 501}, (* Ҕ ҕ *)
    T2{16_0496, 501}, (* Җ җ *)
    T2{16_0498, 501}, (* Ҙ ҙ *)
    T2{16_049A, 501}, (* Қ қ *)
    T2{16_049C, 501}, (* Ҝ ҝ *)
    T2{16_049E, 501}, (* Ҟ ҟ *)
    T2{16_04A0, 501}, (* Ҡ ҡ *)
    T2{16_04A2, 501}, (* Ң ң *)
    T2{16_04A4, 501}, (* Ҥ ҥ *)
    T2{16_04A6, 501}, (* Ҧ ҧ *)
    T2{16_04A8, 501}, (* Ҩ ҩ *)
    T2{16_04AA, 501}, (* Ҫ ҫ *)
    T2{16_04AC, 501}, (* Ҭ ҭ *)
    T2{16_04AE, 501}, (* Ү ү *)
    T2{16_04B0, 501}, (* Ұ ұ *)
    T2{16_04B2, 501}, (* Ҳ ҳ *)
    T2{16_04B4, 501}, (* Ҵ ҵ *)
    T2{16_04B6, 501}, (* Ҷ ҷ *)
    T2{16_04B8, 501}, (* Ҹ ҹ *)
    T2{16_04BA, 501}, (* Һ һ *)
    T2{16_04BC, 501}, (* Ҽ ҽ *)
    T2{16_04BE, 501}, (* Ҿ ҿ *)
    T2{16_04C1, 501}, (* Ӂ ӂ *)
    T2{16_04C3, 501}, (* Ӄ ӄ *)
    T2{16_04C7, 501}, (* Ӈ ӈ *)
    T2{16_04CB, 501}, (* Ӌ ӌ *)
    T2{16_04D0, 501}, (* Ӑ ӑ *)
    T2{16_04D2, 501}, (* Ӓ ӓ *)
    T2{16_04D4, 501}, (* Ӕ ӕ *)
    T2{16_04D6, 501}, (* Ӗ ӗ *)
    T2{16_04D8, 501}, (* Ә ә *)
    T2{16_04DA, 501}, (* Ӛ ӛ *)
    T2{16_04DC, 501}, (* Ӝ ӝ *)
    T2{16_04DE, 501}, (* Ӟ ӟ *)
    T2{16_04E0, 501}, (* Ӡ ӡ *)
    T2{16_04E2, 501}, (* Ӣ ӣ *)
    T2{16_04E4, 501}, (* Ӥ ӥ *)
    T2{16_04E6, 501}, (* Ӧ ӧ *)
    T2{16_04E8, 501}, (* Ө ө *)
    T2{16_04EA, 501}, (* Ӫ ӫ *)
    T2{16_04EE, 501}, (* Ӯ ӯ *)
    T2{16_04F0, 501}, (* Ӱ ӱ *)
    T2{16_04F2, 501}, (* Ӳ ӳ *)
    T2{16_04F4, 501}, (* Ӵ ӵ *)
    T2{16_04F8, 501}, (* Ӹ ӹ *)
    T2{16_1E00, 501}, (* Ḁ ḁ *)
    T2{16_1E02, 501}, (* Ḃ ḃ *)
    T2{16_1E04, 501}, (* Ḅ ḅ *)
    T2{16_1E06, 501}, (* Ḇ ḇ *)
    T2{16_1E08, 501}, (* Ḉ ḉ *)
    T2{16_1E0A, 501}, (* Ḋ ḋ *)
    T2{16_1E0C, 501}, (* Ḍ ḍ *)
    T2{16_1E0E, 501}, (* Ḏ ḏ *)
    T2{16_1E10, 501}, (* Ḑ ḑ *)
    T2{16_1E12, 501}, (* Ḓ ḓ *)
    T2{16_1E14, 501}, (* Ḕ ḕ *)
    T2{16_1E16, 501}, (* Ḗ ḗ *)
    T2{16_1E18, 501}, (* Ḙ ḙ *)
    T2{16_1E1A, 501}, (* Ḛ ḛ *)
    T2{16_1E1C, 501}, (* Ḝ ḝ *)
    T2{16_1E1E, 501}, (* Ḟ ḟ *)
    T2{16_1E20, 501}, (* Ḡ ḡ *)
    T2{16_1E22, 501}, (* Ḣ ḣ *)
    T2{16_1E24, 501}, (* Ḥ ḥ *)
    T2{16_1E26, 501}, (* Ḧ ḧ *)
    T2{16_1E28, 501}, (* Ḩ ḩ *)
    T2{16_1E2A, 501}, (* Ḫ ḫ *)
    T2{16_1E2C, 501}, (* Ḭ ḭ *)
    T2{16_1E2E, 501}, (* Ḯ ḯ *)
    T2{16_1E30, 501}, (* Ḱ ḱ *)
    T2{16_1E32, 501}, (* Ḳ ḳ *)
    T2{16_1E34, 501}, (* Ḵ ḵ *)
    T2{16_1E36, 501}, (* Ḷ ḷ *)
    T2{16_1E38, 501}, (* Ḹ ḹ *)
    T2{16_1E3A, 501}, (* Ḻ ḻ *)
    T2{16_1E3C, 501}, (* Ḽ ḽ *)
    T2{16_1E3E, 501}, (* Ḿ ḿ *)
    T2{16_1E40, 501}, (* Ṁ ṁ *)
    T2{16_1E42, 501}, (* Ṃ ṃ *)
    T2{16_1E44, 501}, (* Ṅ ṅ *)
    T2{16_1E46, 501}, (* Ṇ ṇ *)
    T2{16_1E48, 501}, (* Ṉ ṉ *)
    T2{16_1E4A, 501}, (* Ṋ ṋ *)
    T2{16_1E4C, 501}, (* Ṍ ṍ *)
    T2{16_1E4E, 501}, (* Ṏ ṏ *)
    T2{16_1E50, 501}, (* Ṑ ṑ *)
    T2{16_1E52, 501}, (* Ṓ ṓ *)
    T2{16_1E54, 501}, (* Ṕ ṕ *)
    T2{16_1E56, 501}, (* Ṗ ṗ *)
    T2{16_1E58, 501}, (* Ṙ ṙ *)
    T2{16_1E5A, 501}, (* Ṛ ṛ *)
    T2{16_1E5C, 501}, (* Ṝ ṝ *)
    T2{16_1E5E, 501}, (* Ṟ ṟ *)
    T2{16_1E60, 501}, (* Ṡ ṡ *)
    T2{16_1E62, 501}, (* Ṣ ṣ *)
    T2{16_1E64, 501}, (* Ṥ ṥ *)
    T2{16_1E66, 501}, (* Ṧ ṧ *)
    T2{16_1E68, 501}, (* Ṩ ṩ *)
    T2{16_1E6A, 501}, (* Ṫ ṫ *)
    T2{16_1E6C, 501}, (* Ṭ ṭ *)
    T2{16_1E6E, 501}, (* Ṯ ṯ *)
    T2{16_1E70, 501}, (* Ṱ ṱ *)
    T2{16_1E72, 501}, (* Ṳ ṳ *)
    T2{16_1E74, 501}, (* Ṵ ṵ *)
    T2{16_1E76, 501}, (* Ṷ ṷ *)
    T2{16_1E78, 501}, (* Ṹ ṹ *)
    T2{16_1E7A, 501}, (* Ṻ ṻ *)
    T2{16_1E7C, 501}, (* Ṽ ṽ *)
    T2{16_1E7E, 501}, (* Ṿ ṿ *)
    T2{16_1E80, 501}, (* Ẁ ẁ *)
    T2{16_1E82, 501}, (* Ẃ ẃ *)
    T2{16_1E84, 501}, (* Ẅ ẅ *)
    T2{16_1E86, 501}, (* Ẇ ẇ *)
    T2{16_1E88, 501}, (* Ẉ ẉ *)
    T2{16_1E8A, 501}, (* Ẋ ẋ *)
    T2{16_1E8C, 501}, (* Ẍ ẍ *)
    T2{16_1E8E, 501}, (* Ẏ ẏ *)
    T2{16_1E90, 501}, (* Ẑ ẑ *)
    T2{16_1E92, 501}, (* Ẓ ẓ *)
    T2{16_1E94, 501}, (* Ẕ ẕ *)
    T2{16_1EA0, 501}, (* Ạ ạ *)
    T2{16_1EA2, 501}, (* Ả ả *)
    T2{16_1EA4, 501}, (* Ấ ấ *)
    T2{16_1EA6, 501}, (* Ầ ầ *)
    T2{16_1EA8, 501}, (* Ẩ ẩ *)
    T2{16_1EAA, 501}, (* Ẫ ẫ *)
    T2{16_1EAC, 501}, (* Ậ ậ *)
    T2{16_1EAE, 501}, (* Ắ ắ *)
    T2{16_1EB0, 501}, (* Ằ ằ *)
    T2{16_1EB2, 501}, (* Ẳ ẳ *)
    T2{16_1EB4, 501}, (* Ẵ ẵ *)
    T2{16_1EB6, 501}, (* Ặ ặ *)
    T2{16_1EB8, 501}, (* Ẹ ẹ *)
    T2{16_1EBA, 501}, (* Ẻ ẻ *)
    T2{16_1EBC, 501}, (* Ẽ ẽ *)
    T2{16_1EBE, 501}, (* Ế ế *)
    T2{16_1EC0, 501}, (* Ề ề *)
    T2{16_1EC2, 501}, (* Ể ể *)
    T2{16_1EC4, 501}, (* Ễ ễ *)
    T2{16_1EC6, 501}, (* Ệ ệ *)
    T2{16_1EC8, 501}, (* Ỉ ỉ *)
    T2{16_1ECA, 501}, (* Ị ị *)
    T2{16_1ECC, 501}, (* Ọ ọ *)
    T2{16_1ECE, 501}, (* Ỏ ỏ *)
    T2{16_1ED0, 501}, (* Ố ố *)
    T2{16_1ED2, 501}, (* Ồ ồ *)
    T2{16_1ED4, 501}, (* Ổ ổ *)
    T2{16_1ED6, 501}, (* Ỗ ỗ *)
    T2{16_1ED8, 501}, (* Ộ ộ *)
    T2{16_1EDA, 501}, (* Ớ ớ *)
    T2{16_1EDC, 501}, (* Ờ ờ *)
    T2{16_1EDE, 501}, (* Ở ở *)
    T2{16_1EE0, 501}, (* Ỡ ỡ *)
    T2{16_1EE2, 501}, (* Ợ ợ *)
    T2{16_1EE4, 501}, (* Ụ ụ *)
    T2{16_1EE6, 501}, (* Ủ ủ *)
    T2{16_1EE8, 501}, (* Ứ ứ *)
    T2{16_1EEA, 501}, (* Ừ ừ *)
    T2{16_1EEC, 501}, (* Ử ử *)
    T2{16_1EEE, 501}, (* Ữ ữ *)
    T2{16_1EF0, 501}, (* Ự ự *)
    T2{16_1EF2, 501}, (* Ỳ ỳ *)
    T2{16_1EF4, 501}, (* Ỵ ỵ *)
    T2{16_1EF6, 501}, (* Ỷ ỷ *)
    T2{16_1EF8, 501}, (* Ỹ ỹ *)
    T2{16_1F59, 492}, (* Ὑ ὑ *)
    T2{16_1F5B, 492}, (* Ὓ ὓ *)
    T2{16_1F5D, 492}, (* Ὕ ὕ *)
    T2{16_1F5F, 492}, (* Ὗ ὗ *)
    T2{16_1FBC, 491}, (* ᾼ ᾳ *)
    T2{16_1FCC, 491}, (* ῌ ῃ *)
    T2{16_1FEC, 493}, (* Ῥ ῥ *)
    T2{16_1FFC, 491} (* ῼ ῳ *)
    };
---------------------------------------------------------------------------*} * Lower-case ranges (3rd column is conversion excess 500) {*---------------------------------------------------------------------------

toupper3 = ARRAY OF T3 {
    T3{16_0061, 16_007A, 468}, (* a-z A-Z *)
    T3{16_00E0, 16_00F6, 468}, (* à-ö À-Ö *)
    T3{16_00F8, 16_00FE, 468}, (* ø-þ Ø-Þ *)
    T3{16_0256, 16_0257, 295}, (* ɖ-ɗ Ɖ-Ɗ *)
    T3{16_0258, 16_0259, 298}, (* ɘ-ə Ǝ-Ə *)
    T3{16_028A, 16_028B, 283}, (* ʊ-ʋ Ʊ-Ʋ *)
    T3{16_03AD, 16_03AF, 463}, (* έ-ί Έ-Ί *)
    T3{16_03B1, 16_03C1, 468}, (* α-ρ Α-Ρ *)
    T3{16_03C3, 16_03CB, 468}, (* σ-ϋ Σ-Ϋ *)
    T3{16_03CD, 16_03CE, 437}, (* ύ-ώ Ύ-Ώ *)
    T3{16_0430, 16_044F, 468}, (* а-я А-Я *)
    T3{16_0451, 16_045C, 420}, (* ё-ќ Ё-Ќ *)
    T3{16_045E, 16_045F, 420}, (* ў-џ Ў-Џ *)
    T3{16_0561, 16_0586, 452}, (* ա-ֆ Ա-Ֆ *)
    T3{16_1F00, 16_1F07, 508}, (* ἀ-ἇ Ἀ-Ἇ *)
    T3{16_1F10, 16_1F15, 508}, (* ἐ-ἕ Ἐ-Ἕ *)
    T3{16_1F20, 16_1F27, 508}, (* ἠ-ἧ Ἠ-Ἧ *)
    T3{16_1F30, 16_1F37, 508}, (* ἰ-ἷ Ἰ-Ἷ *)
    T3{16_1F40, 16_1F45, 508}, (* ὀ-ὅ Ὀ-Ὅ *)
    T3{16_1F60, 16_1F67, 508}, (* ὠ-ὧ Ὠ-Ὧ *)
    T3{16_1F70, 16_1F71, 574}, (* ὰ-ά Ὰ-Ά *)
    T3{16_1F72, 16_1F75, 586}, (* ὲ-ή Ὲ-Ή *)
    T3{16_1F76, 16_1F77, 600}, (* ὶ-ί Ὶ-Ί *)
    T3{16_1F78, 16_1F79, 628}, (* ὸ-ό Ὸ-Ό *)
    T3{16_1F7A, 16_1F7B, 612}, (* ὺ-ύ Ὺ-Ύ *)
    T3{16_1F7C, 16_1F7D, 626}, (* ὼ-ώ Ὼ-Ώ *)
    T3{16_1F80, 16_1F87, 508}, (* ᾀ-ᾇ ᾈ-ᾏ *)
    T3{16_1F90, 16_1F97, 508}, (* ᾐ-ᾗ ᾘ-ᾟ *)
    T3{16_1FA0, 16_1FA7, 508}, (* ᾠ-ᾧ ᾨ-ᾯ *)
    T3{16_1FB0, 16_1FB1, 508}, (* ᾰ-ᾱ Ᾰ-Ᾱ *)
    T3{16_1FD0, 16_1FD1, 508}, (* ῐ-ῑ Ῐ-Ῑ *)
    T3{16_1FE0, 16_1FE1, 508}, (* ῠ-ῡ Ῠ-Ῡ *)
    T3{16_2170, 16_217F, 484}, (* ⅰ-ⅿ Ⅰ-Ⅿ *)
    T3{16_24D0, 16_24E9, 474}, (* ⓐ-ⓩ Ⓐ-Ⓩ *)
    T3{16_FF41, 16_FF5A, 468}  (* a-z A-Z *)
    };
---------------------------------------------------------------------------*} * Lower-case singletons (2nd column is conversion excess 500) {*---------------------------------------------------------------------------

toupper2 = ARRAY OF T2 {
    T2{16_00FF, 621}, (* ÿ Ÿ *)
    T2{16_0101, 499}, (* ā Ā *)
    T2{16_0103, 499}, (* ă Ă *)
    T2{16_0105, 499}, (* ą Ą *)
    T2{16_0107, 499}, (* ć Ć *)
    T2{16_0109, 499}, (* ĉ Ĉ *)
    T2{16_010B, 499}, (* ċ Ċ *)
    T2{16_010D, 499}, (* č Č *)
    T2{16_010F, 499}, (* ď Ď *)
    T2{16_0111, 499}, (* đ Đ *)
    T2{16_0113, 499}, (* ē Ē *)
    T2{16_0115, 499}, (* ĕ Ĕ *)
    T2{16_0117, 499}, (* ė Ė *)
    T2{16_0119, 499}, (* ę Ę *)
    T2{16_011B, 499}, (* ě Ě *)
    T2{16_011D, 499}, (* ĝ Ĝ *)
    T2{16_011F, 499}, (* ğ Ğ *)
    T2{16_0121, 499}, (* ġ Ġ *)
    T2{16_0123, 499}, (* ģ Ģ *)
    T2{16_0125, 499}, (* ĥ Ĥ *)
    T2{16_0127, 499}, (* ħ Ħ *)
    T2{16_0129, 499}, (* ĩ Ĩ *)
    T2{16_012B, 499}, (* ī Ī *)
    T2{16_012D, 499}, (* ĭ Ĭ *)
    T2{16_012F, 499}, (* į Į *)
    T2{16_0131, 268}, (* ı I *)
    T2{16_0133, 499}, (* ij IJ *)
    T2{16_0135, 499}, (* ĵ Ĵ *)
    T2{16_0137, 499}, (* ķ Ķ *)
    T2{16_013A, 499}, (* ĺ Ĺ *)
    T2{16_013C, 499}, (* ļ Ļ *)
    T2{16_013E, 499}, (* ľ Ľ *)
    T2{16_0140, 499}, (* ŀ Ŀ *)
    T2{16_0142, 499}, (* ł Ł *)
    T2{16_0144, 499}, (* ń Ń *)
    T2{16_0146, 499}, (* ņ Ņ *)
    T2{16_0148, 499}, (* ň Ň *)
    T2{16_014B, 499}, (* ŋ Ŋ *)
    T2{16_014D, 499}, (* ō Ō *)
    T2{16_014F, 499}, (* ŏ Ŏ *)
    T2{16_0151, 499}, (* ő Ő *)
    T2{16_0153, 499}, (* œ Œ *)
    T2{16_0155, 499}, (* ŕ Ŕ *)
    T2{16_0157, 499}, (* ŗ Ŗ *)
    T2{16_0159, 499}, (* ř Ř *)
    T2{16_015B, 499}, (* ś Ś *)
    T2{16_015D, 499}, (* ŝ Ŝ *)
    T2{16_015F, 499}, (* ş Ş *)
    T2{16_0161, 499}, (* š Š *)
    T2{16_0163, 499}, (* ţ Ţ *)
    T2{16_0165, 499}, (* ť Ť *)
    T2{16_0167, 499}, (* ŧ Ŧ *)
    T2{16_0169, 499}, (* ũ Ũ *)
    T2{16_016B, 499}, (* ū Ū *)
    T2{16_016D, 499}, (* ŭ Ŭ *)
    T2{16_016F, 499}, (* ů Ů *)
    T2{16_0171, 499}, (* ű Ű *)
    T2{16_0173, 499}, (* ų Ų *)
    T2{16_0175, 499}, (* ŵ Ŵ *)
    T2{16_0177, 499}, (* ŷ Ŷ *)
    T2{16_017A, 499}, (* ź Ź *)
    T2{16_017C, 499}, (* ż Ż *)
    T2{16_017E, 499}, (* ž Ž *)
    T2{16_017F, 200}, (* ſ S *)
    T2{16_0183, 499}, (* ƃ Ƃ *)
    T2{16_0185, 499}, (* ƅ Ƅ *)
    T2{16_0188, 499}, (* ƈ Ƈ *)
    T2{16_018C, 499}, (* ƌ Ƌ *)
    T2{16_0192, 499}, (* ƒ Ƒ *)
    T2{16_0199, 499}, (* ƙ Ƙ *)
    T2{16_01A1, 499}, (* ơ Ơ *)
    T2{16_01A3, 499}, (* ƣ Ƣ *)
    T2{16_01A5, 499}, (* ƥ Ƥ *)
    T2{16_01A8, 499}, (* ƨ Ƨ *)
    T2{16_01AD, 499}, (* ƭ Ƭ *)
    T2{16_01B0, 499}, (* ư Ư *)
    T2{16_01B4, 499}, (* ƴ Ƴ *)
    T2{16_01B6, 499}, (* ƶ Ƶ *)
    T2{16_01B9, 499}, (* ƹ Ƹ *)
    T2{16_01BD, 499}, (* ƽ Ƽ *)
    T2{16_01C5, 499}, (* Dž DŽ *)
    T2{16_01C6, 498}, (* dž DŽ *)
    T2{16_01C8, 499}, (* Lj LJ *)
    T2{16_01C9, 498}, (* lj LJ *)
    T2{16_01CB, 499}, (* Nj NJ *)
    T2{16_01CC, 498}, (* nj NJ *)
    T2{16_01CE, 499}, (* ǎ Ǎ *)
    T2{16_01D0, 499}, (* ǐ Ǐ *)
    T2{16_01D2, 499}, (* ǒ Ǒ *)
    T2{16_01D4, 499}, (* ǔ Ǔ *)
    T2{16_01D6, 499}, (* ǖ Ǖ *)
    T2{16_01D8, 499}, (* ǘ Ǘ *)
    T2{16_01DA, 499}, (* ǚ Ǚ *)
    T2{16_01DC, 499}, (* ǜ Ǜ *)
    T2{16_01DF, 499}, (* ǟ Ǟ *)
    T2{16_01E1, 499}, (* ǡ Ǡ *)
    T2{16_01E3, 499}, (* ǣ Ǣ *)
    T2{16_01E5, 499}, (* ǥ Ǥ *)
    T2{16_01E7, 499}, (* ǧ Ǧ *)
    T2{16_01E9, 499}, (* ǩ Ǩ *)
    T2{16_01EB, 499}, (* ǫ Ǫ *)
    T2{16_01ED, 499}, (* ǭ Ǭ *)
    T2{16_01EF, 499}, (* ǯ Ǯ *)
    T2{16_01F2, 499}, (* Dz DZ *)
    T2{16_01F3, 498}, (* dz DZ *)
    T2{16_01F5, 499}, (* ǵ Ǵ *)
    T2{16_01FB, 499}, (* ǻ Ǻ *)
    T2{16_01FD, 499}, (* ǽ Ǽ *)
    T2{16_01FF, 499}, (* ǿ Ǿ *)
    T2{16_0201, 499}, (* ȁ Ȁ *)
    T2{16_0203, 499}, (* ȃ Ȃ *)
    T2{16_0205, 499}, (* ȅ Ȅ *)
    T2{16_0207, 499}, (* ȇ Ȇ *)
    T2{16_0209, 499}, (* ȉ Ȉ *)
    T2{16_020B, 499}, (* ȋ Ȋ *)
    T2{16_020D, 499}, (* ȍ Ȍ *)
    T2{16_020F, 499}, (* ȏ Ȏ *)
    T2{16_0211, 499}, (* ȑ Ȑ *)
    T2{16_0213, 499}, (* ȓ Ȓ *)
    T2{16_0215, 499}, (* ȕ Ȕ *)
    T2{16_0217, 499}, (* ȗ Ȗ *)
    T2{16_0253, 290}, (* ɓ Ɓ *)
    T2{16_0254, 294}, (* ɔ Ɔ *)
    T2{16_025B, 297}, (* ɛ Ɛ *)
    T2{16_0260, 295}, (* ɠ Ɠ *)
    T2{16_0263, 293}, (* ɣ Ɣ *)
    T2{16_0268, 291}, (* ɨ Ɨ *)
    T2{16_0269, 289}, (* ɩ Ɩ *)
    T2{16_026F, 289}, (* ɯ Ɯ *)
    T2{16_0272, 287}, (* ɲ Ɲ *)
    T2{16_0283, 282}, (* ʃ Ʃ *)
    T2{16_0288, 282}, (* ʈ Ʈ *)
    T2{16_0292, 281}, (* ʒ Ʒ *)
    T2{16_03AC, 462}, (* ά Ά *)
    T2{16_03CC, 436}, (* ό Ό *)
    T2{16_03D0, 438}, (* ϐ Β *)
    T2{16_03D1, 443}, (* ϑ Θ *)
    T2{16_03D5, 453}, (* ϕ Φ *)
    T2{16_03D6, 446}, (* ϖ Π *)
    T2{16_03E3, 499}, (* ϣ Ϣ *)
    T2{16_03E5, 499}, (* ϥ Ϥ *)
    T2{16_03E7, 499}, (* ϧ Ϧ *)
    T2{16_03E9, 499}, (* ϩ Ϩ *)
    T2{16_03EB, 499}, (* ϫ Ϫ *)
    T2{16_03ED, 499}, (* ϭ Ϭ *)
    T2{16_03EF, 499}, (* ϯ Ϯ *)
    T2{16_03F0, 414}, (* ϰ Κ *)
    T2{16_03F1, 420}, (* ϱ Ρ *)
    T2{16_0461, 499}, (* ѡ Ѡ *)
    T2{16_0463, 499}, (* ѣ Ѣ *)
    T2{16_0465, 499}, (* ѥ Ѥ *)
    T2{16_0467, 499}, (* ѧ Ѧ *)
    T2{16_0469, 499}, (* ѩ Ѩ *)
    T2{16_046B, 499}, (* ѫ Ѫ *)
    T2{16_046D, 499}, (* ѭ Ѭ *)
    T2{16_046F, 499}, (* ѯ Ѯ *)
    T2{16_0471, 499}, (* ѱ Ѱ *)
    T2{16_0473, 499}, (* ѳ Ѳ *)
    T2{16_0475, 499}, (* ѵ Ѵ *)
    T2{16_0477, 499}, (* ѷ Ѷ *)
    T2{16_0479, 499}, (* ѹ Ѹ *)
    T2{16_047B, 499}, (* ѻ Ѻ *)
    T2{16_047D, 499}, (* ѽ Ѽ *)
    T2{16_047F, 499}, (* ѿ Ѿ *)
    T2{16_0481, 499}, (* ҁ Ҁ *)
    T2{16_0491, 499}, (* ґ Ґ *)
    T2{16_0493, 499}, (* ғ Ғ *)
    T2{16_0495, 499}, (* ҕ Ҕ *)
    T2{16_0497, 499}, (* җ Җ *)
    T2{16_0499, 499}, (* ҙ Ҙ *)
    T2{16_049B, 499}, (* қ Қ *)
    T2{16_049D, 499}, (* ҝ Ҝ *)
    T2{16_049F, 499}, (* ҟ Ҟ *)
    T2{16_04A1, 499}, (* ҡ Ҡ *)
    T2{16_04A3, 499}, (* ң Ң *)
    T2{16_04A5, 499}, (* ҥ Ҥ *)
    T2{16_04A7, 499}, (* ҧ Ҧ *)
    T2{16_04A9, 499}, (* ҩ Ҩ *)
    T2{16_04AB, 499}, (* ҫ Ҫ *)
    T2{16_04AD, 499}, (* ҭ Ҭ *)
    T2{16_04AF, 499}, (* ү Ү *)
    T2{16_04B1, 499}, (* ұ Ұ *)
    T2{16_04B3, 499}, (* ҳ Ҳ *)
    T2{16_04B5, 499}, (* ҵ Ҵ *)
    T2{16_04B7, 499}, (* ҷ Ҷ *)
    T2{16_04B9, 499}, (* ҹ Ҹ *)
    T2{16_04BB, 499}, (* һ Һ *)
    T2{16_04BD, 499}, (* ҽ Ҽ *)
    T2{16_04BF, 499}, (* ҿ Ҿ *)
    T2{16_04C2, 499}, (* ӂ Ӂ *)
    T2{16_04C4, 499}, (* ӄ Ӄ *)
    T2{16_04C8, 499}, (* ӈ Ӈ *)
    T2{16_04CC, 499}, (* ӌ Ӌ *)
    T2{16_04D1, 499}, (* ӑ Ӑ *)
    T2{16_04D3, 499}, (* ӓ Ӓ *)
    T2{16_04D5, 499}, (* ӕ Ӕ *)
    T2{16_04D7, 499}, (* ӗ Ӗ *)
    T2{16_04D9, 499}, (* ә Ә *)
    T2{16_04DB, 499}, (* ӛ Ӛ *)
    T2{16_04DD, 499}, (* ӝ Ӝ *)
    T2{16_04DF, 499}, (* ӟ Ӟ *)
    T2{16_04E1, 499}, (* ӡ Ӡ *)
    T2{16_04E3, 499}, (* ӣ Ӣ *)
    T2{16_04E5, 499}, (* ӥ Ӥ *)
    T2{16_04E7, 499}, (* ӧ Ӧ *)
    T2{16_04E9, 499}, (* ө Ө *)
    T2{16_04EB, 499}, (* ӫ Ӫ *)
    T2{16_04EF, 499}, (* ӯ Ӯ *)
    T2{16_04F1, 499}, (* ӱ Ӱ *)
    T2{16_04F3, 499}, (* ӳ Ӳ *)
    T2{16_04F5, 499}, (* ӵ Ӵ *)
    T2{16_04F9, 499}, (* ӹ Ӹ *)
    T2{16_1E01, 499}, (* ḁ Ḁ *)
    T2{16_1E03, 499}, (* ḃ Ḃ *)
    T2{16_1E05, 499}, (* ḅ Ḅ *)
    T2{16_1E07, 499}, (* ḇ Ḇ *)
    T2{16_1E09, 499}, (* ḉ Ḉ *)
    T2{16_1E0B, 499}, (* ḋ Ḋ *)
    T2{16_1E0D, 499}, (* ḍ Ḍ *)
    T2{16_1E0F, 499}, (* ḏ Ḏ *)
    T2{16_1E11, 499}, (* ḑ Ḑ *)
    T2{16_1E13, 499}, (* ḓ Ḓ *)
    T2{16_1E15, 499}, (* ḕ Ḕ *)
    T2{16_1E17, 499}, (* ḗ Ḗ *)
    T2{16_1E19, 499}, (* ḙ Ḙ *)
    T2{16_1E1B, 499}, (* ḛ Ḛ *)
    T2{16_1E1D, 499}, (* ḝ Ḝ *)
    T2{16_1E1F, 499}, (* ḟ Ḟ *)
    T2{16_1E21, 499}, (* ḡ Ḡ *)
    T2{16_1E23, 499}, (* ḣ Ḣ *)
    T2{16_1E25, 499}, (* ḥ Ḥ *)
    T2{16_1E27, 499}, (* ḧ Ḧ *)
    T2{16_1E29, 499}, (* ḩ Ḩ *)
    T2{16_1E2B, 499}, (* ḫ Ḫ *)
    T2{16_1E2D, 499}, (* ḭ Ḭ *)
    T2{16_1E2F, 499}, (* ḯ Ḯ *)
    T2{16_1E31, 499}, (* ḱ Ḱ *)
    T2{16_1E33, 499}, (* ḳ Ḳ *)
    T2{16_1E35, 499}, (* ḵ Ḵ *)
    T2{16_1E37, 499}, (* ḷ Ḷ *)
    T2{16_1E39, 499}, (* ḹ Ḹ *)
    T2{16_1E3B, 499}, (* ḻ Ḻ *)
    T2{16_1E3D, 499}, (* ḽ Ḽ *)
    T2{16_1E3F, 499}, (* ḿ Ḿ *)
    T2{16_1E41, 499}, (* ṁ Ṁ *)
    T2{16_1E43, 499}, (* ṃ Ṃ *)
    T2{16_1E45, 499}, (* ṅ Ṅ *)
    T2{16_1E47, 499}, (* ṇ Ṇ *)
    T2{16_1E49, 499}, (* ṉ Ṉ *)
    T2{16_1E4B, 499}, (* ṋ Ṋ *)
    T2{16_1E4D, 499}, (* ṍ Ṍ *)
    T2{16_1E4F, 499}, (* ṏ Ṏ *)
    T2{16_1E51, 499}, (* ṑ Ṑ *)
    T2{16_1E53, 499}, (* ṓ Ṓ *)
    T2{16_1E55, 499}, (* ṕ Ṕ *)
    T2{16_1E57, 499}, (* ṗ Ṗ *)
    T2{16_1E59, 499}, (* ṙ Ṙ *)
    T2{16_1E5B, 499}, (* ṛ Ṛ *)
    T2{16_1E5D, 499}, (* ṝ Ṝ *)
    T2{16_1E5F, 499}, (* ṟ Ṟ *)
    T2{16_1E61, 499}, (* ṡ Ṡ *)
    T2{16_1E63, 499}, (* ṣ Ṣ *)
    T2{16_1E65, 499}, (* ṥ Ṥ *)
    T2{16_1E67, 499}, (* ṧ Ṧ *)
    T2{16_1E69, 499}, (* ṩ Ṩ *)
    T2{16_1E6B, 499}, (* ṫ Ṫ *)
    T2{16_1E6D, 499}, (* ṭ Ṭ *)
    T2{16_1E6F, 499}, (* ṯ Ṯ *)
    T2{16_1E71, 499}, (* ṱ Ṱ *)
    T2{16_1E73, 499}, (* ṳ Ṳ *)
    T2{16_1E75, 499}, (* ṵ Ṵ *)
    T2{16_1E77, 499}, (* ṷ Ṷ *)
    T2{16_1E79, 499}, (* ṹ Ṹ *)
    T2{16_1E7B, 499}, (* ṻ Ṻ *)
    T2{16_1E7D, 499}, (* ṽ Ṽ *)
    T2{16_1E7F, 499}, (* ṿ Ṿ *)
    T2{16_1E81, 499}, (* ẁ Ẁ *)
    T2{16_1E83, 499}, (* ẃ Ẃ *)
    T2{16_1E85, 499}, (* ẅ Ẅ *)
    T2{16_1E87, 499}, (* ẇ Ẇ *)
    T2{16_1E89, 499}, (* ẉ Ẉ *)
    T2{16_1E8B, 499}, (* ẋ Ẋ *)
    T2{16_1E8D, 499}, (* ẍ Ẍ *)
    T2{16_1E8F, 499}, (* ẏ Ẏ *)
    T2{16_1E91, 499}, (* ẑ Ẑ *)
    T2{16_1E93, 499}, (* ẓ Ẓ *)
    T2{16_1E95, 499}, (* ẕ Ẕ *)
    T2{16_1EA1, 499}, (* ạ Ạ *)
    T2{16_1EA3, 499}, (* ả Ả *)
    T2{16_1EA5, 499}, (* ấ Ấ *)
    T2{16_1EA7, 499}, (* ầ Ầ *)
    T2{16_1EA9, 499}, (* ẩ Ẩ *)
    T2{16_1EAB, 499}, (* ẫ Ẫ *)
    T2{16_1EAD, 499}, (* ậ Ậ *)
    T2{16_1EAF, 499}, (* ắ Ắ *)
    T2{16_1EB1, 499}, (* ằ Ằ *)
    T2{16_1EB3, 499}, (* ẳ Ẳ *)
    T2{16_1EB5, 499}, (* ẵ Ẵ *)
    T2{16_1EB7, 499}, (* ặ Ặ *)
    T2{16_1EB9, 499}, (* ẹ Ẹ *)
    T2{16_1EBB, 499}, (* ẻ Ẻ *)
    T2{16_1EBD, 499}, (* ẽ Ẽ *)
    T2{16_1EBF, 499}, (* ế Ế *)
    T2{16_1EC1, 499}, (* ề Ề *)
    T2{16_1EC3, 499}, (* ể Ể *)
    T2{16_1EC5, 499}, (* ễ Ễ *)
    T2{16_1EC7, 499}, (* ệ Ệ *)
    T2{16_1EC9, 499}, (* ỉ Ỉ *)
    T2{16_1ECB, 499}, (* ị Ị *)
    T2{16_1ECD, 499}, (* ọ Ọ *)
    T2{16_1ECF, 499}, (* ỏ Ỏ *)
    T2{16_1ED1, 499}, (* ố Ố *)
    T2{16_1ED3, 499}, (* ồ Ồ *)
    T2{16_1ED5, 499}, (* ổ Ổ *)
    T2{16_1ED7, 499}, (* ỗ Ỗ *)
    T2{16_1ED9, 499}, (* ộ Ộ *)
    T2{16_1EDB, 499}, (* ớ Ớ *)
    T2{16_1EDD, 499}, (* ờ Ờ *)
    T2{16_1EDF, 499}, (* ở Ở *)
    T2{16_1EE1, 499}, (* ỡ Ỡ *)
    T2{16_1EE3, 499}, (* ợ Ợ *)
    T2{16_1EE5, 499}, (* ụ Ụ *)
    T2{16_1EE7, 499}, (* ủ Ủ *)
    T2{16_1EE9, 499}, (* ứ Ứ *)
    T2{16_1EEB, 499}, (* ừ Ừ *)
    T2{16_1EED, 499}, (* ử Ử *)
    T2{16_1EEF, 499}, (* ữ Ữ *)
    T2{16_1EF1, 499}, (* ự Ự *)
    T2{16_1EF3, 499}, (* ỳ Ỳ *)
    T2{16_1EF5, 499}, (* ỵ Ỵ *)
    T2{16_1EF7, 499}, (* ỷ Ỷ *)
    T2{16_1EF9, 499}, (* ỹ Ỹ *)
    T2{16_1F51, 508}, (* ὑ Ὑ *)
    T2{16_1F53, 508}, (* ὓ Ὓ *)
    T2{16_1F55, 508}, (* ὕ Ὕ *)
    T2{16_1F57, 508}, (* ὗ Ὗ *)
    T2{16_1FB3, 509}, (* ᾳ ᾼ *)
    T2{16_1FC3, 509}, (* ῃ ῌ *)
    T2{16_1FE5, 507}, (* ῥ Ῥ *)
    T2{16_1FF3, 509}  (* ῳ ῼ *)
    };
---------------------------------------------------------------------------*} * Lower-case singletons that have title-case equivalents * (2nd col. conversion excess 500) {*---------------------------------------------------------------------------

totitle2 = ARRAY OF T2 {
    T2{16_01C4, 501}, (* DŽ Dž *)
    T2{16_01C6, 499}, (* dž Dž *)
    T2{16_01C7, 501}, (* LJ Lj *)
    T2{16_01C9, 499}, (* lj Lj *)
    T2{16_01CA, 501}, (* NJ Nj *)
    T2{16_01CC, 499}, (* nj Nj *)
    T2{16_01F1, 501}, (* DZ Dz *)
    T2{16_01F3, 499}  (* dz Dz *)
    };
===========================================================================*} * EXPORTED PROCEDURES {*===========================================================================

PROCEDURE IsDefined (t: T): BOOLEAN =
  BEGIN
    IF ORD (t) > 16_FFFD THEN RETURN FALSE END;
    IF ORD (t) < 16_D800 OR ORD (t) > 16_DFFF THEN RETURN TRUE END;
    RETURN FALSE;
  END IsDefined;

PROCEDURE IsASCII (t: T): BOOLEAN =
  BEGIN
    RETURN ORD (t) <= ORD (LAST (CHAR));
  END IsASCII;

PROCEDURE IsSpace (t: T): BOOLEAN =
  VAR p := BSearch (t, space2);
  BEGIN
    IF p >= 0 AND  space2[p, 0] <= ORD (t) AND ORD (t) <= space2[p, 1] THEN
      RETURN TRUE;
    END;
    RETURN FALSE;
  END IsSpace;

PROCEDURE IsLetter (t: T): BOOLEAN =
  VAR p: INTEGER;
  BEGIN
    IF IsUpperCase (t) OR IsLowerCase (t) THEN RETURN TRUE END;
    p := BSearch (t, alpha2);
    IF p >= 0 AND alpha2[p, 0] <= ORD (t) AND ORD (t) <= alpha2[p, 1] THEN
      RETURN TRUE;
    END;
    p := BSearch (t, alpha1);
    IF p >= 0 AND ORD (t) = alpha1[p, 0] THEN RETURN TRUE END;
    RETURN FALSE;
  END IsLetter;

PROCEDURE IsDigit (t: T): BOOLEAN =
  VAR p := BSearch (t, digit2);
  BEGIN
    IF p >= 0 AND digit2[p, 0] <= ORD (t) AND ORD (t) <= digit2[p, 1] THEN
      RETURN TRUE;
    END;
    RETURN FALSE;
  END IsDigit;

PROCEDURE IsLetterOrDigit (t: T): BOOLEAN =
  BEGIN
    RETURN IsLetter (t) OR IsDigit (t);
  END IsLetterOrDigit;

PROCEDURE IsUpperCase (t: T): BOOLEAN =
  VAR p: INTEGER;
  BEGIN
    p := BSearch (t, tolower3);
    IF p >= 0 AND tolower3[p, 0] <= ORD (t) AND ORD (t) <= tolower3[p, 1] THEN
      RETURN TRUE;
    END;
    p := BSearch (t, tolower2);
    IF p >= 0 AND tolower2[p, 0] = ORD (t) THEN RETURN TRUE END;
    RETURN FALSE;
  END IsUpperCase;

PROCEDURE IsLowerCase (t: T): BOOLEAN =
  VAR p: INTEGER;
  BEGIN
    p := BSearch (t, toupper3);
    IF p >= 0 AND toupper3[p, 0] <= ORD (t) AND ORD (t) <= toupper3[p, 1] THEN
      RETURN TRUE;
    END;
    p := BSearch (t, toupper2);
    IF p >= 0 AND toupper2[p, 0] = ORD (t) THEN RETURN TRUE END;
    RETURN FALSE;
  END IsLowerCase;

PROCEDURE IsTitleCase (t: T): BOOLEAN =
  BEGIN
    RETURN IsLowerCase (t) AND IsUpperCase (t);
  END IsTitleCase;

PROCEDURE ToUpperCase (t: T): T =
  VAR p: INTEGER;
  BEGIN
    p := BSearch (t, toupper3);
    IF p >= 0 AND toupper3[p, 0] <= ORD (t) AND ORD (t) <= toupper3[p, 1] THEN
      RETURN VAL (ORD (t) + toupper3[p, 2] - 500, T);
    END;
    p := BSearch (t, toupper2);
    IF p >= 0 AND ORD (t) = toupper2[p, 0] THEN
      RETURN VAL (ORD (t) + toupper2[p, 1] - 500, T);
    END;
    RETURN t;
  END ToUpperCase;

PROCEDURE ToLowerCase (t: T): T =
  VAR p := BSearch (t, tolower3);
  BEGIN
    IF p >= 0 AND tolower3[p, 0] <= ORD (t) AND ORD (t) <= tolower3[p, 1] THEN
      RETURN VAL (ORD (t) + tolower3[p, 2] - 500, T);
    END;
    p := BSearch (t, tolower2);
    IF p >= 0 AND tolower2[p, 0] = ORD (t) THEN
      RETURN VAL (ORD (t) + tolower2[p, 1] - 500, T);
    END;
    RETURN t;
  END ToLowerCase;

PROCEDURE ToTitleCase (t: T): T =
  VAR p := BSearch (t, totitle2);
  BEGIN
    IF p >= 0 AND totitle2[p, 0] = ORD (t) THEN
      RETURN VAL (ORD (t) + totitle2[p, 1] - 500, T);
    END;
    RETURN t;
  END ToTitleCase;

PROCEDURE ToDigitValue (t: T): CARDINAL =
  VAR p := BSearch (t, digit2);
  BEGIN
    IF p >= 0 AND digit2[p, 0] <= ORD (t) AND ORD (t) <= digit2[p, 1] THEN
      IF digit2[p, 0] = 16_0BE7 OR digit2[p, 0] = 16_1369 THEN
        (* Tamils and Ethiopians have no zero digit *)
        RETURN ORD (t) - digit2[p, 0] + 1;
      ELSE
        RETURN ORD (t) - digit2[p, 0];
      END;
    ELSE
      RETURN LAST (CARDINAL);
    END;
  END ToDigitValue;
===========================================================================*} * LOCAL PROCEDURES {*===========================================================================

---------------------------------------------------------------------------*} * BSearch - Binary Search of a Codepoint Range Table * Arguments: c - wide character * r - range tuple table index * n - nbr of tuple entries * Returns: ptr - Pointer to tuple or NIL {*---------------------------------------------------------------------------

PROCEDURE BSearch (c: T;  READONLY xr: ARRAY OF Tuple): INTEGER =
  VAR r := 0;
      n := NUMBER(xr);
      p, m: INTEGER;
  BEGIN
    WHILE n > 1 DO
      m := n DIV 2;
      p := r + m;
      IF ORD (c) >= xr[p, 0] THEN
        r := p;
        n := n - m;
      ELSE
        n := m;
      END;
    END;
    IF n > 0 AND ORD (c) >= xr[r, 0] THEN RETURN r END;
    RETURN -1;
  END BSearch;

BEGIN
END Unicode.
vi: set ai sw=2 ts=2 tw=80:


interface Unicode is in: