]> git.wh0rd.org - fontconfig.git/blobdiff - src/fccfg.c
fc-cache: add a --root option
[fontconfig.git] / src / fccfg.c
index 6d55f171e216ca886ec6cbe4e78dc4137b4e2959..b0a0f84fb572c6a77fe76a936ec01c602c0388ed 100644 (file)
@@ -81,6 +81,8 @@ FcConfigCreate (void)
     if (!config->cacheDirs)
        goto bail8;
 
+    config->rootDir = FcStrCopy ((const FcChar8 *) "");
+
     config->blanks = 0;
 
     config->substPattern = 0;
@@ -121,7 +123,7 @@ bail0:
 }
 
 static FcFileTime
-FcConfigNewestFile (FcStrSet *files)
+FcConfigNewestFile (FcConfig *config, FcStrSet *files)
 {
     FcStrList      *list = FcStrListCreate (files);
     FcFileTime     newest = { 0, FcFalse };
@@ -131,7 +133,7 @@ FcConfigNewestFile (FcStrSet *files)
     if (list)
     {
        while ((file = FcStrListNext (list)))
-           if (FcStat (file, &statb) == 0)
+           if (FcStat (config, file, &statb) == 0)
                if (!newest.set || statb.st_mtime - newest.time > 0)
                {
                    newest.set = FcTrue;
@@ -153,9 +155,9 @@ FcConfigUptoDate (FcConfig *config)
        if (!config)
            return FcFalse;
     }
-    config_time = FcConfigNewestFile (config->configFiles);
-    config_dir_time = FcConfigNewestFile (config->configDirs);
-    font_time = FcConfigNewestFile (config->fontDirs);
+    config_time = FcConfigNewestFile (config, config->configFiles);
+    config_dir_time = FcConfigNewestFile (config, config->configDirs);
+    font_time = FcConfigNewestFile (config, config->fontDirs);
     if ((config_time.set && config_time.time - config->rescanTime > 0) ||
        (config_dir_time.set && (config_dir_time.time - config->rescanTime) > 0) ||
        (font_time.set && (font_time.time - config->rescanTime) > 0))
@@ -487,7 +489,7 @@ FcConfigAddConfigFile (FcConfig         *config,
                       const FcChar8   *f)
 {
     FcBool     ret;
-    FcChar8    *file = FcConfigFilename (f);
+    FcChar8    *file = FcConfigFilename2 (config, f);
 
     if (!file)
        return FcFalse;
@@ -1686,16 +1688,19 @@ DllMain (HINSTANCE hinstDLL,
 #endif
 
 static FcChar8 *
-FcConfigFileExists (const FcChar8 *dir, const FcChar8 *file)
+FcConfigFileExists (FcConfig *config, const FcChar8 *dir, const FcChar8 *file)
 {
     FcChar8    *path;
 
     if (!dir)
        dir = (const FcChar8 *) "";
 
-    path = FcStrPathPlus (dir, file, NULL);
+    path = FcStrPathPlus (FcConfigGetRoot (config), dir, file, NULL);
     if (access ((char *) path, R_OK) == 0)
-       return path;
+    {
+       FcStrFree (path);
+       return FcStrPathPlus (dir, file, NULL);
+    }
 
     FcStrFree (path);
     return 0;
@@ -1811,6 +1816,12 @@ FcConfigEnableHome (FcBool enable)
 
 FcChar8 *
 FcConfigFilename (const FcChar8 *url)
+{
+    return FcConfigFilename2 (FcConfigGetCurrent (), url);
+}
+
+FcChar8 *
+FcConfigFilename2 (FcConfig *config, const FcChar8 *url)
 {
     FcChar8    *file, *dir, **path, **p;
 
@@ -1833,7 +1844,7 @@ FcConfigFilename (const FcChar8 *url)
     case '~':
        dir = FcConfigHome ();
        if (dir)
-           file = FcConfigFileExists (dir, url + 1);
+           file = FcConfigFileExists (config, dir, url + 1);
        else
            file = 0;
        break;
@@ -1842,7 +1853,7 @@ FcConfigFilename (const FcChar8 *url)
     absolute_path:
 #endif
     case '/':
-       file = FcConfigFileExists (0, url);
+       file = FcConfigFileExists (config, 0, url);
        break;
     default:
        path = FcConfigGetPath ();
@@ -1850,7 +1861,7 @@ FcConfigFilename (const FcChar8 *url)
            return 0;
        for (p = path; *p; p++)
        {
-           file = FcConfigFileExists (*p, url);
+           file = FcConfigFileExists (config, *p, url);
            if (file)
                break;
        }
@@ -2076,6 +2087,34 @@ FcConfigAcceptFont (FcConfig         *config,
        return FcFalse;
     return FcTrue;
 }
+
+void
+FcConfigSetRoot (FcConfig      *config,
+                const FcChar8  *path)
+{
+    FcStrFree (config->rootDir);
+    config->rootDir = FcStrCopy (path);
+}
+
+const FcChar8 *
+FcConfigGetRoot (FcConfig      *config)
+{
+    return config->rootDir;
+}
+
+FcChar8 *
+FcConfigGetRootPlus (FcConfig          *config,
+                    const FcChar8      *path)
+{
+    /*
+     * Since we have older funcs which do not take a config, it
+     * might be NULL, so handle that as well rather than crash.
+     */
+    if (!config || !config->rootDir)
+       return NULL;
+    return FcStrPathPlus (config->rootDir, path, NULL);
+}
+
 #define __fccfg__
 #include "fcaliastail.h"
 #undef __fccfg__