summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Popov <nikita.ppv@gmail.com>2017-07-28 14:57:08 +0200
committerNikita Popov <nikita.ppv@gmail.com>2017-07-28 14:57:08 +0200
commitf4a1d9c8211fa7878af14d0bd94b2deaab19ae21 (patch)
treee57c195f4fed5627294a9cba1bc8e40f80d05eb4
parent25b6e684326a064abfed75be1867b71f7d12a364 (diff)
downloadphp-git-f4a1d9c8211fa7878af14d0bd94b2deaab19ae21.tar.gz
Fixed bug #65544 and #71298
-rw-r--r--NEWS4
-rw-r--r--ext/mbstring/php_unicode.c32
-rw-r--r--ext/mbstring/php_unicode.h12
-rw-r--r--ext/mbstring/tests/bug65544.phpt8
-rw-r--r--ext/mbstring/tests/bug71298.phpt8
-rw-r--r--ext/mbstring/ucgendat/ucgendat.php32
-rw-r--r--ext/mbstring/unicode_data.h264
7 files changed, 334 insertions, 26 deletions
diff --git a/NEWS b/NEWS
index cd00e033bf..035eac82b8 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,10 @@ PHP NEWS
(Come)
- Mbstring:
+ . Fixed bug #65544 (mb title case conversion-first word in quotation isn't
+ capitalized). (Nikita)
+ . Fixed bug #71298 (MB_CASE_TITLE misbehaves with curled apostrophe/quote.
+ (Nikita)
. Fixed bug #73528 (Crash in zif_mb_send_mail). (Nikita)
. Fixed bug #74929 (mbstring functions version 7.1.1 are slow compared to 5.3
on Windows). (Nikita)
diff --git a/ext/mbstring/php_unicode.c b/ext/mbstring/php_unicode.c
index 1bd348b3d2..71541a8372 100644
--- a/ext/mbstring/php_unicode.c
+++ b/ext/mbstring/php_unicode.c
@@ -343,32 +343,24 @@ static int convert_case_filter(int c, void *void_data)
case PHP_UNICODE_CASE_TITLE_SIMPLE:
case PHP_UNICODE_CASE_TITLE:
{
- int res = php_unicode_is_prop(c,
- UC_MN, UC_ME, UC_CF, UC_LM, UC_SK, UC_LU, UC_LL, UC_LT, UC_PO, UC_OS, -1);
- out[0] = c;
- len = 1;
if (data->title_mode) {
- if (res) {
- if (data->case_mode == PHP_UNICODE_CASE_TITLE_SIMPLE) {
- out[0] = php_unicode_tolower_simple(c, data->no_encoding);
- len = 1;
- } else {
- len = php_unicode_tolower_full(c, data->no_encoding, out);
- }
+ if (data->case_mode == PHP_UNICODE_CASE_TITLE_SIMPLE) {
+ out[0] = php_unicode_tolower_simple(c, data->no_encoding);
+ len = 1;
} else {
- data->title_mode = 0;
+ len = php_unicode_tolower_full(c, data->no_encoding, out);
}
} else {
- if (res) {
- data->title_mode = 1;
- if (data->case_mode == PHP_UNICODE_CASE_TITLE_SIMPLE) {
- out[0] = php_unicode_totitle_simple(c, data->no_encoding);
- len = 1;
- } else {
- len = php_unicode_totitle_full(c, data->no_encoding, out);
- }
+ if (data->case_mode == PHP_UNICODE_CASE_TITLE_SIMPLE) {
+ out[0] = php_unicode_totitle_simple(c, data->no_encoding);
+ len = 1;
+ } else {
+ len = php_unicode_totitle_full(c, data->no_encoding, out);
}
}
+ if (!php_unicode_is_case_ignorable(c)) {
+ data->title_mode = php_unicode_is_cased(c);
+ }
break;
}
default:
diff --git a/ext/mbstring/php_unicode.h b/ext/mbstring/php_unicode.h
index 6808939ca6..b287a70fe2 100644
--- a/ext/mbstring/php_unicode.h
+++ b/ext/mbstring/php_unicode.h
@@ -78,6 +78,11 @@
#define UC_PF 40 /* Punctuation, Final */
#define UC_AL 41 /* Arabic Letter */
+/* Derived properties from DerivedCoreProperties.txt */
+#define UC_CASED 42
+#define UC_CASE_IGNORABLE 43
+
+
MBSTRING_API int php_unicode_is_prop(unsigned long code, ...);
MBSTRING_API int php_unicode_is_prop1(unsigned long code, int prop);
@@ -180,6 +185,13 @@ static inline int php_unicode_is_upper(unsigned long code) {
((cc) >= 0xf900 && (cc) <= 0xfaff))
#define php_unicode_is_hangul(cc) ((cc) >= 0xac00 && (cc) <= 0xd7ff)
+/*
+ * Derived core properties.
+ */
+
+#define php_unicode_is_cased(cc) php_unicode_is_prop1(cc, UC_CASED)
+#define php_unicode_is_case_ignorable(cc) php_unicode_is_prop1(cc, UC_CASE_IGNORABLE)
+
#endif
diff --git a/ext/mbstring/tests/bug65544.phpt b/ext/mbstring/tests/bug65544.phpt
new file mode 100644
index 0000000000..904b6d6611
--- /dev/null
+++ b/ext/mbstring/tests/bug65544.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Bug #65544: mb title case conversion-first word in quotation isn't capitalized
+--FILE--
+<?php
+var_dump(mb_convert_case("\"or else it doesn't, you know. the name of the song is called 'haddocks' eyes.'\"", MB_CASE_TITLE));
+?>
+--EXPECT--
+string(80) ""Or Else It Doesn't, You Know. The Name Of The Song Is Called 'Haddocks' Eyes.'""
diff --git a/ext/mbstring/tests/bug71298.phpt b/ext/mbstring/tests/bug71298.phpt
new file mode 100644
index 0000000000..f69ba29cbb
--- /dev/null
+++ b/ext/mbstring/tests/bug71298.phpt
@@ -0,0 +1,8 @@
+--TEST--
+Bug #71298: MB_CASE_TITLE misbehaves with curled apostrophe/quote (HTML &rsquo;)
+--FILE--
+<?php
+echo mb_convert_case("People's issues versus people’s issues", MB_CASE_TITLE);
+?>
+--EXPECT--
+People's Issues Versus People’s Issues
diff --git a/ext/mbstring/ucgendat/ucgendat.php b/ext/mbstring/ucgendat/ucgendat.php
index 166034fd69..556a8cf98f 100644
--- a/ext/mbstring/ucgendat/ucgendat.php
+++ b/ext/mbstring/ucgendat/ucgendat.php
@@ -37,7 +37,8 @@
if ($argc < 2) {
echo "Usage: php ucgendata.php ./datadir\n";
- echo "./datadir must contain UnicodeData.txt and CaseFolding.txt\n";
+ echo "./datadir must contain:\n";
+ echo "UnicodeData.txt, CaseFolding.txt, SpecialCasing.txt and DerivedCoreProperties.txt\n";
return;
}
@@ -45,8 +46,9 @@ $dir = $argv[1];
$unicodeDataFile = $dir . '/UnicodeData.txt';
$caseFoldingFile = $dir . '/CaseFolding.txt';
$specialCasingFile = $dir . '/SpecialCasing.txt';
+$derivedCorePropertiesFile = $dir . '/DerivedCoreProperties.txt';
-$files = [$unicodeDataFile, $caseFoldingFile, $specialCasingFile];
+$files = [$unicodeDataFile, $caseFoldingFile, $specialCasingFile, $derivedCorePropertiesFile];
foreach ($files as $file) {
if (!file_exists($file)) {
echo "File $file does not exist.\n";
@@ -60,6 +62,7 @@ $data = new UnicodeData;
parseUnicodeData($data, file_get_contents($unicodeDataFile));
parseCaseFolding($data, file_get_contents($caseFoldingFile));
parseSpecialCasing($data, file_get_contents($specialCasingFile));
+parseDerivedCoreProperties($data, file_get_contents($derivedCorePropertiesFile));
file_put_contents($outputFile, generateData($data));
class Range {
@@ -90,7 +93,8 @@ class UnicodeData {
"Lo", "Pc", "Pd", "Ps", "Pe", "Po",
"Sm", "Sc", "Sk", "So", "L", "R",
"EN", "ES", "ET", "AN", "CS", "B",
- "S", "WS", "ON", "Pi", "Pf", "AL"
+ "S", "WS", "ON", "Pi", "Pf", "AL",
+ "Cased", "Case_Ignorable"
]);
$this->numProps = count($this->propIndexes);
@@ -339,6 +343,28 @@ function parseSpecialCasing(UnicodeData $data, string $input) : void {
}
}
+function parseDerivedCoreProperties(UnicodeData $data, string $input) : void {
+ foreach (parseDataFile($input) as $fields) {
+ if (count($fields) != 2) {
+ throw new Exception("Line does not contain 2 fields");
+ }
+
+ $property = $fields[1];
+ if ($property != 'Cased' && $property != 'Case_Ignorable') {
+ continue;
+ }
+
+ $range = explode('..', $fields[0]);
+ if (count($range) == 2) {
+ $data->addPropRange(intval($range[0], 16), intval($range[1], 16), $property);
+ } else if (count($range) == 1) {
+ $data->addProp(intval($range[0], 16), $property);
+ } else {
+ throw new Exception("Invalid range");
+ }
+ }
+}
+
function formatArray(array $values, int $width, string $format) : string {
$result = '';
$i = 0;
diff --git a/ext/mbstring/unicode_data.h b/ext/mbstring/unicode_data.h
index 41ad8056ce..9e40e4c922 100644
--- a/ext/mbstring/unicode_data.h
+++ b/ext/mbstring/unicode_data.h
@@ -10,7 +10,7 @@
* the project's page doesn't seem to be live anymore, so you can use
* OpenLDAPs modified copy (look in libraries/liblunicode/ucdata) */
-static const unsigned short _ucprop_size = 42;
+static const unsigned short _ucprop_size = 44;
static const unsigned short _ucprop_offsets[] = {
0x0000, 0x025a, 0x039a, 0x03a4, 0x0412, 0x042a, 0x04a2, 0x04b0,
@@ -18,7 +18,7 @@ static const unsigned short _ucprop_offsets[] = {
0x0ebc, 0x0ed0, 0x0f42, 0x12d8, 0x12e4, 0x1306, 0x139c, 0x142c,
0x157e, 0x15fe, 0x1620, 0x165a, 0x17b4, 0x1cea, 0x1d6a, 0x1d82,
0x1d94, 0x1dc0, 0x1dcc, 0x1de6, 0x1df0, 0x1df6, 0x1e04, 0x21aa,
- 0x21c0, 0x21d4, 0x2246, 0x0000
+ 0x21c0, 0x21d4, 0x2246, 0x2354, 0x264e, 0x0000, 0x0000, 0x0000
};
static const unsigned int _ucprop_ranges[] = {
@@ -2215,7 +2215,265 @@ static const unsigned int _ucprop_ranges[] = {
0x0001ee79, 0x0001ee7c, 0x0001ee7e, 0x0001ee7e,
0x0001ee80, 0x0001ee89, 0x0001ee8b, 0x0001ee9b,
0x0001eea1, 0x0001eea3, 0x0001eea5, 0x0001eea9,
- 0x0001eeab, 0x0001eebb
+ 0x0001eeab, 0x0001eebb, 0x00000041, 0x0000005a,
+ 0x00000061, 0x0000007a, 0x000000aa, 0x000000aa,
+ 0x000000b5, 0x000000b5, 0x000000ba, 0x000000ba,
+ 0x000000c0, 0x000000d6, 0x000000d8, 0x000000f6,
+ 0x000000f8, 0x000001ba, 0x000001bc, 0x000001bf,
+ 0x000001c4, 0x00000293, 0x00000295, 0x000002b8,
+ 0x000002c0, 0x000002c1, 0x000002e0, 0x000002e4,
+ 0x00000345, 0x00000345, 0x00000370, 0x00000373,
+ 0x00000376, 0x00000377, 0x0000037a, 0x0000037d,
+ 0x0000037f, 0x0000037f, 0x00000386, 0x00000386,
+ 0x00000388, 0x0000038a, 0x0000038c, 0x0000038c,
+ 0x0000038e, 0x000003a1, 0x000003a3, 0x000003f5,
+ 0x000003f7, 0x00000481, 0x0000048a, 0x0000052f,
+ 0x00000531, 0x00000556, 0x00000561, 0x00000587,
+ 0x000010a0, 0x000010c5, 0x000010c7, 0x000010c7,
+ 0x000010cd, 0x000010cd, 0x000013a0, 0x000013f5,
+ 0x000013f8, 0x000013fd, 0x00001c80, 0x00001c88,
+ 0x00001d00, 0x00001dbf, 0x00001e00, 0x00001f15,
+ 0x00001f18, 0x00001f1d, 0x00001f20, 0x00001f45,
+ 0x00001f48, 0x00001f4d, 0x00001f50, 0x00001f57,
+ 0x00001f59, 0x00001f59, 0x00001f5b, 0x00001f5b,
+ 0x00001f5d, 0x00001f5d, 0x00001f5f, 0x00001f7d,
+ 0x00001f80, 0x00001fb4, 0x00001fb6, 0x00001fbc,
+ 0x00001fbe, 0x00001fbe, 0x00001fc2, 0x00001fc4,
+ 0x00001fc6, 0x00001fcc, 0x00001fd0, 0x00001fd3,
+ 0x00001fd6, 0x00001fdb, 0x00001fe0, 0x00001fec,
+ 0x00001ff2, 0x00001ff4, 0x00001ff6, 0x00001ffc,
+ 0x00002071, 0x00002071, 0x0000207f, 0x0000207f,
+ 0x00002090, 0x0000209c, 0x00002102, 0x00002102,
+ 0x00002107, 0x00002107, 0x0000210a, 0x00002113,
+ 0x00002115, 0x00002115, 0x00002119, 0x0000211d,
+ 0x00002124, 0x00002124, 0x00002126, 0x00002126,
+ 0x00002128, 0x00002128, 0x0000212a, 0x0000212d,
+ 0x0000212f, 0x00002134, 0x00002139, 0x00002139,
+ 0x0000213c, 0x0000213f, 0x00002145, 0x00002149,
+ 0x0000214e, 0x0000214e, 0x00002160, 0x0000217f,
+ 0x00002183, 0x00002184, 0x000024b6, 0x000024e9,
+ 0x00002c00, 0x00002c2e, 0x00002c30, 0x00002c5e,
+ 0x00002c60, 0x00002ce4, 0x00002ceb, 0x00002cee,
+ 0x00002cf2, 0x00002cf3, 0x00002d00, 0x00002d25,
+ 0x00002d27, 0x00002d27, 0x00002d2d, 0x00002d2d,
+ 0x0000a640, 0x0000a66d, 0x0000a680, 0x0000a69d,
+ 0x0000a722, 0x0000a787, 0x0000a78b, 0x0000a78e,
+ 0x0000a790, 0x0000a7ae, 0x0000a7b0, 0x0000a7b7,
+ 0x0000a7f8, 0x0000a7fa, 0x0000ab30, 0x0000ab5a,
+ 0x0000ab5c, 0x0000ab65, 0x0000ab70, 0x0000abbf,
+ 0x0000fb00, 0x0000fb06, 0x0000fb13, 0x0000fb17,
+ 0x0000ff21, 0x0000ff3a, 0x0000ff41, 0x0000ff5a,
+ 0x00010400, 0x0001044f, 0x000104b0, 0x000104d3,
+ 0x000104d8, 0x000104fb, 0x00010c80, 0x00010cb2,
+ 0x00010cc0, 0x00010cf2, 0x000118a0, 0x000118df,
+ 0x0001d400, 0x0001d454, 0x0001d456, 0x0001d49c,
+ 0x0001d49e, 0x0001d49f, 0x0001d4a2, 0x0001d4a2,
+ 0x0001d4a5, 0x0001d4a6, 0x0001d4a9, 0x0001d4ac,
+ 0x0001d4ae, 0x0001d4b9, 0x0001d4bb, 0x0001d4bb,
+ 0x0001d4bd, 0x0001d4c3, 0x0001d4c5, 0x0001d505,
+ 0x0001d507, 0x0001d50a, 0x0001d50d, 0x0001d514,
+ 0x0001d516, 0x0001d51c, 0x0001d51e, 0x0001d539,
+ 0x0001d53b, 0x0001d53e, 0x0001d540, 0x0001d544,
+ 0x0001d546, 0x0001d546, 0x0001d54a, 0x0001d550,
+ 0x0001d552, 0x0001d6a5, 0x0001d6a8, 0x0001d6c0,
+ 0x0001d6c2, 0x0001d6da, 0x0001d6dc, 0x0001d6fa,
+ 0x0001d6fc, 0x0001d714, 0x0001d716, 0x0001d734,
+ 0x0001d736, 0x0001d74e, 0x0001d750, 0x0001d76e,
+ 0x0001d770, 0x0001d788, 0x0001d78a, 0x0001d7a8,
+ 0x0001d7aa, 0x0001d7c2, 0x0001d7c4, 0x0001d7cb,
+ 0x0001e900, 0x0001e943, 0x0001f130, 0x0001f149,
+ 0x0001f150, 0x0001f169, 0x0001f170, 0x0001f189,
+ 0x00000027, 0x00000027, 0x0000002e, 0x0000002e,
+ 0x0000003a, 0x0000003a, 0x0000005e, 0x0000005e,
+ 0x00000060, 0x00000060, 0x000000a8, 0x000000a8,
+ 0x000000ad, 0x000000ad, 0x000000af, 0x000000af,
+ 0x000000b4, 0x000000b4, 0x000000b7, 0x000000b8,
+ 0x000002b0, 0x0000036f, 0x00000374, 0x00000375,
+ 0x0000037a, 0x0000037a, 0x00000384, 0x00000385,
+ 0x00000387, 0x00000387, 0x00000483, 0x00000489,
+ 0x00000559, 0x00000559, 0x00000591, 0x000005bd,
+ 0x000005bf, 0x000005bf, 0x000005c1, 0x000005c2,
+ 0x000005c4, 0x000005c5, 0x000005c7, 0x000005c7,
+ 0x000005f4, 0x000005f4, 0x00000600, 0x00000605,
+ 0x00000610, 0x0000061a, 0x0000061c, 0x0000061c,
+ 0x00000640, 0x00000640, 0x0000064b, 0x0000065f,
+ 0x00000670, 0x00000670, 0x000006d6, 0x000006dd,
+ 0x000006df, 0x000006e8, 0x000006ea, 0x000006ed,
+ 0x0000070f, 0x0000070f, 0x00000711, 0x00000711,
+ 0x00000730, 0x0000074a, 0x000007a6, 0x000007b0,
+ 0x000007eb, 0x000007f5, 0x000007fa, 0x000007fa,
+ 0x00000816, 0x0000082d, 0x00000859, 0x0000085b,
+ 0x000008d4, 0x00000902, 0x0000093a, 0x0000093a,
+ 0x0000093c, 0x0000093c, 0x00000941, 0x00000948,
+ 0x0000094d, 0x0000094d, 0x00000951, 0x00000957,
+ 0x00000962, 0x00000963, 0x00000971, 0x00000971,
+ 0x00000981, 0x00000981, 0x000009bc, 0x000009bc,
+ 0x000009c1, 0x000009c4, 0x000009cd, 0x000009cd,
+ 0x000009e2, 0x000009e3, 0x00000a01, 0x00000a02,
+ 0x00000a3c, 0x00000a3c, 0x00000a41, 0x00000a42,
+ 0x00000a47, 0x00000a48, 0x00000a4b, 0x00000a4d,
+ 0x00000a51, 0x00000a51, 0x00000a70, 0x00000a71,
+ 0x00000a75, 0x00000a75, 0x00000a81, 0x00000a82,
+ 0x00000abc, 0x00000abc, 0x00000ac1, 0x00000ac5,
+ 0x00000ac7, 0x00000ac8, 0x00000acd, 0x00000acd,
+ 0x00000ae2, 0x00000ae3, 0x00000afa, 0x00000aff,
+ 0x00000b01, 0x00000b01, 0x00000b3c, 0x00000b3c,
+ 0x00000b3f, 0x00000b3f, 0x00000b41, 0x00000b44,
+ 0x00000b4d, 0x00000b4d, 0x00000b56, 0x00000b56,
+ 0x00000b62, 0x00000b63, 0x00000b82, 0x00000b82,
+ 0x00000bc0, 0x00000bc0, 0x00000bcd, 0x00000bcd,
+ 0x00000c00, 0x00000c00, 0x00000c3e, 0x00000c40,
+ 0x00000c46, 0x00000c48, 0x00000c4a, 0x00000c4d,
+ 0x00000c55, 0x00000c56, 0x00000c62, 0x00000c63,
+ 0x00000c81, 0x00000c81, 0x00000cbc, 0x00000cbc,
+ 0x00000cbf, 0x00000cbf, 0x00000cc6, 0x00000cc6,
+ 0x00000ccc, 0x00000ccd, 0x00000ce2, 0x00000ce3,
+ 0x00000d00, 0x00000d01, 0x00000d3b, 0x00000d3c,
+ 0x00000d41, 0x00000d44, 0x00000d4d, 0x00000d4d,
+ 0x00000d62, 0x00000d63, 0x00000dca, 0x00000dca,
+ 0x00000dd2, 0x00000dd4, 0x00000dd6, 0x00000dd6,
+ 0x00000e31, 0x00000e31, 0x00000e34, 0x00000e3a,
+ 0x00000e46, 0x00000e4e, 0x00000eb1, 0x00000eb1,
+ 0x00000eb4, 0x00000eb9, 0x00000ebb, 0x00000ebc,
+ 0x00000ec6, 0x00000ec6, 0x00000ec8, 0x00000ecd,
+ 0x00000f18, 0x00000f19, 0x00000f35, 0x00000f35,
+ 0x00000f37, 0x00000f37, 0x00000f39, 0x00000f39,
+ 0x00000f71, 0x00000f7e, 0x00000f80, 0x00000f84,
+ 0x00000f86, 0x00000f87, 0x00000f8d, 0x00000f97,
+ 0x00000f99, 0x00000fbc, 0x00000fc6, 0x00000fc6,
+ 0x0000102d, 0x00001030, 0x00001032, 0x00001037,
+ 0x00001039, 0x0000103a, 0x0000103d, 0x0000103e,
+ 0x00001058, 0x00001059, 0x0000105e, 0x00001060,
+ 0x00001071, 0x00001074, 0x00001082, 0x00001082,
+ 0x00001085, 0x00001086, 0x0000108d, 0x0000108d,
+ 0x0000109d, 0x0000109d, 0x000010fc, 0x000010fc,
+ 0x0000135d, 0x0000135f, 0x00001712, 0x00001714,
+ 0x00001732, 0x00001734, 0x00001752, 0x00001753,
+ 0x00001772, 0x00001773, 0x000017b4, 0x000017b5,
+ 0x000017b7, 0x000017bd, 0x000017c6, 0x000017c6,
+ 0x000017c9, 0x000017d3, 0x000017d7, 0x000017d7,
+ 0x000017dd, 0x000017dd, 0x0000180b, 0x0000180e,
+ 0x00001843, 0x00001843, 0x00001885, 0x00001886,
+ 0x000018a9, 0x000018a9, 0x00001920, 0x00001922,
+ 0x00001927, 0x00001928, 0x00001932, 0x00001932,
+ 0x00001939, 0x0000193b, 0x00001a17, 0x00001a18,
+ 0x00001a1b, 0x00001a1b, 0x00001a56, 0x00001a56,
+ 0x00001a58, 0x00001a5e, 0x00001a60, 0x00001a60,
+ 0x00001a62, 0x00001a62, 0x00001a65, 0x00001a6c,
+ 0x00001a73, 0x00001a7c, 0x00001a7f, 0x00001a7f,
+ 0x00001aa7, 0x00001aa7, 0x00001ab0, 0x00001abe,
+ 0x00001b00, 0x00001b03, 0x00001b34, 0x00001b34,
+ 0x00001b36, 0x00001b3a, 0x00001b3c, 0x00001b3c,
+ 0x00001b42, 0x00001b42, 0x00001b6b, 0x00001b73,
+ 0x00001b80, 0x00001b81, 0x00001ba2, 0x00001ba5,
+ 0x00001ba8, 0x00001ba9, 0x00001bab, 0x00001bad,
+ 0x00001be6, 0x00001be6, 0x00001be8, 0x00001be9,
+ 0x00001bed, 0x00001bed, 0x00001bef, 0x00001bf1,
+ 0x00001c2c, 0x00001c33, 0x00001c36, 0x00001c37,
+ 0x00001c78, 0x00001c7d, 0x00001cd0, 0x00001cd2,
+ 0x00001cd4, 0x00001ce0, 0x00001ce2, 0x00001ce8,
+ 0x00001ced, 0x00001ced, 0x00001cf4, 0x00001cf4,
+ 0x00001cf8, 0x00001cf9, 0x00001d2c, 0x00001d6a,
+ 0x00001d78, 0x00001d78, 0x00001d9b, 0x00001df9,
+ 0x00001dfb, 0x00001dff, 0x00001fbd, 0x00001fbd,
+ 0x00001fbf, 0x00001fc1, 0x00001fcd, 0x00001fcf,
+ 0x00001fdd, 0x00001fdf, 0x00001fed, 0x00001fef,
+ 0x00001ffd, 0x00001ffe, 0x0000200b, 0x0000200f,
+ 0x00002018, 0x00002019, 0x00002024, 0x00002024,
+ 0x00002027, 0x00002027, 0x0000202a, 0x0000202e,
+ 0x00002060, 0x00002064, 0x00002066, 0x0000206f,
+ 0x00002071, 0x00002071, 0x0000207f, 0x0000207f,
+ 0x00002090, 0x0000209c, 0x000020d0, 0x000020f0,
+ 0x00002c7c, 0x00002c7d, 0x00002cef, 0x00002cf1,
+ 0x00002d6f, 0x00002d6f, 0x00002d7f, 0x00002d7f,
+ 0x00002de0, 0x00002dff, 0x00002e2f, 0x00002e2f,
+ 0x00003005, 0x00003005, 0x0000302a, 0x0000302d,
+ 0x00003031, 0x00003035, 0x0000303b, 0x0000303b,
+ 0x00003099, 0x0000309e, 0x000030fc, 0x000030fe,
+ 0x0000a015, 0x0000a015, 0x0000a4f8, 0x0000a4fd,
+ 0x0000a60c, 0x0000a60c, 0x0000a66f, 0x0000a672,
+ 0x0000a674, 0x0000a67d, 0x0000a67f, 0x0000a67f,
+ 0x0000a69c, 0x0000a69f, 0x0000a6f0, 0x0000a6f1,
+ 0x0000a700, 0x0000a721, 0x0000a770, 0x0000a770,
+ 0x0000a788, 0x0000a78a, 0x0000a7f8, 0x0000a7f9,
+ 0x0000a802, 0x0000a802, 0x0000a806, 0x0000a806,
+ 0x0000a80b, 0x0000a80b, 0x0000a825, 0x0000a826,
+ 0x0000a8c4, 0x0000a8c5, 0x0000a8e0, 0x0000a8f1,
+ 0x0000a926, 0x0000a92d, 0x0000a947, 0x0000a951,
+ 0x0000a980, 0x0000a982, 0x0000a9b3, 0x0000a9b3,
+ 0x0000a9b6, 0x0000a9b9, 0x0000a9bc, 0x0000a9bc,
+ 0x0000a9cf, 0x0000a9cf, 0x0000a9e5, 0x0000a9e6,
+ 0x0000aa29, 0x0000aa2e, 0x0000aa31, 0x0000aa32,
+ 0x0000aa35, 0x0000aa36, 0x0000aa43, 0x0000aa43,
+ 0x0000aa4c, 0x0000aa4c, 0x0000aa70, 0x0000aa70,
+ 0x0000aa7c, 0x0000aa7c, 0x0000aab0, 0x0000aab0,
+ 0x0000aab2, 0x0000aab4, 0x0000aab7, 0x0000aab8,
+ 0x0000aabe, 0x0000aabf, 0x0000aac1, 0x0000aac1,
+ 0x0000aadd, 0x0000aadd, 0x0000aaec, 0x0000aaed,
+ 0x0000aaf3, 0x0000aaf4, 0x0000aaf6, 0x0000aaf6,
+ 0x0000ab5b, 0x0000ab5f, 0x0000abe5, 0x0000abe5,
+ 0x0000abe8, 0x0000abe8, 0x0000abed, 0x0000abed,
+ 0x0000fb1e, 0x0000fb1e, 0x0000fbb2, 0x0000fbc1,
+ 0x0000fe00, 0x0000fe0f, 0x0000fe13, 0x0000fe13,
+ 0x0000fe20, 0x0000fe2f, 0x0000fe52, 0x0000fe52,
+ 0x0000fe55, 0x0000fe55, 0x0000feff, 0x0000feff,
+ 0x0000ff07, 0x0000ff07, 0x0000ff0e, 0x0000ff0e,
+ 0x0000ff1a, 0x0000ff1a, 0x0000ff3e, 0x0000ff3e,
+ 0x0000ff40, 0x0000ff40, 0x0000ff70, 0x0000ff70,
+ 0x0000ff9e, 0x0000ff9f, 0x0000ffe3, 0x0000ffe3,
+ 0x0000fff9, 0x0000fffb, 0x000101fd, 0x000101fd,
+ 0x000102e0, 0x000102e0, 0x00010376, 0x0001037a,
+ 0x00010a01, 0x00010a03, 0x00010a05, 0x00010a06,
+ 0x00010a0c, 0x00010a0f, 0x00010a38, 0x00010a3a,
+ 0x00010a3f, 0x00010a3f, 0x00010ae5, 0x00010ae6,
+ 0x00011001, 0x00011001, 0x00011038, 0x00011046,
+ 0x0001107f, 0x00011081, 0x000110b3, 0x000110b6,
+ 0x000110b9, 0x000110ba, 0x000110bd, 0x000110bd,
+ 0x00011100, 0x00011102, 0x00011127, 0x0001112b,
+ 0x0001112d, 0x00011134, 0x00011173, 0x00011173,
+ 0x00011180, 0x00011181, 0x000111b6, 0x000111be,
+ 0x000111ca, 0x000111cc, 0x0001122f, 0x00011231,
+ 0x00011234, 0x00011234, 0x00011236, 0x00011237,
+ 0x0001123e, 0x0001123e, 0x000112df, 0x000112df,
+ 0x000112e3, 0x000112ea, 0x00011300, 0x00011301,
+ 0x0001133c, 0x0001133c, 0x00011340, 0x00011340,
+ 0x00011366, 0x0001136c, 0x00011370, 0x00011374,
+ 0x00011438, 0x0001143f, 0x00011442, 0x00011444,
+ 0x00011446, 0x00011446, 0x000114b3, 0x000114b8,
+ 0x000114ba, 0x000114ba, 0x000114bf, 0x000114c0,
+ 0x000114c2, 0x000114c3, 0x000115b2, 0x000115b5,
+ 0x000115bc, 0x000115bd, 0x000115bf, 0x000115c0,
+ 0x000115dc, 0x000115dd, 0x00011633, 0x0001163a,
+ 0x0001163d, 0x0001163d, 0x0001163f, 0x00011640,
+ 0x000116ab, 0x000116ab, 0x000116ad, 0x000116ad,
+ 0x000116b0, 0x000116b5, 0x000116b7, 0x000116b7,
+ 0x0001171d, 0x0001171f, 0x00011722, 0x00011725,
+ 0x00011727, 0x0001172b, 0x00011a01, 0x00011a06,
+ 0x00011a09, 0x00011a0a, 0x00011a33, 0x00011a38,
+ 0x00011a3b, 0x00011a3e, 0x00011a47, 0x00011a47,
+ 0x00011a51, 0x00011a56, 0x00011a59, 0x00011a5b,
+ 0x00011a8a, 0x00011a96, 0x00011a98, 0x00011a99,
+ 0x00011c30, 0x00011c36, 0x00011c38, 0x00011c3d,
+ 0x00011c3f, 0x00011c3f, 0x00011c92, 0x00011ca7,
+ 0x00011caa, 0x00011cb0, 0x00011cb2, 0x00011cb3,
+ 0x00011cb5, 0x00011cb6, 0x00011d31, 0x00011d36,
+ 0x00011d3a, 0x00011d3a, 0x00011d3c, 0x00011d3d,
+ 0x00011d3f, 0x00011d45, 0x00011d47, 0x00011d47,
+ 0x00016af0, 0x00016af4, 0x00016b30, 0x00016b36,
+ 0x00016b40, 0x00016b43, 0x00016f8f, 0x00016f9f,
+ 0x00016fe0, 0x00016fe1, 0x0001bc9d, 0x0001bc9e,
+ 0x0001bca0, 0x0001bca3, 0x0001d167, 0x0001d169,
+ 0x0001d173, 0x0001d182, 0x0001d185, 0x0001d18b,
+ 0x0001d1aa, 0x0001d1ad, 0x0001d242, 0x0001d244,
+ 0x0001da00, 0x0001da36, 0x0001da3b, 0x0001da6c,
+ 0x0001da75, 0x0001da75, 0x0001da84, 0x0001da84,
+ 0x0001da9b, 0x0001da9f, 0x0001daa1, 0x0001daaf,
+ 0x0001e000, 0x0001e006, 0x0001e008, 0x0001e018,
+ 0x0001e01b, 0x0001e021, 0x0001e023, 0x0001e024,
+ 0x0001e026, 0x0001e02a, 0x0001e8d0, 0x0001e8d6,
+ 0x0001e944, 0x0001e94a, 0x0001f3fb, 0x0001f3ff,
+ 0x000e0001, 0x000e0001, 0x000e0020, 0x000e007f,
+ 0x000e0100, 0x000e01ef
};
static const unsigned _uccase_upper_g_size = 254;