2 * Copyright © 2000 Keith Packard
4 * Permission to use, copy, modify, distribute, and sell this software and its
5 * documentation for any purpose is hereby granted without fee, provided that
6 * the above copyright notice appear in all copies and that both that
7 * copyright notice and this permission notice appear in supporting
8 * documentation, and that the name of the author(s) not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. The authors make no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
17 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
18 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
19 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
20 * PERFORMANCE OF THIS SOFTWARE.
30 FcPatternCreate (void)
34 p = (FcPattern *) malloc (sizeof (FcPattern));
37 FcMemAlloc (FC_MEM_PATTERN, sizeof (FcPattern));
40 p->elts_offset = FcPtrToOffset (p, NULL);
46 FcValueDestroy (FcValue v)
50 if (!FcSharedStrFree (v.u.s))
51 FcStrFree ((FcChar8 *) v.u.s);
54 FcMatrixFree ((FcMatrix *) v.u.m);
57 FcCharSetDestroy ((FcCharSet *) v.u.c);
60 FcLangSetDestroy ((FcLangSet *) v.u.l);
68 FcValueCanonicalize (const FcValue *v)
75 new.u.s = FcValueString(v);
76 new.type = FcTypeString;
79 new.u.c = FcValueCharSet(v);
80 new.type = FcTypeCharSet;
83 new.u.l = FcValueLangSet(v);
84 new.type = FcTypeLangSet;
94 FcValueSave (FcValue v)
98 v.u.s = FcSharedStr (v.u.s);
103 v.u.m = FcMatrixCopy (v.u.m);
108 v.u.c = FcCharSetCopy ((FcCharSet *) v.u.c);
113 v.u.l = FcLangSetCopy (v.u.l);
124 FcValueListCreate (void)
128 ret = calloc (1, sizeof (FcValueList));
131 FcMemAlloc(FC_MEM_VALLIST, sizeof (FcValueList));
138 FcValueListDestroy (FcValueListPtr l)
143 switch (l->value.type) {
145 if (!FcSharedStrFree ((FcChar8 *)l->value.u.s))
146 FcStrFree ((FcChar8 *)l->value.u.s);
149 FcMatrixFree ((FcMatrix *)l->value.u.m);
153 ((FcCharSet *) (l->value.u.c));
157 ((FcLangSet *) (l->value.u.l));
162 next = FcValueListNext(l);
163 FcMemFree (FC_MEM_VALLIST, sizeof (FcValueList));
169 FcValueListPrepend (FcValueListPtr vallist,
171 FcValueBinding binding)
175 if (value.type == FcTypeVoid)
177 new = FcValueListCreate ();
181 new->value = FcValueSave (value);
182 new->binding = binding;
189 FcValueListAppend (FcValueListPtr vallist,
191 FcValueBinding binding)
193 FcValueListPtr new, last;
195 if (value.type == FcTypeVoid)
197 new = FcValueListCreate ();
201 new->value = FcValueSave (value);
202 new->binding = binding;
207 for (last = vallist; FcValueListNext (last); last = FcValueListNext (last));
218 FcValueListDuplicate(FcValueListPtr orig)
220 FcValueListPtr new = NULL, l, t = NULL;
223 for (l = orig; l != NULL; l = FcValueListNext (l))
227 t = new = FcValueListCreate();
231 t->next = FcValueListCreate();
232 t = FcValueListNext (t);
234 v = FcValueCanonicalize (&l->value);
235 t->value = FcValueSave (v);
236 t->binding = l->binding;
244 FcValueEqual (FcValue va, FcValue vb)
246 if (va.type != vb.type)
248 if (va.type == FcTypeInteger)
250 va.type = FcTypeDouble;
253 if (vb.type == FcTypeInteger)
255 vb.type = FcTypeDouble;
258 if (va.type != vb.type)
265 return va.u.i == vb.u.i;
267 return va.u.d == vb.u.d;
269 return FcStrCmpIgnoreCase (va.u.s, vb.u.s) == 0;
271 return va.u.b == vb.u.b;
273 return FcMatrixEqual (va.u.m, vb.u.m);
275 return FcCharSetEqual (va.u.c, vb.u.c);
277 return va.u.f == vb.u.f;
279 return FcLangSetEqual (va.u.l, vb.u.l);
285 FcDoubleHash (double d)
295 FcStringHash (const FcChar8 *s)
302 h = ((h << 1) | (h >> 31)) ^ c;
307 FcValueHash (const FcValue *v)
313 return (FcChar32) v->u.i;
315 return FcDoubleHash (v->u.d);
317 return FcStringHash (FcValueString(v));
319 return (FcChar32) v->u.b;
321 return (FcDoubleHash (v->u.m->xx) ^
322 FcDoubleHash (v->u.m->xy) ^
323 FcDoubleHash (v->u.m->yx) ^
324 FcDoubleHash (v->u.m->yy));
326 return (FcChar32) FcValueCharSet(v)->num;
328 return FcStringHash ((const FcChar8 *) ((FT_Face) v->u.f)->family_name) ^
329 FcStringHash ((const FcChar8 *) ((FT_Face) v->u.f)->style_name);
331 return FcLangSetHash (FcValueLangSet(v));
337 FcValueListEqual (FcValueListPtr la, FcValueListPtr lb)
344 if (!FcValueEqual (la->value, lb->value))
346 la = FcValueListNext(la);
347 lb = FcValueListNext(lb);
355 FcValueListHash (FcValueListPtr l)
359 for (; l; l = FcValueListNext(l))
361 hash = ((hash << 1) | (hash >> 31)) ^ FcValueHash (&l->value);
367 FcPatternDestroy (FcPattern *p)
372 if (p->ref == FC_REF_CONSTANT)
374 FcCacheObjectDereference (p);
381 elts = FcPatternElts (p);
382 for (i = 0; i < p->num; i++)
383 FcValueListDestroy (FcPatternEltValues(&elts[i]));
385 FcMemFree (FC_MEM_PATELT, p->size * sizeof (FcPatternElt));
387 FcMemFree (FC_MEM_PATTERN, sizeof (FcPattern));
392 FcPatternObjectPosition (const FcPattern *p, FcObject object)
394 int low, high, mid, c;
395 FcPatternElt *elts = FcPatternElts(p);
403 mid = (low + high) >> 1;
404 c = elts[mid].object - object;
418 FcPatternObjectFindElt (const FcPattern *p, FcObject object)
420 int i = FcPatternObjectPosition (p, object);
423 return &FcPatternElts(p)[i];
427 FcPatternObjectInsertElt (FcPattern *p, FcObject object)
432 i = FcPatternObjectPosition (p, object);
437 /* reallocate array */
438 if (p->num + 1 >= p->size)
440 int s = p->size + 16;
443 FcPatternElt *e0 = FcPatternElts(p);
444 e = (FcPatternElt *) realloc (e0, s * sizeof (FcPatternElt));
445 if (!e) /* maybe it was mmapped */
447 e = malloc(s * sizeof (FcPatternElt));
449 memcpy(e, e0, p->num * sizeof (FcPatternElt));
453 e = (FcPatternElt *) malloc (s * sizeof (FcPatternElt));
456 p->elts_offset = FcPtrToOffset (p, e);
458 FcMemFree (FC_MEM_PATELT, p->size * sizeof (FcPatternElt));
459 FcMemAlloc (FC_MEM_PATELT, s * sizeof (FcPatternElt));
462 e[p->size].object = 0;
463 e[p->size].values = NULL;
468 e = FcPatternElts(p);
472 sizeof (FcPatternElt) *
478 e[i].object = object;
482 return FcPatternElts(p) + i;
486 FcPatternEqual (const FcPattern *pa, const FcPattern *pb)
489 FcPatternElt *pae, *pbe;
494 if (pa->num != pb->num)
496 pae = FcPatternElts(pa);
497 pbe = FcPatternElts(pb);
498 for (i = 0; i < pa->num; i++)
500 if (pae[i].object != pbe[i].object)
502 if (!FcValueListEqual (FcPatternEltValues(&pae[i]),
503 FcPatternEltValues(&pbe[i])))
510 FcPatternHash (const FcPattern *p)
514 FcPatternElt *pe = FcPatternElts(p);
516 for (i = 0; i < p->num; i++)
518 h = (((h << 1) | (h >> 31)) ^
520 FcValueListHash (FcPatternEltValues(&pe[i])));
526 FcPatternEqualSubset (const FcPattern *pai, const FcPattern *pbi, const FcObjectSet *os)
528 FcPatternElt *ea, *eb;
531 for (i = 0; i < os->nobject; i++)
533 FcObject object = FcObjectFromName (os->objects[i]);
534 ea = FcPatternObjectFindElt (pai, object);
535 eb = FcPatternObjectFindElt (pbi, object);
540 if (!FcValueListEqual (FcPatternEltValues(ea), FcPatternEltValues(eb)))
553 FcPatternObjectListAdd (FcPattern *p,
559 FcValueListPtr l, *prev;
561 if (p->ref == FC_REF_CONSTANT)
565 * Make sure the stored type is valid for built-in objects
567 for (l = list; l != NULL; l = FcValueListNext (l))
569 if (!FcObjectValidType (object, l->value.type))
571 if (FcDebug() & FC_DBG_OBJTYPES)
573 printf ("FcPattern object %s does not accept value ",
574 FcObjectName (object));
575 FcValuePrint (l->value);
581 e = FcPatternObjectInsertElt (p, object);
587 for (prev = &e->values; *prev; prev = &(*prev)->next)
593 for (prev = &list; *prev; prev = &(*prev)->next)
606 FcPatternObjectAddWithBinding (FcPattern *p,
609 FcValueBinding binding,
613 FcValueListPtr new, *prev;
615 if (p->ref == FC_REF_CONSTANT)
618 new = FcValueListCreate ();
622 value = FcValueSave (value);
623 if (value.type == FcTypeVoid)
627 * Make sure the stored type is valid for built-in objects
629 if (!FcObjectValidType (object, value.type))
631 if (FcDebug() & FC_DBG_OBJTYPES)
633 printf ("FcPattern object %s does not accept value ",
634 FcObjectName (object));
635 FcValuePrint (value);
641 new->binding = binding;
644 e = FcPatternObjectInsertElt (p, object);
650 for (prev = &e->values; *prev; prev = &(*prev)->next)
656 new->next = e->values;
663 FcValueDestroy (value);
665 FcMemFree (FC_MEM_VALLIST, sizeof (FcValueList));
672 FcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append)
674 return FcPatternObjectAddWithBinding (p, object,
675 value, FcValueBindingStrong, append);
679 FcPatternAdd (FcPattern *p, const char *object, FcValue value, FcBool append)
681 return FcPatternObjectAddWithBinding (p, FcObjectFromName (object),
682 value, FcValueBindingStrong, append);
686 FcPatternAddWeak (FcPattern *p, const char *object, FcValue value, FcBool append)
688 return FcPatternObjectAddWithBinding (p, FcObjectFromName (object),
689 value, FcValueBindingWeak, append);
693 FcPatternObjectDel (FcPattern *p, FcObject object)
697 e = FcPatternObjectFindElt (p, object);
702 FcValueListDestroy (e->values);
704 /* shuffle existing ones down */
706 (FcPatternElts(p) + p->num - (e + 1)) *
707 sizeof (FcPatternElt));
709 e = FcPatternElts(p) + p->num;
716 FcPatternDel (FcPattern *p, const char *object)
718 return FcPatternObjectDel (p, FcObjectFromName (object));
722 FcPatternRemove (FcPattern *p, const char *object, int id)
725 FcValueListPtr *prev, l;
727 e = FcPatternObjectFindElt (p, FcObjectFromName (object));
730 for (prev = &e->values; (l = *prev); prev = &l->next)
736 FcValueListDestroy (l);
738 FcPatternDel (p, object);
747 FcPatternObjectAddInteger (FcPattern *p, FcObject object, int i)
751 v.type = FcTypeInteger;
753 return FcPatternObjectAdd (p, object, v, FcTrue);
757 FcPatternAddInteger (FcPattern *p, const char *object, int i)
759 return FcPatternObjectAddInteger (p, FcObjectFromName (object), i);
763 FcPatternObjectAddDouble (FcPattern *p, FcObject object, double d)
767 v.type = FcTypeDouble;
769 return FcPatternObjectAdd (p, object, v, FcTrue);
774 FcPatternAddDouble (FcPattern *p, const char *object, double d)
776 return FcPatternObjectAddDouble (p, FcObjectFromName (object), d);
780 FcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s)
788 return FcPatternObjectAdd (p, object, v, FcTrue);
791 v.type = FcTypeString;
793 return FcPatternObjectAdd (p, object, v, FcTrue);
797 FcPatternAddString (FcPattern *p, const char *object, const FcChar8 *s)
799 return FcPatternObjectAddString (p, FcObjectFromName (object), s);
803 FcPatternAddMatrix (FcPattern *p, const char *object, const FcMatrix *s)
807 v.type = FcTypeMatrix;
809 return FcPatternAdd (p, object, v, FcTrue);
814 FcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b)
820 return FcPatternObjectAdd (p, object, v, FcTrue);
824 FcPatternAddBool (FcPattern *p, const char *object, FcBool b)
826 return FcPatternObjectAddBool (p, FcObjectFromName (object), b);
830 FcPatternAddCharSet (FcPattern *p, const char *object, const FcCharSet *c)
834 v.type = FcTypeCharSet;
835 v.u.c = (FcCharSet *)c;
836 return FcPatternAdd (p, object, v, FcTrue);
840 FcPatternAddFTFace (FcPattern *p, const char *object, const FT_Face f)
844 v.type = FcTypeFTFace;
846 return FcPatternAdd (p, object, v, FcTrue);
850 FcPatternAddLangSet (FcPattern *p, const char *object, const FcLangSet *ls)
854 v.type = FcTypeLangSet;
855 v.u.l = (FcLangSet *)ls;
856 return FcPatternAdd (p, object, v, FcTrue);
860 FcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v)
865 e = FcPatternObjectFindElt (p, object);
867 return FcResultNoMatch;
868 for (l = FcPatternEltValues(e); l; l = FcValueListNext(l))
872 *v = FcValueCanonicalize(&l->value);
873 return FcResultMatch;
881 FcPatternGet (const FcPattern *p, const char *object, int id, FcValue *v)
883 return FcPatternObjectGet (p, FcObjectFromName (object), id, v);
887 FcPatternObjectGetInteger (const FcPattern *p, FcObject object, int id, int *i)
892 r = FcPatternObjectGet (p, object, id, &v);
893 if (r != FcResultMatch)
903 return FcResultTypeMismatch;
905 return FcResultMatch;
909 FcPatternGetInteger (const FcPattern *p, const char *object, int id, int *i)
911 return FcPatternObjectGetInteger (p, FcObjectFromName (object), id, i);
916 FcPatternObjectGetDouble (const FcPattern *p, FcObject object, int id, double *d)
921 r = FcPatternObjectGet (p, object, id, &v);
922 if (r != FcResultMatch)
932 return FcResultTypeMismatch;
934 return FcResultMatch;
938 FcPatternGetDouble (const FcPattern *p, const char *object, int id, double *d)
940 return FcPatternObjectGetDouble (p, FcObjectFromName (object), id, d);
944 FcPatternObjectGetString (const FcPattern *p, FcObject object, int id, FcChar8 ** s)
949 r = FcPatternObjectGet (p, object, id, &v);
950 if (r != FcResultMatch)
952 if (v.type != FcTypeString)
953 return FcResultTypeMismatch;
955 *s = (FcChar8 *) v.u.s;
956 return FcResultMatch;
960 FcPatternGetString (const FcPattern *p, const char *object, int id, FcChar8 ** s)
962 return FcPatternObjectGetString (p, FcObjectFromName (object), id, s);
966 FcPatternGetMatrix(const FcPattern *p, const char *object, int id, FcMatrix **m)
971 r = FcPatternGet (p, object, id, &v);
972 if (r != FcResultMatch)
974 if (v.type != FcTypeMatrix)
975 return FcResultTypeMismatch;
976 *m = (FcMatrix *)v.u.m;
977 return FcResultMatch;
982 FcPatternGetBool(const FcPattern *p, const char *object, int id, FcBool *b)
987 r = FcPatternGet (p, object, id, &v);
988 if (r != FcResultMatch)
990 if (v.type != FcTypeBool)
991 return FcResultTypeMismatch;
993 return FcResultMatch;
997 FcPatternGetCharSet(const FcPattern *p, const char *object, int id, FcCharSet **c)
1002 r = FcPatternGet (p, object, id, &v);
1003 if (r != FcResultMatch)
1005 if (v.type != FcTypeCharSet)
1006 return FcResultTypeMismatch;
1007 *c = (FcCharSet *)v.u.c;
1008 return FcResultMatch;
1012 FcPatternGetFTFace(const FcPattern *p, const char *object, int id, FT_Face *f)
1017 r = FcPatternGet (p, object, id, &v);
1018 if (r != FcResultMatch)
1020 if (v.type != FcTypeFTFace)
1021 return FcResultTypeMismatch;
1022 *f = (FT_Face) v.u.f;
1023 return FcResultMatch;
1027 FcPatternGetLangSet(const FcPattern *p, const char *object, int id, FcLangSet **ls)
1032 r = FcPatternGet (p, object, id, &v);
1033 if (r != FcResultMatch)
1035 if (v.type != FcTypeLangSet)
1036 return FcResultTypeMismatch;
1037 *ls = (FcLangSet *)v.u.l;
1038 return FcResultMatch;
1042 FcPatternDuplicate (const FcPattern *orig)
1049 new = FcPatternCreate ();
1053 e = FcPatternElts(orig);
1055 for (i = 0; i < orig->num; i++)
1057 for (l = FcPatternEltValues(e + i); l; l = FcValueListNext(l))
1059 if (!FcPatternObjectAddWithBinding (new, e[i].object,
1060 FcValueCanonicalize(&l->value),
1071 FcPatternDestroy (new);
1077 FcPatternReference (FcPattern *p)
1079 if (p->ref != FC_REF_CONSTANT)
1082 FcCacheObjectReference (p);
1086 FcPatternVaBuild (FcPattern *p, va_list va)
1090 FcPatternVapBuild (ret, p, va);
1095 FcPatternBuild (FcPattern *p, ...)
1100 FcPatternVapBuild (p, p, va);
1106 * Add all of the elements in 's' to 'p'
1109 FcPatternAppend (FcPattern *p, FcPattern *s)
1115 for (i = 0; i < s->num; i++)
1117 e = FcPatternElts(s)+i;
1118 for (v = FcPatternEltValues(e); v; v = FcValueListNext(v))
1120 if (!FcPatternObjectAddWithBinding (p, e->object,
1121 FcValueCanonicalize(&v->value),
1122 v->binding, FcTrue))
1130 FcPatternFilter (FcPattern *p, const FcObjectSet *os)
1138 return FcPatternDuplicate (p);
1140 ret = FcPatternCreate ();
1144 for (i = 0; i < os->nobject; i++)
1146 FcObject object = FcObjectFromName (os->objects[i]);
1147 e = FcPatternObjectFindElt (p, object);
1150 for (v = FcPatternEltValues(e); v; v = FcValueListNext(v))
1152 if (!FcPatternObjectAddWithBinding (ret, e->object,
1153 FcValueCanonicalize(&v->value),
1154 v->binding, FcTrue))
1162 FcPatternDestroy (ret);
1166 #define OBJECT_HASH_SIZE 251
1167 static struct objectBucket {
1168 struct objectBucket *next;
1171 } *FcObjectBuckets[OBJECT_HASH_SIZE];
1174 FcSharedStrFree (const FcChar8 *name)
1176 FcChar32 hash = FcStringHash (name);
1177 struct objectBucket **p;
1178 struct objectBucket *b;
1181 for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
1182 if (b->hash == hash && ((char *)name == (char *) (b + 1)))
1188 size = sizeof (struct objectBucket) + strlen ((char *)name) + 1;
1189 size = (size + 3) & ~3;
1190 FcMemFree (FC_MEM_SHAREDSTR, size);
1199 FcSharedStr (const FcChar8 *name)
1201 FcChar32 hash = FcStringHash (name);
1202 struct objectBucket **p;
1203 struct objectBucket *b;
1206 for (p = &FcObjectBuckets[hash % OBJECT_HASH_SIZE]; (b = *p); p = &(b->next))
1207 if (b->hash == hash && !strcmp ((char *)name, (char *) (b + 1)))
1210 return (FcChar8 *) (b + 1);
1212 size = sizeof (struct objectBucket) + strlen ((char *)name) + 1;
1214 * workaround valgrind warning because glibc takes advantage of how it knows memory is
1215 * allocated to implement strlen by reading in groups of 4
1217 size = (size + 3) & ~3;
1219 FcMemAlloc (FC_MEM_SHAREDSTR, size);
1225 strcpy ((char *) (b + 1), (char *)name);
1227 return (FcChar8 *) (b + 1);
1231 FcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat)
1234 FcPatternElt *elts = FcPatternElts(pat);
1236 if (!FcSerializeAlloc (serialize, pat, sizeof (FcPattern)))
1238 if (!FcSerializeAlloc (serialize, elts, pat->num * sizeof (FcPatternElt)))
1240 for (i = 0; i < pat->num; i++)
1241 if (!FcValueListSerializeAlloc (serialize, FcPatternEltValues(elts+i)))
1247 FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat)
1249 FcPattern *pat_serialized;
1250 FcPatternElt *elts = FcPatternElts (pat);
1251 FcPatternElt *elts_serialized;
1252 FcValueList *values_serialized;
1255 pat_serialized = FcSerializePtr (serialize, pat);
1256 if (!pat_serialized)
1258 *pat_serialized = *pat;
1259 pat_serialized->size = pat->num;
1260 pat_serialized->ref = FC_REF_CONSTANT;
1262 elts_serialized = FcSerializePtr (serialize, elts);
1263 if (!elts_serialized)
1266 pat_serialized->elts_offset = FcPtrToOffset (pat_serialized,
1269 for (i = 0; i < pat->num; i++)
1271 values_serialized = FcValueListSerialize (serialize, FcPatternEltValues (elts+i));
1272 if (!values_serialized)
1274 elts_serialized[i].object = elts[i].object;
1275 elts_serialized[i].values = FcPtrToEncodedOffset (&elts_serialized[i],
1279 if (FcDebug() & FC_DBG_CACHEV) {
1280 printf ("Raw pattern:\n");
1281 FcPatternPrint (pat);
1282 printf ("Serialized pattern:\n");
1283 FcPatternPrint (pat_serialized);
1286 return pat_serialized;
1290 FcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *vl)
1294 if (!FcSerializeAlloc (serialize, vl, sizeof (FcValueList)))
1296 switch (vl->value.type) {
1298 if (!FcStrSerializeAlloc (serialize, vl->value.u.s))
1302 if (!FcCharSetSerializeAlloc (serialize, vl->value.u.c))
1306 if (!FcLangSetSerializeAlloc (serialize, vl->value.u.l))
1318 FcValueListSerialize (FcSerialize *serialize, const FcValueList *vl)
1320 FcValueList *vl_serialized;
1321 FcChar8 *s_serialized;
1322 FcCharSet *c_serialized;
1323 FcLangSet *l_serialized;
1324 FcValueList *head_serialized = NULL;
1325 FcValueList *prev_serialized = NULL;
1329 vl_serialized = FcSerializePtr (serialize, vl);
1333 if (prev_serialized)
1334 prev_serialized->next = FcPtrToEncodedOffset (prev_serialized,
1338 head_serialized = vl_serialized;
1340 vl_serialized->next = NULL;
1341 vl_serialized->value.type = vl->value.type;
1342 switch (vl->value.type) {
1344 vl_serialized->value.u.i = vl->value.u.i;
1347 vl_serialized->value.u.d = vl->value.u.d;
1350 s_serialized = FcStrSerialize (serialize, vl->value.u.s);
1353 vl_serialized->value.u.s = FcPtrToEncodedOffset (&vl_serialized->value,
1358 vl_serialized->value.u.b = vl->value.u.b;
1364 c_serialized = FcCharSetSerialize (serialize, vl->value.u.c);
1367 vl_serialized->value.u.c = FcPtrToEncodedOffset (&vl_serialized->value,
1375 l_serialized = FcLangSetSerialize (serialize, vl->value.u.l);
1378 vl_serialized->value.u.l = FcPtrToEncodedOffset (&vl_serialized->value,
1385 prev_serialized = vl_serialized;
1388 return head_serialized;
1391 #include "fcaliastail.h"
1392 #include "fcftaliastail.h"