This commit is contained in:
Nikita Popov 2017-07-28 14:57:08 +02:00
parent 25b6e68432
commit f4a1d9c821
7 changed files with 334 additions and 26 deletions

4
NEWS
View File

@ -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)

View File

@ -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:

View File

@ -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

View File

@ -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.'""

View File

@ -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 peoples issues", MB_CASE_TITLE);
?>
--EXPECT--
People's Issues Versus Peoples Issues

View File

@ -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;

View File

@ -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;