]> git.wh0rd.org - fontconfig.git/blobdiff - src/fccfg.c
Fix automatic file time checking, transcoding table searches. Actually add
[fontconfig.git] / src / fccfg.c
index b5a9ade5d80014cf24559fc600b1e93e78462a46..6191324bf2f8721011b32353fc7aca5e0d69d807 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.8 2002/06/02 19:51:36 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.14 2002/06/20 03:43:09 keithp Exp $
  *
  * Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
  *
@@ -79,27 +79,25 @@ bail0:
     return 0;
 }
 
-static time_t
+typedef struct _FcFileTime {
+    time_t  time;
+    FcBool  set;
+} FcFileTime;
+
+static FcFileTime
 FcConfigNewestFile (FcStrSet *files)
 {
     FcStrList      *list = FcStrListCreate (files);
-    FcBool         set = FcFalse;
-    time_t         newest = 0;
+    FcFileTime     newest = { 0, FcFalse };
     FcChar8        *file;
     struct  stat    statb;
 
     if (list)
     {
        while ((file = FcStrListNext (list)))
-       {
            if (stat ((char *) file, &statb) == 0)
-           {
-               if (!set)
-                   newest = statb.st_mtime;
-               else if (statb.st_mtime - newest > 0)
-                   newest = statb.st_mtime;
-           }
-       }
+               if (!newest.set || statb.st_mtime - newest.time > 0)
+                   newest.time = statb.st_mtime;
        FcStrListDone (list);
     }
     return newest;
@@ -108,9 +106,8 @@ FcConfigNewestFile (FcStrSet *files)
 FcBool
 FcConfigUptoDate (FcConfig *config)
 {
-    time_t  config_time;
-    time_t  font_time;
-    time_t  now = time(0);
+    FcFileTime config_time, font_time;
+    time_t     now = time(0);
     if (!config)
     {
        config = FcConfigGetCurrent ();
@@ -119,8 +116,8 @@ FcConfigUptoDate (FcConfig *config)
     }
     config_time = FcConfigNewestFile (config->configFiles);
     font_time = FcConfigNewestFile (config->configDirs);
-    if (config_time - config->rescanTime > 0 ||
-       font_time - config->rescanTime > 0)
+    if ((config_time.set && config_time.time - config->rescanTime > 0) ||
+       (font_time.set && font_time.time - config->rescanTime) > 0)
     {
        return FcFalse;
     }
@@ -783,6 +780,7 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
                    v.type = FcTypeVoid;
                    break;
                }
+               break;
            case FcTypeMatrix:
                switch (e->op) {
                case FcOpEqual:
@@ -866,11 +864,12 @@ FcConfigEvaluate (FcPattern *p, FcExpr *e)
 static FcValueList *
 FcConfigMatchValueList (FcPattern      *p,
                        FcTest          *t,
-                       FcValueList     *v)
+                       FcValueList     *values)
 {
     FcValueList            *ret = 0;
     FcExpr         *e = t->expr;
     FcValue        value;
+    FcValueList            *v;
     
     while (e)
     {
@@ -885,7 +884,7 @@ FcConfigMatchValueList (FcPattern   *p,
            e = 0;
        }
 
-       for (; v; v = v->next)
+       for (v = values; v; v = v->next)
        {
            if (FcConfigCompareValue (v->value, t->op, value))
            {
@@ -901,8 +900,8 @@ FcConfigMatchValueList (FcPattern   *p,
                }
            }
        }
+       FcValueDestroy (value);
     }
-    FcValueDestroy (value);
     return ret;
 }
 
@@ -1027,7 +1026,7 @@ FcConfigPatternAdd (FcPattern     *p,
 {
     if (list)
     {
-       FcPatternElt    *e = FcPatternFind (p, object, FcTrue);
+       FcPatternElt    *e = FcPatternInsertElt (p, object);
     
        if (!e)
            return;
@@ -1042,7 +1041,7 @@ static void
 FcConfigPatternDel (FcPattern  *p,
                    const char  *object)
 {
-    FcPatternElt    *e = FcPatternFind (p, object, FcFalse);
+    FcPatternElt    *e = FcPatternFindElt (p, object);
     if (!e)
        return;
     while (e->values)
@@ -1053,7 +1052,7 @@ static void
 FcConfigPatternCanon (FcPattern            *p,
                      const char    *object)
 {
-    FcPatternElt    *e = FcPatternFind (p, object, FcFalse);
+    FcPatternElt    *e = FcPatternFindElt (p, object);
     if (!e)
        return;
     if (!e->values)
@@ -1106,7 +1105,7 @@ FcConfigSubstitute (FcConfig      *config,
                printf ("FcConfigSubstitute test ");
                FcTestPrint (t);
            }
-           st[i].elt = FcPatternFind (p, t->field, FcFalse);
+           st[i].elt = FcPatternFindElt (p, t->field);
            /*
             * If there's no such field in the font,
             * then FcQualAll matches while FcQualAny does not
@@ -1128,6 +1127,10 @@ FcConfigSubstitute (FcConfig     *config,
            st[i].value = FcConfigMatchValueList (p, t, st[i].elt->values);
            if (!st[i].value)
                break;
+           if (t->qual == FcQualFirst && st[i].value != st[i].elt->values)
+               break;
+           if (t->qual == FcQualNotFirst && st[i].value == st[i].elt->values)
+               break;
        }
        if (t)
        {
@@ -1158,7 +1161,7 @@ FcConfigSubstitute (FcConfig      *config,
                 * If there was a test, then replace the matched
                 * value with the new list of values
                 */
-               if (t && st[i].elt)
+               if (t)
                {
                    FcValueList *thisValue = st[i].value;
                    FcValueList *nextValue = thisValue ? thisValue->next : 0;