Optimization in FcLangSetIndex was broken, occasionally returning a pointer

to the wrong location on miss
This commit is contained in:
Keith Packard 2003-06-09 17:31:03 +00:00
parent 8bc4bc134a
commit 947afeb566
1 changed files with 7 additions and 14 deletions

View File

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