X-Git-Url: https://git.wh0rd.org/?a=blobdiff_plain;f=src%2Ffccfg.c;fp=src%2Ffccfg.c;h=b0a0f84fb572c6a77fe76a936ec01c602c0388ed;hb=d0471dd2faca37f7ee5997ad9db8278db0e99206;hp=6d55f171e216ca886ec6cbe4e78dc4137b4e2959;hpb=bb8057ea77ec89e789afbc6e87b7a16d479d3105;p=fontconfig.git diff --git a/src/fccfg.c b/src/fccfg.c index 6d55f17..b0a0f84 100644 --- a/src/fccfg.c +++ b/src/fccfg.c @@ -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__