diff options
-rw-r--r-- | src/fcfreetype.c | 16 | ||||
-rw-r--r-- | src/fcint.h | 3 | ||||
-rw-r--r-- | src/fcstr.c | 50 |
3 files changed, 66 insertions, 3 deletions
diff --git a/src/fcfreetype.c b/src/fcfreetype.c index 3cf1686..d93292d 100644 --- a/src/fcfreetype.c +++ b/src/fcfreetype.c @@ -935,8 +935,18 @@ FcStringContainsConst (const FcChar8 *string, int i; for (i = 0; i < nc; i++) - if (FcStrContainsIgnoreBlanksAndCase (string, c[i].name)) - return c[i].value; + { + if (c[i].name[0] == '<') + { + if (FcStrContainsWord (string, c[i].name + 1)) + return c[i].value; + } + else + { + if (FcStrContainsIgnoreBlanksAndCase (string, c[i].name)) + return c[i].value; + } + } return -1; } @@ -958,6 +968,8 @@ static const FcStringConst weightConsts[] = { { (FC8) "superbold", FC_WEIGHT_EXTRABOLD }, { (FC8) "ultrabold", FC_WEIGHT_ULTRABOLD }, { (FC8) "bold", FC_WEIGHT_BOLD }, + { (FC8) "<ultra", FC_WEIGHT_ULTRABOLD }, /* only if a word */ + { (FC8) "bold", FC_WEIGHT_BOLD }, { (FC8) "black", FC_WEIGHT_BLACK }, { (FC8) "heavy", FC_WEIGHT_HEAVY }, }; diff --git a/src/fcint.h b/src/fcint.h index 3b9f3c8..8e57453 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -1046,6 +1046,9 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2); const FcChar8 * FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2); +const FcChar8 * +FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2); + FcBool FcStrUsesHome (const FcChar8 *s); diff --git a/src/fcstr.c b/src/fcstr.c index 5faf579..f803bad 100644 --- a/src/fcstr.c +++ b/src/fcstr.c @@ -320,6 +320,26 @@ FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2) return 0; } +static FcBool +FcCharIsPunct (const FcChar8 c) +{ + if (c < '0') + return FcTrue; + if (c <= '9') + return FcFalse; + if (c < 'A') + return FcTrue; + if (c <= 'Z') + return FcFalse; + if (c < 'a') + return FcTrue; + if (c <= 'z') + return FcFalse; + if (c <= '~') + return FcTrue; + return FcFalse; +} + /* * Is the head of s1 equal to s2? */ @@ -344,7 +364,7 @@ FcStrIsAtIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) } /* - * Does s1 contain an instance of s2 (ignoring blanks and case)? + * Does s1 contain an instance of s2 (ignoring case)? */ const FcChar8 * @@ -359,6 +379,34 @@ FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) return 0; } +/* + * Does s1 contain an instance of s2 on a word boundary (ignoring case)? + */ + +const FcChar8 * +FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2) +{ + FcBool wordStart = FcTrue; + int s1len = strlen ((char *) s1); + int s2len = strlen ((char *) s2); + + while (s1len >= s2len) + { + if (wordStart && + FcStrIsAtIgnoreCase (s1, s2) && + (s1len == s2len || FcCharIsPunct (s1[s2len]))) + { + return s1; + } + wordStart = FcFalse; + if (FcCharIsPunct (*s1)) + wordStart = FcTrue; + s1++; + s1len--; + } + return 0; +} + const FcChar8 * FcStrStrIgnoreCase (const FcChar8 *s1, const FcChar8 *s2) { |