aboutsummaryrefslogtreecommitdiff
path: root/contrib/sendmail/include/sm/cdefs.h
blob: 86a46f945736b9dc1eada3cf386a393489ba340f (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/*
 * Copyright (c) 2000-2002 Sendmail, Inc. and its suppliers.
 *	All rights reserved.
 *
 * By using this file, you agree to the terms and conditions set
 * forth in the LICENSE file which can be found at the top level of
 * the sendmail distribution.
 *
 *	$Id: cdefs.h,v 1.1.1.2 2002/04/10 03:04:54 gshapiro Exp $
 */

/*
**  libsm C language portability macros
**  See libsm/cdefs.html for documentation.
*/

#ifndef SM_CDEFS_H
# define SM_CDEFS_H

# include <sm/config.h>

/*
**  BSD and Linux have <sys/cdefs.h> which defines a set of C language
**  portability macros that are a defacto standard in the open source
**  community.
*/

# if SM_CONF_SYS_CDEFS_H
#  include <sys/cdefs.h>
# endif /* SM_CONF_SYS_CDEFS_H */

/*
**  Define the standard C language portability macros
**  for platforms that lack <sys/cdefs.h>.
*/

# if !SM_CONF_SYS_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) */
# endif /* !SM_CONF_SYS_CDEFS_H */

/*
**  Define SM_DEAD, a macro used to declare functions that do not return
**  to their caller.
*/

# ifndef SM_DEAD
#  if __GNUC__ >= 2
#   if __GNUC__ == 2 && __GNUC_MINOR__ < 5
#    define SM_DEAD(proto) volatile proto
#   else /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
#    define SM_DEAD(proto) proto __attribute__((__noreturn__))
#   endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 5 */
#  else /* __GNUC__ >= 2 */
#   define SM_DEAD(proto) proto
#  endif /* __GNUC__ >= 2 */
# endif /* SM_DEAD */

/*
**  Define SM_UNUSED, a macro used to declare variables that may be unused.
*/

# ifndef SM_UNUSED
#  if __GNUC__ >= 2
#   if __GNUC__ == 2 && __GNUC_MINOR__ < 7
#    define SM_UNUSED(decl) decl
#   else /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */
#    define SM_UNUSED(decl) decl __attribute__((__unused__))
#   endif /* __GNUC__ == 2 && __GNUC_MINOR__ < 7 */
#  else /* __GNUC__ >= 2 */
#   define SM_UNUSED(decl) decl
#  endif /* __GNUC__ >= 2 */
# endif /* SM_UNUSED */

/*
**  The SM_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 SM_NONVOLATILE should not be used.
**
**  To compile sendmail with gcc and see all non-bogus warnings,
**  you should use
**	gcc -O -Wall -DSM_OMIT_BOGUS_WARNINGS ...
**  Do not use -DSM_OMIT_BOGUS_WARNINGS when compiling the production
**  version of sendmail, because there is a performance hit.
*/

# ifdef SM_OMIT_BOGUS_WARNINGS
#  define SM_NONVOLATILE volatile
# else /* SM_OMIT_BOGUS_WARNINGS */
#  define SM_NONVOLATILE
# endif /* SM_OMIT_BOGUS_WARNINGS */

/*
**  Turn on format string argument checking.
*/

# ifndef SM_CONF_FORMAT_TEST
#  if __GNUC__ == 2 && __GNUC_MINOR__ >= 7
#   define SM_CONF_FORMAT_TEST	1
#  else /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */
#   define SM_CONF_FORMAT_TEST	0
#  endif /* __GNUC__ == 2 && __GNUC_MINOR__ >= 7 */
# endif /* SM_CONF_FORMAT_TEST */

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

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

#endif /* ! SM_CDEFS_H */