Leave room for null terminators in arrays
[platform/upstream/fontconfig.git] / src / fcfs.c
1 /*
2  * fontconfig/src/fcfs.c
3  *
4  * Copyright © 2000 Keith Packard
5  *
6  * Permission to use, copy, modify, distribute, and sell this software and its
7  * documentation for any purpose is hereby granted without fee, provided that
8  * the above copyright notice appear in all copies and that both that
9  * copyright notice and this permission notice appear in supporting
10  * documentation, and that the name of the author(s) not be used in
11  * advertising or publicity pertaining to distribution of the software without
12  * specific, written prior permission.  The authors make no
13  * representations about the suitability of this software for any purpose.  It
14  * is provided "as is" without express or implied warranty.
15  *
16  * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
17  * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
18  * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
19  * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
20  * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
21  * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
22  * PERFORMANCE OF THIS SOFTWARE.
23  */
24
25 #include "fcint.h"
26 #include <stdlib.h>
27
28 FcFontSet *
29 FcFontSetCreate (void)
30 {
31     FcFontSet   *s;
32
33     s = (FcFontSet *) malloc (sizeof (FcFontSet));
34     if (!s)
35         return 0;
36     s->nfont = 0;
37     s->sfont = 0;
38     s->fonts = 0;
39     return s;
40 }
41
42 void
43 FcFontSetDestroy (FcFontSet *s)
44 {
45     int     i;
46
47     for (i = 0; i < s->nfont; i++)
48         FcPatternDestroy (s->fonts[i]);
49     if (s->fonts)
50         free (s->fonts);
51     free (s);
52 }
53
54 FcBool
55 FcFontSetAdd (FcFontSet *s, FcPattern *font)
56 {
57     FcPattern   **f;
58     int         sfont;
59
60     if (s->nfont == s->sfont)
61     {
62         sfont = s->sfont + 32;
63         if (s->fonts)
64             f = (FcPattern **) realloc (s->fonts, sfont * sizeof (FcPattern *));
65         else
66             f = (FcPattern **) malloc (sfont * sizeof (FcPattern *));
67         if (!f)
68             return FcFalse;
69         s->sfont = sfont;
70         s->fonts = f;
71     }
72     s->fonts[s->nfont++] = font;
73     return FcTrue;
74 }
75
76 FcBool
77 FcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s)
78 {
79     int i;
80
81     if (!FcSerializeAlloc (serialize, s, sizeof (FcFontSet)))
82         return FcFalse;
83     if (!FcSerializeAlloc (serialize, s->fonts, s->nfont * sizeof (FcPattern *)))
84         return FcFalse;
85     for (i = 0; i < s->nfont; i++)
86     {
87         if (!FcPatternSerializeAlloc (serialize, s->fonts[i]))
88             return FcFalse;
89     }
90     return FcTrue;
91 }
92
93 FcFontSet *
94 FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s)
95 {
96     int         i;
97     FcFontSet   *s_serialize;
98     FcPattern   **fonts_serialize;
99     FcPattern   *p_serialize;
100
101     s_serialize = FcSerializePtr (serialize, s);
102     if (!s_serialize)
103         return NULL;
104     *s_serialize = *s;
105     s_serialize->sfont = s_serialize->nfont;
106
107     fonts_serialize = FcSerializePtr (serialize, s->fonts);
108     if (!fonts_serialize)
109         return NULL;
110     s_serialize->fonts = FcPtrToEncodedOffset (s_serialize,
111                                                fonts_serialize, FcPattern *);
112
113     for (i = 0; i < s->nfont; i++)
114     {
115         p_serialize = FcPatternSerialize (serialize, s->fonts[i]);
116         if (!p_serialize)
117             return NULL;
118         fonts_serialize[i] = FcPtrToEncodedOffset (s_serialize,
119                                                    p_serialize,
120                                                    FcPattern);
121     }
122
123     return s_serialize;
124 }
125 #define __fcfs__
126 #include "fcaliastail.h"
127 #undef __fcfs__