Optimization in FcLangSetIndex was broken, occasionally returning a pointer
to the wrong location on miss
This commit is contained in:
parent
8bc4bc134a
commit
947afeb566
21
src/fclang.c
21
src/fclang.c
|
@ -262,6 +262,7 @@ FcLangSetIndex (const FcChar8 *lang)
|
||||||
int low, high, mid = 0;
|
int low, high, mid = 0;
|
||||||
int cmp = 0;
|
int cmp = 0;
|
||||||
FcChar8 firstChar = FcToLower(lang[0]);
|
FcChar8 firstChar = FcToLower(lang[0]);
|
||||||
|
FcChar8 secondChar = firstChar ? FcToLower(lang[1]) : '\0';
|
||||||
|
|
||||||
if (firstChar < 'a')
|
if (firstChar < 'a')
|
||||||
{
|
{
|
||||||
|
@ -290,22 +291,14 @@ FcLangSetIndex (const FcChar8 *lang)
|
||||||
else
|
else
|
||||||
{ /* fast path for resolving 2-letter languages (by far the most common) after
|
{ /* fast path for resolving 2-letter languages (by far the most common) after
|
||||||
* finding the first char (probably already true because of the hash table) */
|
* finding the first char (probably already true because of the hash table) */
|
||||||
FcChar8 secondChar = FcToLower(lang[1]);
|
cmp = fcLangCharSets[mid].lang[1] - secondChar;
|
||||||
if (fcLangCharSets[mid].lang[1] > secondChar) /* check second chars */
|
if (cmp == 0 &&
|
||||||
|
(fcLangCharSets[mid].lang[2] != '\0' ||
|
||||||
|
lang[2] != '\0'))
|
||||||
{
|
{
|
||||||
high = mid - 1;
|
cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2,
|
||||||
continue;
|
lang+2);
|
||||||
}
|
}
|
||||||
else if (fcLangCharSets[mid].lang[1] < secondChar)
|
|
||||||
{
|
|
||||||
low = mid + 1;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
else if (fcLangCharSets[mid].lang[2] == '\0' && lang[2] == '\0')
|
|
||||||
return mid;
|
|
||||||
|
|
||||||
else /* identical through the first two charcters, but at least one string didn't end there */
|
|
||||||
cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2, lang+2);
|
|
||||||
}
|
}
|
||||||
if (cmp == 0)
|
if (cmp == 0)
|
||||||
return mid;
|
return mid;
|
||||||
|
|
Loading…
Reference in New Issue