]> git.wh0rd.org - fontconfig.git/commitdiff
Add contains/not_contains, fix LangSet equal operator to use FcLangEqual
authorKeith Packard <keithp@keithp.com>
Thu, 22 Aug 2002 18:53:22 +0000 (18:53 +0000)
committerKeith Packard <keithp@keithp.com>
Thu, 22 Aug 2002 18:53:22 +0000 (18:53 +0000)
ChangeLog
fonts.dtd
src/fccfg.c
src/fcdbg.c
src/fcint.h
src/fclang.c
src/fclist.c
src/fcxml.c

index 5bbe97a3567c6b83cb085b37888a9d8ca32b9e76..94ca5721f1751894bf5e61beb95eefa48c4b6bf2 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -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
index 9cbff4b67a4e29f1a811899183a78d0711b15346..4233b732bffa1283fec247699c610ea96e212b1e 100644 (file)
--- a/fonts.dtd
+++ b/fonts.dtd
@@ -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'>
 
 <!--
          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
 <!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;)*>
index 2ec9f779eea385fb10afd165dacc40ee8e172a91..3e9874d8ff2770c081091dd426ad88f8742cfa30 100644 (file)
@@ -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:
index adb8e81db5934c79766fd07ea7a5af6da06118cb..6acbce233bb9f467f7a98c6d8bcdd552226d1f44 100644 (file)
@@ -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;
index 1a168014da0ab599bd51877ea01906bdc73c37e0..a5e3f117472933369a121fc4950c66635ceda31d 100644 (file)
@@ -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
index 3ca09f70b89ce77b72139c72e52e74db320a714e..1039b4b1ad4dc166ade45c291575d250f01ba09e 100644 (file)
@@ -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;
index 3a48e0fb376663d68beabc4938a82ddf6d9a7420..6c04a1ad124e70e48885d6a5b947db3525ed76be 100644 (file)
@@ -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))
index a927f6dd525ad1b1780174ad4c4fe6ed6c13d003..5962b8dc753ba49e6b0a2db4256ba1bbe06ebb4a 100644 (file)
@@ -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;