Imported Upstream version 2.13.0
[platform/upstream/fontconfig.git] / fontconfig / fcprivate.h
1 /*
2  * fontconfig/fontconfig/fcprivate.h
3  *
4  * Copyright © 2001 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 #ifndef _FCPRIVATE_H_
26 #define _FCPRIVATE_H_
27
28 /*
29  * I tried this with functions that took va_list* arguments
30  * but portability concerns made me change these functions
31  * into macros (sigh).
32  */
33
34 #define FcPatternVapBuild(result, orig, va)                         \
35 {                                                                   \
36     FcPattern   *__p__ = (orig);                                    \
37     const char  *__o__;                                             \
38     FcValue     __v__;                                              \
39                                                                     \
40     if (!__p__)                                                     \
41     {                                                               \
42         __p__ = FcPatternCreate ();                                 \
43         if (!__p__)                                                 \
44             goto _FcPatternVapBuild_bail0;                          \
45     }                                                               \
46     for (;;)                                                        \
47     {                                                               \
48         __o__ = va_arg (va, const char *);                          \
49         if (!__o__)                                                 \
50             break;                                                  \
51         __v__.type = va_arg (va, int);                              \
52         switch (__v__.type) {                                       \
53         case FcTypeUnknown:                                         \
54         case FcTypeVoid:                                            \
55             goto _FcPatternVapBuild_bail1;                          \
56         case FcTypeInteger:                                         \
57             __v__.u.i = va_arg (va, int);                           \
58             break;                                                  \
59         case FcTypeDouble:                                          \
60             __v__.u.d = va_arg (va, double);                        \
61             break;                                                  \
62         case FcTypeString:                                          \
63             __v__.u.s = va_arg (va, const FcChar8 *);               \
64             break;                                                  \
65         case FcTypeBool:                                            \
66             __v__.u.b = va_arg (va, FcBool);                        \
67             break;                                                  \
68         case FcTypeMatrix:                                          \
69             __v__.u.m = va_arg (va, const FcMatrix *);              \
70             break;                                                  \
71         case FcTypeCharSet:                                         \
72             __v__.u.c = va_arg (va, const FcCharSet *);             \
73             break;                                                  \
74         case FcTypeFTFace:                                          \
75             __v__.u.f = va_arg (va, FT_Face);                       \
76             break;                                                  \
77         case FcTypeLangSet:                                         \
78             __v__.u.l = va_arg (va, const FcLangSet *);             \
79             break;                                                  \
80         case FcTypeRange:                                           \
81             __v__.u.r = va_arg (va, const FcRange *);               \
82             break;                                                  \
83         }                                                           \
84         if (!FcPatternAdd (__p__, __o__, __v__, FcTrue))            \
85             goto _FcPatternVapBuild_bail1;                          \
86     }                                                               \
87     result = __p__;                                                 \
88     goto _FcPatternVapBuild_return;                                 \
89                                                                     \
90 _FcPatternVapBuild_bail1:                                           \
91     if (!orig)                                                      \
92         FcPatternDestroy (__p__);                                   \
93 _FcPatternVapBuild_bail0:                                           \
94     result = (void*)0;                                              \
95                                                                     \
96 _FcPatternVapBuild_return:                                          \
97     ;                                                               \
98 }
99
100
101 #define FcObjectSetVapBuild(__ret__, __first__, __va__)                 \
102 {                                                                       \
103     FcObjectSet    *__os__;                                             \
104     const char      *__ob__;                                            \
105                                                                         \
106     __ret__ = 0;                                                        \
107     __os__ = FcObjectSetCreate ();                                      \
108     if (!__os__)                                                        \
109         goto _FcObjectSetVapBuild_bail0;                                \
110     __ob__ = __first__;                                                 \
111     while (__ob__)                                                      \
112     {                                                                   \
113         if (!FcObjectSetAdd (__os__, __ob__))                           \
114             goto _FcObjectSetVapBuild_bail1;                            \
115         __ob__ = va_arg (__va__, const char *);                         \
116     }                                                                   \
117     __ret__ = __os__;                                                   \
118                                                                         \
119 _FcObjectSetVapBuild_bail1:                                             \
120     if (!__ret__ && __os__)                                             \
121         FcObjectSetDestroy (__os__);                                    \
122 _FcObjectSetVapBuild_bail0:                                             \
123     ;                                                                   \
124 }
125
126 #ifndef FC_ATTRIBUTE_VISIBILITY_HIDDEN
127 #define FC_ATTRIBUTE_VISIBILITY_HIDDEN __attribute((visibility("hidden")))
128 #endif
129
130 #ifndef FC_ATTRIBUTE_VISIBILITY_EXPORT
131 #define FC_ATTRIBUTE_VISIBILITY_EXPORT __attribute((visibility("default")))
132 #endif
133
134 #endif /* _FCPRIVATE_H_ */