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