Move FcStat to separate compilation unit
[platform/upstream/fontconfig.git] / src / fcint.h
1 /*
2  * fontconfig/src/fcint.h
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 #ifndef _FCINT_H_
26 #define _FCINT_H_
27
28 #ifdef HAVE_CONFIG_H
29 #include <config.h>
30 #endif
31
32 #include <stdlib.h>
33 #include <stdio.h>
34 #ifdef HAVE_INTTYPES_H
35 #include <inttypes.h>
36 #elif defined(HAVE_STDINT_H)
37 #include <stdint.h>
38 #else
39 #error missing C99 integer data types
40 #endif
41 #include <string.h>
42 #include <ctype.h>
43 #include <errno.h>
44 #include <unistd.h>
45 #include <stddef.h>
46 #include <sys/types.h>
47 #include <sys/stat.h>
48 #include <time.h>
49 #include <fontconfig/fontconfig.h>
50 #include <fontconfig/fcprivate.h>
51 #include "fcdeprecate.h"
52
53 #ifndef FC_CONFIG_PATH
54 #define FC_CONFIG_PATH "fonts.conf"
55 #endif
56
57 #ifdef _WIN32
58 #  define _WIN32_WINNT 0x0500
59 #  define WIN32_LEAN_AND_MEAN
60 #  define STRICT
61 #  include <windows.h>
62 typedef UINT (WINAPI *pfnGetSystemWindowsDirectory)(LPSTR, UINT);
63 typedef HRESULT (WINAPI *pfnSHGetFolderPathA)(HWND, int, HANDLE, DWORD, LPSTR);
64 extern pfnGetSystemWindowsDirectory pGetSystemWindowsDirectory;
65 extern pfnSHGetFolderPathA pSHGetFolderPathA;
66 #  define FC_SEARCH_PATH_SEPARATOR ';'
67 #  define FC_DIR_SEPARATOR         '\\'
68 #  define FC_DIR_SEPARATOR_S       "\\"
69 #else
70 #  define FC_SEARCH_PATH_SEPARATOR ':'
71 #  define FC_DIR_SEPARATOR         '/'
72 #  define FC_DIR_SEPARATOR_S       "/"
73 #endif
74
75 #define FC_DBG_MATCH    1
76 #define FC_DBG_MATCHV   2
77 #define FC_DBG_EDIT     4
78 #define FC_DBG_FONTSET  8
79 #define FC_DBG_CACHE    16
80 #define FC_DBG_CACHEV   32
81 #define FC_DBG_PARSE    64
82 #define FC_DBG_SCAN     128
83 #define FC_DBG_SCANV    256
84 #define FC_DBG_MEMORY   512
85 #define FC_DBG_CONFIG   1024
86 #define FC_DBG_LANGSET  2048
87 #define FC_DBG_OBJTYPES 4096
88
89 #define FC_MEM_CHARSET      0
90 #define FC_MEM_CHARLEAF     1
91 #define FC_MEM_FONTSET      2
92 #define FC_MEM_FONTPTR      3
93 #define FC_MEM_OBJECTSET    4
94 #define FC_MEM_OBJECTPTR    5
95 #define FC_MEM_MATRIX       6
96 #define FC_MEM_PATTERN      7
97 #define FC_MEM_PATELT       8
98 #define FC_MEM_VALLIST      9
99 #define FC_MEM_SUBSTATE     10
100 #define FC_MEM_STRING       11
101 #define FC_MEM_LISTBUCK     12
102 #define FC_MEM_STRSET       13
103 #define FC_MEM_STRLIST      14
104 #define FC_MEM_CONFIG       15
105 #define FC_MEM_LANGSET      16
106 #define FC_MEM_ATOMIC       17
107 #define FC_MEM_BLANKS       18
108 #define FC_MEM_CACHE        19
109 #define FC_MEM_STRBUF       20
110 #define FC_MEM_SUBST        21
111 #define FC_MEM_OBJECTTYPE   22
112 #define FC_MEM_CONSTANT     23
113 #define FC_MEM_TEST         24
114 #define FC_MEM_EXPR         25
115 #define FC_MEM_VSTACK       26
116 #define FC_MEM_ATTR         27
117 #define FC_MEM_PSTACK       28
118 #define FC_MEM_SHAREDSTR    29
119
120 #define FC_MEM_NUM          30
121
122 #define _FC_ASSERT_STATIC1(_line, _cond) typedef int _static_assert_on_line_##_line##_failed[(_cond)?1:-1]
123 #define _FC_ASSERT_STATIC0(_line, _cond) _FC_ASSERT_STATIC1 (_line, (_cond))
124 #define FC_ASSERT_STATIC(_cond) _FC_ASSERT_STATIC0 (__LINE__, (_cond))
125
126 #define FC_MIN(a,b) ((a) < (b) ? (a) : (b))
127 #define FC_MAX(a,b) ((a) > (b) ? (a) : (b))
128 #define FC_ABS(a)   ((a) < 0 ? -(a) : (a))
129
130 /* slim_internal.h */
131 #if (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 3)) && defined(__ELF__) && !defined(__sun)
132 #define FcPrivate               __attribute__((__visibility__("hidden")))
133 #define HAVE_GNUC_ATTRIBUTE 1
134 #include "fcalias.h"
135 #elif defined(__SUNPRO_C) && (__SUNPRO_C >= 0x550)
136 #define FcPrivate               __hidden
137 #else /* not gcc >= 3.3 and not Sun Studio >= 8 */
138 #define FcPrivate
139 #endif
140
141 typedef enum _FcValueBinding {
142     FcValueBindingWeak, FcValueBindingStrong, FcValueBindingSame
143 } FcValueBinding;
144
145 /*
146  * Serialized data structures use only offsets instead of pointers
147  * A low bit of 1 indicates an offset.
148  */
149
150 /* Is the provided pointer actually an offset? */
151 #define FcIsEncodedOffset(p)    ((((intptr_t) (p)) & 1) != 0)
152
153 /* Encode offset in a pointer of type t */
154 #define FcOffsetEncode(o,t)     ((t *) ((o) | 1))
155
156 /* Decode a pointer into an offset */
157 #define FcOffsetDecode(p)       (((intptr_t) (p)) & ~1)
158
159 /* Compute pointer offset */
160 #define FcPtrToOffset(b,p)      ((intptr_t) (p) - (intptr_t) (b))
161
162 /* Given base address, offset and type, return a pointer */
163 #define FcOffsetToPtr(b,o,t)    ((t *) ((intptr_t) (b) + (o)))
164
165 /* Given base address, encoded offset and type, return a pointer */
166 #define FcEncodedOffsetToPtr(b,p,t) FcOffsetToPtr(b,FcOffsetDecode(p),t)
167
168 /* Given base address, pointer and type, return an encoded offset */
169 #define FcPtrToEncodedOffset(b,p,t) FcOffsetEncode(FcPtrToOffset(b,p),t)
170
171 /* Given a structure, offset member and type, return pointer */
172 #define FcOffsetMember(s,m,t)       FcOffsetToPtr(s,(s)->m,t)
173
174 /* Given a structure, encoded offset member and type, return pointer to member */
175 #define FcEncodedOffsetMember(s,m,t) FcOffsetToPtr(s,FcOffsetDecode((s)->m), t)
176
177 /* Given a structure, member and type, convert the member to a pointer */
178 #define FcPointerMember(s,m,t)  (FcIsEncodedOffset((s)->m) ? \
179                                  FcEncodedOffsetMember (s,m,t) : \
180                                  (s)->m)
181
182 /*
183  * Serialized values may hold strings, charsets and langsets as pointers,
184  * unfortunately FcValue is an exposed type so we can't just always use
185  * offsets
186  */
187 #define FcValueString(v)        FcPointerMember(v,u.s,FcChar8)
188 #define FcValueCharSet(v)       FcPointerMember(v,u.c,const FcCharSet)
189 #define FcValueLangSet(v)       FcPointerMember(v,u.l,const FcLangSet)
190
191 typedef struct _FcValueList *FcValueListPtr;
192
193 typedef struct _FcValueList {
194     struct _FcValueList *next;
195     FcValue             value;
196     FcValueBinding      binding;
197 } FcValueList;
198
199 #define FcValueListNext(vl)     FcPointerMember(vl,next,FcValueList)
200                         
201 typedef int FcObject;
202
203 typedef struct _FcPatternElt *FcPatternEltPtr;
204
205 /*
206  * Pattern elts are stuck in a structure connected to the pattern,
207  * so they get moved around when the pattern is resized. Hence, the
208  * values field must be a pointer/offset instead of just an offset
209  */
210 typedef struct _FcPatternElt {
211     FcObject            object;
212     FcValueList         *values;
213 } FcPatternElt;
214
215 #define FcPatternEltValues(pe)  FcPointerMember(pe,values,FcValueList)
216
217 struct _FcPattern {
218     int             num;
219     int             size;
220     intptr_t        elts_offset;
221     int             ref;
222 };
223
224 #define FcPatternElts(p)        FcOffsetMember(p,elts_offset,FcPatternElt)
225
226 #define FcFontSetFonts(fs)      FcPointerMember(fs,fonts,FcPattern *)
227
228 #define FcFontSetFont(fs,i)     (FcIsEncodedOffset((fs)->fonts) ? \
229                                  FcEncodedOffsetToPtr(fs, \
230                                                       FcFontSetFonts(fs)[i], \
231                                                       FcPattern) : \
232                                  fs->fonts[i])
233                                                 
234 typedef enum _FcOp {
235     FcOpInteger, FcOpDouble, FcOpString, FcOpMatrix, FcOpRange, FcOpBool, FcOpCharSet, FcOpLangSet,
236     FcOpNil,
237     FcOpField, FcOpConst,
238     FcOpAssign, FcOpAssignReplace,
239     FcOpPrependFirst, FcOpPrepend, FcOpAppend, FcOpAppendLast,
240     FcOpQuest,
241     FcOpOr, FcOpAnd, FcOpEqual, FcOpNotEqual,
242     FcOpContains, FcOpListing, FcOpNotContains,
243     FcOpLess, FcOpLessEqual, FcOpMore, FcOpMoreEqual,
244     FcOpPlus, FcOpMinus, FcOpTimes, FcOpDivide,
245     FcOpNot, FcOpComma, FcOpFloor, FcOpCeil, FcOpRound, FcOpTrunc,
246     FcOpInvalid
247 } FcOp;
248
249 typedef enum _FcOpFlags {
250         FcOpFlagIgnoreBlanks = 1 << 0
251 } FcOpFlags;
252
253 #define FC_OP_GET_OP(_x_)       ((_x_) & 0xffff)
254 #define FC_OP_GET_FLAGS(_x_)    (((_x_) & 0xffff0000) >> 16)
255 #define FC_OP(_x_,_f_)          (FC_OP_GET_OP (_x_) | ((_f_) << 16))
256
257 typedef struct _FcExpr {
258     FcOp   op;
259     union {
260         int         ival;
261         double      dval;
262         const FcChar8       *sval;
263         FcMatrix    *mval;
264         FcBool      bval;
265         FcCharSet   *cval;
266         FcLangSet   *lval;
267         FcObject    object;
268         const FcChar8       *constant;
269         struct {
270             struct _FcExpr *left, *right;
271         } tree;
272     } u;
273 } FcExpr;
274
275 typedef struct _FcExprPage FcExprPage;
276
277 struct _FcExprPage {
278   FcExprPage *next_page;
279   FcExpr *next;
280   FcExpr exprs[(1024 - 2/* two pointers */ - 2/* malloc overhead */) * sizeof (void *) / sizeof (FcExpr)];
281   FcExpr end[];
282 };
283
284 typedef enum _FcQual {
285     FcQualAny, FcQualAll, FcQualFirst, FcQualNotFirst
286 } FcQual;
287
288 #define FcMatchDefault  ((FcMatchKind) -1)
289
290 typedef struct _FcTest {
291     struct _FcTest      *next;
292     FcMatchKind         kind;
293     FcQual              qual;
294     FcObject            object;
295     FcOp                op;
296     FcExpr              *expr;
297 } FcTest;
298
299 typedef struct _FcEdit {
300     struct _FcEdit *next;
301     FcObject        object;
302     FcOp            op;
303     FcExpr          *expr;
304     FcValueBinding  binding;
305 } FcEdit;
306
307 typedef struct _FcSubst {
308     struct _FcSubst     *next;
309     FcTest              *test;
310     FcEdit              *edit;
311 } FcSubst;
312
313 typedef struct _FcCharLeaf {
314     FcChar32    map[256/32];
315 } FcCharLeaf;
316
317 #define FC_REF_CONSTANT     -1
318
319 struct _FcCharSet {
320     int             ref;        /* reference count */
321     int             num;        /* size of leaves and numbers arrays */
322     intptr_t        leaves_offset;
323     intptr_t        numbers_offset;
324 };
325
326 #define FcCharSetLeaves(c)      FcOffsetMember(c,leaves_offset,intptr_t)
327 #define FcCharSetLeaf(c,i)      (FcOffsetToPtr(FcCharSetLeaves(c), \
328                                                FcCharSetLeaves(c)[i], \
329                                                FcCharLeaf))
330 #define FcCharSetNumbers(c)     FcOffsetMember(c,numbers_offset,FcChar16)
331
332 struct _FcStrSet {
333     int             ref;        /* reference count */
334     int             num;
335     int             size;
336     FcChar8         **strs;
337 };
338
339 struct _FcStrList {
340     FcStrSet        *set;
341     int             n;
342 };
343
344 typedef struct _FcStrBuf {
345     FcChar8 *buf;
346     FcBool  allocated;
347     FcBool  failed;
348     int     len;
349     int     size;
350     FcChar8 buf_static[16 * sizeof (void *)];
351 } FcStrBuf;
352
353 struct _FcCache {
354     int         magic;              /* FC_CACHE_MAGIC_MMAP or FC_CACHE_ALLOC */
355     int         version;            /* FC_CACHE_CONTENT_VERSION */
356     intptr_t    size;               /* size of file */
357     intptr_t    dir;                /* offset to dir name */
358     intptr_t    dirs;               /* offset to subdirs */
359     int         dirs_count;         /* number of subdir strings */
360     intptr_t    set;                /* offset to font set */
361     int         mtime;              /* low bits of directory mtime */
362 };
363
364 #undef FcCacheDir
365 #undef FcCacheSubdir
366 #define FcCacheDir(c)   FcOffsetMember(c,dir,FcChar8)
367 #define FcCacheDirs(c)  FcOffsetMember(c,dirs,intptr_t)
368 #define FcCacheSet(c)   FcOffsetMember(c,set,FcFontSet)
369 #define FcCacheSubdir(c,i)  FcOffsetToPtr (FcCacheDirs(c),\
370                                            FcCacheDirs(c)[i], \
371                                            FcChar8)
372
373 /*
374  * Used while constructing a directory cache object
375  */
376
377 #define FC_SERIALIZE_HASH_SIZE  8191
378
379 typedef union _FcAlign {
380     double      d;
381     int         i;
382     intptr_t    ip;
383     FcBool      b;
384     void        *p;
385 } FcAlign;
386
387 typedef struct _FcSerializeBucket {
388     struct _FcSerializeBucket *next;
389     const void  *object;
390     intptr_t    offset;
391 } FcSerializeBucket;
392
393 typedef struct _FcCharSetFreezer FcCharSetFreezer;
394
395 typedef struct _FcSerialize {
396     intptr_t            size;
397     FcCharSetFreezer    *cs_freezer;
398     void                *linear;
399     FcSerializeBucket   *buckets[FC_SERIALIZE_HASH_SIZE];
400 } FcSerialize;
401
402 /*
403  * To map adobe glyph names to unicode values, a precomputed hash
404  * table is used
405  */
406
407 typedef struct _FcGlyphName {
408     FcChar32    ucs;            /* unicode value */
409     FcChar8     name[1];        /* name extends beyond struct */
410 } FcGlyphName;
411
412 /*
413  * To perform case-insensitive string comparisons, a table
414  * is used which holds three different kinds of folding data.
415  *
416  * The first is a range of upper case values mapping to a range
417  * of their lower case equivalents.  Within each range, the offset
418  * between upper and lower case is constant.
419  *
420  * The second is a range of upper case values which are interleaved
421  * with their lower case equivalents.
422  *
423  * The third is a set of raw unicode values mapping to a list
424  * of unicode values for comparison purposes.  This allows conversion
425  * of ß to "ss" so that SS, ss and ß all match.  A separate array
426  * holds the list of unicode values for each entry.
427  *
428  * These are packed into a single table.  Using a binary search,
429  * the appropriate entry can be located.
430  */
431
432 #define FC_CASE_FOLD_RANGE          0
433 #define FC_CASE_FOLD_EVEN_ODD       1
434 #define FC_CASE_FOLD_FULL           2
435
436 typedef struct _FcCaseFold {
437     FcChar32    upper;
438     FcChar16    method : 2;
439     FcChar16    count : 14;
440     short       offset;     /* lower - upper for RANGE, table id for FULL */
441 } FcCaseFold;
442
443 #define FC_MAX_FILE_LEN     4096
444
445 #define FC_CACHE_MAGIC_MMAP         0xFC02FC04
446 #define FC_CACHE_MAGIC_ALLOC        0xFC02FC05
447 #define FC_CACHE_CONTENT_VERSION    3 /* also check FC_CACHE_VERSION */
448
449 struct _FcAtomic {
450     FcChar8     *file;          /* original file name */
451     FcChar8     *new;           /* temp file name -- write data here */
452     FcChar8     *lck;           /* lockfile name (used for locking) */
453     FcChar8     *tmp;           /* tmpfile name (used for locking) */
454 };
455
456 struct _FcBlanks {
457     int         nblank;
458     int         sblank;
459     FcChar32    *blanks;
460 };
461
462 struct _FcConfig {
463     /*
464      * File names loaded from the configuration -- saved here as the
465      * cache file must be consulted before the directories are scanned,
466      * and those directives may occur in any order
467      */
468     FcStrSet    *configDirs;        /* directories to scan for fonts */
469     /*
470      * Set of allowed blank chars -- used to
471      * trim fonts of bogus glyphs
472      */
473     FcBlanks    *blanks;
474     /*
475      * List of directories containing fonts,
476      * built by recursively scanning the set
477      * of configured directories
478      */
479     FcStrSet    *fontDirs;
480     /*
481      * List of directories containing cache files.
482      */
483     FcStrSet    *cacheDirs;
484     /*
485      * Names of all of the configuration files used
486      * to create this configuration
487      */
488     FcStrSet    *configFiles;       /* config files loaded */
489     /*
490      * Substitution instructions for patterns and fonts;
491      * maxObjects is used to allocate appropriate intermediate storage
492      * while performing a whole set of substitutions
493      */
494     FcSubst     *substPattern;      /* substitutions for patterns */
495     FcSubst     *substFont;         /* substitutions for fonts */
496     FcSubst     *substScan;         /* substitutions for scanned fonts */
497     int         maxObjects;         /* maximum number of tests in all substs */
498     /*
499      * List of patterns used to control font file selection
500      */
501     FcStrSet    *acceptGlobs;
502     FcStrSet    *rejectGlobs;
503     FcFontSet   *acceptPatterns;
504     FcFontSet   *rejectPatterns;
505     /*
506      * The set of fonts loaded from the listed directories; the
507      * order within the set does not determine the font selection,
508      * except in the case of identical matches in which case earlier fonts
509      * match preferrentially
510      */
511     FcFontSet   *fonts[FcSetApplication + 1];
512     /*
513      * Fontconfig can periodically rescan the system configuration
514      * and font directories.  This rescanning occurs when font
515      * listing requests are made, but no more often than rescanInterval
516      * seconds apart.
517      */
518     time_t      rescanTime;         /* last time information was scanned */
519     int         rescanInterval;     /* interval between scans */
520
521     int         ref;                /* reference count */
522
523     FcExprPage *expr_pool;          /* pool of FcExpr's */
524 };
525
526 extern FcPrivate FcConfig       *_fcConfig;
527
528 typedef struct _FcFileTime {
529     time_t  time;
530     FcBool  set;
531 } FcFileTime;
532
533 typedef struct _FcCharMap FcCharMap;
534
535 typedef struct _FcRange     FcRange;
536
537 struct _FcRange {
538     FcChar32 begin;
539     FcChar32 end;
540 };
541
542 /* fcblanks.c */
543
544 /* fccache.c */
545
546 FcPrivate FcCache *
547 FcDirCacheScan (const FcChar8 *dir, FcConfig *config);
548
549 FcPrivate FcCache *
550 FcDirCacheBuild (FcFontSet *set, const FcChar8 *dir, struct stat *dir_stat, FcStrSet *dirs);
551
552 FcPrivate FcBool
553 FcDirCacheWrite (FcCache *cache, FcConfig *config);
554
555 FcPrivate FcBool
556 FcDirCacheCreateTagFile (const FcChar8 *cache_dir);
557
558 FcPrivate void
559 FcCacheObjectReference (void *object);
560
561 FcPrivate void
562 FcCacheObjectDereference (void *object);
563
564 FcPrivate void
565 FcCacheFini (void);
566
567 FcPrivate void
568 FcDirCacheReference (FcCache *cache, int nref);
569
570 /* fccfg.c */
571
572 FcPrivate FcChar8 *
573 FcConfigXdgCacheHome (void);
574
575 FcPrivate FcChar8 *
576 FcConfigXdgConfigHome (void);
577
578 FcPrivate FcChar8 *
579 FcConfigXdgDataHome (void);
580
581 FcPrivate FcExpr *
582 FcConfigAllocExpr (FcConfig *config);
583
584 FcPrivate FcBool
585 FcConfigAddConfigDir (FcConfig      *config,
586                       const FcChar8 *d);
587
588 FcPrivate FcBool
589 FcConfigAddFontDir (FcConfig        *config,
590                     const FcChar8   *d);
591
592 FcPrivate FcBool
593 FcConfigAddDir (FcConfig        *config,
594                 const FcChar8   *d);
595
596 FcPrivate FcBool
597 FcConfigAddCacheDir (FcConfig       *config,
598                      const FcChar8  *d);
599
600 FcPrivate FcBool
601 FcConfigAddConfigFile (FcConfig         *config,
602                        const FcChar8    *f);
603
604 FcPrivate FcBool
605 FcConfigAddBlank (FcConfig      *config,
606                   FcChar32      blank);
607
608 FcPrivate FcBool
609 FcConfigAddEdit (FcConfig       *config,
610                  FcTest         *test,
611                  FcEdit         *edit,
612                  FcMatchKind    kind);
613
614 FcPrivate void
615 FcConfigSetFonts (FcConfig      *config,
616                   FcFontSet     *fonts,
617                   FcSetName     set);
618
619 FcPrivate FcBool
620 FcConfigCompareValue (const FcValue *m,
621                       FcOp          op,
622                       const FcValue *v);
623
624 FcPrivate FcBool
625 FcConfigGlobAdd (FcConfig       *config,
626                  const FcChar8  *glob,
627                  FcBool         accept);
628
629 FcPrivate FcBool
630 FcConfigAcceptFilename (FcConfig        *config,
631                         const FcChar8   *filename);
632
633 FcPrivate FcBool
634 FcConfigPatternsAdd (FcConfig   *config,
635                      FcPattern  *pattern,
636                      FcBool     accept);
637
638 FcPrivate FcBool
639 FcConfigAcceptFont (FcConfig        *config,
640                     const FcPattern *font);
641
642 FcPrivate FcFileTime
643 FcConfigModifiedTime (FcConfig *config);
644
645 FcPrivate FcBool
646 FcConfigAddCache (FcConfig *config, FcCache *cache,
647                   FcSetName set, FcStrSet *dirSet);
648
649 /* fcserialize.c */
650 FcPrivate intptr_t
651 FcAlignSize (intptr_t size);
652
653 FcPrivate FcSerialize *
654 FcSerializeCreate (void);
655
656 FcPrivate void
657 FcSerializeDestroy (FcSerialize *serialize);
658
659 FcPrivate FcBool
660 FcSerializeAlloc (FcSerialize *serialize, const void *object, int size);
661
662 FcPrivate intptr_t
663 FcSerializeReserve (FcSerialize *serialize, int size);
664
665 FcPrivate intptr_t
666 FcSerializeOffset (FcSerialize *serialize, const void *object);
667
668 FcPrivate void *
669 FcSerializePtr (FcSerialize *serialize, const void *object);
670
671 FcPrivate FcBool
672 FcLangSetSerializeAlloc (FcSerialize *serialize, const FcLangSet *l);
673
674 FcPrivate FcLangSet *
675 FcLangSetSerialize(FcSerialize *serialize, const FcLangSet *l);
676
677 /* fccharset.c */
678 FcPrivate void
679 FcLangCharSetPopulate (void);
680
681 FcPrivate FcCharSetFreezer *
682 FcCharSetFreezerCreate (void);
683
684 FcPrivate const FcCharSet *
685 FcCharSetFreeze (FcCharSetFreezer *freezer, const FcCharSet *fcs);
686
687 FcPrivate void
688 FcCharSetFreezerDestroy (FcCharSetFreezer *freezer);
689
690 FcPrivate FcBool
691 FcNameUnparseCharSet (FcStrBuf *buf, const FcCharSet *c);
692
693 FcPrivate FcCharSet *
694 FcNameParseCharSet (FcChar8 *string);
695
696 FcPrivate FcBool
697 FcNameUnparseValue (FcStrBuf    *buf,
698                     FcValue     *v0,
699                     FcChar8     *escape);
700
701 FcPrivate FcBool
702 FcNameUnparseValueList (FcStrBuf        *buf,
703                         FcValueListPtr  v,
704                         FcChar8         *escape);
705
706 FcPrivate FcCharLeaf *
707 FcCharSetFindLeafCreate (FcCharSet *fcs, FcChar32 ucs4);
708
709 FcPrivate FcBool
710 FcCharSetSerializeAlloc(FcSerialize *serialize, const FcCharSet *cs);
711
712 FcPrivate FcCharSet *
713 FcCharSetSerialize(FcSerialize *serialize, const FcCharSet *cs);
714
715 FcPrivate FcChar16 *
716 FcCharSetGetNumbers(const FcCharSet *c);
717
718 /* fcdbg.c */
719 FcPrivate void
720 FcValuePrintWithPosition (const FcValue v, FcBool show_pos_mark);
721
722 FcPrivate void
723 FcValueListPrintWithPosition (FcValueListPtr l, const FcValueListPtr pos);
724
725 FcPrivate void
726 FcValueListPrint (FcValueListPtr l);
727
728 FcPrivate void
729 FcLangSetPrint (const FcLangSet *ls);
730
731 FcPrivate void
732 FcOpPrint (FcOp op);
733
734 FcPrivate void
735 FcTestPrint (const FcTest *test);
736
737 FcPrivate void
738 FcExprPrint (const FcExpr *expr);
739
740 FcPrivate void
741 FcEditPrint (const FcEdit *edit);
742
743 FcPrivate void
744 FcSubstPrint (const FcSubst *subst);
745
746 FcPrivate void
747 FcCharSetPrint (const FcCharSet *c);
748
749 extern FcPrivate int FcDebugVal;
750
751 #define FcDebug() (FcDebugVal)
752
753 FcPrivate void
754 FcInitDebug (void);
755
756 /* fcdefault.c */
757 FcPrivate FcChar8 *
758 FcGetDefaultLang (void);
759
760 /* fcdir.c */
761
762 FcPrivate FcBool
763 FcFileScanConfig (FcFontSet     *set,
764                   FcStrSet      *dirs,
765                   FcBlanks      *blanks,
766                   const FcChar8 *file,
767                   FcConfig      *config);
768
769 FcPrivate FcBool
770 FcDirScanConfig (FcFontSet      *set,
771                  FcStrSet       *dirs,
772                  FcBlanks       *blanks,
773                  const FcChar8  *dir,
774                  FcBool         force,
775                  FcConfig       *config);
776
777 /* fcfont.c */
778 FcPrivate int
779 FcFontDebug (void);
780
781 /* fcfs.c */
782
783 FcPrivate FcBool
784 FcFontSetSerializeAlloc (FcSerialize *serialize, const FcFontSet *s);
785
786 FcPrivate FcFontSet *
787 FcFontSetSerialize (FcSerialize *serialize, const FcFontSet * s);
788
789 /* fcxml.c */
790 FcPrivate void
791 FcTestDestroy (FcTest *test);
792
793 FcPrivate void
794 FcEditDestroy (FcEdit *e);
795
796 /* fcinit.c */
797
798 FcPrivate void
799 FcMemReport (void);
800
801 FcPrivate void
802 FcMemAlloc (int kind, int size);
803
804 FcPrivate void
805 FcMemFree (int kind, int size);
806
807 /* fclang.c */
808 FcPrivate FcLangSet *
809 FcFreeTypeLangSet (const FcCharSet  *charset,
810                    const FcChar8    *exclusiveLang);
811
812 FcPrivate FcLangResult
813 FcLangCompare (const FcChar8 *s1, const FcChar8 *s2);
814
815 FcPrivate FcLangSet *
816 FcLangSetPromote (const FcChar8 *lang);
817
818 FcPrivate FcLangSet *
819 FcNameParseLangSet (const FcChar8 *string);
820
821 FcPrivate FcBool
822 FcNameUnparseLangSet (FcStrBuf *buf, const FcLangSet *ls);
823
824 FcPrivate FcChar8 *
825 FcNameUnparseEscaped (FcPattern *pat, FcBool escape);
826
827 /* fclist.c */
828
829 FcPrivate FcBool
830 FcListPatternMatchAny (const FcPattern *p,
831                        const FcPattern *font);
832
833 /* fcmatch.c */
834
835 /* fcname.c */
836
837 /*
838  * NOTE -- this ordering is part of the cache file format.
839  * It must also match the ordering in fcname.c
840  */
841
842 #define FC_FAMILY_OBJECT        1
843 #define FC_FAMILYLANG_OBJECT    2
844 #define FC_STYLE_OBJECT         3
845 #define FC_STYLELANG_OBJECT     4
846 #define FC_FULLNAME_OBJECT      5
847 #define FC_FULLNAMELANG_OBJECT  6
848 #define FC_SLANT_OBJECT         7
849 #define FC_WEIGHT_OBJECT        8
850 #define FC_WIDTH_OBJECT         9
851 #define FC_SIZE_OBJECT          10
852 #define FC_ASPECT_OBJECT        11
853 #define FC_PIXEL_SIZE_OBJECT    12
854 #define FC_SPACING_OBJECT       13
855 #define FC_FOUNDRY_OBJECT       14
856 #define FC_ANTIALIAS_OBJECT     15
857 #define FC_HINT_STYLE_OBJECT    16
858 #define FC_HINTING_OBJECT       17
859 #define FC_VERTICAL_LAYOUT_OBJECT       18
860 #define FC_AUTOHINT_OBJECT      19
861 #define FC_GLOBAL_ADVANCE_OBJECT        20
862 #define FC_FILE_OBJECT          21
863 #define FC_INDEX_OBJECT         22
864 #define FC_RASTERIZER_OBJECT    23
865 #define FC_OUTLINE_OBJECT       24
866 #define FC_SCALABLE_OBJECT      25
867 #define FC_DPI_OBJECT           26
868 #define FC_RGBA_OBJECT          27
869 #define FC_SCALE_OBJECT         28
870 #define FC_MINSPACE_OBJECT      29
871 #define FC_CHAR_WIDTH_OBJECT    30
872 #define FC_CHAR_HEIGHT_OBJECT   31
873 #define FC_MATRIX_OBJECT        32
874 #define FC_CHARSET_OBJECT       33
875 #define FC_LANG_OBJECT          34
876 #define FC_FONTVERSION_OBJECT   35
877 #define FC_CAPABILITY_OBJECT    36
878 #define FC_FONTFORMAT_OBJECT    37
879 #define FC_EMBOLDEN_OBJECT      38
880 #define FC_EMBEDDED_BITMAP_OBJECT       39
881 #define FC_DECORATIVE_OBJECT    40
882 #define FC_LCD_FILTER_OBJECT    41
883 #define FC_NAMELANG_OBJECT      42
884 #define FC_MAX_BASE_OBJECT      FC_NAMELANG_OBJECT
885
886 FcPrivate FcBool
887 FcNameBool (const FcChar8 *v, FcBool *result);
888
889 FcPrivate FcBool
890 FcObjectValidType (FcObject object, FcType type);
891
892 FcPrivate FcObject
893 FcObjectFromName (const char * name);
894
895 FcPrivate const char *
896 FcObjectName (FcObject object);
897
898 FcPrivate FcObjectSet *
899 FcObjectGetSet (void);
900
901 FcPrivate FcBool
902 FcObjectInit (void);
903
904 FcPrivate void
905 FcObjectFini (void);
906
907 #define FcObjectCompare(a, b)   ((int) a - (int) b)
908
909 /* fcpat.c */
910
911 FcPrivate FcValue
912 FcValueCanonicalize (const FcValue *v);
913
914 FcPrivate void
915 FcValueListDestroy (FcValueListPtr l);
916
917 FcPrivate FcPatternElt *
918 FcPatternObjectFindElt (const FcPattern *p, FcObject object);
919
920 FcPrivate FcPatternElt *
921 FcPatternObjectInsertElt (FcPattern *p, FcObject object);
922
923 FcPrivate FcBool
924 FcPatternObjectAddWithBinding  (FcPattern       *p,
925                                 FcObject        object,
926                                 FcValue         value,
927                                 FcValueBinding  binding,
928                                 FcBool          append);
929
930 FcPrivate FcBool
931 FcPatternObjectAdd (FcPattern *p, FcObject object, FcValue value, FcBool append);
932
933 FcPrivate FcBool
934 FcPatternObjectAddWeak (FcPattern *p, FcObject object, FcValue value, FcBool append);
935
936 FcPrivate FcResult
937 FcPatternObjectGet (const FcPattern *p, FcObject object, int id, FcValue *v);
938
939 FcPrivate FcBool
940 FcPatternObjectDel (FcPattern *p, FcObject object);
941
942 FcPrivate FcBool
943 FcPatternObjectRemove (FcPattern *p, FcObject object, int id);
944
945 FcPrivate FcBool
946 FcPatternObjectAddInteger (FcPattern *p, FcObject object, int i);
947
948 FcPrivate FcBool
949 FcPatternObjectAddDouble (FcPattern *p, FcObject object, double d);
950
951 FcPrivate FcBool
952 FcPatternObjectAddString (FcPattern *p, FcObject object, const FcChar8 *s);
953
954 FcPrivate FcBool
955 FcPatternObjectAddMatrix (FcPattern *p, FcObject object, const FcMatrix *s);
956
957 FcPrivate FcBool
958 FcPatternObjectAddCharSet (FcPattern *p, FcObject object, const FcCharSet *c);
959
960 FcPrivate FcBool
961 FcPatternObjectAddBool (FcPattern *p, FcObject object, FcBool b);
962
963 FcPrivate FcBool
964 FcPatternObjectAddLangSet (FcPattern *p, FcObject object, const FcLangSet *ls);
965
966 FcPrivate FcResult
967 FcPatternObjectGetInteger (const FcPattern *p, FcObject object, int n, int *i);
968
969 FcPrivate FcResult
970 FcPatternObjectGetDouble (const FcPattern *p, FcObject object, int n, double *d);
971
972 FcPrivate FcResult
973 FcPatternObjectGetString (const FcPattern *p, FcObject object, int n, FcChar8 ** s);
974
975 FcPrivate FcResult
976 FcPatternObjectGetMatrix (const FcPattern *p, FcObject object, int n, FcMatrix **s);
977
978 FcPrivate FcResult
979 FcPatternObjectGetCharSet (const FcPattern *p, FcObject object, int n, FcCharSet **c);
980
981 FcPrivate FcResult
982 FcPatternObjectGetBool (const FcPattern *p, FcObject object, int n, FcBool *b);
983
984 FcPrivate FcResult
985 FcPatternObjectGetLangSet (const FcPattern *p, FcObject object, int n, FcLangSet **ls);
986
987 FcPrivate FcBool
988 FcPatternAppend (FcPattern *p, FcPattern *s);
989
990 FcPrivate const FcChar8 *
991 FcSharedStr (const FcChar8 *name);
992
993 FcPrivate FcBool
994 FcSharedStrFree (const FcChar8 *name);
995
996 FcPrivate FcChar32
997 FcStringHash (const FcChar8 *s);
998
999 FcPrivate FcBool
1000 FcPatternSerializeAlloc (FcSerialize *serialize, const FcPattern *pat);
1001
1002 FcPrivate FcPattern *
1003 FcPatternSerialize (FcSerialize *serialize, const FcPattern *pat);
1004
1005 FcPrivate FcBool
1006 FcValueListSerializeAlloc (FcSerialize *serialize, const FcValueList *pat);
1007
1008 FcPrivate FcValueList *
1009 FcValueListSerialize (FcSerialize *serialize, const FcValueList *pat);
1010
1011 /* fcrender.c */
1012
1013 /* fcmatrix.c */
1014
1015 extern FcPrivate const FcMatrix    FcIdentityMatrix;
1016
1017 FcPrivate void
1018 FcMatrixFree (FcMatrix *mat);
1019
1020 /* fcstat.c */
1021
1022 FcPrivate int
1023 FcStat (const FcChar8 *file, struct stat *statb);
1024
1025 /* fcstr.c */
1026 FcPrivate void
1027 FcStrSetSort (FcStrSet * set);
1028
1029 FcPrivate void
1030 FcStrBufInit (FcStrBuf *buf, FcChar8 *init, int size);
1031
1032 FcPrivate void
1033 FcStrBufDestroy (FcStrBuf *buf);
1034
1035 FcPrivate FcChar8 *
1036 FcStrBufDone (FcStrBuf *buf);
1037
1038 FcPrivate FcChar8 *
1039 FcStrBufDoneStatic (FcStrBuf *buf);
1040
1041 FcPrivate FcBool
1042 FcStrBufChar (FcStrBuf *buf, FcChar8 c);
1043
1044 FcPrivate FcBool
1045 FcStrBufString (FcStrBuf *buf, const FcChar8 *s);
1046
1047 FcPrivate FcBool
1048 FcStrBufData (FcStrBuf *buf, const FcChar8 *s, int len);
1049
1050 FcPrivate int
1051 FcStrCmpIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
1052
1053 FcPrivate FcBool
1054 FcStrRegexCmp (const FcChar8 *s, const FcChar8 *regex);
1055
1056 FcPrivate FcBool
1057 FcStrRegexCmpIgnoreCase (const FcChar8 *s, const FcChar8 *regex);
1058
1059 FcPrivate const FcChar8 *
1060 FcStrContainsIgnoreBlanksAndCase (const FcChar8 *s1, const FcChar8 *s2);
1061
1062 FcPrivate const FcChar8 *
1063 FcStrContainsIgnoreCase (const FcChar8 *s1, const FcChar8 *s2);
1064
1065 FcPrivate const FcChar8 *
1066 FcStrContainsWord (const FcChar8 *s1, const FcChar8 *s2);
1067
1068 FcPrivate FcBool
1069 FcStrUsesHome (const FcChar8 *s);
1070
1071 FcPrivate FcChar8 *
1072 FcStrLastSlash (const FcChar8  *path);
1073
1074 FcPrivate FcChar32
1075 FcStrHashIgnoreCase (const FcChar8 *s);
1076
1077 FcPrivate FcChar8 *
1078 FcStrCanonFilename (const FcChar8 *s);
1079
1080 FcPrivate FcBool
1081 FcStrSerializeAlloc (FcSerialize *serialize, const FcChar8 *str);
1082
1083 FcPrivate FcChar8 *
1084 FcStrSerialize (FcSerialize *serialize, const FcChar8 *str);
1085
1086 #endif /* _FC_INT_H_ */