URI:
       trunetype.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       trunetype.c (30456B)
       ---
            1 /*
            2  * The authors of this software are Rob Pike and Ken Thompson.
            3  *              Copyright (c) 2002 by Lucent Technologies.
            4  * Permission to use, copy, modify, and distribute this software for any
            5  * purpose without fee is hereby granted, provided that this entire notice
            6  * is included in all copies of any software which is or includes a copy
            7  * or modification of this software and in all copies of the supporting
            8  * documentation for such software.
            9  * THIS SOFTWARE IS BEING PROVIDED "AS IS", WITHOUT ANY EXPRESS OR IMPLIED
           10  * WARRANTY.  IN PARTICULAR, NEITHER THE AUTHORS NOR LUCENT TECHNOLOGIES MAKE
           11  * ANY REPRESENTATION OR WARRANTY OF ANY KIND CONCERNING THE MERCHANTABILITY
           12  * OF THIS SOFTWARE OR ITS FITNESS FOR ANY PARTICULAR PURPOSE.
           13  */
           14 #include <stdarg.h>
           15 #include <string.h>
           16 #include "plan9.h"
           17 #include "utf.h"
           18 
           19 /*
           20  * alpha ranges -
           21  *        only covers ranges not in lower||upper
           22  */
           23 static
           24 Rune        __alpha2[] =
           25 {
           26         0x00d8,        0x00f6,        /* Ø - ö */
           27         0x00f8,        0x01f5,        /* ø - ǵ */
           28         0x0250,        0x02a8,        /* ɐ - ʨ */
           29         0x038e,        0x03a1,        /* Ύ - Ρ */
           30         0x03a3,        0x03ce,        /* Σ - ώ */
           31         0x03d0,        0x03d6,        /* ϐ - ϖ */
           32         0x03e2,        0x03f3,        /* Ϣ - ϳ */
           33         0x0490,        0x04c4,        /* Ґ - ӄ */
           34         0x0561,        0x0587,        /* ա - և */
           35         0x05d0,        0x05ea,        /* א - ת */
           36         0x05f0,        0x05f2,        /* װ - ײ */
           37         0x0621,        0x063a,        /* ء - غ */
           38         0x0640,        0x064a,        /* ـ - ي */
           39         0x0671,        0x06b7,        /* ٱ - ڷ */
           40         0x06ba,        0x06be,        /* ں - ھ */
           41         0x06c0,        0x06ce,        /* ۀ - ێ */
           42         0x06d0,        0x06d3,        /* ې - ۓ */
           43         0x0905,        0x0939,        /* अ - ह */
           44         0x0958,        0x0961,        /* क़ - ॡ */
           45         0x0985,        0x098c,        /* অ - ঌ */
           46         0x098f,        0x0990,        /* এ - ঐ */
           47         0x0993,        0x09a8,        /* ও - ন */
           48         0x09aa,        0x09b0,        /* প - র */
           49         0x09b6,        0x09b9,        /* শ - হ */
           50         0x09dc,        0x09dd,        /* ড় - ঢ় */
           51         0x09df,        0x09e1,        /* য় - ৡ */
           52         0x09f0,        0x09f1,        /* ৰ - ৱ */
           53         0x0a05,        0x0a0a,        /* ਅ - ਊ */
           54         0x0a0f,        0x0a10,        /* ਏ - ਐ */
           55         0x0a13,        0x0a28,        /* ਓ - ਨ */
           56         0x0a2a,        0x0a30,        /* ਪ - ਰ */
           57         0x0a32,        0x0a33,        /* ਲ - ਲ਼ */
           58         0x0a35,        0x0a36,        /* ਵ - ਸ਼ */
           59         0x0a38,        0x0a39,        /* ਸ - ਹ */
           60         0x0a59,        0x0a5c,        /* ਖ਼ - ੜ */
           61         0x0a85,        0x0a8b,        /* અ - ઋ */
           62         0x0a8f,        0x0a91,        /* એ - ઑ */
           63         0x0a93,        0x0aa8,        /* ઓ - ન */
           64         0x0aaa,        0x0ab0,        /* પ - ર */
           65         0x0ab2,        0x0ab3,        /* લ - ળ */
           66         0x0ab5,        0x0ab9,        /* વ - હ */
           67         0x0b05,        0x0b0c,        /* ଅ - ଌ */
           68         0x0b0f,        0x0b10,        /* ଏ - ଐ */
           69         0x0b13,        0x0b28,        /* ଓ - ନ */
           70         0x0b2a,        0x0b30,        /* ପ - ର */
           71         0x0b32,        0x0b33,        /* ଲ - ଳ */
           72         0x0b36,        0x0b39,        /* ଶ - ହ */
           73         0x0b5c,        0x0b5d,        /* ଡ଼ - ଢ଼ */
           74         0x0b5f,        0x0b61,        /* ୟ - ୡ */
           75         0x0b85,        0x0b8a,        /* அ - ஊ */
           76         0x0b8e,        0x0b90,        /* எ - ஐ */
           77         0x0b92,        0x0b95,        /* ஒ - க */
           78         0x0b99,        0x0b9a,        /* ங - ச */
           79         0x0b9e,        0x0b9f,        /* ஞ - ட */
           80         0x0ba3,        0x0ba4,        /* ண - த */
           81         0x0ba8,        0x0baa,        /* ந - ப */
           82         0x0bae,        0x0bb5,        /* ம - வ */
           83         0x0bb7,        0x0bb9,        /* ஷ - ஹ */
           84         0x0c05,        0x0c0c,        /* అ - ఌ */
           85         0x0c0e,        0x0c10,        /* ఎ - ఐ */
           86         0x0c12,        0x0c28,        /* ఒ - న */
           87         0x0c2a,        0x0c33,        /* ప - ళ */
           88         0x0c35,        0x0c39,        /* వ - హ */
           89         0x0c60,        0x0c61,        /* ౠ - ౡ */
           90         0x0c85,        0x0c8c,        /* ಅ - ಌ */
           91         0x0c8e,        0x0c90,        /* ಎ - ಐ */
           92         0x0c92,        0x0ca8,        /* ಒ - ನ */
           93         0x0caa,        0x0cb3,        /* ಪ - ಳ */
           94         0x0cb5,        0x0cb9,        /* ವ - ಹ */
           95         0x0ce0,        0x0ce1,        /* ೠ - ೡ */
           96         0x0d05,        0x0d0c,        /* അ - ഌ */
           97         0x0d0e,        0x0d10,        /* എ - ഐ */
           98         0x0d12,        0x0d28,        /* ഒ - ന */
           99         0x0d2a,        0x0d39,        /* പ - ഹ */
          100         0x0d60,        0x0d61,        /* ൠ - ൡ */
          101         0x0e01,        0x0e30,        /* ก - ะ */
          102         0x0e32,        0x0e33,        /* า - ำ */
          103         0x0e40,        0x0e46,        /* เ - ๆ */
          104         0x0e5a,        0x0e5b,        /* ๚ - ๛ */
          105         0x0e81,        0x0e82,        /* ກ - ຂ */
          106         0x0e87,        0x0e88,        /* ງ - ຈ */
          107         0x0e94,        0x0e97,        /* ດ - ທ */
          108         0x0e99,        0x0e9f,        /* ນ - ຟ */
          109         0x0ea1,        0x0ea3,        /* ມ - ຣ */
          110         0x0eaa,        0x0eab,        /* ສ - ຫ */
          111         0x0ead,        0x0eae,        /* ອ - ຮ */
          112         0x0eb2,        0x0eb3,        /* າ - ຳ */
          113         0x0ec0,        0x0ec4,        /* ເ - ໄ */
          114         0x0edc,        0x0edd,        /* ໜ - ໝ */
          115         0x0f18,        0x0f19,        /* ༘ - ༙ */
          116         0x0f40,        0x0f47,        /* ཀ - ཇ */
          117         0x0f49,        0x0f69,        /* ཉ - ཀྵ */
          118         0x10d0,        0x10f6,        /* ა - ჶ */
          119         0x1100,        0x1159,        /* ᄀ - ᅙ */
          120         0x115f,        0x11a2,        /* ᅟ - ᆢ */
          121         0x11a8,        0x11f9,        /* ᆨ - ᇹ */
          122         0x1e00,        0x1e9b,        /* Ḁ - ẛ */
          123         0x1f50,        0x1f57,        /* ὐ - ὗ */
          124         0x1f80,        0x1fb4,        /* ᾀ - ᾴ */
          125         0x1fb6,        0x1fbc,        /* ᾶ - ᾼ */
          126         0x1fc2,        0x1fc4,        /* ῂ - ῄ */
          127         0x1fc6,        0x1fcc,        /* ῆ - ῌ */
          128         0x1fd0,        0x1fd3,        /* ῐ - ΐ */
          129         0x1fd6,        0x1fdb,        /* ῖ - Ί */
          130         0x1fe0,        0x1fec,        /* ῠ - Ῥ */
          131         0x1ff2,        0x1ff4,        /* ῲ - ῴ */
          132         0x1ff6,        0x1ffc,        /* ῶ - ῼ */
          133         0x210a,        0x2113,        /* ℊ - ℓ */
          134         0x2115,        0x211d,        /* ℕ - ℝ */
          135         0x2120,        0x2122,        /* ℠ - ™ */
          136         0x212a,        0x2131,        /* K - ℱ */
          137         0x2133,        0x2138,        /* ℳ - ℸ */
          138         0x3041,        0x3094,        /* ぁ - ゔ */
          139         0x30a1,        0x30fa,        /* ァ - ヺ */
          140         0x3105,        0x312c,        /* ㄅ - ㄬ */
          141         0x3131,        0x318e,        /* ㄱ - ㆎ */
          142         0x3192,        0x319f,        /* ㆒ - ㆟ */
          143         0x3260,        0x327b,        /* ㉠ - ㉻ */
          144         0x328a,        0x32b0,        /* ㊊ - ㊰ */
          145         0x32d0,        0x32fe,        /* ㋐ - ㋾ */
          146         0x3300,        0x3357,        /* ㌀ - ㍗ */
          147         0x3371,        0x3376,        /* ㍱ - ㍶ */
          148         0x337b,        0x3394,        /* ㍻ - ㎔ */
          149         0x3399,        0x339e,        /* ㎙ - ㎞ */
          150         0x33a9,        0x33ad,        /* ㎩ - ㎭ */
          151         0x33b0,        0x33c1,        /* ㎰ - ㏁ */
          152         0x33c3,        0x33c5,        /* ㏃ - ㏅ */
          153         0x33c7,        0x33d7,        /* ㏇ - ㏗ */
          154         0x33d9,        0x33dd,        /* ㏙ - ㏝ */
          155         0x4e00,        0x9fff,        /* 一 - 鿿 */
          156         0xac00,        0xd7a3,        /* 가 - 힣 */
          157         0xf900,        0xfb06,        /* 豈 - st */
          158         0xfb13,        0xfb17,        /* ﬓ - ﬗ */
          159         0xfb1f,        0xfb28,        /* ײַ - ﬨ */
          160         0xfb2a,        0xfb36,        /* שׁ - זּ */
          161         0xfb38,        0xfb3c,        /* טּ - לּ */
          162         0xfb40,        0xfb41,        /* נּ - סּ */
          163         0xfb43,        0xfb44,        /* ףּ - פּ */
          164         0xfb46,        0xfbb1,        /* צּ - ﮱ */
          165         0xfbd3,        0xfd3d,        /* ﯓ - ﴽ */
          166         0xfd50,        0xfd8f,        /* ﵐ - ﶏ */
          167         0xfd92,        0xfdc7,        /* ﶒ - ﷇ */
          168         0xfdf0,        0xfdf9,        /* ﷰ - ﷹ */
          169         0xfe70,        0xfe72,        /* ﹰ - ﹲ */
          170         0xfe76,        0xfefc,        /* ﹶ - ﻼ */
          171         0xff66,        0xff6f,        /* ヲ - ッ */
          172         0xff71,        0xff9d,        /* ア - ン */
          173         0xffa0,        0xffbe,        /* ᅠ - ᄒ */
          174         0xffc2,        0xffc7,        /* ᅡ - ᅦ */
          175         0xffca,        0xffcf,        /* ᅧ - ᅬ */
          176         0xffd2,        0xffd7,        /* ᅭ - ᅲ */
          177         0xffda,        0xffdc,        /* ᅳ - ᅵ */
          178 };
          179 
          180 /*
          181  * alpha singlets -
          182  *        only covers ranges not in lower||upper
          183  */
          184 static
          185 Rune        __alpha1[] =
          186 {
          187         0x00aa,        /* ª */
          188         0x00b5,        /* µ */
          189         0x00ba,        /* º */
          190         0x03da,        /* Ϛ */
          191         0x03dc,        /* Ϝ */
          192         0x03de,        /* Ϟ */
          193         0x03e0,        /* Ϡ */
          194         0x06d5,        /* ە */
          195         0x09b2,        /* ল */
          196         0x0a5e,        /* ਫ਼ */
          197         0x0a8d,        /* ઍ */
          198         0x0ae0,        /* ૠ */
          199         0x0b9c,        /* ஜ */
          200         0x0cde,        /* ೞ */
          201         0x0e4f,        /* ๏ */
          202         0x0e84,        /* ຄ */
          203         0x0e8a,        /* ຊ */
          204         0x0e8d,        /* ຍ */
          205         0x0ea5,        /* ລ */
          206         0x0ea7,        /* ວ */
          207         0x0eb0,        /* ະ */
          208         0x0ebd,        /* ຽ */
          209         0x1fbe,        /* ι */
          210         0x207f,        /* ⁿ */
          211         0x20a8,        /* ₨ */
          212         0x2102,        /* ℂ */
          213         0x2107,        /* ℇ */
          214         0x2124,        /* ℤ */
          215         0x2126,        /* Ω */
          216         0x2128,        /* ℨ */
          217         0xfb3e,        /* מּ */
          218         0xfe74,        /* ﹴ */
          219 };
          220 
          221 /*
          222  * space ranges
          223  */
          224 static
          225 Rune        __space2[] =
          226 {
          227         0x0009,        0x000a,        /* tab and newline */
          228         0x0020,        0x0020,        /* space */
          229         0x00a0,        0x00a0,        /*   */
          230         0x2000,        0x200b,        /*   - ​ */
          231         0x2028,        0x2029,        /* 
 - 
 */
          232         0x3000,        0x3000,        /*   */
          233         0xfeff,        0xfeff,        /*  */
          234 };
          235 
          236 /*
          237  * lower case ranges
          238  *        3rd col is conversion excess 500
          239  */
          240 static
          241 Rune        __toupper2[] =
          242 {
          243         0x0061,        0x007a, 468,        /* a-z A-Z */
          244         0x00e0,        0x00f6, 468,        /* à-ö À-Ö */
          245         0x00f8,        0x00fe, 468,        /* ø-þ Ø-Þ */
          246         0x0256,        0x0257, 295,        /* ɖ-ɗ Ɖ-Ɗ */
          247         0x0258,        0x0259, 298,        /* ɘ-ə Ǝ-Ə */
          248         0x028a,        0x028b, 283,        /* ʊ-ʋ Ʊ-Ʋ */
          249         0x03ad,        0x03af, 463,        /* έ-ί Έ-Ί */
          250         0x03b1,        0x03c1, 468,        /* α-ρ Α-Ρ */
          251         0x03c3,        0x03cb, 468,        /* σ-ϋ Σ-Ϋ */
          252         0x03cd,        0x03ce, 437,        /* ύ-ώ Ύ-Ώ */
          253         0x0430,        0x044f, 468,        /* а-я А-Я */
          254         0x0451,        0x045c, 420,        /* ё-ќ Ё-Ќ */
          255         0x045e,        0x045f, 420,        /* ў-џ Ў-Џ */
          256         0x0561,        0x0586, 452,        /* ա-ֆ Ա-Ֆ */
          257         0x1f00,        0x1f07, 508,        /* ἀ-ἇ Ἀ-Ἇ */
          258         0x1f10,        0x1f15, 508,        /* ἐ-ἕ Ἐ-Ἕ */
          259         0x1f20,        0x1f27, 508,        /* ἠ-ἧ Ἠ-Ἧ */
          260         0x1f30,        0x1f37, 508,        /* ἰ-ἷ Ἰ-Ἷ */
          261         0x1f40,        0x1f45, 508,        /* ὀ-ὅ Ὀ-Ὅ */
          262         0x1f60,        0x1f67, 508,        /* ὠ-ὧ Ὠ-Ὧ */
          263         0x1f70,        0x1f71, 574,        /* ὰ-ά Ὰ-Ά */
          264         0x1f72,        0x1f75, 586,        /* ὲ-ή Ὲ-Ή */
          265         0x1f76,        0x1f77, 600,        /* ὶ-ί Ὶ-Ί */
          266         0x1f78,        0x1f79, 628,        /* ὸ-ό Ὸ-Ό */
          267         0x1f7a,        0x1f7b, 612,        /* ὺ-ύ Ὺ-Ύ */
          268         0x1f7c,        0x1f7d, 626,        /* ὼ-ώ Ὼ-Ώ */
          269         0x1f80,        0x1f87, 508,        /* ᾀ-ᾇ ᾈ-ᾏ */
          270         0x1f90,        0x1f97, 508,        /* ᾐ-ᾗ ᾘ-ᾟ */
          271         0x1fa0,        0x1fa7, 508,        /* ᾠ-ᾧ ᾨ-ᾯ */
          272         0x1fb0,        0x1fb1, 508,        /* ᾰ-ᾱ Ᾰ-Ᾱ */
          273         0x1fd0,        0x1fd1, 508,        /* ῐ-ῑ Ῐ-Ῑ */
          274         0x1fe0,        0x1fe1, 508,        /* ῠ-ῡ Ῠ-Ῡ */
          275         0x2170,        0x217f, 484,        /* ⅰ-ⅿ Ⅰ-Ⅿ */
          276         0x24d0,        0x24e9, 474,        /* ⓐ-ⓩ Ⓐ-Ⓩ */
          277         0xff41,        0xff5a, 468,        /* a-z A-Z */
          278 };
          279 
          280 /*
          281  * lower case singlets
          282  *        2nd col is conversion excess 500
          283  */
          284 static
          285 Rune        __toupper1[] =
          286 {
          287         0x00ff, 621,        /* ÿ Ÿ */
          288         0x0101, 499,        /* ā Ā */
          289         0x0103, 499,        /* ă Ă */
          290         0x0105, 499,        /* ą Ą */
          291         0x0107, 499,        /* ć Ć */
          292         0x0109, 499,        /* ĉ Ĉ */
          293         0x010b, 499,        /* ċ Ċ */
          294         0x010d, 499,        /* č Č */
          295         0x010f, 499,        /* ď Ď */
          296         0x0111, 499,        /* đ Đ */
          297         0x0113, 499,        /* ē Ē */
          298         0x0115, 499,        /* ĕ Ĕ */
          299         0x0117, 499,        /* ė Ė */
          300         0x0119, 499,        /* ę Ę */
          301         0x011b, 499,        /* ě Ě */
          302         0x011d, 499,        /* ĝ Ĝ */
          303         0x011f, 499,        /* ğ Ğ */
          304         0x0121, 499,        /* ġ Ġ */
          305         0x0123, 499,        /* ģ Ģ */
          306         0x0125, 499,        /* ĥ Ĥ */
          307         0x0127, 499,        /* ħ Ħ */
          308         0x0129, 499,        /* ĩ Ĩ */
          309         0x012b, 499,        /* ī Ī */
          310         0x012d, 499,        /* ĭ Ĭ */
          311         0x012f, 499,        /* į Į */
          312         0x0131, 268,        /* ı I */
          313         0x0133, 499,        /* ij IJ */
          314         0x0135, 499,        /* ĵ Ĵ */
          315         0x0137, 499,        /* ķ Ķ */
          316         0x013a, 499,        /* ĺ Ĺ */
          317         0x013c, 499,        /* ļ Ļ */
          318         0x013e, 499,        /* ľ Ľ */
          319         0x0140, 499,        /* ŀ Ŀ */
          320         0x0142, 499,        /* ł Ł */
          321         0x0144, 499,        /* ń Ń */
          322         0x0146, 499,        /* ņ Ņ */
          323         0x0148, 499,        /* ň Ň */
          324         0x014b, 499,        /* ŋ Ŋ */
          325         0x014d, 499,        /* ō Ō */
          326         0x014f, 499,        /* ŏ Ŏ */
          327         0x0151, 499,        /* ő Ő */
          328         0x0153, 499,        /* œ Œ */
          329         0x0155, 499,        /* ŕ Ŕ */
          330         0x0157, 499,        /* ŗ Ŗ */
          331         0x0159, 499,        /* ř Ř */
          332         0x015b, 499,        /* ś Ś */
          333         0x015d, 499,        /* ŝ Ŝ */
          334         0x015f, 499,        /* ş Ş */
          335         0x0161, 499,        /* š Š */
          336         0x0163, 499,        /* ţ Ţ */
          337         0x0165, 499,        /* ť Ť */
          338         0x0167, 499,        /* ŧ Ŧ */
          339         0x0169, 499,        /* ũ Ũ */
          340         0x016b, 499,        /* ū Ū */
          341         0x016d, 499,        /* ŭ Ŭ */
          342         0x016f, 499,        /* ů Ů */
          343         0x0171, 499,        /* ű Ű */
          344         0x0173, 499,        /* ų Ų */
          345         0x0175, 499,        /* ŵ Ŵ */
          346         0x0177, 499,        /* ŷ Ŷ */
          347         0x017a, 499,        /* ź Ź */
          348         0x017c, 499,        /* ż Ż */
          349         0x017e, 499,        /* ž Ž */
          350         0x017f, 200,        /* ſ S */
          351         0x0183, 499,        /* ƃ Ƃ */
          352         0x0185, 499,        /* ƅ Ƅ */
          353         0x0188, 499,        /* ƈ Ƈ */
          354         0x018c, 499,        /* ƌ Ƌ */
          355         0x0192, 499,        /* ƒ Ƒ */
          356         0x0199, 499,        /* ƙ Ƙ */
          357         0x01a1, 499,        /* ơ Ơ */
          358         0x01a3, 499,        /* ƣ Ƣ */
          359         0x01a5, 499,        /* ƥ Ƥ */
          360         0x01a8, 499,        /* ƨ Ƨ */
          361         0x01ad, 499,        /* ƭ Ƭ */
          362         0x01b0, 499,        /* ư Ư */
          363         0x01b4, 499,        /* ƴ Ƴ */
          364         0x01b6, 499,        /* ƶ Ƶ */
          365         0x01b9, 499,        /* ƹ Ƹ */
          366         0x01bd, 499,        /* ƽ Ƽ */
          367         0x01c5, 499,        /* Dž DŽ */
          368         0x01c6, 498,        /* dž DŽ */
          369         0x01c8, 499,        /* Lj LJ */
          370         0x01c9, 498,        /* lj LJ */
          371         0x01cb, 499,        /* Nj NJ */
          372         0x01cc, 498,        /* nj NJ */
          373         0x01ce, 499,        /* ǎ Ǎ */
          374         0x01d0, 499,        /* ǐ Ǐ */
          375         0x01d2, 499,        /* ǒ Ǒ */
          376         0x01d4, 499,        /* ǔ Ǔ */
          377         0x01d6, 499,        /* ǖ Ǖ */
          378         0x01d8, 499,        /* ǘ Ǘ */
          379         0x01da, 499,        /* ǚ Ǚ */
          380         0x01dc, 499,        /* ǜ Ǜ */
          381         0x01df, 499,        /* ǟ Ǟ */
          382         0x01e1, 499,        /* ǡ Ǡ */
          383         0x01e3, 499,        /* ǣ Ǣ */
          384         0x01e5, 499,        /* ǥ Ǥ */
          385         0x01e7, 499,        /* ǧ Ǧ */
          386         0x01e9, 499,        /* ǩ Ǩ */
          387         0x01eb, 499,        /* ǫ Ǫ */
          388         0x01ed, 499,        /* ǭ Ǭ */
          389         0x01ef, 499,        /* ǯ Ǯ */
          390         0x01f2, 499,        /* Dz DZ */
          391         0x01f3, 498,        /* dz DZ */
          392         0x01f5, 499,        /* ǵ Ǵ */
          393         0x01fb, 499,        /* ǻ Ǻ */
          394         0x01fd, 499,        /* ǽ Ǽ */
          395         0x01ff, 499,        /* ǿ Ǿ */
          396         0x0201, 499,        /* ȁ Ȁ */
          397         0x0203, 499,        /* ȃ Ȃ */
          398         0x0205, 499,        /* ȅ Ȅ */
          399         0x0207, 499,        /* ȇ Ȇ */
          400         0x0209, 499,        /* ȉ Ȉ */
          401         0x020b, 499,        /* ȋ Ȋ */
          402         0x020d, 499,        /* ȍ Ȍ */
          403         0x020f, 499,        /* ȏ Ȏ */
          404         0x0211, 499,        /* ȑ Ȑ */
          405         0x0213, 499,        /* ȓ Ȓ */
          406         0x0215, 499,        /* ȕ Ȕ */
          407         0x0217, 499,        /* ȗ Ȗ */
          408         0x0253, 290,        /* ɓ Ɓ */
          409         0x0254, 294,        /* ɔ Ɔ */
          410         0x025b, 297,        /* ɛ Ɛ */
          411         0x0260, 295,        /* ɠ Ɠ */
          412         0x0263, 293,        /* ɣ Ɣ */
          413         0x0268, 291,        /* ɨ Ɨ */
          414         0x0269, 289,        /* ɩ Ɩ */
          415         0x026f, 289,        /* ɯ Ɯ */
          416         0x0272, 287,        /* ɲ Ɲ */
          417         0x0283, 282,        /* ʃ Ʃ */
          418         0x0288, 282,        /* ʈ Ʈ */
          419         0x0292, 281,        /* ʒ Ʒ */
          420         0x03ac, 462,        /* ά Ά */
          421         0x03cc, 436,        /* ό Ό */
          422         0x03d0, 438,        /* ϐ Β */
          423         0x03d1, 443,        /* ϑ Θ */
          424         0x03d5, 453,        /* ϕ Φ */
          425         0x03d6, 446,        /* ϖ Π */
          426         0x03e3, 499,        /* ϣ Ϣ */
          427         0x03e5, 499,        /* ϥ Ϥ */
          428         0x03e7, 499,        /* ϧ Ϧ */
          429         0x03e9, 499,        /* ϩ Ϩ */
          430         0x03eb, 499,        /* ϫ Ϫ */
          431         0x03ed, 499,        /* ϭ Ϭ */
          432         0x03ef, 499,        /* ϯ Ϯ */
          433         0x03f0, 414,        /* ϰ Κ */
          434         0x03f1, 420,        /* ϱ Ρ */
          435         0x0461, 499,        /* ѡ Ѡ */
          436         0x0463, 499,        /* ѣ Ѣ */
          437         0x0465, 499,        /* ѥ Ѥ */
          438         0x0467, 499,        /* ѧ Ѧ */
          439         0x0469, 499,        /* ѩ Ѩ */
          440         0x046b, 499,        /* ѫ Ѫ */
          441         0x046d, 499,        /* ѭ Ѭ */
          442         0x046f, 499,        /* ѯ Ѯ */
          443         0x0471, 499,        /* ѱ Ѱ */
          444         0x0473, 499,        /* ѳ Ѳ */
          445         0x0475, 499,        /* ѵ Ѵ */
          446         0x0477, 499,        /* ѷ Ѷ */
          447         0x0479, 499,        /* ѹ Ѹ */
          448         0x047b, 499,        /* ѻ Ѻ */
          449         0x047d, 499,        /* ѽ Ѽ */
          450         0x047f, 499,        /* ѿ Ѿ */
          451         0x0481, 499,        /* ҁ Ҁ */
          452         0x0491, 499,        /* ґ Ґ */
          453         0x0493, 499,        /* ғ Ғ */
          454         0x0495, 499,        /* ҕ Ҕ */
          455         0x0497, 499,        /* җ Җ */
          456         0x0499, 499,        /* ҙ Ҙ */
          457         0x049b, 499,        /* қ Қ */
          458         0x049d, 499,        /* ҝ Ҝ */
          459         0x049f, 499,        /* ҟ Ҟ */
          460         0x04a1, 499,        /* ҡ Ҡ */
          461         0x04a3, 499,        /* ң Ң */
          462         0x04a5, 499,        /* ҥ Ҥ */
          463         0x04a7, 499,        /* ҧ Ҧ */
          464         0x04a9, 499,        /* ҩ Ҩ */
          465         0x04ab, 499,        /* ҫ Ҫ */
          466         0x04ad, 499,        /* ҭ Ҭ */
          467         0x04af, 499,        /* ү Ү */
          468         0x04b1, 499,        /* ұ Ұ */
          469         0x04b3, 499,        /* ҳ Ҳ */
          470         0x04b5, 499,        /* ҵ Ҵ */
          471         0x04b7, 499,        /* ҷ Ҷ */
          472         0x04b9, 499,        /* ҹ Ҹ */
          473         0x04bb, 499,        /* һ Һ */
          474         0x04bd, 499,        /* ҽ Ҽ */
          475         0x04bf, 499,        /* ҿ Ҿ */
          476         0x04c2, 499,        /* ӂ Ӂ */
          477         0x04c4, 499,        /* ӄ Ӄ */
          478         0x04c8, 499,        /* ӈ Ӈ */
          479         0x04cc, 499,        /* ӌ Ӌ */
          480         0x04d1, 499,        /* ӑ Ӑ */
          481         0x04d3, 499,        /* ӓ Ӓ */
          482         0x04d5, 499,        /* ӕ Ӕ */
          483         0x04d7, 499,        /* ӗ Ӗ */
          484         0x04d9, 499,        /* ә Ә */
          485         0x04db, 499,        /* ӛ Ӛ */
          486         0x04dd, 499,        /* ӝ Ӝ */
          487         0x04df, 499,        /* ӟ Ӟ */
          488         0x04e1, 499,        /* ӡ Ӡ */
          489         0x04e3, 499,        /* ӣ Ӣ */
          490         0x04e5, 499,        /* ӥ Ӥ */
          491         0x04e7, 499,        /* ӧ Ӧ */
          492         0x04e9, 499,        /* ө Ө */
          493         0x04eb, 499,        /* ӫ Ӫ */
          494         0x04ef, 499,        /* ӯ Ӯ */
          495         0x04f1, 499,        /* ӱ Ӱ */
          496         0x04f3, 499,        /* ӳ Ӳ */
          497         0x04f5, 499,        /* ӵ Ӵ */
          498         0x04f9, 499,        /* ӹ Ӹ */
          499         0x1e01, 499,        /* ḁ Ḁ */
          500         0x1e03, 499,        /* ḃ Ḃ */
          501         0x1e05, 499,        /* ḅ Ḅ */
          502         0x1e07, 499,        /* ḇ Ḇ */
          503         0x1e09, 499,        /* ḉ Ḉ */
          504         0x1e0b, 499,        /* ḋ Ḋ */
          505         0x1e0d, 499,        /* ḍ Ḍ */
          506         0x1e0f, 499,        /* ḏ Ḏ */
          507         0x1e11, 499,        /* ḑ Ḑ */
          508         0x1e13, 499,        /* ḓ Ḓ */
          509         0x1e15, 499,        /* ḕ Ḕ */
          510         0x1e17, 499,        /* ḗ Ḗ */
          511         0x1e19, 499,        /* ḙ Ḙ */
          512         0x1e1b, 499,        /* ḛ Ḛ */
          513         0x1e1d, 499,        /* ḝ Ḝ */
          514         0x1e1f, 499,        /* ḟ Ḟ */
          515         0x1e21, 499,        /* ḡ Ḡ */
          516         0x1e23, 499,        /* ḣ Ḣ */
          517         0x1e25, 499,        /* ḥ Ḥ */
          518         0x1e27, 499,        /* ḧ Ḧ */
          519         0x1e29, 499,        /* ḩ Ḩ */
          520         0x1e2b, 499,        /* ḫ Ḫ */
          521         0x1e2d, 499,        /* ḭ Ḭ */
          522         0x1e2f, 499,        /* ḯ Ḯ */
          523         0x1e31, 499,        /* ḱ Ḱ */
          524         0x1e33, 499,        /* ḳ Ḳ */
          525         0x1e35, 499,        /* ḵ Ḵ */
          526         0x1e37, 499,        /* ḷ Ḷ */
          527         0x1e39, 499,        /* ḹ Ḹ */
          528         0x1e3b, 499,        /* ḻ Ḻ */
          529         0x1e3d, 499,        /* ḽ Ḽ */
          530         0x1e3f, 499,        /* ḿ Ḿ */
          531         0x1e41, 499,        /* ṁ Ṁ */
          532         0x1e43, 499,        /* ṃ Ṃ */
          533         0x1e45, 499,        /* ṅ Ṅ */
          534         0x1e47, 499,        /* ṇ Ṇ */
          535         0x1e49, 499,        /* ṉ Ṉ */
          536         0x1e4b, 499,        /* ṋ Ṋ */
          537         0x1e4d, 499,        /* ṍ Ṍ */
          538         0x1e4f, 499,        /* ṏ Ṏ */
          539         0x1e51, 499,        /* ṑ Ṑ */
          540         0x1e53, 499,        /* ṓ Ṓ */
          541         0x1e55, 499,        /* ṕ Ṕ */
          542         0x1e57, 499,        /* ṗ Ṗ */
          543         0x1e59, 499,        /* ṙ Ṙ */
          544         0x1e5b, 499,        /* ṛ Ṛ */
          545         0x1e5d, 499,        /* ṝ Ṝ */
          546         0x1e5f, 499,        /* ṟ Ṟ */
          547         0x1e61, 499,        /* ṡ Ṡ */
          548         0x1e63, 499,        /* ṣ Ṣ */
          549         0x1e65, 499,        /* ṥ Ṥ */
          550         0x1e67, 499,        /* ṧ Ṧ */
          551         0x1e69, 499,        /* ṩ Ṩ */
          552         0x1e6b, 499,        /* ṫ Ṫ */
          553         0x1e6d, 499,        /* ṭ Ṭ */
          554         0x1e6f, 499,        /* ṯ Ṯ */
          555         0x1e71, 499,        /* ṱ Ṱ */
          556         0x1e73, 499,        /* ṳ Ṳ */
          557         0x1e75, 499,        /* ṵ Ṵ */
          558         0x1e77, 499,        /* ṷ Ṷ */
          559         0x1e79, 499,        /* ṹ Ṹ */
          560         0x1e7b, 499,        /* ṻ Ṻ */
          561         0x1e7d, 499,        /* ṽ Ṽ */
          562         0x1e7f, 499,        /* ṿ Ṿ */
          563         0x1e81, 499,        /* ẁ Ẁ */
          564         0x1e83, 499,        /* ẃ Ẃ */
          565         0x1e85, 499,        /* ẅ Ẅ */
          566         0x1e87, 499,        /* ẇ Ẇ */
          567         0x1e89, 499,        /* ẉ Ẉ */
          568         0x1e8b, 499,        /* ẋ Ẋ */
          569         0x1e8d, 499,        /* ẍ Ẍ */
          570         0x1e8f, 499,        /* ẏ Ẏ */
          571         0x1e91, 499,        /* ẑ Ẑ */
          572         0x1e93, 499,        /* ẓ Ẓ */
          573         0x1e95, 499,        /* ẕ Ẕ */
          574         0x1ea1, 499,        /* ạ Ạ */
          575         0x1ea3, 499,        /* ả Ả */
          576         0x1ea5, 499,        /* ấ Ấ */
          577         0x1ea7, 499,        /* ầ Ầ */
          578         0x1ea9, 499,        /* ẩ Ẩ */
          579         0x1eab, 499,        /* ẫ Ẫ */
          580         0x1ead, 499,        /* ậ Ậ */
          581         0x1eaf, 499,        /* ắ Ắ */
          582         0x1eb1, 499,        /* ằ Ằ */
          583         0x1eb3, 499,        /* ẳ Ẳ */
          584         0x1eb5, 499,        /* ẵ Ẵ */
          585         0x1eb7, 499,        /* ặ Ặ */
          586         0x1eb9, 499,        /* ẹ Ẹ */
          587         0x1ebb, 499,        /* ẻ Ẻ */
          588         0x1ebd, 499,        /* ẽ Ẽ */
          589         0x1ebf, 499,        /* ế Ế */
          590         0x1ec1, 499,        /* ề Ề */
          591         0x1ec3, 499,        /* ể Ể */
          592         0x1ec5, 499,        /* ễ Ễ */
          593         0x1ec7, 499,        /* ệ Ệ */
          594         0x1ec9, 499,        /* ỉ Ỉ */
          595         0x1ecb, 499,        /* ị Ị */
          596         0x1ecd, 499,        /* ọ Ọ */
          597         0x1ecf, 499,        /* ỏ Ỏ */
          598         0x1ed1, 499,        /* ố Ố */
          599         0x1ed3, 499,        /* ồ Ồ */
          600         0x1ed5, 499,        /* ổ Ổ */
          601         0x1ed7, 499,        /* ỗ Ỗ */
          602         0x1ed9, 499,        /* ộ Ộ */
          603         0x1edb, 499,        /* ớ Ớ */
          604         0x1edd, 499,        /* ờ Ờ */
          605         0x1edf, 499,        /* ở Ở */
          606         0x1ee1, 499,        /* ỡ Ỡ */
          607         0x1ee3, 499,        /* ợ Ợ */
          608         0x1ee5, 499,        /* ụ Ụ */
          609         0x1ee7, 499,        /* ủ Ủ */
          610         0x1ee9, 499,        /* ứ Ứ */
          611         0x1eeb, 499,        /* ừ Ừ */
          612         0x1eed, 499,        /* ử Ử */
          613         0x1eef, 499,        /* ữ Ữ */
          614         0x1ef1, 499,        /* ự Ự */
          615         0x1ef3, 499,        /* ỳ Ỳ */
          616         0x1ef5, 499,        /* ỵ Ỵ */
          617         0x1ef7, 499,        /* ỷ Ỷ */
          618         0x1ef9, 499,        /* ỹ Ỹ */
          619         0x1f51, 508,        /* ὑ Ὑ */
          620         0x1f53, 508,        /* ὓ Ὓ */
          621         0x1f55, 508,        /* ὕ Ὕ */
          622         0x1f57, 508,        /* ὗ Ὗ */
          623         0x1fb3, 509,        /* ᾳ ᾼ */
          624         0x1fc3, 509,        /* ῃ ῌ */
          625         0x1fe5, 507,        /* ῥ Ῥ */
          626         0x1ff3, 509,        /* ῳ ῼ */
          627 };
          628 
          629 /*
          630  * upper case ranges
          631  *        3rd col is conversion excess 500
          632  */
          633 static
          634 Rune        __tolower2[] =
          635 {
          636         0x0041,        0x005a, 532,        /* A-Z a-z */
          637         0x00c0,        0x00d6, 532,        /* À-Ö à-ö */
          638         0x00d8,        0x00de, 532,        /* Ø-Þ ø-þ */
          639         0x0189,        0x018a, 705,        /* Ɖ-Ɗ ɖ-ɗ */
          640         0x018e,        0x018f, 702,        /* Ǝ-Ə ɘ-ə */
          641         0x01b1,        0x01b2, 717,        /* Ʊ-Ʋ ʊ-ʋ */
          642         0x0388,        0x038a, 537,        /* Έ-Ί έ-ί */
          643         0x038e,        0x038f, 563,        /* Ύ-Ώ ύ-ώ */
          644         0x0391,        0x03a1, 532,        /* Α-Ρ α-ρ */
          645         0x03a3,        0x03ab, 532,        /* Σ-Ϋ σ-ϋ */
          646         0x0401,        0x040c, 580,        /* Ё-Ќ ё-ќ */
          647         0x040e,        0x040f, 580,        /* Ў-Џ ў-џ */
          648         0x0410,        0x042f, 532,        /* А-Я а-я */
          649         0x0531,        0x0556, 548,        /* Ա-Ֆ ա-ֆ */
          650         0x10a0,        0x10c5, 548,        /* Ⴀ-Ⴥ ა-ჵ */
          651         0x1f08,        0x1f0f, 492,        /* Ἀ-Ἇ ἀ-ἇ */
          652         0x1f18,        0x1f1d, 492,        /* Ἐ-Ἕ ἐ-ἕ */
          653         0x1f28,        0x1f2f, 492,        /* Ἠ-Ἧ ἠ-ἧ */
          654         0x1f38,        0x1f3f, 492,        /* Ἰ-Ἷ ἰ-ἷ */
          655         0x1f48,        0x1f4d, 492,        /* Ὀ-Ὅ ὀ-ὅ */
          656         0x1f68,        0x1f6f, 492,        /* Ὠ-Ὧ ὠ-ὧ */
          657         0x1f88,        0x1f8f, 492,        /* ᾈ-ᾏ ᾀ-ᾇ */
          658         0x1f98,        0x1f9f, 492,        /* ᾘ-ᾟ ᾐ-ᾗ */
          659         0x1fa8,        0x1faf, 492,        /* ᾨ-ᾯ ᾠ-ᾧ */
          660         0x1fb8,        0x1fb9, 492,        /* Ᾰ-Ᾱ ᾰ-ᾱ */
          661         0x1fba,        0x1fbb, 426,        /* Ὰ-Ά ὰ-ά */
          662         0x1fc8,        0x1fcb, 414,        /* Ὲ-Ή ὲ-ή */
          663         0x1fd8,        0x1fd9, 492,        /* Ῐ-Ῑ ῐ-ῑ */
          664         0x1fda,        0x1fdb, 400,        /* Ὶ-Ί ὶ-ί */
          665         0x1fe8,        0x1fe9, 492,        /* Ῠ-Ῡ ῠ-ῡ */
          666         0x1fea,        0x1feb, 388,        /* Ὺ-Ύ ὺ-ύ */
          667         0x1ff8,        0x1ff9, 372,        /* Ὸ-Ό ὸ-ό */
          668         0x1ffa,        0x1ffb, 374,        /* Ὼ-Ώ ὼ-ώ */
          669         0x2160,        0x216f, 516,        /* Ⅰ-Ⅿ ⅰ-ⅿ */
          670         0x24b6,        0x24cf, 526,        /* Ⓐ-Ⓩ ⓐ-ⓩ */
          671         0xff21,        0xff3a, 532,        /* A-Z a-z */
          672 };
          673 
          674 /*
          675  * upper case singlets
          676  *        2nd col is conversion excess 500
          677  */
          678 static
          679 Rune        __tolower1[] =
          680 {
          681         0x0100, 501,        /* Ā ā */
          682         0x0102, 501,        /* Ă ă */
          683         0x0104, 501,        /* Ą ą */
          684         0x0106, 501,        /* Ć ć */
          685         0x0108, 501,        /* Ĉ ĉ */
          686         0x010a, 501,        /* Ċ ċ */
          687         0x010c, 501,        /* Č č */
          688         0x010e, 501,        /* Ď ď */
          689         0x0110, 501,        /* Đ đ */
          690         0x0112, 501,        /* Ē ē */
          691         0x0114, 501,        /* Ĕ ĕ */
          692         0x0116, 501,        /* Ė ė */
          693         0x0118, 501,        /* Ę ę */
          694         0x011a, 501,        /* Ě ě */
          695         0x011c, 501,        /* Ĝ ĝ */
          696         0x011e, 501,        /* Ğ ğ */
          697         0x0120, 501,        /* Ġ ġ */
          698         0x0122, 501,        /* Ģ ģ */
          699         0x0124, 501,        /* Ĥ ĥ */
          700         0x0126, 501,        /* Ħ ħ */
          701         0x0128, 501,        /* Ĩ ĩ */
          702         0x012a, 501,        /* Ī ī */
          703         0x012c, 501,        /* Ĭ ĭ */
          704         0x012e, 501,        /* Į į */
          705         0x0130, 301,        /* İ i */
          706         0x0132, 501,        /* IJ ij */
          707         0x0134, 501,        /* Ĵ ĵ */
          708         0x0136, 501,        /* Ķ ķ */
          709         0x0139, 501,        /* Ĺ ĺ */
          710         0x013b, 501,        /* Ļ ļ */
          711         0x013d, 501,        /* Ľ ľ */
          712         0x013f, 501,        /* Ŀ ŀ */
          713         0x0141, 501,        /* Ł ł */
          714         0x0143, 501,        /* Ń ń */
          715         0x0145, 501,        /* Ņ ņ */
          716         0x0147, 501,        /* Ň ň */
          717         0x014a, 501,        /* Ŋ ŋ */
          718         0x014c, 501,        /* Ō ō */
          719         0x014e, 501,        /* Ŏ ŏ */
          720         0x0150, 501,        /* Ő ő */
          721         0x0152, 501,        /* Œ œ */
          722         0x0154, 501,        /* Ŕ ŕ */
          723         0x0156, 501,        /* Ŗ ŗ */
          724         0x0158, 501,        /* Ř ř */
          725         0x015a, 501,        /* Ś ś */
          726         0x015c, 501,        /* Ŝ ŝ */
          727         0x015e, 501,        /* Ş ş */
          728         0x0160, 501,        /* Š š */
          729         0x0162, 501,        /* Ţ ţ */
          730         0x0164, 501,        /* Ť ť */
          731         0x0166, 501,        /* Ŧ ŧ */
          732         0x0168, 501,        /* Ũ ũ */
          733         0x016a, 501,        /* Ū ū */
          734         0x016c, 501,        /* Ŭ ŭ */
          735         0x016e, 501,        /* Ů ů */
          736         0x0170, 501,        /* Ű ű */
          737         0x0172, 501,        /* Ų ų */
          738         0x0174, 501,        /* Ŵ ŵ */
          739         0x0176, 501,        /* Ŷ ŷ */
          740         0x0178, 379,        /* Ÿ ÿ */
          741         0x0179, 501,        /* Ź ź */
          742         0x017b, 501,        /* Ż ż */
          743         0x017d, 501,        /* Ž ž */
          744         0x0181, 710,        /* Ɓ ɓ */
          745         0x0182, 501,        /* Ƃ ƃ */
          746         0x0184, 501,        /* Ƅ ƅ */
          747         0x0186, 706,        /* Ɔ ɔ */
          748         0x0187, 501,        /* Ƈ ƈ */
          749         0x018b, 501,        /* Ƌ ƌ */
          750         0x0190, 703,        /* Ɛ ɛ */
          751         0x0191, 501,        /* Ƒ ƒ */
          752         0x0193, 705,        /* Ɠ ɠ */
          753         0x0194, 707,        /* Ɣ ɣ */
          754         0x0196, 711,        /* Ɩ ɩ */
          755         0x0197, 709,        /* Ɨ ɨ */
          756         0x0198, 501,        /* Ƙ ƙ */
          757         0x019c, 711,        /* Ɯ ɯ */
          758         0x019d, 713,        /* Ɲ ɲ */
          759         0x01a0, 501,        /* Ơ ơ */
          760         0x01a2, 501,        /* Ƣ ƣ */
          761         0x01a4, 501,        /* Ƥ ƥ */
          762         0x01a7, 501,        /* Ƨ ƨ */
          763         0x01a9, 718,        /* Ʃ ʃ */
          764         0x01ac, 501,        /* Ƭ ƭ */
          765         0x01ae, 718,        /* Ʈ ʈ */
          766         0x01af, 501,        /* Ư ư */
          767         0x01b3, 501,        /* Ƴ ƴ */
          768         0x01b5, 501,        /* Ƶ ƶ */
          769         0x01b7, 719,        /* Ʒ ʒ */
          770         0x01b8, 501,        /* Ƹ ƹ */
          771         0x01bc, 501,        /* Ƽ ƽ */
          772         0x01c4, 502,        /* DŽ dž */
          773         0x01c5, 501,        /* Dž dž */
          774         0x01c7, 502,        /* LJ lj */
          775         0x01c8, 501,        /* Lj lj */
          776         0x01ca, 502,        /* NJ nj */
          777         0x01cb, 501,        /* Nj nj */
          778         0x01cd, 501,        /* Ǎ ǎ */
          779         0x01cf, 501,        /* Ǐ ǐ */
          780         0x01d1, 501,        /* Ǒ ǒ */
          781         0x01d3, 501,        /* Ǔ ǔ */
          782         0x01d5, 501,        /* Ǖ ǖ */
          783         0x01d7, 501,        /* Ǘ ǘ */
          784         0x01d9, 501,        /* Ǚ ǚ */
          785         0x01db, 501,        /* Ǜ ǜ */
          786         0x01de, 501,        /* Ǟ ǟ */
          787         0x01e0, 501,        /* Ǡ ǡ */
          788         0x01e2, 501,        /* Ǣ ǣ */
          789         0x01e4, 501,        /* Ǥ ǥ */
          790         0x01e6, 501,        /* Ǧ ǧ */
          791         0x01e8, 501,        /* Ǩ ǩ */
          792         0x01ea, 501,        /* Ǫ ǫ */
          793         0x01ec, 501,        /* Ǭ ǭ */
          794         0x01ee, 501,        /* Ǯ ǯ */
          795         0x01f1, 502,        /* DZ dz */
          796         0x01f2, 501,        /* Dz dz */
          797         0x01f4, 501,        /* Ǵ ǵ */
          798         0x01fa, 501,        /* Ǻ ǻ */
          799         0x01fc, 501,        /* Ǽ ǽ */
          800         0x01fe, 501,        /* Ǿ ǿ */
          801         0x0200, 501,        /* Ȁ ȁ */
          802         0x0202, 501,        /* Ȃ ȃ */
          803         0x0204, 501,        /* Ȅ ȅ */
          804         0x0206, 501,        /* Ȇ ȇ */
          805         0x0208, 501,        /* Ȉ ȉ */
          806         0x020a, 501,        /* Ȋ ȋ */
          807         0x020c, 501,        /* Ȍ ȍ */
          808         0x020e, 501,        /* Ȏ ȏ */
          809         0x0210, 501,        /* Ȑ ȑ */
          810         0x0212, 501,        /* Ȓ ȓ */
          811         0x0214, 501,        /* Ȕ ȕ */
          812         0x0216, 501,        /* Ȗ ȗ */
          813         0x0386, 538,        /* Ά ά */
          814         0x038c, 564,        /* Ό ό */
          815         0x03e2, 501,        /* Ϣ ϣ */
          816         0x03e4, 501,        /* Ϥ ϥ */
          817         0x03e6, 501,        /* Ϧ ϧ */
          818         0x03e8, 501,        /* Ϩ ϩ */
          819         0x03ea, 501,        /* Ϫ ϫ */
          820         0x03ec, 501,        /* Ϭ ϭ */
          821         0x03ee, 501,        /* Ϯ ϯ */
          822         0x0460, 501,        /* Ѡ ѡ */
          823         0x0462, 501,        /* Ѣ ѣ */
          824         0x0464, 501,        /* Ѥ ѥ */
          825         0x0466, 501,        /* Ѧ ѧ */
          826         0x0468, 501,        /* Ѩ ѩ */
          827         0x046a, 501,        /* Ѫ ѫ */
          828         0x046c, 501,        /* Ѭ ѭ */
          829         0x046e, 501,        /* Ѯ ѯ */
          830         0x0470, 501,        /* Ѱ ѱ */
          831         0x0472, 501,        /* Ѳ ѳ */
          832         0x0474, 501,        /* Ѵ ѵ */
          833         0x0476, 501,        /* Ѷ ѷ */
          834         0x0478, 501,        /* Ѹ ѹ */
          835         0x047a, 501,        /* Ѻ ѻ */
          836         0x047c, 501,        /* Ѽ ѽ */
          837         0x047e, 501,        /* Ѿ ѿ */
          838         0x0480, 501,        /* Ҁ ҁ */
          839         0x0490, 501,        /* Ґ ґ */
          840         0x0492, 501,        /* Ғ ғ */
          841         0x0494, 501,        /* Ҕ ҕ */
          842         0x0496, 501,        /* Җ җ */
          843         0x0498, 501,        /* Ҙ ҙ */
          844         0x049a, 501,        /* Қ қ */
          845         0x049c, 501,        /* Ҝ ҝ */
          846         0x049e, 501,        /* Ҟ ҟ */
          847         0x04a0, 501,        /* Ҡ ҡ */
          848         0x04a2, 501,        /* Ң ң */
          849         0x04a4, 501,        /* Ҥ ҥ */
          850         0x04a6, 501,        /* Ҧ ҧ */
          851         0x04a8, 501,        /* Ҩ ҩ */
          852         0x04aa, 501,        /* Ҫ ҫ */
          853         0x04ac, 501,        /* Ҭ ҭ */
          854         0x04ae, 501,        /* Ү ү */
          855         0x04b0, 501,        /* Ұ ұ */
          856         0x04b2, 501,        /* Ҳ ҳ */
          857         0x04b4, 501,        /* Ҵ ҵ */
          858         0x04b6, 501,        /* Ҷ ҷ */
          859         0x04b8, 501,        /* Ҹ ҹ */
          860         0x04ba, 501,        /* Һ һ */
          861         0x04bc, 501,        /* Ҽ ҽ */
          862         0x04be, 501,        /* Ҿ ҿ */
          863         0x04c1, 501,        /* Ӂ ӂ */
          864         0x04c3, 501,        /* Ӄ ӄ */
          865         0x04c7, 501,        /* Ӈ ӈ */
          866         0x04cb, 501,        /* Ӌ ӌ */
          867         0x04d0, 501,        /* Ӑ ӑ */
          868         0x04d2, 501,        /* Ӓ ӓ */
          869         0x04d4, 501,        /* Ӕ ӕ */
          870         0x04d6, 501,        /* Ӗ ӗ */
          871         0x04d8, 501,        /* Ә ә */
          872         0x04da, 501,        /* Ӛ ӛ */
          873         0x04dc, 501,        /* Ӝ ӝ */
          874         0x04de, 501,        /* Ӟ ӟ */
          875         0x04e0, 501,        /* Ӡ ӡ */
          876         0x04e2, 501,        /* Ӣ ӣ */
          877         0x04e4, 501,        /* Ӥ ӥ */
          878         0x04e6, 501,        /* Ӧ ӧ */
          879         0x04e8, 501,        /* Ө ө */
          880         0x04ea, 501,        /* Ӫ ӫ */
          881         0x04ee, 501,        /* Ӯ ӯ */
          882         0x04f0, 501,        /* Ӱ ӱ */
          883         0x04f2, 501,        /* Ӳ ӳ */
          884         0x04f4, 501,        /* Ӵ ӵ */
          885         0x04f8, 501,        /* Ӹ ӹ */
          886         0x1e00, 501,        /* Ḁ ḁ */
          887         0x1e02, 501,        /* Ḃ ḃ */
          888         0x1e04, 501,        /* Ḅ ḅ */
          889         0x1e06, 501,        /* Ḇ ḇ */
          890         0x1e08, 501,        /* Ḉ ḉ */
          891         0x1e0a, 501,        /* Ḋ ḋ */
          892         0x1e0c, 501,        /* Ḍ ḍ */
          893         0x1e0e, 501,        /* Ḏ ḏ */
          894         0x1e10, 501,        /* Ḑ ḑ */
          895         0x1e12, 501,        /* Ḓ ḓ */
          896         0x1e14, 501,        /* Ḕ ḕ */
          897         0x1e16, 501,        /* Ḗ ḗ */
          898         0x1e18, 501,        /* Ḙ ḙ */
          899         0x1e1a, 501,        /* Ḛ ḛ */
          900         0x1e1c, 501,        /* Ḝ ḝ */
          901         0x1e1e, 501,        /* Ḟ ḟ */
          902         0x1e20, 501,        /* Ḡ ḡ */
          903         0x1e22, 501,        /* Ḣ ḣ */
          904         0x1e24, 501,        /* Ḥ ḥ */
          905         0x1e26, 501,        /* Ḧ ḧ */
          906         0x1e28, 501,        /* Ḩ ḩ */
          907         0x1e2a, 501,        /* Ḫ ḫ */
          908         0x1e2c, 501,        /* Ḭ ḭ */
          909         0x1e2e, 501,        /* Ḯ ḯ */
          910         0x1e30, 501,        /* Ḱ ḱ */
          911         0x1e32, 501,        /* Ḳ ḳ */
          912         0x1e34, 501,        /* Ḵ ḵ */
          913         0x1e36, 501,        /* Ḷ ḷ */
          914         0x1e38, 501,        /* Ḹ ḹ */
          915         0x1e3a, 501,        /* Ḻ ḻ */
          916         0x1e3c, 501,        /* Ḽ ḽ */
          917         0x1e3e, 501,        /* Ḿ ḿ */
          918         0x1e40, 501,        /* Ṁ ṁ */
          919         0x1e42, 501,        /* Ṃ ṃ */
          920         0x1e44, 501,        /* Ṅ ṅ */
          921         0x1e46, 501,        /* Ṇ ṇ */
          922         0x1e48, 501,        /* Ṉ ṉ */
          923         0x1e4a, 501,        /* Ṋ ṋ */
          924         0x1e4c, 501,        /* Ṍ ṍ */
          925         0x1e4e, 501,        /* Ṏ ṏ */
          926         0x1e50, 501,        /* Ṑ ṑ */
          927         0x1e52, 501,        /* Ṓ ṓ */
          928         0x1e54, 501,        /* Ṕ ṕ */
          929         0x1e56, 501,        /* Ṗ ṗ */
          930         0x1e58, 501,        /* Ṙ ṙ */
          931         0x1e5a, 501,        /* Ṛ ṛ */
          932         0x1e5c, 501,        /* Ṝ ṝ */
          933         0x1e5e, 501,        /* Ṟ ṟ */
          934         0x1e60, 501,        /* Ṡ ṡ */
          935         0x1e62, 501,        /* Ṣ ṣ */
          936         0x1e64, 501,        /* Ṥ ṥ */
          937         0x1e66, 501,        /* Ṧ ṧ */
          938         0x1e68, 501,        /* Ṩ ṩ */
          939         0x1e6a, 501,        /* Ṫ ṫ */
          940         0x1e6c, 501,        /* Ṭ ṭ */
          941         0x1e6e, 501,        /* Ṯ ṯ */
          942         0x1e70, 501,        /* Ṱ ṱ */
          943         0x1e72, 501,        /* Ṳ ṳ */
          944         0x1e74, 501,        /* Ṵ ṵ */
          945         0x1e76, 501,        /* Ṷ ṷ */
          946         0x1e78, 501,        /* Ṹ ṹ */
          947         0x1e7a, 501,        /* Ṻ ṻ */
          948         0x1e7c, 501,        /* Ṽ ṽ */
          949         0x1e7e, 501,        /* Ṿ ṿ */
          950         0x1e80, 501,        /* Ẁ ẁ */
          951         0x1e82, 501,        /* Ẃ ẃ */
          952         0x1e84, 501,        /* Ẅ ẅ */
          953         0x1e86, 501,        /* Ẇ ẇ */
          954         0x1e88, 501,        /* Ẉ ẉ */
          955         0x1e8a, 501,        /* Ẋ ẋ */
          956         0x1e8c, 501,        /* Ẍ ẍ */
          957         0x1e8e, 501,        /* Ẏ ẏ */
          958         0x1e90, 501,        /* Ẑ ẑ */
          959         0x1e92, 501,        /* Ẓ ẓ */
          960         0x1e94, 501,        /* Ẕ ẕ */
          961         0x1ea0, 501,        /* Ạ ạ */
          962         0x1ea2, 501,        /* Ả ả */
          963         0x1ea4, 501,        /* Ấ ấ */
          964         0x1ea6, 501,        /* Ầ ầ */
          965         0x1ea8, 501,        /* Ẩ ẩ */
          966         0x1eaa, 501,        /* Ẫ ẫ */
          967         0x1eac, 501,        /* Ậ ậ */
          968         0x1eae, 501,        /* Ắ ắ */
          969         0x1eb0, 501,        /* Ằ ằ */
          970         0x1eb2, 501,        /* Ẳ ẳ */
          971         0x1eb4, 501,        /* Ẵ ẵ */
          972         0x1eb6, 501,        /* Ặ ặ */
          973         0x1eb8, 501,        /* Ẹ ẹ */
          974         0x1eba, 501,        /* Ẻ ẻ */
          975         0x1ebc, 501,        /* Ẽ ẽ */
          976         0x1ebe, 501,        /* Ế ế */
          977         0x1ec0, 501,        /* Ề ề */
          978         0x1ec2, 501,        /* Ể ể */
          979         0x1ec4, 501,        /* Ễ ễ */
          980         0x1ec6, 501,        /* Ệ ệ */
          981         0x1ec8, 501,        /* Ỉ ỉ */
          982         0x1eca, 501,        /* Ị ị */
          983         0x1ecc, 501,        /* Ọ ọ */
          984         0x1ece, 501,        /* Ỏ ỏ */
          985         0x1ed0, 501,        /* Ố ố */
          986         0x1ed2, 501,        /* Ồ ồ */
          987         0x1ed4, 501,        /* Ổ ổ */
          988         0x1ed6, 501,        /* Ỗ ỗ */
          989         0x1ed8, 501,        /* Ộ ộ */
          990         0x1eda, 501,        /* Ớ ớ */
          991         0x1edc, 501,        /* Ờ ờ */
          992         0x1ede, 501,        /* Ở ở */
          993         0x1ee0, 501,        /* Ỡ ỡ */
          994         0x1ee2, 501,        /* Ợ ợ */
          995         0x1ee4, 501,        /* Ụ ụ */
          996         0x1ee6, 501,        /* Ủ ủ */
          997         0x1ee8, 501,        /* Ứ ứ */
          998         0x1eea, 501,        /* Ừ ừ */
          999         0x1eec, 501,        /* Ử ử */
         1000         0x1eee, 501,        /* Ữ ữ */
         1001         0x1ef0, 501,        /* Ự ự */
         1002         0x1ef2, 501,        /* Ỳ ỳ */
         1003         0x1ef4, 501,        /* Ỵ ỵ */
         1004         0x1ef6, 501,        /* Ỷ ỷ */
         1005         0x1ef8, 501,        /* Ỹ ỹ */
         1006         0x1f59, 492,        /* Ὑ ὑ */
         1007         0x1f5b, 492,        /* Ὓ ὓ */
         1008         0x1f5d, 492,        /* Ὕ ὕ */
         1009         0x1f5f, 492,        /* Ὗ ὗ */
         1010         0x1fbc, 491,        /* ᾼ ᾳ */
         1011         0x1fcc, 491,        /* ῌ ῃ */
         1012         0x1fec, 493,        /* Ῥ ῥ */
         1013         0x1ffc, 491,        /* ῼ ῳ */
         1014 };
         1015 
         1016 /*
         1017  * title characters are those between
         1018  * upper and lower case. ie DZ Dz dz
         1019  */
         1020 static
         1021 Rune        __totitle1[] =
         1022 {
         1023         0x01c4, 501,        /* DŽ Dž */
         1024         0x01c6, 499,        /* dž Dž */
         1025         0x01c7, 501,        /* LJ Lj */
         1026         0x01c9, 499,        /* lj Lj */
         1027         0x01ca, 501,        /* NJ Nj */
         1028         0x01cc, 499,        /* nj Nj */
         1029         0x01f1, 501,        /* DZ Dz */
         1030         0x01f3, 499,        /* dz Dz */
         1031 };
         1032 
         1033 static Rune*
         1034 bsearch(Rune c, Rune *t, int n, int ne)
         1035 {
         1036         Rune *p;
         1037         int m;
         1038 
         1039         while(n > 1) {
         1040                 m = n/2;
         1041                 p = t + m*ne;
         1042                 if(c >= p[0]) {
         1043                         t = p;
         1044                         n = n-m;
         1045                 } else
         1046                         n = m;
         1047         }
         1048         if(n && c >= t[0])
         1049                 return t;
         1050         return 0;
         1051 }
         1052 
         1053 Rune
         1054 tolowerrune(Rune c)
         1055 {
         1056         Rune *p;
         1057 
         1058         p = bsearch(c, __tolower2, nelem(__tolower2)/3, 3);
         1059         if(p && c >= p[0] && c <= p[1])
         1060                 return c + p[2] - 500;
         1061         p = bsearch(c, __tolower1, nelem(__tolower1)/2, 2);
         1062         if(p && c == p[0])
         1063                 return c + p[1] - 500;
         1064         return c;
         1065 }
         1066 
         1067 Rune
         1068 toupperrune(Rune c)
         1069 {
         1070         Rune *p;
         1071 
         1072         p = bsearch(c, __toupper2, nelem(__toupper2)/3, 3);
         1073         if(p && c >= p[0] && c <= p[1])
         1074                 return c + p[2] - 500;
         1075         p = bsearch(c, __toupper1, nelem(__toupper1)/2, 2);
         1076         if(p && c == p[0])
         1077                 return c + p[1] - 500;
         1078         return c;
         1079 }
         1080 
         1081 Rune
         1082 totitlerune(Rune c)
         1083 {
         1084         Rune *p;
         1085 
         1086         p = bsearch(c, __totitle1, nelem(__totitle1)/2, 2);
         1087         if(p && c == p[0])
         1088                 return c + p[1] - 500;
         1089         return c;
         1090 }
         1091 
         1092 int
         1093 islowerrune(Rune c)
         1094 {
         1095         Rune *p;
         1096 
         1097         p = bsearch(c, __toupper2, nelem(__toupper2)/3, 3);
         1098         if(p && c >= p[0] && c <= p[1])
         1099                 return 1;
         1100         p = bsearch(c, __toupper1, nelem(__toupper1)/2, 2);
         1101         if(p && c == p[0])
         1102                 return 1;
         1103         return 0;
         1104 }
         1105 
         1106 int
         1107 isupperrune(Rune c)
         1108 {
         1109         Rune *p;
         1110 
         1111         p = bsearch(c, __tolower2, nelem(__tolower2)/3, 3);
         1112         if(p && c >= p[0] && c <= p[1])
         1113                 return 1;
         1114         p = bsearch(c, __tolower1, nelem(__tolower1)/2, 2);
         1115         if(p && c == p[0])
         1116                 return 1;
         1117         return 0;
         1118 }
         1119 
         1120 int
         1121 isalpharune(Rune c)
         1122 {
         1123         Rune *p;
         1124 
         1125         if(isupperrune(c) || islowerrune(c))
         1126                 return 1;
         1127         p = bsearch(c, __alpha2, nelem(__alpha2)/2, 2);
         1128         if(p && c >= p[0] && c <= p[1])
         1129                 return 1;
         1130         p = bsearch(c, __alpha1, nelem(__alpha1), 1);
         1131         if(p && c == p[0])
         1132                 return 1;
         1133         return 0;
         1134 }
         1135 
         1136 int
         1137 istitlerune(Rune c)
         1138 {
         1139         return isupperrune(c) && islowerrune(c);
         1140 }
         1141 
         1142 int
         1143 isspacerune(Rune c)
         1144 {
         1145         Rune *p;
         1146 
         1147         p = bsearch(c, __space2, nelem(__space2)/2, 2);
         1148         if(p && c >= p[0] && c <= p[1])
         1149                 return 1;
         1150         return 0;
         1151 }