/*
 * fontconfig/doc/fcobjecttype.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@           FcBool
@FUNC@          FcNameRegisterObjectTypes
@TYPE1@         const FcObjectType *            @ARG1@          types
@TYPE2@         int%                            @ARG2@          ntype
@PURPOSE@       Register object types
@DESC@
Deprecated.  Does nothing.  Returns FcFalse.
@@

@RET@           FcBool
@FUNC@          FcNameUnregisterObjectTypes
@TYPE1@         const FcObjectType *            @ARG1@          types
@TYPE2@         int%                            @ARG2@          ntype
@PURPOSE@       Unregister object types
@DESC@
Deprecated.  Does nothing.  Returns FcFalse.
@@

@RET@           const FcObjectType *
@FUNC@          FcNameGetObjectType
@TYPE1@         const char *                    @ARG1@          object
@PURPOSE@       Lookup an object type
@DESC@
Return the object type for the pattern element named <parameter>object</parameter>.
@@
