1 /*
   2  * Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
   3  *      All rights reserved.
   4  *
   5  * By using this file, you agree to the terms and conditions set
   6  * forth in the LICENSE file which can be found at the top level of
   7  * the sendmail distribution.
   8  *
   9  *      $Id: cdefs.h,v 1.15.2.1 2003/12/05 22:44:17 ca Exp $
  10  */
  11 
  12 #pragma ident   "%Z%%M% %I%     %E% SMI"
  13 
  14 /*
  15 **  libsm C language portability macros
  16 **  See libsm/cdefs.html for documentation.
  17 */
  18 
  19 #ifndef SM_CDEFS_H
  20 # define SM_CDEFS_H
  21 
  22 # include <sm/config.h>
  23 
  24 /*
  25 **  BSD and Linux have <sys/cdefs.h> which defines a set of C language
  26 **  portability macros that are a defacto standard in the open source
  27 **  community.
  28 */
  29 
  30 # if SM_CONF_SYS_CDEFS_H
  31 #  include <sys/cdefs.h>
  32 # endif /* SM_CONF_SYS_CDEFS_H */
  33 
  34 /*
  35 **  Define the standard C language portability macros
  36 **  for platforms that lack <sys/cdefs.h>.
  37 */
  38 
  39 # if !SM_CONF_SYS_CDEFS_H
  40 #  if defined(__cplusplus)
  41 #   define      __BEGIN_DECLS   extern "C" {
  42 #   define      __END_DECLS     };
  43 #  else /* defined(__cplusplus) */
  44 #   define      __BEGIN_DECLS
  45 #   define      __END_DECLS
  46 #  endif /* defined(__cplusplus) */
  47 #  if defined(__STDC__) || defined(__cplusplus)
  48 #   ifndef __P
  49 #    define     __P(protos)     protos
  50 #   endif /* __P */
  51 #   define      __CONCAT(x,y)   x ## y
  52 #   define      __STRING(x)     #x
  53 #  else /* defined(__STDC__) || defined(__cplusplus) */
  54 #   define      __P(protos)     ()
  55 #   define      __CONCAT(x,y)   x/**/y
  56 #   define      __STRING(x)     "x"
  57 #   define      const
  58 #   define      signed
  59 #   define      volatile
  60 #  endif /* defined(__STDC__) || defined(__cplusplus) */
  61 # endif /* !SM_CONF_SYS_CDEFS_H */
  62 
  63 /*
  64 **  Define SM_DEAD, a macro used to declare functions that do not return
  65 **  to their caller.
  66 */
  67 
  68 # ifndef SM_DEAD
  69 #  if __GNUC__ >= 2
  70 #   if __GNUC__ == 2 && __GNUC_MINOR__ < 5
  71 #    define SM_DEAD(proto) volatile proto
  72 #    define SM_DEAD_D volatile
  73 #   else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
  74 #    define SM_DEAD(proto) proto __attribute__((__noreturn__))
  75 #    define SM_DEAD_D
  76 #   endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
  77 #  else /* __GNUC__ >= 2 */
  78 #   define SM_DEAD(proto) proto
  79 #   define SM_DEAD_D
  80 #  endif /* __GNUC__ >= 2 */
  81 # endif /* SM_DEAD */
  82 
  83 /*
  84 **  Define SM_UNUSED, a macro used to declare variables that may be unused.
  85 */
  86 
  87 # ifndef SM_UNUSED
  88 #  if __GNUC__ >= 2
  89 #   if __GNUC__ == 2 && __GNUC_MINOR__ < 7
  90 #    define SM_UNUSED(decl) decl
  91 #   else /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */
  92 #    define SM_UNUSED(decl) decl __attribute__((__unused__))
  93 #   endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */
  94 #  else /* __GNUC__ >= 2 */
  95 #   define SM_UNUSED(decl) decl
  96 #  endif /* __GNUC__ >= 2 */
  97 # endif /* SM_UNUSED */
  98 
  99 /*
 100 **  The SM_NONVOLATILE macro is used to declare variables that are not
 101 **  volatile, but which must be declared volatile when compiling with
 102 **  gcc -O -Wall in order to suppress bogus warning messages.
 103 **
 104 **  Variables that actually are volatile should be declared volatile
 105 **  using the "volatile" keyword.  If a variable actually is volatile,
 106 **  then SM_NONVOLATILE should not be used.
 107 **
 108 **  To compile sendmail with gcc and see all non-bogus warnings,
 109 **  you should use
 110 **      gcc -O -Wall -DSM_OMIT_BOGUS_WARNINGS ...
 111 **  Do not use -DSM_OMIT_BOGUS_WARNINGS when compiling the production
 112 **  version of sendmail, because there is a performance hit.
 113 */
 114 
 115 # ifdef SM_OMIT_BOGUS_WARNINGS
 116 #  define SM_NONVOLATILE volatile
 117 # else /* SM_OMIT_BOGUS_WARNINGS */
 118 #  define SM_NONVOLATILE
 119 # endif /* SM_OMIT_BOGUS_WARNINGS */
 120 
 121 /*
 122 **  Turn on format string argument checking.
 123 */
 124 
 125 # ifndef SM_CONF_FORMAT_TEST
 126 #  if __GNUC__ == 2 && __GNUC_MINOR__ >= 7
 127 #   define SM_CONF_FORMAT_TEST  1
 128 #  else /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */
 129 #   define SM_CONF_FORMAT_TEST  0
 130 #  endif /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */
 131 # endif /* SM_CONF_FORMAT_TEST */
 132 
 133 # ifndef PRINTFLIKE
 134 #  if SM_CONF_FORMAT_TEST
 135 #   define PRINTFLIKE(x,y) __attribute__ ((__format__ (__printf__, x, y)))
 136 #  else /* SM_CONF_FORMAT_TEST */
 137 #   define PRINTFLIKE(x,y)
 138 #  endif /* SM_CONF_FORMAT_TEST */
 139 # endif /* ! PRINTFLIKE */
 140 
 141 # ifndef SCANFLIKE
 142 #  if SM_CONF_FORMAT_TEST
 143 #   define SCANFLIKE(x,y) __attribute__ ((__format__ (__scanf__, x, y)))
 144 #  else /* SM_CONF_FORMAT_TEST */
 145 #   define SCANFLIKE(x,y)
 146 #  endif /* SM_CONF_FORMAT_TEST */
 147 # endif /* ! SCANFLIKE */
 148 
 149 #endif /* ! SM_CDEFS_H */