/*
 * $Id$
 *
 * 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.
 *
 * KEITH PACKARD DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
 * EVENT SHALL KEITH PACKARD 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@          FcConfigCreate
@TYPE1@		void
@PURPOSE@	Create a configuration
@DESC@
Creates an empty configuration.
@@

@RET@           void
@FUNC@          FcConfigDestroy
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Destroy a configuration
@DESC@
Destroys a configuration and any data associated with it.  Note that calling
this function with the return from FcConfigGetCurrent will place the library
in an indeterminate state.
@@

@RET@           FcBool
@FUNC@          FcConfigSetCurrent
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Set configuration as default
@DESC@
Sets the current default configuration to <parameter>config</parameter>.  Implicitly calls
FcConfigBuildFonts if necessary, returning FcFalse if that call fails.
@@

@RET@           FcConfig *
@FUNC@          FcConfigGetCurrent
@TYPE1@		void
@PURPOSE@	Return current configuration
@DESC@
Returns the current default configuration.
@@

@RET@           FcBool
@FUNC@          FcConfigUptoDate
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Check timestamps on config files
@DESC@
Checks all of the files related to <parameter>config</parameter> and returns
whether any of them has been modified since the configuration was created.
@@

@RET@		FcBool
@FUNC@		FcConfigHome
@TYPE1@		void
@PURPOSE@	return the current home directory.
@DESC@
Return the current user's home directory, if it is available, and if using it
is enabled. See also <function>FcConfigEnableHome</function>).
@@

@RET@		FcBol
@FUNC@		FcConfigEnableHome
@TYPE1@		FcBool%				@ARG1@		enable
@PURPOSE@	controls use of the home directory.
@DESC@
If <parameter>enable</parameter> is FcTrue, then Fontconfig will use various
files which are specified relative to the user's home directory (using the ~
notation in the configuration). When <parameter>enable</parameter> is
FcFalse, then all use of the home directory in these contexts will be
disabled. The previous setting of the value is returned.
@@

@RET@           FcBool
@FUNC@          FcConfigBuildFonts
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Build font database
@DESC@
Builds the set of available fonts for the given configuration.  Note that
any changes to the configuration after this call have indeterminate effects.
Returns FcFalse if this operation runs out of memory.
@@

@RET@           FcStrList *
@FUNC@          FcConfigGetConfigDirs
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config directories
@DESC@
Returns the list of font directories specified in the configuration files
for <parameter>config</parameter>.  Does not include any subdirectories.
@@

@RET@           FcStrList *
@FUNC@          FcConfigGetFontDirs
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get font directories
@DESC@
Returns the list of font directories in <parameter>config</parameter>. This includes the
configured font directories along with any directories below those in the
filesystem.
@@

@RET@           FcStrList *
@FUNC@          FcConfigGetConfigFiles
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config files
@DESC@
Returns the list of known configuration files used to generate <parameter>config</parameter>.
@@

@RET@           FcChar8 *
@FUNC@          FcConfigGetCache
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	DEPRECATED used to return per-user cache filename
@DESC@
With fontconfig no longer using per-user cache files, this function now
simply returns NULL to indicate that no per-user file exists.
@@

@RET@		FcStrList *
@FUNC@		FcConfigGetCacheDirs
@TYPE1@		FcConfig *			@ARG1@		config
@PURPOSE@	return the list of directories searched for cache files
@DESC@
<function>FcConfigGetCacheDirs</function> returns a string list containing
all of the directories that fontconfig will search when attempting to load a
cache file for a font directory.
@@

@RET@           FcFontSet *
@FUNC@          FcConfigGetFonts
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcSetName%                      @ARG2@          set
@PURPOSE@	Get config font set
@DESC@
Returns one of the two sets of fonts from the configuration as specified
by <parameter>set</parameter>. This font set is owned by the library and must
not be freed.
@@

@RET@           FcBlanks *
@FUNC@          FcConfigGetBlanks
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config blanks
@DESC@
Returns the FcBlanks object associated with the given configuration, if no
blanks were present in the configuration, this function will return 0.
@@

@RET@           int
@FUNC@          FcConfigGetRescanInterval
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Get config rescan interval
@DESC@
Returns the interval between automatic checks of the configuration (in
seconds) specified in <parameter>config</parameter>.  The configuration is checked during
a call to FcFontList when this interval has passed since the last check.
@@

@RET@           FcBool
@FUNC@          FcConfigSetRescanInterval
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		int%                       	@ARG2@          rescanInterval
@PURPOSE@	Set config rescan interval
@DESC@
Sets the rescan interval. Returns FcFalse if the interval cannot be set (due
to allocation failure). Otherwise returns FcTrue.
@@

@RET@           FcBool
@FUNC@          FcConfigAppFontAddFile
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@          file
@PURPOSE@	Add font file to font database
@DESC@
Adds an application-specific font to the configuration. Returns FcFalse
if the fonts cannot be added (due to allocation failure). Otherwise returns FcTrue.
@@

@RET@           FcBool
@FUNC@          FcConfigAppFontAddDir
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@          dir
@PURPOSE@	Add fonts from directory to font database
@DESC@
Scans the specified directory for fonts, adding each one found to the
application-specific set of fonts. Returns FcFalse
if the fonts cannot be added (due to allocation failure). Otherwise returns FcTrue.
@@

@RET@           void
@FUNC@          FcConfigAppFontClear
@TYPE1@         FcConfig *                      @ARG1@          config
@PURPOSE@	Remove all app fonts from font database
@DESC@
Clears the set of application-specific fonts.
@@

@RET@           FcBool
@FUNC@          FcConfigSubstituteWithPat
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcPattern *			@ARG3@		p_pat
@TYPE4@		FcMatchKind%                     @ARG4@          kind
@PURPOSE@	Execute substitutions
@DESC@
Performs the sequence of pattern modification operations, if <parameter>kind</parameter> is
FcMatchPattern, then those tagged as pattern operations are applied, else
if <parameter>kind</parameter> is FcMatchFont, those tagged as font operations are applied and
p_pat is used for &lt;test&gt; elements with target=pattern. Returns FcFalse
if the substitution cannot be performed (due to allocation failure). Otherwise returns FcTrue.
@@

@RET@           FcBool
@FUNC@          FcConfigSubstitute
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcMatchKind%                    @ARG3@          kind
@PURPOSE@	Execute substitutions
@DESC@
Calls FcConfigSubstituteWithPat setting p_pat to NULL. Returns FcFalse
if the substitution cannot be performed (due to allocation failure). Otherwise returns FcTrue.
@@

@RET@           FcPattern *
@FUNC@          FcFontMatch
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcResult *                      @ARG3@          result
@PURPOSE@	Return best font
@DESC@
Finds the font in <parameter>sets</parameter> most closely matching
<parameter>pattern</parameter> and returns the result of
<function>FcFontRenderPrepare</function> for that font and the provided
pattern. This function should be called only after
<function>FcConfigSubstitute</function> and
<function>FcDefaultSubstitute</function> have been called for
<parameter>p</parameter>; otherwise the results will not be correct.
@@

@RET@           FcFontSet *
@FUNC@          FcFontSort
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcBool%				@ARG3@		trim
@TYPE4@		FcCharSet **			@ARG4@		csp
@TYPE5@		FcResult *                      @ARG5@          result
@PURPOSE@	Return list of matching fonts
@DESC@
Returns the list of fonts sorted by closeness to <parameter>p</parameter>.  If <parameter>trim</parameter> is FcTrue,
elements in the list which don't include Unicode coverage not provided by
earlier elements in the list are elided.  The union of Unicode coverage of
all of the fonts is returned in <parameter>csp</parameter>, if <parameter>csp</parameter> is not NULL.  This function
should be called only after FcConfigSubstitute and FcDefaultSubstitute have
been called for <parameter>p</parameter>; otherwise the results will not be correct.
    </para><para>
The returned FcFontSet references FcPattern structures which may be shared
by the return value from multiple FcFontSort calls, applications must not
modify these patterns.  Instead, they should be passed, along with <parameter>p</parameter> to
<function>FcFontRenderPrepare</function> which combines them into a complete pattern.
    </para><para>
The FcFontSet returned by FcFontSort is destroyed by caling FcFontSetDestroy.
@@

@RET@           FcPattern *
@FUNC@          FcFontRenderPrepare
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		pat
@TYPE3@		FcPattern *                     @ARG3@          font
@PURPOSE@	Prepare pattern for loading font file
@DESC@
Creates a new pattern consisting of elements of <parameter>font</parameter> not appearing
in <parameter>pat</parameter>, elements of <parameter>pat</parameter> not appearing in <parameter>font</parameter> and the best matching
value from <parameter>pat</parameter> for elements appearing in both.  The result is passed to
FcConfigSubstitute with <parameter>kind</parameter> FcMatchFont and then returned.
@@

@RET@           FcFontSet *
@FUNC@          FcFontList
@TYPE1@         FcConfig *			@ARG1@		config
@TYPE2@		FcPattern *			@ARG2@		p
@TYPE3@		FcObjectSet *                   @ARG3@          os
@PURPOSE@	List fonts
@DESC@
Selects fonts matching <parameter>p</parameter>, creates patterns from those fonts containing
only the objects in <parameter>os</parameter> and returns the set of unique such patterns.
@@

@RET@           FcChar8 *
@FUNC@          FcConfigFilename
@TYPE1@         const FcChar8 *			@ARG1@          name
@PURPOSE@	Find a config file
@DESC@
Given the specified external entity name, return the associated filename.
This provides applications a way to convert various configuration file
references into filename form.
    </para><para>
A null or empty <parameter>name</parameter> indicates that the default configuration file should
be used; which file this references can be overridden with the
FC_CONFIG_FILE environment variable.  Next, if the name starts with <parameter>~</parameter>, it
refers to a file in the current users home directory.  Otherwise if the name
doesn't start with '/', it refers to a file in the default configuration
directory; the built-in default directory can be overridden with the
FC_CONFIG_DIR environment variable.
@@

@RET@		FcBool
@FUNC@		FcConfigParseAndLoad
@TYPE1@		FcConfig *			@ARG1@		config
@TYPE2@		const FcChar8 *			@ARG2@		file
@TYPE3@		FcBool%				@ARG3@		complain
@PURPOSE@	load a configuration file
@DESC@
Walks the configuration in 'file' and constructs the internal representation
in 'config'.  Any include files referenced from within 'file' will be loaded
and parsed.  If 'complain' is FcFalse, no warning will be displayed if
'file' does not exist. Error and warning messages will be output to stderr.
Returns FcFalse if some error occurred while loading the file, either a
parse error, semantic error or allocation failure. Otherwise returns FcTrue.
@@
