Blame src/fcinit.c

Packit 352660
/*
Packit 352660
 * fontconfig/src/fcinit.c
Packit 352660
 *
Packit 352660
 * Copyright © 2001 Keith Packard
Packit 352660
 *
Packit 352660
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit 352660
 * documentation for any purpose is hereby granted without fee, provided that
Packit 352660
 * the above copyright notice appear in all copies and that both that
Packit 352660
 * copyright notice and this permission notice appear in supporting
Packit 352660
 * documentation, and that the name of the author(s) not be used in
Packit 352660
 * advertising or publicity pertaining to distribution of the software without
Packit 352660
 * specific, written prior permission.  The authors make no
Packit 352660
 * representations about the suitability of this software for any purpose.  It
Packit 352660
 * is provided "as is" without express or implied warranty.
Packit 352660
 *
Packit 352660
 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
Packit 352660
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
Packit 352660
 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
Packit 352660
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
Packit 352660
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
Packit 352660
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
Packit 352660
 * PERFORMANCE OF THIS SOFTWARE.
Packit 352660
 */
Packit 352660
Packit 352660
#include "fcint.h"
Packit 352660
#include <stdlib.h>
Packit 352660
Packit 352660
#if defined(FC_ATOMIC_INT_NIL)
Packit 352660
#pragma message("Could not find any system to define atomic_int macros, library may NOT be thread-safe.")
Packit 352660
#endif
Packit 352660
#if defined(FC_MUTEX_IMPL_NIL)
Packit 352660
#pragma message("Could not find any system to define mutex macros, library may NOT be thread-safe.")
Packit 352660
#endif
Packit 352660
#if defined(FC_ATOMIC_INT_NIL) || defined(FC_MUTEX_IMPL_NIL)
Packit 352660
#pragma message("To suppress these warnings, define FC_NO_MT.")
Packit 352660
#endif
Packit 352660
Packit 352660
static FcConfig *
Packit 352660
FcInitFallbackConfig (const FcChar8 *sysroot)
Packit 352660
{
Packit 352660
    FcConfig	*config;
Packit 352660
    const FcChar8 *fallback = (const FcChar8 *) ""	\
Packit 352660
	"<fontconfig>" \
Packit 352660
	"  <dir>" FC_DEFAULT_FONTS "</dir>" \
Packit 352660
	"  <dir prefix=\"xdg\">fonts</dir>" \
Packit 352660
	"  <cachedir>" FC_CACHEDIR "</cachedir>" \
Packit 352660
	"  <cachedir prefix=\"xdg\">fontconfig</cachedir>" \
Packit 352660
	"  <include ignore_missing=\"yes\" prefix=\"xdg\">fontconfig/conf.d</include>" \
Packit 352660
	"  <include ignore_missing=\"yes\" prefix=\"xdg\">fontconfig/fonts.conf</include>" \
Packit 352660
	"</fontconfig>";
Packit 352660
Packit 352660
    config = FcConfigCreate ();
Packit 352660
    if (!config)
Packit 352660
	goto bail0;
Packit 352660
    FcConfigSetSysRoot (config, sysroot);
Packit 352660
    if (!FcConfigParseAndLoadFromMemory (config, fallback, FcFalse))
Packit 352660
	goto bail1;
Packit 352660
Packit 352660
    return config;
Packit 352660
Packit 352660
bail1:
Packit 352660
    FcConfigDestroy (config);
Packit 352660
bail0:
Packit 352660
    return 0;
Packit 352660
}
Packit 352660
Packit 352660
int
Packit 352660
FcGetVersion (void)
Packit 352660
{
Packit 352660
    return FC_VERSION;
Packit 352660
}
Packit 352660
Packit 352660
/*
Packit 352660
 * Load the configuration files
Packit 352660
 */
Packit 352660
FcConfig *
Packit 352660
FcInitLoadOwnConfig (FcConfig *config)
Packit 352660
{
Packit 352660
    if (!config)
Packit 352660
    {
Packit 352660
	config = FcConfigCreate ();
Packit 352660
	if (!config)
Packit 352660
	    return NULL;
Packit 352660
    }
Packit 352660
Packit 352660
    FcInitDebug ();
Packit 352660
Packit 352660
    if (!FcConfigParseAndLoad (config, 0, FcTrue))
Packit 352660
    {
Packit 352660
	const FcChar8 *sysroot = FcConfigGetSysRoot (config);
Packit 352660
	FcConfig *fallback = FcInitFallbackConfig (sysroot);
Packit 352660
Packit 352660
	FcConfigDestroy (config);
Packit 352660
Packit 352660
	return fallback;
Packit 352660
    }
Packit 352660
    (void) FcConfigParseOnly (config, (const FcChar8 *)FC_TEMPLATEDIR, FcFalse);
Packit 352660
Packit 352660
    if (config->cacheDirs && config->cacheDirs->num == 0)
Packit 352660
    {
Packit 352660
	FcChar8 *prefix, *p;
Packit 352660
	size_t plen;
Packit 352660
	FcBool have_own = FcFalse;
Packit 352660
	char *env_file, *env_path;
Packit 352660
Packit 352660
	env_file = getenv ("FONTCONFIG_FILE");
Packit 352660
	env_path = getenv ("FONTCONFIG_PATH");
Packit 352660
	if ((env_file != NULL && env_file[0] != 0) ||
Packit 352660
	    (env_path != NULL && env_path[0] != 0))
Packit 352660
	    have_own = FcTrue;
Packit 352660
Packit 352660
	if (!have_own)
Packit 352660
	{
Packit 352660
	    fprintf (stderr,
Packit 352660
		     "Fontconfig warning: no <cachedir> elements found. Check configuration.\n");
Packit 352660
	    fprintf (stderr,
Packit 352660
		     "Fontconfig warning: adding <cachedir>%s</cachedir>\n",
Packit 352660
		     FC_CACHEDIR);
Packit 352660
	}
Packit 352660
	prefix = FcConfigXdgCacheHome ();
Packit 352660
	if (!prefix)
Packit 352660
	    goto bail;
Packit 352660
	plen = strlen ((const char *)prefix);
Packit 352660
	p = realloc (prefix, plen + 12);
Packit 352660
	if (!p)
Packit 352660
	    goto bail;
Packit 352660
	prefix = p;
Packit 352660
	memcpy (&prefix[plen], FC_DIR_SEPARATOR_S "fontconfig", 11);
Packit 352660
	prefix[plen + 11] = 0;
Packit 352660
	if (!have_own)
Packit 352660
	    fprintf (stderr,
Packit 352660
		     "Fontconfig warning: adding <cachedir prefix=\"xdg\">fontconfig</cachedir>\n");
Packit 352660
Packit 352660
	if (!FcConfigAddCacheDir (config, (FcChar8 *) FC_CACHEDIR) ||
Packit 352660
	    !FcConfigAddCacheDir (config, (FcChar8 *) prefix))
Packit 352660
	{
Packit 352660
	    FcConfig *fallback;
Packit 352660
	    const FcChar8 *sysroot;
Packit 352660
Packit 352660
	  bail:
Packit 352660
	    sysroot = FcConfigGetSysRoot (config);
Packit 352660
	    fprintf (stderr,
Packit 352660
		     "Fontconfig error: out of memory");
Packit 352660
	    if (prefix)
Packit 352660
		FcStrFree (prefix);
Packit 352660
	    fallback = FcInitFallbackConfig (sysroot);
Packit 352660
	    FcConfigDestroy (config);
Packit 352660
Packit 352660
	    return fallback;
Packit 352660
	}
Packit 352660
	FcStrFree (prefix);
Packit 352660
    }
Packit 352660
Packit 352660
    return config;
Packit 352660
}
Packit 352660
Packit 352660
FcConfig *
Packit 352660
FcInitLoadConfig (void)
Packit 352660
{
Packit 352660
    return FcInitLoadOwnConfig (NULL);
Packit 352660
}
Packit 352660
Packit 352660
/*
Packit 352660
 * Load the configuration files and scan for available fonts
Packit 352660
 */
Packit 352660
FcConfig *
Packit 352660
FcInitLoadOwnConfigAndFonts (FcConfig *config)
Packit 352660
{
Packit 352660
    config = FcInitLoadOwnConfig (config);
Packit 352660
    if (!config)
Packit 352660
	return 0;
Packit 352660
    if (!FcConfigBuildFonts (config))
Packit 352660
    {
Packit 352660
	FcConfigDestroy (config);
Packit 352660
	return 0;
Packit 352660
    }
Packit 352660
    return config;
Packit 352660
}
Packit 352660
Packit 352660
FcConfig *
Packit 352660
FcInitLoadConfigAndFonts (void)
Packit 352660
{
Packit 352660
    return FcInitLoadOwnConfigAndFonts (NULL);
Packit 352660
}
Packit 352660
Packit 352660
/*
Packit 352660
 * Initialize the default library configuration
Packit 352660
 */
Packit 352660
FcBool
Packit 352660
FcInit (void)
Packit 352660
{
Packit 352660
    return FcConfigInit ();
Packit 352660
}
Packit 352660
Packit 352660
/*
Packit 352660
 * Free all library-allocated data structures.
Packit 352660
 */
Packit 352660
void
Packit 352660
FcFini (void)
Packit 352660
{
Packit 352660
    FcConfigFini ();
Packit 352660
    FcCacheFini ();
Packit 352660
    FcDefaultFini ();
Packit 352660
    FcObjectFini ();
Packit 352660
    FcConfigPathFini ();
Packit 352660
}
Packit 352660
Packit 352660
/*
Packit 352660
 * Reread the configuration and available font lists
Packit 352660
 */
Packit 352660
FcBool
Packit 352660
FcInitReinitialize (void)
Packit 352660
{
Packit 352660
    FcConfig	*config;
Packit 352660
    FcBool	ret;
Packit 352660
Packit 352660
    config = FcInitLoadConfigAndFonts ();
Packit 352660
    if (!config)
Packit 352660
	return FcFalse;
Packit 352660
    ret = FcConfigSetCurrent (config);
Packit 352660
    /* FcConfigSetCurrent() increases the refcount.
Packit 352660
     * decrease it here to avoid the memory leak.
Packit 352660
     */
Packit 352660
    FcConfigDestroy (config);
Packit 352660
Packit 352660
    return ret;
Packit 352660
}
Packit 352660
Packit 352660
FcBool
Packit 352660
FcInitBringUptoDate (void)
Packit 352660
{
Packit 352660
    FcConfig	*config = FcConfigGetCurrent ();
Packit 352660
    time_t	now;
Packit 352660
Packit 352660
    if (!config)
Packit 352660
	return FcFalse;
Packit 352660
    /*
Packit 352660
     * rescanInterval == 0 disables automatic up to date
Packit 352660
     */
Packit 352660
    if (config->rescanInterval == 0)
Packit 352660
	return FcTrue;
Packit 352660
    /*
Packit 352660
     * Check no more often than rescanInterval seconds
Packit 352660
     */
Packit 352660
    now = time (0);
Packit 352660
    if (config->rescanTime + config->rescanInterval - now > 0)
Packit 352660
	return FcTrue;
Packit 352660
    /*
Packit 352660
     * If up to date, don't reload configuration
Packit 352660
     */
Packit 352660
    if (FcConfigUptoDate (0))
Packit 352660
	return FcTrue;
Packit 352660
    return FcInitReinitialize ();
Packit 352660
}
Packit 352660
Packit 352660
#define __fcinit__
Packit 352660
#include "fcaliastail.h"
Packit 352660
#undef __fcinit__