fcinit.c revision 1887081f
12c393a42Smrg/* 2a6844aabSmrg * fontconfig/src/fcinit.c 32c393a42Smrg * 42c393a42Smrg * Copyright © 2001 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 10ca08ab68Smrg * documentation, and that the name of the author(s) not be used in 112c393a42Smrg * advertising or publicity pertaining to distribution of the software without 12ca08ab68Smrg * 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 * 16a6844aabSmrg * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, 172c393a42Smrg * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO 18a6844aabSmrg * 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#include "fcint.h" 262c393a42Smrg#include <stdlib.h> 272c393a42Smrg 28c9710b42Smrg#if defined(FC_ATOMIC_INT_NIL) 296338c9e2Sriastradh#warning Could not find any system to define atomic_int macros, library may NOT be thread-safe. 30c9710b42Smrg#endif 31c9710b42Smrg#if defined(FC_MUTEX_IMPL_NIL) 326338c9e2Sriastradh#warning Could not find any system to define mutex macros, library may NOT be thread-safe. 33c9710b42Smrg#endif 34c9710b42Smrg#if defined(FC_ATOMIC_INT_NIL) || defined(FC_MUTEX_IMPL_NIL) 356338c9e2Sriastradh#warning To suppress these warnings, define FC_NO_MT. 36c9710b42Smrg#endif 37c9710b42Smrg 382c393a42Smrgstatic FcConfig * 3918bd4a06SmrgFcInitFallbackConfig (const FcChar8 *sysroot) 402c393a42Smrg{ 412c393a42Smrg FcConfig *config; 421887081fSmrg const FcChar8 *fallback = (const FcChar8 *) "" \ 431887081fSmrg "<fontconfig>" \ 441887081fSmrg " <dir>" FC_DEFAULT_FONTS "</dir>" \ 451887081fSmrg " <dir prefix=\"xdg\">fonts</dir>" \ 461887081fSmrg " <cachedir>" FC_CACHEDIR "</cachedir>" \ 471887081fSmrg " <cachedir prefix=\"xdg\">fontconfig</cachedir>" \ 481887081fSmrg " <include ignore_missing=\"yes\" prefix=\"xdg\">fontconfig/conf.d</include>" \ 491887081fSmrg " <include ignore_missing=\"yes\" prefix=\"xdg\">fontconfig/fonts.conf</include>" \ 501887081fSmrg "</fontconfig>"; 512c393a42Smrg 522c393a42Smrg config = FcConfigCreate (); 532c393a42Smrg if (!config) 542c393a42Smrg goto bail0; 5518bd4a06Smrg FcConfigSetSysRoot (config, sysroot); 561887081fSmrg if (!FcConfigParseAndLoadFromMemory (config, fallback, FcFalse)) 572c393a42Smrg goto bail1; 581887081fSmrg 592c393a42Smrg return config; 602c393a42Smrg 612c393a42Smrgbail1: 622c393a42Smrg FcConfigDestroy (config); 632c393a42Smrgbail0: 642c393a42Smrg return 0; 652c393a42Smrg} 662c393a42Smrg 672c393a42Smrgint 682c393a42SmrgFcGetVersion (void) 692c393a42Smrg{ 702c393a42Smrg return FC_VERSION; 712c393a42Smrg} 722c393a42Smrg 732c393a42Smrg/* 742c393a42Smrg * Load the configuration files 752c393a42Smrg */ 762c393a42SmrgFcConfig * 77c9710b42SmrgFcInitLoadOwnConfig (FcConfig *config) 782c393a42Smrg{ 79c9710b42Smrg if (!config) 80c9710b42Smrg { 81c9710b42Smrg config = FcConfigCreate (); 82c9710b42Smrg if (!config) 83c9710b42Smrg return NULL; 84c9710b42Smrg } 85ca08ab68Smrg 862c393a42Smrg FcInitDebug (); 87ca08ab68Smrg 882c393a42Smrg if (!FcConfigParseAndLoad (config, 0, FcTrue)) 892c393a42Smrg { 9018bd4a06Smrg const FcChar8 *sysroot = FcConfigGetSysRoot (config); 9118bd4a06Smrg FcConfig *fallback = FcInitFallbackConfig (sysroot); 9218bd4a06Smrg 932c393a42Smrg FcConfigDestroy (config); 9418bd4a06Smrg 9518bd4a06Smrg return fallback; 962c393a42Smrg } 971887081fSmrg (void) FcConfigParseOnly (config, (const FcChar8 *)FC_TEMPLATEDIR, FcFalse); 98ca08ab68Smrg 992c393a42Smrg if (config->cacheDirs && config->cacheDirs->num == 0) 1002c393a42Smrg { 101c9710b42Smrg FcChar8 *prefix, *p; 102ca08ab68Smrg size_t plen; 10318bd4a06Smrg FcBool have_own = FcFalse; 10418bd4a06Smrg char *env_file, *env_path; 105ca08ab68Smrg 10618bd4a06Smrg env_file = getenv ("FONTCONFIG_FILE"); 10718bd4a06Smrg env_path = getenv ("FONTCONFIG_PATH"); 10818bd4a06Smrg if ((env_file != NULL && env_file[0] != 0) || 10918bd4a06Smrg (env_path != NULL && env_path[0] != 0)) 11018bd4a06Smrg have_own = FcTrue; 11118bd4a06Smrg 11218bd4a06Smrg if (!have_own) 11318bd4a06Smrg { 11418bd4a06Smrg fprintf (stderr, 11518bd4a06Smrg "Fontconfig warning: no <cachedir> elements found. Check configuration.\n"); 11618bd4a06Smrg fprintf (stderr, 11718bd4a06Smrg "Fontconfig warning: adding <cachedir>%s</cachedir>\n", 11818bd4a06Smrg FC_CACHEDIR); 11918bd4a06Smrg } 120ca08ab68Smrg prefix = FcConfigXdgCacheHome (); 121ca08ab68Smrg if (!prefix) 122ca08ab68Smrg goto bail; 123c9710b42Smrg plen = strlen ((const char *)prefix); 124c9710b42Smrg p = realloc (prefix, plen + 12); 125c9710b42Smrg if (!p) 126ca08ab68Smrg goto bail; 127c9710b42Smrg prefix = p; 128ca08ab68Smrg memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11); 129ca08ab68Smrg prefix[plen + 11] = 0; 13018bd4a06Smrg if (!have_own) 13118bd4a06Smrg fprintf (stderr, 13218bd4a06Smrg "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n"); 133ca08ab68Smrg 1342c393a42Smrg if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) || 135ca08ab68Smrg !FcConfigAddCacheDir (config, (FcChar8 *) prefix)) 1362c393a42Smrg { 13718bd4a06Smrg FcConfig *fallback; 13818bd4a06Smrg const FcChar8 *sysroot; 13918bd4a06Smrg 140ca08ab68Smrg bail: 14118bd4a06Smrg sysroot = FcConfigGetSysRoot (config); 1422c393a42Smrg fprintf (stderr, 1432c393a42Smrg "Fontconfig error: out of memory"); 144c9710b42Smrg if (prefix) 145c9710b42Smrg FcStrFree (prefix); 14618bd4a06Smrg fallback = FcInitFallbackConfig (sysroot); 1472c393a42Smrg FcConfigDestroy (config); 14818bd4a06Smrg 14918bd4a06Smrg return fallback; 1502c393a42Smrg } 151c9710b42Smrg FcStrFree (prefix); 1522c393a42Smrg } 1532c393a42Smrg 1542c393a42Smrg return config; 1552c393a42Smrg} 1562c393a42Smrg 157c9710b42SmrgFcConfig * 158c9710b42SmrgFcInitLoadConfig (void) 159c9710b42Smrg{ 160c9710b42Smrg return FcInitLoadOwnConfig (NULL); 161c9710b42Smrg} 162c9710b42Smrg 1632c393a42Smrg/* 1642c393a42Smrg * Load the configuration files and scan for available fonts 1652c393a42Smrg */ 1662c393a42SmrgFcConfig * 167c9710b42SmrgFcInitLoadOwnConfigAndFonts (FcConfig *config) 1682c393a42Smrg{ 169c9710b42Smrg config = FcInitLoadOwnConfig (config); 1702c393a42Smrg if (!config) 1712c393a42Smrg return 0; 1722c393a42Smrg if (!FcConfigBuildFonts (config)) 1732c393a42Smrg { 1742c393a42Smrg FcConfigDestroy (config); 1752c393a42Smrg return 0; 1762c393a42Smrg } 1772c393a42Smrg return config; 1782c393a42Smrg} 1792c393a42Smrg 180c9710b42SmrgFcConfig * 181c9710b42SmrgFcInitLoadConfigAndFonts (void) 182c9710b42Smrg{ 183c9710b42Smrg return FcInitLoadOwnConfigAndFonts (NULL); 184c9710b42Smrg} 185c9710b42Smrg 1862c393a42Smrg/* 1872c393a42Smrg * Initialize the default library configuration 1882c393a42Smrg */ 1892c393a42SmrgFcBool 1902c393a42SmrgFcInit (void) 1912c393a42Smrg{ 192c9710b42Smrg return FcConfigInit (); 1932c393a42Smrg} 1942c393a42Smrg 1952c393a42Smrg/* 1962c393a42Smrg * Free all library-allocated data structures. 1972c393a42Smrg */ 1982c393a42Smrgvoid 1992c393a42SmrgFcFini (void) 2002c393a42Smrg{ 201c9710b42Smrg FcConfigFini (); 2022c393a42Smrg FcCacheFini (); 203c9710b42Smrg FcDefaultFini (); 20418bd4a06Smrg FcObjectFini (); 20518bd4a06Smrg FcConfigPathFini (); 2062c393a42Smrg} 2072c393a42Smrg 2082c393a42Smrg/* 2092c393a42Smrg * Reread the configuration and available font lists 2102c393a42Smrg */ 2112c393a42SmrgFcBool 2122c393a42SmrgFcInitReinitialize (void) 2132c393a42Smrg{ 2142c393a42Smrg FcConfig *config; 21518bd4a06Smrg FcBool ret; 2162c393a42Smrg 2172c393a42Smrg config = FcInitLoadConfigAndFonts (); 2182c393a42Smrg if (!config) 2192c393a42Smrg return FcFalse; 22018bd4a06Smrg ret = FcConfigSetCurrent (config); 22118bd4a06Smrg /* FcConfigSetCurrent() increases the refcount. 22218bd4a06Smrg * decrease it here to avoid the memory leak. 22318bd4a06Smrg */ 22418bd4a06Smrg FcConfigDestroy (config); 22518bd4a06Smrg 22618bd4a06Smrg return ret; 2272c393a42Smrg} 2282c393a42Smrg 2292c393a42SmrgFcBool 2302c393a42SmrgFcInitBringUptoDate (void) 2312c393a42Smrg{ 2322c393a42Smrg FcConfig *config = FcConfigGetCurrent (); 2332c393a42Smrg time_t now; 2342c393a42Smrg 23518bd4a06Smrg if (!config) 23618bd4a06Smrg return FcFalse; 2372c393a42Smrg /* 2382c393a42Smrg * rescanInterval == 0 disables automatic up to date 2392c393a42Smrg */ 2402c393a42Smrg if (config->rescanInterval == 0) 2412c393a42Smrg return FcTrue; 2422c393a42Smrg /* 2432c393a42Smrg * Check no more often than rescanInterval seconds 2442c393a42Smrg */ 2452c393a42Smrg now = time (0); 2462c393a42Smrg if (config->rescanTime + config->rescanInterval - now > 0) 2472c393a42Smrg return FcTrue; 2482c393a42Smrg /* 2492c393a42Smrg * If up to date, don't reload configuration 2502c393a42Smrg */ 2512c393a42Smrg if (FcConfigUptoDate (0)) 2522c393a42Smrg return FcTrue; 2532c393a42Smrg return FcInitReinitialize (); 2542c393a42Smrg} 2552c393a42Smrg 2562c393a42Smrg#define __fcinit__ 2572c393a42Smrg#include "fcaliastail.h" 2582c393a42Smrg#undef __fcinit__ 259