if (!config->cacheDirs)
goto bail8;
+ config->rootDir = FcStrCopy ((const FcChar8 *) "");
+
config->blanks = 0;
config->substPattern = 0;
}
static FcFileTime
-FcConfigNewestFile (FcStrSet *files)
+FcConfigNewestFile (FcConfig *config, FcStrSet *files)
{
FcStrList *list = FcStrListCreate (files);
FcFileTime newest = { 0, FcFalse };
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;
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))
const FcChar8 *f)
{
FcBool ret;
- FcChar8 *file = FcConfigFilename (f);
+ FcChar8 *file = FcConfigFilename2 (config, f);
if (!file)
return FcFalse;
#endif
static FcChar8 *
-FcConfigFileExists (const FcChar8 *dir, const FcChar8 *file)
+FcConfigFileExists (FcConfig *config, const FcChar8 *dir, const FcChar8 *file)
{
FcChar8 *path;
if (!dir)
- dir = (FcChar8 *) "";
- path = malloc (strlen ((char *) dir) + 1 + strlen ((char *) file) + 1);
- if (!path)
- return 0;
+ dir = (const FcChar8 *) "";
- strcpy ((char *) path, (const char *) dir);
- /* make sure there's a single separator */
-#ifdef _WIN32
- if ((!path[0] || (path[strlen((char *) path)-1] != '/' &&
- path[strlen((char *) path)-1] != '\\')) &&
- !(file[0] == '/' ||
- file[0] == '\\' ||
- (isalpha (file[0]) && file[1] == ':' && (file[2] == '/' || file[2] == '\\'))))
- strcat ((char *) path, "\\");
-#else
- if ((!path[0] || path[strlen((char *) path)-1] != '/') && file[0] != '/')
- strcat ((char *) path, "/");
-#endif
- strcat ((char *) path, (char *) file);
-
- FcMemAlloc (FC_MEM_STRING, strlen ((char *) path) + 1);
+ 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;
FcChar8 *
FcConfigFilename (const FcChar8 *url)
+{
+ return FcConfigFilename2 (FcConfigGetCurrent (), url);
+}
+
+FcChar8 *
+FcConfigFilename2 (FcConfig *config, const FcChar8 *url)
{
FcChar8 *file, *dir, **path, **p;
case '~':
dir = FcConfigHome ();
if (dir)
- file = FcConfigFileExists (dir, url + 1);
+ file = FcConfigFileExists (config, dir, url + 1);
else
file = 0;
break;
absolute_path:
#endif
case '/':
- file = FcConfigFileExists (0, url);
+ file = FcConfigFileExists (config, 0, url);
break;
default:
path = FcConfigGetPath ();
return 0;
for (p = path; *p; p++)
{
- file = FcConfigFileExists (*p, url);
+ file = FcConfigFileExists (config, *p, url);
if (file)
break;
}
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__