diff options
author | Keith Packard <keithp@keithp.com> | 2002-08-22 18:53:22 +0000 |
---|---|---|
committer | Keith Packard <keithp@keithp.com> | 2002-08-22 18:53:22 +0000 |
commit | 47d4f9501fe21603feb5f3f233ea3bc6ec15f494 (patch) | |
tree | b946ec1caa95d02ca3af6a00f74c64e655cca912 | |
parent | d8d7395877238acbc9cd4709e3b4e76f8ca978cb (diff) |
Add contains/not_contains, fix LangSet equal operator to use FcLangEqual
-rw-r--r-- | ChangeLog | 13 | ||||
-rw-r--r-- | fonts.dtd | 6 | ||||
-rw-r--r-- | src/fccfg.c | 28 | ||||
-rw-r--r-- | src/fcdbg.c | 9 | ||||
-rw-r--r-- | src/fcint.h | 4 | ||||
-rw-r--r-- | src/fclang.c | 1 | ||||
-rw-r--r-- | src/fclist.c | 8 | ||||
-rw-r--r-- | src/fcxml.c | 19 |
8 files changed, 67 insertions, 21 deletions
@@ -1,3 +1,16 @@ +Thu Aug 22 11:36:18 PDT 2002 keithp + + + Add "contains" and "not_contains" operators and elements to + font configuration + + + Changed semantics of eq operator for LangSets to check for + FcLangEqual so that any match will do + + + FcFontList was using FcConfigCompareValue (...FcOpEqual) instead + of FcValueEqual to check for identical values when inserting into + the results. This broke when the above semantic change was made, + now it uses FcValueEqual which is "more correct" in any case. + Thu Aug 22 00:32:29 PDT 2002 keithp + Reimplement FC_LANG as new datatype. Lists of strings @@ -90,7 +90,7 @@ <!ENTITY % expr 'int|double|string|matrix|bool|charset |name|const - |or|and|eq|not_eq|less|less_eq|more|more_eq + |or|and|eq|not_eq|less|less_eq|more|more_eq|contains|not_contains |plus|minus|times|divide|not|if'> <!-- @@ -121,7 +121,7 @@ qual (any|all|first|not_first) "any" name CDATA #REQUIRED target (pattern|font|default) "default" - compare (eq|not_eq|less|less_eq|more|more_eq) "eq"> + compare (eq|not_eq|less|less_eq|more|more_eq|contains|not_contains) "eq"> <!-- Edit a field in a pattern @@ -172,6 +172,8 @@ <!ELEMENT less_eq ((%expr;), (%expr;))> <!ELEMENT more ((%expr;), (%expr;))> <!ELEMENT more_eq ((%expr;), (%expr;))> +<!ELEMENT contains ((%expr;), (%expr;))> +<!ELEMENT not_contains ((%expr;), (%expr;))> <!ELEMENT plus (%expr;)*> <!ELEMENT minus (%expr;)*> <!ELEMENT times (%expr;)*> diff --git a/src/fccfg.c b/src/fccfg.c index 2ec9f77..3e9874d 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.20 2002/08/19 19:32:05 keithp Exp $ + * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.21 2002/08/22 07:36:44 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -501,7 +501,8 @@ FcConfigCompareValue (FcValue m, case FcOpContains: ret = m.u.d == v.u.d; break; - case FcOpNotEqual: + case FcOpNotEqual: + case FcOpNotContains: ret = m.u.d != v.u.d; break; case FcOpLess: @@ -526,7 +527,8 @@ FcConfigCompareValue (FcValue m, case FcOpContains: ret = m.u.b == v.u.b; break; - case FcOpNotEqual: + case FcOpNotEqual: + case FcOpNotContains: ret = m.u.b != v.u.b; break; default: @@ -539,7 +541,8 @@ FcConfigCompareValue (FcValue m, case FcOpContains: ret = FcStrCmpIgnoreCase (m.u.s, v.u.s) == 0; break; - case FcOpNotEqual: + case FcOpNotEqual: + case FcOpNotContains: ret = FcStrCmpIgnoreCase (m.u.s, v.u.s) != 0; break; default: @@ -553,6 +556,7 @@ FcConfigCompareValue (FcValue m, ret = FcMatrixEqual (m.u.m, v.u.m); break; case FcOpNotEqual: + case FcOpNotContains: ret = !FcMatrixEqual (m.u.m, v.u.m); break; default: @@ -565,6 +569,10 @@ FcConfigCompareValue (FcValue m, /* m contains v if v is a subset of m */ ret = FcCharSetIsSubset (v.u.c, m.u.c); break; + case FcOpNotContains: + /* m contains v if v is a subset of m */ + ret = !FcCharSetIsSubset (v.u.c, m.u.c); + break; case FcOpEqual: ret = FcCharSetEqual (m.u.c, v.u.c); break; @@ -580,6 +588,9 @@ FcConfigCompareValue (FcValue m, case FcOpContains: ret = FcLangSetCompare (v.u.l, m.u.l) != FcLangDifferentLang; break; + case FcOpNotContains: + ret = FcLangSetCompare (v.u.l, m.u.l) == FcLangDifferentLang; + break; case FcOpEqual: ret = FcLangSetEqual (v.u.l, m.u.l); break; @@ -603,9 +614,11 @@ FcConfigCompareValue (FcValue m, case FcTypeFTFace: switch (op) { case FcOpEqual: + case FcOpContains: ret = m.u.f == v.u.f; break; case FcOpNotEqual: + case FcOpNotContains: ret = m.u.f != v.u.f; break; default: @@ -616,7 +629,7 @@ FcConfigCompareValue (FcValue m, } else { - if (op == FcOpNotEqual) + if (op == FcOpNotEqual || op == FcOpNotContains) ret = FcTrue; } return ret; @@ -682,12 +695,14 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) v.type = FcTypeVoid; FcValueDestroy (vl); break; - case FcOpContains: + case FcOpEqual: case FcOpNotEqual: case FcOpLess: case FcOpLessEqual: case FcOpMore: case FcOpMoreEqual: + case FcOpContains: + case FcOpNotContains: vl = FcConfigEvaluate (p, e->u.tree.left); vr = FcConfigEvaluate (p, e->u.tree.right); v.type = FcTypeBool; @@ -697,7 +712,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e) break; case FcOpOr: case FcOpAnd: - case FcOpEqual: case FcOpPlus: case FcOpMinus: case FcOpTimes: diff --git a/src/fcdbg.c b/src/fcdbg.c index adb8e81..6acbce2 100644 --- a/src/fcdbg.c +++ b/src/fcdbg.c @@ -111,12 +111,13 @@ FcOpPrint (FcOp op) case FcOpOr: printf ("Or"); break; case FcOpAnd: printf ("And"); break; case FcOpEqual: printf ("Equal"); break; - case FcOpContains: printf ("Contains"); break; case FcOpNotEqual: printf ("NotEqual"); break; case FcOpLess: printf ("Less"); break; case FcOpLessEqual: printf ("LessEqual"); break; case FcOpMore: printf ("More"); break; case FcOpMoreEqual: printf ("MoreEqual"); break; + case FcOpContains: printf ("Contains"); break; + case FcOpNotContains: printf ("NotContains"); break; case FcOpPlus: printf ("Plus"); break; case FcOpMinus: printf ("Minus"); break; case FcOpTimes: printf ("Times"); break; @@ -161,12 +162,13 @@ FcExprPrint (const FcExpr *expr) case FcOpOr: case FcOpAnd: case FcOpEqual: - case FcOpContains: case FcOpNotEqual: case FcOpLess: case FcOpLessEqual: case FcOpMore: case FcOpMoreEqual: + case FcOpContains: + case FcOpNotContains: case FcOpPlus: case FcOpMinus: case FcOpTimes: @@ -184,12 +186,13 @@ FcExprPrint (const FcExpr *expr) case FcOpOr: printf ("Or"); break; case FcOpAnd: printf ("And"); break; case FcOpEqual: printf ("Equal"); break; - case FcOpContains: printf ("Contains"); break; case FcOpNotEqual: printf ("NotEqual"); break; case FcOpLess: printf ("Less"); break; case FcOpLessEqual: printf ("LessEqual"); break; case FcOpMore: printf ("More"); break; case FcOpMoreEqual: printf ("MoreEqual"); break; + case FcOpContains: printf ("Contains"); break; + case FcOpNotContains: printf ("NotContains"); 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 1a16801..a5e3f11 100644 --- a/src/fcint.h +++ b/src/fcint.h @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.21 2002/07/31 01:36:37 keithp Exp $ + * $XFree86: xc/lib/fontconfig/src/fcint.h,v 1.24 2002/08/22 07:36:44 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -114,7 +114,7 @@ typedef enum _FcOp { FcOpAssign, FcOpAssignReplace, FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast, FcOpQuest, - FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, FcOpContains, + FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual, FcOpContains, FcOpNotContains, FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual, FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide, FcOpNot, FcOpComma, FcOpInvalid diff --git a/src/fclang.c b/src/fclang.c index 3ca09f7..1039b4b 100644 --- a/src/fclang.c +++ b/src/fclang.c @@ -384,6 +384,7 @@ FcLangSetPromote (const FcChar8 *lang) strs.num = 1; strs.size = 1; strs.strs = &str; + strs.ref = 1; str = (FcChar8 *) lang; } return &ls; diff --git a/src/fclist.c b/src/fclist.c index 3a48e0f..6c04a1a 100644 --- a/src/fclist.c +++ b/src/fclist.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/fontconfig/src/fclist.c,v 1.9 2002/08/19 19:32:05 keithp Exp $ + * $XFree86: xc/lib/fontconfig/src/fclist.c,v 1.10 2002/08/22 07:36:44 keithp Exp $ * * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc. * @@ -142,7 +142,7 @@ FcListValueListEqual (FcValueList *v1orig, for (v1 = v1orig; v1; v1 = v1->next) { for (v2 = v2orig; v2; v2 = v2->next) - if (FcConfigCompareValue (v1->value, FcOpEqual, v2->value)) + if (FcValueEqual (v1->value, v2->value)) break; if (!v2) return FcFalse; @@ -150,7 +150,7 @@ FcListValueListEqual (FcValueList *v1orig, for (v2 = v2orig; v2; v2 = v2->next) { for (v1 = v1orig; v1; v1 = v1->next) - if (FcConfigCompareValue (v1->value, FcOpEqual, v2->value)) + if (FcValueEqual (v1->value, v2->value)) break; if (!v1) return FcFalse; @@ -171,7 +171,7 @@ FcListPatternEqual (FcPattern *p1, e1 = FcPatternFindElt (p1, os->objects[i]); e2 = FcPatternFindElt (p2, os->objects[i]); if (!e1 && !e2) - return FcTrue; + continue; if (!e1 || !e2) return FcFalse; if (!FcListValueListEqual (e1->values, e2->values)) diff --git a/src/fcxml.c b/src/fcxml.c index a927f6d..5962b8d 100644 --- a/src/fcxml.c +++ b/src/fcxml.c @@ -1,5 +1,5 @@ /* - * $XFree86: xc/lib/fontconfig/src/fcxml.c,v 1.19 2002/08/19 19:32:05 keithp Exp $ + * $XFree86: xc/lib/fontconfig/src/fcxml.c,v 1.20 2002/08/20 23:17:03 keithp Exp $ * * Copyright © 2002 Keith Packard, member of The XFree86 Project, Inc. * @@ -218,12 +218,13 @@ FcExprDestroy (FcExpr *e) case FcOpOr: case FcOpAnd: case FcOpEqual: - case FcOpContains: case FcOpNotEqual: case FcOpLess: case FcOpLessEqual: case FcOpMore: case FcOpMoreEqual: + case FcOpContains: + case FcOpNotContains: case FcOpPlus: case FcOpMinus: case FcOpTimes: @@ -310,6 +311,8 @@ typedef enum _FcElement { FcElementLessEq, FcElementMore, FcElementMoreEq, + FcElementContains, + FcElementNotContains, FcElementPlus, FcElementMinus, FcElementTimes, @@ -360,6 +363,8 @@ FcElementMap (const XML_Char *name) { "less_eq", FcElementLessEq }, { "more", FcElementMore }, { "more_eq", FcElementMoreEq }, + { "contains", FcElementContains }, + { "not_contains",FcElementNotContains }, { "plus", FcElementPlus }, { "minus", FcElementMinus }, { "times", FcElementTimes }, @@ -1337,7 +1342,9 @@ static const FcOpMap fcCompareOps[] = { { "less", FcOpLess }, { "less_eq", FcOpLessEqual }, { "more", FcOpMore }, - { "more_eq", FcOpMoreEqual } + { "more_eq", FcOpMoreEqual }, + { "contains", FcOpContains }, + { "not_contains", FcOpNotContains } }; #define NUM_COMPARE_OPS (sizeof fcCompareOps / sizeof fcCompareOps[0]) @@ -1674,6 +1681,12 @@ FcEndElement(void *userData, const XML_Char *name) case FcElementMoreEq: FcParseExpr (parse, FcOpMoreEqual); break; + case FcElementContains: + FcParseExpr (parse, FcOpContains); + break; + case FcElementNotContains: + FcParseExpr (parse, FcOpNotContains); + break; case FcElementPlus: FcParseExpr (parse, FcOpPlus); break; |