]> git.wh0rd.org - fontconfig.git/blobdiff - src/fcdir.c
fc-cache: add a --root option
[fontconfig.git] / src / fcdir.c
index 359446c3682772b4446f12ff7c7b4c25bbb2ec09..282dedd200b262b81b3c15e864fb1280b380fb4d 100644 (file)
 
 FcBool
 FcFileIsDir (const FcChar8 *file)
+{
+    return FcFileIsDir2 (FcConfigGetCurrent (), file);
+}
+
+FcBool
+FcFileIsDir2 (FcConfig *config, const FcChar8 *file)
 {
     struct stat            statb;
 
-    if (FcStat (file, &statb) != 0)
+    if (FcStat (config, file, &statb) != 0)
        return FcFalse;
     return S_ISDIR(statb.st_mode);
 }
@@ -58,14 +64,14 @@ FcFileScanFontConfig (FcFontSet             *set,
            printf ("\tScanning file %s...", file);
            fflush (stdout);
        }
-       font = FcFreeTypeQuery (file, id, blanks, &count);
+       font = FcFreeTypeQuery2 (config, file, id, blanks, &count);
        if (FcDebug () & FC_DBG_SCAN)
            printf ("done\n");
 
        /*
         * Edit pattern with user-defined rules
         */
-       if (font && config && !FcConfigSubstituteWithPat (config, font, NULL, FcMatchScan))
+       if (font && config && !FcConfigSubstitute (config, font, FcMatchScan))
        {
            FcPatternDestroy (font);
            font = NULL;
@@ -75,7 +81,7 @@ FcFileScanFontConfig (FcFontSet               *set,
        /*
         * Add the font
         */
-       if (font && (!config || FcConfigAcceptFont (config, font)))
+       if (font)
        {
            if (FcDebug() & FC_DBG_SCANV)
            {
@@ -103,7 +109,7 @@ FcFileScanConfig (FcFontSet *set,
                  const FcChar8 *file,
                  FcConfig      *config)
 {
-    if (FcFileIsDir (file))
+    if (FcFileIsDir2 (config, file))
        return FcStrSetAdd (dirs, file);
     else
        return FcFileScanFontConfig (set, blanks, file, config);
@@ -142,6 +148,8 @@ FcDirScanConfig (FcFontSet  *set,
     FcStrSet           *files;
     FcChar8            *file;
     FcChar8            *base;
+    const FcChar8      *scanDir;
+    FcChar8            *fullDir;
     FcBool             ret = FcTrue;
     int                        i;
 
@@ -167,8 +175,15 @@ FcDirScanConfig (FcFontSet *set,
 
     if (FcDebug () & FC_DBG_SCAN)
        printf ("\tScanning dir %s\n", dir);
-       
-    d = opendir ((char *) dir);
+
+    fullDir = FcConfigGetRootPlus (config, dir);
+    if (fullDir)
+       scanDir = fullDir;
+    else
+       scanDir = dir;
+    d = opendir ((char *) scanDir);
+    if (fullDir)
+       FcStrFree (fullDir);
     if (!d)
     {
        /* Don't complain about missing directories */
@@ -235,7 +250,6 @@ FcCache *
 FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
 {
     FcStrSet           *dirs;
-    FcBool             ret = FcTrue;
     FcFontSet          *set;
     FcCache            *cache = NULL;
     struct stat                dir_stat;
@@ -243,45 +257,29 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
     if (FcDebug () & FC_DBG_FONTSET)
        printf ("cache scan dir %s\n", dir);
 
-    if (FcStat (dir, &dir_stat) < 0)
-    {
-       if (errno != ENOENT)
-           ret = FcFalse;
+    if (FcStat (config, dir, &dir_stat) < 0)
        goto bail;
-    }
 
     set = FcFontSetCreate();
     if (!set)
-    {
-       ret = FcFalse;
        goto bail;
-    }
 
     dirs = FcStrSetCreate ();
     if (!dirs)
-    {
-       ret = FcFalse;
        goto bail1;
-    }
 
     /*
      * Scan the dir
      */
     if (!FcDirScanConfig (set, dirs, NULL, dir, FcTrue, config))
-    {
-       ret = FcFalse;
        goto bail2;
-    }
 
     /*
      * Build the cache object
      */
     cache = FcDirCacheBuild (set, dir, &dir_stat, dirs);
     if (!cache)
-    {
-       ret = FcFalse;
        goto bail2;
-    }
 
     /*
      * Write out the cache file, ignoring any troubles
@@ -304,9 +302,6 @@ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config)
 {
     FcCache            *cache = NULL;
 
-    if (config && !FcConfigAcceptFilename (config, dir))
-       return NULL;
-
     /* Try to use existing cache file */
     if (!force)
        cache = FcDirCacheLoad (dir, config, NULL);