aboutsummaryrefslogtreecommitdiff
path: root/fontconfig/src/fcpat.c
diff options
context:
space:
mode:
Diffstat (limited to 'fontconfig/src/fcpat.c')
-rw-r--r--fontconfig/src/fcpat.c146
1 files changed, 143 insertions, 3 deletions
diff --git a/fontconfig/src/fcpat.c b/fontconfig/src/fcpat.c
index ebd6e57e2..62e47ca7e 100644
--- a/fontconfig/src/fcpat.c
+++ b/fontconfig/src/fcpat.c
@@ -120,6 +120,20 @@ FcValueSave (FcValue v)
return v;
}
+FcValueListPtr
+FcValueListCreate (void)
+{
+ FcValueListPtr ret;
+
+ ret = calloc (1, sizeof (FcValueList));
+ if (ret)
+ {
+ FcMemAlloc(FC_MEM_VALLIST, sizeof (FcValueList));
+ }
+
+ return ret;
+}
+
void
FcValueListDestroy (FcValueListPtr l)
{
@@ -151,6 +165,81 @@ FcValueListDestroy (FcValueListPtr l)
}
}
+FcValueListPtr
+FcValueListPrepend (FcValueListPtr vallist,
+ FcValue value,
+ FcValueBinding binding)
+{
+ FcValueListPtr new;
+
+ if (value.type == FcTypeVoid)
+ return vallist;
+ new = FcValueListCreate ();
+ if (!new)
+ return vallist;
+
+ new->value = FcValueSave (value);
+ new->binding = binding;
+ new->next = vallist;
+
+ return new;
+}
+
+FcValueListPtr
+FcValueListAppend (FcValueListPtr vallist,
+ FcValue value,
+ FcValueBinding binding)
+{
+ FcValueListPtr new, last;
+
+ if (value.type == FcTypeVoid)
+ return vallist;
+ new = FcValueListCreate ();
+ if (!new)
+ return vallist;
+
+ new->value = FcValueSave (value);
+ new->binding = binding;
+ new->next = NULL;
+
+ if (vallist)
+ {
+ for (last = vallist; FcValueListNext (last); last = FcValueListNext (last));
+
+ last->next = new;
+ }
+ else
+ vallist = new;
+
+ return vallist;
+}
+
+FcValueListPtr
+FcValueListDuplicate(FcValueListPtr orig)
+{
+ FcValueListPtr new = NULL, l, t = NULL;
+ FcValue v;
+
+ for (l = orig; l != NULL; l = FcValueListNext (l))
+ {
+ if (!new)
+ {
+ t = new = FcValueListCreate();
+ }
+ else
+ {
+ t->next = FcValueListCreate();
+ t = FcValueListNext (t);
+ }
+ v = FcValueCanonicalize (&l->value);
+ t->value = FcValueSave (v);
+ t->binding = l->binding;
+ t->next = NULL;
+ }
+
+ return new;
+}
+
FcBool
FcValueEqual (FcValue va, FcValue vb)
{
@@ -461,6 +550,59 @@ FcPatternEqualSubset (const FcPattern *pai, const FcPattern *pbi, const FcObject
}
FcBool
+FcPatternObjectListAdd (FcPattern *p,
+ FcObject object,
+ FcValueListPtr list,
+ FcBool append)
+{
+ FcPatternElt *e;
+ FcValueListPtr l, *prev;
+
+ if (p->ref == FC_REF_CONSTANT)
+ goto bail0;
+
+ /*
+ * Make sure the stored type is valid for built-in objects
+ */
+ for (l = list; l != NULL; l = FcValueListNext (l))
+ {
+ if (!FcObjectValidType (object, l->value.type))
+ {
+ if (FcDebug() & FC_DBG_OBJTYPES)
+ {
+ printf ("FcPattern object %s does not accept value ",
+ FcObjectName (object));
+ FcValuePrint (l->value);
+ }
+ goto bail0;
+ }
+ }
+
+ e = FcPatternObjectInsertElt (p, object);
+ if (!e)
+ goto bail0;
+
+ if (append)
+ {
+ for (prev = &e->values; *prev; prev = &(*prev)->next)
+ ;
+ *prev = list;
+ }
+ else
+ {
+ for (prev = &list; *prev; prev = &(*prev)->next)
+ ;
+ *prev = e->values;
+ e->values = list;
+ }
+
+ return FcTrue;
+
+bail0:
+ return FcFalse;
+}
+
+FcBool
FcPatternObjectAddWithBinding (FcPattern *p,
FcObject object,
FcValue value,
@@ -473,12 +615,10 @@ FcPatternObjectAddWithBinding (FcPattern *p,
if (p->ref == FC_REF_CONSTANT)
goto bail0;
- new = malloc (sizeof (FcValueList));
+ new = FcValueListCreate ();
if (!new)
goto bail0;
- memset(new, 0, sizeof (FcValueList));
- FcMemAlloc (FC_MEM_VALLIST, sizeof (FcValueList));
value = FcValueSave (value);
if (value.type == FcTypeVoid)
goto bail1;