jpayne@69: /* jpayne@69: * fontconfig/fontconfig/fcprivate.h jpayne@69: * jpayne@69: * Copyright © 2001 Keith Packard jpayne@69: * jpayne@69: * Permission to use, copy, modify, distribute, and sell this software and its jpayne@69: * documentation for any purpose is hereby granted without fee, provided that jpayne@69: * the above copyright notice appear in all copies and that both that jpayne@69: * copyright notice and this permission notice appear in supporting jpayne@69: * documentation, and that the name of the author(s) not be used in jpayne@69: * advertising or publicity pertaining to distribution of the software without jpayne@69: * specific, written prior permission. The authors make no jpayne@69: * representations about the suitability of this software for any purpose. It jpayne@69: * is provided "as is" without express or implied warranty. jpayne@69: * jpayne@69: * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, jpayne@69: * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO jpayne@69: * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR jpayne@69: * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, jpayne@69: * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER jpayne@69: * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR jpayne@69: * PERFORMANCE OF THIS SOFTWARE. jpayne@69: */ jpayne@69: jpayne@69: #ifndef _FCPRIVATE_H_ jpayne@69: #define _FCPRIVATE_H_ jpayne@69: jpayne@69: /* jpayne@69: * I tried this with functions that took va_list* arguments jpayne@69: * but portability concerns made me change these functions jpayne@69: * into macros (sigh). jpayne@69: */ jpayne@69: jpayne@69: #define FcPatternVapBuild(result, orig, va) \ jpayne@69: { \ jpayne@69: FcPattern *__p__ = (orig); \ jpayne@69: const char *__o__; \ jpayne@69: FcValue __v__; \ jpayne@69: \ jpayne@69: if (!__p__) \ jpayne@69: { \ jpayne@69: __p__ = FcPatternCreate (); \ jpayne@69: if (!__p__) \ jpayne@69: goto _FcPatternVapBuild_bail0; \ jpayne@69: } \ jpayne@69: for (;;) \ jpayne@69: { \ jpayne@69: __o__ = va_arg (va, const char *); \ jpayne@69: if (!__o__) \ jpayne@69: break; \ jpayne@69: __v__.type = va_arg (va, int); \ jpayne@69: switch (__v__.type) { \ jpayne@69: case FcTypeUnknown: \ jpayne@69: case FcTypeVoid: \ jpayne@69: goto _FcPatternVapBuild_bail1; \ jpayne@69: case FcTypeInteger: \ jpayne@69: __v__.u.i = va_arg (va, int); \ jpayne@69: break; \ jpayne@69: case FcTypeDouble: \ jpayne@69: __v__.u.d = va_arg (va, double); \ jpayne@69: break; \ jpayne@69: case FcTypeString: \ jpayne@69: __v__.u.s = va_arg (va, const FcChar8 *); \ jpayne@69: break; \ jpayne@69: case FcTypeBool: \ jpayne@69: __v__.u.b = va_arg (va, FcBool); \ jpayne@69: break; \ jpayne@69: case FcTypeMatrix: \ jpayne@69: __v__.u.m = va_arg (va, const FcMatrix *); \ jpayne@69: break; \ jpayne@69: case FcTypeCharSet: \ jpayne@69: __v__.u.c = va_arg (va, const FcCharSet *); \ jpayne@69: break; \ jpayne@69: case FcTypeFTFace: \ jpayne@69: __v__.u.f = va_arg (va, FT_Face); \ jpayne@69: break; \ jpayne@69: case FcTypeLangSet: \ jpayne@69: __v__.u.l = va_arg (va, const FcLangSet *); \ jpayne@69: break; \ jpayne@69: case FcTypeRange: \ jpayne@69: __v__.u.r = va_arg (va, const FcRange *); \ jpayne@69: break; \ jpayne@69: } \ jpayne@69: if (!FcPatternAdd (__p__, __o__, __v__, FcTrue)) \ jpayne@69: goto _FcPatternVapBuild_bail1; \ jpayne@69: } \ jpayne@69: result = __p__; \ jpayne@69: goto _FcPatternVapBuild_return; \ jpayne@69: \ jpayne@69: _FcPatternVapBuild_bail1: \ jpayne@69: if (!orig) \ jpayne@69: FcPatternDestroy (__p__); \ jpayne@69: _FcPatternVapBuild_bail0: \ jpayne@69: result = (void*)0; \ jpayne@69: \ jpayne@69: _FcPatternVapBuild_return: \ jpayne@69: ; \ jpayne@69: } jpayne@69: jpayne@69: jpayne@69: #define FcObjectSetVapBuild(__ret__, __first__, __va__) \ jpayne@69: { \ jpayne@69: FcObjectSet *__os__; \ jpayne@69: const char *__ob__; \ jpayne@69: \ jpayne@69: __ret__ = 0; \ jpayne@69: __os__ = FcObjectSetCreate (); \ jpayne@69: if (!__os__) \ jpayne@69: goto _FcObjectSetVapBuild_bail0; \ jpayne@69: __ob__ = __first__; \ jpayne@69: while (__ob__) \ jpayne@69: { \ jpayne@69: if (!FcObjectSetAdd (__os__, __ob__)) \ jpayne@69: goto _FcObjectSetVapBuild_bail1; \ jpayne@69: __ob__ = va_arg (__va__, const char *); \ jpayne@69: } \ jpayne@69: __ret__ = __os__; \ jpayne@69: \ jpayne@69: _FcObjectSetVapBuild_bail1: \ jpayne@69: if (!__ret__ && __os__) \ jpayne@69: FcObjectSetDestroy (__os__); \ jpayne@69: _FcObjectSetVapBuild_bail0: \ jpayne@69: ; \ jpayne@69: } jpayne@69: jpayne@69: #ifndef FC_ATTRIBUTE_VISIBILITY_HIDDEN jpayne@69: #define FC_ATTRIBUTE_VISIBILITY_HIDDEN __attribute((visibility("hidden"))) jpayne@69: #endif jpayne@69: jpayne@69: #ifndef FC_ATTRIBUTE_VISIBILITY_EXPORT jpayne@69: #define FC_ATTRIBUTE_VISIBILITY_EXPORT __attribute((visibility("default"))) jpayne@69: #endif jpayne@69: jpayne@69: #endif /* _FCPRIVATE_H_ */