/*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.18 2002/07/31 01:36:37 keithp Exp $
+ * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.23 2002/08/31 22:17:32 keithp Exp $
*
* Copyright © 2000 Keith Packard, member of The XFree86 Project, Inc.
*
subst = (FcSubst *) malloc (sizeof (FcSubst));
if (!subst)
return FcFalse;
+ FcMemAlloc (FC_MEM_SUBST, sizeof (FcSubst));
if (kind == FcMatchPattern)
prev = &config->substPattern;
else
v.u.m = &FcIdentityMatrix;
v.type = FcTypeMatrix;
}
+ else if (v.type == FcTypeString && u.type == FcTypeLangSet)
+ {
+ v.u.l = FcLangSetPromote (v.u.s);
+ v.type = FcTypeLangSet;
+ }
return v;
}
case FcOpContains:
ret = m.u.d == v.u.d;
break;
- case FcOpNotEqual:
+ case FcOpNotEqual:
+ case FcOpNotContains:
ret = m.u.d != v.u.d;
break;
case FcOpLess:
case FcOpContains:
ret = m.u.b == v.u.b;
break;
- case FcOpNotEqual:
+ case FcOpNotEqual:
+ case FcOpNotContains:
ret = m.u.b != v.u.b;
break;
default:
case FcOpContains:
ret = FcStrCmpIgnoreCase (m.u.s, v.u.s) == 0;
break;
- case FcOpNotEqual:
+ case FcOpNotEqual:
+ case FcOpNotContains:
ret = FcStrCmpIgnoreCase (m.u.s, v.u.s) != 0;
break;
default:
ret = FcMatrixEqual (m.u.m, v.u.m);
break;
case FcOpNotEqual:
+ case FcOpNotContains:
ret = !FcMatrixEqual (m.u.m, v.u.m);
break;
default:
/* m contains v if v is a subset of m */
ret = FcCharSetIsSubset (v.u.c, m.u.c);
break;
+ case FcOpNotContains:
+ /* m contains v if v is a subset of m */
+ ret = !FcCharSetIsSubset (v.u.c, m.u.c);
+ break;
case FcOpEqual:
ret = FcCharSetEqual (m.u.c, v.u.c);
break;
break;
}
break;
- case FcTypeVoid:
+ case FcTypeLangSet:
switch (op) {
- case FcOpEqual:
case FcOpContains:
- ret = FcTrue;
+ ret = FcLangSetCompare (v.u.l, m.u.l) != FcLangDifferentLang;
+ break;
+ case FcOpNotContains:
+ ret = FcLangSetCompare (v.u.l, m.u.l) == FcLangDifferentLang;
+ break;
+ case FcOpEqual:
+ ret = FcLangSetEqual (v.u.l, m.u.l);
+ break;
+ case FcOpNotEqual:
+ ret = !FcLangSetEqual (v.u.l, m.u.l);
break;
default:
break;
}
break;
- case FcTypeFTFace:
+ case FcTypeVoid:
switch (op) {
case FcOpEqual:
- ret = m.u.f == v.u.f;
- break;
- case FcOpNotEqual:
- ret = m.u.f != v.u.f;
+ case FcOpContains:
+ ret = FcTrue;
break;
default:
break;
}
break;
- case FcTypePattern:
+ case FcTypeFTFace:
switch (op) {
case FcOpEqual:
- ret = FcPatternEqual (m.u.p, v.u.p);
+ case FcOpContains:
+ ret = m.u.f == v.u.f;
break;
case FcOpNotEqual:
- ret = !FcPatternEqual (m.u.p, v.u.p);
+ case FcOpNotContains:
+ ret = m.u.f != v.u.f;
break;
default:
break;
}
else
{
- if (op == FcOpNotEqual)
+ if (op == FcOpNotEqual || op == FcOpNotContains)
ret = FcTrue;
}
return ret;
v.type = FcTypeVoid;
FcValueDestroy (vl);
break;
- case FcOpContains:
+ case FcOpEqual:
case FcOpNotEqual:
case FcOpLess:
case FcOpLessEqual:
case FcOpMore:
case FcOpMoreEqual:
+ case FcOpContains:
+ case FcOpNotContains:
vl = FcConfigEvaluate (p, e->u.tree.left);
vr = FcConfigEvaluate (p, e->u.tree.right);
v.type = FcTypeBool;
break;
case FcOpOr:
case FcOpAnd:
- case FcOpEqual:
case FcOpPlus:
case FcOpMinus:
case FcOpTimes:
}
FcBool
-FcConfigSubstitute (FcConfig *config,
- FcPattern *p,
- FcMatchKind kind)
+FcConfigSubstituteWithPat (FcConfig *config,
+ FcPattern *p,
+ FcPattern *p_pat,
+ FcMatchKind kind)
{
FcSubst *s;
FcSubState *st;
FcTest *t;
FcEdit *e;
FcValueList *l;
- FcPattern *p_pat = 0;
FcPattern *m;
if (!config)
if (kind == FcMatchPattern)
s = config->substPattern;
else
- {
s = config->substFont;
- (void) FcPatternGetPattern (p, FC_PATTERN, 0, &p_pat);
- }
for (; s; s = s->next)
{
/*
if ((t->kind == FcMatchFont || kind == FcMatchPattern) &&
!FcStrCmpIgnoreCase ((FcChar8 *) t->field,
(FcChar8 *) e->field))
+ {
+ if (!st[i].elt)
+ t = 0;
break;
+ }
}
switch (e->op) {
case FcOpAssign:
return FcTrue;
}
+FcBool
+FcConfigSubstitute (FcConfig *config,
+ FcPattern *p,
+ FcMatchKind kind)
+{
+ return FcConfigSubstituteWithPat (config, p, 0, kind);
+}
+
#ifndef FONTCONFIG_PATH
#define FONTCONFIG_PATH "/etc/fonts"
#endif
strcat ((char *) path, "/");
strcat ((char *) path, (char *) file);
+ FcMemAlloc (FC_MEM_STRING, strlen ((char *) path) + 1);
if (access ((char *) path, R_OK) == 0)
return path;
- free (path);
+ FcStrFree (path);
return 0;
}