mirror of
https://github.com/dlang/phobos.git
synced 2025-05-05 09:30:49 +03:00
Fix issue 12455 [reg]Bad lowercase mapping for 'LATIN CAPITAL LETTER I WITH DOT ABOVE'
Also as part of a fix restores a test case in string.d to exactly match older behaviour. Some extended greek is not upper but title case, yet changes on toUpper.
This commit is contained in:
parent
520c535789
commit
c131da5834
3 changed files with 43 additions and 25 deletions
File diff suppressed because one or more lines are too long
|
@ -1496,7 +1496,7 @@ unittest
|
|||
assert(s2 !is s1);
|
||||
s1 = to!S("\u0131 \u0130");
|
||||
s2 = capitalize(s1);
|
||||
assert(cmp(s2, "I \u0130") == 0);
|
||||
assert(cmp(s2, "\u0049 \u0069") == 0);
|
||||
assert(s2 !is s1);
|
||||
|
||||
s1 = to!S("\u017F \u0049");
|
||||
|
|
54
std/uni.d
54
std/uni.d
|
@ -7861,12 +7861,14 @@ else
|
|||
|
||||
// trusted -> avoid bounds check
|
||||
@trusted pure nothrow
|
||||
ushort toLowerIndex(dchar c)
|
||||
ushort indexLookup(alias trie)(dchar c)
|
||||
{
|
||||
alias trie = toLowerIndexTrie;
|
||||
return trie[c];
|
||||
}
|
||||
|
||||
alias toLowerIndex = indexLookup!toLowerIndexTrie;
|
||||
alias toLowerSimpleIndex = indexLookup!toLowerSimpleIndexTrie;
|
||||
|
||||
// trusted -> avoid bounds check
|
||||
@trusted pure nothrow
|
||||
dchar toLowerTab(size_t idx)
|
||||
|
@ -7874,13 +7876,8 @@ dchar toLowerTab(size_t idx)
|
|||
return toLowerTable[idx];
|
||||
}
|
||||
|
||||
// trusted -> avoid bounds check
|
||||
@trusted pure nothrow
|
||||
ushort toTitleIndex(dchar c)
|
||||
{
|
||||
alias trie = toTitleIndexTrie;
|
||||
return trie[c];
|
||||
}
|
||||
alias toTitleIndex = indexLookup!toTitleIndexTrie;
|
||||
alias toTitleSimpleIndex = indexLookup!toTitleSimpleIndexTrie;
|
||||
|
||||
// trusted -> avoid bounds check
|
||||
@trusted pure nothrow
|
||||
|
@ -7889,13 +7886,8 @@ dchar toTitleTab(size_t idx)
|
|||
return toTitleTable[idx];
|
||||
}
|
||||
|
||||
// trusted -> avoid bounds check
|
||||
@trusted pure nothrow
|
||||
ushort toUpperIndex(dchar c)
|
||||
{
|
||||
alias trie = toUpperIndexTrie;
|
||||
return trie[c];
|
||||
}
|
||||
alias toUpperIndex = indexLookup!toUpperIndexTrie;
|
||||
alias toUpperSimpleIndex = indexLookup!toUpperSimpleIndexTrie;
|
||||
|
||||
// trusted -> avoid bounds check
|
||||
@trusted pure nothrow
|
||||
|
@ -7997,8 +7989,8 @@ dchar toLower(dchar c)
|
|||
return c + 32;
|
||||
return c;
|
||||
}
|
||||
size_t idx = toLowerIndex(c);
|
||||
if(idx < MAX_SIMPLE_LOWER)
|
||||
size_t idx = toLowerSimpleIndex(c);
|
||||
if(idx != ushort.max)
|
||||
{
|
||||
return toLowerTab(idx);
|
||||
}
|
||||
|
@ -8019,8 +8011,8 @@ private dchar toTitlecase(dchar c)
|
|||
return c - 32;
|
||||
return c;
|
||||
}
|
||||
size_t idx = toTitleIndex(c);
|
||||
if(idx < MAX_SIMPLE_TITLE)
|
||||
size_t idx = toTitleSimpleIndex(c);
|
||||
if(idx != ushort.max)
|
||||
{
|
||||
return toTitleTab(idx);
|
||||
}
|
||||
|
@ -8454,6 +8446,15 @@ unittest
|
|||
// Test on wchar and dchar strings.
|
||||
assert(toLower("Some String"w) == "some string"w);
|
||||
assert(toLower("Some String"d) == "some string"d);
|
||||
|
||||
// bugzilla 12455
|
||||
dchar c = 'İ'; // '\U0130' LATIN CAPITAL LETTER I WITH DOT ABOVE
|
||||
assert(isUpper(c));
|
||||
assert(toLower(c) == 'i');
|
||||
// extend on 12455 reprot - check simple-case toUpper too
|
||||
c = '\u1f87';
|
||||
assert(isLower(c));
|
||||
assert(toUpper(c) == '\u1F8F');
|
||||
}
|
||||
|
||||
|
||||
|
@ -8477,8 +8478,8 @@ dchar toUpper(dchar c)
|
|||
return c - 32;
|
||||
return c;
|
||||
}
|
||||
size_t idx = toUpperIndex(c);
|
||||
if(idx < MAX_SIMPLE_UPPER)
|
||||
size_t idx = toUpperSimpleIndex(c);
|
||||
if(idx != ushort.max)
|
||||
{
|
||||
return toUpperTab(idx);
|
||||
}
|
||||
|
@ -8492,10 +8493,12 @@ dchar toUpper(dchar c)
|
|||
assert(std.ascii.toUpper(ch) == toUpper(ch));
|
||||
assert(toUpper('я') == 'Я');
|
||||
assert(toUpper('δ') == 'Δ');
|
||||
auto title = unicode.Titlecase_Letter;
|
||||
foreach(ch; unicode.lowerCase.byCodepoint)
|
||||
{
|
||||
dchar up = ch.toUpper();
|
||||
assert(up == ch || isUpper(up), format("%s -> %s", ch, up));
|
||||
assert(up == ch || isUpper(up) || title[up],
|
||||
format("%x -> %x", ch, up));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -8994,7 +8997,10 @@ private:
|
|||
auto toUpperIndexTrie() { static immutable res = asTrie(toUpperIndexTrieEntries); return res; }
|
||||
auto toLowerIndexTrie() { static immutable res = asTrie(toLowerIndexTrieEntries); return res; }
|
||||
auto toTitleIndexTrie() { static immutable res = asTrie(toTitleIndexTrieEntries); return res; }
|
||||
|
||||
//simple case conversion tables
|
||||
auto toUpperSimpleIndexTrie() { static immutable res = asTrie(toUpperSimpleIndexTrieEntries); return res; }
|
||||
auto toLowerSimpleIndexTrie() { static immutable res = asTrie(toLowerSimpleIndexTrieEntries); return res; }
|
||||
auto toTitleSimpleIndexTrie() { static immutable res = asTrie(toTitleSimpleIndexTrieEntries); return res; }
|
||||
|
||||
}
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue