From 92e0da5e1daecd7f412f39951dd2fc2e26adef50 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 21 Sep 2015 18:58:14 -0400 Subject: [PATCH] Updated unicode database parsing script to generate to* functions and to save space for singles for is* functions --- build.rb | 4 - source/utf/alphas.c | 264 ++++---- source/utf/controls.c | 4 +- source/utf/digits.c | 4 +- source/utf/lowers.c | 1074 +++++++++++++++---------------- source/utf/marks.c | 98 +-- source/utf/numbers.c | 20 +- source/utf/other.c | 38 +- source/utf/otherletters.c | 240 +++---- source/utf/punctuation.c | 118 ++-- source/utf/spaces.c | 22 +- source/utf/symbols.c | 150 ++--- source/utf/titles.c | 24 +- source/utf/tolower.c | 1244 ++++++++++++++++++++++++++++++++++++ source/utf/totitle.c | 1256 +++++++++++++++++++++++++++++++++++++ source/utf/toupper.c | 1252 ++++++++++++++++++++++++++++++++++++ source/utf/uppers.c | 1088 ++++++++++++++++---------------- tools/unicode.rb | 168 +++-- 18 files changed, 5458 insertions(+), 1610 deletions(-) create mode 100644 source/utf/tolower.c create mode 100644 source/utf/totitle.c create mode 100644 source/utf/toupper.c diff --git a/build.rb b/build.rb index 88ffce3..54b0eb8 100755 --- a/build.rb +++ b/build.rb @@ -13,10 +13,6 @@ end #------------------------------------------------------------------------------ # Release Build Targets #------------------------------------------------------------------------------ -# Generate the rune mappings -main_env.Command('Unicode', [], - "CMD" => ['./tools/unicode.rb', './tools/UnicodeData-8.0.0.txt', 'source/utf']) - # Build the library main_env.Library('libc.a', FileList['source/**/*.c']) diff --git a/source/utf/alphas.c b/source/utf/alphas.c index 667618d..052f72f 100644 --- a/source/utf/alphas.c +++ b/source/utf/alphas.c @@ -1,68 +1,177 @@ #include -static Rune alphas[561][2] = { +static Rune singles[128] = { + 0xaa, + 0xb5, + 0xba, + 0x2ec, + 0x2ee, + 0x37f, + 0x386, + 0x38c, + 0x559, + 0x6d5, + 0x6ff, + 0x710, + 0x7b1, + 0x7fa, + 0x81a, + 0x824, + 0x828, + 0x93d, + 0x950, + 0x9b2, + 0x9bd, + 0x9ce, + 0xa5e, + 0xabd, + 0xad0, + 0xaf9, + 0xb3d, + 0xb71, + 0xb83, + 0xb9c, + 0xbd0, + 0xc3d, + 0xcbd, + 0xcde, + 0xd3d, + 0xd4e, + 0xdbd, + 0xe84, + 0xe8a, + 0xe8d, + 0xea5, + 0xea7, + 0xebd, + 0xec6, + 0xf00, + 0x103f, + 0x1061, + 0x108e, + 0x10c7, + 0x10cd, + 0x1258, + 0x12c0, + 0x17d7, + 0x17dc, + 0x18aa, + 0x1aa7, + 0x1f59, + 0x1f5b, + 0x1f5d, + 0x1fbe, + 0x2071, + 0x207f, + 0x2102, + 0x2107, + 0x2115, + 0x2124, + 0x2126, + 0x2128, + 0x214e, + 0x2d27, + 0x2d2d, + 0x2d6f, + 0x2e2f, + 0x3400, + 0x4db5, + 0x4e00, + 0x9fd5, + 0xa8fb, + 0xa8fd, + 0xa9cf, + 0xaa7a, + 0xaab1, + 0xaac0, + 0xaac2, + 0xac00, + 0xd7a3, + 0xfb1d, + 0xfb3e, + 0x10808, + 0x1083c, + 0x10a00, + 0x11176, + 0x111da, + 0x111dc, + 0x11288, + 0x1133d, + 0x11350, + 0x114c7, + 0x11644, + 0x118ff, + 0x16f50, + 0x1d4a2, + 0x1d4bb, + 0x1d546, + 0x1ee24, + 0x1ee27, + 0x1ee39, + 0x1ee3b, + 0x1ee42, + 0x1ee47, + 0x1ee49, + 0x1ee4b, + 0x1ee54, + 0x1ee57, + 0x1ee59, + 0x1ee5b, + 0x1ee5d, + 0x1ee5f, + 0x1ee64, + 0x1ee7e, + 0x20000, + 0x2a6d6, + 0x2a700, + 0x2b734, + 0x2b740, + 0x2b81d, + 0x2b820, + 0x2cea1 +}; + +static Rune ranges[433][2] = { { 0x41, 0x5a }, { 0x61, 0x7a }, - { 0xaa, 0xaa }, - { 0xb5, 0xb5 }, - { 0xba, 0xba }, { 0xc0, 0xd6 }, { 0xd8, 0xf6 }, { 0xf8, 0x2c1 }, { 0x2c6, 0x2d1 }, { 0x2e0, 0x2e4 }, - { 0x2ec, 0x2ec }, - { 0x2ee, 0x2ee }, { 0x370, 0x374 }, { 0x376, 0x377 }, { 0x37a, 0x37d }, - { 0x37f, 0x37f }, - { 0x386, 0x386 }, { 0x388, 0x38a }, - { 0x38c, 0x38c }, { 0x38e, 0x3a1 }, { 0x3a3, 0x3f5 }, { 0x3f7, 0x481 }, { 0x48a, 0x52f }, { 0x531, 0x556 }, - { 0x559, 0x559 }, { 0x561, 0x587 }, { 0x5d0, 0x5ea }, { 0x5f0, 0x5f2 }, { 0x620, 0x64a }, { 0x66e, 0x66f }, { 0x671, 0x6d3 }, - { 0x6d5, 0x6d5 }, { 0x6e5, 0x6e6 }, { 0x6ee, 0x6ef }, { 0x6fa, 0x6fc }, - { 0x6ff, 0x6ff }, - { 0x710, 0x710 }, { 0x712, 0x72f }, { 0x74d, 0x7a5 }, - { 0x7b1, 0x7b1 }, { 0x7ca, 0x7ea }, { 0x7f4, 0x7f5 }, - { 0x7fa, 0x7fa }, { 0x800, 0x815 }, - { 0x81a, 0x81a }, - { 0x824, 0x824 }, - { 0x828, 0x828 }, { 0x840, 0x858 }, { 0x8a0, 0x8b4 }, { 0x904, 0x939 }, - { 0x93d, 0x93d }, - { 0x950, 0x950 }, { 0x958, 0x961 }, { 0x971, 0x980 }, { 0x985, 0x98c }, { 0x98f, 0x990 }, { 0x993, 0x9a8 }, { 0x9aa, 0x9b0 }, - { 0x9b2, 0x9b2 }, { 0x9b6, 0x9b9 }, - { 0x9bd, 0x9bd }, - { 0x9ce, 0x9ce }, { 0x9dc, 0x9dd }, { 0x9df, 0x9e1 }, { 0x9f0, 0x9f1 }, @@ -74,7 +183,6 @@ static Rune alphas[561][2] = { { 0xa35, 0xa36 }, { 0xa38, 0xa39 }, { 0xa59, 0xa5c }, - { 0xa5e, 0xa5e }, { 0xa72, 0xa74 }, { 0xa85, 0xa8d }, { 0xa8f, 0xa91 }, @@ -82,36 +190,27 @@ static Rune alphas[561][2] = { { 0xaaa, 0xab0 }, { 0xab2, 0xab3 }, { 0xab5, 0xab9 }, - { 0xabd, 0xabd }, - { 0xad0, 0xad0 }, { 0xae0, 0xae1 }, - { 0xaf9, 0xaf9 }, { 0xb05, 0xb0c }, { 0xb0f, 0xb10 }, { 0xb13, 0xb28 }, { 0xb2a, 0xb30 }, { 0xb32, 0xb33 }, { 0xb35, 0xb39 }, - { 0xb3d, 0xb3d }, { 0xb5c, 0xb5d }, { 0xb5f, 0xb61 }, - { 0xb71, 0xb71 }, - { 0xb83, 0xb83 }, { 0xb85, 0xb8a }, { 0xb8e, 0xb90 }, { 0xb92, 0xb95 }, { 0xb99, 0xb9a }, - { 0xb9c, 0xb9c }, { 0xb9e, 0xb9f }, { 0xba3, 0xba4 }, { 0xba8, 0xbaa }, { 0xbae, 0xbb9 }, - { 0xbd0, 0xbd0 }, { 0xc05, 0xc0c }, { 0xc0e, 0xc10 }, { 0xc12, 0xc28 }, { 0xc2a, 0xc39 }, - { 0xc3d, 0xc3d }, { 0xc58, 0xc5a }, { 0xc60, 0xc61 }, { 0xc85, 0xc8c }, @@ -119,70 +218,50 @@ static Rune alphas[561][2] = { { 0xc92, 0xca8 }, { 0xcaa, 0xcb3 }, { 0xcb5, 0xcb9 }, - { 0xcbd, 0xcbd }, - { 0xcde, 0xcde }, { 0xce0, 0xce1 }, { 0xcf1, 0xcf2 }, { 0xd05, 0xd0c }, { 0xd0e, 0xd10 }, { 0xd12, 0xd3a }, - { 0xd3d, 0xd3d }, - { 0xd4e, 0xd4e }, { 0xd5f, 0xd61 }, { 0xd7a, 0xd7f }, { 0xd85, 0xd96 }, { 0xd9a, 0xdb1 }, { 0xdb3, 0xdbb }, - { 0xdbd, 0xdbd }, { 0xdc0, 0xdc6 }, { 0xe01, 0xe30 }, { 0xe32, 0xe33 }, { 0xe40, 0xe46 }, { 0xe81, 0xe82 }, - { 0xe84, 0xe84 }, { 0xe87, 0xe88 }, - { 0xe8a, 0xe8a }, - { 0xe8d, 0xe8d }, { 0xe94, 0xe97 }, { 0xe99, 0xe9f }, { 0xea1, 0xea3 }, - { 0xea5, 0xea5 }, - { 0xea7, 0xea7 }, { 0xeaa, 0xeab }, { 0xead, 0xeb0 }, { 0xeb2, 0xeb3 }, - { 0xebd, 0xebd }, { 0xec0, 0xec4 }, - { 0xec6, 0xec6 }, { 0xedc, 0xedf }, - { 0xf00, 0xf00 }, { 0xf40, 0xf47 }, { 0xf49, 0xf6c }, { 0xf88, 0xf8c }, { 0x1000, 0x102a }, - { 0x103f, 0x103f }, { 0x1050, 0x1055 }, { 0x105a, 0x105d }, - { 0x1061, 0x1061 }, { 0x1065, 0x1066 }, { 0x106e, 0x1070 }, { 0x1075, 0x1081 }, - { 0x108e, 0x108e }, { 0x10a0, 0x10c5 }, - { 0x10c7, 0x10c7 }, - { 0x10cd, 0x10cd }, { 0x10d0, 0x10fa }, { 0x10fc, 0x1248 }, { 0x124a, 0x124d }, { 0x1250, 0x1256 }, - { 0x1258, 0x1258 }, { 0x125a, 0x125d }, { 0x1260, 0x1288 }, { 0x128a, 0x128d }, { 0x1290, 0x12b0 }, { 0x12b2, 0x12b5 }, { 0x12b8, 0x12be }, - { 0x12c0, 0x12c0 }, { 0x12c2, 0x12c5 }, { 0x12c8, 0x12d6 }, { 0x12d8, 0x1310 }, @@ -203,11 +282,8 @@ static Rune alphas[561][2] = { { 0x1760, 0x176c }, { 0x176e, 0x1770 }, { 0x1780, 0x17b3 }, - { 0x17d7, 0x17d7 }, - { 0x17dc, 0x17dc }, { 0x1820, 0x1877 }, { 0x1880, 0x18a8 }, - { 0x18aa, 0x18aa }, { 0x18b0, 0x18f5 }, { 0x1900, 0x191e }, { 0x1950, 0x196d }, @@ -216,7 +292,6 @@ static Rune alphas[561][2] = { { 0x19b0, 0x19c9 }, { 0x1a00, 0x1a16 }, { 0x1a20, 0x1a54 }, - { 0x1aa7, 0x1aa7 }, { 0x1b05, 0x1b33 }, { 0x1b45, 0x1b4b }, { 0x1b83, 0x1ba0 }, @@ -234,13 +309,9 @@ static Rune alphas[561][2] = { { 0x1f20, 0x1f45 }, { 0x1f48, 0x1f4d }, { 0x1f50, 0x1f57 }, - { 0x1f59, 0x1f59 }, - { 0x1f5b, 0x1f5b }, - { 0x1f5d, 0x1f5d }, { 0x1f5f, 0x1f7d }, { 0x1f80, 0x1fb4 }, { 0x1fb6, 0x1fbc }, - { 0x1fbe, 0x1fbe }, { 0x1fc2, 0x1fc4 }, { 0x1fc6, 0x1fcc }, { 0x1fd0, 0x1fd3 }, @@ -248,22 +319,13 @@ static Rune alphas[561][2] = { { 0x1fe0, 0x1fec }, { 0x1ff2, 0x1ff4 }, { 0x1ff6, 0x1ffc }, - { 0x2071, 0x2071 }, - { 0x207f, 0x207f }, { 0x2090, 0x209c }, - { 0x2102, 0x2102 }, - { 0x2107, 0x2107 }, { 0x210a, 0x2113 }, - { 0x2115, 0x2115 }, { 0x2119, 0x211d }, - { 0x2124, 0x2124 }, - { 0x2126, 0x2126 }, - { 0x2128, 0x2128 }, { 0x212a, 0x212d }, { 0x212f, 0x2139 }, { 0x213c, 0x213f }, { 0x2145, 0x2149 }, - { 0x214e, 0x214e }, { 0x2183, 0x2184 }, { 0x2c00, 0x2c2e }, { 0x2c30, 0x2c5e }, @@ -271,10 +333,7 @@ static Rune alphas[561][2] = { { 0x2ceb, 0x2cee }, { 0x2cf2, 0x2cf3 }, { 0x2d00, 0x2d25 }, - { 0x2d27, 0x2d27 }, - { 0x2d2d, 0x2d2d }, { 0x2d30, 0x2d67 }, - { 0x2d6f, 0x2d6f }, { 0x2d80, 0x2d96 }, { 0x2da0, 0x2da6 }, { 0x2da8, 0x2dae }, @@ -284,7 +343,6 @@ static Rune alphas[561][2] = { { 0x2dc8, 0x2dce }, { 0x2dd0, 0x2dd6 }, { 0x2dd8, 0x2dde }, - { 0x2e2f, 0x2e2f }, { 0x3005, 0x3006 }, { 0x3031, 0x3035 }, { 0x303b, 0x303c }, @@ -296,10 +354,6 @@ static Rune alphas[561][2] = { { 0x3131, 0x318e }, { 0x31a0, 0x31ba }, { 0x31f0, 0x31ff }, - { 0x3400, 0x3400 }, - { 0x4db5, 0x4db5 }, - { 0x4e00, 0x4e00 }, - { 0x9fd5, 0x9fd5 }, { 0xa000, 0xa48c }, { 0xa4d0, 0xa4fd }, { 0xa500, 0xa60c }, @@ -319,13 +373,10 @@ static Rune alphas[561][2] = { { 0xa840, 0xa873 }, { 0xa882, 0xa8b3 }, { 0xa8f2, 0xa8f7 }, - { 0xa8fb, 0xa8fb }, - { 0xa8fd, 0xa8fd }, { 0xa90a, 0xa925 }, { 0xa930, 0xa946 }, { 0xa960, 0xa97c }, { 0xa984, 0xa9b2 }, - { 0xa9cf, 0xa9cf }, { 0xa9e0, 0xa9e4 }, { 0xa9e6, 0xa9ef }, { 0xa9fa, 0xa9fe }, @@ -333,13 +384,9 @@ static Rune alphas[561][2] = { { 0xaa40, 0xaa42 }, { 0xaa44, 0xaa4b }, { 0xaa60, 0xaa76 }, - { 0xaa7a, 0xaa7a }, { 0xaa7e, 0xaaaf }, - { 0xaab1, 0xaab1 }, { 0xaab5, 0xaab6 }, { 0xaab9, 0xaabd }, - { 0xaac0, 0xaac0 }, - { 0xaac2, 0xaac2 }, { 0xaadb, 0xaadd }, { 0xaae0, 0xaaea }, { 0xaaf2, 0xaaf4 }, @@ -351,19 +398,15 @@ static Rune alphas[561][2] = { { 0xab30, 0xab5a }, { 0xab5c, 0xab65 }, { 0xab70, 0xabe2 }, - { 0xac00, 0xac00 }, - { 0xd7a3, 0xd7a3 }, { 0xd7b0, 0xd7c6 }, { 0xd7cb, 0xd7fb }, { 0xf900, 0xfa6d }, { 0xfa70, 0xfad9 }, { 0xfb00, 0xfb06 }, { 0xfb13, 0xfb17 }, - { 0xfb1d, 0xfb1d }, { 0xfb1f, 0xfb28 }, { 0xfb2a, 0xfb36 }, { 0xfb38, 0xfb3c }, - { 0xfb3e, 0xfb3e }, { 0xfb40, 0xfb41 }, { 0xfb43, 0xfb44 }, { 0xfb46, 0xfbb1 }, @@ -403,10 +446,8 @@ static Rune alphas[561][2] = { { 0x10740, 0x10755 }, { 0x10760, 0x10767 }, { 0x10800, 0x10805 }, - { 0x10808, 0x10808 }, { 0x1080a, 0x10835 }, { 0x10837, 0x10838 }, - { 0x1083c, 0x1083c }, { 0x1083f, 0x10855 }, { 0x10860, 0x10876 }, { 0x10880, 0x1089e }, @@ -416,7 +457,6 @@ static Rune alphas[561][2] = { { 0x10920, 0x10939 }, { 0x10980, 0x109b7 }, { 0x109be, 0x109bf }, - { 0x10a00, 0x10a00 }, { 0x10a10, 0x10a13 }, { 0x10a15, 0x10a17 }, { 0x10a19, 0x10a33 }, @@ -436,15 +476,11 @@ static Rune alphas[561][2] = { { 0x110d0, 0x110e8 }, { 0x11103, 0x11126 }, { 0x11150, 0x11172 }, - { 0x11176, 0x11176 }, { 0x11183, 0x111b2 }, { 0x111c1, 0x111c4 }, - { 0x111da, 0x111da }, - { 0x111dc, 0x111dc }, { 0x11200, 0x11211 }, { 0x11213, 0x1122b }, { 0x11280, 0x11286 }, - { 0x11288, 0x11288 }, { 0x1128a, 0x1128d }, { 0x1128f, 0x1129d }, { 0x1129f, 0x112a8 }, @@ -455,20 +491,15 @@ static Rune alphas[561][2] = { { 0x1132a, 0x11330 }, { 0x11332, 0x11333 }, { 0x11335, 0x11339 }, - { 0x1133d, 0x1133d }, - { 0x11350, 0x11350 }, { 0x1135d, 0x11361 }, { 0x11480, 0x114af }, { 0x114c4, 0x114c5 }, - { 0x114c7, 0x114c7 }, { 0x11580, 0x115ae }, { 0x115d8, 0x115db }, { 0x11600, 0x1162f }, - { 0x11644, 0x11644 }, { 0x11680, 0x116aa }, { 0x11700, 0x11719 }, { 0x118a0, 0x118df }, - { 0x118ff, 0x118ff }, { 0x11ac0, 0x11af8 }, { 0x12000, 0x12399 }, { 0x12480, 0x12543 }, @@ -482,7 +513,6 @@ static Rune alphas[561][2] = { { 0x16b63, 0x16b77 }, { 0x16b7d, 0x16b8f }, { 0x16f00, 0x16f44 }, - { 0x16f50, 0x16f50 }, { 0x16f93, 0x16f9f }, { 0x1b000, 0x1b001 }, { 0x1bc00, 0x1bc6a }, @@ -492,11 +522,9 @@ static Rune alphas[561][2] = { { 0x1d400, 0x1d454 }, { 0x1d456, 0x1d49c }, { 0x1d49e, 0x1d49f }, - { 0x1d4a2, 0x1d4a2 }, { 0x1d4a5, 0x1d4a6 }, { 0x1d4a9, 0x1d4ac }, { 0x1d4ae, 0x1d4b9 }, - { 0x1d4bb, 0x1d4bb }, { 0x1d4bd, 0x1d4c3 }, { 0x1d4c5, 0x1d505 }, { 0x1d507, 0x1d50a }, @@ -505,7 +533,6 @@ static Rune alphas[561][2] = { { 0x1d51e, 0x1d539 }, { 0x1d53b, 0x1d53e }, { 0x1d540, 0x1d544 }, - { 0x1d546, 0x1d546 }, { 0x1d54a, 0x1d550 }, { 0x1d552, 0x1d6a5 }, { 0x1d6a8, 0x1d6c0 }, @@ -523,49 +550,26 @@ static Rune alphas[561][2] = { { 0x1ee00, 0x1ee03 }, { 0x1ee05, 0x1ee1f }, { 0x1ee21, 0x1ee22 }, - { 0x1ee24, 0x1ee24 }, - { 0x1ee27, 0x1ee27 }, { 0x1ee29, 0x1ee32 }, { 0x1ee34, 0x1ee37 }, - { 0x1ee39, 0x1ee39 }, - { 0x1ee3b, 0x1ee3b }, - { 0x1ee42, 0x1ee42 }, - { 0x1ee47, 0x1ee47 }, - { 0x1ee49, 0x1ee49 }, - { 0x1ee4b, 0x1ee4b }, { 0x1ee4d, 0x1ee4f }, { 0x1ee51, 0x1ee52 }, - { 0x1ee54, 0x1ee54 }, - { 0x1ee57, 0x1ee57 }, - { 0x1ee59, 0x1ee59 }, - { 0x1ee5b, 0x1ee5b }, - { 0x1ee5d, 0x1ee5d }, - { 0x1ee5f, 0x1ee5f }, { 0x1ee61, 0x1ee62 }, - { 0x1ee64, 0x1ee64 }, { 0x1ee67, 0x1ee6a }, { 0x1ee6c, 0x1ee72 }, { 0x1ee74, 0x1ee77 }, { 0x1ee79, 0x1ee7c }, - { 0x1ee7e, 0x1ee7e }, { 0x1ee80, 0x1ee89 }, { 0x1ee8b, 0x1ee9b }, { 0x1eea1, 0x1eea3 }, { 0x1eea5, 0x1eea9 }, { 0x1eeab, 0x1eebb }, - { 0x20000, 0x20000 }, - { 0x2a6d6, 0x2a6d6 }, - { 0x2a700, 0x2a700 }, - { 0x2b734, 0x2b734 }, - { 0x2b740, 0x2b740 }, - { 0x2b81d, 0x2b81d }, - { 0x2b820, 0x2b820 }, - { 0x2cea1, 0x2cea1 }, { 0x2f800, 0x2fa1d } }; extern int runeinrange(const void* a, const void* b); bool isalpharune(Rune ch) { - return (NULL != bsearch(&ch, alphas, 561, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 128, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 433, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/controls.c b/source/utf/controls.c index 6524700..c13c3cd 100644 --- a/source/utf/controls.c +++ b/source/utf/controls.c @@ -1,6 +1,6 @@ #include -static Rune controls[4][2] = { +static Rune ranges[4][2] = { { 0x0, 0x8 }, { 0xe, 0x1b }, { 0x7f, 0x84 }, @@ -10,5 +10,5 @@ static Rune controls[4][2] = { extern int runeinrange(const void* a, const void* b); bool iscontrolrune(Rune ch) { - return (NULL != bsearch(&ch, controls, 4, 2 * sizeof(Rune), &runeinrange)); + return (NULL != bsearch(&ch, ranges, 4, 2 * sizeof(Rune), &runeinrange)); } diff --git a/source/utf/digits.c b/source/utf/digits.c index d87f088..0c3c594 100644 --- a/source/utf/digits.c +++ b/source/utf/digits.c @@ -1,6 +1,6 @@ #include -static Rune digits[51][2] = { +static Rune ranges[51][2] = { { 0x30, 0x39 }, { 0x660, 0x669 }, { 0x6f0, 0x6f9 }, @@ -57,5 +57,5 @@ static Rune digits[51][2] = { extern int runeinrange(const void* a, const void* b); bool isdigitrune(Rune ch) { - return (NULL != bsearch(&ch, digits, 51, 2 * sizeof(Rune), &runeinrange)); + return (NULL != bsearch(&ch, ranges, 51, 2 * sizeof(Rune), &runeinrange)); } diff --git a/source/utf/lowers.c b/source/utf/lowers.c index cd0f6dc..2763173 100644 --- a/source/utf/lowers.c +++ b/source/utf/lowers.c @@ -1,403 +1,572 @@ #include -static Rune lowers[630][2] = { +static Rune singles[532] = { + 0xb5, + 0x101, + 0x103, + 0x105, + 0x107, + 0x109, + 0x10b, + 0x10d, + 0x10f, + 0x111, + 0x113, + 0x115, + 0x117, + 0x119, + 0x11b, + 0x11d, + 0x11f, + 0x121, + 0x123, + 0x125, + 0x127, + 0x129, + 0x12b, + 0x12d, + 0x12f, + 0x131, + 0x133, + 0x135, + 0x13a, + 0x13c, + 0x13e, + 0x140, + 0x142, + 0x144, + 0x146, + 0x14b, + 0x14d, + 0x14f, + 0x151, + 0x153, + 0x155, + 0x157, + 0x159, + 0x15b, + 0x15d, + 0x15f, + 0x161, + 0x163, + 0x165, + 0x167, + 0x169, + 0x16b, + 0x16d, + 0x16f, + 0x171, + 0x173, + 0x175, + 0x177, + 0x17a, + 0x17c, + 0x183, + 0x185, + 0x188, + 0x192, + 0x195, + 0x19e, + 0x1a1, + 0x1a3, + 0x1a5, + 0x1a8, + 0x1ad, + 0x1b0, + 0x1b4, + 0x1b6, + 0x1c6, + 0x1c9, + 0x1cc, + 0x1ce, + 0x1d0, + 0x1d2, + 0x1d4, + 0x1d6, + 0x1d8, + 0x1da, + 0x1df, + 0x1e1, + 0x1e3, + 0x1e5, + 0x1e7, + 0x1e9, + 0x1eb, + 0x1ed, + 0x1f3, + 0x1f5, + 0x1f9, + 0x1fb, + 0x1fd, + 0x1ff, + 0x201, + 0x203, + 0x205, + 0x207, + 0x209, + 0x20b, + 0x20d, + 0x20f, + 0x211, + 0x213, + 0x215, + 0x217, + 0x219, + 0x21b, + 0x21d, + 0x21f, + 0x221, + 0x223, + 0x225, + 0x227, + 0x229, + 0x22b, + 0x22d, + 0x22f, + 0x231, + 0x23c, + 0x242, + 0x247, + 0x249, + 0x24b, + 0x24d, + 0x371, + 0x373, + 0x377, + 0x390, + 0x3d9, + 0x3db, + 0x3dd, + 0x3df, + 0x3e1, + 0x3e3, + 0x3e5, + 0x3e7, + 0x3e9, + 0x3eb, + 0x3ed, + 0x3f5, + 0x3f8, + 0x461, + 0x463, + 0x465, + 0x467, + 0x469, + 0x46b, + 0x46d, + 0x46f, + 0x471, + 0x473, + 0x475, + 0x477, + 0x479, + 0x47b, + 0x47d, + 0x47f, + 0x481, + 0x48b, + 0x48d, + 0x48f, + 0x491, + 0x493, + 0x495, + 0x497, + 0x499, + 0x49b, + 0x49d, + 0x49f, + 0x4a1, + 0x4a3, + 0x4a5, + 0x4a7, + 0x4a9, + 0x4ab, + 0x4ad, + 0x4af, + 0x4b1, + 0x4b3, + 0x4b5, + 0x4b7, + 0x4b9, + 0x4bb, + 0x4bd, + 0x4bf, + 0x4c2, + 0x4c4, + 0x4c6, + 0x4c8, + 0x4ca, + 0x4cc, + 0x4d1, + 0x4d3, + 0x4d5, + 0x4d7, + 0x4d9, + 0x4db, + 0x4dd, + 0x4df, + 0x4e1, + 0x4e3, + 0x4e5, + 0x4e7, + 0x4e9, + 0x4eb, + 0x4ed, + 0x4ef, + 0x4f1, + 0x4f3, + 0x4f5, + 0x4f7, + 0x4f9, + 0x4fb, + 0x4fd, + 0x4ff, + 0x501, + 0x503, + 0x505, + 0x507, + 0x509, + 0x50b, + 0x50d, + 0x50f, + 0x511, + 0x513, + 0x515, + 0x517, + 0x519, + 0x51b, + 0x51d, + 0x51f, + 0x521, + 0x523, + 0x525, + 0x527, + 0x529, + 0x52b, + 0x52d, + 0x52f, + 0x1e01, + 0x1e03, + 0x1e05, + 0x1e07, + 0x1e09, + 0x1e0b, + 0x1e0d, + 0x1e0f, + 0x1e11, + 0x1e13, + 0x1e15, + 0x1e17, + 0x1e19, + 0x1e1b, + 0x1e1d, + 0x1e1f, + 0x1e21, + 0x1e23, + 0x1e25, + 0x1e27, + 0x1e29, + 0x1e2b, + 0x1e2d, + 0x1e2f, + 0x1e31, + 0x1e33, + 0x1e35, + 0x1e37, + 0x1e39, + 0x1e3b, + 0x1e3d, + 0x1e3f, + 0x1e41, + 0x1e43, + 0x1e45, + 0x1e47, + 0x1e49, + 0x1e4b, + 0x1e4d, + 0x1e4f, + 0x1e51, + 0x1e53, + 0x1e55, + 0x1e57, + 0x1e59, + 0x1e5b, + 0x1e5d, + 0x1e5f, + 0x1e61, + 0x1e63, + 0x1e65, + 0x1e67, + 0x1e69, + 0x1e6b, + 0x1e6d, + 0x1e6f, + 0x1e71, + 0x1e73, + 0x1e75, + 0x1e77, + 0x1e79, + 0x1e7b, + 0x1e7d, + 0x1e7f, + 0x1e81, + 0x1e83, + 0x1e85, + 0x1e87, + 0x1e89, + 0x1e8b, + 0x1e8d, + 0x1e8f, + 0x1e91, + 0x1e93, + 0x1e9f, + 0x1ea1, + 0x1ea3, + 0x1ea5, + 0x1ea7, + 0x1ea9, + 0x1eab, + 0x1ead, + 0x1eaf, + 0x1eb1, + 0x1eb3, + 0x1eb5, + 0x1eb7, + 0x1eb9, + 0x1ebb, + 0x1ebd, + 0x1ebf, + 0x1ec1, + 0x1ec3, + 0x1ec5, + 0x1ec7, + 0x1ec9, + 0x1ecb, + 0x1ecd, + 0x1ecf, + 0x1ed1, + 0x1ed3, + 0x1ed5, + 0x1ed7, + 0x1ed9, + 0x1edb, + 0x1edd, + 0x1edf, + 0x1ee1, + 0x1ee3, + 0x1ee5, + 0x1ee7, + 0x1ee9, + 0x1eeb, + 0x1eed, + 0x1eef, + 0x1ef1, + 0x1ef3, + 0x1ef5, + 0x1ef7, + 0x1ef9, + 0x1efb, + 0x1efd, + 0x1fbe, + 0x210a, + 0x2113, + 0x212f, + 0x2134, + 0x2139, + 0x214e, + 0x2184, + 0x2c61, + 0x2c68, + 0x2c6a, + 0x2c6c, + 0x2c71, + 0x2c81, + 0x2c83, + 0x2c85, + 0x2c87, + 0x2c89, + 0x2c8b, + 0x2c8d, + 0x2c8f, + 0x2c91, + 0x2c93, + 0x2c95, + 0x2c97, + 0x2c99, + 0x2c9b, + 0x2c9d, + 0x2c9f, + 0x2ca1, + 0x2ca3, + 0x2ca5, + 0x2ca7, + 0x2ca9, + 0x2cab, + 0x2cad, + 0x2caf, + 0x2cb1, + 0x2cb3, + 0x2cb5, + 0x2cb7, + 0x2cb9, + 0x2cbb, + 0x2cbd, + 0x2cbf, + 0x2cc1, + 0x2cc3, + 0x2cc5, + 0x2cc7, + 0x2cc9, + 0x2ccb, + 0x2ccd, + 0x2ccf, + 0x2cd1, + 0x2cd3, + 0x2cd5, + 0x2cd7, + 0x2cd9, + 0x2cdb, + 0x2cdd, + 0x2cdf, + 0x2ce1, + 0x2cec, + 0x2cee, + 0x2cf3, + 0x2d27, + 0x2d2d, + 0xa641, + 0xa643, + 0xa645, + 0xa647, + 0xa649, + 0xa64b, + 0xa64d, + 0xa64f, + 0xa651, + 0xa653, + 0xa655, + 0xa657, + 0xa659, + 0xa65b, + 0xa65d, + 0xa65f, + 0xa661, + 0xa663, + 0xa665, + 0xa667, + 0xa669, + 0xa66b, + 0xa66d, + 0xa681, + 0xa683, + 0xa685, + 0xa687, + 0xa689, + 0xa68b, + 0xa68d, + 0xa68f, + 0xa691, + 0xa693, + 0xa695, + 0xa697, + 0xa699, + 0xa69b, + 0xa723, + 0xa725, + 0xa727, + 0xa729, + 0xa72b, + 0xa72d, + 0xa733, + 0xa735, + 0xa737, + 0xa739, + 0xa73b, + 0xa73d, + 0xa73f, + 0xa741, + 0xa743, + 0xa745, + 0xa747, + 0xa749, + 0xa74b, + 0xa74d, + 0xa74f, + 0xa751, + 0xa753, + 0xa755, + 0xa757, + 0xa759, + 0xa75b, + 0xa75d, + 0xa75f, + 0xa761, + 0xa763, + 0xa765, + 0xa767, + 0xa769, + 0xa76b, + 0xa76d, + 0xa76f, + 0xa77a, + 0xa77c, + 0xa77f, + 0xa781, + 0xa783, + 0xa785, + 0xa787, + 0xa78c, + 0xa78e, + 0xa791, + 0xa797, + 0xa799, + 0xa79b, + 0xa79d, + 0xa79f, + 0xa7a1, + 0xa7a3, + 0xa7a5, + 0xa7a7, + 0xa7a9, + 0xa7b5, + 0xa7b7, + 0xa7fa, + 0x1d4bb, + 0x1d7cb +}; + +static Rune ranges[98][2] = { { 0x61, 0x7a }, - { 0xb5, 0xb5 }, { 0xdf, 0xf6 }, { 0xf8, 0xff }, - { 0x101, 0x101 }, - { 0x103, 0x103 }, - { 0x105, 0x105 }, - { 0x107, 0x107 }, - { 0x109, 0x109 }, - { 0x10b, 0x10b }, - { 0x10d, 0x10d }, - { 0x10f, 0x10f }, - { 0x111, 0x111 }, - { 0x113, 0x113 }, - { 0x115, 0x115 }, - { 0x117, 0x117 }, - { 0x119, 0x119 }, - { 0x11b, 0x11b }, - { 0x11d, 0x11d }, - { 0x11f, 0x11f }, - { 0x121, 0x121 }, - { 0x123, 0x123 }, - { 0x125, 0x125 }, - { 0x127, 0x127 }, - { 0x129, 0x129 }, - { 0x12b, 0x12b }, - { 0x12d, 0x12d }, - { 0x12f, 0x12f }, - { 0x131, 0x131 }, - { 0x133, 0x133 }, - { 0x135, 0x135 }, { 0x137, 0x138 }, - { 0x13a, 0x13a }, - { 0x13c, 0x13c }, - { 0x13e, 0x13e }, - { 0x140, 0x140 }, - { 0x142, 0x142 }, - { 0x144, 0x144 }, - { 0x146, 0x146 }, { 0x148, 0x149 }, - { 0x14b, 0x14b }, - { 0x14d, 0x14d }, - { 0x14f, 0x14f }, - { 0x151, 0x151 }, - { 0x153, 0x153 }, - { 0x155, 0x155 }, - { 0x157, 0x157 }, - { 0x159, 0x159 }, - { 0x15b, 0x15b }, - { 0x15d, 0x15d }, - { 0x15f, 0x15f }, - { 0x161, 0x161 }, - { 0x163, 0x163 }, - { 0x165, 0x165 }, - { 0x167, 0x167 }, - { 0x169, 0x169 }, - { 0x16b, 0x16b }, - { 0x16d, 0x16d }, - { 0x16f, 0x16f }, - { 0x171, 0x171 }, - { 0x173, 0x173 }, - { 0x175, 0x175 }, - { 0x177, 0x177 }, - { 0x17a, 0x17a }, - { 0x17c, 0x17c }, { 0x17e, 0x180 }, - { 0x183, 0x183 }, - { 0x185, 0x185 }, - { 0x188, 0x188 }, { 0x18c, 0x18d }, - { 0x192, 0x192 }, - { 0x195, 0x195 }, { 0x199, 0x19b }, - { 0x19e, 0x19e }, - { 0x1a1, 0x1a1 }, - { 0x1a3, 0x1a3 }, - { 0x1a5, 0x1a5 }, - { 0x1a8, 0x1a8 }, { 0x1aa, 0x1ab }, - { 0x1ad, 0x1ad }, - { 0x1b0, 0x1b0 }, - { 0x1b4, 0x1b4 }, - { 0x1b6, 0x1b6 }, { 0x1b9, 0x1ba }, { 0x1bd, 0x1bf }, - { 0x1c6, 0x1c6 }, - { 0x1c9, 0x1c9 }, - { 0x1cc, 0x1cc }, - { 0x1ce, 0x1ce }, - { 0x1d0, 0x1d0 }, - { 0x1d2, 0x1d2 }, - { 0x1d4, 0x1d4 }, - { 0x1d6, 0x1d6 }, - { 0x1d8, 0x1d8 }, - { 0x1da, 0x1da }, { 0x1dc, 0x1dd }, - { 0x1df, 0x1df }, - { 0x1e1, 0x1e1 }, - { 0x1e3, 0x1e3 }, - { 0x1e5, 0x1e5 }, - { 0x1e7, 0x1e7 }, - { 0x1e9, 0x1e9 }, - { 0x1eb, 0x1eb }, - { 0x1ed, 0x1ed }, { 0x1ef, 0x1f0 }, - { 0x1f3, 0x1f3 }, - { 0x1f5, 0x1f5 }, - { 0x1f9, 0x1f9 }, - { 0x1fb, 0x1fb }, - { 0x1fd, 0x1fd }, - { 0x1ff, 0x1ff }, - { 0x201, 0x201 }, - { 0x203, 0x203 }, - { 0x205, 0x205 }, - { 0x207, 0x207 }, - { 0x209, 0x209 }, - { 0x20b, 0x20b }, - { 0x20d, 0x20d }, - { 0x20f, 0x20f }, - { 0x211, 0x211 }, - { 0x213, 0x213 }, - { 0x215, 0x215 }, - { 0x217, 0x217 }, - { 0x219, 0x219 }, - { 0x21b, 0x21b }, - { 0x21d, 0x21d }, - { 0x21f, 0x21f }, - { 0x221, 0x221 }, - { 0x223, 0x223 }, - { 0x225, 0x225 }, - { 0x227, 0x227 }, - { 0x229, 0x229 }, - { 0x22b, 0x22b }, - { 0x22d, 0x22d }, - { 0x22f, 0x22f }, - { 0x231, 0x231 }, { 0x233, 0x239 }, - { 0x23c, 0x23c }, { 0x23f, 0x240 }, - { 0x242, 0x242 }, - { 0x247, 0x247 }, - { 0x249, 0x249 }, - { 0x24b, 0x24b }, - { 0x24d, 0x24d }, { 0x24f, 0x293 }, { 0x295, 0x2af }, - { 0x371, 0x371 }, - { 0x373, 0x373 }, - { 0x377, 0x377 }, { 0x37b, 0x37d }, - { 0x390, 0x390 }, { 0x3ac, 0x3ce }, { 0x3d0, 0x3d1 }, { 0x3d5, 0x3d7 }, - { 0x3d9, 0x3d9 }, - { 0x3db, 0x3db }, - { 0x3dd, 0x3dd }, - { 0x3df, 0x3df }, - { 0x3e1, 0x3e1 }, - { 0x3e3, 0x3e3 }, - { 0x3e5, 0x3e5 }, - { 0x3e7, 0x3e7 }, - { 0x3e9, 0x3e9 }, - { 0x3eb, 0x3eb }, - { 0x3ed, 0x3ed }, { 0x3ef, 0x3f3 }, - { 0x3f5, 0x3f5 }, - { 0x3f8, 0x3f8 }, { 0x3fb, 0x3fc }, { 0x430, 0x45f }, - { 0x461, 0x461 }, - { 0x463, 0x463 }, - { 0x465, 0x465 }, - { 0x467, 0x467 }, - { 0x469, 0x469 }, - { 0x46b, 0x46b }, - { 0x46d, 0x46d }, - { 0x46f, 0x46f }, - { 0x471, 0x471 }, - { 0x473, 0x473 }, - { 0x475, 0x475 }, - { 0x477, 0x477 }, - { 0x479, 0x479 }, - { 0x47b, 0x47b }, - { 0x47d, 0x47d }, - { 0x47f, 0x47f }, - { 0x481, 0x481 }, - { 0x48b, 0x48b }, - { 0x48d, 0x48d }, - { 0x48f, 0x48f }, - { 0x491, 0x491 }, - { 0x493, 0x493 }, - { 0x495, 0x495 }, - { 0x497, 0x497 }, - { 0x499, 0x499 }, - { 0x49b, 0x49b }, - { 0x49d, 0x49d }, - { 0x49f, 0x49f }, - { 0x4a1, 0x4a1 }, - { 0x4a3, 0x4a3 }, - { 0x4a5, 0x4a5 }, - { 0x4a7, 0x4a7 }, - { 0x4a9, 0x4a9 }, - { 0x4ab, 0x4ab }, - { 0x4ad, 0x4ad }, - { 0x4af, 0x4af }, - { 0x4b1, 0x4b1 }, - { 0x4b3, 0x4b3 }, - { 0x4b5, 0x4b5 }, - { 0x4b7, 0x4b7 }, - { 0x4b9, 0x4b9 }, - { 0x4bb, 0x4bb }, - { 0x4bd, 0x4bd }, - { 0x4bf, 0x4bf }, - { 0x4c2, 0x4c2 }, - { 0x4c4, 0x4c4 }, - { 0x4c6, 0x4c6 }, - { 0x4c8, 0x4c8 }, - { 0x4ca, 0x4ca }, - { 0x4cc, 0x4cc }, { 0x4ce, 0x4cf }, - { 0x4d1, 0x4d1 }, - { 0x4d3, 0x4d3 }, - { 0x4d5, 0x4d5 }, - { 0x4d7, 0x4d7 }, - { 0x4d9, 0x4d9 }, - { 0x4db, 0x4db }, - { 0x4dd, 0x4dd }, - { 0x4df, 0x4df }, - { 0x4e1, 0x4e1 }, - { 0x4e3, 0x4e3 }, - { 0x4e5, 0x4e5 }, - { 0x4e7, 0x4e7 }, - { 0x4e9, 0x4e9 }, - { 0x4eb, 0x4eb }, - { 0x4ed, 0x4ed }, - { 0x4ef, 0x4ef }, - { 0x4f1, 0x4f1 }, - { 0x4f3, 0x4f3 }, - { 0x4f5, 0x4f5 }, - { 0x4f7, 0x4f7 }, - { 0x4f9, 0x4f9 }, - { 0x4fb, 0x4fb }, - { 0x4fd, 0x4fd }, - { 0x4ff, 0x4ff }, - { 0x501, 0x501 }, - { 0x503, 0x503 }, - { 0x505, 0x505 }, - { 0x507, 0x507 }, - { 0x509, 0x509 }, - { 0x50b, 0x50b }, - { 0x50d, 0x50d }, - { 0x50f, 0x50f }, - { 0x511, 0x511 }, - { 0x513, 0x513 }, - { 0x515, 0x515 }, - { 0x517, 0x517 }, - { 0x519, 0x519 }, - { 0x51b, 0x51b }, - { 0x51d, 0x51d }, - { 0x51f, 0x51f }, - { 0x521, 0x521 }, - { 0x523, 0x523 }, - { 0x525, 0x525 }, - { 0x527, 0x527 }, - { 0x529, 0x529 }, - { 0x52b, 0x52b }, - { 0x52d, 0x52d }, - { 0x52f, 0x52f }, { 0x561, 0x587 }, { 0x13f8, 0x13fd }, { 0x1d00, 0x1d2b }, { 0x1d6b, 0x1d77 }, { 0x1d79, 0x1d9a }, - { 0x1e01, 0x1e01 }, - { 0x1e03, 0x1e03 }, - { 0x1e05, 0x1e05 }, - { 0x1e07, 0x1e07 }, - { 0x1e09, 0x1e09 }, - { 0x1e0b, 0x1e0b }, - { 0x1e0d, 0x1e0d }, - { 0x1e0f, 0x1e0f }, - { 0x1e11, 0x1e11 }, - { 0x1e13, 0x1e13 }, - { 0x1e15, 0x1e15 }, - { 0x1e17, 0x1e17 }, - { 0x1e19, 0x1e19 }, - { 0x1e1b, 0x1e1b }, - { 0x1e1d, 0x1e1d }, - { 0x1e1f, 0x1e1f }, - { 0x1e21, 0x1e21 }, - { 0x1e23, 0x1e23 }, - { 0x1e25, 0x1e25 }, - { 0x1e27, 0x1e27 }, - { 0x1e29, 0x1e29 }, - { 0x1e2b, 0x1e2b }, - { 0x1e2d, 0x1e2d }, - { 0x1e2f, 0x1e2f }, - { 0x1e31, 0x1e31 }, - { 0x1e33, 0x1e33 }, - { 0x1e35, 0x1e35 }, - { 0x1e37, 0x1e37 }, - { 0x1e39, 0x1e39 }, - { 0x1e3b, 0x1e3b }, - { 0x1e3d, 0x1e3d }, - { 0x1e3f, 0x1e3f }, - { 0x1e41, 0x1e41 }, - { 0x1e43, 0x1e43 }, - { 0x1e45, 0x1e45 }, - { 0x1e47, 0x1e47 }, - { 0x1e49, 0x1e49 }, - { 0x1e4b, 0x1e4b }, - { 0x1e4d, 0x1e4d }, - { 0x1e4f, 0x1e4f }, - { 0x1e51, 0x1e51 }, - { 0x1e53, 0x1e53 }, - { 0x1e55, 0x1e55 }, - { 0x1e57, 0x1e57 }, - { 0x1e59, 0x1e59 }, - { 0x1e5b, 0x1e5b }, - { 0x1e5d, 0x1e5d }, - { 0x1e5f, 0x1e5f }, - { 0x1e61, 0x1e61 }, - { 0x1e63, 0x1e63 }, - { 0x1e65, 0x1e65 }, - { 0x1e67, 0x1e67 }, - { 0x1e69, 0x1e69 }, - { 0x1e6b, 0x1e6b }, - { 0x1e6d, 0x1e6d }, - { 0x1e6f, 0x1e6f }, - { 0x1e71, 0x1e71 }, - { 0x1e73, 0x1e73 }, - { 0x1e75, 0x1e75 }, - { 0x1e77, 0x1e77 }, - { 0x1e79, 0x1e79 }, - { 0x1e7b, 0x1e7b }, - { 0x1e7d, 0x1e7d }, - { 0x1e7f, 0x1e7f }, - { 0x1e81, 0x1e81 }, - { 0x1e83, 0x1e83 }, - { 0x1e85, 0x1e85 }, - { 0x1e87, 0x1e87 }, - { 0x1e89, 0x1e89 }, - { 0x1e8b, 0x1e8b }, - { 0x1e8d, 0x1e8d }, - { 0x1e8f, 0x1e8f }, - { 0x1e91, 0x1e91 }, - { 0x1e93, 0x1e93 }, { 0x1e95, 0x1e9d }, - { 0x1e9f, 0x1e9f }, - { 0x1ea1, 0x1ea1 }, - { 0x1ea3, 0x1ea3 }, - { 0x1ea5, 0x1ea5 }, - { 0x1ea7, 0x1ea7 }, - { 0x1ea9, 0x1ea9 }, - { 0x1eab, 0x1eab }, - { 0x1ead, 0x1ead }, - { 0x1eaf, 0x1eaf }, - { 0x1eb1, 0x1eb1 }, - { 0x1eb3, 0x1eb3 }, - { 0x1eb5, 0x1eb5 }, - { 0x1eb7, 0x1eb7 }, - { 0x1eb9, 0x1eb9 }, - { 0x1ebb, 0x1ebb }, - { 0x1ebd, 0x1ebd }, - { 0x1ebf, 0x1ebf }, - { 0x1ec1, 0x1ec1 }, - { 0x1ec3, 0x1ec3 }, - { 0x1ec5, 0x1ec5 }, - { 0x1ec7, 0x1ec7 }, - { 0x1ec9, 0x1ec9 }, - { 0x1ecb, 0x1ecb }, - { 0x1ecd, 0x1ecd }, - { 0x1ecf, 0x1ecf }, - { 0x1ed1, 0x1ed1 }, - { 0x1ed3, 0x1ed3 }, - { 0x1ed5, 0x1ed5 }, - { 0x1ed7, 0x1ed7 }, - { 0x1ed9, 0x1ed9 }, - { 0x1edb, 0x1edb }, - { 0x1edd, 0x1edd }, - { 0x1edf, 0x1edf }, - { 0x1ee1, 0x1ee1 }, - { 0x1ee3, 0x1ee3 }, - { 0x1ee5, 0x1ee5 }, - { 0x1ee7, 0x1ee7 }, - { 0x1ee9, 0x1ee9 }, - { 0x1eeb, 0x1eeb }, - { 0x1eed, 0x1eed }, - { 0x1eef, 0x1eef }, - { 0x1ef1, 0x1ef1 }, - { 0x1ef3, 0x1ef3 }, - { 0x1ef5, 0x1ef5 }, - { 0x1ef7, 0x1ef7 }, - { 0x1ef9, 0x1ef9 }, - { 0x1efb, 0x1efb }, - { 0x1efd, 0x1efd }, { 0x1eff, 0x1f07 }, { 0x1f10, 0x1f15 }, { 0x1f20, 0x1f27 }, @@ -411,7 +580,6 @@ static Rune lowers[630][2] = { { 0x1fa0, 0x1fa7 }, { 0x1fb0, 0x1fb4 }, { 0x1fb6, 0x1fb7 }, - { 0x1fbe, 0x1fbe }, { 0x1fc2, 0x1fc4 }, { 0x1fc6, 0x1fc7 }, { 0x1fd0, 0x1fd3 }, @@ -419,181 +587,18 @@ static Rune lowers[630][2] = { { 0x1fe0, 0x1fe7 }, { 0x1ff2, 0x1ff4 }, { 0x1ff6, 0x1ff7 }, - { 0x210a, 0x210a }, { 0x210e, 0x210f }, - { 0x2113, 0x2113 }, - { 0x212f, 0x212f }, - { 0x2134, 0x2134 }, - { 0x2139, 0x2139 }, { 0x213c, 0x213d }, { 0x2146, 0x2149 }, - { 0x214e, 0x214e }, - { 0x2184, 0x2184 }, { 0x2c30, 0x2c5e }, - { 0x2c61, 0x2c61 }, { 0x2c65, 0x2c66 }, - { 0x2c68, 0x2c68 }, - { 0x2c6a, 0x2c6a }, - { 0x2c6c, 0x2c6c }, - { 0x2c71, 0x2c71 }, { 0x2c73, 0x2c74 }, { 0x2c76, 0x2c7b }, - { 0x2c81, 0x2c81 }, - { 0x2c83, 0x2c83 }, - { 0x2c85, 0x2c85 }, - { 0x2c87, 0x2c87 }, - { 0x2c89, 0x2c89 }, - { 0x2c8b, 0x2c8b }, - { 0x2c8d, 0x2c8d }, - { 0x2c8f, 0x2c8f }, - { 0x2c91, 0x2c91 }, - { 0x2c93, 0x2c93 }, - { 0x2c95, 0x2c95 }, - { 0x2c97, 0x2c97 }, - { 0x2c99, 0x2c99 }, - { 0x2c9b, 0x2c9b }, - { 0x2c9d, 0x2c9d }, - { 0x2c9f, 0x2c9f }, - { 0x2ca1, 0x2ca1 }, - { 0x2ca3, 0x2ca3 }, - { 0x2ca5, 0x2ca5 }, - { 0x2ca7, 0x2ca7 }, - { 0x2ca9, 0x2ca9 }, - { 0x2cab, 0x2cab }, - { 0x2cad, 0x2cad }, - { 0x2caf, 0x2caf }, - { 0x2cb1, 0x2cb1 }, - { 0x2cb3, 0x2cb3 }, - { 0x2cb5, 0x2cb5 }, - { 0x2cb7, 0x2cb7 }, - { 0x2cb9, 0x2cb9 }, - { 0x2cbb, 0x2cbb }, - { 0x2cbd, 0x2cbd }, - { 0x2cbf, 0x2cbf }, - { 0x2cc1, 0x2cc1 }, - { 0x2cc3, 0x2cc3 }, - { 0x2cc5, 0x2cc5 }, - { 0x2cc7, 0x2cc7 }, - { 0x2cc9, 0x2cc9 }, - { 0x2ccb, 0x2ccb }, - { 0x2ccd, 0x2ccd }, - { 0x2ccf, 0x2ccf }, - { 0x2cd1, 0x2cd1 }, - { 0x2cd3, 0x2cd3 }, - { 0x2cd5, 0x2cd5 }, - { 0x2cd7, 0x2cd7 }, - { 0x2cd9, 0x2cd9 }, - { 0x2cdb, 0x2cdb }, - { 0x2cdd, 0x2cdd }, - { 0x2cdf, 0x2cdf }, - { 0x2ce1, 0x2ce1 }, { 0x2ce3, 0x2ce4 }, - { 0x2cec, 0x2cec }, - { 0x2cee, 0x2cee }, - { 0x2cf3, 0x2cf3 }, { 0x2d00, 0x2d25 }, - { 0x2d27, 0x2d27 }, - { 0x2d2d, 0x2d2d }, - { 0xa641, 0xa641 }, - { 0xa643, 0xa643 }, - { 0xa645, 0xa645 }, - { 0xa647, 0xa647 }, - { 0xa649, 0xa649 }, - { 0xa64b, 0xa64b }, - { 0xa64d, 0xa64d }, - { 0xa64f, 0xa64f }, - { 0xa651, 0xa651 }, - { 0xa653, 0xa653 }, - { 0xa655, 0xa655 }, - { 0xa657, 0xa657 }, - { 0xa659, 0xa659 }, - { 0xa65b, 0xa65b }, - { 0xa65d, 0xa65d }, - { 0xa65f, 0xa65f }, - { 0xa661, 0xa661 }, - { 0xa663, 0xa663 }, - { 0xa665, 0xa665 }, - { 0xa667, 0xa667 }, - { 0xa669, 0xa669 }, - { 0xa66b, 0xa66b }, - { 0xa66d, 0xa66d }, - { 0xa681, 0xa681 }, - { 0xa683, 0xa683 }, - { 0xa685, 0xa685 }, - { 0xa687, 0xa687 }, - { 0xa689, 0xa689 }, - { 0xa68b, 0xa68b }, - { 0xa68d, 0xa68d }, - { 0xa68f, 0xa68f }, - { 0xa691, 0xa691 }, - { 0xa693, 0xa693 }, - { 0xa695, 0xa695 }, - { 0xa697, 0xa697 }, - { 0xa699, 0xa699 }, - { 0xa69b, 0xa69b }, - { 0xa723, 0xa723 }, - { 0xa725, 0xa725 }, - { 0xa727, 0xa727 }, - { 0xa729, 0xa729 }, - { 0xa72b, 0xa72b }, - { 0xa72d, 0xa72d }, { 0xa72f, 0xa731 }, - { 0xa733, 0xa733 }, - { 0xa735, 0xa735 }, - { 0xa737, 0xa737 }, - { 0xa739, 0xa739 }, - { 0xa73b, 0xa73b }, - { 0xa73d, 0xa73d }, - { 0xa73f, 0xa73f }, - { 0xa741, 0xa741 }, - { 0xa743, 0xa743 }, - { 0xa745, 0xa745 }, - { 0xa747, 0xa747 }, - { 0xa749, 0xa749 }, - { 0xa74b, 0xa74b }, - { 0xa74d, 0xa74d }, - { 0xa74f, 0xa74f }, - { 0xa751, 0xa751 }, - { 0xa753, 0xa753 }, - { 0xa755, 0xa755 }, - { 0xa757, 0xa757 }, - { 0xa759, 0xa759 }, - { 0xa75b, 0xa75b }, - { 0xa75d, 0xa75d }, - { 0xa75f, 0xa75f }, - { 0xa761, 0xa761 }, - { 0xa763, 0xa763 }, - { 0xa765, 0xa765 }, - { 0xa767, 0xa767 }, - { 0xa769, 0xa769 }, - { 0xa76b, 0xa76b }, - { 0xa76d, 0xa76d }, - { 0xa76f, 0xa76f }, { 0xa771, 0xa778 }, - { 0xa77a, 0xa77a }, - { 0xa77c, 0xa77c }, - { 0xa77f, 0xa77f }, - { 0xa781, 0xa781 }, - { 0xa783, 0xa783 }, - { 0xa785, 0xa785 }, - { 0xa787, 0xa787 }, - { 0xa78c, 0xa78c }, - { 0xa78e, 0xa78e }, - { 0xa791, 0xa791 }, { 0xa793, 0xa795 }, - { 0xa797, 0xa797 }, - { 0xa799, 0xa799 }, - { 0xa79b, 0xa79b }, - { 0xa79d, 0xa79d }, - { 0xa79f, 0xa79f }, - { 0xa7a1, 0xa7a1 }, - { 0xa7a3, 0xa7a3 }, - { 0xa7a5, 0xa7a5 }, - { 0xa7a7, 0xa7a7 }, - { 0xa7a9, 0xa7a9 }, - { 0xa7b5, 0xa7b5 }, - { 0xa7b7, 0xa7b7 }, - { 0xa7fa, 0xa7fa }, { 0xab30, 0xab5a }, { 0xab60, 0xab65 }, { 0xab70, 0xabbf }, @@ -608,7 +613,6 @@ static Rune lowers[630][2] = { { 0x1d456, 0x1d467 }, { 0x1d482, 0x1d49b }, { 0x1d4b6, 0x1d4b9 }, - { 0x1d4bb, 0x1d4bb }, { 0x1d4bd, 0x1d4c3 }, { 0x1d4c5, 0x1d4cf }, { 0x1d4ea, 0x1d503 }, @@ -629,12 +633,12 @@ static Rune lowers[630][2] = { { 0x1d770, 0x1d788 }, { 0x1d78a, 0x1d78f }, { 0x1d7aa, 0x1d7c2 }, - { 0x1d7c4, 0x1d7c9 }, - { 0x1d7cb, 0x1d7cb } + { 0x1d7c4, 0x1d7c9 } }; extern int runeinrange(const void* a, const void* b); bool islowerrune(Rune ch) { - return (NULL != bsearch(&ch, lowers, 630, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 532, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 98, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/marks.c b/source/utf/marks.c index 1c5a598..83dcc2e 100644 --- a/source/utf/marks.c +++ b/source/utf/marks.c @@ -1,21 +1,65 @@ #include -static Rune marks[236][2] = { +static Rune singles[45] = { + 0x5bf, + 0x5c7, + 0x670, + 0x711, + 0x9bc, + 0x9d7, + 0xa3c, + 0xa51, + 0xa75, + 0xabc, + 0xb3c, + 0xb82, + 0xbd7, + 0xcbc, + 0xd57, + 0xdca, + 0xdd6, + 0xe31, + 0xeb1, + 0xf35, + 0xf37, + 0xf39, + 0xfc6, + 0x108f, + 0x17dd, + 0x18a9, + 0x1a7f, + 0x1ced, + 0x2d7f, + 0xa802, + 0xa806, + 0xa80b, + 0xa9e5, + 0xaa43, + 0xaab0, + 0xaac1, + 0xfb1e, + 0x101fd, + 0x102e0, + 0x10a3f, + 0x11173, + 0x1133c, + 0x11357, + 0x1da75, + 0x1da84 +}; + +static Rune ranges[191][2] = { { 0x300, 0x36f }, { 0x483, 0x489 }, { 0x591, 0x5bd }, - { 0x5bf, 0x5bf }, { 0x5c1, 0x5c2 }, { 0x5c4, 0x5c5 }, - { 0x5c7, 0x5c7 }, { 0x610, 0x61a }, { 0x64b, 0x65f }, - { 0x670, 0x670 }, { 0x6d6, 0x6dc }, { 0x6df, 0x6e4 }, { 0x6e7, 0x6e8 }, { 0x6ea, 0x6ed }, - { 0x711, 0x711 }, { 0x730, 0x74a }, { 0x7a6, 0x7b0 }, { 0x7eb, 0x7f3 }, @@ -30,38 +74,29 @@ static Rune marks[236][2] = { { 0x951, 0x957 }, { 0x962, 0x963 }, { 0x981, 0x983 }, - { 0x9bc, 0x9bc }, { 0x9be, 0x9c4 }, { 0x9c7, 0x9c8 }, { 0x9cb, 0x9cd }, - { 0x9d7, 0x9d7 }, { 0x9e2, 0x9e3 }, { 0xa01, 0xa03 }, - { 0xa3c, 0xa3c }, { 0xa3e, 0xa42 }, { 0xa47, 0xa48 }, { 0xa4b, 0xa4d }, - { 0xa51, 0xa51 }, { 0xa70, 0xa71 }, - { 0xa75, 0xa75 }, { 0xa81, 0xa83 }, - { 0xabc, 0xabc }, { 0xabe, 0xac5 }, { 0xac7, 0xac9 }, { 0xacb, 0xacd }, { 0xae2, 0xae3 }, { 0xb01, 0xb03 }, - { 0xb3c, 0xb3c }, { 0xb3e, 0xb44 }, { 0xb47, 0xb48 }, { 0xb4b, 0xb4d }, { 0xb56, 0xb57 }, { 0xb62, 0xb63 }, - { 0xb82, 0xb82 }, { 0xbbe, 0xbc2 }, { 0xbc6, 0xbc8 }, { 0xbca, 0xbcd }, - { 0xbd7, 0xbd7 }, { 0xc00, 0xc03 }, { 0xc3e, 0xc44 }, { 0xc46, 0xc48 }, @@ -69,7 +104,6 @@ static Rune marks[236][2] = { { 0xc55, 0xc56 }, { 0xc62, 0xc63 }, { 0xc81, 0xc83 }, - { 0xcbc, 0xcbc }, { 0xcbe, 0xcc4 }, { 0xcc6, 0xcc8 }, { 0xcca, 0xccd }, @@ -79,31 +113,22 @@ static Rune marks[236][2] = { { 0xd3e, 0xd44 }, { 0xd46, 0xd48 }, { 0xd4a, 0xd4d }, - { 0xd57, 0xd57 }, { 0xd62, 0xd63 }, { 0xd82, 0xd83 }, - { 0xdca, 0xdca }, { 0xdcf, 0xdd4 }, - { 0xdd6, 0xdd6 }, { 0xdd8, 0xddf }, { 0xdf2, 0xdf3 }, - { 0xe31, 0xe31 }, { 0xe34, 0xe3a }, { 0xe47, 0xe4e }, - { 0xeb1, 0xeb1 }, { 0xeb4, 0xeb9 }, { 0xebb, 0xebc }, { 0xec8, 0xecd }, { 0xf18, 0xf19 }, - { 0xf35, 0xf35 }, - { 0xf37, 0xf37 }, - { 0xf39, 0xf39 }, { 0xf3e, 0xf3f }, { 0xf71, 0xf84 }, { 0xf86, 0xf87 }, { 0xf8d, 0xf97 }, { 0xf99, 0xfbc }, - { 0xfc6, 0xfc6 }, { 0x102b, 0x103e }, { 0x1056, 0x1059 }, { 0x105e, 0x1060 }, @@ -111,7 +136,6 @@ static Rune marks[236][2] = { { 0x1067, 0x106d }, { 0x1071, 0x1074 }, { 0x1082, 0x108d }, - { 0x108f, 0x108f }, { 0x109a, 0x109d }, { 0x135d, 0x135f }, { 0x1712, 0x1714 }, @@ -119,15 +143,12 @@ static Rune marks[236][2] = { { 0x1752, 0x1753 }, { 0x1772, 0x1773 }, { 0x17b4, 0x17d3 }, - { 0x17dd, 0x17dd }, { 0x180b, 0x180d }, - { 0x18a9, 0x18a9 }, { 0x1920, 0x192b }, { 0x1930, 0x193b }, { 0x1a17, 0x1a1b }, { 0x1a55, 0x1a5e }, { 0x1a60, 0x1a7c }, - { 0x1a7f, 0x1a7f }, { 0x1ab0, 0x1abe }, { 0x1b00, 0x1b04 }, { 0x1b34, 0x1b44 }, @@ -138,14 +159,12 @@ static Rune marks[236][2] = { { 0x1c24, 0x1c37 }, { 0x1cd0, 0x1cd2 }, { 0x1cd4, 0x1ce8 }, - { 0x1ced, 0x1ced }, { 0x1cf2, 0x1cf4 }, { 0x1cf8, 0x1cf9 }, { 0x1dc0, 0x1df5 }, { 0x1dfc, 0x1dff }, { 0x20d0, 0x20f0 }, { 0x2cef, 0x2cf1 }, - { 0x2d7f, 0x2d7f }, { 0x2de0, 0x2dff }, { 0x302a, 0x302f }, { 0x3099, 0x309a }, @@ -153,9 +172,6 @@ static Rune marks[236][2] = { { 0xa674, 0xa67d }, { 0xa69e, 0xa69f }, { 0xa6f0, 0xa6f1 }, - { 0xa802, 0xa802 }, - { 0xa806, 0xa806 }, - { 0xa80b, 0xa80b }, { 0xa823, 0xa827 }, { 0xa880, 0xa881 }, { 0xa8b4, 0xa8c4 }, @@ -164,31 +180,23 @@ static Rune marks[236][2] = { { 0xa947, 0xa953 }, { 0xa980, 0xa983 }, { 0xa9b3, 0xa9c0 }, - { 0xa9e5, 0xa9e5 }, { 0xaa29, 0xaa36 }, - { 0xaa43, 0xaa43 }, { 0xaa4c, 0xaa4d }, { 0xaa7b, 0xaa7d }, - { 0xaab0, 0xaab0 }, { 0xaab2, 0xaab4 }, { 0xaab7, 0xaab8 }, { 0xaabe, 0xaabf }, - { 0xaac1, 0xaac1 }, { 0xaaeb, 0xaaef }, { 0xaaf5, 0xaaf6 }, { 0xabe3, 0xabea }, { 0xabec, 0xabed }, - { 0xfb1e, 0xfb1e }, { 0xfe00, 0xfe0f }, { 0xfe20, 0xfe2f }, - { 0x101fd, 0x101fd }, - { 0x102e0, 0x102e0 }, { 0x10376, 0x1037a }, { 0x10a01, 0x10a03 }, { 0x10a05, 0x10a06 }, { 0x10a0c, 0x10a0f }, { 0x10a38, 0x10a3a }, - { 0x10a3f, 0x10a3f }, { 0x10ae5, 0x10ae6 }, { 0x11000, 0x11002 }, { 0x11038, 0x11046 }, @@ -196,18 +204,15 @@ static Rune marks[236][2] = { { 0x110b0, 0x110ba }, { 0x11100, 0x11102 }, { 0x11127, 0x11134 }, - { 0x11173, 0x11173 }, { 0x11180, 0x11182 }, { 0x111b3, 0x111c0 }, { 0x111ca, 0x111cc }, { 0x1122c, 0x11237 }, { 0x112df, 0x112ea }, { 0x11300, 0x11303 }, - { 0x1133c, 0x1133c }, { 0x1133e, 0x11344 }, { 0x11347, 0x11348 }, { 0x1134b, 0x1134d }, - { 0x11357, 0x11357 }, { 0x11362, 0x11363 }, { 0x11366, 0x1136c }, { 0x11370, 0x11374 }, @@ -231,8 +236,6 @@ static Rune marks[236][2] = { { 0x1d242, 0x1d244 }, { 0x1da00, 0x1da36 }, { 0x1da3b, 0x1da6c }, - { 0x1da75, 0x1da75 }, - { 0x1da84, 0x1da84 }, { 0x1da9b, 0x1da9f }, { 0x1daa1, 0x1daaf }, { 0x1e8d0, 0x1e8d6 }, @@ -242,5 +245,6 @@ static Rune marks[236][2] = { extern int runeinrange(const void* a, const void* b); bool ismarkrune(Rune ch) { - return (NULL != bsearch(&ch, marks, 236, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 45, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 191, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/numbers.c b/source/utf/numbers.c index cad341f..707924e 100644 --- a/source/utf/numbers.c +++ b/source/utf/numbers.c @@ -1,9 +1,17 @@ #include -static Rune numbers[111][2] = { +static Rune singles[6] = { + 0xb9, + 0x2070, + 0x2cfd, + 0x3007, + 0x10341, + 0x1034a +}; + +static Rune ranges[105][2] = { { 0x30, 0x39 }, { 0xb2, 0xb3 }, - { 0xb9, 0xb9 }, { 0xbc, 0xbe }, { 0x660, 0x669 }, { 0x6f0, 0x6f9 }, @@ -39,7 +47,6 @@ static Rune numbers[111][2] = { { 0x1bb0, 0x1bb9 }, { 0x1c40, 0x1c49 }, { 0x1c50, 0x1c59 }, - { 0x2070, 0x2070 }, { 0x2074, 0x2079 }, { 0x2080, 0x2089 }, { 0x2150, 0x2182 }, @@ -47,8 +54,6 @@ static Rune numbers[111][2] = { { 0x2460, 0x249b }, { 0x24ea, 0x24ff }, { 0x2776, 0x2793 }, - { 0x2cfd, 0x2cfd }, - { 0x3007, 0x3007 }, { 0x3021, 0x3029 }, { 0x3038, 0x303a }, { 0x3192, 0x3195 }, @@ -72,8 +77,6 @@ static Rune numbers[111][2] = { { 0x1018a, 0x1018b }, { 0x102e1, 0x102fb }, { 0x10320, 0x10323 }, - { 0x10341, 0x10341 }, - { 0x1034a, 0x1034a }, { 0x103d1, 0x103d5 }, { 0x104a0, 0x104a9 }, { 0x10858, 0x1085f }, @@ -117,5 +120,6 @@ static Rune numbers[111][2] = { extern int runeinrange(const void* a, const void* b); bool isnumberrune(Rune ch) { - return (NULL != bsearch(&ch, numbers, 111, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 6, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 105, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/other.c b/source/utf/other.c index bb69974..e6de8bf 100644 --- a/source/utf/other.c +++ b/source/utf/other.c @@ -1,36 +1,40 @@ #include -static Rune other[26][2] = { - { 0xad, 0xad }, +static Rune singles[14] = { + 0xad, + 0x61c, + 0x6dd, + 0x70f, + 0x180e, + 0xd800, + 0xf8ff, + 0xfeff, + 0x110bd, + 0xe0001, + 0xf0000, + 0xffffd, + 0x100000, + 0x10fffd +}; + +static Rune ranges[12][2] = { { 0x600, 0x605 }, - { 0x61c, 0x61c }, - { 0x6dd, 0x6dd }, - { 0x70f, 0x70f }, - { 0x180e, 0x180e }, { 0x200b, 0x200f }, { 0x202a, 0x202e }, { 0x2060, 0x2064 }, { 0x2066, 0x206f }, - { 0xd800, 0xd800 }, { 0xdb7f, 0xdb80 }, { 0xdbff, 0xdc00 }, { 0xdfff, 0xe000 }, - { 0xf8ff, 0xf8ff }, - { 0xfeff, 0xfeff }, { 0xfff9, 0xfffb }, - { 0x110bd, 0x110bd }, { 0x1bca0, 0x1bca3 }, { 0x1d173, 0x1d17a }, - { 0xe0001, 0xe0001 }, - { 0xe0020, 0xe007f }, - { 0xf0000, 0xf0000 }, - { 0xffffd, 0xffffd }, - { 0x100000, 0x100000 }, - { 0x10fffd, 0x10fffd } + { 0xe0020, 0xe007f } }; extern int runeinrange(const void* a, const void* b); bool isotherrune(Rune ch) { - return (NULL != bsearch(&ch, other, 26, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 14, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 12, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/otherletters.c b/source/utf/otherletters.c index 39b91c8..f46e9a7 100644 --- a/source/utf/otherletters.c +++ b/source/utf/otherletters.c @@ -1,55 +1,152 @@ #include -static Rune otherletters[470][2] = { - { 0xaa, 0xaa }, - { 0xba, 0xba }, - { 0x1bb, 0x1bb }, +static Rune singles[116] = { + 0xaa, + 0xba, + 0x1bb, + 0x294, + 0x2ec, + 0x2ee, + 0x374, + 0x37a, + 0x559, + 0x6d5, + 0x6ff, + 0x710, + 0x7b1, + 0x7fa, + 0x81a, + 0x824, + 0x828, + 0x93d, + 0x950, + 0x9b2, + 0x9bd, + 0x9ce, + 0xa5e, + 0xabd, + 0xad0, + 0xaf9, + 0xb3d, + 0xb71, + 0xb83, + 0xb9c, + 0xbd0, + 0xc3d, + 0xcbd, + 0xcde, + 0xd3d, + 0xd4e, + 0xdbd, + 0xe84, + 0xe8a, + 0xe8d, + 0xea5, + 0xea7, + 0xebd, + 0xec6, + 0xf00, + 0x103f, + 0x1061, + 0x108e, + 0x1258, + 0x12c0, + 0x17d7, + 0x17dc, + 0x18aa, + 0x1aa7, + 0x1d78, + 0x2071, + 0x207f, + 0x2d6f, + 0x2e2f, + 0x3400, + 0x4db5, + 0x4e00, + 0x9fd5, + 0xa66e, + 0xa67f, + 0xa770, + 0xa788, + 0xa78f, + 0xa8fb, + 0xa8fd, + 0xa9cf, + 0xaa7a, + 0xaab1, + 0xaac0, + 0xaac2, + 0xac00, + 0xd7a3, + 0xfb1d, + 0xfb3e, + 0x10808, + 0x1083c, + 0x10a00, + 0x11176, + 0x111da, + 0x111dc, + 0x11288, + 0x1133d, + 0x11350, + 0x114c7, + 0x11644, + 0x118ff, + 0x16f50, + 0x1ee24, + 0x1ee27, + 0x1ee39, + 0x1ee3b, + 0x1ee42, + 0x1ee47, + 0x1ee49, + 0x1ee4b, + 0x1ee54, + 0x1ee57, + 0x1ee59, + 0x1ee5b, + 0x1ee5d, + 0x1ee5f, + 0x1ee64, + 0x1ee7e, + 0x20000, + 0x2a6d6, + 0x2a700, + 0x2b734, + 0x2b740, + 0x2b81d, + 0x2b820, + 0x2cea1 +}; + +static Rune ranges[354][2] = { { 0x1c0, 0x1c3 }, - { 0x294, 0x294 }, { 0x2b0, 0x2c1 }, { 0x2c6, 0x2d1 }, { 0x2e0, 0x2e4 }, - { 0x2ec, 0x2ec }, - { 0x2ee, 0x2ee }, - { 0x374, 0x374 }, - { 0x37a, 0x37a }, - { 0x559, 0x559 }, { 0x5d0, 0x5ea }, { 0x5f0, 0x5f2 }, { 0x620, 0x64a }, { 0x66e, 0x66f }, { 0x671, 0x6d3 }, - { 0x6d5, 0x6d5 }, { 0x6e5, 0x6e6 }, { 0x6ee, 0x6ef }, { 0x6fa, 0x6fc }, - { 0x6ff, 0x6ff }, - { 0x710, 0x710 }, { 0x712, 0x72f }, { 0x74d, 0x7a5 }, - { 0x7b1, 0x7b1 }, { 0x7ca, 0x7ea }, { 0x7f4, 0x7f5 }, - { 0x7fa, 0x7fa }, { 0x800, 0x815 }, - { 0x81a, 0x81a }, - { 0x824, 0x824 }, - { 0x828, 0x828 }, { 0x840, 0x858 }, { 0x8a0, 0x8b4 }, { 0x904, 0x939 }, - { 0x93d, 0x93d }, - { 0x950, 0x950 }, { 0x958, 0x961 }, { 0x971, 0x980 }, { 0x985, 0x98c }, { 0x98f, 0x990 }, { 0x993, 0x9a8 }, { 0x9aa, 0x9b0 }, - { 0x9b2, 0x9b2 }, { 0x9b6, 0x9b9 }, - { 0x9bd, 0x9bd }, - { 0x9ce, 0x9ce }, { 0x9dc, 0x9dd }, { 0x9df, 0x9e1 }, { 0x9f0, 0x9f1 }, @@ -61,7 +158,6 @@ static Rune otherletters[470][2] = { { 0xa35, 0xa36 }, { 0xa38, 0xa39 }, { 0xa59, 0xa5c }, - { 0xa5e, 0xa5e }, { 0xa72, 0xa74 }, { 0xa85, 0xa8d }, { 0xa8f, 0xa91 }, @@ -69,36 +165,27 @@ static Rune otherletters[470][2] = { { 0xaaa, 0xab0 }, { 0xab2, 0xab3 }, { 0xab5, 0xab9 }, - { 0xabd, 0xabd }, - { 0xad0, 0xad0 }, { 0xae0, 0xae1 }, - { 0xaf9, 0xaf9 }, { 0xb05, 0xb0c }, { 0xb0f, 0xb10 }, { 0xb13, 0xb28 }, { 0xb2a, 0xb30 }, { 0xb32, 0xb33 }, { 0xb35, 0xb39 }, - { 0xb3d, 0xb3d }, { 0xb5c, 0xb5d }, { 0xb5f, 0xb61 }, - { 0xb71, 0xb71 }, - { 0xb83, 0xb83 }, { 0xb85, 0xb8a }, { 0xb8e, 0xb90 }, { 0xb92, 0xb95 }, { 0xb99, 0xb9a }, - { 0xb9c, 0xb9c }, { 0xb9e, 0xb9f }, { 0xba3, 0xba4 }, { 0xba8, 0xbaa }, { 0xbae, 0xbb9 }, - { 0xbd0, 0xbd0 }, { 0xc05, 0xc0c }, { 0xc0e, 0xc10 }, { 0xc12, 0xc28 }, { 0xc2a, 0xc39 }, - { 0xc3d, 0xc3d }, { 0xc58, 0xc5a }, { 0xc60, 0xc61 }, { 0xc85, 0xc8c }, @@ -106,67 +193,49 @@ static Rune otherletters[470][2] = { { 0xc92, 0xca8 }, { 0xcaa, 0xcb3 }, { 0xcb5, 0xcb9 }, - { 0xcbd, 0xcbd }, - { 0xcde, 0xcde }, { 0xce0, 0xce1 }, { 0xcf1, 0xcf2 }, { 0xd05, 0xd0c }, { 0xd0e, 0xd10 }, { 0xd12, 0xd3a }, - { 0xd3d, 0xd3d }, - { 0xd4e, 0xd4e }, { 0xd5f, 0xd61 }, { 0xd7a, 0xd7f }, { 0xd85, 0xd96 }, { 0xd9a, 0xdb1 }, { 0xdb3, 0xdbb }, - { 0xdbd, 0xdbd }, { 0xdc0, 0xdc6 }, { 0xe01, 0xe30 }, { 0xe32, 0xe33 }, { 0xe40, 0xe46 }, { 0xe81, 0xe82 }, - { 0xe84, 0xe84 }, { 0xe87, 0xe88 }, - { 0xe8a, 0xe8a }, - { 0xe8d, 0xe8d }, { 0xe94, 0xe97 }, { 0xe99, 0xe9f }, { 0xea1, 0xea3 }, - { 0xea5, 0xea5 }, - { 0xea7, 0xea7 }, { 0xeaa, 0xeab }, { 0xead, 0xeb0 }, { 0xeb2, 0xeb3 }, - { 0xebd, 0xebd }, { 0xec0, 0xec4 }, - { 0xec6, 0xec6 }, { 0xedc, 0xedf }, - { 0xf00, 0xf00 }, { 0xf40, 0xf47 }, { 0xf49, 0xf6c }, { 0xf88, 0xf8c }, { 0x1000, 0x102a }, - { 0x103f, 0x103f }, { 0x1050, 0x1055 }, { 0x105a, 0x105d }, - { 0x1061, 0x1061 }, { 0x1065, 0x1066 }, { 0x106e, 0x1070 }, { 0x1075, 0x1081 }, - { 0x108e, 0x108e }, { 0x10d0, 0x10fa }, { 0x10fc, 0x1248 }, { 0x124a, 0x124d }, { 0x1250, 0x1256 }, - { 0x1258, 0x1258 }, { 0x125a, 0x125d }, { 0x1260, 0x1288 }, { 0x128a, 0x128d }, { 0x1290, 0x12b0 }, { 0x12b2, 0x12b5 }, { 0x12b8, 0x12be }, - { 0x12c0, 0x12c0 }, { 0x12c2, 0x12c5 }, { 0x12c8, 0x12d6 }, { 0x12d8, 0x1310 }, @@ -185,11 +254,8 @@ static Rune otherletters[470][2] = { { 0x1760, 0x176c }, { 0x176e, 0x1770 }, { 0x1780, 0x17b3 }, - { 0x17d7, 0x17d7 }, - { 0x17dc, 0x17dc }, { 0x1820, 0x1877 }, { 0x1880, 0x18a8 }, - { 0x18aa, 0x18aa }, { 0x18b0, 0x18f5 }, { 0x1900, 0x191e }, { 0x1950, 0x196d }, @@ -198,7 +264,6 @@ static Rune otherletters[470][2] = { { 0x19b0, 0x19c9 }, { 0x1a00, 0x1a16 }, { 0x1a20, 0x1a54 }, - { 0x1aa7, 0x1aa7 }, { 0x1b05, 0x1b33 }, { 0x1b45, 0x1b4b }, { 0x1b83, 0x1ba0 }, @@ -211,15 +276,11 @@ static Rune otherletters[470][2] = { { 0x1cee, 0x1cf1 }, { 0x1cf5, 0x1cf6 }, { 0x1d2c, 0x1d6a }, - { 0x1d78, 0x1d78 }, { 0x1d9b, 0x1dbf }, - { 0x2071, 0x2071 }, - { 0x207f, 0x207f }, { 0x2090, 0x209c }, { 0x2135, 0x2138 }, { 0x2c7c, 0x2c7d }, { 0x2d30, 0x2d67 }, - { 0x2d6f, 0x2d6f }, { 0x2d80, 0x2d96 }, { 0x2da0, 0x2da6 }, { 0x2da8, 0x2dae }, @@ -229,7 +290,6 @@ static Rune otherletters[470][2] = { { 0x2dc8, 0x2dce }, { 0x2dd0, 0x2dd6 }, { 0x2dd8, 0x2dde }, - { 0x2e2f, 0x2e2f }, { 0x3005, 0x3006 }, { 0x3031, 0x3035 }, { 0x303b, 0x303c }, @@ -241,23 +301,14 @@ static Rune otherletters[470][2] = { { 0x3131, 0x318e }, { 0x31a0, 0x31ba }, { 0x31f0, 0x31ff }, - { 0x3400, 0x3400 }, - { 0x4db5, 0x4db5 }, - { 0x4e00, 0x4e00 }, - { 0x9fd5, 0x9fd5 }, { 0xa000, 0xa48c }, { 0xa4d0, 0xa4fd }, { 0xa500, 0xa60c }, { 0xa610, 0xa61f }, { 0xa62a, 0xa62b }, - { 0xa66e, 0xa66e }, - { 0xa67f, 0xa67f }, { 0xa69c, 0xa69d }, { 0xa6a0, 0xa6e5 }, { 0xa717, 0xa71f }, - { 0xa770, 0xa770 }, - { 0xa788, 0xa788 }, - { 0xa78f, 0xa78f }, { 0xa7f7, 0xa7f9 }, { 0xa7fb, 0xa801 }, { 0xa803, 0xa805 }, @@ -266,13 +317,10 @@ static Rune otherletters[470][2] = { { 0xa840, 0xa873 }, { 0xa882, 0xa8b3 }, { 0xa8f2, 0xa8f7 }, - { 0xa8fb, 0xa8fb }, - { 0xa8fd, 0xa8fd }, { 0xa90a, 0xa925 }, { 0xa930, 0xa946 }, { 0xa960, 0xa97c }, { 0xa984, 0xa9b2 }, - { 0xa9cf, 0xa9cf }, { 0xa9e0, 0xa9e4 }, { 0xa9e6, 0xa9ef }, { 0xa9fa, 0xa9fe }, @@ -280,13 +328,9 @@ static Rune otherletters[470][2] = { { 0xaa40, 0xaa42 }, { 0xaa44, 0xaa4b }, { 0xaa60, 0xaa76 }, - { 0xaa7a, 0xaa7a }, { 0xaa7e, 0xaaaf }, - { 0xaab1, 0xaab1 }, { 0xaab5, 0xaab6 }, { 0xaab9, 0xaabd }, - { 0xaac0, 0xaac0 }, - { 0xaac2, 0xaac2 }, { 0xaadb, 0xaadd }, { 0xaae0, 0xaaea }, { 0xaaf2, 0xaaf4 }, @@ -297,17 +341,13 @@ static Rune otherletters[470][2] = { { 0xab28, 0xab2e }, { 0xab5c, 0xab5f }, { 0xabc0, 0xabe2 }, - { 0xac00, 0xac00 }, - { 0xd7a3, 0xd7a3 }, { 0xd7b0, 0xd7c6 }, { 0xd7cb, 0xd7fb }, { 0xf900, 0xfa6d }, { 0xfa70, 0xfad9 }, - { 0xfb1d, 0xfb1d }, { 0xfb1f, 0xfb28 }, { 0xfb2a, 0xfb36 }, { 0xfb38, 0xfb3c }, - { 0xfb3e, 0xfb3e }, { 0xfb40, 0xfb41 }, { 0xfb43, 0xfb44 }, { 0xfb46, 0xfbb1 }, @@ -345,10 +385,8 @@ static Rune otherletters[470][2] = { { 0x10740, 0x10755 }, { 0x10760, 0x10767 }, { 0x10800, 0x10805 }, - { 0x10808, 0x10808 }, { 0x1080a, 0x10835 }, { 0x10837, 0x10838 }, - { 0x1083c, 0x1083c }, { 0x1083f, 0x10855 }, { 0x10860, 0x10876 }, { 0x10880, 0x1089e }, @@ -358,7 +396,6 @@ static Rune otherletters[470][2] = { { 0x10920, 0x10939 }, { 0x10980, 0x109b7 }, { 0x109be, 0x109bf }, - { 0x10a00, 0x10a00 }, { 0x10a10, 0x10a13 }, { 0x10a15, 0x10a17 }, { 0x10a19, 0x10a33 }, @@ -376,15 +413,11 @@ static Rune otherletters[470][2] = { { 0x110d0, 0x110e8 }, { 0x11103, 0x11126 }, { 0x11150, 0x11172 }, - { 0x11176, 0x11176 }, { 0x11183, 0x111b2 }, { 0x111c1, 0x111c4 }, - { 0x111da, 0x111da }, - { 0x111dc, 0x111dc }, { 0x11200, 0x11211 }, { 0x11213, 0x1122b }, { 0x11280, 0x11286 }, - { 0x11288, 0x11288 }, { 0x1128a, 0x1128d }, { 0x1128f, 0x1129d }, { 0x1129f, 0x112a8 }, @@ -395,19 +428,14 @@ static Rune otherletters[470][2] = { { 0x1132a, 0x11330 }, { 0x11332, 0x11333 }, { 0x11335, 0x11339 }, - { 0x1133d, 0x1133d }, - { 0x11350, 0x11350 }, { 0x1135d, 0x11361 }, { 0x11480, 0x114af }, { 0x114c4, 0x114c5 }, - { 0x114c7, 0x114c7 }, { 0x11580, 0x115ae }, { 0x115d8, 0x115db }, { 0x11600, 0x1162f }, - { 0x11644, 0x11644 }, { 0x11680, 0x116aa }, { 0x11700, 0x11719 }, - { 0x118ff, 0x118ff }, { 0x11ac0, 0x11af8 }, { 0x12000, 0x12399 }, { 0x12480, 0x12543 }, @@ -421,7 +449,6 @@ static Rune otherletters[470][2] = { { 0x16b63, 0x16b77 }, { 0x16b7d, 0x16b8f }, { 0x16f00, 0x16f44 }, - { 0x16f50, 0x16f50 }, { 0x16f93, 0x16f9f }, { 0x1b000, 0x1b001 }, { 0x1bc00, 0x1bc6a }, @@ -432,49 +459,26 @@ static Rune otherletters[470][2] = { { 0x1ee00, 0x1ee03 }, { 0x1ee05, 0x1ee1f }, { 0x1ee21, 0x1ee22 }, - { 0x1ee24, 0x1ee24 }, - { 0x1ee27, 0x1ee27 }, { 0x1ee29, 0x1ee32 }, { 0x1ee34, 0x1ee37 }, - { 0x1ee39, 0x1ee39 }, - { 0x1ee3b, 0x1ee3b }, - { 0x1ee42, 0x1ee42 }, - { 0x1ee47, 0x1ee47 }, - { 0x1ee49, 0x1ee49 }, - { 0x1ee4b, 0x1ee4b }, { 0x1ee4d, 0x1ee4f }, { 0x1ee51, 0x1ee52 }, - { 0x1ee54, 0x1ee54 }, - { 0x1ee57, 0x1ee57 }, - { 0x1ee59, 0x1ee59 }, - { 0x1ee5b, 0x1ee5b }, - { 0x1ee5d, 0x1ee5d }, - { 0x1ee5f, 0x1ee5f }, { 0x1ee61, 0x1ee62 }, - { 0x1ee64, 0x1ee64 }, { 0x1ee67, 0x1ee6a }, { 0x1ee6c, 0x1ee72 }, { 0x1ee74, 0x1ee77 }, { 0x1ee79, 0x1ee7c }, - { 0x1ee7e, 0x1ee7e }, { 0x1ee80, 0x1ee89 }, { 0x1ee8b, 0x1ee9b }, { 0x1eea1, 0x1eea3 }, { 0x1eea5, 0x1eea9 }, { 0x1eeab, 0x1eebb }, - { 0x20000, 0x20000 }, - { 0x2a6d6, 0x2a6d6 }, - { 0x2a700, 0x2a700 }, - { 0x2b734, 0x2b734 }, - { 0x2b740, 0x2b740 }, - { 0x2b81d, 0x2b81d }, - { 0x2b820, 0x2b820 }, - { 0x2cea1, 0x2cea1 }, { 0x2f800, 0x2fa1d } }; extern int runeinrange(const void* a, const void* b); bool isotherletterrune(Rune ch) { - return (NULL != bsearch(&ch, otherletters, 470, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 116, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 354, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/punctuation.c b/source/utf/punctuation.c index 65a4cbc..c6c601f 100644 --- a/source/utf/punctuation.c +++ b/source/utf/punctuation.c @@ -1,56 +1,89 @@ #include -static Rune punctuation[161][2] = { +static Rune singles[55] = { + 0x5f, + 0x7b, + 0x7d, + 0xa1, + 0xa7, + 0xab, + 0xbb, + 0xbf, + 0x37e, + 0x387, + 0x5be, + 0x5c0, + 0x5c3, + 0x5c6, + 0x61b, + 0x6d4, + 0x85e, + 0x970, + 0xaf0, + 0xdf4, + 0xe4f, + 0xf14, + 0xf85, + 0x10fb, + 0x1400, + 0x1cd3, + 0x2d70, + 0x3030, + 0x303d, + 0x30a0, + 0x30fb, + 0xa673, + 0xa67e, + 0xa8fc, + 0xa95f, + 0xabeb, + 0xfe63, + 0xfe68, + 0xff3f, + 0xff5b, + 0xff5d, + 0x1039f, + 0x103d0, + 0x1056f, + 0x10857, + 0x1091f, + 0x1093f, + 0x10a7f, + 0x111cd, + 0x111db, + 0x112a9, + 0x114c6, + 0x16af5, + 0x16b44, + 0x1bc9f +}; + +static Rune ranges[106][2] = { { 0x21, 0x23 }, { 0x25, 0x2a }, { 0x2c, 0x2f }, { 0x3a, 0x3b }, { 0x3f, 0x40 }, { 0x5b, 0x5d }, - { 0x5f, 0x5f }, - { 0x7b, 0x7b }, - { 0x7d, 0x7d }, - { 0xa1, 0xa1 }, - { 0xa7, 0xa7 }, - { 0xab, 0xab }, { 0xb6, 0xb7 }, - { 0xbb, 0xbb }, - { 0xbf, 0xbf }, - { 0x37e, 0x37e }, - { 0x387, 0x387 }, { 0x55a, 0x55f }, { 0x589, 0x58a }, - { 0x5be, 0x5be }, - { 0x5c0, 0x5c0 }, - { 0x5c3, 0x5c3 }, - { 0x5c6, 0x5c6 }, { 0x5f3, 0x5f4 }, { 0x609, 0x60a }, { 0x60c, 0x60d }, - { 0x61b, 0x61b }, { 0x61e, 0x61f }, { 0x66a, 0x66d }, - { 0x6d4, 0x6d4 }, { 0x700, 0x70d }, { 0x7f7, 0x7f9 }, { 0x830, 0x83e }, - { 0x85e, 0x85e }, { 0x964, 0x965 }, - { 0x970, 0x970 }, - { 0xaf0, 0xaf0 }, - { 0xdf4, 0xdf4 }, - { 0xe4f, 0xe4f }, { 0xe5a, 0xe5b }, { 0xf04, 0xf12 }, - { 0xf14, 0xf14 }, { 0xf3a, 0xf3d }, - { 0xf85, 0xf85 }, { 0xfd0, 0xfd4 }, { 0xfd9, 0xfda }, { 0x104a, 0x104f }, - { 0x10fb, 0x10fb }, { 0x1360, 0x1368 }, - { 0x1400, 0x1400 }, { 0x166d, 0x166e }, { 0x169b, 0x169c }, { 0x16eb, 0x16ed }, @@ -67,7 +100,6 @@ static Rune punctuation[161][2] = { { 0x1c3b, 0x1c3f }, { 0x1c7e, 0x1c7f }, { 0x1cc0, 0x1cc7 }, - { 0x1cd3, 0x1cd3 }, { 0x2010, 0x2027 }, { 0x2030, 0x2043 }, { 0x2045, 0x2051 }, @@ -84,39 +116,27 @@ static Rune punctuation[161][2] = { { 0x29fc, 0x29fd }, { 0x2cf9, 0x2cfc }, { 0x2cfe, 0x2cff }, - { 0x2d70, 0x2d70 }, { 0x2e00, 0x2e2e }, { 0x2e30, 0x2e42 }, { 0x3001, 0x3003 }, { 0x3008, 0x3011 }, { 0x3014, 0x301f }, - { 0x3030, 0x3030 }, - { 0x303d, 0x303d }, - { 0x30a0, 0x30a0 }, - { 0x30fb, 0x30fb }, { 0xa4fe, 0xa4ff }, { 0xa60d, 0xa60f }, - { 0xa673, 0xa673 }, - { 0xa67e, 0xa67e }, { 0xa6f2, 0xa6f7 }, { 0xa874, 0xa877 }, { 0xa8ce, 0xa8cf }, { 0xa8f8, 0xa8fa }, - { 0xa8fc, 0xa8fc }, { 0xa92e, 0xa92f }, - { 0xa95f, 0xa95f }, { 0xa9c1, 0xa9cd }, { 0xa9de, 0xa9df }, { 0xaa5c, 0xaa5f }, { 0xaade, 0xaadf }, { 0xaaf0, 0xaaf1 }, - { 0xabeb, 0xabeb }, { 0xfd3e, 0xfd3f }, { 0xfe10, 0xfe19 }, { 0xfe30, 0xfe52 }, { 0xfe54, 0xfe61 }, - { 0xfe63, 0xfe63 }, - { 0xfe68, 0xfe68 }, { 0xfe6a, 0xfe6b }, { 0xff01, 0xff03 }, { 0xff05, 0xff0a }, @@ -124,19 +144,9 @@ static Rune punctuation[161][2] = { { 0xff1a, 0xff1b }, { 0xff1f, 0xff20 }, { 0xff3b, 0xff3d }, - { 0xff3f, 0xff3f }, - { 0xff5b, 0xff5b }, - { 0xff5d, 0xff5d }, { 0xff5f, 0xff65 }, { 0x10100, 0x10102 }, - { 0x1039f, 0x1039f }, - { 0x103d0, 0x103d0 }, - { 0x1056f, 0x1056f }, - { 0x10857, 0x10857 }, - { 0x1091f, 0x1091f }, - { 0x1093f, 0x1093f }, { 0x10a50, 0x10a58 }, - { 0x10a7f, 0x10a7f }, { 0x10af0, 0x10af6 }, { 0x10b39, 0x10b3f }, { 0x10b99, 0x10b9c }, @@ -146,26 +156,20 @@ static Rune punctuation[161][2] = { { 0x11140, 0x11143 }, { 0x11174, 0x11175 }, { 0x111c5, 0x111c9 }, - { 0x111cd, 0x111cd }, - { 0x111db, 0x111db }, { 0x111dd, 0x111df }, { 0x11238, 0x1123d }, - { 0x112a9, 0x112a9 }, - { 0x114c6, 0x114c6 }, { 0x115c1, 0x115d7 }, { 0x11641, 0x11643 }, { 0x1173c, 0x1173e }, { 0x12470, 0x12474 }, { 0x16a6e, 0x16a6f }, - { 0x16af5, 0x16af5 }, { 0x16b37, 0x16b3b }, - { 0x16b44, 0x16b44 }, - { 0x1bc9f, 0x1bc9f }, { 0x1da87, 0x1da8b } }; extern int runeinrange(const void* a, const void* b); bool ispunctuationrune(Rune ch) { - return (NULL != bsearch(&ch, punctuation, 161, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 55, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 106, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/spaces.c b/source/utf/spaces.c index 19aef6e..37a9539 100644 --- a/source/utf/spaces.c +++ b/source/utf/spaces.c @@ -1,20 +1,24 @@ #include -static Rune spaces[10][2] = { +static Rune singles[6] = { + 0x85, + 0xa0, + 0x1680, + 0x202f, + 0x205f, + 0x3000 +}; + +static Rune ranges[4][2] = { { 0x9, 0xd }, { 0x1c, 0x20 }, - { 0x85, 0x85 }, - { 0xa0, 0xa0 }, - { 0x1680, 0x1680 }, { 0x2000, 0x200a }, - { 0x2028, 0x2029 }, - { 0x202f, 0x202f }, - { 0x205f, 0x205f }, - { 0x3000, 0x3000 } + { 0x2028, 0x2029 } }; extern int runeinrange(const void* a, const void* b); bool isspacerune(Rune ch) { - return (NULL != bsearch(&ch, spaces, 10, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 6, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 4, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/symbols.c b/source/utf/symbols.c index 5eb4516..e994b78 100644 --- a/source/utf/symbols.c +++ b/source/utf/symbols.c @@ -1,89 +1,123 @@ #include -static Rune symbols[214][2] = { - { 0x24, 0x24 }, - { 0x2b, 0x2b }, +static Rune singles[70] = { + 0x24, + 0x2b, + 0x5e, + 0x60, + 0x7c, + 0x7e, + 0xac, + 0xb4, + 0xb8, + 0xd7, + 0xf7, + 0x2ed, + 0x375, + 0x3f6, + 0x482, + 0x60b, + 0x6de, + 0x6e9, + 0x7f6, + 0xaf1, + 0xb70, + 0xc7f, + 0xd79, + 0xe3f, + 0xf13, + 0xf34, + 0xf36, + 0xf38, + 0x17db, + 0x1940, + 0x1fbd, + 0x2044, + 0x2052, + 0x2114, + 0x2125, + 0x2127, + 0x2129, + 0x212e, + 0x214f, + 0x3004, + 0x3020, + 0x3250, + 0xab5b, + 0xfb29, + 0xfe62, + 0xfe69, + 0xff04, + 0xff0b, + 0xff3e, + 0xff40, + 0xff5c, + 0xff5e, + 0x1018c, + 0x101a0, + 0x10ac8, + 0x1173f, + 0x16b45, + 0x1bc9c, + 0x1d245, + 0x1d6c1, + 0x1d6db, + 0x1d6fb, + 0x1d715, + 0x1d735, + 0x1d74f, + 0x1d76f, + 0x1d789, + 0x1d7a9, + 0x1d7c3, + 0x1f9c0 +}; + +static Rune ranges[144][2] = { { 0x3c, 0x3e }, - { 0x5e, 0x5e }, - { 0x60, 0x60 }, - { 0x7c, 0x7c }, - { 0x7e, 0x7e }, { 0xa2, 0xa6 }, { 0xa8, 0xa9 }, - { 0xac, 0xac }, { 0xae, 0xb1 }, - { 0xb4, 0xb4 }, - { 0xb8, 0xb8 }, - { 0xd7, 0xd7 }, - { 0xf7, 0xf7 }, { 0x2c2, 0x2c5 }, { 0x2d2, 0x2df }, { 0x2e5, 0x2eb }, - { 0x2ed, 0x2ed }, { 0x2ef, 0x2ff }, - { 0x375, 0x375 }, { 0x384, 0x385 }, - { 0x3f6, 0x3f6 }, - { 0x482, 0x482 }, { 0x58d, 0x58f }, { 0x606, 0x608 }, - { 0x60b, 0x60b }, { 0x60e, 0x60f }, - { 0x6de, 0x6de }, - { 0x6e9, 0x6e9 }, { 0x6fd, 0x6fe }, - { 0x7f6, 0x7f6 }, { 0x9f2, 0x9f3 }, { 0x9fa, 0x9fb }, - { 0xaf1, 0xaf1 }, - { 0xb70, 0xb70 }, { 0xbf3, 0xbfa }, - { 0xc7f, 0xc7f }, - { 0xd79, 0xd79 }, - { 0xe3f, 0xe3f }, { 0xf01, 0xf03 }, - { 0xf13, 0xf13 }, { 0xf15, 0xf17 }, { 0xf1a, 0xf1f }, - { 0xf34, 0xf34 }, - { 0xf36, 0xf36 }, - { 0xf38, 0xf38 }, { 0xfbe, 0xfc5 }, { 0xfc7, 0xfcc }, { 0xfce, 0xfcf }, { 0xfd5, 0xfd8 }, { 0x109e, 0x109f }, { 0x1390, 0x1399 }, - { 0x17db, 0x17db }, - { 0x1940, 0x1940 }, { 0x19de, 0x19ff }, { 0x1b61, 0x1b6a }, { 0x1b74, 0x1b7c }, - { 0x1fbd, 0x1fbd }, { 0x1fbf, 0x1fc1 }, { 0x1fcd, 0x1fcf }, { 0x1fdd, 0x1fdf }, { 0x1fed, 0x1fef }, { 0x1ffd, 0x1ffe }, - { 0x2044, 0x2044 }, - { 0x2052, 0x2052 }, { 0x207a, 0x207c }, { 0x208a, 0x208c }, { 0x20a0, 0x20be }, { 0x2100, 0x2101 }, { 0x2103, 0x2106 }, { 0x2108, 0x2109 }, - { 0x2114, 0x2114 }, { 0x2116, 0x2118 }, { 0x211e, 0x2123 }, - { 0x2125, 0x2125 }, - { 0x2127, 0x2127 }, - { 0x2129, 0x2129 }, - { 0x212e, 0x212e }, { 0x213a, 0x213b }, { 0x2140, 0x2144 }, { 0x214a, 0x214d }, - { 0x214f, 0x214f }, { 0x218a, 0x218b }, { 0x2190, 0x2307 }, { 0x230c, 0x2328 }, @@ -108,9 +142,7 @@ static Rune symbols[214][2] = { { 0x2e9b, 0x2ef3 }, { 0x2f00, 0x2fd5 }, { 0x2ff0, 0x2ffb }, - { 0x3004, 0x3004 }, { 0x3012, 0x3013 }, - { 0x3020, 0x3020 }, { 0x3036, 0x3037 }, { 0x303e, 0x303f }, { 0x309b, 0x309c }, @@ -119,7 +151,6 @@ static Rune symbols[214][2] = { { 0x31c0, 0x31e3 }, { 0x3200, 0x321e }, { 0x322a, 0x3247 }, - { 0x3250, 0x3250 }, { 0x3260, 0x327f }, { 0x328a, 0x32b0 }, { 0x32c0, 0x32fe }, @@ -132,35 +163,19 @@ static Rune symbols[214][2] = { { 0xa828, 0xa82b }, { 0xa836, 0xa839 }, { 0xaa77, 0xaa79 }, - { 0xab5b, 0xab5b }, - { 0xfb29, 0xfb29 }, { 0xfbb2, 0xfbc1 }, { 0xfdfc, 0xfdfd }, - { 0xfe62, 0xfe62 }, { 0xfe64, 0xfe66 }, - { 0xfe69, 0xfe69 }, - { 0xff04, 0xff04 }, - { 0xff0b, 0xff0b }, { 0xff1c, 0xff1e }, - { 0xff3e, 0xff3e }, - { 0xff40, 0xff40 }, - { 0xff5c, 0xff5c }, - { 0xff5e, 0xff5e }, { 0xffe0, 0xffe6 }, { 0xffe8, 0xffee }, { 0xfffc, 0xfffd }, { 0x10137, 0x1013f }, { 0x10179, 0x10189 }, - { 0x1018c, 0x1018c }, { 0x10190, 0x1019b }, - { 0x101a0, 0x101a0 }, { 0x101d0, 0x101fc }, { 0x10877, 0x10878 }, - { 0x10ac8, 0x10ac8 }, - { 0x1173f, 0x1173f }, { 0x16b3c, 0x16b3f }, - { 0x16b45, 0x16b45 }, - { 0x1bc9c, 0x1bc9c }, { 0x1d000, 0x1d0f5 }, { 0x1d100, 0x1d126 }, { 0x1d129, 0x1d164 }, @@ -169,18 +184,7 @@ static Rune symbols[214][2] = { { 0x1d18c, 0x1d1a9 }, { 0x1d1ae, 0x1d1e8 }, { 0x1d200, 0x1d241 }, - { 0x1d245, 0x1d245 }, { 0x1d300, 0x1d356 }, - { 0x1d6c1, 0x1d6c1 }, - { 0x1d6db, 0x1d6db }, - { 0x1d6fb, 0x1d6fb }, - { 0x1d715, 0x1d715 }, - { 0x1d735, 0x1d735 }, - { 0x1d74f, 0x1d74f }, - { 0x1d76f, 0x1d76f }, - { 0x1d789, 0x1d789 }, - { 0x1d7a9, 0x1d7a9 }, - { 0x1d7c3, 0x1d7c3 }, { 0x1d800, 0x1d9ff }, { 0x1da37, 0x1da3a }, { 0x1da6d, 0x1da74 }, @@ -213,12 +217,12 @@ static Rune symbols[214][2] = { { 0x1f860, 0x1f887 }, { 0x1f890, 0x1f8ad }, { 0x1f910, 0x1f918 }, - { 0x1f980, 0x1f984 }, - { 0x1f9c0, 0x1f9c0 } + { 0x1f980, 0x1f984 } }; extern int runeinrange(const void* a, const void* b); bool issymbolrune(Rune ch) { - return (NULL != bsearch(&ch, symbols, 214, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 70, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 144, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/titles.c b/source/utf/titles.c index 56ad1aa..50d5582 100644 --- a/source/utf/titles.c +++ b/source/utf/titles.c @@ -1,20 +1,24 @@ #include -static Rune titles[10][2] = { - { 0x1c5, 0x1c5 }, - { 0x1c8, 0x1c8 }, - { 0x1cb, 0x1cb }, - { 0x1f2, 0x1f2 }, +static Rune singles[7] = { + 0x1c5, + 0x1c8, + 0x1cb, + 0x1f2, + 0x1fbc, + 0x1fcc, + 0x1ffc +}; + +static Rune ranges[3][2] = { { 0x1f88, 0x1f8f }, { 0x1f98, 0x1f9f }, - { 0x1fa8, 0x1faf }, - { 0x1fbc, 0x1fbc }, - { 0x1fcc, 0x1fcc }, - { 0x1ffc, 0x1ffc } + { 0x1fa8, 0x1faf } }; extern int runeinrange(const void* a, const void* b); bool istitlerune(Rune ch) { - return (NULL != bsearch(&ch, titles, 10, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 7, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 3, 2 * sizeof(Rune), &runeinrange))); } diff --git a/source/utf/tolower.c b/source/utf/tolower.c new file mode 100644 index 0000000..767294b --- /dev/null +++ b/source/utf/tolower.c @@ -0,0 +1,1244 @@ +#include + +static Rune mappings[1233][2] = { + { 0x41, 0x61 }, + { 0x42, 0x62 }, + { 0x43, 0x63 }, + { 0x44, 0x64 }, + { 0x45, 0x65 }, + { 0x46, 0x66 }, + { 0x47, 0x67 }, + { 0x48, 0x68 }, + { 0x49, 0x69 }, + { 0x4a, 0x6a }, + { 0x4b, 0x6b }, + { 0x4c, 0x6c }, + { 0x4d, 0x6d }, + { 0x4e, 0x6e }, + { 0x4f, 0x6f }, + { 0x50, 0x70 }, + { 0x51, 0x71 }, + { 0x52, 0x72 }, + { 0x53, 0x73 }, + { 0x54, 0x74 }, + { 0x55, 0x75 }, + { 0x56, 0x76 }, + { 0x57, 0x77 }, + { 0x58, 0x78 }, + { 0x59, 0x79 }, + { 0x5a, 0x7a }, + { 0xc0, 0xe0 }, + { 0xc1, 0xe1 }, + { 0xc2, 0xe2 }, + { 0xc3, 0xe3 }, + { 0xc4, 0xe4 }, + { 0xc5, 0xe5 }, + { 0xc6, 0xe6 }, + { 0xc7, 0xe7 }, + { 0xc8, 0xe8 }, + { 0xc9, 0xe9 }, + { 0xca, 0xea }, + { 0xcb, 0xeb }, + { 0xcc, 0xec }, + { 0xcd, 0xed }, + { 0xce, 0xee }, + { 0xcf, 0xef }, + { 0xd0, 0xf0 }, + { 0xd1, 0xf1 }, + { 0xd2, 0xf2 }, + { 0xd3, 0xf3 }, + { 0xd4, 0xf4 }, + { 0xd5, 0xf5 }, + { 0xd6, 0xf6 }, + { 0xd8, 0xf8 }, + { 0xd9, 0xf9 }, + { 0xda, 0xfa }, + { 0xdb, 0xfb }, + { 0xdc, 0xfc }, + { 0xdd, 0xfd }, + { 0xde, 0xfe }, + { 0x100, 0x101 }, + { 0x102, 0x103 }, + { 0x104, 0x105 }, + { 0x106, 0x107 }, + { 0x108, 0x109 }, + { 0x10a, 0x10b }, + { 0x10c, 0x10d }, + { 0x10e, 0x10f }, + { 0x110, 0x111 }, + { 0x112, 0x113 }, + { 0x114, 0x115 }, + { 0x116, 0x117 }, + { 0x118, 0x119 }, + { 0x11a, 0x11b }, + { 0x11c, 0x11d }, + { 0x11e, 0x11f }, + { 0x120, 0x121 }, + { 0x122, 0x123 }, + { 0x124, 0x125 }, + { 0x126, 0x127 }, + { 0x128, 0x129 }, + { 0x12a, 0x12b }, + { 0x12c, 0x12d }, + { 0x12e, 0x12f }, + { 0x130, 0x69 }, + { 0x132, 0x133 }, + { 0x134, 0x135 }, + { 0x136, 0x137 }, + { 0x139, 0x13a }, + { 0x13b, 0x13c }, + { 0x13d, 0x13e }, + { 0x13f, 0x140 }, + { 0x141, 0x142 }, + { 0x143, 0x144 }, + { 0x145, 0x146 }, + { 0x147, 0x148 }, + { 0x14a, 0x14b }, + { 0x14c, 0x14d }, + { 0x14e, 0x14f }, + { 0x150, 0x151 }, + { 0x152, 0x153 }, + { 0x154, 0x155 }, + { 0x156, 0x157 }, + { 0x158, 0x159 }, + { 0x15a, 0x15b }, + { 0x15c, 0x15d }, + { 0x15e, 0x15f }, + { 0x160, 0x161 }, + { 0x162, 0x163 }, + { 0x164, 0x165 }, + { 0x166, 0x167 }, + { 0x168, 0x169 }, + { 0x16a, 0x16b }, + { 0x16c, 0x16d }, + { 0x16e, 0x16f }, + { 0x170, 0x171 }, + { 0x172, 0x173 }, + { 0x174, 0x175 }, + { 0x176, 0x177 }, + { 0x178, 0xff }, + { 0x179, 0x17a }, + { 0x17b, 0x17c }, + { 0x17d, 0x17e }, + { 0x181, 0x253 }, + { 0x182, 0x183 }, + { 0x184, 0x185 }, + { 0x186, 0x254 }, + { 0x187, 0x188 }, + { 0x189, 0x256 }, + { 0x18a, 0x257 }, + { 0x18b, 0x18c }, + { 0x18e, 0x1dd }, + { 0x18f, 0x259 }, + { 0x190, 0x25b }, + { 0x191, 0x192 }, + { 0x193, 0x260 }, + { 0x194, 0x263 }, + { 0x196, 0x269 }, + { 0x197, 0x268 }, + { 0x198, 0x199 }, + { 0x19c, 0x26f }, + { 0x19d, 0x272 }, + { 0x19f, 0x275 }, + { 0x1a0, 0x1a1 }, + { 0x1a2, 0x1a3 }, + { 0x1a4, 0x1a5 }, + { 0x1a6, 0x280 }, + { 0x1a7, 0x1a8 }, + { 0x1a9, 0x283 }, + { 0x1ac, 0x1ad }, + { 0x1ae, 0x288 }, + { 0x1af, 0x1b0 }, + { 0x1b1, 0x28a }, + { 0x1b2, 0x28b }, + { 0x1b3, 0x1b4 }, + { 0x1b5, 0x1b6 }, + { 0x1b7, 0x292 }, + { 0x1b8, 0x1b9 }, + { 0x1bc, 0x1bd }, + { 0x1c4, 0x1c6 }, + { 0x1c5, 0x1c6 }, + { 0x1c7, 0x1c9 }, + { 0x1c8, 0x1c9 }, + { 0x1ca, 0x1cc }, + { 0x1cb, 0x1cc }, + { 0x1cd, 0x1ce }, + { 0x1cf, 0x1d0 }, + { 0x1d1, 0x1d2 }, + { 0x1d3, 0x1d4 }, + { 0x1d5, 0x1d6 }, + { 0x1d7, 0x1d8 }, + { 0x1d9, 0x1da }, + { 0x1db, 0x1dc }, + { 0x1de, 0x1df }, + { 0x1e0, 0x1e1 }, + { 0x1e2, 0x1e3 }, + { 0x1e4, 0x1e5 }, + { 0x1e6, 0x1e7 }, + { 0x1e8, 0x1e9 }, + { 0x1ea, 0x1eb }, + { 0x1ec, 0x1ed }, + { 0x1ee, 0x1ef }, + { 0x1f1, 0x1f3 }, + { 0x1f2, 0x1f3 }, + { 0x1f4, 0x1f5 }, + { 0x1f6, 0x195 }, + { 0x1f7, 0x1bf }, + { 0x1f8, 0x1f9 }, + { 0x1fa, 0x1fb }, + { 0x1fc, 0x1fd }, + { 0x1fe, 0x1ff }, + { 0x200, 0x201 }, + { 0x202, 0x203 }, + { 0x204, 0x205 }, + { 0x206, 0x207 }, + { 0x208, 0x209 }, + { 0x20a, 0x20b }, + { 0x20c, 0x20d }, + { 0x20e, 0x20f }, + { 0x210, 0x211 }, + { 0x212, 0x213 }, + { 0x214, 0x215 }, + { 0x216, 0x217 }, + { 0x218, 0x219 }, + { 0x21a, 0x21b }, + { 0x21c, 0x21d }, + { 0x21e, 0x21f }, + { 0x220, 0x19e }, + { 0x222, 0x223 }, + { 0x224, 0x225 }, + { 0x226, 0x227 }, + { 0x228, 0x229 }, + { 0x22a, 0x22b }, + { 0x22c, 0x22d }, + { 0x22e, 0x22f }, + { 0x230, 0x231 }, + { 0x232, 0x233 }, + { 0x23a, 0x2c65 }, + { 0x23b, 0x23c }, + { 0x23d, 0x19a }, + { 0x23e, 0x2c66 }, + { 0x241, 0x242 }, + { 0x243, 0x180 }, + { 0x244, 0x289 }, + { 0x245, 0x28c }, + { 0x246, 0x247 }, + { 0x248, 0x249 }, + { 0x24a, 0x24b }, + { 0x24c, 0x24d }, + { 0x24e, 0x24f }, + { 0x370, 0x371 }, + { 0x372, 0x373 }, + { 0x376, 0x377 }, + { 0x37f, 0x3f3 }, + { 0x386, 0x3ac }, + { 0x388, 0x3ad }, + { 0x389, 0x3ae }, + { 0x38a, 0x3af }, + { 0x38c, 0x3cc }, + { 0x38e, 0x3cd }, + { 0x38f, 0x3ce }, + { 0x391, 0x3b1 }, + { 0x392, 0x3b2 }, + { 0x393, 0x3b3 }, + { 0x394, 0x3b4 }, + { 0x395, 0x3b5 }, + { 0x396, 0x3b6 }, + { 0x397, 0x3b7 }, + { 0x398, 0x3b8 }, + { 0x399, 0x3b9 }, + { 0x39a, 0x3ba }, + { 0x39b, 0x3bb }, + { 0x39c, 0x3bc }, + { 0x39d, 0x3bd }, + { 0x39e, 0x3be }, + { 0x39f, 0x3bf }, + { 0x3a0, 0x3c0 }, + { 0x3a1, 0x3c1 }, + { 0x3a3, 0x3c3 }, + { 0x3a4, 0x3c4 }, + { 0x3a5, 0x3c5 }, + { 0x3a6, 0x3c6 }, + { 0x3a7, 0x3c7 }, + { 0x3a8, 0x3c8 }, + { 0x3a9, 0x3c9 }, + { 0x3aa, 0x3ca }, + { 0x3ab, 0x3cb }, + { 0x3cf, 0x3d7 }, + { 0x3d8, 0x3d9 }, + { 0x3da, 0x3db }, + { 0x3dc, 0x3dd }, + { 0x3de, 0x3df }, + { 0x3e0, 0x3e1 }, + { 0x3e2, 0x3e3 }, + { 0x3e4, 0x3e5 }, + { 0x3e6, 0x3e7 }, + { 0x3e8, 0x3e9 }, + { 0x3ea, 0x3eb }, + { 0x3ec, 0x3ed }, + { 0x3ee, 0x3ef }, + { 0x3f4, 0x3b8 }, + { 0x3f7, 0x3f8 }, + { 0x3f9, 0x3f2 }, + { 0x3fa, 0x3fb }, + { 0x3fd, 0x37b }, + { 0x3fe, 0x37c }, + { 0x3ff, 0x37d }, + { 0x400, 0x450 }, + { 0x401, 0x451 }, + { 0x402, 0x452 }, + { 0x403, 0x453 }, + { 0x404, 0x454 }, + { 0x405, 0x455 }, + { 0x406, 0x456 }, + { 0x407, 0x457 }, + { 0x408, 0x458 }, + { 0x409, 0x459 }, + { 0x40a, 0x45a }, + { 0x40b, 0x45b }, + { 0x40c, 0x45c }, + { 0x40d, 0x45d }, + { 0x40e, 0x45e }, + { 0x40f, 0x45f }, + { 0x410, 0x430 }, + { 0x411, 0x431 }, + { 0x412, 0x432 }, + { 0x413, 0x433 }, + { 0x414, 0x434 }, + { 0x415, 0x435 }, + { 0x416, 0x436 }, + { 0x417, 0x437 }, + { 0x418, 0x438 }, + { 0x419, 0x439 }, + { 0x41a, 0x43a }, + { 0x41b, 0x43b }, + { 0x41c, 0x43c }, + { 0x41d, 0x43d }, + { 0x41e, 0x43e }, + { 0x41f, 0x43f }, + { 0x420, 0x440 }, + { 0x421, 0x441 }, + { 0x422, 0x442 }, + { 0x423, 0x443 }, + { 0x424, 0x444 }, + { 0x425, 0x445 }, + { 0x426, 0x446 }, + { 0x427, 0x447 }, + { 0x428, 0x448 }, + { 0x429, 0x449 }, + { 0x42a, 0x44a }, + { 0x42b, 0x44b }, + { 0x42c, 0x44c }, + { 0x42d, 0x44d }, + { 0x42e, 0x44e }, + { 0x42f, 0x44f }, + { 0x460, 0x461 }, + { 0x462, 0x463 }, + { 0x464, 0x465 }, + { 0x466, 0x467 }, + { 0x468, 0x469 }, + { 0x46a, 0x46b }, + { 0x46c, 0x46d }, + { 0x46e, 0x46f }, + { 0x470, 0x471 }, + { 0x472, 0x473 }, + { 0x474, 0x475 }, + { 0x476, 0x477 }, + { 0x478, 0x479 }, + { 0x47a, 0x47b }, + { 0x47c, 0x47d }, + { 0x47e, 0x47f }, + { 0x480, 0x481 }, + { 0x48a, 0x48b }, + { 0x48c, 0x48d }, + { 0x48e, 0x48f }, + { 0x490, 0x491 }, + { 0x492, 0x493 }, + { 0x494, 0x495 }, + { 0x496, 0x497 }, + { 0x498, 0x499 }, + { 0x49a, 0x49b }, + { 0x49c, 0x49d }, + { 0x49e, 0x49f }, + { 0x4a0, 0x4a1 }, + { 0x4a2, 0x4a3 }, + { 0x4a4, 0x4a5 }, + { 0x4a6, 0x4a7 }, + { 0x4a8, 0x4a9 }, + { 0x4aa, 0x4ab }, + { 0x4ac, 0x4ad }, + { 0x4ae, 0x4af }, + { 0x4b0, 0x4b1 }, + { 0x4b2, 0x4b3 }, + { 0x4b4, 0x4b5 }, + { 0x4b6, 0x4b7 }, + { 0x4b8, 0x4b9 }, + { 0x4ba, 0x4bb }, + { 0x4bc, 0x4bd }, + { 0x4be, 0x4bf }, + { 0x4c0, 0x4cf }, + { 0x4c1, 0x4c2 }, + { 0x4c3, 0x4c4 }, + { 0x4c5, 0x4c6 }, + { 0x4c7, 0x4c8 }, + { 0x4c9, 0x4ca }, + { 0x4cb, 0x4cc }, + { 0x4cd, 0x4ce }, + { 0x4d0, 0x4d1 }, + { 0x4d2, 0x4d3 }, + { 0x4d4, 0x4d5 }, + { 0x4d6, 0x4d7 }, + { 0x4d8, 0x4d9 }, + { 0x4da, 0x4db }, + { 0x4dc, 0x4dd }, + { 0x4de, 0x4df }, + { 0x4e0, 0x4e1 }, + { 0x4e2, 0x4e3 }, + { 0x4e4, 0x4e5 }, + { 0x4e6, 0x4e7 }, + { 0x4e8, 0x4e9 }, + { 0x4ea, 0x4eb }, + { 0x4ec, 0x4ed }, + { 0x4ee, 0x4ef }, + { 0x4f0, 0x4f1 }, + { 0x4f2, 0x4f3 }, + { 0x4f4, 0x4f5 }, + { 0x4f6, 0x4f7 }, + { 0x4f8, 0x4f9 }, + { 0x4fa, 0x4fb }, + { 0x4fc, 0x4fd }, + { 0x4fe, 0x4ff }, + { 0x500, 0x501 }, + { 0x502, 0x503 }, + { 0x504, 0x505 }, + { 0x506, 0x507 }, + { 0x508, 0x509 }, + { 0x50a, 0x50b }, + { 0x50c, 0x50d }, + { 0x50e, 0x50f }, + { 0x510, 0x511 }, + { 0x512, 0x513 }, + { 0x514, 0x515 }, + { 0x516, 0x517 }, + { 0x518, 0x519 }, + { 0x51a, 0x51b }, + { 0x51c, 0x51d }, + { 0x51e, 0x51f }, + { 0x520, 0x521 }, + { 0x522, 0x523 }, + { 0x524, 0x525 }, + { 0x526, 0x527 }, + { 0x528, 0x529 }, + { 0x52a, 0x52b }, + { 0x52c, 0x52d }, + { 0x52e, 0x52f }, + { 0x531, 0x561 }, + { 0x532, 0x562 }, + { 0x533, 0x563 }, + { 0x534, 0x564 }, + { 0x535, 0x565 }, + { 0x536, 0x566 }, + { 0x537, 0x567 }, + { 0x538, 0x568 }, + { 0x539, 0x569 }, + { 0x53a, 0x56a }, + { 0x53b, 0x56b }, + { 0x53c, 0x56c }, + { 0x53d, 0x56d }, + { 0x53e, 0x56e }, + { 0x53f, 0x56f }, + { 0x540, 0x570 }, + { 0x541, 0x571 }, + { 0x542, 0x572 }, + { 0x543, 0x573 }, + { 0x544, 0x574 }, + { 0x545, 0x575 }, + { 0x546, 0x576 }, + { 0x547, 0x577 }, + { 0x548, 0x578 }, + { 0x549, 0x579 }, + { 0x54a, 0x57a }, + { 0x54b, 0x57b }, + { 0x54c, 0x57c }, + { 0x54d, 0x57d }, + { 0x54e, 0x57e }, + { 0x54f, 0x57f }, + { 0x550, 0x580 }, + { 0x551, 0x581 }, + { 0x552, 0x582 }, + { 0x553, 0x583 }, + { 0x554, 0x584 }, + { 0x555, 0x585 }, + { 0x556, 0x586 }, + { 0x10a0, 0x2d00 }, + { 0x10a1, 0x2d01 }, + { 0x10a2, 0x2d02 }, + { 0x10a3, 0x2d03 }, + { 0x10a4, 0x2d04 }, + { 0x10a5, 0x2d05 }, + { 0x10a6, 0x2d06 }, + { 0x10a7, 0x2d07 }, + { 0x10a8, 0x2d08 }, + { 0x10a9, 0x2d09 }, + { 0x10aa, 0x2d0a }, + { 0x10ab, 0x2d0b }, + { 0x10ac, 0x2d0c }, + { 0x10ad, 0x2d0d }, + { 0x10ae, 0x2d0e }, + { 0x10af, 0x2d0f }, + { 0x10b0, 0x2d10 }, + { 0x10b1, 0x2d11 }, + { 0x10b2, 0x2d12 }, + { 0x10b3, 0x2d13 }, + { 0x10b4, 0x2d14 }, + { 0x10b5, 0x2d15 }, + { 0x10b6, 0x2d16 }, + { 0x10b7, 0x2d17 }, + { 0x10b8, 0x2d18 }, + { 0x10b9, 0x2d19 }, + { 0x10ba, 0x2d1a }, + { 0x10bb, 0x2d1b }, + { 0x10bc, 0x2d1c }, + { 0x10bd, 0x2d1d }, + { 0x10be, 0x2d1e }, + { 0x10bf, 0x2d1f }, + { 0x10c0, 0x2d20 }, + { 0x10c1, 0x2d21 }, + { 0x10c2, 0x2d22 }, + { 0x10c3, 0x2d23 }, + { 0x10c4, 0x2d24 }, + { 0x10c5, 0x2d25 }, + { 0x10c7, 0x2d27 }, + { 0x10cd, 0x2d2d }, + { 0x13a0, 0xab70 }, + { 0x13a1, 0xab71 }, + { 0x13a2, 0xab72 }, + { 0x13a3, 0xab73 }, + { 0x13a4, 0xab74 }, + { 0x13a5, 0xab75 }, + { 0x13a6, 0xab76 }, + { 0x13a7, 0xab77 }, + { 0x13a8, 0xab78 }, + { 0x13a9, 0xab79 }, + { 0x13aa, 0xab7a }, + { 0x13ab, 0xab7b }, + { 0x13ac, 0xab7c }, + { 0x13ad, 0xab7d }, + { 0x13ae, 0xab7e }, + { 0x13af, 0xab7f }, + { 0x13b0, 0xab80 }, + { 0x13b1, 0xab81 }, + { 0x13b2, 0xab82 }, + { 0x13b3, 0xab83 }, + { 0x13b4, 0xab84 }, + { 0x13b5, 0xab85 }, + { 0x13b6, 0xab86 }, + { 0x13b7, 0xab87 }, + { 0x13b8, 0xab88 }, + { 0x13b9, 0xab89 }, + { 0x13ba, 0xab8a }, + { 0x13bb, 0xab8b }, + { 0x13bc, 0xab8c }, + { 0x13bd, 0xab8d }, + { 0x13be, 0xab8e }, + { 0x13bf, 0xab8f }, + { 0x13c0, 0xab90 }, + { 0x13c1, 0xab91 }, + { 0x13c2, 0xab92 }, + { 0x13c3, 0xab93 }, + { 0x13c4, 0xab94 }, + { 0x13c5, 0xab95 }, + { 0x13c6, 0xab96 }, + { 0x13c7, 0xab97 }, + { 0x13c8, 0xab98 }, + { 0x13c9, 0xab99 }, + { 0x13ca, 0xab9a }, + { 0x13cb, 0xab9b }, + { 0x13cc, 0xab9c }, + { 0x13cd, 0xab9d }, + { 0x13ce, 0xab9e }, + { 0x13cf, 0xab9f }, + { 0x13d0, 0xaba0 }, + { 0x13d1, 0xaba1 }, + { 0x13d2, 0xaba2 }, + { 0x13d3, 0xaba3 }, + { 0x13d4, 0xaba4 }, + { 0x13d5, 0xaba5 }, + { 0x13d6, 0xaba6 }, + { 0x13d7, 0xaba7 }, + { 0x13d8, 0xaba8 }, + { 0x13d9, 0xaba9 }, + { 0x13da, 0xabaa }, + { 0x13db, 0xabab }, + { 0x13dc, 0xabac }, + { 0x13dd, 0xabad }, + { 0x13de, 0xabae }, + { 0x13df, 0xabaf }, + { 0x13e0, 0xabb0 }, + { 0x13e1, 0xabb1 }, + { 0x13e2, 0xabb2 }, + { 0x13e3, 0xabb3 }, + { 0x13e4, 0xabb4 }, + { 0x13e5, 0xabb5 }, + { 0x13e6, 0xabb6 }, + { 0x13e7, 0xabb7 }, + { 0x13e8, 0xabb8 }, + { 0x13e9, 0xabb9 }, + { 0x13ea, 0xabba }, + { 0x13eb, 0xabbb }, + { 0x13ec, 0xabbc }, + { 0x13ed, 0xabbd }, + { 0x13ee, 0xabbe }, + { 0x13ef, 0xabbf }, + { 0x13f0, 0x13f8 }, + { 0x13f1, 0x13f9 }, + { 0x13f2, 0x13fa }, + { 0x13f3, 0x13fb }, + { 0x13f4, 0x13fc }, + { 0x13f5, 0x13fd }, + { 0x1e00, 0x1e01 }, + { 0x1e02, 0x1e03 }, + { 0x1e04, 0x1e05 }, + { 0x1e06, 0x1e07 }, + { 0x1e08, 0x1e09 }, + { 0x1e0a, 0x1e0b }, + { 0x1e0c, 0x1e0d }, + { 0x1e0e, 0x1e0f }, + { 0x1e10, 0x1e11 }, + { 0x1e12, 0x1e13 }, + { 0x1e14, 0x1e15 }, + { 0x1e16, 0x1e17 }, + { 0x1e18, 0x1e19 }, + { 0x1e1a, 0x1e1b }, + { 0x1e1c, 0x1e1d }, + { 0x1e1e, 0x1e1f }, + { 0x1e20, 0x1e21 }, + { 0x1e22, 0x1e23 }, + { 0x1e24, 0x1e25 }, + { 0x1e26, 0x1e27 }, + { 0x1e28, 0x1e29 }, + { 0x1e2a, 0x1e2b }, + { 0x1e2c, 0x1e2d }, + { 0x1e2e, 0x1e2f }, + { 0x1e30, 0x1e31 }, + { 0x1e32, 0x1e33 }, + { 0x1e34, 0x1e35 }, + { 0x1e36, 0x1e37 }, + { 0x1e38, 0x1e39 }, + { 0x1e3a, 0x1e3b }, + { 0x1e3c, 0x1e3d }, + { 0x1e3e, 0x1e3f }, + { 0x1e40, 0x1e41 }, + { 0x1e42, 0x1e43 }, + { 0x1e44, 0x1e45 }, + { 0x1e46, 0x1e47 }, + { 0x1e48, 0x1e49 }, + { 0x1e4a, 0x1e4b }, + { 0x1e4c, 0x1e4d }, + { 0x1e4e, 0x1e4f }, + { 0x1e50, 0x1e51 }, + { 0x1e52, 0x1e53 }, + { 0x1e54, 0x1e55 }, + { 0x1e56, 0x1e57 }, + { 0x1e58, 0x1e59 }, + { 0x1e5a, 0x1e5b }, + { 0x1e5c, 0x1e5d }, + { 0x1e5e, 0x1e5f }, + { 0x1e60, 0x1e61 }, + { 0x1e62, 0x1e63 }, + { 0x1e64, 0x1e65 }, + { 0x1e66, 0x1e67 }, + { 0x1e68, 0x1e69 }, + { 0x1e6a, 0x1e6b }, + { 0x1e6c, 0x1e6d }, + { 0x1e6e, 0x1e6f }, + { 0x1e70, 0x1e71 }, + { 0x1e72, 0x1e73 }, + { 0x1e74, 0x1e75 }, + { 0x1e76, 0x1e77 }, + { 0x1e78, 0x1e79 }, + { 0x1e7a, 0x1e7b }, + { 0x1e7c, 0x1e7d }, + { 0x1e7e, 0x1e7f }, + { 0x1e80, 0x1e81 }, + { 0x1e82, 0x1e83 }, + { 0x1e84, 0x1e85 }, + { 0x1e86, 0x1e87 }, + { 0x1e88, 0x1e89 }, + { 0x1e8a, 0x1e8b }, + { 0x1e8c, 0x1e8d }, + { 0x1e8e, 0x1e8f }, + { 0x1e90, 0x1e91 }, + { 0x1e92, 0x1e93 }, + { 0x1e94, 0x1e95 }, + { 0x1e9e, 0xdf }, + { 0x1ea0, 0x1ea1 }, + { 0x1ea2, 0x1ea3 }, + { 0x1ea4, 0x1ea5 }, + { 0x1ea6, 0x1ea7 }, + { 0x1ea8, 0x1ea9 }, + { 0x1eaa, 0x1eab }, + { 0x1eac, 0x1ead }, + { 0x1eae, 0x1eaf }, + { 0x1eb0, 0x1eb1 }, + { 0x1eb2, 0x1eb3 }, + { 0x1eb4, 0x1eb5 }, + { 0x1eb6, 0x1eb7 }, + { 0x1eb8, 0x1eb9 }, + { 0x1eba, 0x1ebb }, + { 0x1ebc, 0x1ebd }, + { 0x1ebe, 0x1ebf }, + { 0x1ec0, 0x1ec1 }, + { 0x1ec2, 0x1ec3 }, + { 0x1ec4, 0x1ec5 }, + { 0x1ec6, 0x1ec7 }, + { 0x1ec8, 0x1ec9 }, + { 0x1eca, 0x1ecb }, + { 0x1ecc, 0x1ecd }, + { 0x1ece, 0x1ecf }, + { 0x1ed0, 0x1ed1 }, + { 0x1ed2, 0x1ed3 }, + { 0x1ed4, 0x1ed5 }, + { 0x1ed6, 0x1ed7 }, + { 0x1ed8, 0x1ed9 }, + { 0x1eda, 0x1edb }, + { 0x1edc, 0x1edd }, + { 0x1ede, 0x1edf }, + { 0x1ee0, 0x1ee1 }, + { 0x1ee2, 0x1ee3 }, + { 0x1ee4, 0x1ee5 }, + { 0x1ee6, 0x1ee7 }, + { 0x1ee8, 0x1ee9 }, + { 0x1eea, 0x1eeb }, + { 0x1eec, 0x1eed }, + { 0x1eee, 0x1eef }, + { 0x1ef0, 0x1ef1 }, + { 0x1ef2, 0x1ef3 }, + { 0x1ef4, 0x1ef5 }, + { 0x1ef6, 0x1ef7 }, + { 0x1ef8, 0x1ef9 }, + { 0x1efa, 0x1efb }, + { 0x1efc, 0x1efd }, + { 0x1efe, 0x1eff }, + { 0x1f08, 0x1f00 }, + { 0x1f09, 0x1f01 }, + { 0x1f0a, 0x1f02 }, + { 0x1f0b, 0x1f03 }, + { 0x1f0c, 0x1f04 }, + { 0x1f0d, 0x1f05 }, + { 0x1f0e, 0x1f06 }, + { 0x1f0f, 0x1f07 }, + { 0x1f18, 0x1f10 }, + { 0x1f19, 0x1f11 }, + { 0x1f1a, 0x1f12 }, + { 0x1f1b, 0x1f13 }, + { 0x1f1c, 0x1f14 }, + { 0x1f1d, 0x1f15 }, + { 0x1f28, 0x1f20 }, + { 0x1f29, 0x1f21 }, + { 0x1f2a, 0x1f22 }, + { 0x1f2b, 0x1f23 }, + { 0x1f2c, 0x1f24 }, + { 0x1f2d, 0x1f25 }, + { 0x1f2e, 0x1f26 }, + { 0x1f2f, 0x1f27 }, + { 0x1f38, 0x1f30 }, + { 0x1f39, 0x1f31 }, + { 0x1f3a, 0x1f32 }, + { 0x1f3b, 0x1f33 }, + { 0x1f3c, 0x1f34 }, + { 0x1f3d, 0x1f35 }, + { 0x1f3e, 0x1f36 }, + { 0x1f3f, 0x1f37 }, + { 0x1f48, 0x1f40 }, + { 0x1f49, 0x1f41 }, + { 0x1f4a, 0x1f42 }, + { 0x1f4b, 0x1f43 }, + { 0x1f4c, 0x1f44 }, + { 0x1f4d, 0x1f45 }, + { 0x1f59, 0x1f51 }, + { 0x1f5b, 0x1f53 }, + { 0x1f5d, 0x1f55 }, + { 0x1f5f, 0x1f57 }, + { 0x1f68, 0x1f60 }, + { 0x1f69, 0x1f61 }, + { 0x1f6a, 0x1f62 }, + { 0x1f6b, 0x1f63 }, + { 0x1f6c, 0x1f64 }, + { 0x1f6d, 0x1f65 }, + { 0x1f6e, 0x1f66 }, + { 0x1f6f, 0x1f67 }, + { 0x1f88, 0x1f80 }, + { 0x1f89, 0x1f81 }, + { 0x1f8a, 0x1f82 }, + { 0x1f8b, 0x1f83 }, + { 0x1f8c, 0x1f84 }, + { 0x1f8d, 0x1f85 }, + { 0x1f8e, 0x1f86 }, + { 0x1f8f, 0x1f87 }, + { 0x1f98, 0x1f90 }, + { 0x1f99, 0x1f91 }, + { 0x1f9a, 0x1f92 }, + { 0x1f9b, 0x1f93 }, + { 0x1f9c, 0x1f94 }, + { 0x1f9d, 0x1f95 }, + { 0x1f9e, 0x1f96 }, + { 0x1f9f, 0x1f97 }, + { 0x1fa8, 0x1fa0 }, + { 0x1fa9, 0x1fa1 }, + { 0x1faa, 0x1fa2 }, + { 0x1fab, 0x1fa3 }, + { 0x1fac, 0x1fa4 }, + { 0x1fad, 0x1fa5 }, + { 0x1fae, 0x1fa6 }, + { 0x1faf, 0x1fa7 }, + { 0x1fb8, 0x1fb0 }, + { 0x1fb9, 0x1fb1 }, + { 0x1fba, 0x1f70 }, + { 0x1fbb, 0x1f71 }, + { 0x1fbc, 0x1fb3 }, + { 0x1fc8, 0x1f72 }, + { 0x1fc9, 0x1f73 }, + { 0x1fca, 0x1f74 }, + { 0x1fcb, 0x1f75 }, + { 0x1fcc, 0x1fc3 }, + { 0x1fd8, 0x1fd0 }, + { 0x1fd9, 0x1fd1 }, + { 0x1fda, 0x1f76 }, + { 0x1fdb, 0x1f77 }, + { 0x1fe8, 0x1fe0 }, + { 0x1fe9, 0x1fe1 }, + { 0x1fea, 0x1f7a }, + { 0x1feb, 0x1f7b }, + { 0x1fec, 0x1fe5 }, + { 0x1ff8, 0x1f78 }, + { 0x1ff9, 0x1f79 }, + { 0x1ffa, 0x1f7c }, + { 0x1ffb, 0x1f7d }, + { 0x1ffc, 0x1ff3 }, + { 0x2126, 0x3c9 }, + { 0x212a, 0x6b }, + { 0x212b, 0xe5 }, + { 0x2132, 0x214e }, + { 0x2160, 0x2170 }, + { 0x2161, 0x2171 }, + { 0x2162, 0x2172 }, + { 0x2163, 0x2173 }, + { 0x2164, 0x2174 }, + { 0x2165, 0x2175 }, + { 0x2166, 0x2176 }, + { 0x2167, 0x2177 }, + { 0x2168, 0x2178 }, + { 0x2169, 0x2179 }, + { 0x216a, 0x217a }, + { 0x216b, 0x217b }, + { 0x216c, 0x217c }, + { 0x216d, 0x217d }, + { 0x216e, 0x217e }, + { 0x216f, 0x217f }, + { 0x2183, 0x2184 }, + { 0x24b6, 0x24d0 }, + { 0x24b7, 0x24d1 }, + { 0x24b8, 0x24d2 }, + { 0x24b9, 0x24d3 }, + { 0x24ba, 0x24d4 }, + { 0x24bb, 0x24d5 }, + { 0x24bc, 0x24d6 }, + { 0x24bd, 0x24d7 }, + { 0x24be, 0x24d8 }, + { 0x24bf, 0x24d9 }, + { 0x24c0, 0x24da }, + { 0x24c1, 0x24db }, + { 0x24c2, 0x24dc }, + { 0x24c3, 0x24dd }, + { 0x24c4, 0x24de }, + { 0x24c5, 0x24df }, + { 0x24c6, 0x24e0 }, + { 0x24c7, 0x24e1 }, + { 0x24c8, 0x24e2 }, + { 0x24c9, 0x24e3 }, + { 0x24ca, 0x24e4 }, + { 0x24cb, 0x24e5 }, + { 0x24cc, 0x24e6 }, + { 0x24cd, 0x24e7 }, + { 0x24ce, 0x24e8 }, + { 0x24cf, 0x24e9 }, + { 0x2c00, 0x2c30 }, + { 0x2c01, 0x2c31 }, + { 0x2c02, 0x2c32 }, + { 0x2c03, 0x2c33 }, + { 0x2c04, 0x2c34 }, + { 0x2c05, 0x2c35 }, + { 0x2c06, 0x2c36 }, + { 0x2c07, 0x2c37 }, + { 0x2c08, 0x2c38 }, + { 0x2c09, 0x2c39 }, + { 0x2c0a, 0x2c3a }, + { 0x2c0b, 0x2c3b }, + { 0x2c0c, 0x2c3c }, + { 0x2c0d, 0x2c3d }, + { 0x2c0e, 0x2c3e }, + { 0x2c0f, 0x2c3f }, + { 0x2c10, 0x2c40 }, + { 0x2c11, 0x2c41 }, + { 0x2c12, 0x2c42 }, + { 0x2c13, 0x2c43 }, + { 0x2c14, 0x2c44 }, + { 0x2c15, 0x2c45 }, + { 0x2c16, 0x2c46 }, + { 0x2c17, 0x2c47 }, + { 0x2c18, 0x2c48 }, + { 0x2c19, 0x2c49 }, + { 0x2c1a, 0x2c4a }, + { 0x2c1b, 0x2c4b }, + { 0x2c1c, 0x2c4c }, + { 0x2c1d, 0x2c4d }, + { 0x2c1e, 0x2c4e }, + { 0x2c1f, 0x2c4f }, + { 0x2c20, 0x2c50 }, + { 0x2c21, 0x2c51 }, + { 0x2c22, 0x2c52 }, + { 0x2c23, 0x2c53 }, + { 0x2c24, 0x2c54 }, + { 0x2c25, 0x2c55 }, + { 0x2c26, 0x2c56 }, + { 0x2c27, 0x2c57 }, + { 0x2c28, 0x2c58 }, + { 0x2c29, 0x2c59 }, + { 0x2c2a, 0x2c5a }, + { 0x2c2b, 0x2c5b }, + { 0x2c2c, 0x2c5c }, + { 0x2c2d, 0x2c5d }, + { 0x2c2e, 0x2c5e }, + { 0x2c60, 0x2c61 }, + { 0x2c62, 0x26b }, + { 0x2c63, 0x1d7d }, + { 0x2c64, 0x27d }, + { 0x2c67, 0x2c68 }, + { 0x2c69, 0x2c6a }, + { 0x2c6b, 0x2c6c }, + { 0x2c6d, 0x251 }, + { 0x2c6e, 0x271 }, + { 0x2c6f, 0x250 }, + { 0x2c70, 0x252 }, + { 0x2c72, 0x2c73 }, + { 0x2c75, 0x2c76 }, + { 0x2c7e, 0x23f }, + { 0x2c7f, 0x240 }, + { 0x2c80, 0x2c81 }, + { 0x2c82, 0x2c83 }, + { 0x2c84, 0x2c85 }, + { 0x2c86, 0x2c87 }, + { 0x2c88, 0x2c89 }, + { 0x2c8a, 0x2c8b }, + { 0x2c8c, 0x2c8d }, + { 0x2c8e, 0x2c8f }, + { 0x2c90, 0x2c91 }, + { 0x2c92, 0x2c93 }, + { 0x2c94, 0x2c95 }, + { 0x2c96, 0x2c97 }, + { 0x2c98, 0x2c99 }, + { 0x2c9a, 0x2c9b }, + { 0x2c9c, 0x2c9d }, + { 0x2c9e, 0x2c9f }, + { 0x2ca0, 0x2ca1 }, + { 0x2ca2, 0x2ca3 }, + { 0x2ca4, 0x2ca5 }, + { 0x2ca6, 0x2ca7 }, + { 0x2ca8, 0x2ca9 }, + { 0x2caa, 0x2cab }, + { 0x2cac, 0x2cad }, + { 0x2cae, 0x2caf }, + { 0x2cb0, 0x2cb1 }, + { 0x2cb2, 0x2cb3 }, + { 0x2cb4, 0x2cb5 }, + { 0x2cb6, 0x2cb7 }, + { 0x2cb8, 0x2cb9 }, + { 0x2cba, 0x2cbb }, + { 0x2cbc, 0x2cbd }, + { 0x2cbe, 0x2cbf }, + { 0x2cc0, 0x2cc1 }, + { 0x2cc2, 0x2cc3 }, + { 0x2cc4, 0x2cc5 }, + { 0x2cc6, 0x2cc7 }, + { 0x2cc8, 0x2cc9 }, + { 0x2cca, 0x2ccb }, + { 0x2ccc, 0x2ccd }, + { 0x2cce, 0x2ccf }, + { 0x2cd0, 0x2cd1 }, + { 0x2cd2, 0x2cd3 }, + { 0x2cd4, 0x2cd5 }, + { 0x2cd6, 0x2cd7 }, + { 0x2cd8, 0x2cd9 }, + { 0x2cda, 0x2cdb }, + { 0x2cdc, 0x2cdd }, + { 0x2cde, 0x2cdf }, + { 0x2ce0, 0x2ce1 }, + { 0x2ce2, 0x2ce3 }, + { 0x2ceb, 0x2cec }, + { 0x2ced, 0x2cee }, + { 0x2cf2, 0x2cf3 }, + { 0xa640, 0xa641 }, + { 0xa642, 0xa643 }, + { 0xa644, 0xa645 }, + { 0xa646, 0xa647 }, + { 0xa648, 0xa649 }, + { 0xa64a, 0xa64b }, + { 0xa64c, 0xa64d }, + { 0xa64e, 0xa64f }, + { 0xa650, 0xa651 }, + { 0xa652, 0xa653 }, + { 0xa654, 0xa655 }, + { 0xa656, 0xa657 }, + { 0xa658, 0xa659 }, + { 0xa65a, 0xa65b }, + { 0xa65c, 0xa65d }, + { 0xa65e, 0xa65f }, + { 0xa660, 0xa661 }, + { 0xa662, 0xa663 }, + { 0xa664, 0xa665 }, + { 0xa666, 0xa667 }, + { 0xa668, 0xa669 }, + { 0xa66a, 0xa66b }, + { 0xa66c, 0xa66d }, + { 0xa680, 0xa681 }, + { 0xa682, 0xa683 }, + { 0xa684, 0xa685 }, + { 0xa686, 0xa687 }, + { 0xa688, 0xa689 }, + { 0xa68a, 0xa68b }, + { 0xa68c, 0xa68d }, + { 0xa68e, 0xa68f }, + { 0xa690, 0xa691 }, + { 0xa692, 0xa693 }, + { 0xa694, 0xa695 }, + { 0xa696, 0xa697 }, + { 0xa698, 0xa699 }, + { 0xa69a, 0xa69b }, + { 0xa722, 0xa723 }, + { 0xa724, 0xa725 }, + { 0xa726, 0xa727 }, + { 0xa728, 0xa729 }, + { 0xa72a, 0xa72b }, + { 0xa72c, 0xa72d }, + { 0xa72e, 0xa72f }, + { 0xa732, 0xa733 }, + { 0xa734, 0xa735 }, + { 0xa736, 0xa737 }, + { 0xa738, 0xa739 }, + { 0xa73a, 0xa73b }, + { 0xa73c, 0xa73d }, + { 0xa73e, 0xa73f }, + { 0xa740, 0xa741 }, + { 0xa742, 0xa743 }, + { 0xa744, 0xa745 }, + { 0xa746, 0xa747 }, + { 0xa748, 0xa749 }, + { 0xa74a, 0xa74b }, + { 0xa74c, 0xa74d }, + { 0xa74e, 0xa74f }, + { 0xa750, 0xa751 }, + { 0xa752, 0xa753 }, + { 0xa754, 0xa755 }, + { 0xa756, 0xa757 }, + { 0xa758, 0xa759 }, + { 0xa75a, 0xa75b }, + { 0xa75c, 0xa75d }, + { 0xa75e, 0xa75f }, + { 0xa760, 0xa761 }, + { 0xa762, 0xa763 }, + { 0xa764, 0xa765 }, + { 0xa766, 0xa767 }, + { 0xa768, 0xa769 }, + { 0xa76a, 0xa76b }, + { 0xa76c, 0xa76d }, + { 0xa76e, 0xa76f }, + { 0xa779, 0xa77a }, + { 0xa77b, 0xa77c }, + { 0xa77d, 0x1d79 }, + { 0xa77e, 0xa77f }, + { 0xa780, 0xa781 }, + { 0xa782, 0xa783 }, + { 0xa784, 0xa785 }, + { 0xa786, 0xa787 }, + { 0xa78b, 0xa78c }, + { 0xa78d, 0x265 }, + { 0xa790, 0xa791 }, + { 0xa792, 0xa793 }, + { 0xa796, 0xa797 }, + { 0xa798, 0xa799 }, + { 0xa79a, 0xa79b }, + { 0xa79c, 0xa79d }, + { 0xa79e, 0xa79f }, + { 0xa7a0, 0xa7a1 }, + { 0xa7a2, 0xa7a3 }, + { 0xa7a4, 0xa7a5 }, + { 0xa7a6, 0xa7a7 }, + { 0xa7a8, 0xa7a9 }, + { 0xa7aa, 0x266 }, + { 0xa7ab, 0x25c }, + { 0xa7ac, 0x261 }, + { 0xa7ad, 0x26c }, + { 0xa7b0, 0x29e }, + { 0xa7b1, 0x287 }, + { 0xa7b2, 0x29d }, + { 0xa7b3, 0xab53 }, + { 0xa7b4, 0xa7b5 }, + { 0xa7b6, 0xa7b7 }, + { 0xff21, 0xff41 }, + { 0xff22, 0xff42 }, + { 0xff23, 0xff43 }, + { 0xff24, 0xff44 }, + { 0xff25, 0xff45 }, + { 0xff26, 0xff46 }, + { 0xff27, 0xff47 }, + { 0xff28, 0xff48 }, + { 0xff29, 0xff49 }, + { 0xff2a, 0xff4a }, + { 0xff2b, 0xff4b }, + { 0xff2c, 0xff4c }, + { 0xff2d, 0xff4d }, + { 0xff2e, 0xff4e }, + { 0xff2f, 0xff4f }, + { 0xff30, 0xff50 }, + { 0xff31, 0xff51 }, + { 0xff32, 0xff52 }, + { 0xff33, 0xff53 }, + { 0xff34, 0xff54 }, + { 0xff35, 0xff55 }, + { 0xff36, 0xff56 }, + { 0xff37, 0xff57 }, + { 0xff38, 0xff58 }, + { 0xff39, 0xff59 }, + { 0xff3a, 0xff5a }, + { 0x10400, 0x10428 }, + { 0x10401, 0x10429 }, + { 0x10402, 0x1042a }, + { 0x10403, 0x1042b }, + { 0x10404, 0x1042c }, + { 0x10405, 0x1042d }, + { 0x10406, 0x1042e }, + { 0x10407, 0x1042f }, + { 0x10408, 0x10430 }, + { 0x10409, 0x10431 }, + { 0x1040a, 0x10432 }, + { 0x1040b, 0x10433 }, + { 0x1040c, 0x10434 }, + { 0x1040d, 0x10435 }, + { 0x1040e, 0x10436 }, + { 0x1040f, 0x10437 }, + { 0x10410, 0x10438 }, + { 0x10411, 0x10439 }, + { 0x10412, 0x1043a }, + { 0x10413, 0x1043b }, + { 0x10414, 0x1043c }, + { 0x10415, 0x1043d }, + { 0x10416, 0x1043e }, + { 0x10417, 0x1043f }, + { 0x10418, 0x10440 }, + { 0x10419, 0x10441 }, + { 0x1041a, 0x10442 }, + { 0x1041b, 0x10443 }, + { 0x1041c, 0x10444 }, + { 0x1041d, 0x10445 }, + { 0x1041e, 0x10446 }, + { 0x1041f, 0x10447 }, + { 0x10420, 0x10448 }, + { 0x10421, 0x10449 }, + { 0x10422, 0x1044a }, + { 0x10423, 0x1044b }, + { 0x10424, 0x1044c }, + { 0x10425, 0x1044d }, + { 0x10426, 0x1044e }, + { 0x10427, 0x1044f }, + { 0x10c80, 0x10cc0 }, + { 0x10c81, 0x10cc1 }, + { 0x10c82, 0x10cc2 }, + { 0x10c83, 0x10cc3 }, + { 0x10c84, 0x10cc4 }, + { 0x10c85, 0x10cc5 }, + { 0x10c86, 0x10cc6 }, + { 0x10c87, 0x10cc7 }, + { 0x10c88, 0x10cc8 }, + { 0x10c89, 0x10cc9 }, + { 0x10c8a, 0x10cca }, + { 0x10c8b, 0x10ccb }, + { 0x10c8c, 0x10ccc }, + { 0x10c8d, 0x10ccd }, + { 0x10c8e, 0x10cce }, + { 0x10c8f, 0x10ccf }, + { 0x10c90, 0x10cd0 }, + { 0x10c91, 0x10cd1 }, + { 0x10c92, 0x10cd2 }, + { 0x10c93, 0x10cd3 }, + { 0x10c94, 0x10cd4 }, + { 0x10c95, 0x10cd5 }, + { 0x10c96, 0x10cd6 }, + { 0x10c97, 0x10cd7 }, + { 0x10c98, 0x10cd8 }, + { 0x10c99, 0x10cd9 }, + { 0x10c9a, 0x10cda }, + { 0x10c9b, 0x10cdb }, + { 0x10c9c, 0x10cdc }, + { 0x10c9d, 0x10cdd }, + { 0x10c9e, 0x10cde }, + { 0x10c9f, 0x10cdf }, + { 0x10ca0, 0x10ce0 }, + { 0x10ca1, 0x10ce1 }, + { 0x10ca2, 0x10ce2 }, + { 0x10ca3, 0x10ce3 }, + { 0x10ca4, 0x10ce4 }, + { 0x10ca5, 0x10ce5 }, + { 0x10ca6, 0x10ce6 }, + { 0x10ca7, 0x10ce7 }, + { 0x10ca8, 0x10ce8 }, + { 0x10ca9, 0x10ce9 }, + { 0x10caa, 0x10cea }, + { 0x10cab, 0x10ceb }, + { 0x10cac, 0x10cec }, + { 0x10cad, 0x10ced }, + { 0x10cae, 0x10cee }, + { 0x10caf, 0x10cef }, + { 0x10cb0, 0x10cf0 }, + { 0x10cb1, 0x10cf1 }, + { 0x10cb2, 0x10cf2 }, + { 0x118a0, 0x118c0 }, + { 0x118a1, 0x118c1 }, + { 0x118a2, 0x118c2 }, + { 0x118a3, 0x118c3 }, + { 0x118a4, 0x118c4 }, + { 0x118a5, 0x118c5 }, + { 0x118a6, 0x118c6 }, + { 0x118a7, 0x118c7 }, + { 0x118a8, 0x118c8 }, + { 0x118a9, 0x118c9 }, + { 0x118aa, 0x118ca }, + { 0x118ab, 0x118cb }, + { 0x118ac, 0x118cc }, + { 0x118ad, 0x118cd }, + { 0x118ae, 0x118ce }, + { 0x118af, 0x118cf }, + { 0x118b0, 0x118d0 }, + { 0x118b1, 0x118d1 }, + { 0x118b2, 0x118d2 }, + { 0x118b3, 0x118d3 }, + { 0x118b4, 0x118d4 }, + { 0x118b5, 0x118d5 }, + { 0x118b6, 0x118d6 }, + { 0x118b7, 0x118d7 }, + { 0x118b8, 0x118d8 }, + { 0x118b9, 0x118d9 }, + { 0x118ba, 0x118da }, + { 0x118bb, 0x118db }, + { 0x118bc, 0x118dc }, + { 0x118bd, 0x118dd }, + { 0x118be, 0x118de }, + { 0x118bf, 0x118df }, +}; + +extern int runeinrange(const void* a, const void* b); + +Rune tolowerrune(Rune ch) { + Rune* to = bsearch(&ch, mappings, 1233, 2 * sizeof(Rune), &runeinrange); + return (to == NULL) ? ch : to[1]; +} diff --git a/source/utf/totitle.c b/source/utf/totitle.c new file mode 100644 index 0000000..023dc7f --- /dev/null +++ b/source/utf/totitle.c @@ -0,0 +1,1256 @@ +#include + +static Rune mappings[1245][2] = { + { 0x61, 0x41 }, + { 0x62, 0x42 }, + { 0x63, 0x43 }, + { 0x64, 0x44 }, + { 0x65, 0x45 }, + { 0x66, 0x46 }, + { 0x67, 0x47 }, + { 0x68, 0x48 }, + { 0x69, 0x49 }, + { 0x6a, 0x4a }, + { 0x6b, 0x4b }, + { 0x6c, 0x4c }, + { 0x6d, 0x4d }, + { 0x6e, 0x4e }, + { 0x6f, 0x4f }, + { 0x70, 0x50 }, + { 0x71, 0x51 }, + { 0x72, 0x52 }, + { 0x73, 0x53 }, + { 0x74, 0x54 }, + { 0x75, 0x55 }, + { 0x76, 0x56 }, + { 0x77, 0x57 }, + { 0x78, 0x58 }, + { 0x79, 0x59 }, + { 0x7a, 0x5a }, + { 0xb5, 0x39c }, + { 0xe0, 0xc0 }, + { 0xe1, 0xc1 }, + { 0xe2, 0xc2 }, + { 0xe3, 0xc3 }, + { 0xe4, 0xc4 }, + { 0xe5, 0xc5 }, + { 0xe6, 0xc6 }, + { 0xe7, 0xc7 }, + { 0xe8, 0xc8 }, + { 0xe9, 0xc9 }, + { 0xea, 0xca }, + { 0xeb, 0xcb }, + { 0xec, 0xcc }, + { 0xed, 0xcd }, + { 0xee, 0xce }, + { 0xef, 0xcf }, + { 0xf0, 0xd0 }, + { 0xf1, 0xd1 }, + { 0xf2, 0xd2 }, + { 0xf3, 0xd3 }, + { 0xf4, 0xd4 }, + { 0xf5, 0xd5 }, + { 0xf6, 0xd6 }, + { 0xf8, 0xd8 }, + { 0xf9, 0xd9 }, + { 0xfa, 0xda }, + { 0xfb, 0xdb }, + { 0xfc, 0xdc }, + { 0xfd, 0xdd }, + { 0xfe, 0xde }, + { 0xff, 0x178 }, + { 0x101, 0x100 }, + { 0x103, 0x102 }, + { 0x105, 0x104 }, + { 0x107, 0x106 }, + { 0x109, 0x108 }, + { 0x10b, 0x10a }, + { 0x10d, 0x10c }, + { 0x10f, 0x10e }, + { 0x111, 0x110 }, + { 0x113, 0x112 }, + { 0x115, 0x114 }, + { 0x117, 0x116 }, + { 0x119, 0x118 }, + { 0x11b, 0x11a }, + { 0x11d, 0x11c }, + { 0x11f, 0x11e }, + { 0x121, 0x120 }, + { 0x123, 0x122 }, + { 0x125, 0x124 }, + { 0x127, 0x126 }, + { 0x129, 0x128 }, + { 0x12b, 0x12a }, + { 0x12d, 0x12c }, + { 0x12f, 0x12e }, + { 0x131, 0x49 }, + { 0x133, 0x132 }, + { 0x135, 0x134 }, + { 0x137, 0x136 }, + { 0x13a, 0x139 }, + { 0x13c, 0x13b }, + { 0x13e, 0x13d }, + { 0x140, 0x13f }, + { 0x142, 0x141 }, + { 0x144, 0x143 }, + { 0x146, 0x145 }, + { 0x148, 0x147 }, + { 0x14b, 0x14a }, + { 0x14d, 0x14c }, + { 0x14f, 0x14e }, + { 0x151, 0x150 }, + { 0x153, 0x152 }, + { 0x155, 0x154 }, + { 0x157, 0x156 }, + { 0x159, 0x158 }, + { 0x15b, 0x15a }, + { 0x15d, 0x15c }, + { 0x15f, 0x15e }, + { 0x161, 0x160 }, + { 0x163, 0x162 }, + { 0x165, 0x164 }, + { 0x167, 0x166 }, + { 0x169, 0x168 }, + { 0x16b, 0x16a }, + { 0x16d, 0x16c }, + { 0x16f, 0x16e }, + { 0x171, 0x170 }, + { 0x173, 0x172 }, + { 0x175, 0x174 }, + { 0x177, 0x176 }, + { 0x17a, 0x179 }, + { 0x17c, 0x17b }, + { 0x17e, 0x17d }, + { 0x17f, 0x53 }, + { 0x180, 0x243 }, + { 0x183, 0x182 }, + { 0x185, 0x184 }, + { 0x188, 0x187 }, + { 0x18c, 0x18b }, + { 0x192, 0x191 }, + { 0x195, 0x1f6 }, + { 0x199, 0x198 }, + { 0x19a, 0x23d }, + { 0x19e, 0x220 }, + { 0x1a1, 0x1a0 }, + { 0x1a3, 0x1a2 }, + { 0x1a5, 0x1a4 }, + { 0x1a8, 0x1a7 }, + { 0x1ad, 0x1ac }, + { 0x1b0, 0x1af }, + { 0x1b4, 0x1b3 }, + { 0x1b6, 0x1b5 }, + { 0x1b9, 0x1b8 }, + { 0x1bd, 0x1bc }, + { 0x1bf, 0x1f7 }, + { 0x1c4, 0x1c5 }, + { 0x1c5, 0x1c5 }, + { 0x1c6, 0x1c5 }, + { 0x1c7, 0x1c8 }, + { 0x1c8, 0x1c8 }, + { 0x1c9, 0x1c8 }, + { 0x1ca, 0x1cb }, + { 0x1cb, 0x1cb }, + { 0x1cc, 0x1cb }, + { 0x1ce, 0x1cd }, + { 0x1d0, 0x1cf }, + { 0x1d2, 0x1d1 }, + { 0x1d4, 0x1d3 }, + { 0x1d6, 0x1d5 }, + { 0x1d8, 0x1d7 }, + { 0x1da, 0x1d9 }, + { 0x1dc, 0x1db }, + { 0x1dd, 0x18e }, + { 0x1df, 0x1de }, + { 0x1e1, 0x1e0 }, + { 0x1e3, 0x1e2 }, + { 0x1e5, 0x1e4 }, + { 0x1e7, 0x1e6 }, + { 0x1e9, 0x1e8 }, + { 0x1eb, 0x1ea }, + { 0x1ed, 0x1ec }, + { 0x1ef, 0x1ee }, + { 0x1f1, 0x1f2 }, + { 0x1f2, 0x1f2 }, + { 0x1f3, 0x1f2 }, + { 0x1f5, 0x1f4 }, + { 0x1f9, 0x1f8 }, + { 0x1fb, 0x1fa }, + { 0x1fd, 0x1fc }, + { 0x1ff, 0x1fe }, + { 0x201, 0x200 }, + { 0x203, 0x202 }, + { 0x205, 0x204 }, + { 0x207, 0x206 }, + { 0x209, 0x208 }, + { 0x20b, 0x20a }, + { 0x20d, 0x20c }, + { 0x20f, 0x20e }, + { 0x211, 0x210 }, + { 0x213, 0x212 }, + { 0x215, 0x214 }, + { 0x217, 0x216 }, + { 0x219, 0x218 }, + { 0x21b, 0x21a }, + { 0x21d, 0x21c }, + { 0x21f, 0x21e }, + { 0x223, 0x222 }, + { 0x225, 0x224 }, + { 0x227, 0x226 }, + { 0x229, 0x228 }, + { 0x22b, 0x22a }, + { 0x22d, 0x22c }, + { 0x22f, 0x22e }, + { 0x231, 0x230 }, + { 0x233, 0x232 }, + { 0x23c, 0x23b }, + { 0x23f, 0x2c7e }, + { 0x240, 0x2c7f }, + { 0x242, 0x241 }, + { 0x247, 0x246 }, + { 0x249, 0x248 }, + { 0x24b, 0x24a }, + { 0x24d, 0x24c }, + { 0x24f, 0x24e }, + { 0x250, 0x2c6f }, + { 0x251, 0x2c6d }, + { 0x252, 0x2c70 }, + { 0x253, 0x181 }, + { 0x254, 0x186 }, + { 0x256, 0x189 }, + { 0x257, 0x18a }, + { 0x259, 0x18f }, + { 0x25b, 0x190 }, + { 0x25c, 0xa7ab }, + { 0x260, 0x193 }, + { 0x261, 0xa7ac }, + { 0x263, 0x194 }, + { 0x265, 0xa78d }, + { 0x266, 0xa7aa }, + { 0x268, 0x197 }, + { 0x269, 0x196 }, + { 0x26b, 0x2c62 }, + { 0x26c, 0xa7ad }, + { 0x26f, 0x19c }, + { 0x271, 0x2c6e }, + { 0x272, 0x19d }, + { 0x275, 0x19f }, + { 0x27d, 0x2c64 }, + { 0x280, 0x1a6 }, + { 0x283, 0x1a9 }, + { 0x287, 0xa7b1 }, + { 0x288, 0x1ae }, + { 0x289, 0x244 }, + { 0x28a, 0x1b1 }, + { 0x28b, 0x1b2 }, + { 0x28c, 0x245 }, + { 0x292, 0x1b7 }, + { 0x29d, 0xa7b2 }, + { 0x29e, 0xa7b0 }, + { 0x345, 0x399 }, + { 0x371, 0x370 }, + { 0x373, 0x372 }, + { 0x377, 0x376 }, + { 0x37b, 0x3fd }, + { 0x37c, 0x3fe }, + { 0x37d, 0x3ff }, + { 0x3ac, 0x386 }, + { 0x3ad, 0x388 }, + { 0x3ae, 0x389 }, + { 0x3af, 0x38a }, + { 0x3b1, 0x391 }, + { 0x3b2, 0x392 }, + { 0x3b3, 0x393 }, + { 0x3b4, 0x394 }, + { 0x3b5, 0x395 }, + { 0x3b6, 0x396 }, + { 0x3b7, 0x397 }, + { 0x3b8, 0x398 }, + { 0x3b9, 0x399 }, + { 0x3ba, 0x39a }, + { 0x3bb, 0x39b }, + { 0x3bc, 0x39c }, + { 0x3bd, 0x39d }, + { 0x3be, 0x39e }, + { 0x3bf, 0x39f }, + { 0x3c0, 0x3a0 }, + { 0x3c1, 0x3a1 }, + { 0x3c2, 0x3a3 }, + { 0x3c3, 0x3a3 }, + { 0x3c4, 0x3a4 }, + { 0x3c5, 0x3a5 }, + { 0x3c6, 0x3a6 }, + { 0x3c7, 0x3a7 }, + { 0x3c8, 0x3a8 }, + { 0x3c9, 0x3a9 }, + { 0x3ca, 0x3aa }, + { 0x3cb, 0x3ab }, + { 0x3cc, 0x38c }, + { 0x3cd, 0x38e }, + { 0x3ce, 0x38f }, + { 0x3d0, 0x392 }, + { 0x3d1, 0x398 }, + { 0x3d5, 0x3a6 }, + { 0x3d6, 0x3a0 }, + { 0x3d7, 0x3cf }, + { 0x3d9, 0x3d8 }, + { 0x3db, 0x3da }, + { 0x3dd, 0x3dc }, + { 0x3df, 0x3de }, + { 0x3e1, 0x3e0 }, + { 0x3e3, 0x3e2 }, + { 0x3e5, 0x3e4 }, + { 0x3e7, 0x3e6 }, + { 0x3e9, 0x3e8 }, + { 0x3eb, 0x3ea }, + { 0x3ed, 0x3ec }, + { 0x3ef, 0x3ee }, + { 0x3f0, 0x39a }, + { 0x3f1, 0x3a1 }, + { 0x3f2, 0x3f9 }, + { 0x3f3, 0x37f }, + { 0x3f5, 0x395 }, + { 0x3f8, 0x3f7 }, + { 0x3fb, 0x3fa }, + { 0x430, 0x410 }, + { 0x431, 0x411 }, + { 0x432, 0x412 }, + { 0x433, 0x413 }, + { 0x434, 0x414 }, + { 0x435, 0x415 }, + { 0x436, 0x416 }, + { 0x437, 0x417 }, + { 0x438, 0x418 }, + { 0x439, 0x419 }, + { 0x43a, 0x41a }, + { 0x43b, 0x41b }, + { 0x43c, 0x41c }, + { 0x43d, 0x41d }, + { 0x43e, 0x41e }, + { 0x43f, 0x41f }, + { 0x440, 0x420 }, + { 0x441, 0x421 }, + { 0x442, 0x422 }, + { 0x443, 0x423 }, + { 0x444, 0x424 }, + { 0x445, 0x425 }, + { 0x446, 0x426 }, + { 0x447, 0x427 }, + { 0x448, 0x428 }, + { 0x449, 0x429 }, + { 0x44a, 0x42a }, + { 0x44b, 0x42b }, + { 0x44c, 0x42c }, + { 0x44d, 0x42d }, + { 0x44e, 0x42e }, + { 0x44f, 0x42f }, + { 0x450, 0x400 }, + { 0x451, 0x401 }, + { 0x452, 0x402 }, + { 0x453, 0x403 }, + { 0x454, 0x404 }, + { 0x455, 0x405 }, + { 0x456, 0x406 }, + { 0x457, 0x407 }, + { 0x458, 0x408 }, + { 0x459, 0x409 }, + { 0x45a, 0x40a }, + { 0x45b, 0x40b }, + { 0x45c, 0x40c }, + { 0x45d, 0x40d }, + { 0x45e, 0x40e }, + { 0x45f, 0x40f }, + { 0x461, 0x460 }, + { 0x463, 0x462 }, + { 0x465, 0x464 }, + { 0x467, 0x466 }, + { 0x469, 0x468 }, + { 0x46b, 0x46a }, + { 0x46d, 0x46c }, + { 0x46f, 0x46e }, + { 0x471, 0x470 }, + { 0x473, 0x472 }, + { 0x475, 0x474 }, + { 0x477, 0x476 }, + { 0x479, 0x478 }, + { 0x47b, 0x47a }, + { 0x47d, 0x47c }, + { 0x47f, 0x47e }, + { 0x481, 0x480 }, + { 0x48b, 0x48a }, + { 0x48d, 0x48c }, + { 0x48f, 0x48e }, + { 0x491, 0x490 }, + { 0x493, 0x492 }, + { 0x495, 0x494 }, + { 0x497, 0x496 }, + { 0x499, 0x498 }, + { 0x49b, 0x49a }, + { 0x49d, 0x49c }, + { 0x49f, 0x49e }, + { 0x4a1, 0x4a0 }, + { 0x4a3, 0x4a2 }, + { 0x4a5, 0x4a4 }, + { 0x4a7, 0x4a6 }, + { 0x4a9, 0x4a8 }, + { 0x4ab, 0x4aa }, + { 0x4ad, 0x4ac }, + { 0x4af, 0x4ae }, + { 0x4b1, 0x4b0 }, + { 0x4b3, 0x4b2 }, + { 0x4b5, 0x4b4 }, + { 0x4b7, 0x4b6 }, + { 0x4b9, 0x4b8 }, + { 0x4bb, 0x4ba }, + { 0x4bd, 0x4bc }, + { 0x4bf, 0x4be }, + { 0x4c2, 0x4c1 }, + { 0x4c4, 0x4c3 }, + { 0x4c6, 0x4c5 }, + { 0x4c8, 0x4c7 }, + { 0x4ca, 0x4c9 }, + { 0x4cc, 0x4cb }, + { 0x4ce, 0x4cd }, + { 0x4cf, 0x4c0 }, + { 0x4d1, 0x4d0 }, + { 0x4d3, 0x4d2 }, + { 0x4d5, 0x4d4 }, + { 0x4d7, 0x4d6 }, + { 0x4d9, 0x4d8 }, + { 0x4db, 0x4da }, + { 0x4dd, 0x4dc }, + { 0x4df, 0x4de }, + { 0x4e1, 0x4e0 }, + { 0x4e3, 0x4e2 }, + { 0x4e5, 0x4e4 }, + { 0x4e7, 0x4e6 }, + { 0x4e9, 0x4e8 }, + { 0x4eb, 0x4ea }, + { 0x4ed, 0x4ec }, + { 0x4ef, 0x4ee }, + { 0x4f1, 0x4f0 }, + { 0x4f3, 0x4f2 }, + { 0x4f5, 0x4f4 }, + { 0x4f7, 0x4f6 }, + { 0x4f9, 0x4f8 }, + { 0x4fb, 0x4fa }, + { 0x4fd, 0x4fc }, + { 0x4ff, 0x4fe }, + { 0x501, 0x500 }, + { 0x503, 0x502 }, + { 0x505, 0x504 }, + { 0x507, 0x506 }, + { 0x509, 0x508 }, + { 0x50b, 0x50a }, + { 0x50d, 0x50c }, + { 0x50f, 0x50e }, + { 0x511, 0x510 }, + { 0x513, 0x512 }, + { 0x515, 0x514 }, + { 0x517, 0x516 }, + { 0x519, 0x518 }, + { 0x51b, 0x51a }, + { 0x51d, 0x51c }, + { 0x51f, 0x51e }, + { 0x521, 0x520 }, + { 0x523, 0x522 }, + { 0x525, 0x524 }, + { 0x527, 0x526 }, + { 0x529, 0x528 }, + { 0x52b, 0x52a }, + { 0x52d, 0x52c }, + { 0x52f, 0x52e }, + { 0x561, 0x531 }, + { 0x562, 0x532 }, + { 0x563, 0x533 }, + { 0x564, 0x534 }, + { 0x565, 0x535 }, + { 0x566, 0x536 }, + { 0x567, 0x537 }, + { 0x568, 0x538 }, + { 0x569, 0x539 }, + { 0x56a, 0x53a }, + { 0x56b, 0x53b }, + { 0x56c, 0x53c }, + { 0x56d, 0x53d }, + { 0x56e, 0x53e }, + { 0x56f, 0x53f }, + { 0x570, 0x540 }, + { 0x571, 0x541 }, + { 0x572, 0x542 }, + { 0x573, 0x543 }, + { 0x574, 0x544 }, + { 0x575, 0x545 }, + { 0x576, 0x546 }, + { 0x577, 0x547 }, + { 0x578, 0x548 }, + { 0x579, 0x549 }, + { 0x57a, 0x54a }, + { 0x57b, 0x54b }, + { 0x57c, 0x54c }, + { 0x57d, 0x54d }, + { 0x57e, 0x54e }, + { 0x57f, 0x54f }, + { 0x580, 0x550 }, + { 0x581, 0x551 }, + { 0x582, 0x552 }, + { 0x583, 0x553 }, + { 0x584, 0x554 }, + { 0x585, 0x555 }, + { 0x586, 0x556 }, + { 0x13f8, 0x13f0 }, + { 0x13f9, 0x13f1 }, + { 0x13fa, 0x13f2 }, + { 0x13fb, 0x13f3 }, + { 0x13fc, 0x13f4 }, + { 0x13fd, 0x13f5 }, + { 0x1d79, 0xa77d }, + { 0x1d7d, 0x2c63 }, + { 0x1e01, 0x1e00 }, + { 0x1e03, 0x1e02 }, + { 0x1e05, 0x1e04 }, + { 0x1e07, 0x1e06 }, + { 0x1e09, 0x1e08 }, + { 0x1e0b, 0x1e0a }, + { 0x1e0d, 0x1e0c }, + { 0x1e0f, 0x1e0e }, + { 0x1e11, 0x1e10 }, + { 0x1e13, 0x1e12 }, + { 0x1e15, 0x1e14 }, + { 0x1e17, 0x1e16 }, + { 0x1e19, 0x1e18 }, + { 0x1e1b, 0x1e1a }, + { 0x1e1d, 0x1e1c }, + { 0x1e1f, 0x1e1e }, + { 0x1e21, 0x1e20 }, + { 0x1e23, 0x1e22 }, + { 0x1e25, 0x1e24 }, + { 0x1e27, 0x1e26 }, + { 0x1e29, 0x1e28 }, + { 0x1e2b, 0x1e2a }, + { 0x1e2d, 0x1e2c }, + { 0x1e2f, 0x1e2e }, + { 0x1e31, 0x1e30 }, + { 0x1e33, 0x1e32 }, + { 0x1e35, 0x1e34 }, + { 0x1e37, 0x1e36 }, + { 0x1e39, 0x1e38 }, + { 0x1e3b, 0x1e3a }, + { 0x1e3d, 0x1e3c }, + { 0x1e3f, 0x1e3e }, + { 0x1e41, 0x1e40 }, + { 0x1e43, 0x1e42 }, + { 0x1e45, 0x1e44 }, + { 0x1e47, 0x1e46 }, + { 0x1e49, 0x1e48 }, + { 0x1e4b, 0x1e4a }, + { 0x1e4d, 0x1e4c }, + { 0x1e4f, 0x1e4e }, + { 0x1e51, 0x1e50 }, + { 0x1e53, 0x1e52 }, + { 0x1e55, 0x1e54 }, + { 0x1e57, 0x1e56 }, + { 0x1e59, 0x1e58 }, + { 0x1e5b, 0x1e5a }, + { 0x1e5d, 0x1e5c }, + { 0x1e5f, 0x1e5e }, + { 0x1e61, 0x1e60 }, + { 0x1e63, 0x1e62 }, + { 0x1e65, 0x1e64 }, + { 0x1e67, 0x1e66 }, + { 0x1e69, 0x1e68 }, + { 0x1e6b, 0x1e6a }, + { 0x1e6d, 0x1e6c }, + { 0x1e6f, 0x1e6e }, + { 0x1e71, 0x1e70 }, + { 0x1e73, 0x1e72 }, + { 0x1e75, 0x1e74 }, + { 0x1e77, 0x1e76 }, + { 0x1e79, 0x1e78 }, + { 0x1e7b, 0x1e7a }, + { 0x1e7d, 0x1e7c }, + { 0x1e7f, 0x1e7e }, + { 0x1e81, 0x1e80 }, + { 0x1e83, 0x1e82 }, + { 0x1e85, 0x1e84 }, + { 0x1e87, 0x1e86 }, + { 0x1e89, 0x1e88 }, + { 0x1e8b, 0x1e8a }, + { 0x1e8d, 0x1e8c }, + { 0x1e8f, 0x1e8e }, + { 0x1e91, 0x1e90 }, + { 0x1e93, 0x1e92 }, + { 0x1e95, 0x1e94 }, + { 0x1e9b, 0x1e60 }, + { 0x1ea1, 0x1ea0 }, + { 0x1ea3, 0x1ea2 }, + { 0x1ea5, 0x1ea4 }, + { 0x1ea7, 0x1ea6 }, + { 0x1ea9, 0x1ea8 }, + { 0x1eab, 0x1eaa }, + { 0x1ead, 0x1eac }, + { 0x1eaf, 0x1eae }, + { 0x1eb1, 0x1eb0 }, + { 0x1eb3, 0x1eb2 }, + { 0x1eb5, 0x1eb4 }, + { 0x1eb7, 0x1eb6 }, + { 0x1eb9, 0x1eb8 }, + { 0x1ebb, 0x1eba }, + { 0x1ebd, 0x1ebc }, + { 0x1ebf, 0x1ebe }, + { 0x1ec1, 0x1ec0 }, + { 0x1ec3, 0x1ec2 }, + { 0x1ec5, 0x1ec4 }, + { 0x1ec7, 0x1ec6 }, + { 0x1ec9, 0x1ec8 }, + { 0x1ecb, 0x1eca }, + { 0x1ecd, 0x1ecc }, + { 0x1ecf, 0x1ece }, + { 0x1ed1, 0x1ed0 }, + { 0x1ed3, 0x1ed2 }, + { 0x1ed5, 0x1ed4 }, + { 0x1ed7, 0x1ed6 }, + { 0x1ed9, 0x1ed8 }, + { 0x1edb, 0x1eda }, + { 0x1edd, 0x1edc }, + { 0x1edf, 0x1ede }, + { 0x1ee1, 0x1ee0 }, + { 0x1ee3, 0x1ee2 }, + { 0x1ee5, 0x1ee4 }, + { 0x1ee7, 0x1ee6 }, + { 0x1ee9, 0x1ee8 }, + { 0x1eeb, 0x1eea }, + { 0x1eed, 0x1eec }, + { 0x1eef, 0x1eee }, + { 0x1ef1, 0x1ef0 }, + { 0x1ef3, 0x1ef2 }, + { 0x1ef5, 0x1ef4 }, + { 0x1ef7, 0x1ef6 }, + { 0x1ef9, 0x1ef8 }, + { 0x1efb, 0x1efa }, + { 0x1efd, 0x1efc }, + { 0x1eff, 0x1efe }, + { 0x1f00, 0x1f08 }, + { 0x1f01, 0x1f09 }, + { 0x1f02, 0x1f0a }, + { 0x1f03, 0x1f0b }, + { 0x1f04, 0x1f0c }, + { 0x1f05, 0x1f0d }, + { 0x1f06, 0x1f0e }, + { 0x1f07, 0x1f0f }, + { 0x1f10, 0x1f18 }, + { 0x1f11, 0x1f19 }, + { 0x1f12, 0x1f1a }, + { 0x1f13, 0x1f1b }, + { 0x1f14, 0x1f1c }, + { 0x1f15, 0x1f1d }, + { 0x1f20, 0x1f28 }, + { 0x1f21, 0x1f29 }, + { 0x1f22, 0x1f2a }, + { 0x1f23, 0x1f2b }, + { 0x1f24, 0x1f2c }, + { 0x1f25, 0x1f2d }, + { 0x1f26, 0x1f2e }, + { 0x1f27, 0x1f2f }, + { 0x1f30, 0x1f38 }, + { 0x1f31, 0x1f39 }, + { 0x1f32, 0x1f3a }, + { 0x1f33, 0x1f3b }, + { 0x1f34, 0x1f3c }, + { 0x1f35, 0x1f3d }, + { 0x1f36, 0x1f3e }, + { 0x1f37, 0x1f3f }, + { 0x1f40, 0x1f48 }, + { 0x1f41, 0x1f49 }, + { 0x1f42, 0x1f4a }, + { 0x1f43, 0x1f4b }, + { 0x1f44, 0x1f4c }, + { 0x1f45, 0x1f4d }, + { 0x1f51, 0x1f59 }, + { 0x1f53, 0x1f5b }, + { 0x1f55, 0x1f5d }, + { 0x1f57, 0x1f5f }, + { 0x1f60, 0x1f68 }, + { 0x1f61, 0x1f69 }, + { 0x1f62, 0x1f6a }, + { 0x1f63, 0x1f6b }, + { 0x1f64, 0x1f6c }, + { 0x1f65, 0x1f6d }, + { 0x1f66, 0x1f6e }, + { 0x1f67, 0x1f6f }, + { 0x1f70, 0x1fba }, + { 0x1f71, 0x1fbb }, + { 0x1f72, 0x1fc8 }, + { 0x1f73, 0x1fc9 }, + { 0x1f74, 0x1fca }, + { 0x1f75, 0x1fcb }, + { 0x1f76, 0x1fda }, + { 0x1f77, 0x1fdb }, + { 0x1f78, 0x1ff8 }, + { 0x1f79, 0x1ff9 }, + { 0x1f7a, 0x1fea }, + { 0x1f7b, 0x1feb }, + { 0x1f7c, 0x1ffa }, + { 0x1f7d, 0x1ffb }, + { 0x1f80, 0x1f88 }, + { 0x1f81, 0x1f89 }, + { 0x1f82, 0x1f8a }, + { 0x1f83, 0x1f8b }, + { 0x1f84, 0x1f8c }, + { 0x1f85, 0x1f8d }, + { 0x1f86, 0x1f8e }, + { 0x1f87, 0x1f8f }, + { 0x1f90, 0x1f98 }, + { 0x1f91, 0x1f99 }, + { 0x1f92, 0x1f9a }, + { 0x1f93, 0x1f9b }, + { 0x1f94, 0x1f9c }, + { 0x1f95, 0x1f9d }, + { 0x1f96, 0x1f9e }, + { 0x1f97, 0x1f9f }, + { 0x1fa0, 0x1fa8 }, + { 0x1fa1, 0x1fa9 }, + { 0x1fa2, 0x1faa }, + { 0x1fa3, 0x1fab }, + { 0x1fa4, 0x1fac }, + { 0x1fa5, 0x1fad }, + { 0x1fa6, 0x1fae }, + { 0x1fa7, 0x1faf }, + { 0x1fb0, 0x1fb8 }, + { 0x1fb1, 0x1fb9 }, + { 0x1fb3, 0x1fbc }, + { 0x1fbe, 0x399 }, + { 0x1fc3, 0x1fcc }, + { 0x1fd0, 0x1fd8 }, + { 0x1fd1, 0x1fd9 }, + { 0x1fe0, 0x1fe8 }, + { 0x1fe1, 0x1fe9 }, + { 0x1fe5, 0x1fec }, + { 0x1ff3, 0x1ffc }, + { 0x214e, 0x2132 }, + { 0x2170, 0x2160 }, + { 0x2171, 0x2161 }, + { 0x2172, 0x2162 }, + { 0x2173, 0x2163 }, + { 0x2174, 0x2164 }, + { 0x2175, 0x2165 }, + { 0x2176, 0x2166 }, + { 0x2177, 0x2167 }, + { 0x2178, 0x2168 }, + { 0x2179, 0x2169 }, + { 0x217a, 0x216a }, + { 0x217b, 0x216b }, + { 0x217c, 0x216c }, + { 0x217d, 0x216d }, + { 0x217e, 0x216e }, + { 0x217f, 0x216f }, + { 0x2184, 0x2183 }, + { 0x24d0, 0x24b6 }, + { 0x24d1, 0x24b7 }, + { 0x24d2, 0x24b8 }, + { 0x24d3, 0x24b9 }, + { 0x24d4, 0x24ba }, + { 0x24d5, 0x24bb }, + { 0x24d6, 0x24bc }, + { 0x24d7, 0x24bd }, + { 0x24d8, 0x24be }, + { 0x24d9, 0x24bf }, + { 0x24da, 0x24c0 }, + { 0x24db, 0x24c1 }, + { 0x24dc, 0x24c2 }, + { 0x24dd, 0x24c3 }, + { 0x24de, 0x24c4 }, + { 0x24df, 0x24c5 }, + { 0x24e0, 0x24c6 }, + { 0x24e1, 0x24c7 }, + { 0x24e2, 0x24c8 }, + { 0x24e3, 0x24c9 }, + { 0x24e4, 0x24ca }, + { 0x24e5, 0x24cb }, + { 0x24e6, 0x24cc }, + { 0x24e7, 0x24cd }, + { 0x24e8, 0x24ce }, + { 0x24e9, 0x24cf }, + { 0x2c30, 0x2c00 }, + { 0x2c31, 0x2c01 }, + { 0x2c32, 0x2c02 }, + { 0x2c33, 0x2c03 }, + { 0x2c34, 0x2c04 }, + { 0x2c35, 0x2c05 }, + { 0x2c36, 0x2c06 }, + { 0x2c37, 0x2c07 }, + { 0x2c38, 0x2c08 }, + { 0x2c39, 0x2c09 }, + { 0x2c3a, 0x2c0a }, + { 0x2c3b, 0x2c0b }, + { 0x2c3c, 0x2c0c }, + { 0x2c3d, 0x2c0d }, + { 0x2c3e, 0x2c0e }, + { 0x2c3f, 0x2c0f }, + { 0x2c40, 0x2c10 }, + { 0x2c41, 0x2c11 }, + { 0x2c42, 0x2c12 }, + { 0x2c43, 0x2c13 }, + { 0x2c44, 0x2c14 }, + { 0x2c45, 0x2c15 }, + { 0x2c46, 0x2c16 }, + { 0x2c47, 0x2c17 }, + { 0x2c48, 0x2c18 }, + { 0x2c49, 0x2c19 }, + { 0x2c4a, 0x2c1a }, + { 0x2c4b, 0x2c1b }, + { 0x2c4c, 0x2c1c }, + { 0x2c4d, 0x2c1d }, + { 0x2c4e, 0x2c1e }, + { 0x2c4f, 0x2c1f }, + { 0x2c50, 0x2c20 }, + { 0x2c51, 0x2c21 }, + { 0x2c52, 0x2c22 }, + { 0x2c53, 0x2c23 }, + { 0x2c54, 0x2c24 }, + { 0x2c55, 0x2c25 }, + { 0x2c56, 0x2c26 }, + { 0x2c57, 0x2c27 }, + { 0x2c58, 0x2c28 }, + { 0x2c59, 0x2c29 }, + { 0x2c5a, 0x2c2a }, + { 0x2c5b, 0x2c2b }, + { 0x2c5c, 0x2c2c }, + { 0x2c5d, 0x2c2d }, + { 0x2c5e, 0x2c2e }, + { 0x2c61, 0x2c60 }, + { 0x2c65, 0x23a }, + { 0x2c66, 0x23e }, + { 0x2c68, 0x2c67 }, + { 0x2c6a, 0x2c69 }, + { 0x2c6c, 0x2c6b }, + { 0x2c73, 0x2c72 }, + { 0x2c76, 0x2c75 }, + { 0x2c81, 0x2c80 }, + { 0x2c83, 0x2c82 }, + { 0x2c85, 0x2c84 }, + { 0x2c87, 0x2c86 }, + { 0x2c89, 0x2c88 }, + { 0x2c8b, 0x2c8a }, + { 0x2c8d, 0x2c8c }, + { 0x2c8f, 0x2c8e }, + { 0x2c91, 0x2c90 }, + { 0x2c93, 0x2c92 }, + { 0x2c95, 0x2c94 }, + { 0x2c97, 0x2c96 }, + { 0x2c99, 0x2c98 }, + { 0x2c9b, 0x2c9a }, + { 0x2c9d, 0x2c9c }, + { 0x2c9f, 0x2c9e }, + { 0x2ca1, 0x2ca0 }, + { 0x2ca3, 0x2ca2 }, + { 0x2ca5, 0x2ca4 }, + { 0x2ca7, 0x2ca6 }, + { 0x2ca9, 0x2ca8 }, + { 0x2cab, 0x2caa }, + { 0x2cad, 0x2cac }, + { 0x2caf, 0x2cae }, + { 0x2cb1, 0x2cb0 }, + { 0x2cb3, 0x2cb2 }, + { 0x2cb5, 0x2cb4 }, + { 0x2cb7, 0x2cb6 }, + { 0x2cb9, 0x2cb8 }, + { 0x2cbb, 0x2cba }, + { 0x2cbd, 0x2cbc }, + { 0x2cbf, 0x2cbe }, + { 0x2cc1, 0x2cc0 }, + { 0x2cc3, 0x2cc2 }, + { 0x2cc5, 0x2cc4 }, + { 0x2cc7, 0x2cc6 }, + { 0x2cc9, 0x2cc8 }, + { 0x2ccb, 0x2cca }, + { 0x2ccd, 0x2ccc }, + { 0x2ccf, 0x2cce }, + { 0x2cd1, 0x2cd0 }, + { 0x2cd3, 0x2cd2 }, + { 0x2cd5, 0x2cd4 }, + { 0x2cd7, 0x2cd6 }, + { 0x2cd9, 0x2cd8 }, + { 0x2cdb, 0x2cda }, + { 0x2cdd, 0x2cdc }, + { 0x2cdf, 0x2cde }, + { 0x2ce1, 0x2ce0 }, + { 0x2ce3, 0x2ce2 }, + { 0x2cec, 0x2ceb }, + { 0x2cee, 0x2ced }, + { 0x2cf3, 0x2cf2 }, + { 0x2d00, 0x10a0 }, + { 0x2d01, 0x10a1 }, + { 0x2d02, 0x10a2 }, + { 0x2d03, 0x10a3 }, + { 0x2d04, 0x10a4 }, + { 0x2d05, 0x10a5 }, + { 0x2d06, 0x10a6 }, + { 0x2d07, 0x10a7 }, + { 0x2d08, 0x10a8 }, + { 0x2d09, 0x10a9 }, + { 0x2d0a, 0x10aa }, + { 0x2d0b, 0x10ab }, + { 0x2d0c, 0x10ac }, + { 0x2d0d, 0x10ad }, + { 0x2d0e, 0x10ae }, + { 0x2d0f, 0x10af }, + { 0x2d10, 0x10b0 }, + { 0x2d11, 0x10b1 }, + { 0x2d12, 0x10b2 }, + { 0x2d13, 0x10b3 }, + { 0x2d14, 0x10b4 }, + { 0x2d15, 0x10b5 }, + { 0x2d16, 0x10b6 }, + { 0x2d17, 0x10b7 }, + { 0x2d18, 0x10b8 }, + { 0x2d19, 0x10b9 }, + { 0x2d1a, 0x10ba }, + { 0x2d1b, 0x10bb }, + { 0x2d1c, 0x10bc }, + { 0x2d1d, 0x10bd }, + { 0x2d1e, 0x10be }, + { 0x2d1f, 0x10bf }, + { 0x2d20, 0x10c0 }, + { 0x2d21, 0x10c1 }, + { 0x2d22, 0x10c2 }, + { 0x2d23, 0x10c3 }, + { 0x2d24, 0x10c4 }, + { 0x2d25, 0x10c5 }, + { 0x2d27, 0x10c7 }, + { 0x2d2d, 0x10cd }, + { 0xa641, 0xa640 }, + { 0xa643, 0xa642 }, + { 0xa645, 0xa644 }, + { 0xa647, 0xa646 }, + { 0xa649, 0xa648 }, + { 0xa64b, 0xa64a }, + { 0xa64d, 0xa64c }, + { 0xa64f, 0xa64e }, + { 0xa651, 0xa650 }, + { 0xa653, 0xa652 }, + { 0xa655, 0xa654 }, + { 0xa657, 0xa656 }, + { 0xa659, 0xa658 }, + { 0xa65b, 0xa65a }, + { 0xa65d, 0xa65c }, + { 0xa65f, 0xa65e }, + { 0xa661, 0xa660 }, + { 0xa663, 0xa662 }, + { 0xa665, 0xa664 }, + { 0xa667, 0xa666 }, + { 0xa669, 0xa668 }, + { 0xa66b, 0xa66a }, + { 0xa66d, 0xa66c }, + { 0xa681, 0xa680 }, + { 0xa683, 0xa682 }, + { 0xa685, 0xa684 }, + { 0xa687, 0xa686 }, + { 0xa689, 0xa688 }, + { 0xa68b, 0xa68a }, + { 0xa68d, 0xa68c }, + { 0xa68f, 0xa68e }, + { 0xa691, 0xa690 }, + { 0xa693, 0xa692 }, + { 0xa695, 0xa694 }, + { 0xa697, 0xa696 }, + { 0xa699, 0xa698 }, + { 0xa69b, 0xa69a }, + { 0xa723, 0xa722 }, + { 0xa725, 0xa724 }, + { 0xa727, 0xa726 }, + { 0xa729, 0xa728 }, + { 0xa72b, 0xa72a }, + { 0xa72d, 0xa72c }, + { 0xa72f, 0xa72e }, + { 0xa733, 0xa732 }, + { 0xa735, 0xa734 }, + { 0xa737, 0xa736 }, + { 0xa739, 0xa738 }, + { 0xa73b, 0xa73a }, + { 0xa73d, 0xa73c }, + { 0xa73f, 0xa73e }, + { 0xa741, 0xa740 }, + { 0xa743, 0xa742 }, + { 0xa745, 0xa744 }, + { 0xa747, 0xa746 }, + { 0xa749, 0xa748 }, + { 0xa74b, 0xa74a }, + { 0xa74d, 0xa74c }, + { 0xa74f, 0xa74e }, + { 0xa751, 0xa750 }, + { 0xa753, 0xa752 }, + { 0xa755, 0xa754 }, + { 0xa757, 0xa756 }, + { 0xa759, 0xa758 }, + { 0xa75b, 0xa75a }, + { 0xa75d, 0xa75c }, + { 0xa75f, 0xa75e }, + { 0xa761, 0xa760 }, + { 0xa763, 0xa762 }, + { 0xa765, 0xa764 }, + { 0xa767, 0xa766 }, + { 0xa769, 0xa768 }, + { 0xa76b, 0xa76a }, + { 0xa76d, 0xa76c }, + { 0xa76f, 0xa76e }, + { 0xa77a, 0xa779 }, + { 0xa77c, 0xa77b }, + { 0xa77f, 0xa77e }, + { 0xa781, 0xa780 }, + { 0xa783, 0xa782 }, + { 0xa785, 0xa784 }, + { 0xa787, 0xa786 }, + { 0xa78c, 0xa78b }, + { 0xa791, 0xa790 }, + { 0xa793, 0xa792 }, + { 0xa797, 0xa796 }, + { 0xa799, 0xa798 }, + { 0xa79b, 0xa79a }, + { 0xa79d, 0xa79c }, + { 0xa79f, 0xa79e }, + { 0xa7a1, 0xa7a0 }, + { 0xa7a3, 0xa7a2 }, + { 0xa7a5, 0xa7a4 }, + { 0xa7a7, 0xa7a6 }, + { 0xa7a9, 0xa7a8 }, + { 0xa7b5, 0xa7b4 }, + { 0xa7b7, 0xa7b6 }, + { 0xab53, 0xa7b3 }, + { 0xab70, 0x13a0 }, + { 0xab71, 0x13a1 }, + { 0xab72, 0x13a2 }, + { 0xab73, 0x13a3 }, + { 0xab74, 0x13a4 }, + { 0xab75, 0x13a5 }, + { 0xab76, 0x13a6 }, + { 0xab77, 0x13a7 }, + { 0xab78, 0x13a8 }, + { 0xab79, 0x13a9 }, + { 0xab7a, 0x13aa }, + { 0xab7b, 0x13ab }, + { 0xab7c, 0x13ac }, + { 0xab7d, 0x13ad }, + { 0xab7e, 0x13ae }, + { 0xab7f, 0x13af }, + { 0xab80, 0x13b0 }, + { 0xab81, 0x13b1 }, + { 0xab82, 0x13b2 }, + { 0xab83, 0x13b3 }, + { 0xab84, 0x13b4 }, + { 0xab85, 0x13b5 }, + { 0xab86, 0x13b6 }, + { 0xab87, 0x13b7 }, + { 0xab88, 0x13b8 }, + { 0xab89, 0x13b9 }, + { 0xab8a, 0x13ba }, + { 0xab8b, 0x13bb }, + { 0xab8c, 0x13bc }, + { 0xab8d, 0x13bd }, + { 0xab8e, 0x13be }, + { 0xab8f, 0x13bf }, + { 0xab90, 0x13c0 }, + { 0xab91, 0x13c1 }, + { 0xab92, 0x13c2 }, + { 0xab93, 0x13c3 }, + { 0xab94, 0x13c4 }, + { 0xab95, 0x13c5 }, + { 0xab96, 0x13c6 }, + { 0xab97, 0x13c7 }, + { 0xab98, 0x13c8 }, + { 0xab99, 0x13c9 }, + { 0xab9a, 0x13ca }, + { 0xab9b, 0x13cb }, + { 0xab9c, 0x13cc }, + { 0xab9d, 0x13cd }, + { 0xab9e, 0x13ce }, + { 0xab9f, 0x13cf }, + { 0xaba0, 0x13d0 }, + { 0xaba1, 0x13d1 }, + { 0xaba2, 0x13d2 }, + { 0xaba3, 0x13d3 }, + { 0xaba4, 0x13d4 }, + { 0xaba5, 0x13d5 }, + { 0xaba6, 0x13d6 }, + { 0xaba7, 0x13d7 }, + { 0xaba8, 0x13d8 }, + { 0xaba9, 0x13d9 }, + { 0xabaa, 0x13da }, + { 0xabab, 0x13db }, + { 0xabac, 0x13dc }, + { 0xabad, 0x13dd }, + { 0xabae, 0x13de }, + { 0xabaf, 0x13df }, + { 0xabb0, 0x13e0 }, + { 0xabb1, 0x13e1 }, + { 0xabb2, 0x13e2 }, + { 0xabb3, 0x13e3 }, + { 0xabb4, 0x13e4 }, + { 0xabb5, 0x13e5 }, + { 0xabb6, 0x13e6 }, + { 0xabb7, 0x13e7 }, + { 0xabb8, 0x13e8 }, + { 0xabb9, 0x13e9 }, + { 0xabba, 0x13ea }, + { 0xabbb, 0x13eb }, + { 0xabbc, 0x13ec }, + { 0xabbd, 0x13ed }, + { 0xabbe, 0x13ee }, + { 0xabbf, 0x13ef }, + { 0xff41, 0xff21 }, + { 0xff42, 0xff22 }, + { 0xff43, 0xff23 }, + { 0xff44, 0xff24 }, + { 0xff45, 0xff25 }, + { 0xff46, 0xff26 }, + { 0xff47, 0xff27 }, + { 0xff48, 0xff28 }, + { 0xff49, 0xff29 }, + { 0xff4a, 0xff2a }, + { 0xff4b, 0xff2b }, + { 0xff4c, 0xff2c }, + { 0xff4d, 0xff2d }, + { 0xff4e, 0xff2e }, + { 0xff4f, 0xff2f }, + { 0xff50, 0xff30 }, + { 0xff51, 0xff31 }, + { 0xff52, 0xff32 }, + { 0xff53, 0xff33 }, + { 0xff54, 0xff34 }, + { 0xff55, 0xff35 }, + { 0xff56, 0xff36 }, + { 0xff57, 0xff37 }, + { 0xff58, 0xff38 }, + { 0xff59, 0xff39 }, + { 0xff5a, 0xff3a }, + { 0x10428, 0x10400 }, + { 0x10429, 0x10401 }, + { 0x1042a, 0x10402 }, + { 0x1042b, 0x10403 }, + { 0x1042c, 0x10404 }, + { 0x1042d, 0x10405 }, + { 0x1042e, 0x10406 }, + { 0x1042f, 0x10407 }, + { 0x10430, 0x10408 }, + { 0x10431, 0x10409 }, + { 0x10432, 0x1040a }, + { 0x10433, 0x1040b }, + { 0x10434, 0x1040c }, + { 0x10435, 0x1040d }, + { 0x10436, 0x1040e }, + { 0x10437, 0x1040f }, + { 0x10438, 0x10410 }, + { 0x10439, 0x10411 }, + { 0x1043a, 0x10412 }, + { 0x1043b, 0x10413 }, + { 0x1043c, 0x10414 }, + { 0x1043d, 0x10415 }, + { 0x1043e, 0x10416 }, + { 0x1043f, 0x10417 }, + { 0x10440, 0x10418 }, + { 0x10441, 0x10419 }, + { 0x10442, 0x1041a }, + { 0x10443, 0x1041b }, + { 0x10444, 0x1041c }, + { 0x10445, 0x1041d }, + { 0x10446, 0x1041e }, + { 0x10447, 0x1041f }, + { 0x10448, 0x10420 }, + { 0x10449, 0x10421 }, + { 0x1044a, 0x10422 }, + { 0x1044b, 0x10423 }, + { 0x1044c, 0x10424 }, + { 0x1044d, 0x10425 }, + { 0x1044e, 0x10426 }, + { 0x1044f, 0x10427 }, + { 0x10cc0, 0x10c80 }, + { 0x10cc1, 0x10c81 }, + { 0x10cc2, 0x10c82 }, + { 0x10cc3, 0x10c83 }, + { 0x10cc4, 0x10c84 }, + { 0x10cc5, 0x10c85 }, + { 0x10cc6, 0x10c86 }, + { 0x10cc7, 0x10c87 }, + { 0x10cc8, 0x10c88 }, + { 0x10cc9, 0x10c89 }, + { 0x10cca, 0x10c8a }, + { 0x10ccb, 0x10c8b }, + { 0x10ccc, 0x10c8c }, + { 0x10ccd, 0x10c8d }, + { 0x10cce, 0x10c8e }, + { 0x10ccf, 0x10c8f }, + { 0x10cd0, 0x10c90 }, + { 0x10cd1, 0x10c91 }, + { 0x10cd2, 0x10c92 }, + { 0x10cd3, 0x10c93 }, + { 0x10cd4, 0x10c94 }, + { 0x10cd5, 0x10c95 }, + { 0x10cd6, 0x10c96 }, + { 0x10cd7, 0x10c97 }, + { 0x10cd8, 0x10c98 }, + { 0x10cd9, 0x10c99 }, + { 0x10cda, 0x10c9a }, + { 0x10cdb, 0x10c9b }, + { 0x10cdc, 0x10c9c }, + { 0x10cdd, 0x10c9d }, + { 0x10cde, 0x10c9e }, + { 0x10cdf, 0x10c9f }, + { 0x10ce0, 0x10ca0 }, + { 0x10ce1, 0x10ca1 }, + { 0x10ce2, 0x10ca2 }, + { 0x10ce3, 0x10ca3 }, + { 0x10ce4, 0x10ca4 }, + { 0x10ce5, 0x10ca5 }, + { 0x10ce6, 0x10ca6 }, + { 0x10ce7, 0x10ca7 }, + { 0x10ce8, 0x10ca8 }, + { 0x10ce9, 0x10ca9 }, + { 0x10cea, 0x10caa }, + { 0x10ceb, 0x10cab }, + { 0x10cec, 0x10cac }, + { 0x10ced, 0x10cad }, + { 0x10cee, 0x10cae }, + { 0x10cef, 0x10caf }, + { 0x10cf0, 0x10cb0 }, + { 0x10cf1, 0x10cb1 }, + { 0x10cf2, 0x10cb2 }, + { 0x118c0, 0x118a0 }, + { 0x118c1, 0x118a1 }, + { 0x118c2, 0x118a2 }, + { 0x118c3, 0x118a3 }, + { 0x118c4, 0x118a4 }, + { 0x118c5, 0x118a5 }, + { 0x118c6, 0x118a6 }, + { 0x118c7, 0x118a7 }, + { 0x118c8, 0x118a8 }, + { 0x118c9, 0x118a9 }, + { 0x118ca, 0x118aa }, + { 0x118cb, 0x118ab }, + { 0x118cc, 0x118ac }, + { 0x118cd, 0x118ad }, + { 0x118ce, 0x118ae }, + { 0x118cf, 0x118af }, + { 0x118d0, 0x118b0 }, + { 0x118d1, 0x118b1 }, + { 0x118d2, 0x118b2 }, + { 0x118d3, 0x118b3 }, + { 0x118d4, 0x118b4 }, + { 0x118d5, 0x118b5 }, + { 0x118d6, 0x118b6 }, + { 0x118d7, 0x118b7 }, + { 0x118d8, 0x118b8 }, + { 0x118d9, 0x118b9 }, + { 0x118da, 0x118ba }, + { 0x118db, 0x118bb }, + { 0x118dc, 0x118bc }, + { 0x118dd, 0x118bd }, + { 0x118de, 0x118be }, + { 0x118df, 0x118bf }, +}; + +extern int runeinrange(const void* a, const void* b); + +Rune totitlerune(Rune ch) { + Rune* to = bsearch(&ch, mappings, 1245, 2 * sizeof(Rune), &runeinrange); + return (to == NULL) ? ch : to[1]; +} diff --git a/source/utf/toupper.c b/source/utf/toupper.c new file mode 100644 index 0000000..39dec20 --- /dev/null +++ b/source/utf/toupper.c @@ -0,0 +1,1252 @@ +#include + +static Rune mappings[1241][2] = { + { 0x61, 0x41 }, + { 0x62, 0x42 }, + { 0x63, 0x43 }, + { 0x64, 0x44 }, + { 0x65, 0x45 }, + { 0x66, 0x46 }, + { 0x67, 0x47 }, + { 0x68, 0x48 }, + { 0x69, 0x49 }, + { 0x6a, 0x4a }, + { 0x6b, 0x4b }, + { 0x6c, 0x4c }, + { 0x6d, 0x4d }, + { 0x6e, 0x4e }, + { 0x6f, 0x4f }, + { 0x70, 0x50 }, + { 0x71, 0x51 }, + { 0x72, 0x52 }, + { 0x73, 0x53 }, + { 0x74, 0x54 }, + { 0x75, 0x55 }, + { 0x76, 0x56 }, + { 0x77, 0x57 }, + { 0x78, 0x58 }, + { 0x79, 0x59 }, + { 0x7a, 0x5a }, + { 0xb5, 0x39c }, + { 0xe0, 0xc0 }, + { 0xe1, 0xc1 }, + { 0xe2, 0xc2 }, + { 0xe3, 0xc3 }, + { 0xe4, 0xc4 }, + { 0xe5, 0xc5 }, + { 0xe6, 0xc6 }, + { 0xe7, 0xc7 }, + { 0xe8, 0xc8 }, + { 0xe9, 0xc9 }, + { 0xea, 0xca }, + { 0xeb, 0xcb }, + { 0xec, 0xcc }, + { 0xed, 0xcd }, + { 0xee, 0xce }, + { 0xef, 0xcf }, + { 0xf0, 0xd0 }, + { 0xf1, 0xd1 }, + { 0xf2, 0xd2 }, + { 0xf3, 0xd3 }, + { 0xf4, 0xd4 }, + { 0xf5, 0xd5 }, + { 0xf6, 0xd6 }, + { 0xf8, 0xd8 }, + { 0xf9, 0xd9 }, + { 0xfa, 0xda }, + { 0xfb, 0xdb }, + { 0xfc, 0xdc }, + { 0xfd, 0xdd }, + { 0xfe, 0xde }, + { 0xff, 0x178 }, + { 0x101, 0x100 }, + { 0x103, 0x102 }, + { 0x105, 0x104 }, + { 0x107, 0x106 }, + { 0x109, 0x108 }, + { 0x10b, 0x10a }, + { 0x10d, 0x10c }, + { 0x10f, 0x10e }, + { 0x111, 0x110 }, + { 0x113, 0x112 }, + { 0x115, 0x114 }, + { 0x117, 0x116 }, + { 0x119, 0x118 }, + { 0x11b, 0x11a }, + { 0x11d, 0x11c }, + { 0x11f, 0x11e }, + { 0x121, 0x120 }, + { 0x123, 0x122 }, + { 0x125, 0x124 }, + { 0x127, 0x126 }, + { 0x129, 0x128 }, + { 0x12b, 0x12a }, + { 0x12d, 0x12c }, + { 0x12f, 0x12e }, + { 0x131, 0x49 }, + { 0x133, 0x132 }, + { 0x135, 0x134 }, + { 0x137, 0x136 }, + { 0x13a, 0x139 }, + { 0x13c, 0x13b }, + { 0x13e, 0x13d }, + { 0x140, 0x13f }, + { 0x142, 0x141 }, + { 0x144, 0x143 }, + { 0x146, 0x145 }, + { 0x148, 0x147 }, + { 0x14b, 0x14a }, + { 0x14d, 0x14c }, + { 0x14f, 0x14e }, + { 0x151, 0x150 }, + { 0x153, 0x152 }, + { 0x155, 0x154 }, + { 0x157, 0x156 }, + { 0x159, 0x158 }, + { 0x15b, 0x15a }, + { 0x15d, 0x15c }, + { 0x15f, 0x15e }, + { 0x161, 0x160 }, + { 0x163, 0x162 }, + { 0x165, 0x164 }, + { 0x167, 0x166 }, + { 0x169, 0x168 }, + { 0x16b, 0x16a }, + { 0x16d, 0x16c }, + { 0x16f, 0x16e }, + { 0x171, 0x170 }, + { 0x173, 0x172 }, + { 0x175, 0x174 }, + { 0x177, 0x176 }, + { 0x17a, 0x179 }, + { 0x17c, 0x17b }, + { 0x17e, 0x17d }, + { 0x17f, 0x53 }, + { 0x180, 0x243 }, + { 0x183, 0x182 }, + { 0x185, 0x184 }, + { 0x188, 0x187 }, + { 0x18c, 0x18b }, + { 0x192, 0x191 }, + { 0x195, 0x1f6 }, + { 0x199, 0x198 }, + { 0x19a, 0x23d }, + { 0x19e, 0x220 }, + { 0x1a1, 0x1a0 }, + { 0x1a3, 0x1a2 }, + { 0x1a5, 0x1a4 }, + { 0x1a8, 0x1a7 }, + { 0x1ad, 0x1ac }, + { 0x1b0, 0x1af }, + { 0x1b4, 0x1b3 }, + { 0x1b6, 0x1b5 }, + { 0x1b9, 0x1b8 }, + { 0x1bd, 0x1bc }, + { 0x1bf, 0x1f7 }, + { 0x1c5, 0x1c4 }, + { 0x1c6, 0x1c4 }, + { 0x1c8, 0x1c7 }, + { 0x1c9, 0x1c7 }, + { 0x1cb, 0x1ca }, + { 0x1cc, 0x1ca }, + { 0x1ce, 0x1cd }, + { 0x1d0, 0x1cf }, + { 0x1d2, 0x1d1 }, + { 0x1d4, 0x1d3 }, + { 0x1d6, 0x1d5 }, + { 0x1d8, 0x1d7 }, + { 0x1da, 0x1d9 }, + { 0x1dc, 0x1db }, + { 0x1dd, 0x18e }, + { 0x1df, 0x1de }, + { 0x1e1, 0x1e0 }, + { 0x1e3, 0x1e2 }, + { 0x1e5, 0x1e4 }, + { 0x1e7, 0x1e6 }, + { 0x1e9, 0x1e8 }, + { 0x1eb, 0x1ea }, + { 0x1ed, 0x1ec }, + { 0x1ef, 0x1ee }, + { 0x1f2, 0x1f1 }, + { 0x1f3, 0x1f1 }, + { 0x1f5, 0x1f4 }, + { 0x1f9, 0x1f8 }, + { 0x1fb, 0x1fa }, + { 0x1fd, 0x1fc }, + { 0x1ff, 0x1fe }, + { 0x201, 0x200 }, + { 0x203, 0x202 }, + { 0x205, 0x204 }, + { 0x207, 0x206 }, + { 0x209, 0x208 }, + { 0x20b, 0x20a }, + { 0x20d, 0x20c }, + { 0x20f, 0x20e }, + { 0x211, 0x210 }, + { 0x213, 0x212 }, + { 0x215, 0x214 }, + { 0x217, 0x216 }, + { 0x219, 0x218 }, + { 0x21b, 0x21a }, + { 0x21d, 0x21c }, + { 0x21f, 0x21e }, + { 0x223, 0x222 }, + { 0x225, 0x224 }, + { 0x227, 0x226 }, + { 0x229, 0x228 }, + { 0x22b, 0x22a }, + { 0x22d, 0x22c }, + { 0x22f, 0x22e }, + { 0x231, 0x230 }, + { 0x233, 0x232 }, + { 0x23c, 0x23b }, + { 0x23f, 0x2c7e }, + { 0x240, 0x2c7f }, + { 0x242, 0x241 }, + { 0x247, 0x246 }, + { 0x249, 0x248 }, + { 0x24b, 0x24a }, + { 0x24d, 0x24c }, + { 0x24f, 0x24e }, + { 0x250, 0x2c6f }, + { 0x251, 0x2c6d }, + { 0x252, 0x2c70 }, + { 0x253, 0x181 }, + { 0x254, 0x186 }, + { 0x256, 0x189 }, + { 0x257, 0x18a }, + { 0x259, 0x18f }, + { 0x25b, 0x190 }, + { 0x25c, 0xa7ab }, + { 0x260, 0x193 }, + { 0x261, 0xa7ac }, + { 0x263, 0x194 }, + { 0x265, 0xa78d }, + { 0x266, 0xa7aa }, + { 0x268, 0x197 }, + { 0x269, 0x196 }, + { 0x26b, 0x2c62 }, + { 0x26c, 0xa7ad }, + { 0x26f, 0x19c }, + { 0x271, 0x2c6e }, + { 0x272, 0x19d }, + { 0x275, 0x19f }, + { 0x27d, 0x2c64 }, + { 0x280, 0x1a6 }, + { 0x283, 0x1a9 }, + { 0x287, 0xa7b1 }, + { 0x288, 0x1ae }, + { 0x289, 0x244 }, + { 0x28a, 0x1b1 }, + { 0x28b, 0x1b2 }, + { 0x28c, 0x245 }, + { 0x292, 0x1b7 }, + { 0x29d, 0xa7b2 }, + { 0x29e, 0xa7b0 }, + { 0x345, 0x399 }, + { 0x371, 0x370 }, + { 0x373, 0x372 }, + { 0x377, 0x376 }, + { 0x37b, 0x3fd }, + { 0x37c, 0x3fe }, + { 0x37d, 0x3ff }, + { 0x3ac, 0x386 }, + { 0x3ad, 0x388 }, + { 0x3ae, 0x389 }, + { 0x3af, 0x38a }, + { 0x3b1, 0x391 }, + { 0x3b2, 0x392 }, + { 0x3b3, 0x393 }, + { 0x3b4, 0x394 }, + { 0x3b5, 0x395 }, + { 0x3b6, 0x396 }, + { 0x3b7, 0x397 }, + { 0x3b8, 0x398 }, + { 0x3b9, 0x399 }, + { 0x3ba, 0x39a }, + { 0x3bb, 0x39b }, + { 0x3bc, 0x39c }, + { 0x3bd, 0x39d }, + { 0x3be, 0x39e }, + { 0x3bf, 0x39f }, + { 0x3c0, 0x3a0 }, + { 0x3c1, 0x3a1 }, + { 0x3c2, 0x3a3 }, + { 0x3c3, 0x3a3 }, + { 0x3c4, 0x3a4 }, + { 0x3c5, 0x3a5 }, + { 0x3c6, 0x3a6 }, + { 0x3c7, 0x3a7 }, + { 0x3c8, 0x3a8 }, + { 0x3c9, 0x3a9 }, + { 0x3ca, 0x3aa }, + { 0x3cb, 0x3ab }, + { 0x3cc, 0x38c }, + { 0x3cd, 0x38e }, + { 0x3ce, 0x38f }, + { 0x3d0, 0x392 }, + { 0x3d1, 0x398 }, + { 0x3d5, 0x3a6 }, + { 0x3d6, 0x3a0 }, + { 0x3d7, 0x3cf }, + { 0x3d9, 0x3d8 }, + { 0x3db, 0x3da }, + { 0x3dd, 0x3dc }, + { 0x3df, 0x3de }, + { 0x3e1, 0x3e0 }, + { 0x3e3, 0x3e2 }, + { 0x3e5, 0x3e4 }, + { 0x3e7, 0x3e6 }, + { 0x3e9, 0x3e8 }, + { 0x3eb, 0x3ea }, + { 0x3ed, 0x3ec }, + { 0x3ef, 0x3ee }, + { 0x3f0, 0x39a }, + { 0x3f1, 0x3a1 }, + { 0x3f2, 0x3f9 }, + { 0x3f3, 0x37f }, + { 0x3f5, 0x395 }, + { 0x3f8, 0x3f7 }, + { 0x3fb, 0x3fa }, + { 0x430, 0x410 }, + { 0x431, 0x411 }, + { 0x432, 0x412 }, + { 0x433, 0x413 }, + { 0x434, 0x414 }, + { 0x435, 0x415 }, + { 0x436, 0x416 }, + { 0x437, 0x417 }, + { 0x438, 0x418 }, + { 0x439, 0x419 }, + { 0x43a, 0x41a }, + { 0x43b, 0x41b }, + { 0x43c, 0x41c }, + { 0x43d, 0x41d }, + { 0x43e, 0x41e }, + { 0x43f, 0x41f }, + { 0x440, 0x420 }, + { 0x441, 0x421 }, + { 0x442, 0x422 }, + { 0x443, 0x423 }, + { 0x444, 0x424 }, + { 0x445, 0x425 }, + { 0x446, 0x426 }, + { 0x447, 0x427 }, + { 0x448, 0x428 }, + { 0x449, 0x429 }, + { 0x44a, 0x42a }, + { 0x44b, 0x42b }, + { 0x44c, 0x42c }, + { 0x44d, 0x42d }, + { 0x44e, 0x42e }, + { 0x44f, 0x42f }, + { 0x450, 0x400 }, + { 0x451, 0x401 }, + { 0x452, 0x402 }, + { 0x453, 0x403 }, + { 0x454, 0x404 }, + { 0x455, 0x405 }, + { 0x456, 0x406 }, + { 0x457, 0x407 }, + { 0x458, 0x408 }, + { 0x459, 0x409 }, + { 0x45a, 0x40a }, + { 0x45b, 0x40b }, + { 0x45c, 0x40c }, + { 0x45d, 0x40d }, + { 0x45e, 0x40e }, + { 0x45f, 0x40f }, + { 0x461, 0x460 }, + { 0x463, 0x462 }, + { 0x465, 0x464 }, + { 0x467, 0x466 }, + { 0x469, 0x468 }, + { 0x46b, 0x46a }, + { 0x46d, 0x46c }, + { 0x46f, 0x46e }, + { 0x471, 0x470 }, + { 0x473, 0x472 }, + { 0x475, 0x474 }, + { 0x477, 0x476 }, + { 0x479, 0x478 }, + { 0x47b, 0x47a }, + { 0x47d, 0x47c }, + { 0x47f, 0x47e }, + { 0x481, 0x480 }, + { 0x48b, 0x48a }, + { 0x48d, 0x48c }, + { 0x48f, 0x48e }, + { 0x491, 0x490 }, + { 0x493, 0x492 }, + { 0x495, 0x494 }, + { 0x497, 0x496 }, + { 0x499, 0x498 }, + { 0x49b, 0x49a }, + { 0x49d, 0x49c }, + { 0x49f, 0x49e }, + { 0x4a1, 0x4a0 }, + { 0x4a3, 0x4a2 }, + { 0x4a5, 0x4a4 }, + { 0x4a7, 0x4a6 }, + { 0x4a9, 0x4a8 }, + { 0x4ab, 0x4aa }, + { 0x4ad, 0x4ac }, + { 0x4af, 0x4ae }, + { 0x4b1, 0x4b0 }, + { 0x4b3, 0x4b2 }, + { 0x4b5, 0x4b4 }, + { 0x4b7, 0x4b6 }, + { 0x4b9, 0x4b8 }, + { 0x4bb, 0x4ba }, + { 0x4bd, 0x4bc }, + { 0x4bf, 0x4be }, + { 0x4c2, 0x4c1 }, + { 0x4c4, 0x4c3 }, + { 0x4c6, 0x4c5 }, + { 0x4c8, 0x4c7 }, + { 0x4ca, 0x4c9 }, + { 0x4cc, 0x4cb }, + { 0x4ce, 0x4cd }, + { 0x4cf, 0x4c0 }, + { 0x4d1, 0x4d0 }, + { 0x4d3, 0x4d2 }, + { 0x4d5, 0x4d4 }, + { 0x4d7, 0x4d6 }, + { 0x4d9, 0x4d8 }, + { 0x4db, 0x4da }, + { 0x4dd, 0x4dc }, + { 0x4df, 0x4de }, + { 0x4e1, 0x4e0 }, + { 0x4e3, 0x4e2 }, + { 0x4e5, 0x4e4 }, + { 0x4e7, 0x4e6 }, + { 0x4e9, 0x4e8 }, + { 0x4eb, 0x4ea }, + { 0x4ed, 0x4ec }, + { 0x4ef, 0x4ee }, + { 0x4f1, 0x4f0 }, + { 0x4f3, 0x4f2 }, + { 0x4f5, 0x4f4 }, + { 0x4f7, 0x4f6 }, + { 0x4f9, 0x4f8 }, + { 0x4fb, 0x4fa }, + { 0x4fd, 0x4fc }, + { 0x4ff, 0x4fe }, + { 0x501, 0x500 }, + { 0x503, 0x502 }, + { 0x505, 0x504 }, + { 0x507, 0x506 }, + { 0x509, 0x508 }, + { 0x50b, 0x50a }, + { 0x50d, 0x50c }, + { 0x50f, 0x50e }, + { 0x511, 0x510 }, + { 0x513, 0x512 }, + { 0x515, 0x514 }, + { 0x517, 0x516 }, + { 0x519, 0x518 }, + { 0x51b, 0x51a }, + { 0x51d, 0x51c }, + { 0x51f, 0x51e }, + { 0x521, 0x520 }, + { 0x523, 0x522 }, + { 0x525, 0x524 }, + { 0x527, 0x526 }, + { 0x529, 0x528 }, + { 0x52b, 0x52a }, + { 0x52d, 0x52c }, + { 0x52f, 0x52e }, + { 0x561, 0x531 }, + { 0x562, 0x532 }, + { 0x563, 0x533 }, + { 0x564, 0x534 }, + { 0x565, 0x535 }, + { 0x566, 0x536 }, + { 0x567, 0x537 }, + { 0x568, 0x538 }, + { 0x569, 0x539 }, + { 0x56a, 0x53a }, + { 0x56b, 0x53b }, + { 0x56c, 0x53c }, + { 0x56d, 0x53d }, + { 0x56e, 0x53e }, + { 0x56f, 0x53f }, + { 0x570, 0x540 }, + { 0x571, 0x541 }, + { 0x572, 0x542 }, + { 0x573, 0x543 }, + { 0x574, 0x544 }, + { 0x575, 0x545 }, + { 0x576, 0x546 }, + { 0x577, 0x547 }, + { 0x578, 0x548 }, + { 0x579, 0x549 }, + { 0x57a, 0x54a }, + { 0x57b, 0x54b }, + { 0x57c, 0x54c }, + { 0x57d, 0x54d }, + { 0x57e, 0x54e }, + { 0x57f, 0x54f }, + { 0x580, 0x550 }, + { 0x581, 0x551 }, + { 0x582, 0x552 }, + { 0x583, 0x553 }, + { 0x584, 0x554 }, + { 0x585, 0x555 }, + { 0x586, 0x556 }, + { 0x13f8, 0x13f0 }, + { 0x13f9, 0x13f1 }, + { 0x13fa, 0x13f2 }, + { 0x13fb, 0x13f3 }, + { 0x13fc, 0x13f4 }, + { 0x13fd, 0x13f5 }, + { 0x1d79, 0xa77d }, + { 0x1d7d, 0x2c63 }, + { 0x1e01, 0x1e00 }, + { 0x1e03, 0x1e02 }, + { 0x1e05, 0x1e04 }, + { 0x1e07, 0x1e06 }, + { 0x1e09, 0x1e08 }, + { 0x1e0b, 0x1e0a }, + { 0x1e0d, 0x1e0c }, + { 0x1e0f, 0x1e0e }, + { 0x1e11, 0x1e10 }, + { 0x1e13, 0x1e12 }, + { 0x1e15, 0x1e14 }, + { 0x1e17, 0x1e16 }, + { 0x1e19, 0x1e18 }, + { 0x1e1b, 0x1e1a }, + { 0x1e1d, 0x1e1c }, + { 0x1e1f, 0x1e1e }, + { 0x1e21, 0x1e20 }, + { 0x1e23, 0x1e22 }, + { 0x1e25, 0x1e24 }, + { 0x1e27, 0x1e26 }, + { 0x1e29, 0x1e28 }, + { 0x1e2b, 0x1e2a }, + { 0x1e2d, 0x1e2c }, + { 0x1e2f, 0x1e2e }, + { 0x1e31, 0x1e30 }, + { 0x1e33, 0x1e32 }, + { 0x1e35, 0x1e34 }, + { 0x1e37, 0x1e36 }, + { 0x1e39, 0x1e38 }, + { 0x1e3b, 0x1e3a }, + { 0x1e3d, 0x1e3c }, + { 0x1e3f, 0x1e3e }, + { 0x1e41, 0x1e40 }, + { 0x1e43, 0x1e42 }, + { 0x1e45, 0x1e44 }, + { 0x1e47, 0x1e46 }, + { 0x1e49, 0x1e48 }, + { 0x1e4b, 0x1e4a }, + { 0x1e4d, 0x1e4c }, + { 0x1e4f, 0x1e4e }, + { 0x1e51, 0x1e50 }, + { 0x1e53, 0x1e52 }, + { 0x1e55, 0x1e54 }, + { 0x1e57, 0x1e56 }, + { 0x1e59, 0x1e58 }, + { 0x1e5b, 0x1e5a }, + { 0x1e5d, 0x1e5c }, + { 0x1e5f, 0x1e5e }, + { 0x1e61, 0x1e60 }, + { 0x1e63, 0x1e62 }, + { 0x1e65, 0x1e64 }, + { 0x1e67, 0x1e66 }, + { 0x1e69, 0x1e68 }, + { 0x1e6b, 0x1e6a }, + { 0x1e6d, 0x1e6c }, + { 0x1e6f, 0x1e6e }, + { 0x1e71, 0x1e70 }, + { 0x1e73, 0x1e72 }, + { 0x1e75, 0x1e74 }, + { 0x1e77, 0x1e76 }, + { 0x1e79, 0x1e78 }, + { 0x1e7b, 0x1e7a }, + { 0x1e7d, 0x1e7c }, + { 0x1e7f, 0x1e7e }, + { 0x1e81, 0x1e80 }, + { 0x1e83, 0x1e82 }, + { 0x1e85, 0x1e84 }, + { 0x1e87, 0x1e86 }, + { 0x1e89, 0x1e88 }, + { 0x1e8b, 0x1e8a }, + { 0x1e8d, 0x1e8c }, + { 0x1e8f, 0x1e8e }, + { 0x1e91, 0x1e90 }, + { 0x1e93, 0x1e92 }, + { 0x1e95, 0x1e94 }, + { 0x1e9b, 0x1e60 }, + { 0x1ea1, 0x1ea0 }, + { 0x1ea3, 0x1ea2 }, + { 0x1ea5, 0x1ea4 }, + { 0x1ea7, 0x1ea6 }, + { 0x1ea9, 0x1ea8 }, + { 0x1eab, 0x1eaa }, + { 0x1ead, 0x1eac }, + { 0x1eaf, 0x1eae }, + { 0x1eb1, 0x1eb0 }, + { 0x1eb3, 0x1eb2 }, + { 0x1eb5, 0x1eb4 }, + { 0x1eb7, 0x1eb6 }, + { 0x1eb9, 0x1eb8 }, + { 0x1ebb, 0x1eba }, + { 0x1ebd, 0x1ebc }, + { 0x1ebf, 0x1ebe }, + { 0x1ec1, 0x1ec0 }, + { 0x1ec3, 0x1ec2 }, + { 0x1ec5, 0x1ec4 }, + { 0x1ec7, 0x1ec6 }, + { 0x1ec9, 0x1ec8 }, + { 0x1ecb, 0x1eca }, + { 0x1ecd, 0x1ecc }, + { 0x1ecf, 0x1ece }, + { 0x1ed1, 0x1ed0 }, + { 0x1ed3, 0x1ed2 }, + { 0x1ed5, 0x1ed4 }, + { 0x1ed7, 0x1ed6 }, + { 0x1ed9, 0x1ed8 }, + { 0x1edb, 0x1eda }, + { 0x1edd, 0x1edc }, + { 0x1edf, 0x1ede }, + { 0x1ee1, 0x1ee0 }, + { 0x1ee3, 0x1ee2 }, + { 0x1ee5, 0x1ee4 }, + { 0x1ee7, 0x1ee6 }, + { 0x1ee9, 0x1ee8 }, + { 0x1eeb, 0x1eea }, + { 0x1eed, 0x1eec }, + { 0x1eef, 0x1eee }, + { 0x1ef1, 0x1ef0 }, + { 0x1ef3, 0x1ef2 }, + { 0x1ef5, 0x1ef4 }, + { 0x1ef7, 0x1ef6 }, + { 0x1ef9, 0x1ef8 }, + { 0x1efb, 0x1efa }, + { 0x1efd, 0x1efc }, + { 0x1eff, 0x1efe }, + { 0x1f00, 0x1f08 }, + { 0x1f01, 0x1f09 }, + { 0x1f02, 0x1f0a }, + { 0x1f03, 0x1f0b }, + { 0x1f04, 0x1f0c }, + { 0x1f05, 0x1f0d }, + { 0x1f06, 0x1f0e }, + { 0x1f07, 0x1f0f }, + { 0x1f10, 0x1f18 }, + { 0x1f11, 0x1f19 }, + { 0x1f12, 0x1f1a }, + { 0x1f13, 0x1f1b }, + { 0x1f14, 0x1f1c }, + { 0x1f15, 0x1f1d }, + { 0x1f20, 0x1f28 }, + { 0x1f21, 0x1f29 }, + { 0x1f22, 0x1f2a }, + { 0x1f23, 0x1f2b }, + { 0x1f24, 0x1f2c }, + { 0x1f25, 0x1f2d }, + { 0x1f26, 0x1f2e }, + { 0x1f27, 0x1f2f }, + { 0x1f30, 0x1f38 }, + { 0x1f31, 0x1f39 }, + { 0x1f32, 0x1f3a }, + { 0x1f33, 0x1f3b }, + { 0x1f34, 0x1f3c }, + { 0x1f35, 0x1f3d }, + { 0x1f36, 0x1f3e }, + { 0x1f37, 0x1f3f }, + { 0x1f40, 0x1f48 }, + { 0x1f41, 0x1f49 }, + { 0x1f42, 0x1f4a }, + { 0x1f43, 0x1f4b }, + { 0x1f44, 0x1f4c }, + { 0x1f45, 0x1f4d }, + { 0x1f51, 0x1f59 }, + { 0x1f53, 0x1f5b }, + { 0x1f55, 0x1f5d }, + { 0x1f57, 0x1f5f }, + { 0x1f60, 0x1f68 }, + { 0x1f61, 0x1f69 }, + { 0x1f62, 0x1f6a }, + { 0x1f63, 0x1f6b }, + { 0x1f64, 0x1f6c }, + { 0x1f65, 0x1f6d }, + { 0x1f66, 0x1f6e }, + { 0x1f67, 0x1f6f }, + { 0x1f70, 0x1fba }, + { 0x1f71, 0x1fbb }, + { 0x1f72, 0x1fc8 }, + { 0x1f73, 0x1fc9 }, + { 0x1f74, 0x1fca }, + { 0x1f75, 0x1fcb }, + { 0x1f76, 0x1fda }, + { 0x1f77, 0x1fdb }, + { 0x1f78, 0x1ff8 }, + { 0x1f79, 0x1ff9 }, + { 0x1f7a, 0x1fea }, + { 0x1f7b, 0x1feb }, + { 0x1f7c, 0x1ffa }, + { 0x1f7d, 0x1ffb }, + { 0x1f80, 0x1f88 }, + { 0x1f81, 0x1f89 }, + { 0x1f82, 0x1f8a }, + { 0x1f83, 0x1f8b }, + { 0x1f84, 0x1f8c }, + { 0x1f85, 0x1f8d }, + { 0x1f86, 0x1f8e }, + { 0x1f87, 0x1f8f }, + { 0x1f90, 0x1f98 }, + { 0x1f91, 0x1f99 }, + { 0x1f92, 0x1f9a }, + { 0x1f93, 0x1f9b }, + { 0x1f94, 0x1f9c }, + { 0x1f95, 0x1f9d }, + { 0x1f96, 0x1f9e }, + { 0x1f97, 0x1f9f }, + { 0x1fa0, 0x1fa8 }, + { 0x1fa1, 0x1fa9 }, + { 0x1fa2, 0x1faa }, + { 0x1fa3, 0x1fab }, + { 0x1fa4, 0x1fac }, + { 0x1fa5, 0x1fad }, + { 0x1fa6, 0x1fae }, + { 0x1fa7, 0x1faf }, + { 0x1fb0, 0x1fb8 }, + { 0x1fb1, 0x1fb9 }, + { 0x1fb3, 0x1fbc }, + { 0x1fbe, 0x399 }, + { 0x1fc3, 0x1fcc }, + { 0x1fd0, 0x1fd8 }, + { 0x1fd1, 0x1fd9 }, + { 0x1fe0, 0x1fe8 }, + { 0x1fe1, 0x1fe9 }, + { 0x1fe5, 0x1fec }, + { 0x1ff3, 0x1ffc }, + { 0x214e, 0x2132 }, + { 0x2170, 0x2160 }, + { 0x2171, 0x2161 }, + { 0x2172, 0x2162 }, + { 0x2173, 0x2163 }, + { 0x2174, 0x2164 }, + { 0x2175, 0x2165 }, + { 0x2176, 0x2166 }, + { 0x2177, 0x2167 }, + { 0x2178, 0x2168 }, + { 0x2179, 0x2169 }, + { 0x217a, 0x216a }, + { 0x217b, 0x216b }, + { 0x217c, 0x216c }, + { 0x217d, 0x216d }, + { 0x217e, 0x216e }, + { 0x217f, 0x216f }, + { 0x2184, 0x2183 }, + { 0x24d0, 0x24b6 }, + { 0x24d1, 0x24b7 }, + { 0x24d2, 0x24b8 }, + { 0x24d3, 0x24b9 }, + { 0x24d4, 0x24ba }, + { 0x24d5, 0x24bb }, + { 0x24d6, 0x24bc }, + { 0x24d7, 0x24bd }, + { 0x24d8, 0x24be }, + { 0x24d9, 0x24bf }, + { 0x24da, 0x24c0 }, + { 0x24db, 0x24c1 }, + { 0x24dc, 0x24c2 }, + { 0x24dd, 0x24c3 }, + { 0x24de, 0x24c4 }, + { 0x24df, 0x24c5 }, + { 0x24e0, 0x24c6 }, + { 0x24e1, 0x24c7 }, + { 0x24e2, 0x24c8 }, + { 0x24e3, 0x24c9 }, + { 0x24e4, 0x24ca }, + { 0x24e5, 0x24cb }, + { 0x24e6, 0x24cc }, + { 0x24e7, 0x24cd }, + { 0x24e8, 0x24ce }, + { 0x24e9, 0x24cf }, + { 0x2c30, 0x2c00 }, + { 0x2c31, 0x2c01 }, + { 0x2c32, 0x2c02 }, + { 0x2c33, 0x2c03 }, + { 0x2c34, 0x2c04 }, + { 0x2c35, 0x2c05 }, + { 0x2c36, 0x2c06 }, + { 0x2c37, 0x2c07 }, + { 0x2c38, 0x2c08 }, + { 0x2c39, 0x2c09 }, + { 0x2c3a, 0x2c0a }, + { 0x2c3b, 0x2c0b }, + { 0x2c3c, 0x2c0c }, + { 0x2c3d, 0x2c0d }, + { 0x2c3e, 0x2c0e }, + { 0x2c3f, 0x2c0f }, + { 0x2c40, 0x2c10 }, + { 0x2c41, 0x2c11 }, + { 0x2c42, 0x2c12 }, + { 0x2c43, 0x2c13 }, + { 0x2c44, 0x2c14 }, + { 0x2c45, 0x2c15 }, + { 0x2c46, 0x2c16 }, + { 0x2c47, 0x2c17 }, + { 0x2c48, 0x2c18 }, + { 0x2c49, 0x2c19 }, + { 0x2c4a, 0x2c1a }, + { 0x2c4b, 0x2c1b }, + { 0x2c4c, 0x2c1c }, + { 0x2c4d, 0x2c1d }, + { 0x2c4e, 0x2c1e }, + { 0x2c4f, 0x2c1f }, + { 0x2c50, 0x2c20 }, + { 0x2c51, 0x2c21 }, + { 0x2c52, 0x2c22 }, + { 0x2c53, 0x2c23 }, + { 0x2c54, 0x2c24 }, + { 0x2c55, 0x2c25 }, + { 0x2c56, 0x2c26 }, + { 0x2c57, 0x2c27 }, + { 0x2c58, 0x2c28 }, + { 0x2c59, 0x2c29 }, + { 0x2c5a, 0x2c2a }, + { 0x2c5b, 0x2c2b }, + { 0x2c5c, 0x2c2c }, + { 0x2c5d, 0x2c2d }, + { 0x2c5e, 0x2c2e }, + { 0x2c61, 0x2c60 }, + { 0x2c65, 0x23a }, + { 0x2c66, 0x23e }, + { 0x2c68, 0x2c67 }, + { 0x2c6a, 0x2c69 }, + { 0x2c6c, 0x2c6b }, + { 0x2c73, 0x2c72 }, + { 0x2c76, 0x2c75 }, + { 0x2c81, 0x2c80 }, + { 0x2c83, 0x2c82 }, + { 0x2c85, 0x2c84 }, + { 0x2c87, 0x2c86 }, + { 0x2c89, 0x2c88 }, + { 0x2c8b, 0x2c8a }, + { 0x2c8d, 0x2c8c }, + { 0x2c8f, 0x2c8e }, + { 0x2c91, 0x2c90 }, + { 0x2c93, 0x2c92 }, + { 0x2c95, 0x2c94 }, + { 0x2c97, 0x2c96 }, + { 0x2c99, 0x2c98 }, + { 0x2c9b, 0x2c9a }, + { 0x2c9d, 0x2c9c }, + { 0x2c9f, 0x2c9e }, + { 0x2ca1, 0x2ca0 }, + { 0x2ca3, 0x2ca2 }, + { 0x2ca5, 0x2ca4 }, + { 0x2ca7, 0x2ca6 }, + { 0x2ca9, 0x2ca8 }, + { 0x2cab, 0x2caa }, + { 0x2cad, 0x2cac }, + { 0x2caf, 0x2cae }, + { 0x2cb1, 0x2cb0 }, + { 0x2cb3, 0x2cb2 }, + { 0x2cb5, 0x2cb4 }, + { 0x2cb7, 0x2cb6 }, + { 0x2cb9, 0x2cb8 }, + { 0x2cbb, 0x2cba }, + { 0x2cbd, 0x2cbc }, + { 0x2cbf, 0x2cbe }, + { 0x2cc1, 0x2cc0 }, + { 0x2cc3, 0x2cc2 }, + { 0x2cc5, 0x2cc4 }, + { 0x2cc7, 0x2cc6 }, + { 0x2cc9, 0x2cc8 }, + { 0x2ccb, 0x2cca }, + { 0x2ccd, 0x2ccc }, + { 0x2ccf, 0x2cce }, + { 0x2cd1, 0x2cd0 }, + { 0x2cd3, 0x2cd2 }, + { 0x2cd5, 0x2cd4 }, + { 0x2cd7, 0x2cd6 }, + { 0x2cd9, 0x2cd8 }, + { 0x2cdb, 0x2cda }, + { 0x2cdd, 0x2cdc }, + { 0x2cdf, 0x2cde }, + { 0x2ce1, 0x2ce0 }, + { 0x2ce3, 0x2ce2 }, + { 0x2cec, 0x2ceb }, + { 0x2cee, 0x2ced }, + { 0x2cf3, 0x2cf2 }, + { 0x2d00, 0x10a0 }, + { 0x2d01, 0x10a1 }, + { 0x2d02, 0x10a2 }, + { 0x2d03, 0x10a3 }, + { 0x2d04, 0x10a4 }, + { 0x2d05, 0x10a5 }, + { 0x2d06, 0x10a6 }, + { 0x2d07, 0x10a7 }, + { 0x2d08, 0x10a8 }, + { 0x2d09, 0x10a9 }, + { 0x2d0a, 0x10aa }, + { 0x2d0b, 0x10ab }, + { 0x2d0c, 0x10ac }, + { 0x2d0d, 0x10ad }, + { 0x2d0e, 0x10ae }, + { 0x2d0f, 0x10af }, + { 0x2d10, 0x10b0 }, + { 0x2d11, 0x10b1 }, + { 0x2d12, 0x10b2 }, + { 0x2d13, 0x10b3 }, + { 0x2d14, 0x10b4 }, + { 0x2d15, 0x10b5 }, + { 0x2d16, 0x10b6 }, + { 0x2d17, 0x10b7 }, + { 0x2d18, 0x10b8 }, + { 0x2d19, 0x10b9 }, + { 0x2d1a, 0x10ba }, + { 0x2d1b, 0x10bb }, + { 0x2d1c, 0x10bc }, + { 0x2d1d, 0x10bd }, + { 0x2d1e, 0x10be }, + { 0x2d1f, 0x10bf }, + { 0x2d20, 0x10c0 }, + { 0x2d21, 0x10c1 }, + { 0x2d22, 0x10c2 }, + { 0x2d23, 0x10c3 }, + { 0x2d24, 0x10c4 }, + { 0x2d25, 0x10c5 }, + { 0x2d27, 0x10c7 }, + { 0x2d2d, 0x10cd }, + { 0xa641, 0xa640 }, + { 0xa643, 0xa642 }, + { 0xa645, 0xa644 }, + { 0xa647, 0xa646 }, + { 0xa649, 0xa648 }, + { 0xa64b, 0xa64a }, + { 0xa64d, 0xa64c }, + { 0xa64f, 0xa64e }, + { 0xa651, 0xa650 }, + { 0xa653, 0xa652 }, + { 0xa655, 0xa654 }, + { 0xa657, 0xa656 }, + { 0xa659, 0xa658 }, + { 0xa65b, 0xa65a }, + { 0xa65d, 0xa65c }, + { 0xa65f, 0xa65e }, + { 0xa661, 0xa660 }, + { 0xa663, 0xa662 }, + { 0xa665, 0xa664 }, + { 0xa667, 0xa666 }, + { 0xa669, 0xa668 }, + { 0xa66b, 0xa66a }, + { 0xa66d, 0xa66c }, + { 0xa681, 0xa680 }, + { 0xa683, 0xa682 }, + { 0xa685, 0xa684 }, + { 0xa687, 0xa686 }, + { 0xa689, 0xa688 }, + { 0xa68b, 0xa68a }, + { 0xa68d, 0xa68c }, + { 0xa68f, 0xa68e }, + { 0xa691, 0xa690 }, + { 0xa693, 0xa692 }, + { 0xa695, 0xa694 }, + { 0xa697, 0xa696 }, + { 0xa699, 0xa698 }, + { 0xa69b, 0xa69a }, + { 0xa723, 0xa722 }, + { 0xa725, 0xa724 }, + { 0xa727, 0xa726 }, + { 0xa729, 0xa728 }, + { 0xa72b, 0xa72a }, + { 0xa72d, 0xa72c }, + { 0xa72f, 0xa72e }, + { 0xa733, 0xa732 }, + { 0xa735, 0xa734 }, + { 0xa737, 0xa736 }, + { 0xa739, 0xa738 }, + { 0xa73b, 0xa73a }, + { 0xa73d, 0xa73c }, + { 0xa73f, 0xa73e }, + { 0xa741, 0xa740 }, + { 0xa743, 0xa742 }, + { 0xa745, 0xa744 }, + { 0xa747, 0xa746 }, + { 0xa749, 0xa748 }, + { 0xa74b, 0xa74a }, + { 0xa74d, 0xa74c }, + { 0xa74f, 0xa74e }, + { 0xa751, 0xa750 }, + { 0xa753, 0xa752 }, + { 0xa755, 0xa754 }, + { 0xa757, 0xa756 }, + { 0xa759, 0xa758 }, + { 0xa75b, 0xa75a }, + { 0xa75d, 0xa75c }, + { 0xa75f, 0xa75e }, + { 0xa761, 0xa760 }, + { 0xa763, 0xa762 }, + { 0xa765, 0xa764 }, + { 0xa767, 0xa766 }, + { 0xa769, 0xa768 }, + { 0xa76b, 0xa76a }, + { 0xa76d, 0xa76c }, + { 0xa76f, 0xa76e }, + { 0xa77a, 0xa779 }, + { 0xa77c, 0xa77b }, + { 0xa77f, 0xa77e }, + { 0xa781, 0xa780 }, + { 0xa783, 0xa782 }, + { 0xa785, 0xa784 }, + { 0xa787, 0xa786 }, + { 0xa78c, 0xa78b }, + { 0xa791, 0xa790 }, + { 0xa793, 0xa792 }, + { 0xa797, 0xa796 }, + { 0xa799, 0xa798 }, + { 0xa79b, 0xa79a }, + { 0xa79d, 0xa79c }, + { 0xa79f, 0xa79e }, + { 0xa7a1, 0xa7a0 }, + { 0xa7a3, 0xa7a2 }, + { 0xa7a5, 0xa7a4 }, + { 0xa7a7, 0xa7a6 }, + { 0xa7a9, 0xa7a8 }, + { 0xa7b5, 0xa7b4 }, + { 0xa7b7, 0xa7b6 }, + { 0xab53, 0xa7b3 }, + { 0xab70, 0x13a0 }, + { 0xab71, 0x13a1 }, + { 0xab72, 0x13a2 }, + { 0xab73, 0x13a3 }, + { 0xab74, 0x13a4 }, + { 0xab75, 0x13a5 }, + { 0xab76, 0x13a6 }, + { 0xab77, 0x13a7 }, + { 0xab78, 0x13a8 }, + { 0xab79, 0x13a9 }, + { 0xab7a, 0x13aa }, + { 0xab7b, 0x13ab }, + { 0xab7c, 0x13ac }, + { 0xab7d, 0x13ad }, + { 0xab7e, 0x13ae }, + { 0xab7f, 0x13af }, + { 0xab80, 0x13b0 }, + { 0xab81, 0x13b1 }, + { 0xab82, 0x13b2 }, + { 0xab83, 0x13b3 }, + { 0xab84, 0x13b4 }, + { 0xab85, 0x13b5 }, + { 0xab86, 0x13b6 }, + { 0xab87, 0x13b7 }, + { 0xab88, 0x13b8 }, + { 0xab89, 0x13b9 }, + { 0xab8a, 0x13ba }, + { 0xab8b, 0x13bb }, + { 0xab8c, 0x13bc }, + { 0xab8d, 0x13bd }, + { 0xab8e, 0x13be }, + { 0xab8f, 0x13bf }, + { 0xab90, 0x13c0 }, + { 0xab91, 0x13c1 }, + { 0xab92, 0x13c2 }, + { 0xab93, 0x13c3 }, + { 0xab94, 0x13c4 }, + { 0xab95, 0x13c5 }, + { 0xab96, 0x13c6 }, + { 0xab97, 0x13c7 }, + { 0xab98, 0x13c8 }, + { 0xab99, 0x13c9 }, + { 0xab9a, 0x13ca }, + { 0xab9b, 0x13cb }, + { 0xab9c, 0x13cc }, + { 0xab9d, 0x13cd }, + { 0xab9e, 0x13ce }, + { 0xab9f, 0x13cf }, + { 0xaba0, 0x13d0 }, + { 0xaba1, 0x13d1 }, + { 0xaba2, 0x13d2 }, + { 0xaba3, 0x13d3 }, + { 0xaba4, 0x13d4 }, + { 0xaba5, 0x13d5 }, + { 0xaba6, 0x13d6 }, + { 0xaba7, 0x13d7 }, + { 0xaba8, 0x13d8 }, + { 0xaba9, 0x13d9 }, + { 0xabaa, 0x13da }, + { 0xabab, 0x13db }, + { 0xabac, 0x13dc }, + { 0xabad, 0x13dd }, + { 0xabae, 0x13de }, + { 0xabaf, 0x13df }, + { 0xabb0, 0x13e0 }, + { 0xabb1, 0x13e1 }, + { 0xabb2, 0x13e2 }, + { 0xabb3, 0x13e3 }, + { 0xabb4, 0x13e4 }, + { 0xabb5, 0x13e5 }, + { 0xabb6, 0x13e6 }, + { 0xabb7, 0x13e7 }, + { 0xabb8, 0x13e8 }, + { 0xabb9, 0x13e9 }, + { 0xabba, 0x13ea }, + { 0xabbb, 0x13eb }, + { 0xabbc, 0x13ec }, + { 0xabbd, 0x13ed }, + { 0xabbe, 0x13ee }, + { 0xabbf, 0x13ef }, + { 0xff41, 0xff21 }, + { 0xff42, 0xff22 }, + { 0xff43, 0xff23 }, + { 0xff44, 0xff24 }, + { 0xff45, 0xff25 }, + { 0xff46, 0xff26 }, + { 0xff47, 0xff27 }, + { 0xff48, 0xff28 }, + { 0xff49, 0xff29 }, + { 0xff4a, 0xff2a }, + { 0xff4b, 0xff2b }, + { 0xff4c, 0xff2c }, + { 0xff4d, 0xff2d }, + { 0xff4e, 0xff2e }, + { 0xff4f, 0xff2f }, + { 0xff50, 0xff30 }, + { 0xff51, 0xff31 }, + { 0xff52, 0xff32 }, + { 0xff53, 0xff33 }, + { 0xff54, 0xff34 }, + { 0xff55, 0xff35 }, + { 0xff56, 0xff36 }, + { 0xff57, 0xff37 }, + { 0xff58, 0xff38 }, + { 0xff59, 0xff39 }, + { 0xff5a, 0xff3a }, + { 0x10428, 0x10400 }, + { 0x10429, 0x10401 }, + { 0x1042a, 0x10402 }, + { 0x1042b, 0x10403 }, + { 0x1042c, 0x10404 }, + { 0x1042d, 0x10405 }, + { 0x1042e, 0x10406 }, + { 0x1042f, 0x10407 }, + { 0x10430, 0x10408 }, + { 0x10431, 0x10409 }, + { 0x10432, 0x1040a }, + { 0x10433, 0x1040b }, + { 0x10434, 0x1040c }, + { 0x10435, 0x1040d }, + { 0x10436, 0x1040e }, + { 0x10437, 0x1040f }, + { 0x10438, 0x10410 }, + { 0x10439, 0x10411 }, + { 0x1043a, 0x10412 }, + { 0x1043b, 0x10413 }, + { 0x1043c, 0x10414 }, + { 0x1043d, 0x10415 }, + { 0x1043e, 0x10416 }, + { 0x1043f, 0x10417 }, + { 0x10440, 0x10418 }, + { 0x10441, 0x10419 }, + { 0x10442, 0x1041a }, + { 0x10443, 0x1041b }, + { 0x10444, 0x1041c }, + { 0x10445, 0x1041d }, + { 0x10446, 0x1041e }, + { 0x10447, 0x1041f }, + { 0x10448, 0x10420 }, + { 0x10449, 0x10421 }, + { 0x1044a, 0x10422 }, + { 0x1044b, 0x10423 }, + { 0x1044c, 0x10424 }, + { 0x1044d, 0x10425 }, + { 0x1044e, 0x10426 }, + { 0x1044f, 0x10427 }, + { 0x10cc0, 0x10c80 }, + { 0x10cc1, 0x10c81 }, + { 0x10cc2, 0x10c82 }, + { 0x10cc3, 0x10c83 }, + { 0x10cc4, 0x10c84 }, + { 0x10cc5, 0x10c85 }, + { 0x10cc6, 0x10c86 }, + { 0x10cc7, 0x10c87 }, + { 0x10cc8, 0x10c88 }, + { 0x10cc9, 0x10c89 }, + { 0x10cca, 0x10c8a }, + { 0x10ccb, 0x10c8b }, + { 0x10ccc, 0x10c8c }, + { 0x10ccd, 0x10c8d }, + { 0x10cce, 0x10c8e }, + { 0x10ccf, 0x10c8f }, + { 0x10cd0, 0x10c90 }, + { 0x10cd1, 0x10c91 }, + { 0x10cd2, 0x10c92 }, + { 0x10cd3, 0x10c93 }, + { 0x10cd4, 0x10c94 }, + { 0x10cd5, 0x10c95 }, + { 0x10cd6, 0x10c96 }, + { 0x10cd7, 0x10c97 }, + { 0x10cd8, 0x10c98 }, + { 0x10cd9, 0x10c99 }, + { 0x10cda, 0x10c9a }, + { 0x10cdb, 0x10c9b }, + { 0x10cdc, 0x10c9c }, + { 0x10cdd, 0x10c9d }, + { 0x10cde, 0x10c9e }, + { 0x10cdf, 0x10c9f }, + { 0x10ce0, 0x10ca0 }, + { 0x10ce1, 0x10ca1 }, + { 0x10ce2, 0x10ca2 }, + { 0x10ce3, 0x10ca3 }, + { 0x10ce4, 0x10ca4 }, + { 0x10ce5, 0x10ca5 }, + { 0x10ce6, 0x10ca6 }, + { 0x10ce7, 0x10ca7 }, + { 0x10ce8, 0x10ca8 }, + { 0x10ce9, 0x10ca9 }, + { 0x10cea, 0x10caa }, + { 0x10ceb, 0x10cab }, + { 0x10cec, 0x10cac }, + { 0x10ced, 0x10cad }, + { 0x10cee, 0x10cae }, + { 0x10cef, 0x10caf }, + { 0x10cf0, 0x10cb0 }, + { 0x10cf1, 0x10cb1 }, + { 0x10cf2, 0x10cb2 }, + { 0x118c0, 0x118a0 }, + { 0x118c1, 0x118a1 }, + { 0x118c2, 0x118a2 }, + { 0x118c3, 0x118a3 }, + { 0x118c4, 0x118a4 }, + { 0x118c5, 0x118a5 }, + { 0x118c6, 0x118a6 }, + { 0x118c7, 0x118a7 }, + { 0x118c8, 0x118a8 }, + { 0x118c9, 0x118a9 }, + { 0x118ca, 0x118aa }, + { 0x118cb, 0x118ab }, + { 0x118cc, 0x118ac }, + { 0x118cd, 0x118ad }, + { 0x118ce, 0x118ae }, + { 0x118cf, 0x118af }, + { 0x118d0, 0x118b0 }, + { 0x118d1, 0x118b1 }, + { 0x118d2, 0x118b2 }, + { 0x118d3, 0x118b3 }, + { 0x118d4, 0x118b4 }, + { 0x118d5, 0x118b5 }, + { 0x118d6, 0x118b6 }, + { 0x118d7, 0x118b7 }, + { 0x118d8, 0x118b8 }, + { 0x118d9, 0x118b9 }, + { 0x118da, 0x118ba }, + { 0x118db, 0x118bb }, + { 0x118dc, 0x118bc }, + { 0x118dd, 0x118bd }, + { 0x118de, 0x118be }, + { 0x118df, 0x118bf }, +}; + +extern int runeinrange(const void* a, const void* b); + +Rune toupperrune(Rune ch) { + Rune* to = bsearch(&ch, mappings, 1241, 2 * sizeof(Rune), &runeinrange); + return (to == NULL) ? ch : to[1]; +} diff --git a/source/utf/uppers.c b/source/utf/uppers.c index 60adec7..d1aa75d 100644 --- a/source/utf/uppers.c +++ b/source/utf/uppers.c @@ -1,73 +1,553 @@ #include -static Rune uppers[625][2] = { +static Rune singles[539] = { + 0x100, + 0x102, + 0x104, + 0x106, + 0x108, + 0x10a, + 0x10c, + 0x10e, + 0x110, + 0x112, + 0x114, + 0x116, + 0x118, + 0x11a, + 0x11c, + 0x11e, + 0x120, + 0x122, + 0x124, + 0x126, + 0x128, + 0x12a, + 0x12c, + 0x12e, + 0x130, + 0x132, + 0x134, + 0x136, + 0x139, + 0x13b, + 0x13d, + 0x13f, + 0x141, + 0x143, + 0x145, + 0x147, + 0x14a, + 0x14c, + 0x14e, + 0x150, + 0x152, + 0x154, + 0x156, + 0x158, + 0x15a, + 0x15c, + 0x15e, + 0x160, + 0x162, + 0x164, + 0x166, + 0x168, + 0x16a, + 0x16c, + 0x16e, + 0x170, + 0x172, + 0x174, + 0x176, + 0x17b, + 0x17d, + 0x184, + 0x1a2, + 0x1a4, + 0x1a9, + 0x1ac, + 0x1b5, + 0x1bc, + 0x1c4, + 0x1c7, + 0x1ca, + 0x1cd, + 0x1cf, + 0x1d1, + 0x1d3, + 0x1d5, + 0x1d7, + 0x1d9, + 0x1db, + 0x1de, + 0x1e0, + 0x1e2, + 0x1e4, + 0x1e6, + 0x1e8, + 0x1ea, + 0x1ec, + 0x1ee, + 0x1f1, + 0x1f4, + 0x1fa, + 0x1fc, + 0x1fe, + 0x200, + 0x202, + 0x204, + 0x206, + 0x208, + 0x20a, + 0x20c, + 0x20e, + 0x210, + 0x212, + 0x214, + 0x216, + 0x218, + 0x21a, + 0x21c, + 0x21e, + 0x220, + 0x222, + 0x224, + 0x226, + 0x228, + 0x22a, + 0x22c, + 0x22e, + 0x230, + 0x232, + 0x241, + 0x248, + 0x24a, + 0x24c, + 0x24e, + 0x370, + 0x372, + 0x376, + 0x37f, + 0x386, + 0x38c, + 0x3cf, + 0x3d8, + 0x3da, + 0x3dc, + 0x3de, + 0x3e0, + 0x3e2, + 0x3e4, + 0x3e6, + 0x3e8, + 0x3ea, + 0x3ec, + 0x3ee, + 0x3f4, + 0x3f7, + 0x460, + 0x462, + 0x464, + 0x466, + 0x468, + 0x46a, + 0x46c, + 0x46e, + 0x470, + 0x472, + 0x474, + 0x476, + 0x478, + 0x47a, + 0x47c, + 0x47e, + 0x480, + 0x48a, + 0x48c, + 0x48e, + 0x490, + 0x492, + 0x494, + 0x496, + 0x498, + 0x49a, + 0x49c, + 0x49e, + 0x4a0, + 0x4a2, + 0x4a4, + 0x4a6, + 0x4a8, + 0x4aa, + 0x4ac, + 0x4ae, + 0x4b0, + 0x4b2, + 0x4b4, + 0x4b6, + 0x4b8, + 0x4ba, + 0x4bc, + 0x4be, + 0x4c3, + 0x4c5, + 0x4c7, + 0x4c9, + 0x4cb, + 0x4cd, + 0x4d0, + 0x4d2, + 0x4d4, + 0x4d6, + 0x4d8, + 0x4da, + 0x4dc, + 0x4de, + 0x4e0, + 0x4e2, + 0x4e4, + 0x4e6, + 0x4e8, + 0x4ea, + 0x4ec, + 0x4ee, + 0x4f0, + 0x4f2, + 0x4f4, + 0x4f6, + 0x4f8, + 0x4fa, + 0x4fc, + 0x4fe, + 0x500, + 0x502, + 0x504, + 0x506, + 0x508, + 0x50a, + 0x50c, + 0x50e, + 0x510, + 0x512, + 0x514, + 0x516, + 0x518, + 0x51a, + 0x51c, + 0x51e, + 0x520, + 0x522, + 0x524, + 0x526, + 0x528, + 0x52a, + 0x52c, + 0x52e, + 0x10c7, + 0x10cd, + 0x1e00, + 0x1e02, + 0x1e04, + 0x1e06, + 0x1e08, + 0x1e0a, + 0x1e0c, + 0x1e0e, + 0x1e10, + 0x1e12, + 0x1e14, + 0x1e16, + 0x1e18, + 0x1e1a, + 0x1e1c, + 0x1e1e, + 0x1e20, + 0x1e22, + 0x1e24, + 0x1e26, + 0x1e28, + 0x1e2a, + 0x1e2c, + 0x1e2e, + 0x1e30, + 0x1e32, + 0x1e34, + 0x1e36, + 0x1e38, + 0x1e3a, + 0x1e3c, + 0x1e3e, + 0x1e40, + 0x1e42, + 0x1e44, + 0x1e46, + 0x1e48, + 0x1e4a, + 0x1e4c, + 0x1e4e, + 0x1e50, + 0x1e52, + 0x1e54, + 0x1e56, + 0x1e58, + 0x1e5a, + 0x1e5c, + 0x1e5e, + 0x1e60, + 0x1e62, + 0x1e64, + 0x1e66, + 0x1e68, + 0x1e6a, + 0x1e6c, + 0x1e6e, + 0x1e70, + 0x1e72, + 0x1e74, + 0x1e76, + 0x1e78, + 0x1e7a, + 0x1e7c, + 0x1e7e, + 0x1e80, + 0x1e82, + 0x1e84, + 0x1e86, + 0x1e88, + 0x1e8a, + 0x1e8c, + 0x1e8e, + 0x1e90, + 0x1e92, + 0x1e94, + 0x1e9e, + 0x1ea0, + 0x1ea2, + 0x1ea4, + 0x1ea6, + 0x1ea8, + 0x1eaa, + 0x1eac, + 0x1eae, + 0x1eb0, + 0x1eb2, + 0x1eb4, + 0x1eb6, + 0x1eb8, + 0x1eba, + 0x1ebc, + 0x1ebe, + 0x1ec0, + 0x1ec2, + 0x1ec4, + 0x1ec6, + 0x1ec8, + 0x1eca, + 0x1ecc, + 0x1ece, + 0x1ed0, + 0x1ed2, + 0x1ed4, + 0x1ed6, + 0x1ed8, + 0x1eda, + 0x1edc, + 0x1ede, + 0x1ee0, + 0x1ee2, + 0x1ee4, + 0x1ee6, + 0x1ee8, + 0x1eea, + 0x1eec, + 0x1eee, + 0x1ef0, + 0x1ef2, + 0x1ef4, + 0x1ef6, + 0x1ef8, + 0x1efa, + 0x1efc, + 0x1efe, + 0x1f59, + 0x1f5b, + 0x1f5d, + 0x1f5f, + 0x2102, + 0x2107, + 0x2115, + 0x2124, + 0x2126, + 0x2128, + 0x2145, + 0x2183, + 0x2c60, + 0x2c67, + 0x2c69, + 0x2c6b, + 0x2c72, + 0x2c75, + 0x2c82, + 0x2c84, + 0x2c86, + 0x2c88, + 0x2c8a, + 0x2c8c, + 0x2c8e, + 0x2c90, + 0x2c92, + 0x2c94, + 0x2c96, + 0x2c98, + 0x2c9a, + 0x2c9c, + 0x2c9e, + 0x2ca0, + 0x2ca2, + 0x2ca4, + 0x2ca6, + 0x2ca8, + 0x2caa, + 0x2cac, + 0x2cae, + 0x2cb0, + 0x2cb2, + 0x2cb4, + 0x2cb6, + 0x2cb8, + 0x2cba, + 0x2cbc, + 0x2cbe, + 0x2cc0, + 0x2cc2, + 0x2cc4, + 0x2cc6, + 0x2cc8, + 0x2cca, + 0x2ccc, + 0x2cce, + 0x2cd0, + 0x2cd2, + 0x2cd4, + 0x2cd6, + 0x2cd8, + 0x2cda, + 0x2cdc, + 0x2cde, + 0x2ce0, + 0x2ce2, + 0x2ceb, + 0x2ced, + 0x2cf2, + 0xa640, + 0xa642, + 0xa644, + 0xa646, + 0xa648, + 0xa64a, + 0xa64c, + 0xa64e, + 0xa650, + 0xa652, + 0xa654, + 0xa656, + 0xa658, + 0xa65a, + 0xa65c, + 0xa65e, + 0xa660, + 0xa662, + 0xa664, + 0xa666, + 0xa668, + 0xa66a, + 0xa66c, + 0xa680, + 0xa682, + 0xa684, + 0xa686, + 0xa688, + 0xa68a, + 0xa68c, + 0xa68e, + 0xa690, + 0xa692, + 0xa694, + 0xa696, + 0xa698, + 0xa69a, + 0xa722, + 0xa724, + 0xa726, + 0xa728, + 0xa72a, + 0xa72c, + 0xa72e, + 0xa732, + 0xa734, + 0xa736, + 0xa738, + 0xa73a, + 0xa73c, + 0xa73e, + 0xa740, + 0xa742, + 0xa744, + 0xa746, + 0xa748, + 0xa74a, + 0xa74c, + 0xa74e, + 0xa750, + 0xa752, + 0xa754, + 0xa756, + 0xa758, + 0xa75a, + 0xa75c, + 0xa75e, + 0xa760, + 0xa762, + 0xa764, + 0xa766, + 0xa768, + 0xa76a, + 0xa76c, + 0xa76e, + 0xa779, + 0xa77b, + 0xa780, + 0xa782, + 0xa784, + 0xa786, + 0xa78b, + 0xa78d, + 0xa790, + 0xa792, + 0xa796, + 0xa798, + 0xa79a, + 0xa79c, + 0xa79e, + 0xa7a0, + 0xa7a2, + 0xa7a4, + 0xa7a6, + 0xa7a8, + 0xa7b6, + 0x1d49c, + 0x1d4a2, + 0x1d546, + 0x1d7ca +}; + +static Rune ranges[86][2] = { { 0x41, 0x5a }, { 0xc0, 0xd6 }, { 0xd8, 0xde }, - { 0x100, 0x100 }, - { 0x102, 0x102 }, - { 0x104, 0x104 }, - { 0x106, 0x106 }, - { 0x108, 0x108 }, - { 0x10a, 0x10a }, - { 0x10c, 0x10c }, - { 0x10e, 0x10e }, - { 0x110, 0x110 }, - { 0x112, 0x112 }, - { 0x114, 0x114 }, - { 0x116, 0x116 }, - { 0x118, 0x118 }, - { 0x11a, 0x11a }, - { 0x11c, 0x11c }, - { 0x11e, 0x11e }, - { 0x120, 0x120 }, - { 0x122, 0x122 }, - { 0x124, 0x124 }, - { 0x126, 0x126 }, - { 0x128, 0x128 }, - { 0x12a, 0x12a }, - { 0x12c, 0x12c }, - { 0x12e, 0x12e }, - { 0x130, 0x130 }, - { 0x132, 0x132 }, - { 0x134, 0x134 }, - { 0x136, 0x136 }, - { 0x139, 0x139 }, - { 0x13b, 0x13b }, - { 0x13d, 0x13d }, - { 0x13f, 0x13f }, - { 0x141, 0x141 }, - { 0x143, 0x143 }, - { 0x145, 0x145 }, - { 0x147, 0x147 }, - { 0x14a, 0x14a }, - { 0x14c, 0x14c }, - { 0x14e, 0x14e }, - { 0x150, 0x150 }, - { 0x152, 0x152 }, - { 0x154, 0x154 }, - { 0x156, 0x156 }, - { 0x158, 0x158 }, - { 0x15a, 0x15a }, - { 0x15c, 0x15c }, - { 0x15e, 0x15e }, - { 0x160, 0x160 }, - { 0x162, 0x162 }, - { 0x164, 0x164 }, - { 0x166, 0x166 }, - { 0x168, 0x168 }, - { 0x16a, 0x16a }, - { 0x16c, 0x16c }, - { 0x16e, 0x16e }, - { 0x170, 0x170 }, - { 0x172, 0x172 }, - { 0x174, 0x174 }, - { 0x176, 0x176 }, { 0x178, 0x179 }, - { 0x17b, 0x17b }, - { 0x17d, 0x17d }, { 0x181, 0x182 }, - { 0x184, 0x184 }, { 0x186, 0x187 }, { 0x189, 0x18b }, { 0x18e, 0x191 }, @@ -75,522 +555,49 @@ static Rune uppers[625][2] = { { 0x196, 0x198 }, { 0x19c, 0x19d }, { 0x19f, 0x1a0 }, - { 0x1a2, 0x1a2 }, - { 0x1a4, 0x1a4 }, { 0x1a6, 0x1a7 }, - { 0x1a9, 0x1a9 }, - { 0x1ac, 0x1ac }, { 0x1ae, 0x1af }, { 0x1b1, 0x1b3 }, - { 0x1b5, 0x1b5 }, { 0x1b7, 0x1b8 }, - { 0x1bc, 0x1bc }, - { 0x1c4, 0x1c4 }, - { 0x1c7, 0x1c7 }, - { 0x1ca, 0x1ca }, - { 0x1cd, 0x1cd }, - { 0x1cf, 0x1cf }, - { 0x1d1, 0x1d1 }, - { 0x1d3, 0x1d3 }, - { 0x1d5, 0x1d5 }, - { 0x1d7, 0x1d7 }, - { 0x1d9, 0x1d9 }, - { 0x1db, 0x1db }, - { 0x1de, 0x1de }, - { 0x1e0, 0x1e0 }, - { 0x1e2, 0x1e2 }, - { 0x1e4, 0x1e4 }, - { 0x1e6, 0x1e6 }, - { 0x1e8, 0x1e8 }, - { 0x1ea, 0x1ea }, - { 0x1ec, 0x1ec }, - { 0x1ee, 0x1ee }, - { 0x1f1, 0x1f1 }, - { 0x1f4, 0x1f4 }, { 0x1f6, 0x1f8 }, - { 0x1fa, 0x1fa }, - { 0x1fc, 0x1fc }, - { 0x1fe, 0x1fe }, - { 0x200, 0x200 }, - { 0x202, 0x202 }, - { 0x204, 0x204 }, - { 0x206, 0x206 }, - { 0x208, 0x208 }, - { 0x20a, 0x20a }, - { 0x20c, 0x20c }, - { 0x20e, 0x20e }, - { 0x210, 0x210 }, - { 0x212, 0x212 }, - { 0x214, 0x214 }, - { 0x216, 0x216 }, - { 0x218, 0x218 }, - { 0x21a, 0x21a }, - { 0x21c, 0x21c }, - { 0x21e, 0x21e }, - { 0x220, 0x220 }, - { 0x222, 0x222 }, - { 0x224, 0x224 }, - { 0x226, 0x226 }, - { 0x228, 0x228 }, - { 0x22a, 0x22a }, - { 0x22c, 0x22c }, - { 0x22e, 0x22e }, - { 0x230, 0x230 }, - { 0x232, 0x232 }, { 0x23a, 0x23b }, { 0x23d, 0x23e }, - { 0x241, 0x241 }, { 0x243, 0x246 }, - { 0x248, 0x248 }, - { 0x24a, 0x24a }, - { 0x24c, 0x24c }, - { 0x24e, 0x24e }, - { 0x370, 0x370 }, - { 0x372, 0x372 }, - { 0x376, 0x376 }, - { 0x37f, 0x37f }, - { 0x386, 0x386 }, { 0x388, 0x38a }, - { 0x38c, 0x38c }, { 0x38e, 0x38f }, { 0x391, 0x3a1 }, { 0x3a3, 0x3ab }, - { 0x3cf, 0x3cf }, { 0x3d2, 0x3d4 }, - { 0x3d8, 0x3d8 }, - { 0x3da, 0x3da }, - { 0x3dc, 0x3dc }, - { 0x3de, 0x3de }, - { 0x3e0, 0x3e0 }, - { 0x3e2, 0x3e2 }, - { 0x3e4, 0x3e4 }, - { 0x3e6, 0x3e6 }, - { 0x3e8, 0x3e8 }, - { 0x3ea, 0x3ea }, - { 0x3ec, 0x3ec }, - { 0x3ee, 0x3ee }, - { 0x3f4, 0x3f4 }, - { 0x3f7, 0x3f7 }, { 0x3f9, 0x3fa }, { 0x3fd, 0x42f }, - { 0x460, 0x460 }, - { 0x462, 0x462 }, - { 0x464, 0x464 }, - { 0x466, 0x466 }, - { 0x468, 0x468 }, - { 0x46a, 0x46a }, - { 0x46c, 0x46c }, - { 0x46e, 0x46e }, - { 0x470, 0x470 }, - { 0x472, 0x472 }, - { 0x474, 0x474 }, - { 0x476, 0x476 }, - { 0x478, 0x478 }, - { 0x47a, 0x47a }, - { 0x47c, 0x47c }, - { 0x47e, 0x47e }, - { 0x480, 0x480 }, - { 0x48a, 0x48a }, - { 0x48c, 0x48c }, - { 0x48e, 0x48e }, - { 0x490, 0x490 }, - { 0x492, 0x492 }, - { 0x494, 0x494 }, - { 0x496, 0x496 }, - { 0x498, 0x498 }, - { 0x49a, 0x49a }, - { 0x49c, 0x49c }, - { 0x49e, 0x49e }, - { 0x4a0, 0x4a0 }, - { 0x4a2, 0x4a2 }, - { 0x4a4, 0x4a4 }, - { 0x4a6, 0x4a6 }, - { 0x4a8, 0x4a8 }, - { 0x4aa, 0x4aa }, - { 0x4ac, 0x4ac }, - { 0x4ae, 0x4ae }, - { 0x4b0, 0x4b0 }, - { 0x4b2, 0x4b2 }, - { 0x4b4, 0x4b4 }, - { 0x4b6, 0x4b6 }, - { 0x4b8, 0x4b8 }, - { 0x4ba, 0x4ba }, - { 0x4bc, 0x4bc }, - { 0x4be, 0x4be }, { 0x4c0, 0x4c1 }, - { 0x4c3, 0x4c3 }, - { 0x4c5, 0x4c5 }, - { 0x4c7, 0x4c7 }, - { 0x4c9, 0x4c9 }, - { 0x4cb, 0x4cb }, - { 0x4cd, 0x4cd }, - { 0x4d0, 0x4d0 }, - { 0x4d2, 0x4d2 }, - { 0x4d4, 0x4d4 }, - { 0x4d6, 0x4d6 }, - { 0x4d8, 0x4d8 }, - { 0x4da, 0x4da }, - { 0x4dc, 0x4dc }, - { 0x4de, 0x4de }, - { 0x4e0, 0x4e0 }, - { 0x4e2, 0x4e2 }, - { 0x4e4, 0x4e4 }, - { 0x4e6, 0x4e6 }, - { 0x4e8, 0x4e8 }, - { 0x4ea, 0x4ea }, - { 0x4ec, 0x4ec }, - { 0x4ee, 0x4ee }, - { 0x4f0, 0x4f0 }, - { 0x4f2, 0x4f2 }, - { 0x4f4, 0x4f4 }, - { 0x4f6, 0x4f6 }, - { 0x4f8, 0x4f8 }, - { 0x4fa, 0x4fa }, - { 0x4fc, 0x4fc }, - { 0x4fe, 0x4fe }, - { 0x500, 0x500 }, - { 0x502, 0x502 }, - { 0x504, 0x504 }, - { 0x506, 0x506 }, - { 0x508, 0x508 }, - { 0x50a, 0x50a }, - { 0x50c, 0x50c }, - { 0x50e, 0x50e }, - { 0x510, 0x510 }, - { 0x512, 0x512 }, - { 0x514, 0x514 }, - { 0x516, 0x516 }, - { 0x518, 0x518 }, - { 0x51a, 0x51a }, - { 0x51c, 0x51c }, - { 0x51e, 0x51e }, - { 0x520, 0x520 }, - { 0x522, 0x522 }, - { 0x524, 0x524 }, - { 0x526, 0x526 }, - { 0x528, 0x528 }, - { 0x52a, 0x52a }, - { 0x52c, 0x52c }, - { 0x52e, 0x52e }, { 0x531, 0x556 }, { 0x10a0, 0x10c5 }, - { 0x10c7, 0x10c7 }, - { 0x10cd, 0x10cd }, { 0x13a0, 0x13f5 }, - { 0x1e00, 0x1e00 }, - { 0x1e02, 0x1e02 }, - { 0x1e04, 0x1e04 }, - { 0x1e06, 0x1e06 }, - { 0x1e08, 0x1e08 }, - { 0x1e0a, 0x1e0a }, - { 0x1e0c, 0x1e0c }, - { 0x1e0e, 0x1e0e }, - { 0x1e10, 0x1e10 }, - { 0x1e12, 0x1e12 }, - { 0x1e14, 0x1e14 }, - { 0x1e16, 0x1e16 }, - { 0x1e18, 0x1e18 }, - { 0x1e1a, 0x1e1a }, - { 0x1e1c, 0x1e1c }, - { 0x1e1e, 0x1e1e }, - { 0x1e20, 0x1e20 }, - { 0x1e22, 0x1e22 }, - { 0x1e24, 0x1e24 }, - { 0x1e26, 0x1e26 }, - { 0x1e28, 0x1e28 }, - { 0x1e2a, 0x1e2a }, - { 0x1e2c, 0x1e2c }, - { 0x1e2e, 0x1e2e }, - { 0x1e30, 0x1e30 }, - { 0x1e32, 0x1e32 }, - { 0x1e34, 0x1e34 }, - { 0x1e36, 0x1e36 }, - { 0x1e38, 0x1e38 }, - { 0x1e3a, 0x1e3a }, - { 0x1e3c, 0x1e3c }, - { 0x1e3e, 0x1e3e }, - { 0x1e40, 0x1e40 }, - { 0x1e42, 0x1e42 }, - { 0x1e44, 0x1e44 }, - { 0x1e46, 0x1e46 }, - { 0x1e48, 0x1e48 }, - { 0x1e4a, 0x1e4a }, - { 0x1e4c, 0x1e4c }, - { 0x1e4e, 0x1e4e }, - { 0x1e50, 0x1e50 }, - { 0x1e52, 0x1e52 }, - { 0x1e54, 0x1e54 }, - { 0x1e56, 0x1e56 }, - { 0x1e58, 0x1e58 }, - { 0x1e5a, 0x1e5a }, - { 0x1e5c, 0x1e5c }, - { 0x1e5e, 0x1e5e }, - { 0x1e60, 0x1e60 }, - { 0x1e62, 0x1e62 }, - { 0x1e64, 0x1e64 }, - { 0x1e66, 0x1e66 }, - { 0x1e68, 0x1e68 }, - { 0x1e6a, 0x1e6a }, - { 0x1e6c, 0x1e6c }, - { 0x1e6e, 0x1e6e }, - { 0x1e70, 0x1e70 }, - { 0x1e72, 0x1e72 }, - { 0x1e74, 0x1e74 }, - { 0x1e76, 0x1e76 }, - { 0x1e78, 0x1e78 }, - { 0x1e7a, 0x1e7a }, - { 0x1e7c, 0x1e7c }, - { 0x1e7e, 0x1e7e }, - { 0x1e80, 0x1e80 }, - { 0x1e82, 0x1e82 }, - { 0x1e84, 0x1e84 }, - { 0x1e86, 0x1e86 }, - { 0x1e88, 0x1e88 }, - { 0x1e8a, 0x1e8a }, - { 0x1e8c, 0x1e8c }, - { 0x1e8e, 0x1e8e }, - { 0x1e90, 0x1e90 }, - { 0x1e92, 0x1e92 }, - { 0x1e94, 0x1e94 }, - { 0x1e9e, 0x1e9e }, - { 0x1ea0, 0x1ea0 }, - { 0x1ea2, 0x1ea2 }, - { 0x1ea4, 0x1ea4 }, - { 0x1ea6, 0x1ea6 }, - { 0x1ea8, 0x1ea8 }, - { 0x1eaa, 0x1eaa }, - { 0x1eac, 0x1eac }, - { 0x1eae, 0x1eae }, - { 0x1eb0, 0x1eb0 }, - { 0x1eb2, 0x1eb2 }, - { 0x1eb4, 0x1eb4 }, - { 0x1eb6, 0x1eb6 }, - { 0x1eb8, 0x1eb8 }, - { 0x1eba, 0x1eba }, - { 0x1ebc, 0x1ebc }, - { 0x1ebe, 0x1ebe }, - { 0x1ec0, 0x1ec0 }, - { 0x1ec2, 0x1ec2 }, - { 0x1ec4, 0x1ec4 }, - { 0x1ec6, 0x1ec6 }, - { 0x1ec8, 0x1ec8 }, - { 0x1eca, 0x1eca }, - { 0x1ecc, 0x1ecc }, - { 0x1ece, 0x1ece }, - { 0x1ed0, 0x1ed0 }, - { 0x1ed2, 0x1ed2 }, - { 0x1ed4, 0x1ed4 }, - { 0x1ed6, 0x1ed6 }, - { 0x1ed8, 0x1ed8 }, - { 0x1eda, 0x1eda }, - { 0x1edc, 0x1edc }, - { 0x1ede, 0x1ede }, - { 0x1ee0, 0x1ee0 }, - { 0x1ee2, 0x1ee2 }, - { 0x1ee4, 0x1ee4 }, - { 0x1ee6, 0x1ee6 }, - { 0x1ee8, 0x1ee8 }, - { 0x1eea, 0x1eea }, - { 0x1eec, 0x1eec }, - { 0x1eee, 0x1eee }, - { 0x1ef0, 0x1ef0 }, - { 0x1ef2, 0x1ef2 }, - { 0x1ef4, 0x1ef4 }, - { 0x1ef6, 0x1ef6 }, - { 0x1ef8, 0x1ef8 }, - { 0x1efa, 0x1efa }, - { 0x1efc, 0x1efc }, - { 0x1efe, 0x1efe }, { 0x1f08, 0x1f0f }, { 0x1f18, 0x1f1d }, { 0x1f28, 0x1f2f }, { 0x1f38, 0x1f3f }, { 0x1f48, 0x1f4d }, - { 0x1f59, 0x1f59 }, - { 0x1f5b, 0x1f5b }, - { 0x1f5d, 0x1f5d }, - { 0x1f5f, 0x1f5f }, { 0x1f68, 0x1f6f }, { 0x1fb8, 0x1fbb }, { 0x1fc8, 0x1fcb }, { 0x1fd8, 0x1fdb }, { 0x1fe8, 0x1fec }, { 0x1ff8, 0x1ffb }, - { 0x2102, 0x2102 }, - { 0x2107, 0x2107 }, { 0x210b, 0x210d }, { 0x2110, 0x2112 }, - { 0x2115, 0x2115 }, { 0x2119, 0x211d }, - { 0x2124, 0x2124 }, - { 0x2126, 0x2126 }, - { 0x2128, 0x2128 }, { 0x212a, 0x212d }, { 0x2130, 0x2133 }, { 0x213e, 0x213f }, - { 0x2145, 0x2145 }, - { 0x2183, 0x2183 }, { 0x2c00, 0x2c2e }, - { 0x2c60, 0x2c60 }, { 0x2c62, 0x2c64 }, - { 0x2c67, 0x2c67 }, - { 0x2c69, 0x2c69 }, - { 0x2c6b, 0x2c6b }, { 0x2c6d, 0x2c70 }, - { 0x2c72, 0x2c72 }, - { 0x2c75, 0x2c75 }, { 0x2c7e, 0x2c80 }, - { 0x2c82, 0x2c82 }, - { 0x2c84, 0x2c84 }, - { 0x2c86, 0x2c86 }, - { 0x2c88, 0x2c88 }, - { 0x2c8a, 0x2c8a }, - { 0x2c8c, 0x2c8c }, - { 0x2c8e, 0x2c8e }, - { 0x2c90, 0x2c90 }, - { 0x2c92, 0x2c92 }, - { 0x2c94, 0x2c94 }, - { 0x2c96, 0x2c96 }, - { 0x2c98, 0x2c98 }, - { 0x2c9a, 0x2c9a }, - { 0x2c9c, 0x2c9c }, - { 0x2c9e, 0x2c9e }, - { 0x2ca0, 0x2ca0 }, - { 0x2ca2, 0x2ca2 }, - { 0x2ca4, 0x2ca4 }, - { 0x2ca6, 0x2ca6 }, - { 0x2ca8, 0x2ca8 }, - { 0x2caa, 0x2caa }, - { 0x2cac, 0x2cac }, - { 0x2cae, 0x2cae }, - { 0x2cb0, 0x2cb0 }, - { 0x2cb2, 0x2cb2 }, - { 0x2cb4, 0x2cb4 }, - { 0x2cb6, 0x2cb6 }, - { 0x2cb8, 0x2cb8 }, - { 0x2cba, 0x2cba }, - { 0x2cbc, 0x2cbc }, - { 0x2cbe, 0x2cbe }, - { 0x2cc0, 0x2cc0 }, - { 0x2cc2, 0x2cc2 }, - { 0x2cc4, 0x2cc4 }, - { 0x2cc6, 0x2cc6 }, - { 0x2cc8, 0x2cc8 }, - { 0x2cca, 0x2cca }, - { 0x2ccc, 0x2ccc }, - { 0x2cce, 0x2cce }, - { 0x2cd0, 0x2cd0 }, - { 0x2cd2, 0x2cd2 }, - { 0x2cd4, 0x2cd4 }, - { 0x2cd6, 0x2cd6 }, - { 0x2cd8, 0x2cd8 }, - { 0x2cda, 0x2cda }, - { 0x2cdc, 0x2cdc }, - { 0x2cde, 0x2cde }, - { 0x2ce0, 0x2ce0 }, - { 0x2ce2, 0x2ce2 }, - { 0x2ceb, 0x2ceb }, - { 0x2ced, 0x2ced }, - { 0x2cf2, 0x2cf2 }, - { 0xa640, 0xa640 }, - { 0xa642, 0xa642 }, - { 0xa644, 0xa644 }, - { 0xa646, 0xa646 }, - { 0xa648, 0xa648 }, - { 0xa64a, 0xa64a }, - { 0xa64c, 0xa64c }, - { 0xa64e, 0xa64e }, - { 0xa650, 0xa650 }, - { 0xa652, 0xa652 }, - { 0xa654, 0xa654 }, - { 0xa656, 0xa656 }, - { 0xa658, 0xa658 }, - { 0xa65a, 0xa65a }, - { 0xa65c, 0xa65c }, - { 0xa65e, 0xa65e }, - { 0xa660, 0xa660 }, - { 0xa662, 0xa662 }, - { 0xa664, 0xa664 }, - { 0xa666, 0xa666 }, - { 0xa668, 0xa668 }, - { 0xa66a, 0xa66a }, - { 0xa66c, 0xa66c }, - { 0xa680, 0xa680 }, - { 0xa682, 0xa682 }, - { 0xa684, 0xa684 }, - { 0xa686, 0xa686 }, - { 0xa688, 0xa688 }, - { 0xa68a, 0xa68a }, - { 0xa68c, 0xa68c }, - { 0xa68e, 0xa68e }, - { 0xa690, 0xa690 }, - { 0xa692, 0xa692 }, - { 0xa694, 0xa694 }, - { 0xa696, 0xa696 }, - { 0xa698, 0xa698 }, - { 0xa69a, 0xa69a }, - { 0xa722, 0xa722 }, - { 0xa724, 0xa724 }, - { 0xa726, 0xa726 }, - { 0xa728, 0xa728 }, - { 0xa72a, 0xa72a }, - { 0xa72c, 0xa72c }, - { 0xa72e, 0xa72e }, - { 0xa732, 0xa732 }, - { 0xa734, 0xa734 }, - { 0xa736, 0xa736 }, - { 0xa738, 0xa738 }, - { 0xa73a, 0xa73a }, - { 0xa73c, 0xa73c }, - { 0xa73e, 0xa73e }, - { 0xa740, 0xa740 }, - { 0xa742, 0xa742 }, - { 0xa744, 0xa744 }, - { 0xa746, 0xa746 }, - { 0xa748, 0xa748 }, - { 0xa74a, 0xa74a }, - { 0xa74c, 0xa74c }, - { 0xa74e, 0xa74e }, - { 0xa750, 0xa750 }, - { 0xa752, 0xa752 }, - { 0xa754, 0xa754 }, - { 0xa756, 0xa756 }, - { 0xa758, 0xa758 }, - { 0xa75a, 0xa75a }, - { 0xa75c, 0xa75c }, - { 0xa75e, 0xa75e }, - { 0xa760, 0xa760 }, - { 0xa762, 0xa762 }, - { 0xa764, 0xa764 }, - { 0xa766, 0xa766 }, - { 0xa768, 0xa768 }, - { 0xa76a, 0xa76a }, - { 0xa76c, 0xa76c }, - { 0xa76e, 0xa76e }, - { 0xa779, 0xa779 }, - { 0xa77b, 0xa77b }, { 0xa77d, 0xa77e }, - { 0xa780, 0xa780 }, - { 0xa782, 0xa782 }, - { 0xa784, 0xa784 }, - { 0xa786, 0xa786 }, - { 0xa78b, 0xa78b }, - { 0xa78d, 0xa78d }, - { 0xa790, 0xa790 }, - { 0xa792, 0xa792 }, - { 0xa796, 0xa796 }, - { 0xa798, 0xa798 }, - { 0xa79a, 0xa79a }, - { 0xa79c, 0xa79c }, - { 0xa79e, 0xa79e }, - { 0xa7a0, 0xa7a0 }, - { 0xa7a2, 0xa7a2 }, - { 0xa7a4, 0xa7a4 }, - { 0xa7a6, 0xa7a6 }, - { 0xa7a8, 0xa7a8 }, { 0xa7aa, 0xa7ad }, { 0xa7b0, 0xa7b4 }, - { 0xa7b6, 0xa7b6 }, { 0xff21, 0xff3a }, { 0x10400, 0x10427 }, { 0x10c80, 0x10cb2 }, @@ -598,9 +605,7 @@ static Rune uppers[625][2] = { { 0x1d400, 0x1d419 }, { 0x1d434, 0x1d44d }, { 0x1d468, 0x1d481 }, - { 0x1d49c, 0x1d49c }, { 0x1d49e, 0x1d49f }, - { 0x1d4a2, 0x1d4a2 }, { 0x1d4a5, 0x1d4a6 }, { 0x1d4a9, 0x1d4ac }, { 0x1d4ae, 0x1d4b5 }, @@ -612,7 +617,6 @@ static Rune uppers[625][2] = { { 0x1d538, 0x1d539 }, { 0x1d53b, 0x1d53e }, { 0x1d540, 0x1d544 }, - { 0x1d546, 0x1d546 }, { 0x1d54a, 0x1d550 }, { 0x1d56c, 0x1d585 }, { 0x1d5a0, 0x1d5b9 }, @@ -624,12 +628,12 @@ static Rune uppers[625][2] = { { 0x1d6e2, 0x1d6fa }, { 0x1d71c, 0x1d734 }, { 0x1d756, 0x1d76e }, - { 0x1d790, 0x1d7a8 }, - { 0x1d7ca, 0x1d7ca } + { 0x1d790, 0x1d7a8 } }; extern int runeinrange(const void* a, const void* b); bool isupperrune(Rune ch) { - return (NULL != bsearch(&ch, uppers, 625, 2 * sizeof(Rune), &runeinrange)); + return ((NULL != bsearch(&ch, singles, 539, sizeof(Rune), &runeinrange)) || + (NULL != bsearch(&ch, ranges, 86, 2 * sizeof(Rune), &runeinrange))); } diff --git a/tools/unicode.rb b/tools/unicode.rb index a632b61..510333f 100755 --- a/tools/unicode.rb +++ b/tools/unicode.rb @@ -1,8 +1,37 @@ #!/usr/bin/env ruby require 'fileutils' +require 'stringio' + +# Check if we have the right number of arguments, bail otherwise +if ARGV.length != 2 then + puts "Usage: unicode.rb DATABASE OUTDIR" + puts "\nError: Incorrect number of arguments" + exit 1 +end + +# Struct definition for representing a unicode character +UnicodeChar = Struct.new( + :value, + :name, + :general_cat, + :class, + :bidir_cat, + :decomp_map, + :dec_value, + :digit_val, + :numeric_val, + :mirrored, + :name_1x, + :comment, + :toupper, + :tolower, + :totitle, +) + +# Map of all Unicode Character Database entries by general category type +$types = { all: [] } -$types = {} # Map of of all rune types to lookup table name $typemap = { # Letter Types @@ -44,81 +73,108 @@ $typemap = { "Co" => [:other], # Private Use "Cn" => [:other] # Unassigned } -$typenames +#------------------------------------------------------------------------------ + +# Register a character in the designated type tables combining adjacent +# characters into ranges def register_codepoint(types, val) types.each do |type| $types[type] ||= [] - $types[type] << val + last = $types[type][-1] + if (last.kind_of? Array) and ((last[-1].value + 1) == val.value) + last << val + elsif (not last.nil?) and (not last.kind_of? Array) and ((last.value + 1) == val.value) + $types[type][-1] = [last, val] + else + $types[type] << val + end end end -if ARGV.length != 2 then - puts "Usage: unicode.rb DATABASE OUTDIR" - puts "\nError: Incorrect number of arguments" - exit 1 +# Generate a rune type checking function using the singles and ranges tables +def generate_typecheck_func(type, numranges, numsingles) + out = StringIO.new + out.print "extern int runeinrange(const void* a, const void* b);\n\n" + out.print "bool is#{type.to_s.gsub(/s$/,'')}rune(Rune ch) {\n" + if numsingles == 0 + out.print " return (NULL != bsearch(&ch, ranges, #{numranges}, 2 * sizeof(Rune), &runeinrange));\n" + else + out.print " return ((NULL != bsearch(&ch, singles, #{numsingles}, sizeof(Rune), &runeinrange)) || \n" + out.print " (NULL != bsearch(&ch, ranges, #{numranges}, 2 * sizeof(Rune), &runeinrange)));\n" + end + out.print "}\n" + out.string end -unicode_data = File.open(ARGV[0],"r") -unicode_data.each_line do |data| - fields = data.split(';') - types = $typemap[fields[2]] - stype = fields[4] - val = fields[0].to_i(16) - - if (stype == "WS") || (stype == "S") || (stype == "B") - register_codepoint([:spaces], val) - elsif types.include? :uppers - register_codepoint(types, val) - register_codepoint([:tolowers], (fields[13] == "") ? val : fields[13].to_i(16)) - elsif types.include? :lowers - register_codepoint(types, val) - register_codepoint([:touppers], (fields[14] == "") ? val : fields[14].to_i(16)) - else - register_codepoint(types, val) +# Generates rune type tables organized by singles and ranges +def generate_type_tables(type) + ranges, singles = $types[type].partition {|e| e.kind_of? Array } + puts "Generating #{ARGV[1]}/#{type.to_s}.c" + File.open("#{ARGV[1]}/#{type.to_s}.c", "w") do |f| + f.puts("#include \n\n") + table = singles.map{|e| "0x#{e.value.to_s(16)}" }.join(",\n ") + f.print("static Rune singles[#{singles.length}] = {\n #{table}\n};\n\n") if singles.length > 0 + table = ranges.map{|r| "{ 0x#{r.first.value.to_s(16)}, 0x#{r.last.value.to_s(16)} }" }.join(",\n ") + f.print("static Rune ranges[#{ranges.length}][2] = {\n #{table}\n};\n\n") + f.print(generate_typecheck_func(type, ranges.length, singles.length)) end end -unicode_data.close() -$types[:touppers].keep_if{|v| v > 0 } -$types[:tolowers].keep_if{|v| v > 0 } -def get_ranges(table) - table.inject([]) do |spans, n| - if spans.empty? || spans.last.last != n - 1 - spans + [n..n] - else - spans[0..-2] + [spans.last.first..n] +def generate_to_func(type, tblsz) + out = StringIO.new + out.print "extern int runeinrange(const void* a, const void* b);\n\n" + out.print "Rune #{type}rune(Rune ch) {\n" + out.print " Rune* to = bsearch(&ch, mappings, #{tblsz}, 2 * sizeof(Rune), &runeinrange);\n" + out.print " return (to == NULL) ? ch : to[1];\n" + out.print "}\n" + out.string +end + +def generate_to_table(type) + mappings = $types[:all].select{|e| e[type] > 0 } + puts "Generating #{ARGV[1]}/#{type.to_s}.c" + File.open("#{ARGV[1]}/#{type.to_s}.c", "w") do |f| + f.print "#include \n\n" + f.print "static Rune mappings[#{mappings.length}][2] = {\n" + mappings.each do |e| + f.print " { 0x#{e.value.to_s(16)}, 0x#{e[type].to_s(16)} },\n" end + f.print "};\n\n" + f.print generate_to_func(type, mappings.length) end end -def generate_typecheck_func(type, count) - "extern int runeinrange(const void* a, const void* b);\n\n" + - "bool is#{type.to_s.gsub(/s$/,'')}rune(Rune ch) {\n" + - " return (NULL != bsearch(&ch, #{type}, #{count}, 2 * sizeof(Rune), &runeinrange));\n" + - "}\n" -end +#------------------------------------------------------------------------------ -def generate_type_table(type, altcase = []) - if $types[type] - ranges = get_ranges($types[type]) - pairs = ranges.map{|r| "{ 0x#{r.first.to_s(16)}, 0x#{r.last.to_s(16)} }" }.join(",\n ") - File.open("#{ARGV[1]}/#{type.to_s}.c", "w") do |f| - f.puts("#include \n\n") - f.puts("static Rune #{type.to_s}[#{ranges.length}][2] = {") - f.print(' ') - f.puts(pairs) - f.print("};\n\n"); - f.print(generate_typecheck_func(type, ranges.length)) - end +# Read in the unicode character database and sort it into type classes +unicode_data = File.open(ARGV[0],"r") +unicode_data.each_line do |data| + char = UnicodeChar.new(*data.split(';')) + char.value = char.value.to_i(16) + char.tolower = char.tolower.to_i(16) + char.toupper = char.toupper.to_i(16) + char.totitle = char.totitle.to_i(16) + types = $typemap[char.general_cat] + bicat = char.bidir_cat + $types[:all] << char + if (bicat == "WS") || (bicat == "S") || (bicat == "B") + register_codepoint([:spaces], char) + else + register_codepoint(types, char) end + #register_codepoint([:tolower], char) if char.to_lower != 0 + #register_codepoint([:toupper], char) if char.to_upper != 0 + #register_codepoint([:totitle], char) if char.to_title != 0 end +unicode_data.close() +# Generate the runetype files into the designated directory FileUtils.mkdir_p ARGV[1] -generate_type_table(:uppers, :tolowers) -generate_type_table(:lowers, :touppers) -alltypes = $typemap.values.flatten.uniq - [:uppers, :lowers] -alltypes.each do |type| - generate_type_table(type) +$typemap.values.flatten.uniq.each do |type| + generate_type_tables(type) end +generate_to_table(:tolower) +generate_to_table(:toupper) +generate_to_table(:totitle) -- 2.55.0