/*
 * $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.
 */
    <variablelist>

@RET@		FcStrSet *	
@FUNC@		FcStrSetCreate 
@TYPE1@		void
@PURPOSE@	create a string set
@DESC@
Create an empty set.
@@

@RET@		FcBool
@FUNC@		FcStrSetMember
@TYPE1@		FcStrSet *			@ARG1@		set
@TYPE2@		const FcChar8 *			@ARG2@		s	
@PURPOSE@	check set for membership
@DESC@
Returns whether <parameter>s</parameter> is a member of
<parameter>set</parameter>.
@@

@RET@		FcBool
@FUNC@		FcStrSetAdd
@TYPE1@		FcStrSet *			@ARG1@		set
@TYPE2@		const FcChar8 *			@ARG2@		s	
@PURPOSE@	add to a string set
@DESC@
Adds a copy of <parameter>s</parameter> to <parameter>set</parameter>.
@@

@RET@		FcBool
@FUNC@		FcStrSetAddFilename
@TYPE1@		FcStrSet *			@ARG1@		set
@TYPE2@		const FcChar8 *			@ARG2@		s	
@PURPOSE@	add a filename to a string set
@DESC@
Adds a copy <parameter>s</parameter> to <parameter>set</parameter>, The copy
is created with FcStrCopyFilename so that leading '~' values are replaced
with the value of the HOME environment variable.
@@

@RET@		FcBool
@FUNC@		FcStrSetDel
@TYPE1@		FcStrSet *			@ARG1@		set
@TYPE2@		const FcChar8 *			@ARG2@		s	
@PURPOSE@	delete from a string set
@DESC@
Removes <parameter>s</parameter> from <parameter>set</parameter>, returning
FcTrue if <parameter>s</parameter> was a member else FcFalse.
@@

@RET@		void
@FUNC@		FcStrSetDestroy
@TYPE1@		FcStrSet *			@ARG1@		set	
@PURPOSE@	destroy a string set
@DESC@
Destroys <parameter>set</parameter>.
@@

@RET@		FcStrList *
@FUNC@		FcStrListCreate
@TYPE1@		FcStrSet *			@ARG1@		set	
@PURPOSE@	create a string iterator
@DESC@
Creates an iterator to list the strings in <parameter>set</parameter>.
@@

@RET@		FcChar8 *
@FUNC@		FcStrListNext
@TYPE1@		FcStrList *			@ARG1@		list	
@PURPOSE@	get next string in iteration
@DESC@
Returns the next string in <parameter>set</parameter>.
@@

@RET@		void
@FUNC@		FcStrListDone
@TYPE1@		FcStrList *			@ARG1@		list	
@PURPOSE@	destroy a string iterator
@DESC@
Destroys the enumerator <parameter>list</parameter>.
@@
