summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAkira TAGOH <akira@tagoh.org>2011-09-06 17:07:29 +0900
committerAkira TAGOH <akira@tagoh.org>2018-05-16 17:23:56 +0900
commit59050a0f3af6134c2d4ee9cd78addf7bcc3071cc (patch)
treeab4d9669ac15ed4e2823b635926587e2cb278730
parentf098adac54ab86b75a38f2d23fa706a1348f55ba (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.c26
-rw-r--r--src/fcdbg.c3
-rw-r--r--src/fcint.h7
-rw-r--r--src/fclang.c8
-rw-r--r--src/fcstr.c12
-rw-r--r--src/fcxml.c5
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])