]> git.wh0rd.org - fontconfig.git/blobdiff - src/fccfg.c
switch // comment
[fontconfig.git] / src / fccfg.c
index 2ec9f779eea385fb10afd165dacc40ee8e172a91..0d7f17e3392fe1b6b1ebf61ad8a0e0276237fb6c 100644 (file)
@@ -1,7 +1,7 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.20 2002/08/19 19:32:05 keithp Exp $
+ * $RCSId: xc/lib/fontconfig/src/fccfg.c,v 1.23 2002/08/31 22:17:32 keithp Exp $
  *
- * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
+ * Copyright © 2000 Keith Packard
  *
  * Permission to use, copy, modify, distribute, and sell this software and its
  * documentation for any purpose is hereby granted without fee, provided that
@@ -50,8 +50,9 @@ FcConfigCreate (void)
        goto bail3;
     
     config->cache = 0;
-    if (!FcConfigSetCache (config, (FcChar8 *) ("~/" FC_USER_CACHE_FILE)))
-       goto bail4;
+    if (FcConfigHome())
+       if (!FcConfigSetCache (config, (FcChar8 *) ("~/" FC_USER_CACHE_FILE)))
+           goto bail4;
 
     config->blanks = 0;
 
@@ -133,8 +134,10 @@ FcSubstDestroy (FcSubst *s)
     while (s)
     {
        n = s->next;
-       FcTestDestroy (s->test);
-       FcEditDestroy (s->edit);
+       if (s->test)
+           FcTestDestroy (s->test);
+       if (s->edit)
+           FcEditDestroy (s->edit);
        s = n;
     }
 }
@@ -429,6 +432,7 @@ FcConfigAddEdit (FcConfig   *config,
     subst = (FcSubst *) malloc (sizeof (FcSubst));
     if (!subst)
        return FcFalse;
+    FcMemAlloc (FC_MEM_SUBST, sizeof (FcSubst));
     if (kind == FcMatchPattern)
        prev = &config->substPattern;
     else
@@ -482,11 +486,13 @@ FcConfigPromote (FcValue v, FcValue u)
 }
 
 FcBool
-FcConfigCompareValue (FcValue  m,
-                     FcOp      op,
-                     FcValue   v)
+FcConfigCompareValue (const FcValue    m_o,
+                     FcOp              op,
+                     const FcValue     v_o)
 {
-    FcBool    ret = FcFalse;
+    FcValue    m = m_o;
+    FcValue    v = v_o;
+    FcBool     ret = FcFalse;
     
     m = FcConfigPromote (m, v);
     v = FcConfigPromote (v, m);
@@ -501,7 +507,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 +533,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 +547,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 +562,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 +575,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;
@@ -578,7 +592,10 @@ FcConfigCompareValue (FcValue      m,
        case FcTypeLangSet:
            switch (op) {
            case FcOpContains:
-               ret = FcLangSetCompare (v.u.l, m.u.l) != FcLangDifferentLang;
+               ret = FcLangSetContains (v.u.l, m.u.l);
+               break;
+           case FcOpNotContains:
+               ret = FcLangSetContains (v.u.l, m.u.l);
                break;
            case FcOpEqual:
                ret = FcLangSetEqual (v.u.l, m.u.l);
@@ -603,9 +620,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 +635,7 @@ FcConfigCompareValue (FcValue       m,
     }
     else
     {
-       if (op == FcOpNotEqual)
+       if (op == FcOpNotEqual || op == FcOpNotContains)
            ret = FcTrue;
     }
     return ret;
@@ -682,12 +701,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 +718,6 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
        break;  
     case FcOpOr:
     case FcOpAnd:
-    case FcOpEqual:
     case FcOpPlus:
     case FcOpMinus:
     case FcOpTimes:
@@ -900,8 +920,16 @@ FcConfigAdd (FcValueList    **head,
             FcBool         append,
             FcValueList    *new)
 {
-    FcValueList    **prev, *last;
+    FcValueList            **prev, *last, *v;
+    FcValueBinding  sameBinding;
     
+    if (position)
+       sameBinding = position->binding;
+    else
+       sameBinding = FcValueBindingWeak;
+    for (v = new; v; v = v->next)
+       if (v->binding == FcValueBindingSame)
+           v->binding = sameBinding;
     if (append)
     {
        if (position)
@@ -1126,7 +1154,11 @@ FcConfigSubstituteWithPat (FcConfig    *config,
                if ((t->kind == FcMatchFont || kind == FcMatchPattern) &&
                    !FcStrCmpIgnoreCase ((FcChar8 *) t->field, 
                                         (FcChar8 *) e->field))
+               {
+                   if (!st[i].elt)
+                       t = 0;
                    break;
+               }
            }
            switch (e->op) {
            case FcOpAssign:
@@ -1260,10 +1292,11 @@ FcConfigFileExists (const FcChar8 *dir, const FcChar8 *file)
        strcat ((char *) path, "/");
     strcat ((char *) path, (char *) file);
 
+    FcMemAlloc (FC_MEM_STRING, strlen ((char *) path) + 1);
     if (access ((char *) path, R_OK) == 0)
        return path;
     
-    free (path);
+    FcStrFree (path);
     return 0;
 }
 
@@ -1337,6 +1370,24 @@ FcConfigFreePath (FcChar8 **path)
     free (path);
 }
 
+static FcBool  _FcConfigHomeEnabled = FcTrue;
+
+FcChar8 *
+FcConfigHome (void)
+{
+    if (_FcConfigHomeEnabled)
+       return getenv ("HOME");
+    return 0;
+}
+
+FcBool
+FcConfigEnableHome (FcBool enable)
+{
+    FcBool  prev = _FcConfigHomeEnabled;
+    _FcConfigHomeEnabled = enable;
+    return prev;
+}
+
 FcChar8 *
 FcConfigFilename (const FcChar8 *url)
 {
@@ -1351,7 +1402,7 @@ FcConfigFilename (const FcChar8 *url)
     file = 0;
     switch (*url) {
     case '~':
-       dir = (FcChar8 *) getenv ("HOME");
+       dir = FcConfigHome ();
        if (dir)
            file = FcConfigFileExists (dir, url + 1);
        else