diff options
author | Akira TAGOH <akira@tagoh.org> | 2011-09-06 17:07:29 +0900 |
---|---|---|
committer | Akira TAGOH <akira@tagoh.org> | 2018-05-16 17:23:56 +0900 |
commit | 59050a0f3af6134c2d4ee9cd78addf7bcc3071cc (patch) | |
tree | ab4d9669ac15ed4e2823b635926587e2cb278730 | |
parent | f098adac54ab86b75a38f2d23fa706a1348f55ba (diff) |
Bug 40648 - Regular expression support in comparison for <test>bz40648
Add the regexp support for <test> element. this only works with
the string object and the langset object so far.
This can be used in the fontconfig config file like:
<match>
<test name=lang compare=regex>
<string>ja.*</string>
</test>
<edit name=family mode=prepend>
<string>VL Gothic</string>
</edit>
</match>
-rw-r--r-- | src/fccfg.c | 26 | ||||
-rw-r--r-- | src/fcdbg.c | 3 | ||||
-rw-r--r-- | src/fcint.h | 7 | ||||
-rw-r--r-- | src/fclang.c | 8 | ||||
-rw-r--r-- | src/fcstr.c | 12 | ||||
-rw-r--r-- | src/fcxml.c | 5 |
6 files changed, 59 insertions, 2 deletions
diff --git a/src/fccfg.c b/src/fccfg.c index e966e57b..b409bcbd 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -729,12 +729,13 @@ FcConfigCompareValue (const FcValue *left_o, const FcValue *right_o) { FcValue left = FcValueCanonicalize(left_o); - FcValue right = FcValueCanonicalize(right_o); + FcValue old_right, right = FcValueCanonicalize(right_o); FcBool ret = FcFalse; FcOp op = FC_OP_GET_OP (op_); int flags = FC_OP_GET_FLAGS (op_); FcValuePromotionBuffer buf1, buf2; + old_right = right; left = FcConfigPromote (left, right, &buf1); right = FcConfigPromote (right, left, &buf2); if (left.type == right.type) @@ -767,6 +768,9 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpMoreEqual: ret = left.u.d >= right.u.d; break; + case FcOpRegex: + fprintf (stderr, "Fontconfig: Invalid type to regex\n"); + break; default: break; } @@ -798,6 +802,9 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpMoreEqual: ret = left.u.b == right.u.b || left.u.b == FcDontCare; break; + case FcOpRegex: + fprintf (stderr, "Fontconfig: Invalid type to regex\n"); + break; default: break; } @@ -823,6 +830,9 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpNotContains: ret = FcStrStrIgnoreCase (left.u.s, right.u.s) == 0; break; + case FcOpRegex: + ret = FcStrRegexCmp (left.u.s, right.u.s); + break; default: break; } @@ -838,6 +848,9 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpNotContains: ret = !FcMatrixEqual (left.u.m, right.u.m); break; + case FcOpRegex: + fprintf (stderr, "Fontconfig: Invalid type to regex\n"); + break; default: break; } @@ -859,6 +872,9 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpNotEqual: ret = !FcCharSetEqual (left.u.c, right.u.c); break; + case FcOpRegex: + fprintf (stderr, "Fontconfig: Invalid type to regex\n"); + break; default: break; } @@ -878,6 +894,10 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpNotEqual: ret = !FcLangSetEqual (left.u.l, right.u.l); break; + case FcOpRegex: + if (old_right.type == FcTypeString) + ret = FcLangSetRegexCmp (left.u.l, old_right.u.s); + break; default: break; } @@ -904,6 +924,9 @@ FcConfigCompareValue (const FcValue *left_o, case FcOpNotContains: ret = left.u.f != right.u.f; break; + case FcOpRegex: + fprintf (stderr, "Fontconfig: Invalid type to regex\n"); + break; default: break; } @@ -1041,6 +1064,7 @@ FcConfigEvaluate (FcPattern *p, FcPattern *p_pat, FcMatchKind kind, FcExpr *e) case FcOpContains: case FcOpNotContains: case FcOpListing: + case FcOpRegex: vl = FcConfigEvaluate (p, p_pat, kind, e->u.tree.left); vr = FcConfigEvaluate (p, p_pat, kind, e->u.tree.right); v.type = FcTypeBool; diff --git a/src/fcdbg.c b/src/fcdbg.c index e2c6b562..ae06d4bf 100644 --- a/src/fcdbg.c +++ b/src/fcdbg.c @@ -325,6 +325,7 @@ FcOpPrint (FcOp op_) case FcOpMoreEqual: printf ("MoreEqual"); break; case FcOpContains: printf ("Contains"); break; case FcOpNotContains: printf ("NotContains"); break; + case FcOpRegex: printf ("Regex"); break; case FcOpPlus: printf ("Plus"); break; case FcOpMinus: printf ("Minus"); break; case FcOpTimes: printf ("Times"); break; @@ -406,6 +407,7 @@ FcExprPrint (const FcExpr *expr) case FcOpContains: case FcOpListing: case FcOpNotContains: + case FcOpRegex: case FcOpPlus: case FcOpMinus: case FcOpTimes: @@ -431,6 +433,7 @@ FcExprPrint (const FcExpr *expr) case FcOpContains: printf ("Contains"); break; case FcOpListing: printf ("Listing"); FcOpFlagsPrint (expr->op); break; case FcOpNotContains: printf ("NotContains"); break; + case FcOpRegex: printf ("Regex"); break; case FcOpPlus: printf ("Plus"); break; case FcOpMinus: printf ("Minus"); break; case FcOpTimes: printf ("Times"); break; diff --git a/src/fcint.h b/src/fcint.h index a402ca27..d79e5f7c 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -238,6 +238,7 @@ typedef enum _FcOp { FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual, FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide, FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc, + FcOpRegex, FcOpRegexReplace, FcOpInvalid } FcOp; @@ -978,6 +979,9 @@ FcFreeTypeLangSet (const FcCharSet *charset, FcPrivate FcLangResult FcLangCompare (const FcChar8 *s1, const FcChar8 *s2); +FcPrivate FcBool +FcLangSetRegexCmp (const FcLangSet *ls, const FcChar8 *regex); + FcPrivate FcLangSet * FcLangSetPromote (const FcChar8 *lang, FcValuePromotionBuffer *buf); @@ -1227,6 +1231,9 @@ FcStrSetAddLangs (FcStrSet *strs, const char *languages); FcPrivate void FcStrSetSort (FcStrSet * set); +FcPrivate FcBool +FcStrSetRegexCmp (const FcStrSet *set, const FcChar8 *regex); + FcPrivate void FcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size); diff --git a/src/fclang.c b/src/fclang.c index 687e2a73..ddc7f849 100644 --- a/src/fclang.c +++ b/src/fclang.c @@ -1019,6 +1019,14 @@ FcLangSetContains (const FcLangSet *lsa, const FcLangSet *lsb) } FcBool +FcLangSetRegexCmp (const FcLangSet *ls, const FcChar8 *regex) +{ + FcStrSet *ss = FcLangSetGetLangs(ls); + + return FcStrSetRegexCmp (ss, regex); +} + +FcBool FcLangSetSerializeAlloc (FcSerialize *serialize, const FcLangSet *l) { if (!FcSerializeAlloc (serialize, l, sizeof (FcLangSet))) diff --git a/src/fcstr.c b/src/fcstr.c index b65492d8..826f88d2 100644 --- a/src/fcstr.c +++ b/src/fcstr.c @@ -1209,6 +1209,18 @@ FcStrSetEqual (FcStrSet *sa, FcStrSet *sb) } FcBool +FcStrSetRegexCmp (const FcStrSet *set, const FcChar8 *regex) +{ + int i; + + for (i = 0; i < set->num; i++) + if (FcStrRegexCmp (set->strs[i], regex)) + return FcTrue; + + return FcFalse; +} + +FcBool FcStrSetAdd (FcStrSet *set, const FcChar8 *s) { FcChar8 *new = FcStrCopy (s); diff --git a/src/fcxml.c b/src/fcxml.c index 1ee1ba1d..c0c41a61 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -317,6 +317,7 @@ FcExprDestroy (FcExpr *e) case FcOpMore: case FcOpMoreEqual: case FcOpContains: + case FcOpRegex: case FcOpListing: case FcOpNotContains: case FcOpPlus: @@ -679,6 +680,7 @@ FcTypecheckExpr (FcConfigParse *parse, FcExpr *expr, FcType type) FcTypecheckValue (parse, FcTypeDouble, type); break; case FcOpString: + case FcOpRegex: FcTypecheckValue (parse, FcTypeString, type); break; case FcOpMatrix: @@ -2504,7 +2506,8 @@ static const FcOpMap fcCompareOps[] = { { "more", FcOpMore }, { "more_eq", FcOpMoreEqual }, { "contains", FcOpContains }, - { "not_contains", FcOpNotContains } + { "not_contains", FcOpNotContains }, + { "regex", FcOpRegex }, }; #define NUM_COMPARE_OPS (int) (sizeof fcCompareOps / sizeof fcCompareOps[0]) |