fcint.h revision b2a52337
12c393a42Smrg/*
20d39df38Smrg * fontconfig/src/fcint.h
32c393a42Smrg *
42c393a42Smrg * Copyright © 2000 Keith Packard
52c393a42Smrg *
62c393a42Smrg * Permission to use, copy, modify, distribute, and sell this software and its
72c393a42Smrg * documentation for any purpose is hereby granted without fee, provided that
82c393a42Smrg * the above copyright notice appear in all copies and that both that
92c393a42Smrg * copyright notice and this permission notice appear in supporting
10898dab68Smrg * documentation, and that the name of the author(s) not be used in
112c393a42Smrg * advertising or publicity pertaining to distribution of the software without
12898dab68Smrg * specific, written prior permission.  The authors make no
132c393a42Smrg * representations about the suitability of this software for any purpose.  It
142c393a42Smrg * is provided "as is" without express or implied warranty.
152c393a42Smrg *
160d39df38Smrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
180d39df38Smrg * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
192c393a42Smrg * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
202c393a42Smrg * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
212c393a42Smrg * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
222c393a42Smrg * PERFORMANCE OF THIS SOFTWARE.
232c393a42Smrg */
242c393a42Smrg
252c393a42Smrg#ifndef _FCINT_H_
262c393a42Smrg#define _FCINT_H_
272c393a42Smrg
282c393a42Smrg#ifdef HAVE_CONFIG_H
292c393a42Smrg#include <config.h>
302c393a42Smrg#endif
312c393a42Smrg
325e61939bSmrg#include "fcstdint.h"
335e61939bSmrg
342c393a42Smrg#include <stdlib.h>
352c393a42Smrg#include <stdio.h>
362c393a42Smrg#include <string.h>
372c393a42Smrg#include <ctype.h>
385e61939bSmrg#include <assert.h>
392c393a42Smrg#include <errno.h>
40d91dd368Smrg#include <limits.h>
412c393a42Smrg#include <unistd.h>
422c393a42Smrg#include <stddef.h>
432c393a42Smrg#include <sys/types.h>
442c393a42Smrg#include <sys/stat.h>
452c393a42Smrg#include <time.h>
462c393a42Smrg#include <fontconfig/fontconfig.h>
472c393a42Smrg#include <fontconfig/fcprivate.h>
482c393a42Smrg#include "fcdeprecate.h"
495e61939bSmrg#include "fcmutex.h"
505e61939bSmrg#include "fcatomic.h"
512c393a42Smrg
522c393a42Smrg#ifndef FC_CONFIG_PATH
532c393a42Smrg#define FC_CONFIG_PATH "fonts.conf"
542c393a42Smrg#endif
552c393a42Smrg
562c393a42Smrg#ifdef _WIN32
575e61939bSmrg#  include "fcwindows.h"
58898dab68Smrgtypedef UINT (WINAPI *pfnGetSystemWindowsDirectory)(LPSTR, UINT);
59898dab68Smrgtypedef HRESULT (WINAPI *pfnSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
60898dab68Smrgextern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory;
61898dab68Smrgextern pfnSHGetFolderPathA pSHGetFolderPathA;
62898dab68Smrg#  define FC_SEARCH_PATH_SEPARATOR ';'
63898dab68Smrg#  define FC_DIR_SEPARATOR         '\\'
64898dab68Smrg#  define FC_DIR_SEPARATOR_S       "\\"
652c393a42Smrg#else
66898dab68Smrg#  define FC_SEARCH_PATH_SEPARATOR ':'
67898dab68Smrg#  define FC_DIR_SEPARATOR         '/'
68898dab68Smrg#  define FC_DIR_SEPARATOR_S       "/"
692c393a42Smrg#endif
702c393a42Smrg
715e61939bSmrg#if __GNUC__ >= 4
725e61939bSmrg#define FC_UNUSED	__attribute__((unused))
735e61939bSmrg#else
745e61939bSmrg#define FC_UNUSED
755e61939bSmrg#endif
765e61939bSmrg
772c393a42Smrg#define FC_DBG_MATCH	1
782c393a42Smrg#define FC_DBG_MATCHV	2
792c393a42Smrg#define FC_DBG_EDIT	4
802c393a42Smrg#define FC_DBG_FONTSET	8
812c393a42Smrg#define FC_DBG_CACHE	16
822c393a42Smrg#define FC_DBG_CACHEV	32
832c393a42Smrg#define FC_DBG_PARSE	64
842c393a42Smrg#define FC_DBG_SCAN	128
852c393a42Smrg#define FC_DBG_SCANV	256
862c393a42Smrg#define FC_DBG_CONFIG	1024
872c393a42Smrg#define FC_DBG_LANGSET	2048
882c393a42Smrg
89d91dd368Smrg#define _FC_ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1] FC_UNUSED
90898dab68Smrg#define _FC_ASSERT_STATIC0(_line, _cond) _FC_ASSERT_STATIC1 (_line, (_cond))
91898dab68Smrg#define FC_ASSERT_STATIC(_cond) _FC_ASSERT_STATIC0 (__LINE__, (_cond))
92898dab68Smrg
930d39df38Smrg#define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
940d39df38Smrg#define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
950d39df38Smrg#define FC_ABS(a)   ((a) < 0 ? -(a) : (a))
962c393a42Smrg
972c393a42Smrg/* slim_internal.h */
982c393a42Smrg#if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
992c393a42Smrg#define FcPrivate		__attribute__((__visibility__("hidden")))
1002c393a42Smrg#define HAVE_GNUC_ATTRIBUTE 1
1012c393a42Smrg#include "fcalias.h"
1022c393a42Smrg#elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
1032c393a42Smrg#define FcPrivate		__hidden
1042c393a42Smrg#else /* not gcc >= 3.3 and not Sun Studio >= 8 */
1052c393a42Smrg#define FcPrivate
1062c393a42Smrg#endif
1072c393a42Smrg
1085e61939bSmrgFC_ASSERT_STATIC (sizeof (FcRef) == sizeof (int));
1095e61939bSmrg
1102c393a42Smrgtypedef enum _FcValueBinding {
111d91dd368Smrg    FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame,
112d91dd368Smrg    /* to make sure sizeof (FcValueBinding) == 4 even with -fshort-enums */
113d91dd368Smrg    FcValueBindingEnd = INT_MAX
1142c393a42Smrg} FcValueBinding;
1152c393a42Smrg
1165e61939bSmrg#define FcStrdup(s) ((FcChar8 *) strdup ((const char *) (s)))
1175e61939bSmrg#define FcFree(s) (free ((FcChar8 *) (s)))
1185e61939bSmrg
1192c393a42Smrg/*
1202c393a42Smrg * Serialized data structures use only offsets instead of pointers
1212c393a42Smrg * A low bit of 1 indicates an offset.
1222c393a42Smrg */
123898dab68Smrg
1242c393a42Smrg/* Is the provided pointer actually an offset? */
1252c393a42Smrg#define FcIsEncodedOffset(p)	((((intptr_t) (p)) & 1) != 0)
1262c393a42Smrg
1272c393a42Smrg/* Encode offset in a pointer of type t */
1282c393a42Smrg#define FcOffsetEncode(o,t)	((t *) ((o) | 1))
1292c393a42Smrg
1302c393a42Smrg/* Decode a pointer into an offset */
1312c393a42Smrg#define FcOffsetDecode(p)	(((intptr_t) (p)) & ~1)
1322c393a42Smrg
1332c393a42Smrg/* Compute pointer offset */
1342c393a42Smrg#define FcPtrToOffset(b,p)	((intptr_t) (p) - (intptr_t) (b))
1352c393a42Smrg
1362c393a42Smrg/* Given base address, offset and type, return a pointer */
1372c393a42Smrg#define FcOffsetToPtr(b,o,t)	((t *) ((intptr_t) (b) + (o)))
1382c393a42Smrg
1392c393a42Smrg/* Given base address, encoded offset and type, return a pointer */
1402c393a42Smrg#define FcEncodedOffsetToPtr(b,p,t) FcOffsetToPtr(b,FcOffsetDecode(p),t)
1412c393a42Smrg
1422c393a42Smrg/* Given base address, pointer and type, return an encoded offset */
1432c393a42Smrg#define FcPtrToEncodedOffset(b,p,t) FcOffsetEncode(FcPtrToOffset(b,p),t)
1442c393a42Smrg
1452c393a42Smrg/* Given a structure, offset member and type, return pointer */
1462c393a42Smrg#define FcOffsetMember(s,m,t)	    FcOffsetToPtr(s,(s)->m,t)
1472c393a42Smrg
1482c393a42Smrg/* Given a structure, encoded offset member and type, return pointer to member */
1492c393a42Smrg#define FcEncodedOffsetMember(s,m,t) FcOffsetToPtr(s,FcOffsetDecode((s)->m), t)
1502c393a42Smrg
1512c393a42Smrg/* Given a structure, member and type, convert the member to a pointer */
1522c393a42Smrg#define FcPointerMember(s,m,t)	(FcIsEncodedOffset((s)->m) ? \
1532c393a42Smrg				 FcEncodedOffsetMember (s,m,t) : \
1542c393a42Smrg				 (s)->m)
1552c393a42Smrg
1562c393a42Smrg/*
1572c393a42Smrg * Serialized values may hold strings, charsets and langsets as pointers,
1582c393a42Smrg * unfortunately FcValue is an exposed type so we can't just always use
1592c393a42Smrg * offsets
1602c393a42Smrg */
1612c393a42Smrg#define FcValueString(v)	FcPointerMember(v,u.s,FcChar8)
1622c393a42Smrg#define FcValueCharSet(v)	FcPointerMember(v,u.c,const FcCharSet)
1632c393a42Smrg#define FcValueLangSet(v)	FcPointerMember(v,u.l,const FcLangSet)
1642c393a42Smrg
1652c393a42Smrgtypedef struct _FcValueList *FcValueListPtr;
1662c393a42Smrg
1672c393a42Smrgtypedef struct _FcValueList {
1682c393a42Smrg    struct _FcValueList	*next;
1692c393a42Smrg    FcValue		value;
1702c393a42Smrg    FcValueBinding	binding;
1712c393a42Smrg} FcValueList;
1722c393a42Smrg
1732c393a42Smrg#define FcValueListNext(vl)	FcPointerMember(vl,next,FcValueList)
174898dab68Smrg
1752c393a42Smrgtypedef int FcObject;
1762c393a42Smrg
177d91dd368Smrg/* The 1024 is to leave some room for future added internal objects, such
178d91dd368Smrg * that caches from newer fontconfig can still be used with older fontconfig
179d91dd368Smrg * without getting confused. */
180d91dd368Smrg#define FC_EXT_OBJ_INDEX	1024
181d91dd368Smrg#define FC_OBJ_ID(_n_)	((_n_) & (~FC_EXT_OBJ_INDEX))
182d91dd368Smrg
1832c393a42Smrgtypedef struct _FcPatternElt *FcPatternEltPtr;
1842c393a42Smrg
1852c393a42Smrg/*
186898dab68Smrg * Pattern elts are stuck in a structure connected to the pattern,
1872c393a42Smrg * so they get moved around when the pattern is resized. Hence, the
1882c393a42Smrg * values field must be a pointer/offset instead of just an offset
1892c393a42Smrg */
1902c393a42Smrgtypedef struct _FcPatternElt {
1912c393a42Smrg    FcObject		object;
1922c393a42Smrg    FcValueList		*values;
1932c393a42Smrg} FcPatternElt;
1942c393a42Smrg
1952c393a42Smrg#define FcPatternEltValues(pe)	FcPointerMember(pe,values,FcValueList)
1962c393a42Smrg
1972c393a42Smrgstruct _FcPattern {
1982c393a42Smrg    int		    num;
1992c393a42Smrg    int		    size;
2002c393a42Smrg    intptr_t	    elts_offset;
2015e61939bSmrg    FcRef	    ref;
2022c393a42Smrg};
2032c393a42Smrg
2042c393a42Smrg#define FcPatternElts(p)	FcOffsetMember(p,elts_offset,FcPatternElt)
2052c393a42Smrg
2062c393a42Smrg#define FcFontSetFonts(fs)	FcPointerMember(fs,fonts,FcPattern *)
2072c393a42Smrg
2082c393a42Smrg#define FcFontSetFont(fs,i)	(FcIsEncodedOffset((fs)->fonts) ? \
2092c393a42Smrg				 FcEncodedOffsetToPtr(fs, \
2102c393a42Smrg						      FcFontSetFonts(fs)[i], \
2112c393a42Smrg						      FcPattern) : \
2122c393a42Smrg				 fs->fonts[i])
2132c393a42Smrg
2142c393a42Smrgtypedef enum _FcOp {
215898dab68Smrg    FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpRange, FcOpBool, FcOpCharSet, FcOpLangSet,
2162c393a42Smrg    FcOpNil,
2172c393a42Smrg    FcOpField, FcOpConst,
218898dab68Smrg    FcOpAssign, FcOpAssignReplace,
2192c393a42Smrg    FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
2205e61939bSmrg    FcOpDelete, FcOpDeleteAll,
2212c393a42Smrg    FcOpQuest,
222898dab68Smrg    FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual,
2232c393a42Smrg    FcOpContains, FcOpListing, FcOpNotContains,
2242c393a42Smrg    FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual,
2252c393a42Smrg    FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide,
2262c393a42Smrg    FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc,
2272c393a42Smrg    FcOpInvalid
2282c393a42Smrg} FcOp;
2292c393a42Smrg
230898dab68Smrgtypedef enum _FcOpFlags {
231898dab68Smrg	FcOpFlagIgnoreBlanks = 1 << 0
232898dab68Smrg} FcOpFlags;
233898dab68Smrg
234898dab68Smrg#define FC_OP_GET_OP(_x_)	((_x_) & 0xffff)
235898dab68Smrg#define FC_OP_GET_FLAGS(_x_)	(((_x_) & 0xffff0000) >> 16)
236898dab68Smrg#define FC_OP(_x_,_f_)		(FC_OP_GET_OP (_x_) | ((_f_) << 16))
237898dab68Smrg
2385e61939bSmrgtypedef struct _FcExprMatrix {
2395e61939bSmrg  struct _FcExpr *xx, *xy, *yx, *yy;
2405e61939bSmrg} FcExprMatrix;
2415e61939bSmrg
2425e61939bSmrgtypedef struct _FcExprName {
2435e61939bSmrg  FcObject	object;
2445e61939bSmrg  FcMatchKind	kind;
2455e61939bSmrg} FcExprName;
2465e61939bSmrg
2475e61939bSmrg
2482c393a42Smrgtypedef struct _FcExpr {
2492c393a42Smrg    FcOp   op;
2502c393a42Smrg    union {
2512c393a42Smrg	int	    ival;
2522c393a42Smrg	double	    dval;
253898dab68Smrg	const FcChar8	    *sval;
2545e61939bSmrg	FcExprMatrix *mexpr;
2552c393a42Smrg	FcBool	    bval;
2562c393a42Smrg	FcCharSet   *cval;
257898dab68Smrg	FcLangSet   *lval;
2585e61939bSmrg
2595e61939bSmrg	FcExprName  name;
260898dab68Smrg	const FcChar8	    *constant;
2612c393a42Smrg	struct {
2622c393a42Smrg	    struct _FcExpr *left, *right;
2632c393a42Smrg	} tree;
2642c393a42Smrg    } u;
2652c393a42Smrg} FcExpr;
2662c393a42Smrg
2670d39df38Smrgtypedef struct _FcExprPage FcExprPage;
2680d39df38Smrg
2690d39df38Smrgstruct _FcExprPage {
2700d39df38Smrg  FcExprPage *next_page;
2710d39df38Smrg  FcExpr *next;
2720d39df38Smrg  FcExpr exprs[(1024 - 2/* two pointers */ - 2/* malloc overhead */) * sizeof (void *) / sizeof (FcExpr)];
273898dab68Smrg  FcExpr end[FLEXIBLE_ARRAY_MEMBER];
2740d39df38Smrg};
2750d39df38Smrg
2762c393a42Smrgtypedef enum _FcQual {
2772c393a42Smrg    FcQualAny, FcQualAll, FcQualFirst, FcQualNotFirst
2782c393a42Smrg} FcQual;
2792c393a42Smrg
2802c393a42Smrg#define FcMatchDefault	((FcMatchKind) -1)
2812c393a42Smrg
2822c393a42Smrgtypedef struct _FcTest {
2832c393a42Smrg    FcMatchKind		kind;
2842c393a42Smrg    FcQual		qual;
2852c393a42Smrg    FcObject		object;
2862c393a42Smrg    FcOp		op;
2872c393a42Smrg    FcExpr		*expr;
2882c393a42Smrg} FcTest;
2892c393a42Smrg
2902c393a42Smrgtypedef struct _FcEdit {
2912c393a42Smrg    FcObject	    object;
2922c393a42Smrg    FcOp	    op;
2932c393a42Smrg    FcExpr	    *expr;
2942c393a42Smrg    FcValueBinding  binding;
2952c393a42Smrg} FcEdit;
2962c393a42Smrg
297d91dd368Smrgtypedef enum _FcRuleType {
298d91dd368Smrg    FcRuleUnknown, FcRuleTest, FcRuleEdit
299d91dd368Smrg} FcRuleType;
300d91dd368Smrg
301d91dd368Smrgtypedef struct _FcRule {
302d91dd368Smrg    struct _FcRule *next;
303d91dd368Smrg    FcRuleType      type;
304d91dd368Smrg    union {
305d91dd368Smrg	FcTest *test;
306d91dd368Smrg	FcEdit *edit;
307d91dd368Smrg    } u;
308d91dd368Smrg} FcRule;
309d91dd368Smrg
3102c393a42Smrgtypedef struct _FcSubst {
3112c393a42Smrg    struct _FcSubst	*next;
312d91dd368Smrg    FcRule		*rule;
3132c393a42Smrg} FcSubst;
3142c393a42Smrg
3152c393a42Smrgtypedef struct _FcCharLeaf {
3162c393a42Smrg    FcChar32	map[256/32];
3172c393a42Smrg} FcCharLeaf;
3182c393a42Smrg
3192c393a42Smrgstruct _FcCharSet {
3205e61939bSmrg    FcRef	    ref;	/* reference count */
3212c393a42Smrg    int		    num;	/* size of leaves and numbers arrays */
3222c393a42Smrg    intptr_t	    leaves_offset;
3232c393a42Smrg    intptr_t	    numbers_offset;
3242c393a42Smrg};
3252c393a42Smrg
3262c393a42Smrg#define FcCharSetLeaves(c)	FcOffsetMember(c,leaves_offset,intptr_t)
3272c393a42Smrg#define FcCharSetLeaf(c,i)	(FcOffsetToPtr(FcCharSetLeaves(c), \
3282c393a42Smrg					       FcCharSetLeaves(c)[i], \
3292c393a42Smrg					       FcCharLeaf))
3302c393a42Smrg#define FcCharSetNumbers(c)	FcOffsetMember(c,numbers_offset,FcChar16)
3312c393a42Smrg
3322c393a42Smrgstruct _FcStrSet {
3335e61939bSmrg    FcRef	    ref;	/* reference count */
3342c393a42Smrg    int		    num;
3352c393a42Smrg    int		    size;
3362c393a42Smrg    FcChar8	    **strs;
3372c393a42Smrg};
3382c393a42Smrg
3392c393a42Smrgstruct _FcStrList {
3402c393a42Smrg    FcStrSet	    *set;
3412c393a42Smrg    int		    n;
3422c393a42Smrg};
3432c393a42Smrg
3442c393a42Smrgtypedef struct _FcStrBuf {
3452c393a42Smrg    FcChar8 *buf;
3462c393a42Smrg    FcBool  allocated;
3472c393a42Smrg    FcBool  failed;
3482c393a42Smrg    int	    len;
3492c393a42Smrg    int	    size;
3500d39df38Smrg    FcChar8 buf_static[16 * sizeof (void *)];
3512c393a42Smrg} FcStrBuf;
3522c393a42Smrg
3532c393a42Smrgstruct _FcCache {
3545e61939bSmrg    unsigned int magic;              /* FC_CACHE_MAGIC_MMAP or FC_CACHE_ALLOC */
3552c393a42Smrg    int		version;	    /* FC_CACHE_CONTENT_VERSION */
3562c393a42Smrg    intptr_t	size;		    /* size of file */
3572c393a42Smrg    intptr_t	dir;		    /* offset to dir name */
3582c393a42Smrg    intptr_t	dirs;		    /* offset to subdirs */
3592c393a42Smrg    int		dirs_count;	    /* number of subdir strings */
3602c393a42Smrg    intptr_t	set;		    /* offset to font set */
361898dab68Smrg    int		checksum;	    /* checksum of directory state */
3622c393a42Smrg};
3632c393a42Smrg
3642c393a42Smrg#undef FcCacheDir
3652c393a42Smrg#undef FcCacheSubdir
3662c393a42Smrg#define FcCacheDir(c)	FcOffsetMember(c,dir,FcChar8)
3672c393a42Smrg#define FcCacheDirs(c)	FcOffsetMember(c,dirs,intptr_t)
3682c393a42Smrg#define FcCacheSet(c)	FcOffsetMember(c,set,FcFontSet)
3692c393a42Smrg#define FcCacheSubdir(c,i)  FcOffsetToPtr (FcCacheDirs(c),\
3702c393a42Smrg					   FcCacheDirs(c)[i], \
3712c393a42Smrg					   FcChar8)
3722c393a42Smrg
3732c393a42Smrg/*
3742c393a42Smrg * Used while constructing a directory cache object
3752c393a42Smrg */
3762c393a42Smrg
3772c393a42Smrg#define FC_SERIALIZE_HASH_SIZE	8191
3782c393a42Smrg
3790d39df38Smrgtypedef union _FcAlign {
3800d39df38Smrg    double	d;
3810d39df38Smrg    int		i;
3820d39df38Smrg    intptr_t	ip;
3830d39df38Smrg    FcBool	b;
3840d39df38Smrg    void	*p;
3850d39df38Smrg} FcAlign;
3860d39df38Smrg
3872c393a42Smrgtypedef struct _FcSerializeBucket {
3882c393a42Smrg    struct _FcSerializeBucket *next;
3892c393a42Smrg    const void	*object;
3902c393a42Smrg    intptr_t	offset;
3912c393a42Smrg} FcSerializeBucket;
3922c393a42Smrg
3932c393a42Smrgtypedef struct _FcCharSetFreezer FcCharSetFreezer;
3942c393a42Smrg
3952c393a42Smrgtypedef struct _FcSerialize {
3962c393a42Smrg    intptr_t		size;
3972c393a42Smrg    FcCharSetFreezer	*cs_freezer;
3982c393a42Smrg    void		*linear;
3992c393a42Smrg    FcSerializeBucket	*buckets[FC_SERIALIZE_HASH_SIZE];
4002c393a42Smrg} FcSerialize;
401898dab68Smrg
4022c393a42Smrg/*
4032c393a42Smrg * To map adobe glyph names to unicode values, a precomputed hash
4042c393a42Smrg * table is used
4052c393a42Smrg */
4062c393a42Smrg
4072c393a42Smrgtypedef struct _FcGlyphName {
4082c393a42Smrg    FcChar32	ucs;		/* unicode value */
4092c393a42Smrg    FcChar8	name[1];	/* name extends beyond struct */
4102c393a42Smrg} FcGlyphName;
4112c393a42Smrg
4122c393a42Smrg/*
4132c393a42Smrg * To perform case-insensitive string comparisons, a table
4142c393a42Smrg * is used which holds three different kinds of folding data.
415898dab68Smrg *
4162c393a42Smrg * The first is a range of upper case values mapping to a range
4172c393a42Smrg * of their lower case equivalents.  Within each range, the offset
4182c393a42Smrg * between upper and lower case is constant.
4192c393a42Smrg *
4202c393a42Smrg * The second is a range of upper case values which are interleaved
4212c393a42Smrg * with their lower case equivalents.
422898dab68Smrg *
4232c393a42Smrg * The third is a set of raw unicode values mapping to a list
4242c393a42Smrg * of unicode values for comparison purposes.  This allows conversion
4252c393a42Smrg * of ß to "ss" so that SS, ss and ß all match.  A separate array
4262c393a42Smrg * holds the list of unicode values for each entry.
4272c393a42Smrg *
4282c393a42Smrg * These are packed into a single table.  Using a binary search,
4292c393a42Smrg * the appropriate entry can be located.
4302c393a42Smrg */
4312c393a42Smrg
4322c393a42Smrg#define FC_CASE_FOLD_RANGE	    0
4332c393a42Smrg#define FC_CASE_FOLD_EVEN_ODD	    1
4342c393a42Smrg#define FC_CASE_FOLD_FULL	    2
4352c393a42Smrg
4362c393a42Smrgtypedef struct _FcCaseFold {
4372c393a42Smrg    FcChar32	upper;
4382c393a42Smrg    FcChar16	method : 2;
4392c393a42Smrg    FcChar16	count : 14;
4402c393a42Smrg    short    	offset;	    /* lower - upper for RANGE, table id for FULL */
4412c393a42Smrg} FcCaseFold;
4422c393a42Smrg
4432c393a42Smrg#define FC_MAX_FILE_LEN	    4096
4442c393a42Smrg
4452c393a42Smrg#define FC_CACHE_MAGIC_MMAP	    0xFC02FC04
4462c393a42Smrg#define FC_CACHE_MAGIC_ALLOC	    0xFC02FC05
4475e61939bSmrg#define FC_CACHE_CONTENT_VERSION    4
4482c393a42Smrg
4492c393a42Smrgstruct _FcAtomic {
4502c393a42Smrg    FcChar8	*file;		/* original file name */
4512c393a42Smrg    FcChar8	*new;		/* temp file name -- write data here */
4522c393a42Smrg    FcChar8	*lck;		/* lockfile name (used for locking) */
4532c393a42Smrg    FcChar8	*tmp;		/* tmpfile name (used for locking) */
4542c393a42Smrg};
4552c393a42Smrg
4562c393a42Smrgstruct _FcBlanks {
4572c393a42Smrg    int		nblank;
4582c393a42Smrg    int		sblank;
4592c393a42Smrg    FcChar32	*blanks;
4602c393a42Smrg};
4612c393a42Smrg
4622c393a42Smrgstruct _FcConfig {
4632c393a42Smrg    /*
4642c393a42Smrg     * File names loaded from the configuration -- saved here as the
4652c393a42Smrg     * cache file must be consulted before the directories are scanned,
4662c393a42Smrg     * and those directives may occur in any order
4672c393a42Smrg     */
4682c393a42Smrg    FcStrSet	*configDirs;	    /* directories to scan for fonts */
4692c393a42Smrg    /*
4702c393a42Smrg     * Set of allowed blank chars -- used to
4712c393a42Smrg     * trim fonts of bogus glyphs
4722c393a42Smrg     */
4732c393a42Smrg    FcBlanks	*blanks;
4742c393a42Smrg    /*
4752c393a42Smrg     * List of directories containing fonts,
476898dab68Smrg     * built by recursively scanning the set
4772c393a42Smrg     * of configured directories
4782c393a42Smrg     */
4792c393a42Smrg    FcStrSet	*fontDirs;
4802c393a42Smrg    /*
4812c393a42Smrg     * List of directories containing cache files.
4822c393a42Smrg     */
4832c393a42Smrg    FcStrSet	*cacheDirs;
4842c393a42Smrg    /*
4852c393a42Smrg     * Names of all of the configuration files used
4862c393a42Smrg     * to create this configuration
4872c393a42Smrg     */
4882c393a42Smrg    FcStrSet	*configFiles;	    /* config files loaded */
4892c393a42Smrg    /*
4902c393a42Smrg     * Substitution instructions for patterns and fonts;
4912c393a42Smrg     * maxObjects is used to allocate appropriate intermediate storage
4922c393a42Smrg     * while performing a whole set of substitutions
4932c393a42Smrg     */
4942c393a42Smrg    FcSubst	*substPattern;	    /* substitutions for patterns */
4952c393a42Smrg    FcSubst	*substFont;	    /* substitutions for fonts */
4962c393a42Smrg    FcSubst	*substScan;	    /* substitutions for scanned fonts */
4972c393a42Smrg    int		maxObjects;	    /* maximum number of tests in all substs */
4982c393a42Smrg    /*
4992c393a42Smrg     * List of patterns used to control font file selection
5002c393a42Smrg     */
5012c393a42Smrg    FcStrSet	*acceptGlobs;
5022c393a42Smrg    FcStrSet	*rejectGlobs;
5032c393a42Smrg    FcFontSet	*acceptPatterns;
5042c393a42Smrg    FcFontSet	*rejectPatterns;
5052c393a42Smrg    /*
5062c393a42Smrg     * The set of fonts loaded from the listed directories; the
5072c393a42Smrg     * order within the set does not determine the font selection,
5082c393a42Smrg     * except in the case of identical matches in which case earlier fonts
5092c393a42Smrg     * match preferrentially
5102c393a42Smrg     */
5112c393a42Smrg    FcFontSet	*fonts[FcSetApplication + 1];
5122c393a42Smrg    /*
5132c393a42Smrg     * Fontconfig can periodically rescan the system configuration
5142c393a42Smrg     * and font directories.  This rescanning occurs when font
5152c393a42Smrg     * listing requests are made, but no more often than rescanInterval
5162c393a42Smrg     * seconds apart.
5172c393a42Smrg     */
5182c393a42Smrg    time_t	rescanTime;	    /* last time information was scanned */
5192c393a42Smrg    int		rescanInterval;	    /* interval between scans */
5200d39df38Smrg
5215e61939bSmrg    FcRef	ref;                /* reference count */
5220d39df38Smrg
5235e61939bSmrg    FcExprPage  *expr_pool;	    /* pool of FcExpr's */
524898dab68Smrg
5255e61939bSmrg    FcChar8     *sysRoot;	    /* override the system root directory */
5265e61939bSmrg};
5272c393a42Smrg
5282c393a42Smrgtypedef struct _FcFileTime {
5292c393a42Smrg    time_t  time;
5302c393a42Smrg    FcBool  set;
5312c393a42Smrg} FcFileTime;
5322c393a42Smrg
5332c393a42Smrgtypedef struct _FcCharMap FcCharMap;
5342c393a42Smrg
535898dab68Smrgtypedef struct _FcRange	    FcRange;
536898dab68Smrg
537898dab68Smrgstruct _FcRange {
538898dab68Smrg    FcChar32 begin;
539898dab68Smrg    FcChar32 end;
540898dab68Smrg};
541898dab68Smrg
542898dab68Smrgtypedef struct _FcStatFS    FcStatFS;
543898dab68Smrg
544898dab68Smrgstruct _FcStatFS {
545898dab68Smrg    FcBool is_remote_fs;
546898dab68Smrg    FcBool is_mtime_broken;
547898dab68Smrg};
548898dab68Smrg
5495e61939bSmrgtypedef struct _FcValuePromotionBuffer FcValuePromotionBuffer;
5505e61939bSmrg
5515e61939bSmrgstruct _FcValuePromotionBuffer {
5525e61939bSmrg  union {
5535e61939bSmrg    double d;
5545e61939bSmrg    int i;
5555e61939bSmrg    long l;
5565e61939bSmrg    char c[256]; /* Enlarge as needed */
5575e61939bSmrg  } u;
5585e61939bSmrg};
5595e61939bSmrg
5602c393a42Smrg/* fcblanks.c */
5612c393a42Smrg
5622c393a42Smrg/* fccache.c */
5632c393a42Smrg
5642c393a42SmrgFcPrivate FcCache *
5652c393a42SmrgFcDirCacheScan (const FcChar8 *dir, FcConfig *config);
5662c393a42Smrg
5672c393a42SmrgFcPrivate FcCache *
5682c393a42SmrgFcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs);
5692c393a42Smrg
570b2a52337SmrgFcPrivate FcCache *
571b2a52337SmrgFcDirCacheRebuild (FcCache *cache, struct stat *dir_stat, FcStrSet *dirs);
572b2a52337Smrg
5732c393a42SmrgFcPrivate FcBool
5742c393a42SmrgFcDirCacheWrite (FcCache *cache, FcConfig *config);
575898dab68Smrg
576898dab68SmrgFcPrivate FcBool
577898dab68SmrgFcDirCacheCreateTagFile (const FcChar8 *cache_dir);
578898dab68Smrg
5792c393a42SmrgFcPrivate void
5802c393a42SmrgFcCacheObjectReference (void *object);
5812c393a42Smrg
5822c393a42SmrgFcPrivate void
5832c393a42SmrgFcCacheObjectDereference (void *object);
5842c393a42Smrg
5852c393a42SmrgFcPrivate void
5862c393a42SmrgFcCacheFini (void);
587898dab68Smrg
5882c393a42SmrgFcPrivate void
5892c393a42SmrgFcDirCacheReference (FcCache *cache, int nref);
5902c393a42Smrg
5912c393a42Smrg/* fccfg.c */
5922c393a42Smrg
5935e61939bSmrgFcPrivate FcBool
5945e61939bSmrgFcConfigInit (void);
5955e61939bSmrg
5965e61939bSmrgFcPrivate void
5975e61939bSmrgFcConfigFini (void);
5985e61939bSmrg
599898dab68SmrgFcPrivate FcChar8 *
600898dab68SmrgFcConfigXdgCacheHome (void);
601898dab68Smrg
602898dab68SmrgFcPrivate FcChar8 *
603898dab68SmrgFcConfigXdgConfigHome (void);
604898dab68Smrg
605898dab68SmrgFcPrivate FcChar8 *
606898dab68SmrgFcConfigXdgDataHome (void);
607898dab68Smrg
6080d39df38SmrgFcPrivate FcExpr *
6090d39df38SmrgFcConfigAllocExpr (FcConfig *config);
6100d39df38Smrg
6112c393a42SmrgFcPrivate FcBool
6122c393a42SmrgFcConfigAddConfigDir (FcConfig	    *config,
6132c393a42Smrg		      const FcChar8 *d);
6142c393a42Smrg
6152c393a42SmrgFcPrivate FcBool
6162c393a42SmrgFcConfigAddFontDir (FcConfig	    *config,
6172c393a42Smrg		    const FcChar8   *d);
6182c393a42Smrg
6192c393a42SmrgFcPrivate FcBool
6202c393a42SmrgFcConfigAddDir (FcConfig	*config,
6212c393a42Smrg		const FcChar8	*d);
6222c393a42Smrg
6232c393a42SmrgFcPrivate FcBool
6242c393a42SmrgFcConfigAddCacheDir (FcConfig	    *config,
6252c393a42Smrg		     const FcChar8  *d);
6262c393a42Smrg
6272c393a42SmrgFcPrivate FcBool
6282c393a42SmrgFcConfigAddConfigFile (FcConfig		*config,
6292c393a42Smrg		       const FcChar8	*f);
6302c393a42Smrg
6312c393a42SmrgFcPrivate FcBool
6322c393a42SmrgFcConfigAddBlank (FcConfig	*config,
6332c393a42Smrg		  FcChar32    	blank);
6342c393a42Smrg
635d91dd368SmrgFcBool
636d91dd368SmrgFcConfigAddRule (FcConfig	*config,
637d91dd368Smrg		 FcRule		*rule,
6382c393a42Smrg		 FcMatchKind	kind);
6392c393a42Smrg
6402c393a42SmrgFcPrivate void
6412c393a42SmrgFcConfigSetFonts (FcConfig	*config,
6422c393a42Smrg		  FcFontSet	*fonts,
6432c393a42Smrg		  FcSetName	set);
6442c393a42Smrg
6452c393a42SmrgFcPrivate FcBool
6462c393a42SmrgFcConfigCompareValue (const FcValue *m,
647d91dd368Smrg		      unsigned int   op_,
6482c393a42Smrg		      const FcValue *v);
6492c393a42Smrg
6502c393a42SmrgFcPrivate FcBool
6512c393a42SmrgFcConfigGlobAdd (FcConfig	*config,
6522c393a42Smrg		 const FcChar8	*glob,
6532c393a42Smrg		 FcBool		accept);
6542c393a42Smrg
6552c393a42SmrgFcPrivate FcBool
6562c393a42SmrgFcConfigAcceptFilename (FcConfig	*config,
6572c393a42Smrg			const FcChar8	*filename);
6582c393a42Smrg
6592c393a42SmrgFcPrivate FcBool
6602c393a42SmrgFcConfigPatternsAdd (FcConfig	*config,
6612c393a42Smrg		     FcPattern	*pattern,
6622c393a42Smrg		     FcBool	accept);
6632c393a42Smrg
6642c393a42SmrgFcPrivate FcBool
6652c393a42SmrgFcConfigAcceptFont (FcConfig	    *config,
6662c393a42Smrg		    const FcPattern *font);
6672c393a42Smrg
6682c393a42SmrgFcPrivate FcFileTime
6692c393a42SmrgFcConfigModifiedTime (FcConfig *config);
6702c393a42Smrg
6712c393a42SmrgFcPrivate FcBool
672898dab68SmrgFcConfigAddCache (FcConfig *config, FcCache *cache,
6732c393a42Smrg		  FcSetName set, FcStrSet *dirSet);
6742c393a42Smrg
6752c393a42Smrg/* fcserialize.c */
6762c393a42SmrgFcPrivate intptr_t
6772c393a42SmrgFcAlignSize (intptr_t size);
678898dab68Smrg
6792c393a42SmrgFcPrivate FcSerialize *
6802c393a42SmrgFcSerializeCreate (void);
6812c393a42Smrg
6822c393a42SmrgFcPrivate void
6832c393a42SmrgFcSerializeDestroy (FcSerialize *serialize);
6842c393a42Smrg
6852c393a42SmrgFcPrivate FcBool
6862c393a42SmrgFcSerializeAlloc (FcSerialize *serialize, const void *object, int size);
6872c393a42Smrg
6882c393a42SmrgFcPrivate intptr_t
6892c393a42SmrgFcSerializeReserve (FcSerialize *serialize, int size);
6902c393a42Smrg
6912c393a42SmrgFcPrivate intptr_t
6922c393a42SmrgFcSerializeOffset (FcSerialize *serialize, const void *object);
6932c393a42Smrg
6942c393a42SmrgFcPrivate void *
6952c393a42SmrgFcSerializePtr (FcSerialize *serialize, const void *object);
6962c393a42Smrg
6972c393a42SmrgFcPrivate FcBool
6982c393a42SmrgFcLangSetSerializeAlloc (FcSerialize *serialize, const FcLangSet *l);
6992c393a42Smrg
7002c393a42SmrgFcPrivate FcLangSet *
7012c393a42SmrgFcLangSetSerialize(FcSerialize *serialize, const FcLangSet *l);
7022c393a42Smrg
7032c393a42Smrg/* fccharset.c */
7042c393a42SmrgFcPrivate void
7052c393a42SmrgFcLangCharSetPopulate (void);
7062c393a42Smrg
7072c393a42SmrgFcPrivate FcCharSetFreezer *
7082c393a42SmrgFcCharSetFreezerCreate (void);
7092c393a42Smrg
7102c393a42SmrgFcPrivate const FcCharSet *
7112c393a42SmrgFcCharSetFreeze (FcCharSetFreezer *freezer, const FcCharSet *fcs);
7122c393a42Smrg
7132c393a42SmrgFcPrivate void
7142c393a42SmrgFcCharSetFreezerDestroy (FcCharSetFreezer *freezer);
7152c393a42Smrg
7162c393a42SmrgFcPrivate FcBool
7172c393a42SmrgFcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c);
7182c393a42Smrg
7192c393a42SmrgFcPrivate FcCharSet *
7202c393a42SmrgFcNameParseCharSet (FcChar8 *string);
7212c393a42Smrg
7220d39df38SmrgFcPrivate FcBool
7230d39df38SmrgFcNameUnparseValue (FcStrBuf    *buf,
7240d39df38Smrg                    FcValue     *v0,
7250d39df38Smrg		    FcChar8     *escape);
7260d39df38Smrg
7270d39df38SmrgFcPrivate FcBool
7280d39df38SmrgFcNameUnparseValueList (FcStrBuf	*buf,
7290d39df38Smrg			FcValueListPtr	v,
7300d39df38Smrg			FcChar8		*escape);
7310d39df38Smrg
7322c393a42SmrgFcPrivate FcCharLeaf *
7332c393a42SmrgFcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4);
7342c393a42Smrg
7352c393a42SmrgFcPrivate FcBool
7362c393a42SmrgFcCharSetSerializeAlloc(FcSerialize *serialize, const FcCharSet *cs);
7372c393a42Smrg
7382c393a42SmrgFcPrivate FcCharSet *
7392c393a42SmrgFcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs);
7402c393a42Smrg
7412c393a42SmrgFcPrivate FcChar16 *
7422c393a42SmrgFcCharSetGetNumbers(const FcCharSet *c);
7432c393a42Smrg
7445e61939bSmrg/* fccompat.c */
7455e61939bSmrgFcPrivate int
7465e61939bSmrgFcOpen(const char *pathname, int flags, ...);
7475e61939bSmrg
7485e61939bSmrgFcPrivate int
7495e61939bSmrgFcMakeTempfile (char *template);
7505e61939bSmrg
7515e61939bSmrgFcPrivate int32_t
7525e61939bSmrgFcRandom (void);
7535e61939bSmrg
754d91dd368SmrgFcPrivate FcBool
755d91dd368SmrgFcMakeDirectory (const FcChar8 *dir);
756d91dd368Smrg
7572c393a42Smrg/* fcdbg.c */
7585e61939bSmrg
7595e61939bSmrgFcPrivate void
7605e61939bSmrgFcValuePrintFile (FILE *f, const FcValue v);
7615e61939bSmrg
7622c393a42SmrgFcPrivate void
763898dab68SmrgFcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark);
764898dab68Smrg
765898dab68SmrgFcPrivate void
766898dab68SmrgFcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos);
767898dab68Smrg
768898dab68SmrgFcPrivate void
769898dab68SmrgFcValueListPrint (FcValueListPtr l);
7702c393a42Smrg
7712c393a42SmrgFcPrivate void
7722c393a42SmrgFcLangSetPrint (const FcLangSet *ls);
7732c393a42Smrg
7742c393a42SmrgFcPrivate void
7752c393a42SmrgFcOpPrint (FcOp op);
7762c393a42Smrg
7772c393a42SmrgFcPrivate void
7782c393a42SmrgFcTestPrint (const FcTest *test);
7792c393a42Smrg
7802c393a42SmrgFcPrivate void
7812c393a42SmrgFcExprPrint (const FcExpr *expr);
7822c393a42Smrg
7832c393a42SmrgFcPrivate void
7842c393a42SmrgFcEditPrint (const FcEdit *edit);
7852c393a42Smrg
7862c393a42SmrgFcPrivate void
7872c393a42SmrgFcSubstPrint (const FcSubst *subst);
7882c393a42Smrg
7892c393a42SmrgFcPrivate void
7902c393a42SmrgFcCharSetPrint (const FcCharSet *c);
791898dab68Smrg
7922c393a42Smrgextern FcPrivate int FcDebugVal;
7932c393a42Smrg
7942c393a42Smrg#define FcDebug() (FcDebugVal)
7952c393a42Smrg
7962c393a42SmrgFcPrivate void
7972c393a42SmrgFcInitDebug (void);
7982c393a42Smrg
7992c393a42Smrg/* fcdefault.c */
8002c393a42SmrgFcPrivate FcChar8 *
8012c393a42SmrgFcGetDefaultLang (void);
8022c393a42Smrg
8035e61939bSmrgFcPrivate FcChar8 *
8045e61939bSmrgFcGetPrgname (void);
8055e61939bSmrg
8065e61939bSmrgFcPrivate void
8075e61939bSmrgFcDefaultFini (void);
8085e61939bSmrg
8092c393a42Smrg/* fcdir.c */
8102c393a42Smrg
8115e61939bSmrgFcPrivate FcBool
8125e61939bSmrgFcFileIsLink (const FcChar8 *file);
8135e61939bSmrg
814d91dd368SmrgFcPrivate FcBool
815d91dd368SmrgFcFileIsFile (const FcChar8 *file);
816d91dd368Smrg
8172c393a42SmrgFcPrivate FcBool
8182c393a42SmrgFcFileScanConfig (FcFontSet	*set,
8192c393a42Smrg		  FcStrSet	*dirs,
8202c393a42Smrg		  FcBlanks	*blanks,
8212c393a42Smrg		  const FcChar8 *file,
8222c393a42Smrg		  FcConfig	*config);
8232c393a42Smrg
8242c393a42SmrgFcPrivate FcBool
8252c393a42SmrgFcDirScanConfig (FcFontSet	*set,
8262c393a42Smrg		 FcStrSet	*dirs,
8272c393a42Smrg		 FcBlanks	*blanks,
8282c393a42Smrg		 const FcChar8	*dir,
8292c393a42Smrg		 FcBool		force,
8302c393a42Smrg		 FcConfig	*config);
8312c393a42Smrg
8322c393a42Smrg/* fcfont.c */
8332c393a42SmrgFcPrivate int
8342c393a42SmrgFcFontDebug (void);
8350d39df38Smrg
8362c393a42Smrg/* fcfs.c */
8372c393a42Smrg
8382c393a42SmrgFcPrivate FcBool
8392c393a42SmrgFcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s);
8402c393a42Smrg
8412c393a42SmrgFcPrivate FcFontSet *
8422c393a42SmrgFcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s);
8432c393a42Smrg
844b2a52337SmrgFcPrivate FcFontSet *
845b2a52337SmrgFcFontSetDeserialize (const FcFontSet *set);
846b2a52337Smrg
8475e61939bSmrg/* fchash.c */
8485e61939bSmrgFcPrivate FcChar8 *
8495e61939bSmrgFcHashGetSHA256Digest (const FcChar8 *input_strings,
8505e61939bSmrg		       size_t         len);
8512c393a42Smrg
8525e61939bSmrgFcPrivate FcChar8 *
8535e61939bSmrgFcHashGetSHA256DigestFromFile (const FcChar8 *filename);
8545e61939bSmrg
8555e61939bSmrgFcPrivate FcChar8 *
8565e61939bSmrgFcHashGetSHA256DigestFromMemory (const char *fontdata,
8575e61939bSmrg				 size_t      length);
8582c393a42Smrg
8592c393a42Smrg/* fcinit.c */
8605e61939bSmrgFcPrivate FcConfig *
8615e61939bSmrgFcInitLoadOwnConfig (FcConfig *config);
8622c393a42Smrg
8635e61939bSmrgFcPrivate FcConfig *
8645e61939bSmrgFcInitLoadOwnConfigAndFonts (FcConfig *config);
8652c393a42Smrg
8665e61939bSmrg/* fcxml.c */
8672c393a42SmrgFcPrivate void
8685e61939bSmrgFcTestDestroy (FcTest *test);
8692c393a42Smrg
8702c393a42SmrgFcPrivate void
8715e61939bSmrgFcEditDestroy (FcEdit *e);
8722c393a42Smrg
873d91dd368Smrgvoid
874d91dd368SmrgFcRuleDestroy (FcRule *rule);
875d91dd368Smrg
8762c393a42Smrg/* fclang.c */
8772c393a42SmrgFcPrivate FcLangSet *
878898dab68SmrgFcFreeTypeLangSet (const FcCharSet  *charset,
8792c393a42Smrg		   const FcChar8    *exclusiveLang);
8802c393a42Smrg
8812c393a42SmrgFcPrivate FcLangResult
8822c393a42SmrgFcLangCompare (const FcChar8 *s1, const FcChar8 *s2);
883898dab68Smrg
8842c393a42SmrgFcPrivate FcLangSet *
8855e61939bSmrgFcLangSetPromote (const FcChar8 *lang, FcValuePromotionBuffer *buf);
8862c393a42Smrg
8872c393a42SmrgFcPrivate FcLangSet *
8882c393a42SmrgFcNameParseLangSet (const FcChar8 *string);
8892c393a42Smrg
8902c393a42SmrgFcPrivate FcBool
8912c393a42SmrgFcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls);
8922c393a42Smrg
8932c393a42SmrgFcPrivate FcChar8 *
8942c393a42SmrgFcNameUnparseEscaped (FcPattern *pat, FcBool escape);
8952c393a42Smrg
8962c393a42Smrg/* fclist.c */
8972c393a42Smrg
8982c393a42SmrgFcPrivate FcBool
8992c393a42SmrgFcListPatternMatchAny (const FcPattern *p,
9002c393a42Smrg		       const FcPattern *font);
9012c393a42Smrg
9022c393a42Smrg/* fcmatch.c */
9032c393a42Smrg
9042c393a42Smrg/* fcname.c */
9052c393a42Smrg
9065e61939bSmrgenum {
9075e61939bSmrg  FC_INVALID_OBJECT = 0,
9085e61939bSmrg#define FC_OBJECT(NAME, Type, Cmp) FC_##NAME##_OBJECT,
9095e61939bSmrg#include "fcobjs.h"
9105e61939bSmrg#undef FC_OBJECT
9115e61939bSmrg  FC_ONE_AFTER_MAX_BASE_OBJECT
9125e61939bSmrg#define FC_MAX_BASE_OBJECT (FC_ONE_AFTER_MAX_BASE_OBJECT - 1)
9135e61939bSmrg};
9142c393a42Smrg
9152c393a42SmrgFcPrivate FcBool
9162c393a42SmrgFcNameBool (const FcChar8 *v, FcBool *result);
9172c393a42Smrg
9182c393a42SmrgFcPrivate FcBool
9192c393a42SmrgFcObjectValidType (FcObject object, FcType type);
9202c393a42Smrg
9212c393a42SmrgFcPrivate FcObject
9222c393a42SmrgFcObjectFromName (const char * name);
9232c393a42Smrg
9242c393a42SmrgFcPrivate const char *
9252c393a42SmrgFcObjectName (FcObject object);
9262c393a42Smrg
9270d39df38SmrgFcPrivate FcObjectSet *
9280d39df38SmrgFcObjectGetSet (void);
9290d39df38Smrg
9302c393a42Smrg#define FcObjectCompare(a, b)	((int) a - (int) b)
9312c393a42Smrg
9322c393a42Smrg/* fcpat.c */
9332c393a42Smrg
9342c393a42SmrgFcPrivate FcValue
9352c393a42SmrgFcValueCanonicalize (const FcValue *v);
9362c393a42Smrg
937898dab68SmrgFcPrivate FcValueListPtr
938898dab68SmrgFcValueListCreate (void);
939898dab68Smrg
9402c393a42SmrgFcPrivate void
9412c393a42SmrgFcValueListDestroy (FcValueListPtr l);
9422c393a42Smrg
943898dab68SmrgFcPrivate FcValueListPtr
944898dab68SmrgFcValueListPrepend (FcValueListPtr vallist,
945898dab68Smrg		    FcValue        value,
946898dab68Smrg		    FcValueBinding binding);
947898dab68Smrg
948898dab68SmrgFcPrivate FcValueListPtr
949898dab68SmrgFcValueListAppend (FcValueListPtr vallist,
950898dab68Smrg		   FcValue        value,
951898dab68Smrg		   FcValueBinding binding);
952898dab68Smrg
953898dab68SmrgFcPrivate FcValueListPtr
954898dab68SmrgFcValueListDuplicate(FcValueListPtr orig);
955898dab68Smrg
9562c393a42SmrgFcPrivate FcPatternElt *
9572c393a42SmrgFcPatternObjectFindElt (const FcPattern *p, FcObject object);
9582c393a42Smrg
9592c393a42SmrgFcPrivate FcPatternElt *
9602c393a42SmrgFcPatternObjectInsertElt (FcPattern *p, FcObject object);
9612c393a42Smrg
962898dab68SmrgFcPrivate FcBool
963898dab68SmrgFcPatternObjectListAdd (FcPattern	*p,
964898dab68Smrg			FcObject	object,
965898dab68Smrg			FcValueListPtr	list,
966898dab68Smrg			FcBool		append);
967898dab68Smrg
9682c393a42SmrgFcPrivate FcBool
9692c393a42SmrgFcPatternObjectAddWithBinding  (FcPattern	*p,
9702c393a42Smrg				FcObject	object,
9712c393a42Smrg				FcValue		value,
9722c393a42Smrg				FcValueBinding  binding,
9732c393a42Smrg				FcBool		append);
9742c393a42Smrg
9752c393a42SmrgFcPrivate FcBool
9762c393a42SmrgFcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append);
977898dab68Smrg
9782c393a42SmrgFcPrivate FcBool
9792c393a42SmrgFcPatternObjectAddWeak (FcPattern *p, FcObject object, FcValue value, FcBool append);
980898dab68Smrg
9812c393a42SmrgFcPrivate FcResult
9822c393a42SmrgFcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v);
983898dab68Smrg
9842c393a42SmrgFcPrivate FcBool
9852c393a42SmrgFcPatternObjectDel (FcPattern *p, FcObject object);
9862c393a42Smrg
9872c393a42SmrgFcPrivate FcBool
9882c393a42SmrgFcPatternObjectRemove (FcPattern *p, FcObject object, int id);
9892c393a42Smrg
9902c393a42SmrgFcPrivate FcBool
9912c393a42SmrgFcPatternObjectAddInteger (FcPattern *p, FcObject object, int i);
9922c393a42Smrg
9932c393a42SmrgFcPrivate FcBool
9942c393a42SmrgFcPatternObjectAddDouble (FcPattern *p, FcObject object, double d);
9952c393a42Smrg
9962c393a42SmrgFcPrivate FcBool
9972c393a42SmrgFcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s);
9982c393a42Smrg
9992c393a42SmrgFcPrivate FcBool
10002c393a42SmrgFcPatternObjectAddMatrix (FcPattern *p, FcObject object, const FcMatrix *s);
10012c393a42Smrg
10022c393a42SmrgFcPrivate FcBool
10032c393a42SmrgFcPatternObjectAddCharSet (FcPattern *p, FcObject object, const FcCharSet *c);
10042c393a42Smrg
10052c393a42SmrgFcPrivate FcBool
10062c393a42SmrgFcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b);
10072c393a42Smrg
10082c393a42SmrgFcPrivate FcBool
10092c393a42SmrgFcPatternObjectAddLangSet (FcPattern *p, FcObject object, const FcLangSet *ls);
10102c393a42Smrg
10112c393a42SmrgFcPrivate FcResult
10122c393a42SmrgFcPatternObjectGetInteger (const FcPattern *p, FcObject object, int n, int *i);
10132c393a42Smrg
10142c393a42SmrgFcPrivate FcResult
10152c393a42SmrgFcPatternObjectGetDouble (const FcPattern *p, FcObject object, int n, double *d);
10162c393a42Smrg
10172c393a42SmrgFcPrivate FcResult
10182c393a42SmrgFcPatternObjectGetString (const FcPattern *p, FcObject object, int n, FcChar8 ** s);
10192c393a42Smrg
10202c393a42SmrgFcPrivate FcResult
10212c393a42SmrgFcPatternObjectGetMatrix (const FcPattern *p, FcObject object, int n, FcMatrix **s);
10222c393a42Smrg
10232c393a42SmrgFcPrivate FcResult
10242c393a42SmrgFcPatternObjectGetCharSet (const FcPattern *p, FcObject object, int n, FcCharSet **c);
10252c393a42Smrg
10262c393a42SmrgFcPrivate FcResult
10272c393a42SmrgFcPatternObjectGetBool (const FcPattern *p, FcObject object, int n, FcBool *b);
10282c393a42Smrg
10292c393a42SmrgFcPrivate FcResult
10302c393a42SmrgFcPatternObjectGetLangSet (const FcPattern *p, FcObject object, int n, FcLangSet **ls);
10312c393a42Smrg
10322c393a42SmrgFcPrivate FcBool
10332c393a42SmrgFcPatternAppend (FcPattern *p, FcPattern *s);
10342c393a42Smrg
10352c393a42SmrgFcPrivate FcChar32
10362c393a42SmrgFcStringHash (const FcChar8 *s);
10372c393a42Smrg
10382c393a42SmrgFcPrivate FcBool
10392c393a42SmrgFcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat);
10402c393a42Smrg
10412c393a42SmrgFcPrivate FcPattern *
10422c393a42SmrgFcPatternSerialize (FcSerialize *serialize, const FcPattern *pat);
10432c393a42Smrg
10442c393a42SmrgFcPrivate FcBool
10452c393a42SmrgFcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *pat);
10462c393a42Smrg
10472c393a42SmrgFcPrivate FcValueList *
10482c393a42SmrgFcValueListSerialize (FcSerialize *serialize, const FcValueList *pat);
10492c393a42Smrg
10502c393a42Smrg/* fcrender.c */
10512c393a42Smrg
10522c393a42Smrg/* fcmatrix.c */
10532c393a42Smrg
10542c393a42Smrgextern FcPrivate const FcMatrix    FcIdentityMatrix;
10552c393a42Smrg
10562c393a42SmrgFcPrivate void
10572c393a42SmrgFcMatrixFree (FcMatrix *mat);
10582c393a42Smrg
1059898dab68Smrg/* fcstat.c */
1060898dab68Smrg
1061898dab68SmrgFcPrivate int
1062898dab68SmrgFcStat (const FcChar8 *file, struct stat *statb);
1063898dab68Smrg
1064898dab68SmrgFcPrivate int
1065898dab68SmrgFcStatChecksum (const FcChar8 *file, struct stat *statb);
1066898dab68Smrg
1067898dab68SmrgFcPrivate FcBool
1068898dab68SmrgFcIsFsMmapSafe (int fd);
1069898dab68Smrg
1070898dab68SmrgFcPrivate FcBool
1071898dab68SmrgFcIsFsMtimeBroken (const FcChar8 *dir);
1072898dab68Smrg
10732c393a42Smrg/* fcstr.c */
1074898dab68SmrgFcPrivate FcBool
1075898dab68SmrgFcStrSetAddLangs (FcStrSet *strs, const char *languages);
1076898dab68Smrg
10772c393a42SmrgFcPrivate void
10782c393a42SmrgFcStrSetSort (FcStrSet * set);
10792c393a42Smrg
10802c393a42SmrgFcPrivate void
10812c393a42SmrgFcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size);
10822c393a42Smrg
10832c393a42SmrgFcPrivate void
10842c393a42SmrgFcStrBufDestroy (FcStrBuf *buf);
10852c393a42Smrg
10862c393a42SmrgFcPrivate FcChar8 *
10872c393a42SmrgFcStrBufDone (FcStrBuf *buf);
10882c393a42Smrg
10890d39df38SmrgFcPrivate FcChar8 *
10900d39df38SmrgFcStrBufDoneStatic (FcStrBuf *buf);
10910d39df38Smrg
10922c393a42SmrgFcPrivate FcBool
10932c393a42SmrgFcStrBufChar (FcStrBuf *buf, FcChar8 c);
10942c393a42Smrg
10952c393a42SmrgFcPrivate FcBool
10962c393a42SmrgFcStrBufString (FcStrBuf *buf, const FcChar8 *s);
10972c393a42Smrg
10982c393a42SmrgFcPrivate FcBool
10992c393a42SmrgFcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len);
11002c393a42Smrg
11012c393a42SmrgFcPrivate int
11022c393a42SmrgFcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
11032c393a42Smrg
11045e61939bSmrgFcPrivate int
11055e61939bSmrgFcStrCmpIgnoreCaseAndDelims (const FcChar8 *s1, const FcChar8 *s2, const FcChar8 *delims);
11065e61939bSmrg
1107898dab68SmrgFcPrivate FcBool
1108898dab68SmrgFcStrRegexCmp (const FcChar8 *s, const FcChar8 *regex);
1109898dab68Smrg
1110898dab68SmrgFcPrivate FcBool
1111898dab68SmrgFcStrRegexCmpIgnoreCase (const FcChar8 *s, const FcChar8 *regex);
1112898dab68Smrg
11132c393a42SmrgFcPrivate const FcChar8 *
11142c393a42SmrgFcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
11152c393a42Smrg
11162c393a42SmrgFcPrivate const FcChar8 *
11172c393a42SmrgFcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
11182c393a42Smrg
11192c393a42SmrgFcPrivate const FcChar8 *
11202c393a42SmrgFcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2);
11212c393a42Smrg
11225e61939bSmrgFcPrivate int
11235e61939bSmrgFcStrMatchIgnoreCaseAndDelims (const FcChar8 *s1, const FcChar8 *s2, const FcChar8 *delims);
11245e61939bSmrg
11255e61939bSmrgFcPrivate FcBool
11265e61939bSmrgFcStrGlobMatch (const FcChar8 *glob,
11275e61939bSmrg		const FcChar8 *string);
11285e61939bSmrg
11292c393a42SmrgFcPrivate FcBool
11302c393a42SmrgFcStrUsesHome (const FcChar8 *s);
11312c393a42Smrg
11325e61939bSmrgFcPrivate FcChar8 *
11335e61939bSmrgFcStrBuildFilename (const FcChar8 *path,
11345e61939bSmrg		    ...);
11355e61939bSmrg
11362c393a42SmrgFcPrivate FcChar8 *
11372c393a42SmrgFcStrLastSlash (const FcChar8  *path);
11382c393a42Smrg
11392c393a42SmrgFcPrivate FcChar32
11402c393a42SmrgFcStrHashIgnoreCase (const FcChar8 *s);
11412c393a42Smrg
11422c393a42SmrgFcPrivate FcChar8 *
11432c393a42SmrgFcStrCanonFilename (const FcChar8 *s);
11442c393a42Smrg
11452c393a42SmrgFcPrivate FcBool
11462c393a42SmrgFcStrSerializeAlloc (FcSerialize *serialize, const FcChar8 *str);
11472c393a42Smrg
11482c393a42SmrgFcPrivate FcChar8 *
11492c393a42SmrgFcStrSerialize (FcSerialize *serialize, const FcChar8 *str);
11502c393a42Smrg
11515e61939bSmrg/* fcobjs.c */
11525e61939bSmrg
11535e61939bSmrgFcPrivate FcObject
11545e61939bSmrgFcObjectLookupIdByName (const char *str);
11555e61939bSmrg
11565e61939bSmrgFcPrivate FcObject
11575e61939bSmrgFcObjectLookupBuiltinIdByName (const char *str);
11585e61939bSmrg
11595e61939bSmrgFcPrivate const char *
11605e61939bSmrgFcObjectLookupOtherNameById (FcObject id);
11615e61939bSmrg
11625e61939bSmrgFcPrivate const FcObjectType *
11635e61939bSmrgFcObjectLookupOtherTypeById (FcObject id);
11645e61939bSmrg
11655e61939bSmrgFcPrivate const FcObjectType *
11665e61939bSmrgFcObjectLookupOtherTypeByName (const char *str);
11675e61939bSmrg
11682c393a42Smrg#endif /* _FC_INT_H_ */
1169