From 4074fd254e5ad707448d3665a034e0fbdf6de033 Mon Sep 17 00:00:00 2001 From: Behdad Esfahbod Date: Thu, 15 Jan 2009 18:35:09 -0500 Subject: [PATCH] Revive FcConfigScan() (bug #17121) FcConfigScan() with parameters cache=NULL and force=FcTrue can be used to scan font dirs without any caching side effect. --- src/fcdir.c | 155 ++++++++++++++++++++++++++++++---------------------- 1 file changed, 90 insertions(+), 65 deletions(-) diff --git a/src/fcdir.c b/src/fcdir.c index 5166408..4ea2187 100644 --- a/src/fcdir.c +++ b/src/fcdir.c @@ -129,27 +129,30 @@ cmpstringp(const void *p1, const void *p2) return strcmp(* (char **) p1, * (char **) p2); } -/* - * Scan the specified directory and construct a cache of its contents - */ -FcCache * -FcDirCacheScan (const FcChar8 *dir, FcConfig *config) +FcBool +FcDirScanConfig (FcFontSet *set, + FcStrSet *dirs, + FcBlanks *blanks, + const FcChar8 *dir, + FcBool force, /* XXX unused */ + FcConfig *config) { DIR *d; struct dirent *e; FcStrSet *files; - FcStrSet *dirs; FcChar8 *file; FcChar8 *base; FcBool ret = FcTrue; - FcFontSet *set; int i; - FcBlanks *blanks = FcConfigGetBlanks (config); - FcCache *cache = NULL; - struct stat dir_stat; - if (FcDebug () & FC_DBG_FONTSET) - printf ("cache scan dir %s\n", dir); + if (!force) + return FcFalse; + + if (!set && !dirs) + return FcTrue; + + if (!blanks) + blanks = FcConfigGetBlanks (config); /* freed below */ file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1); @@ -169,23 +172,9 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config) if (!d) { /* Don't complain about missing directories */ - if (errno == ENOENT) - ret = FcTrue; - else + if (errno != ENOENT) ret = FcFalse; - goto bail_1; - } - if (FcStat ((char *) dir, &dir_stat) < 0) - { - ret = FcFalse; - goto bail_1; - } - - set = FcFontSetCreate(); - if (!set) - { - ret = FcFalse; - goto bail0; + goto bail; } files = FcStrSetCreate (); @@ -210,41 +199,99 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config) * Sort files to make things prettier */ qsort(files->strs, files->num, sizeof(FcChar8 *), cmpstringp); - - dirs = FcStrSetCreate (); - if (!dirs) - goto bail2; - + /* * Scan file files to build font patterns */ for (i = 0; i < files->num; i++) FcFileScanConfig (set, dirs, blanks, files->strs[i], config); +bail2: + FcStrSetDestroy (files); +bail1: + closedir (d); +bail: + return ret; +} + +FcBool +FcDirScan (FcFontSet *set, + FcStrSet *dirs, + FcFileCache *cache, /* XXX unused */ + FcBlanks *blanks, + const FcChar8 *dir, + FcBool force /* XXX unused */) +{ + if (cache || !force) + return FcFalse; + + return FcDirScanConfig (set, dirs, blanks, dir, force, NULL); +} + +/* + * Scan the specified directory and construct a cache of its contents + */ +FcCache * +FcDirCacheScan (const FcChar8 *dir, FcConfig *config) +{ + FcStrSet *dirs; + FcBool ret = FcTrue; + FcFontSet *set; + FcCache *cache = NULL; + struct stat dir_stat; + + if (FcDebug () & FC_DBG_FONTSET) + printf ("cache scan dir %s\n", dir); + + if (FcStat ((char *) dir, &dir_stat) < 0) + { + if (errno != ENOENT) + ret = FcFalse; + 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) - goto bail3; + { + ret = FcFalse; + goto bail2; + } /* * Write out the cache file, ignoring any troubles */ FcDirCacheWrite (cache, config); - bail3: - FcStrSetDestroy (dirs); bail2: - FcStrSetDestroy (files); + FcStrSetDestroy (dirs); bail1: FcFontSetDestroy (set); - - bail0: - closedir (d); - - bail_1: - free (file); bail: return cache; } @@ -271,28 +318,6 @@ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config) return cache; } -FcBool -FcDirScanConfig (FcFontSet *set, - FcStrSet *dirs, - FcBlanks *blanks, - const FcChar8 *dir, - FcBool force, - FcConfig *config) -{ - return FcFalse; /* XXX deprecated */ -} - -FcBool -FcDirScan (FcFontSet *set, - FcStrSet *dirs, - FcFileCache *cache, /* XXX unused */ - FcBlanks *blanks, - const FcChar8 *dir, - FcBool force) -{ - return FcFalse; /* XXX deprecated */ -} - FcBool FcDirSave (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir) { -- 2.39.2