/*
- * $XFree86: xc/lib/fontconfig/src/fccfg.c,v 1.20 2002/08/19 19:32:05 keithp Exp $
+ * $RCSId: 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.
+ * Copyright © 2000 Keith Packard
*
* Permission to use, copy, modify, distribute, and sell this software and its
* documentation for any purpose is hereby granted without fee, provided that
goto bail3;
config->cache = 0;
- if (!FcConfigSetCache (config, (FcChar8 *) ("~/" FC_USER_CACHE_FILE)))
- goto bail4;
+ if (FcConfigHome())
+ if (!FcConfigSetCache (config, (FcChar8 *) ("~/" FC_USER_CACHE_FILE)))
+ goto bail4;
config->blanks = 0;
while (s)
{
n = s->next;
- FcTestDestroy (s->test);
- FcEditDestroy (s->edit);
+ if (s->test)
+ FcTestDestroy (s->test);
+ if (s->edit)
+ FcEditDestroy (s->edit);
s = n;
}
}
subst = (FcSubst *) malloc (sizeof (FcSubst));
if (!subst)
return FcFalse;
+ FcMemAlloc (FC_MEM_SUBST, sizeof (FcSubst));
if (kind == FcMatchPattern)
prev = &config->substPattern;
else
}
FcBool
-FcConfigCompareValue (FcValue m,
- FcOp op,
- FcValue v)
+FcConfigCompareValue (const FcValue m_o,
+ FcOp op,
+ const FcValue v_o)
{
- FcBool ret = FcFalse;
+ FcValue m = m_o;
+ FcValue v = v_o;
+ FcBool ret = FcFalse;
m = FcConfigPromote (m, v);
v = FcConfigPromote (v, m);
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;
case FcTypeLangSet:
switch (op) {
case FcOpContains:
- ret = FcLangSetCompare (v.u.l, m.u.l) != FcLangDifferentLang;
+ ret = FcLangSetContains (v.u.l, m.u.l);
+ break;
+ case FcOpNotContains:
+ ret = FcLangSetContains (v.u.l, m.u.l);
break;
case FcOpEqual:
ret = FcLangSetEqual (v.u.l, m.u.l);
case FcTypeFTFace:
switch (op) {
case FcOpEqual:
+ case FcOpContains:
ret = m.u.f == v.u.f;
break;
case FcOpNotEqual:
+ case FcOpNotContains:
ret = m.u.f != v.u.f;
break;
default:
}
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 append,
FcValueList *new)
{
- FcValueList **prev, *last;
+ FcValueList **prev, *last, *v;
+ FcValueBinding sameBinding;
+ if (position)
+ sameBinding = position->binding;
+ else
+ sameBinding = FcValueBindingWeak;
+ for (v = new; v; v = v->next)
+ if (v->binding == FcValueBindingSame)
+ v->binding = sameBinding;
if (append)
{
if (position)
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:
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;
}
free (path);
}
+static FcBool _FcConfigHomeEnabled = FcTrue;
+
+FcChar8 *
+FcConfigHome (void)
+{
+ if (_FcConfigHomeEnabled)
+ return getenv ("HOME");
+ return 0;
+}
+
+FcBool
+FcConfigEnableHome (FcBool enable)
+{
+ FcBool prev = _FcConfigHomeEnabled;
+ _FcConfigHomeEnabled = enable;
+ return prev;
+}
+
FcChar8 *
FcConfigFilename (const FcChar8 *url)
{
file = 0;
switch (*url) {
case '~':
- dir = (FcChar8 *) getenv ("HOME");
+ dir = FcConfigHome ();
if (dir)
file = FcConfigFileExists (dir, url + 1);
else