/*
 * fontconfig/doc/fcblanks.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@		FcBlanks *
@FUNC@		FcBlanksCreate
@TYPE1@		void
@PURPOSE@	Create an FcBlanks
@DESC@
FcBlanks is deprecated.
This function always returns NULL.
@@

@RET@		void
@FUNC@		FcBlanksDestroy
@TYPE1@		FcBlanks *			@ARG1@		b
@PURPOSE@	Destroy and FcBlanks
@DESC@
FcBlanks is deprecated.
This function does nothing.
@@

@RET@		FcBool
@FUNC@		FcBlanksAdd
@TYPE1@		FcBlanks *			@ARG1@		b
@TYPE2@		FcChar32% 			@ARG2@		ucs4
@PURPOSE@	Add a character to an FcBlanks
@DESC@
FcBlanks is deprecated.
This function always returns FALSE.
@@

@RET@		FcBool
@FUNC@		FcBlanksIsMember
@TYPE1@		FcBlanks *			@ARG1@		b
@TYPE2@		FcChar32% 			@ARG2@		ucs4
@PURPOSE@	Query membership in an FcBlanks
@DESC@
FcBlanks is deprecated.
This function always returns FALSE.
@@
