/*
** cdefs.h: ISO C interface
** Most of this file was developed by Sendmail, Incorporated, so:
**
** Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
**
** Permission to use, copy, modify, and distribute this software for
** any purpose with or without fee is hereby granted, provided that
** the above copyright notice and this permission notice appear in all
** copies.
**
** THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESSED OR IMPLIED
** WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
** MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
** IN NO EVENT SHALL THE AUTHORS AND COPYRIGHT HOLDERS AND THEIR
** CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
** LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
** USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
** ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
** OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
** OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
** SUCH DAMAGE.
**
*/

/*
**  BSD and Linux already have <sys/cdefs.h> which defines a set of C
**  language portability macros that are a defacto standard in the open
**  source community. This file allows for building on platforms lacking
**  these definitions.
*/
#ifndef HOND_CDEFS_H
# define HOND_CDEFS_H

# if defined(__cplusplus)
#  define    __BEGIN_DECLS    extern "C" {
#  define    __END_DECLS    };
# else /* defined(__cplusplus) */
#  define    __BEGIN_DECLS
#  define    __END_DECLS
# endif /* defined(__cplusplus) */
# if defined(__STDC__) || defined(__cplusplus)
#  ifndef __P
#   define    __P(protos)    protos
#  endif /* __P */
#  define    __CONCAT(x,y)    x ## y
#  define    __STRING(x)    #x
# else /* defined(__STDC__) || defined(__cplusplus) */
#  define    __P(protos)    ()
#  define    __CONCAT(x,y)    x/**/y
#  define    __STRING(x)    "x"
#  define    const
#  define    signed
#  define    volatile
# endif /* defined(__STDC__) || defined(__cplusplus) */

/*
**  Define HOND_DEAD, a macro used to declare functions that do not return
**  to their caller.
*/
# ifndef HOND_DEAD
#  if __GNUC__ >= 2
#   if __GNUC__ == 2 && __GNUC_MINOR__ < 5
#    define HOND_DEAD(proto) volatile proto
#   else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
#    define HOND_DEAD(proto) proto __attribute__((__noreturn__))
#   endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
#  else /* __GNUC__ >= 2 */
#   define HOND_DEAD(proto) proto
#  endif /* __GNUC__ >= 2 */
# endif /* HOND_DEAD */

/*
**  Define HOND_UNUSED, a macro used to declare variables that may be unused.
*/
# ifndef HOND_UNUSED
#  if __GNUC__ >= 2
#   if __GNUC__ == 2 && __GNUC_MINOR__ < 7
#    define HOND_UNUSED(decl) decl
#   else /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */
#    define HOND_UNUSED(decl) decl __attribute__((__unused__))
#   endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */
#  else /* __GNUC__ >= 2 */
#   define HOND_UNUSED(decl) decl
#  endif /* __GNUC__ >= 2 */
# endif /* HOND_UNUSED */

/*
**  The HOND_NONVOLATILE macro is used to declare variables that are not
**  volatile, but which must be declared volatile when compiling with
**  gcc -O -Wall in order to suppress bogus warning messages.
**
**  Variables that actually are volatile should be declared volatile
**  using the "volatile" keyword.  If a variable actually is volatile,
**  then HOND_NONVOLATILE should not be used.
**
**  To compile source code with gcc and see all non-bogus warnings use:
**
**      gcc -O -Wall -DHOND_OMIT_BOGUS_WARNINGS ...
**
**  Do not use -DHOND_OMIT_BOGUS_WARNINGS when compiling production
**  software, because there is a performance hit.
*/
# ifdef HOND_OMIT_BOGUS_WARNINGS
#  define HOND_NONVOLATILE volatile
# else /* HOND_OMIT_BOGUS_WARNINGS */
#  define HOND_NONVOLATILE
# endif /* HOND_OMIT_BOGUS_WARNINGS */

/*
**  Turn on format string argument checking.
*/
# ifndef HOND_CONF_FORMAT_TEST
#  if __GNUC__ == 2 && __GNUC_MINOR__ >= 7
#   define HOND_CONF_FORMAT_TEST    1
#  else /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */
#   define HOND_CONF_FORMAT_TEST    0
#  endif /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */
# endif /* HOND_CONF_FORMAT_TEST */

# ifndef PRINTFLIKE
#  if HOND_CONF_FORMAT_TEST
#   define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, x, y)))
#  else /* HOND_CONF_FORMAT_TEST */
#   define PRINTFLIKE(x,y)
#  endif /* HOND_CONF_FORMAT_TEST */
# endif /* ! PRINTFLIKE */

# ifndef SCANFLIKE
#  if HOND_CONF_FORMAT_TEST
#   define SCANFLIKE(x,y) __attribute__ ((__format__ (__scanf__, x, y)))
#  else /* HOND_CONF_FORMAT_TEST */
#   define SCANFLIKE(x,y)
#  endif /* HOND_CONF_FORMAT_TEST */
# endif /* ! SCANFLIKE */

#endif /* ! HOND_CDEFS_H */

