From: Keith Packard Date: Mon, 9 Jun 2003 17:31:03 +0000 (+0000) Subject: Optimization in FcLangSetIndex was broken, occasionally returning a pointer X-Git-Tag: fc-2_2_90~3 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=947afeb566e738de3980c8c8751358ecfebdba25;p=fontconfig.git Optimization in FcLangSetIndex was broken, occasionally returning a pointer to the wrong location on miss --- diff --git a/src/fclang.c b/src/fclang.c index b0a0894..53f2b59 100644 --- a/src/fclang.c +++ b/src/fclang.c @@ -262,6 +262,7 @@ FcLangSetIndex (const FcChar8 *lang) int low, high, mid = 0; int cmp = 0; FcChar8 firstChar = FcToLower(lang[0]); + FcChar8 secondChar = firstChar ? FcToLower(lang[1]) : '\0'; if (firstChar < 'a') { @@ -290,22 +291,14 @@ FcLangSetIndex (const FcChar8 *lang) else { /* 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) */ - FcChar8 secondChar = FcToLower(lang[1]); - if (fcLangCharSets[mid].lang[1] > secondChar) /* check second chars */ + cmp = fcLangCharSets[mid].lang[1] - secondChar; + if (cmp == 0 && + (fcLangCharSets[mid].lang[2] != '\0' || + lang[2] != '\0')) { - high = mid - 1; - continue; + cmp = FcStrCmpIgnoreCase(fcLangCharSets[mid].lang+2, + 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) return mid;