]>
git.wh0rd.org - fontconfig.git/blob - src/fcpat.c
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 Keith Packard not be used in
9 * advertising or publicity pertaining to distribution of the software without
10 * specific, written prior permission. Keith Packard makes no
11 * representations about the suitability of this software for any purpose. It
12 * is provided "as is" without express or implied warranty.
14 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
15 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
16 * EVENT SHALL KEITH PACKARD 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.
29 FcStrHashed (const FcChar8
*name
);
32 FcPatternCreate (void)
36 p
= (FcPattern
*) malloc (sizeof (FcPattern
));
39 FcMemAlloc (FC_MEM_PATTERN
, sizeof (FcPattern
));
42 p
->elts_offset
= FcPtrToOffset (p
, NULL
);
48 FcValueDestroy (FcValue v
)
52 if (!FcStrHashed (v
.u
.s
))
53 FcStrFree ((FcChar8
*) v
.u
.s
);
56 FcMatrixFree ((FcMatrix
*) v
.u
.m
);
59 FcCharSetDestroy ((FcCharSet
*) v
.u
.c
);
62 FcLangSetDestroy ((FcLangSet
*) v
.u
.l
);
70 FcValueCanonicalize (const FcValue
*v
)
77 new.u
.s
= fc_value_string(v
);
78 new.type
= FcTypeString
;
81 new.u
.c
= fc_value_charset(v
);
82 new.type
= FcTypeCharSet
;
85 new.u
.l
= fc_value_langset(v
);
86 new.type
= FcTypeLangSet
;
96 FcValueSave (FcValue v
)
100 v
.u
.s
= FcStrCopy (v
.u
.s
);
105 v
.u
.m
= FcMatrixCopy (v
.u
.m
);
110 v
.u
.c
= FcCharSetCopy ((FcCharSet
*) v
.u
.c
);
115 v
.u
.l
= FcLangSetCopy (v
.u
.l
);
126 FcValueListDestroy (FcValueListPtr l
)
131 switch (l
->value
.type
) {
133 if (!FcStrHashed ((FcChar8
*)l
->value
.u
.s
))
134 FcStrFree ((FcChar8
*)l
->value
.u
.s
);
137 FcMatrixFree ((FcMatrix
*)l
->value
.u
.m
);
141 ((FcCharSet
*) (l
->value
.u
.c
));
145 ((FcLangSet
*) (l
->value
.u
.l
));
150 next
= FcValueListNext(l
);
151 FcMemFree (FC_MEM_VALLIST
, sizeof (FcValueList
));
157 FcValueEqual (FcValue va
, FcValue vb
)
159 if (va
.type
!= vb
.type
)
161 if (va
.type
== FcTypeInteger
)
163 va
.type
= FcTypeDouble
;
166 if (vb
.type
== FcTypeInteger
)
168 vb
.type
= FcTypeDouble
;
171 if (va
.type
!= vb
.type
)
178 return va
.u
.i
== vb
.u
.i
;
180 return va
.u
.d
== vb
.u
.d
;
182 return FcStrCmpIgnoreCase (va
.u
.s
, vb
.u
.s
) == 0;
184 return va
.u
.b
== vb
.u
.b
;
186 return FcMatrixEqual (va
.u
.m
, vb
.u
.m
);
188 return FcCharSetEqual (va
.u
.c
, vb
.u
.c
);
190 return va
.u
.f
== vb
.u
.f
;
192 return FcLangSetEqual (va
.u
.l
, vb
.u
.l
);
198 FcDoubleHash (double d
)
208 FcStringHash (const FcChar8
*s
)
215 h
= ((h
<< 1) | (h
>> 31)) ^ c
;
220 FcValueHash (const FcValue
*v
)
222 switch (fc_storage_type(v
)) {
226 return (FcChar32
) v
->u
.i
;
228 return FcDoubleHash (v
->u
.d
);
230 return FcStringHash (fc_value_string(v
));
232 return (FcChar32
) v
->u
.b
;
234 return (FcDoubleHash (v
->u
.m
->xx
) ^
235 FcDoubleHash (v
->u
.m
->xy
) ^
236 FcDoubleHash (v
->u
.m
->yx
) ^
237 FcDoubleHash (v
->u
.m
->yy
));
239 return (FcChar32
) fc_value_charset(v
)->num
;
241 return FcStringHash ((const FcChar8
*) ((FT_Face
) v
->u
.f
)->family_name
) ^
242 FcStringHash ((const FcChar8
*) ((FT_Face
) v
->u
.f
)->style_name
);
244 return FcLangSetHash (fc_value_langset(v
));
250 FcValueListEqual (FcValueListPtr la
, FcValueListPtr lb
)
257 if (!FcValueEqual (la
->value
, lb
->value
))
259 la
= FcValueListNext(la
);
260 lb
= FcValueListNext(lb
);
268 FcValueListHash (FcValueListPtr l
)
272 for (; l
; l
= FcValueListNext(l
))
274 hash
= ((hash
<< 1) | (hash
>> 31)) ^ FcValueHash (&l
->value
);
280 FcPatternDestroy (FcPattern
*p
)
285 if (p
->ref
== FC_REF_CONSTANT
|| --p
->ref
> 0)
288 elts
= FcPatternElts (p
);
289 for (i
= 0; i
< p
->num
; i
++)
290 FcValueListDestroy (FcPatternEltValues(&elts
[i
]));
292 FcMemFree (FC_MEM_PATELT
, p
->size
* sizeof (FcPatternElt
));
294 FcMemFree (FC_MEM_PATTERN
, sizeof (FcPattern
));
299 FcPatternObjectPosition (const FcPattern
*p
, FcObject object
)
301 int low
, high
, mid
, c
;
302 FcPatternElt
*elts
= FcPatternElts(p
);
310 mid
= (low
+ high
) >> 1;
311 c
= elts
[mid
].object
- object
;
325 FcPatternObjectFindElt (const FcPattern
*p
, FcObject object
)
327 int i
= FcPatternObjectPosition (p
, object
);
330 return &FcPatternElts(p
)[i
];
334 FcPatternObjectInsertElt (FcPattern
*p
, FcObject object
)
339 i
= FcPatternObjectPosition (p
, object
);
344 /* reallocate array */
345 if (p
->num
+ 1 >= p
->size
)
347 int s
= p
->size
+ 16;
350 FcPatternElt
*e0
= FcPatternElts(p
);
351 e
= (FcPatternElt
*) realloc (e0
, s
* sizeof (FcPatternElt
));
352 if (!e
) /* maybe it was mmapped */
354 e
= malloc(s
* sizeof (FcPatternElt
));
356 memcpy(e
, e0
, p
->num
* sizeof (FcPatternElt
));
360 e
= (FcPatternElt
*) malloc (s
* sizeof (FcPatternElt
));
363 p
->elts_offset
= FcPtrToOffset (p
, e
);
365 FcMemFree (FC_MEM_PATELT
, p
->size
* sizeof (FcPatternElt
));
366 FcMemAlloc (FC_MEM_PATELT
, s
* sizeof (FcPatternElt
));
369 e
[p
->size
].object
= 0;
370 e
[p
->size
].values
= NULL
;
375 e
= FcPatternElts(p
);
379 sizeof (FcPatternElt
) *
385 e
[i
].object
= object
;
389 return FcPatternElts(p
) + i
;
393 FcPatternEqual (const FcPattern
*pa
, const FcPattern
*pb
)
396 FcPatternElt
*pae
, *pbe
;
401 if (pa
->num
!= pb
->num
)
403 pae
= FcPatternElts(pa
);
404 pbe
= FcPatternElts(pb
);
405 for (i
= 0; i
< pa
->num
; i
++)
407 if (pae
[i
].object
!= pbe
[i
].object
)
409 if (!FcValueListEqual (FcPatternEltValues(&pae
[i
]),
410 FcPatternEltValues(&pbe
[i
])))
417 FcPatternHash (const FcPattern
*p
)
421 FcPatternElt
*pe
= FcPatternElts(p
);
423 for (i
= 0; i
< p
->num
; i
++)
425 h
= (((h
<< 1) | (h
>> 31)) ^
427 FcValueListHash (FcPatternEltValues(&pe
[i
])));
433 FcPatternEqualSubset (const FcPattern
*pai
, const FcPattern
*pbi
, const FcObjectSet
*os
)
435 FcPatternElt
*ea
, *eb
;
438 for (i
= 0; i
< os
->nobject
; i
++)
440 FcObject object
= FcObjectFromName (os
->objects
[i
]);
441 ea
= FcPatternObjectFindElt (pai
, object
);
442 eb
= FcPatternObjectFindElt (pbi
, object
);
447 if (!FcValueListEqual (FcPatternEltValues(ea
), FcPatternEltValues(eb
)))
460 FcPatternObjectAddWithBinding (FcPattern
*p
,
463 FcValueBinding binding
,
467 FcValueListPtr
new, *prev
;
469 if (p
->ref
== FC_REF_CONSTANT
)
472 new = malloc (sizeof (FcValueList
));
476 memset(new, 0, sizeof (FcValueList
));
477 FcMemAlloc (FC_MEM_VALLIST
, sizeof (FcValueList
));
479 if (value
.type
== FcTypeString
)
481 value
.u
.s
= FcStrStaticName (value
.u
.s
);
483 value
.type
= FcTypeVoid
;
486 value
= FcValueSave (value
);
487 if (value
.type
== FcTypeVoid
)
491 * Make sure the stored type is valid for built-in objects
493 if (!FcObjectValidType (object
, value
.type
))
497 new->binding
= binding
;
500 e
= FcPatternObjectInsertElt (p
, object
);
506 for (prev
= &e
->values
; *prev
; prev
= &(*prev
)->next
)
512 new->next
= e
->values
;
519 FcValueDestroy (value
);
521 FcMemFree (FC_MEM_VALLIST
, sizeof (FcValueList
));
528 FcPatternObjectAdd (FcPattern
*p
, FcObject object
, FcValue value
, FcBool append
)
530 return FcPatternObjectAddWithBinding (p
, object
,
531 value
, FcValueBindingStrong
, append
);
535 FcPatternAdd (FcPattern
*p
, const char *object
, FcValue value
, FcBool append
)
537 return FcPatternObjectAddWithBinding (p
, FcObjectFromName (object
),
538 value
, FcValueBindingStrong
, append
);
542 FcPatternAddWeak (FcPattern
*p
, const char *object
, FcValue value
, FcBool append
)
544 return FcPatternObjectAddWithBinding (p
, FcObjectFromName (object
),
545 value
, FcValueBindingWeak
, append
);
549 FcPatternObjectDel (FcPattern
*p
, FcObject object
)
553 e
= FcPatternObjectFindElt (p
, object
);
558 FcValueListDestroy (e
->values
);
560 /* shuffle existing ones down */
562 (FcPatternElts(p
) + p
->num
- (e
+ 1)) *
563 sizeof (FcPatternElt
));
565 e
= FcPatternElts(p
) + p
->num
;
572 FcPatternDel (FcPattern
*p
, const char *object
)
574 return FcPatternObjectDel (p
, FcObjectFromName (object
));
578 FcPatternRemove (FcPattern
*p
, const char *object
, int id
)
581 FcValueListPtr
*prev
, l
;
583 e
= FcPatternObjectFindElt (p
, FcObjectFromName (object
));
586 for (prev
= &e
->values
; (l
= *prev
); prev
= &l
->next
)
592 FcValueListDestroy (l
);
594 FcPatternDel (p
, object
);
603 FcPatternObjectAddInteger (FcPattern
*p
, FcObject object
, int i
)
607 v
.type
= FcTypeInteger
;
609 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
613 FcPatternAddInteger (FcPattern
*p
, const char *object
, int i
)
615 return FcPatternObjectAddInteger (p
, FcObjectFromName (object
), i
);
619 FcPatternObjectAddDouble (FcPattern
*p
, FcObject object
, double d
)
623 v
.type
= FcTypeDouble
;
625 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
630 FcPatternAddDouble (FcPattern
*p
, const char *object
, double d
)
632 return FcPatternObjectAddDouble (p
, FcObjectFromName (object
), d
);
636 FcPatternObjectAddString (FcPattern
*p
, FcObject object
, const FcChar8
*s
)
644 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
647 v
.type
= FcTypeString
;
648 v
.u
.s
= FcStrStaticName(s
);
649 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
653 FcPatternAddString (FcPattern
*p
, const char *object
, const FcChar8
*s
)
655 return FcPatternObjectAddString (p
, FcObjectFromName (object
), s
);
659 FcPatternAddMatrix (FcPattern
*p
, const char *object
, const FcMatrix
*s
)
663 v
.type
= FcTypeMatrix
;
665 return FcPatternAdd (p
, object
, v
, FcTrue
);
670 FcPatternObjectAddBool (FcPattern
*p
, FcObject object
, FcBool b
)
676 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
680 FcPatternAddBool (FcPattern
*p
, const char *object
, FcBool b
)
682 return FcPatternObjectAddBool (p
, FcObjectFromName (object
), b
);
686 FcPatternAddCharSet (FcPattern
*p
, const char *object
, const FcCharSet
*c
)
690 v
.type
= FcTypeCharSet
;
691 v
.u
.c
= (FcCharSet
*)c
;
692 return FcPatternAdd (p
, object
, v
, FcTrue
);
696 FcPatternAddFTFace (FcPattern
*p
, const char *object
, const FT_Face f
)
700 v
.type
= FcTypeFTFace
;
702 return FcPatternAdd (p
, object
, v
, FcTrue
);
706 FcPatternAddLangSet (FcPattern
*p
, const char *object
, const FcLangSet
*ls
)
710 v
.type
= FcTypeLangSet
;
711 v
.u
.l
= (FcLangSet
*)ls
;
712 return FcPatternAdd (p
, object
, v
, FcTrue
);
716 FcPatternObjectGet (const FcPattern
*p
, FcObject object
, int id
, FcValue
*v
)
721 e
= FcPatternObjectFindElt (p
, object
);
723 return FcResultNoMatch
;
724 for (l
= FcPatternEltValues(e
); l
; l
= FcValueListNext(l
))
728 *v
= FcValueCanonicalize(&l
->value
);
729 return FcResultMatch
;
737 FcPatternGet (const FcPattern
*p
, const char *object
, int id
, FcValue
*v
)
739 return FcPatternObjectGet (p
, FcObjectFromName (object
), id
, v
);
743 FcPatternObjectGetInteger (const FcPattern
*p
, FcObject object
, int id
, int *i
)
748 r
= FcPatternObjectGet (p
, object
, id
, &v
);
749 if (r
!= FcResultMatch
)
759 return FcResultTypeMismatch
;
761 return FcResultMatch
;
765 FcPatternGetInteger (const FcPattern
*p
, const char *object
, int id
, int *i
)
767 return FcPatternObjectGetInteger (p
, FcObjectFromName (object
), id
, i
);
772 FcPatternObjectGetDouble (const FcPattern
*p
, FcObject object
, int id
, double *d
)
777 r
= FcPatternObjectGet (p
, object
, id
, &v
);
778 if (r
!= FcResultMatch
)
788 return FcResultTypeMismatch
;
790 return FcResultMatch
;
794 FcPatternGetDouble (const FcPattern
*p
, const char *object
, int id
, double *d
)
796 return FcPatternObjectGetDouble (p
, FcObjectFromName (object
), id
, d
);
800 FcPatternObjectGetString (const FcPattern
*p
, FcObject object
, int id
, FcChar8
** s
)
805 r
= FcPatternObjectGet (p
, object
, id
, &v
);
806 if (r
!= FcResultMatch
)
808 if (v
.type
!= FcTypeString
)
809 return FcResultTypeMismatch
;
811 *s
= (FcChar8
*) v
.u
.s
;
812 return FcResultMatch
;
816 FcPatternGetString (const FcPattern
*p
, const char *object
, int id
, FcChar8
** s
)
818 return FcPatternObjectGetString (p
, FcObjectFromName (object
), id
, s
);
822 FcPatternGetMatrix(const FcPattern
*p
, const char *object
, int id
, FcMatrix
**m
)
827 r
= FcPatternGet (p
, object
, id
, &v
);
828 if (r
!= FcResultMatch
)
830 if (v
.type
!= FcTypeMatrix
)
831 return FcResultTypeMismatch
;
832 *m
= (FcMatrix
*)v
.u
.m
;
833 return FcResultMatch
;
838 FcPatternGetBool(const FcPattern
*p
, const char *object
, int id
, FcBool
*b
)
843 r
= FcPatternGet (p
, object
, id
, &v
);
844 if (r
!= FcResultMatch
)
846 if (v
.type
!= FcTypeBool
)
847 return FcResultTypeMismatch
;
849 return FcResultMatch
;
853 FcPatternGetCharSet(const FcPattern
*p
, const char *object
, int id
, FcCharSet
**c
)
858 r
= FcPatternGet (p
, object
, id
, &v
);
859 if (r
!= FcResultMatch
)
861 if (v
.type
!= FcTypeCharSet
)
862 return FcResultTypeMismatch
;
863 *c
= (FcCharSet
*)v
.u
.c
;
864 return FcResultMatch
;
868 FcPatternGetFTFace(const FcPattern
*p
, const char *object
, int id
, FT_Face
*f
)
873 r
= FcPatternGet (p
, object
, id
, &v
);
874 if (r
!= FcResultMatch
)
876 if (v
.type
!= FcTypeFTFace
)
877 return FcResultTypeMismatch
;
878 *f
= (FT_Face
) v
.u
.f
;
879 return FcResultMatch
;
883 FcPatternGetLangSet(const FcPattern
*p
, const char *object
, int id
, FcLangSet
**ls
)
888 r
= FcPatternGet (p
, object
, id
, &v
);
889 if (r
!= FcResultMatch
)
891 if (v
.type
!= FcTypeLangSet
)
892 return FcResultTypeMismatch
;
893 *ls
= (FcLangSet
*)v
.u
.l
;
894 return FcResultMatch
;
898 FcPatternDuplicate (const FcPattern
*orig
)
905 new = FcPatternCreate ();
909 e
= FcPatternElts(orig
);
911 for (i
= 0; i
< orig
->num
; i
++)
913 for (l
= FcPatternEltValues(e
+ i
); l
; l
= FcValueListNext(l
))
914 if (!FcPatternObjectAdd (new, e
[i
].object
,
915 FcValueCanonicalize(&l
->value
),
923 FcPatternDestroy (new);
929 FcPatternReference (FcPattern
*p
)
931 if (p
->ref
!= FC_REF_CONSTANT
)
936 FcPatternVaBuild (FcPattern
*orig
, va_list va
)
940 FcPatternVapBuild (ret
, orig
, va
);
945 FcPatternBuild (FcPattern
*orig
, ...)
950 FcPatternVapBuild (orig
, orig
, va
);
956 * Add all of the elements in 's' to 'p'
959 FcPatternAppend (FcPattern
*p
, FcPattern
*s
)
965 for (i
= 0; i
< s
->num
; i
++)
967 e
= FcPatternElts(s
)+i
;
968 for (v
= FcPatternEltValues(e
); v
; v
= FcValueListNext(v
))
970 if (!FcPatternObjectAddWithBinding (p
, e
->object
,
971 FcValueCanonicalize(&v
->value
),
979 #define OBJECT_HASH_SIZE 31
980 static struct objectBucket
{
981 struct objectBucket
*next
;
983 } *FcObjectBuckets
[OBJECT_HASH_SIZE
];
986 FcStrHashed (const FcChar8
*name
)
988 FcChar32 hash
= FcStringHash (name
);
989 struct objectBucket
**p
;
990 struct objectBucket
*b
;
992 for (p
= &FcObjectBuckets
[hash
% OBJECT_HASH_SIZE
]; (b
= *p
); p
= &(b
->next
))
993 if (b
->hash
== hash
&& !strcmp ((char *)name
, (char *) (b
+ 1)))
999 FcStrStaticName (const FcChar8
*name
)
1001 FcChar32 hash
= FcStringHash (name
);
1002 struct objectBucket
**p
;
1003 struct objectBucket
*b
;
1006 for (p
= &FcObjectBuckets
[hash
% OBJECT_HASH_SIZE
]; (b
= *p
); p
= &(b
->next
))
1007 if (b
->hash
== hash
&& !strcmp ((char *)name
, (char *) (b
+ 1)))
1008 return (FcChar8
*) (b
+ 1);
1009 size
= sizeof (struct objectBucket
) + strlen ((char *)name
) + 1;
1010 b
= malloc (size
+ sizeof (int));
1011 /* workaround glibc bug which reads strlen in groups of 4 */
1012 FcMemAlloc (FC_MEM_STATICSTR
, size
+ sizeof (int));
1017 strcpy ((char *) (b
+ 1), (char *)name
);
1019 return (FcChar8
*) (b
+ 1);
1023 FcStrStaticNameFini (void)
1026 struct objectBucket
*b
, *next
;
1029 for (i
= 0; i
< OBJECT_HASH_SIZE
; i
++)
1031 for (b
= FcObjectBuckets
[i
]; b
; b
= next
)
1034 name
= (char *) (b
+ 1);
1035 size
= sizeof (struct objectBucket
) + strlen (name
) + 1;
1036 FcMemFree (FC_MEM_STATICSTR
, size
);
1039 FcObjectBuckets
[i
] = 0;
1044 FcPatternFini (void)
1046 FcStrStaticNameFini ();
1047 FcObjectStaticNameFini ();
1051 FcPatternSerializeAlloc (FcSerialize
*serialize
, const FcPattern
*pat
)
1054 FcPatternElt
*elts
= FcPatternElts(pat
);
1056 if (!FcSerializeAlloc (serialize
, pat
, sizeof (FcPattern
)))
1058 if (!FcSerializeAlloc (serialize
, elts
, pat
->num
* sizeof (FcPatternElt
)))
1060 for (i
= 0; i
< pat
->num
; i
++)
1061 if (!FcValueListSerializeAlloc (serialize
, FcPatternEltValues(elts
+i
)))
1067 FcPatternSerialize (FcSerialize
*serialize
, const FcPattern
*pat
)
1069 FcPattern
*pat_serialized
;
1070 FcPatternElt
*elts
= FcPatternElts (pat
);
1071 FcPatternElt
*elts_serialized
;
1072 FcValueList
*values_serialized
;
1075 pat_serialized
= FcSerializePtr (serialize
, pat
);
1076 if (!pat_serialized
)
1078 *pat_serialized
= *pat
;
1079 pat_serialized
->size
= pat
->num
;
1080 pat_serialized
->ref
= FC_REF_CONSTANT
;
1082 elts_serialized
= FcSerializePtr (serialize
, elts
);
1083 if (!elts_serialized
)
1086 pat_serialized
->elts_offset
= FcPtrToOffset (pat_serialized
,
1089 for (i
= 0; i
< pat
->num
; i
++)
1091 values_serialized
= FcValueListSerialize (serialize
, FcPatternEltValues (elts
+i
));
1092 if (!values_serialized
)
1094 elts_serialized
[i
].object
= elts
[i
].object
;
1095 elts_serialized
[i
].values
= FcPtrToEncodedOffset (&elts_serialized
[i
],
1099 return pat_serialized
;
1103 FcValueListSerializeAlloc (FcSerialize
*serialize
, const FcValueList
*vl
)
1107 if (!FcSerializeAlloc (serialize
, vl
, sizeof (FcValueList
)))
1109 switch (vl
->value
.type
) {
1111 if (!FcStrSerializeAlloc (serialize
, vl
->value
.u
.s
))
1115 if (!FcCharSetSerializeAlloc (serialize
, vl
->value
.u
.c
))
1119 if (!FcLangSetSerializeAlloc (serialize
, vl
->value
.u
.l
))
1131 FcValueListSerialize (FcSerialize
*serialize
, const FcValueList
*vl
)
1133 FcValueList
*vl_serialized
;
1134 FcChar8
*s_serialized
;
1135 FcCharSet
*c_serialized
;
1136 FcLangSet
*l_serialized
;
1137 FcValueList
*head_serialized
= NULL
;
1138 FcValueList
*prev_serialized
= NULL
;
1142 vl_serialized
= FcSerializePtr (serialize
, vl
);
1146 if (prev_serialized
)
1147 prev_serialized
->next
= FcPtrToEncodedOffset (prev_serialized
,
1151 head_serialized
= vl_serialized
;
1153 vl_serialized
->next
= NULL
;
1154 vl_serialized
->value
= vl
->value
;
1155 switch (vl
->value
.type
) {
1157 s_serialized
= FcStrSerialize (serialize
, vl
->value
.u
.s
);
1160 vl_serialized
->value
.u
.s
= FcPtrToEncodedOffset (&vl_serialized
->value
,
1165 c_serialized
= FcCharSetSerialize (serialize
, vl
->value
.u
.c
);
1168 vl_serialized
->value
.u
.c
= FcPtrToEncodedOffset (&vl_serialized
->value
,
1173 l_serialized
= FcLangSetSerialize (serialize
, vl
->value
.u
.l
);
1176 vl_serialized
->value
.u
.l
= FcPtrToEncodedOffset (&vl_serialized
->value
,
1185 return head_serialized
;