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 */
150