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