/*
 * Copyright © 2007 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@           const FcChar8 *
@FUNC@          FcCacheDir
@TYPE1@		const FcCache *			@ARG1@		cache
@PURPOSE@	Return directory of <parameter>cache</parameter>
@DESC@
This function returns the directory from which the cache was constructed.
@@

@RET@		FcFontSet *
@FUNC@		FcCacheCopySet
@TYPE1@		const FcCache *			@ARG1@		cache
@PURPOSE@	Returns a copy of the fontset from <parameter>cache</parameter>
@DESC@
The returned fontset contains each of the font patterns from
<parameter>cache</parameter>. This fontset may be modified, but the patterns
from the cache are read-only.
@@

@RET@		const FcChar8 *
@FUNC@		FcCacheSubdir
@TYPE1@		const FcCache *			@ARG1@		cache
@TYPE2@		int				@ARG2@		i
@PURPOSE@	Return the <parameter>i</parameter>'th subdirectory.
@DESC@
The set of subdirectories stored in a cache file are indexed by this
function, <parameter>i</parameter> should range from 0 to
<parameter>n</parameter>-1, where <parameter>n</parameter> is the return
value from FcCacheNumSubdir.
@@

@RET@		int
@FUNC@		FcCacheNumSubdir
@TYPE1@		const FcCache *			@ARG1@		cache
@PURPOSE@	Return the number of subdirectories in <parameter>cache</parameter>.
@DESC@
This returns the total number of subdirectories in the cache.
@@

@RET@		int
@FUNC@		FcCacheNumFont
@TYPE1@		const FcCache *			@ARG1@		cache
@PURPOSE@	Returns the number of fonts in <parameter>cache</parameter>.
@DESC@
This returns the number of fonts which would be included in the return from
FcCacheCopySet.
@@

@RET@		FcBool
@FUNC@		FcDirCacheClean
@TYPE1@		const FcChar8 *			@ARG1@		cache_dir
@TYPE2@		FcBool				@ARG2@		verbose
@PURPOSE@	Clean up a cache directory
@DESC@
This tries to clean up the cache directory of <parameter>cache_dir</parameter>.
This returns FcTrue if the operation is successfully complete. otherwise FcFalse.
@SINCE@		2.9.91
@@

@RET@		void
@FUNC@		FcCacheCreateTagFile
@TYPE1@		const FcConfig *		@ARG1@		config
@PURPOSE@	Create CACHEDIR.TAG at cache directory.
@DESC@
This tries to create CACHEDIR.TAG file at the cache directory registered
to <parameter>config</parameter>.
@SINCE@		2.9.91
@@

@RET@		FcBool
@FUNC@		FcDirCacheCreateUUID
@TYPE1@		FcChar8 *			@ARG1@		dir
@TYPE2@		FcBool				@ARG2@		force
@TYPE3@		FcConfig *			@ARG3@		config
@PURPOSE@	Create .uuid file at a directory
@DESC@
This function is deprecated. it doesn't take any effects.
@SINCE@		2.12.92
@@

@RET@		FcBool
@FUNC@		FcDirCacheDeleteUUID
@TYPE1@		const FcChar8 *			@ARG1@		dir
@TYPE2@		FcConfig *			@ARG2@		config
@PURPOSE@	Delete .uuid file
@DESC@
This is to delete .uuid file containing an UUID at a font directory of
<parameter>dir</parameter>.
@SINCE@		2.13.1
@@
