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);
|
return strcmp(* (char **) p1, * (char **) p2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
FcBool
|
||||||
* Scan the specified directory and construct a cache of its contents
|
FcDirScanConfig (FcFontSet *set,
|
||||||
*/
|
FcStrSet *dirs,
|
||||||
FcCache *
|
FcBlanks *blanks,
|
||||||
FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
const FcChar8 *dir,
|
||||||
|
FcBool force, /* XXX unused */
|
||||||
|
FcConfig *config)
|
||||||
{
|
{
|
||||||
DIR *d;
|
DIR *d;
|
||||||
struct dirent *e;
|
struct dirent *e;
|
||||||
FcStrSet *files;
|
FcStrSet *files;
|
||||||
FcStrSet *dirs;
|
|
||||||
FcChar8 *file;
|
FcChar8 *file;
|
||||||
FcChar8 *base;
|
FcChar8 *base;
|
||||||
FcBool ret = FcTrue;
|
FcBool ret = FcTrue;
|
||||||
FcFontSet *set;
|
|
||||||
int i;
|
int i;
|
||||||
FcBlanks *blanks = FcConfigGetBlanks (config);
|
|
||||||
FcCache *cache = NULL;
|
|
||||||
struct stat dir_stat;
|
|
||||||
|
|
||||||
if (FcDebug () & FC_DBG_FONTSET)
|
if (!force)
|
||||||
printf ("cache scan dir %s\n", dir);
|
return FcFalse;
|
||||||
|
|
||||||
|
if (!set && !dirs)
|
||||||
|
return FcTrue;
|
||||||
|
|
||||||
|
if (!blanks)
|
||||||
|
blanks = FcConfigGetBlanks (config);
|
||||||
|
|
||||||
/* freed below */
|
/* freed below */
|
||||||
file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
|
file = (FcChar8 *) malloc (strlen ((char *) dir) + 1 + FC_MAX_FILE_LEN + 1);
|
||||||
|
@ -169,23 +172,9 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
||||||
if (!d)
|
if (!d)
|
||||||
{
|
{
|
||||||
/* Don't complain about missing directories */
|
/* Don't complain about missing directories */
|
||||||
if (errno == ENOENT)
|
if (errno != ENOENT)
|
||||||
ret = FcTrue;
|
|
||||||
else
|
|
||||||
ret = FcFalse;
|
ret = FcFalse;
|
||||||
goto bail_1;
|
goto bail;
|
||||||
}
|
|
||||||
if (FcStat ((char *) dir, &dir_stat) < 0)
|
|
||||||
{
|
|
||||||
ret = FcFalse;
|
|
||||||
goto bail_1;
|
|
||||||
}
|
|
||||||
|
|
||||||
set = FcFontSetCreate();
|
|
||||||
if (!set)
|
|
||||||
{
|
|
||||||
ret = FcFalse;
|
|
||||||
goto bail0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
files = FcStrSetCreate ();
|
files = FcStrSetCreate ();
|
||||||
|
@ -211,40 +200,98 @@ FcDirCacheScan (const FcChar8 *dir, FcConfig *config)
|
||||||
*/
|
*/
|
||||||
qsort(files->strs, files->num, sizeof(FcChar8 *), cmpstringp);
|
qsort(files->strs, files->num, sizeof(FcChar8 *), cmpstringp);
|
||||||
|
|
||||||
dirs = FcStrSetCreate ();
|
|
||||||
if (!dirs)
|
|
||||||
goto bail2;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Scan file files to build font patterns
|
* Scan file files to build font patterns
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < files->num; i++)
|
for (i = 0; i < files->num; i++)
|
||||||
FcFileScanConfig (set, dirs, blanks, files->strs[i], config);
|
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
|
* Build the cache object
|
||||||
*/
|
*/
|
||||||
cache = FcDirCacheBuild (set, dir, &dir_stat, dirs);
|
cache = FcDirCacheBuild (set, dir, &dir_stat, dirs);
|
||||||
if (!cache)
|
if (!cache)
|
||||||
goto bail3;
|
{
|
||||||
|
ret = FcFalse;
|
||||||
|
goto bail2;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Write out the cache file, ignoring any troubles
|
* Write out the cache file, ignoring any troubles
|
||||||
*/
|
*/
|
||||||
FcDirCacheWrite (cache, config);
|
FcDirCacheWrite (cache, config);
|
||||||
|
|
||||||
bail3:
|
|
||||||
FcStrSetDestroy (dirs);
|
|
||||||
bail2:
|
bail2:
|
||||||
FcStrSetDestroy (files);
|
FcStrSetDestroy (dirs);
|
||||||
bail1:
|
bail1:
|
||||||
FcFontSetDestroy (set);
|
FcFontSetDestroy (set);
|
||||||
|
|
||||||
bail0:
|
|
||||||
closedir (d);
|
|
||||||
|
|
||||||
bail_1:
|
|
||||||
free (file);
|
|
||||||
bail:
|
bail:
|
||||||
return cache;
|
return cache;
|
||||||
}
|
}
|
||||||
|
@ -271,28 +318,6 @@ FcDirCacheRead (const FcChar8 *dir, FcBool force, FcConfig *config)
|
||||||
return cache;
|
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
|
FcBool
|
||||||
FcDirSave (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir)
|
FcDirSave (FcFontSet *set, FcStrSet * dirs, const FcChar8 *dir)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue