/*
 * fontconfig/doc/fccharset.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@		FcCharSet *
@FUNC@		FcCharSetCreate
@TYPE1@		void
@PURPOSE@	Create an empty character set
@DESC@
<function>FcCharSetCreate</function> allocates and initializes a new empty
character set object.
@@

@RET@		void
@FUNC@		FcCharSetDestroy
@TYPE1@		FcCharSet *		@ARG1@		fcs
@PURPOSE@	Destroy a character set
@DESC@
<function>FcCharSetDestroy</function> decrements the reference count 
<parameter>fcs</parameter>.  If the reference count becomes zero, all
memory referenced is freed.
@@

@RET@		FcBool 
@FUNC@		FcCharSetAddChar
@TYPE1@		FcCharSet *		@ARG1@		fcs
@TYPE2@		FcChar32% 		@ARG2@		ucs4 
@PURPOSE@	Add a character to a charset
@DESC@
<function>FcCharSetAddChar</function> adds a single Unicode char to the set,
returning FcFalse on failure, either as a result of a constant set or from
running out of memory. 
@@

@RET@		FcBool 
@FUNC@		FcCharSetDelChar
@TYPE1@		FcCharSet *		@ARG1@		fcs
@TYPE2@		FcChar32% 		@ARG2@		ucs4 
@PURPOSE@	Add a character to a charset
@DESC@
<function>FcCharSetDelChar</function> deletes a single Unicode char from the set,
returning FcFalse on failure, either as a result of a constant set or from
running out of memory.
@@

@RET@		FcCharSet *
@FUNC@		FcCharSetCopy
@TYPE1@		FcCharSet *		@ARG1@		src
@PURPOSE@	Copy a charset
@DESC@
Makes a copy of <parameter>src</parameter>; note that this may not actually do anything more
than increment the reference count on <parameter>src</parameter>. 
@@

@RET@		FcBool
@FUNC@		FcCharSetEqual
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Compare two charsets
@DESC@
Returns whether <parameter>a</parameter> and <parameter>b</parameter>
contain the same set of Unicode chars.
@@

@RET@		FcCharSet *
@FUNC@		FcCharSetIntersect
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Intersect charsets
@DESC@
Returns a set including only those chars found in both
<parameter>a</parameter> and <parameter>b</parameter>. 
@@

@RET@		FcCharSet *
@FUNC@		FcCharSetUnion
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Add charsets
@DESC@
Returns a set including only those chars found in either <parameter>a</parameter> or <parameter>b</parameter>. 
@@

@RET@		FcCharSet *
@FUNC@		FcCharSetSubtract
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Subtract charsets
@DESC@
Returns a set including only those chars found in <parameter>a</parameter> but not <parameter>b</parameter>. 
@@

@RET@		FcBool
@FUNC@		FcCharSetMerge
@TYPE1@		FcCharSet *		@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@TYPE3@		FcBool *		@ARG3@		changed
@PURPOSE@	Merge charsets
@DESC@
Adds all chars in <parameter>b</parameter> to <parameter>a</parameter>.
In other words, this is an in-place version of FcCharSetUnion.
If <parameter>changed</parameter> is not NULL, then it returns whether any new
chars from <parameter>b</parameter> were added to <parameter>a</parameter>.
Returns FcFalse on failure, either when <parameter>a</parameter> is a constant
set or from running out of memory.
@@

@RET@		FcBool 
@FUNC@		FcCharSetHasChar
@TYPE1@		const FcCharSet *	@ARG1@		fcs
@TYPE2@		FcChar32% 		@ARG2@		ucs4
@PURPOSE@	Check a charset for a char
@DESC@
Returns whether <parameter>fcs</parameter> contains the char <parameter>ucs4</parameter>. 
@@

@RET@		FcChar32
@FUNC@		FcCharSetCount
@TYPE1@		const FcCharSet *	@ARG1@		a
@PURPOSE@	Count entries in a charset
@DESC@
Returns the total number of Unicode chars in <parameter>a</parameter>. 
@@

@RET@		FcChar32
@FUNC@		FcCharSetIntersectCount
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Intersect and count charsets
@DESC@
Returns the number of chars that are in both <parameter>a</parameter> and <parameter>b</parameter>. 
@@

@RET@		FcChar32
@FUNC@		FcCharSetSubtractCount
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Subtract and count charsets
@DESC@
Returns the number of chars that are in <parameter>a</parameter> but not in <parameter>b</parameter>. 
@@

@RET@		FcBool
@FUNC@		FcCharSetIsSubset
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		const FcCharSet *	@ARG2@		b
@PURPOSE@	Test for charset inclusion
@DESC@
Returns whether <parameter>a</parameter> is a subset of <parameter>b</parameter>. 
@@

@RET@		FcChar32
@FUNC@		FcCharSetFirstPage
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		FcChar32[FC_CHARSET_MAP_SIZE]%	@ARG2@	map
@TYPE3@		FcChar32 *		@ARG3@		next
@PURPOSE@	Start enumerating charset contents
@DESC@
Builds an array of bits marking the first page of Unicode coverage of
<parameter>a</parameter>. Returns the base of the array. <parameter>next</parameter> contains the next page in the
font.
@@

@RET@		FcChar32
@FUNC@		FcCharSetNextPage
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		FcChar32[FC_CHARSET_MAP_SIZE]%	@ARG2@	map
@TYPE3@		FcChar32 *		@ARG3@		next
@PURPOSE@	Continue enumerating charset contents
@DESC@
Builds an array of bits marking the Unicode coverage of <parameter>a</parameter> for page
<parameter>*next</parameter>. Returns the base of the array. <parameter>next</parameter> contains the next page in
the font. 
@@

@RET@		FcChar32
@FUNC@		FcCharSetCoverage
@TYPE1@		const FcCharSet *	@ARG1@		a
@TYPE2@		FcChar32		@ARG2@		page
@TYPE3@		FcChar32[8] 		@ARG3@		result
@PURPOSE@	DEPRECATED return coverage for a Unicode page
@DESC@
DEPRECATED
This function returns a bitmask in <parameter>result</parameter> which
indicates which code points in
<parameter>page</parameter> are included in <parameter>a</parameter>.
<function>FcCharSetCoverage</function> returns the next page in the charset which has any
coverage.
@@

@RET@		FcCharSet *
@FUNC@		FcCharSetNew
@TYPE1@		void
@PURPOSE@	DEPRECATED alias for FcCharSetCreate
@DESC@
<function>FcCharSetNew</function> is a DEPRECATED alias for FcCharSetCreate.
@@

