poppler/GlobalParams.cc | 80 +++++++++++++++++++++--------------------------- 1 file changed, 36 insertions(+), 44 deletions(-)
New commits: commit 7441d79e31de909954675a76d33ccb25147cf0ff Author: Claes Nästén <[email protected]> Date: Tue Jan 18 21:26:29 2022 +0100 Replace parts of font parsing code with std::string alternative strndup is not available on all platforms, instead of adding a compat variant use std::string functionality for parsing instead. diff --git a/poppler/GlobalParams.cc b/poppler/GlobalParams.cc index e5b71975..cf635dce 100644 --- a/poppler/GlobalParams.cc +++ b/poppler/GlobalParams.cc @@ -45,6 +45,7 @@ // Copyright (C) 2021, 2022 Stefan Löffler <[email protected]> // Copyright (C) 2021 sunderme <[email protected]> // Copyright (C) 2022 Even Rouault <[email protected]> +// Copyright (C) 2022 Claes Nästén <[email protected]> // // To see a description of the changes please see the Changelog file that // came with your tarball or type make ChangeLog if you are building from git @@ -53,6 +54,7 @@ #include <config.h> +#include <algorithm> #include <cstring> #include <cstdio> #include <cctype> @@ -664,22 +666,20 @@ FILE *GlobalParams::findToUnicodeFile(const GooString *name) } #ifdef WITH_FONTCONFIGURATION_FONTCONFIG -static bool findModifier(const char *name, const char *modifier, const char **start) +static bool findModifier(const std::string &name, const size_t modStart, const char *modifier, size_t &start) { - const char *match; - - if (name == nullptr) { + if (modStart == std::string::npos) { return false; } - match = strstr(name, modifier); - if (match) { - if (*start == nullptr || match < *start) { - *start = match; + size_t match = name.find(modifier, modStart); + if (match == std::string::npos) { + return false; + } else { + if (start == std::string::npos || match < start) { + start = match; } return true; - } else { - return false; } } @@ -721,57 +721,55 @@ static const char *getFontLang(const GfxFont *font) static FcPattern *buildFcPattern(const GfxFont *font, const GooString *base14Name) { int weight = -1, slant = -1, width = -1, spacing = -1; - const char *family; - const char *start; FcPattern *p; // this is all heuristics will be overwritten if font had proper info - char *fontName = strdup(((base14Name == nullptr) ? font->getNameWithoutSubsetTag() : base14Name->toStr()).c_str()); + std::string fontName; + if (base14Name == nullptr) { + fontName = font->getNameWithoutSubsetTag(); + } else { + fontName = base14Name->toStr(); + } - const char *modifiers = strchr(fontName, ','); - if (modifiers == nullptr) { - modifiers = strchr(fontName, '-'); + size_t modStart = fontName.find(','); + if (modStart == std::string::npos) { + modStart = fontName.find('-'); } // remove the - from the names, for some reason, Fontconfig does not // understand "MS-Mincho" but does with "MS Mincho" - const int len = strlen(fontName); - for (int i = 0; i < len; i++) { - fontName[i] = (fontName[i] == '-' ? ' ' : fontName[i]); - } + std::replace(fontName.begin(), fontName.end(), '-', ' '); - start = nullptr; - findModifier(modifiers, "Regular", &start); - findModifier(modifiers, "Roman", &start); + size_t start = std::string::npos; + findModifier(fontName, modStart, "Regular", start); + findModifier(fontName, modStart, "Roman", start); - if (findModifier(modifiers, "Oblique", &start)) { + if (findModifier(fontName, modStart, "Oblique", start)) { slant = FC_SLANT_OBLIQUE; } - if (findModifier(modifiers, "Italic", &start)) { + if (findModifier(fontName, modStart, "Italic", start)) { slant = FC_SLANT_ITALIC; } - if (findModifier(modifiers, "Bold", &start)) { + if (findModifier(fontName, modStart, "Bold", start)) { weight = FC_WEIGHT_BOLD; } - if (findModifier(modifiers, "Light", &start)) { + if (findModifier(fontName, modStart, "Light", start)) { weight = FC_WEIGHT_LIGHT; } - if (findModifier(modifiers, "Medium", &start)) { + if (findModifier(fontName, modStart, "Medium", start)) { weight = FC_WEIGHT_MEDIUM; } - if (findModifier(modifiers, "Condensed", &start)) { + if (findModifier(fontName, modStart, "Condensed", start)) { width = FC_WIDTH_CONDENSED; } - if (start) { + std::string family; + if (start == std::string::npos) { + family = fontName; + } else { // There have been "modifiers" in the name, crop them to obtain // the family name - family = strndup(fontName, modifiers - fontName); - free(fontName); - fontName = nullptr; - } else { - family = fontName; - fontName = nullptr; + family = fontName.substr(0, modStart); } // use font flags @@ -785,12 +783,9 @@ static FcPattern *buildFcPattern(const GfxFont *font, const GooString *base14Nam slant = FC_SLANT_ITALIC; } - bool freeFamily = true; // if the FontDescriptor specified a family name use it if (font->getFamily()) { - free((char *)family); - family = font->getFamily()->c_str(); - freeFamily = false; + family = font->getFamily()->toStr(); } // if the FontDescriptor specified a weight use it @@ -861,7 +856,7 @@ static FcPattern *buildFcPattern(const GfxFont *font, const GooString *base14Nam const char *lang = getFontLang(font); - p = FcPatternBuild(nullptr, FC_FAMILY, FcTypeString, family, FC_LANG, FcTypeString, lang, NULL); + p = FcPatternBuild(nullptr, FC_FAMILY, FcTypeString, family.c_str(), FC_LANG, FcTypeString, lang, NULL); if (slant != -1) { FcPatternAddInteger(p, FC_SLANT, slant); } @@ -875,9 +870,6 @@ static FcPattern *buildFcPattern(const GfxFont *font, const GooString *base14Nam FcPatternAddInteger(p, FC_SPACING, spacing); } - if (freeFamily) { - free((char *)family); - } return p; } #endif
