]>
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
))
495 if (FcDebug() & FC_DBG_OBJTYPES
)
497 printf ("FcPattern object %s does not accept value ",
498 FcObjectName (object
));
499 FcValuePrint (value
);
505 new->binding
= binding
;
508 e
= FcPatternObjectInsertElt (p
, object
);
514 for (prev
= &e
->values
; *prev
; prev
= &(*prev
)->next
)
520 new->next
= e
->values
;
527 FcValueDestroy (value
);
529 FcMemFree (FC_MEM_VALLIST
, sizeof (FcValueList
));
536 FcPatternObjectAdd (FcPattern
*p
, FcObject object
, FcValue value
, FcBool append
)
538 return FcPatternObjectAddWithBinding (p
, object
,
539 value
, FcValueBindingStrong
, append
);
543 FcPatternAdd (FcPattern
*p
, const char *object
, FcValue value
, FcBool append
)
545 return FcPatternObjectAddWithBinding (p
, FcObjectFromName (object
),
546 value
, FcValueBindingStrong
, append
);
550 FcPatternAddWeak (FcPattern
*p
, const char *object
, FcValue value
, FcBool append
)
552 return FcPatternObjectAddWithBinding (p
, FcObjectFromName (object
),
553 value
, FcValueBindingWeak
, append
);
557 FcPatternObjectDel (FcPattern
*p
, FcObject object
)
561 e
= FcPatternObjectFindElt (p
, object
);
566 FcValueListDestroy (e
->values
);
568 /* shuffle existing ones down */
570 (FcPatternElts(p
) + p
->num
- (e
+ 1)) *
571 sizeof (FcPatternElt
));
573 e
= FcPatternElts(p
) + p
->num
;
580 FcPatternDel (FcPattern
*p
, const char *object
)
582 return FcPatternObjectDel (p
, FcObjectFromName (object
));
586 FcPatternRemove (FcPattern
*p
, const char *object
, int id
)
589 FcValueListPtr
*prev
, l
;
591 e
= FcPatternObjectFindElt (p
, FcObjectFromName (object
));
594 for (prev
= &e
->values
; (l
= *prev
); prev
= &l
->next
)
600 FcValueListDestroy (l
);
602 FcPatternDel (p
, object
);
611 FcPatternObjectAddInteger (FcPattern
*p
, FcObject object
, int i
)
615 v
.type
= FcTypeInteger
;
617 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
621 FcPatternAddInteger (FcPattern
*p
, const char *object
, int i
)
623 return FcPatternObjectAddInteger (p
, FcObjectFromName (object
), i
);
627 FcPatternObjectAddDouble (FcPattern
*p
, FcObject object
, double d
)
631 v
.type
= FcTypeDouble
;
633 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
638 FcPatternAddDouble (FcPattern
*p
, const char *object
, double d
)
640 return FcPatternObjectAddDouble (p
, FcObjectFromName (object
), d
);
644 FcPatternObjectAddString (FcPattern
*p
, FcObject object
, const FcChar8
*s
)
652 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
655 v
.type
= FcTypeString
;
656 v
.u
.s
= FcStrStaticName(s
);
657 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
661 FcPatternAddString (FcPattern
*p
, const char *object
, const FcChar8
*s
)
663 return FcPatternObjectAddString (p
, FcObjectFromName (object
), s
);
667 FcPatternAddMatrix (FcPattern
*p
, const char *object
, const FcMatrix
*s
)
671 v
.type
= FcTypeMatrix
;
673 return FcPatternAdd (p
, object
, v
, FcTrue
);
678 FcPatternObjectAddBool (FcPattern
*p
, FcObject object
, FcBool b
)
684 return FcPatternObjectAdd (p
, object
, v
, FcTrue
);
688 FcPatternAddBool (FcPattern
*p
, const char *object
, FcBool b
)
690 return FcPatternObjectAddBool (p
, FcObjectFromName (object
), b
);
694 FcPatternAddCharSet (FcPattern
*p
, const char *object
, const FcCharSet
*c
)
698 v
.type
= FcTypeCharSet
;
699 v
.u
.c
= (FcCharSet
*)c
;
700 return FcPatternAdd (p
, object
, v
, FcTrue
);
704 FcPatternAddFTFace (FcPattern
*p
, const char *object
, const FT_Face f
)
708 v
.type
= FcTypeFTFace
;
710 return FcPatternAdd (p
, object
, v
, FcTrue
);
714 FcPatternAddLangSet (FcPattern
*p
, const char *object
, const FcLangSet
*ls
)
718 v
.type
= FcTypeLangSet
;
719 v
.u
.l
= (FcLangSet
*)ls
;
720 return FcPatternAdd (p
, object
, v
, FcTrue
);
724 FcPatternObjectGet (const FcPattern
*p
, FcObject object
, int id
, FcValue
*v
)
729 e
= FcPatternObjectFindElt (p
, object
);
731 return FcResultNoMatch
;
732 for (l
= FcPatternEltValues(e
); l
; l
= FcValueListNext(l
))
736 *v
= FcValueCanonicalize(&l
->value
);
737 return FcResultMatch
;
745 FcPatternGet (const FcPattern
*p
, const char *object
, int id
, FcValue
*v
)
747 return FcPatternObjectGet (p
, FcObjectFromName (object
), id
, v
);
751 FcPatternObjectGetInteger (const FcPattern
*p
, FcObject object
, int id
, int *i
)
756 r
= FcPatternObjectGet (p
, object
, id
, &v
);
757 if (r
!= FcResultMatch
)
767 return FcResultTypeMismatch
;
769 return FcResultMatch
;
773 FcPatternGetInteger (const FcPattern
*p
, const char *object
, int id
, int *i
)
775 return FcPatternObjectGetInteger (p
, FcObjectFromName (object
), id
, i
);
780 FcPatternObjectGetDouble (const FcPattern
*p
, FcObject object
, int id
, double *d
)
785 r
= FcPatternObjectGet (p
, object
, id
, &v
);
786 if (r
!= FcResultMatch
)
796 return FcResultTypeMismatch
;
798 return FcResultMatch
;
802 FcPatternGetDouble (const FcPattern
*p
, const char *object
, int id
, double *d
)
804 return FcPatternObjectGetDouble (p
, FcObjectFromName (object
), id
, d
);
808 FcPatternObjectGetString (const FcPattern
*p
, FcObject object
, int id
, FcChar8
** s
)
813 r
= FcPatternObjectGet (p
, object
, id
, &v
);
814 if (r
!= FcResultMatch
)
816 if (v
.type
!= FcTypeString
)
817 return FcResultTypeMismatch
;
819 *s
= (FcChar8
*) v
.u
.s
;
820 return FcResultMatch
;
824 FcPatternGetString (const FcPattern
*p
, const char *object
, int id
, FcChar8
** s
)
826 return FcPatternObjectGetString (p
, FcObjectFromName (object
), id
, s
);
830 FcPatternGetMatrix(const FcPattern
*p
, const char *object
, int id
, FcMatrix
**m
)
835 r
= FcPatternGet (p
, object
, id
, &v
);
836 if (r
!= FcResultMatch
)
838 if (v
.type
!= FcTypeMatrix
)
839 return FcResultTypeMismatch
;
840 *m
= (FcMatrix
*)v
.u
.m
;
841 return FcResultMatch
;
846 FcPatternGetBool(const FcPattern
*p
, const char *object
, int id
, FcBool
*b
)
851 r
= FcPatternGet (p
, object
, id
, &v
);
852 if (r
!= FcResultMatch
)
854 if (v
.type
!= FcTypeBool
)
855 return FcResultTypeMismatch
;
857 return FcResultMatch
;
861 FcPatternGetCharSet(const FcPattern
*p
, const char *object
, int id
, FcCharSet
**c
)
866 r
= FcPatternGet (p
, object
, id
, &v
);
867 if (r
!= FcResultMatch
)
869 if (v
.type
!= FcTypeCharSet
)
870 return FcResultTypeMismatch
;
871 *c
= (FcCharSet
*)v
.u
.c
;
872 return FcResultMatch
;
876 FcPatternGetFTFace(const FcPattern
*p
, const char *object
, int id
, FT_Face
*f
)
881 r
= FcPatternGet (p
, object
, id
, &v
);
882 if (r
!= FcResultMatch
)
884 if (v
.type
!= FcTypeFTFace
)
885 return FcResultTypeMismatch
;
886 *f
= (FT_Face
) v
.u
.f
;
887 return FcResultMatch
;
891 FcPatternGetLangSet(const FcPattern
*p
, const char *object
, int id
, FcLangSet
**ls
)
896 r
= FcPatternGet (p
, object
, id
, &v
);
897 if (r
!= FcResultMatch
)
899 if (v
.type
!= FcTypeLangSet
)
900 return FcResultTypeMismatch
;
901 *ls
= (FcLangSet
*)v
.u
.l
;
902 return FcResultMatch
;
906 FcPatternDuplicate (const FcPattern
*orig
)
913 new = FcPatternCreate ();
917 e
= FcPatternElts(orig
);
919 for (i
= 0; i
< orig
->num
; i
++)
921 for (l
= FcPatternEltValues(e
+ i
); l
; l
= FcValueListNext(l
))
922 if (!FcPatternObjectAdd (new, e
[i
].object
,
923 FcValueCanonicalize(&l
->value
),
931 FcPatternDestroy (new);
937 FcPatternReference (FcPattern
*p
)
939 if (p
->ref
!= FC_REF_CONSTANT
)
944 FcPatternVaBuild (FcPattern
*orig
, va_list va
)
948 FcPatternVapBuild (ret
, orig
, va
);
953 FcPatternBuild (FcPattern
*orig
, ...)
958 FcPatternVapBuild (orig
, orig
, va
);
964 * Add all of the elements in 's' to 'p'
967 FcPatternAppend (FcPattern
*p
, FcPattern
*s
)
973 for (i
= 0; i
< s
->num
; i
++)
975 e
= FcPatternElts(s
)+i
;
976 for (v
= FcPatternEltValues(e
); v
; v
= FcValueListNext(v
))
978 if (!FcPatternObjectAddWithBinding (p
, e
->object
,
979 FcValueCanonicalize(&v
->value
),
987 #define OBJECT_HASH_SIZE 31
988 static struct objectBucket
{
989 struct objectBucket
*next
;
991 } *FcObjectBuckets
[OBJECT_HASH_SIZE
];
994 FcStrHashed (const FcChar8
*name
)
996 FcChar32 hash
= FcStringHash (name
);
997 struct objectBucket
**p
;
998 struct objectBucket
*b
;
1000 for (p
= &FcObjectBuckets
[hash
% OBJECT_HASH_SIZE
]; (b
= *p
); p
= &(b
->next
))
1001 if (b
->hash
== hash
&& !strcmp ((char *)name
, (char *) (b
+ 1)))
1007 FcStrStaticName (const FcChar8
*name
)
1009 FcChar32 hash
= FcStringHash (name
);
1010 struct objectBucket
**p
;
1011 struct objectBucket
*b
;
1014 for (p
= &FcObjectBuckets
[hash
% OBJECT_HASH_SIZE
]; (b
= *p
); p
= &(b
->next
))
1015 if (b
->hash
== hash
&& !strcmp ((char *)name
, (char *) (b
+ 1)))
1016 return (FcChar8
*) (b
+ 1);
1017 size
= sizeof (struct objectBucket
) + strlen ((char *)name
) + 1;
1018 b
= malloc (size
+ sizeof (int));
1019 /* workaround glibc bug which reads strlen in groups of 4 */
1020 FcMemAlloc (FC_MEM_STATICSTR
, size
+ sizeof (int));
1025 strcpy ((char *) (b
+ 1), (char *)name
);
1027 return (FcChar8
*) (b
+ 1);
1031 FcStrStaticNameFini (void)
1034 struct objectBucket
*b
, *next
;
1037 for (i
= 0; i
< OBJECT_HASH_SIZE
; i
++)
1039 for (b
= FcObjectBuckets
[i
]; b
; b
= next
)
1042 name
= (char *) (b
+ 1);
1043 size
= sizeof (struct objectBucket
) + strlen (name
) + 1;
1044 FcMemFree (FC_MEM_STATICSTR
, size
);
1047 FcObjectBuckets
[i
] = 0;
1052 FcPatternFini (void)
1054 FcStrStaticNameFini ();
1059 FcPatternSerializeAlloc (FcSerialize
*serialize
, const FcPattern
*pat
)
1062 FcPatternElt
*elts
= FcPatternElts(pat
);
1064 if (!FcSerializeAlloc (serialize
, pat
, sizeof (FcPattern
)))
1066 if (!FcSerializeAlloc (serialize
, elts
, pat
->num
* sizeof (FcPatternElt
)))
1068 for (i
= 0; i
< pat
->num
; i
++)
1069 if (!FcValueListSerializeAlloc (serialize
, FcPatternEltValues(elts
+i
)))
1075 FcPatternSerialize (FcSerialize
*serialize
, const FcPattern
*pat
)
1077 FcPattern
*pat_serialized
;
1078 FcPatternElt
*elts
= FcPatternElts (pat
);
1079 FcPatternElt
*elts_serialized
;
1080 FcValueList
*values_serialized
;
1083 pat_serialized
= FcSerializePtr (serialize
, pat
);
1084 if (!pat_serialized
)
1086 *pat_serialized
= *pat
;
1087 pat_serialized
->size
= pat
->num
;
1088 pat_serialized
->ref
= FC_REF_CONSTANT
;
1090 elts_serialized
= FcSerializePtr (serialize
, elts
);
1091 if (!elts_serialized
)
1094 pat_serialized
->elts_offset
= FcPtrToOffset (pat_serialized
,
1097 for (i
= 0; i
< pat
->num
; i
++)
1099 values_serialized
= FcValueListSerialize (serialize
, FcPatternEltValues (elts
+i
));
1100 if (!values_serialized
)
1102 elts_serialized
[i
].object
= elts
[i
].object
;
1103 elts_serialized
[i
].values
= FcPtrToEncodedOffset (&elts_serialized
[i
],
1107 if (FcDebug() & FC_DBG_CACHEV
) {
1108 printf ("Raw pattern:\n");
1109 FcPatternPrint (pat
);
1110 printf ("Serialized pattern:\n");
1111 FcPatternPrint (pat_serialized
);
1114 return pat_serialized
;
1118 FcValueListSerializeAlloc (FcSerialize
*serialize
, const FcValueList
*vl
)
1122 if (!FcSerializeAlloc (serialize
, vl
, sizeof (FcValueList
)))
1124 switch (vl
->value
.type
) {
1126 if (!FcStrSerializeAlloc (serialize
, vl
->value
.u
.s
))
1130 if (!FcCharSetSerializeAlloc (serialize
, vl
->value
.u
.c
))
1134 if (!FcLangSetSerializeAlloc (serialize
, vl
->value
.u
.l
))
1146 FcValueListSerialize (FcSerialize
*serialize
, const FcValueList
*vl
)
1148 FcValueList
*vl_serialized
;
1149 FcChar8
*s_serialized
;
1150 FcCharSet
*c_serialized
;
1151 FcLangSet
*l_serialized
;
1152 FcValueList
*head_serialized
= NULL
;
1153 FcValueList
*prev_serialized
= NULL
;
1157 vl_serialized
= FcSerializePtr (serialize
, vl
);
1161 if (prev_serialized
)
1162 prev_serialized
->next
= FcPtrToEncodedOffset (prev_serialized
,
1166 head_serialized
= vl_serialized
;
1168 vl_serialized
->next
= NULL
;
1169 vl_serialized
->value
= vl
->value
;
1170 switch (vl
->value
.type
) {
1172 s_serialized
= FcStrSerialize (serialize
, vl
->value
.u
.s
);
1175 vl_serialized
->value
.u
.s
= FcPtrToEncodedOffset (&vl_serialized
->value
,
1180 c_serialized
= FcCharSetSerialize (serialize
, vl
->value
.u
.c
);
1183 vl_serialized
->value
.u
.c
= FcPtrToEncodedOffset (&vl_serialized
->value
,
1188 l_serialized
= FcLangSetSerialize (serialize
, vl
->value
.u
.l
);
1191 vl_serialized
->value
.u
.l
= FcPtrToEncodedOffset (&vl_serialized
->value
,
1198 prev_serialized
= vl_serialized
;
1201 return head_serialized
;