Replace uses of bsearch(). Either switch to std::lower_bound(), or brute force when the search space is very small. Change-Id: I54db346aeb6f2e8000e95a6a9c8fbdd512df500a Reviewed-on: https://pdfium-review.googlesource.com/20431 Reviewed-by: dsinclair <dsinclair@chromium.org> Commit-Queue: Lei Zhang <thestig@chromium.org>
diff --git a/core/fpdfapi/font/cpdf_type1font.cpp b/core/fpdfapi/font/cpdf_type1font.cpp index 9975943..21d9da4 100644 --- a/core/fpdfapi/font/cpdf_type1font.cpp +++ b/core/fpdfapi/font/cpdf_type1font.cpp
@@ -6,6 +6,8 @@ #include "core/fpdfapi/font/cpdf_type1font.h" +#include <algorithm> + #include "core/fpdfapi/parser/cpdf_dictionary.h" #include "core/fxge/cfx_gemodule.h" #include "core/fxge/fx_freetype.h" @@ -28,16 +30,12 @@ {"fi", "uniFB01"}, {"fl", "uniFB02"}}; -int compareString(const void* key, const void* element) { - return FXSYS_stricmp(static_cast<const char*>(key), - static_cast<const GlyphNameMap*>(element)->m_pStrAdobe); -} - const char* GlyphNameRemap(const char* pStrAdobe) { - const GlyphNameMap* found = static_cast<const GlyphNameMap*>( - bsearch(pStrAdobe, g_GlyphNameSubsts, FX_ArraySize(g_GlyphNameSubsts), - sizeof(GlyphNameMap), compareString)); - return found ? found->m_pStrUnicode : nullptr; + for (const auto& element : g_GlyphNameSubsts) { + if (!FXSYS_stricmp(element.m_pStrAdobe, pStrAdobe)) + return element.m_pStrUnicode; + } + return nullptr; } #endif // _FX_PLATFORM_ == _FX_PLATFORM_APPLE_
diff --git a/core/fxge/cfx_fontmapper.cpp b/core/fxge/cfx_fontmapper.cpp index bb80c27..406a822 100644 --- a/core/fxge/cfx_fontmapper.cpp +++ b/core/fxge/cfx_fontmapper.cpp
@@ -158,19 +158,6 @@ {10081, 86}, }; -int CompareFontFamilyString(const void* key, const void* element) { - ByteString str_key((const char*)key); - const AltFontFamily* family = reinterpret_cast<const AltFontFamily*>(element); - if (str_key.Contains(family->m_pFontName)) - return 0; - return FXSYS_stricmp(reinterpret_cast<const char*>(key), family->m_pFontName); -} - -int CompareString(const void* key, const void* element) { - return FXSYS_stricmp(reinterpret_cast<const char*>(key), - reinterpret_cast<const AltFontName*>(element)->m_pName); -} - ByteString TT_NormalizeName(const char* family) { ByteString norm(family); norm.Remove(' '); @@ -196,22 +183,24 @@ return FX_CHARSET_Default; } -ByteString GetFontFamily(ByteString fontName, uint32_t nStyle) { - if (fontName.Contains("Script")) { +void GetFontFamily(uint32_t nStyle, ByteString* fontName) { + if (fontName->Contains("Script")) { if (FontStyleIsBold(nStyle)) - fontName = "ScriptMTBold"; - else if (fontName.Contains("Palace")) - fontName = "PalaceScriptMT"; - else if (fontName.Contains("French")) - fontName = "FrenchScriptMT"; - else if (fontName.Contains("FreeStyle")) - fontName = "FreeStyleScript"; - return fontName; + *fontName = "ScriptMTBold"; + else if (fontName->Contains("Palace")) + *fontName = "PalaceScriptMT"; + else if (fontName->Contains("French")) + *fontName = "FrenchScriptMT"; + else if (fontName->Contains("FreeStyle")) + *fontName = "FreeStyleScript"; + return; } - AltFontFamily* found = reinterpret_cast<AltFontFamily*>(bsearch( - fontName.c_str(), g_AltFontFamilies, FX_ArraySize(g_AltFontFamilies), - sizeof(AltFontFamily), CompareFontFamilyString)); - return found ? ByteString(found->m_pFontFamily) : fontName; + for (const auto& alternate : g_AltFontFamilies) { + if (fontName->Contains(alternate.m_pFontName)) { + *fontName = alternate.m_pFontFamily; + return; + } + } } ByteString ParseStyle(const char* pStyle, int iLen, int iIndex) { @@ -566,7 +555,7 @@ return UseInternalSubst(pSubstFont, iBaseFont, italic_angle, old_weight, PitchFamily); } - family = GetFontFamily(family, nStyle); + GetFontFamily(nStyle, &family); ByteString match = MatchInstalledFonts(TT_NormalizeName(family.c_str())); if (match.IsEmpty() && family != SubstName && (!bHasComma && (!bHasHyphen || (bHasHyphen && !bStyleAvail)))) { @@ -800,10 +789,13 @@ } int PDF_GetStandardFontName(ByteString* name) { - AltFontName* found = static_cast<AltFontName*>( - bsearch(name->c_str(), g_AltFontNames, FX_ArraySize(g_AltFontNames), - sizeof(AltFontName), CompareString)); - if (!found) + const auto* end = std::end(g_AltFontNames); + const auto* found = + std::lower_bound(std::begin(g_AltFontNames), end, name->c_str(), + [](const AltFontName& element, const char* name) { + return FXSYS_stricmp(element.m_pName, name) < 0; + }); + if (found == end || FXSYS_stricmp(found->m_pName, name->c_str())) return -1; *name = g_Base14FontNames[found->m_Index];