Don't call FcStat when the alias has already been added

Similar changes to 3a3d6ea applies to fclist and fcmatch.
This commit is contained in:
Akira TAGOH 2017-11-15 23:24:24 +09:00
parent 665a5d3044
commit 2f486f6584
2 changed files with 42 additions and 50 deletions

View File

@ -450,43 +450,38 @@ FcListAppend (FcListHashTable *table,
{
if (FcRefIsConst (&font->ref) && !strcmp (os->objects[o], FC_FILE))
{
struct stat statb;
FcChar8 *dir, *alias;
FcConfig *config = FcConfigGetCurrent (); /* FIXME: this may need to be exported as API? */
for (v = FcPatternEltValues (e); v->value.type != FcTypeString; v = FcValueListNext (v));
if (!v)
goto bail2;
if (FcStat (FcValueString (&v->value), &statb) < 0)
dir = FcStrDirname (FcValueString (&v->value));
if (FcHashTableFind (config->alias_table, dir, (void **) &alias))
{
FcChar8 *dir = FcStrDirname (FcValueString (&v->value));
FcChar8 *alias;
FcConfig *config = FcConfigGetCurrent (); /* FIXME: this may need to be exported as API? */
FcChar8 *base = FcStrBasename (FcValueString (&v->value));
FcChar8 *s = FcStrBuildFilename (alias, base, NULL);
FcValue vv;
if (FcHashTableFind (config->alias_table, dir, (void **) &alias))
FcStrFree (alias);
FcStrFree (base);
vv.type = FcTypeString;
vv.u.s = s;
if (!FcPatternAdd (bucket->pattern,
os->objects[o],
FcValueCanonicalize (&vv),
FcTrue))
{
FcChar8 *base = FcStrBasename (FcValueString (&v->value));
FcChar8 *s = FcStrBuildFilename (alias, base, NULL);
FcValue vv;
FcStrFree (alias);
FcStrFree (base);
vv.type = FcTypeString;
vv.u.s = s;
if (!FcPatternAdd (bucket->pattern,
os->objects[o],
FcValueCanonicalize (&vv),
FcTrue))
{
FcStrFree (s);
FcStrFree (dir);
goto bail2;
}
FcStrFree (s);
FcStrFree (dir);
goto bail3;
goto bail2;
}
else
FcStrFree (dir);
FcStrFree (s);
FcStrFree (dir);
goto bail3;
}
else
FcStrFree (dir);
}
for (v = FcPatternEltValues(e), idx = 0; v;
v = FcValueListNext(v), ++idx)

View File

@ -646,36 +646,33 @@ FcFontRenderPrepare (FcConfig *config,
if (FcRefIsConst (&font->ref) && fe->object == FC_FILE_OBJECT)
{
FcValueListPtr l = FcPatternEltValues (fe);
struct stat statb;
FcChar8 *dir, *alias;
while (l->value.type != FcTypeString)
l = FcValueListNext (l);
if (FcStat (FcValueString (&l->value), &statb) < 0)
if (!l)
goto bail0;
dir = FcStrDirname (FcValueString (&l->value));
if (FcHashTableFind (config->alias_table, dir, (void **) &alias))
{
FcChar8 *dir = FcStrDirname (FcValueString (&l->value));
FcChar8 *alias;
FcChar8 *base = FcStrBasename (FcValueString (&l->value));
FcChar8 *s = FcStrBuildFilename (alias, base, NULL);
FcValue v;
if (FcHashTableFind (config->alias_table, dir, (void **) &alias))
{
FcChar8 *base = FcStrBasename (FcValueString (&l->value));
FcChar8 *s = FcStrBuildFilename (alias, base, NULL);
FcValue v;
FcStrFree (alias);
FcStrFree (base);
v.type = FcTypeString;
v.u.s = s;
FcPatternObjectAddWithBinding (new, fe->object,
FcValueCanonicalize (&v),
l->binding,
FcTrue);
FcStrFree (s);
FcStrFree (dir);
goto bail0;
}
else
FcStrFree (dir);
FcStrFree (alias);
FcStrFree (base);
v.type = FcTypeString;
v.u.s = s;
FcPatternObjectAddWithBinding (new, fe->object,
FcValueCanonicalize (&v),
l->binding,
FcTrue);
FcStrFree (s);
FcStrFree (dir);
goto bail0;
}
else
FcStrFree (dir);
}
FcPatternObjectListAdd (new, fe->object,
FcValueListDuplicate (FcPatternEltValues (fe)),