/*
 * 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 Keith Packard not be used in
 * advertising or publicity pertaining to distribution of the software without
 * specific, written prior permission.  Keith Packard makes 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 fonconfig 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 config 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.
@@
