+ const FcChar8 *sysroot = FcConfigGetSysRoot (config);
+ FcConfig *fallback = FcInitFallbackConfig (sysroot);
+
+ FcConfigDestroy (config);
+
+ return fallback;
+ }
+
+ if (config->cacheDirs && config->cacheDirs->num == 0)
+ {
+ FcChar8 *prefix, *p;
+ size_t plen;
+ FcBool have_own = FcFalse;
+ char *env_file, *env_path;
+
+ env_file = getenv ("FONTCONFIG_FILE");
+ env_path = getenv ("FONTCONFIG_PATH");
+ if ((env_file != NULL && env_file[0] != 0) ||
+ (env_path != NULL && env_path[0] != 0))
+ have_own = FcTrue;
+
+ if (!have_own)
+ {
+ fprintf (stderr,
+ "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
+ fprintf (stderr,
+ "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
+ FC_CACHEDIR);
+ }
+ prefix = FcConfigXdgCacheHome ();
+ if (!prefix)
+ goto bail;
+ plen = strlen ((const char *)prefix);
+ p = realloc (prefix, plen + 12);
+ if (!p)
+ goto bail;
+ prefix = p;
+ memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
+ prefix[plen + 11] = 0;
+ if (!have_own)
+ fprintf (stderr,
+ "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
+
+ if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
+ !FcConfigAddCacheDir (config, (FcChar8 *) prefix))
+ {
+ FcConfig *fallback;
+ const FcChar8 *sysroot;
+
+ bail:
+ sysroot = FcConfigGetSysRoot (config);
+ fprintf (stderr,
+ "Fontconfig error: out of memory");
+ if (prefix)
+ FcStrFree (prefix);
+ fallback = FcInitFallbackConfig (sysroot);
+ FcConfigDestroy (config);
+
+ return fallback;
+ }
+ FcStrFree (prefix);
+ }
+
+ return config;
+}
+
+FcConfig *
+FcInitLoadConfig (void)
+{
+ return FcInitLoadOwnConfig (NULL);
+}
+
+/*
+ * Load the configuration files and scan for available fonts
+ */
+FcConfig *
+FcInitLoadOwnConfigAndFonts (FcConfig *config)
+{
+ config = FcInitLoadOwnConfig (config);
+ if (!config)
+ return 0;
+ if (!FcConfigBuildFonts (config))
+ {