/*
 * fontconfig/doc/fcinit.fncs
 *
 * Copyright © 2003 Keith Packard
 *
 * Permission to use, copy, modify, distribute, and sell this software and its
 * documentation for any purpose is hereby granted without fee, provided that
 * the above copyright notice appear in all copies and that both that
 * copyright notice and this permission notice appear in supporting
 * documentation, and that the name of the author(s) not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  The authors make no
 * representations about the suitability of this software for any purpose.  It
 * is provided "as is" without express or implied warranty.
 *
 * THE AUTHOR(S) DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL THE AUTHOR(S) BE LIABLE FOR ANY SPECIAL, INDIRECT OR
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
 * PERFORMANCE OF THIS SOFTWARE.
 */
@RET@		FcConfig *
@FUNC@		FcInitLoadConfig
@TYPE1@		void
@PURPOSE@	load configuration
@DESC@
Loads the default configuration file and returns the resulting configuration.
Does not load any font information.
@@

@RET@           FcConfig *      
@FUNC@          FcInitLoadConfigAndFonts 
@TYPE1@		void
@PURPOSE@	load configuration and font data
@DESC@
Loads the default configuration file and builds information about the
available fonts.  Returns the resulting configuration.
@@

@RET@           FcBool       
@FUNC@          FcInit 
@TYPE1@		void
@PURPOSE@	initialize fontconfig library
@DESC@
Loads the default configuration file and the fonts referenced therein and
sets the default configuration to that result.  Returns whether this
process succeeded or not.  If the default configuration has already
been loaded, this routine does nothing and returns FcTrue.
@@

@RET@		void
@FUNC@		FcFini
@TYPE1@		void
@PURPOSE@	finalize fontconfig library
@DESC@
Frees all data structures allocated by previous calls to fontconfig
functions. Fontconfig returns to an uninitialized state, requiring a
new call to one of the FcInit functions before any other fontconfig
function may be called.
@@

@RET@           int       
@FUNC@          FcGetVersion 
@TYPE1@		void
@PURPOSE@	library version number
@DESC@
Returns the version number of the library.
@@

@RET@           FcBool       
@FUNC@          FcInitReinitialize 
@TYPE1@		void
@PURPOSE@	re-initialize library
@DESC@
Forces the default configuration file to be reloaded and resets the default
configuration. Returns FcFalse if the configuration cannot be reloaded (due
to configuration file errors, allocation failures or other issues) and leaves the
existing configuration unchanged. Otherwise returns FcTrue.
@@

@RET@           FcBool       
@FUNC@          FcInitBringUptoDate 
@TYPE1@		void
@PURPOSE@	reload configuration files if needed
@DESC@
Checks the rescan interval in the default configuration, checking the
configuration if the interval has passed and reloading the configuration if
when any changes are detected. Returns FcFalse if the configuration cannot
be reloaded (see FcInitReinitialize). Otherwise returns FcTrue.
@@
