Revive FcConfigScan() (bug #17121)
FcConfigScan() with parameters cache=NULL and force=FcTrue can be used to scan font dirs without any caching side effect.
This commit is contained in:
parent
46e405cb9a
commit
4074fd254e
153
src/fcdir.c
153
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 ();
|
||||
|
@ -211,40 +200,98 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
|||
*/
|
||||
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)
|
||||
{
|
||||
|
|
Loading…
Reference in New Issue