summaryrefslogtreecommitdiffstats
path: root/contrib/sendmail/include/sendmail/cdefs.h
blob: bd7285bc2e7e9c6cf2b6f02be6f648a694bbbe27 (plain)
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
/*
 * Copyright (c) 1991, 1993
 *	The Regents of the University of California.  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 8.5 1999/06/02 22:32:17 gshapiro Exp $
 *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
 */

#ifndef _CDEFS_H_
# define	_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) */

/*
 * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
 * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
 * in between its arguments.  __CONCAT can also concatenate double-quoted
 * strings produced by the __STRING macro, but this only works with ANSI C.
 */
# if defined(__STDC__) || defined(__cplusplus)
#  define	__P(protos)	protos		/* full-blown ANSI C */
#  ifndef __CONCAT
#   define	__CONCAT(x,y)	x ## y
#  endif /* ! __CONCAT */
#  define	__STRING(x)	#x

#  ifndef __const
#   define	__const		const		/* define reserved names to standard */
#  endif /* ! __const */
#  define	__signed	signed
#  define	__volatile	volatile
#  if defined(__cplusplus)
#   define	__inline	inline		/* convert to C++ keyword */
#  else /* defined(__cplusplus) */
#   ifndef __GNUC__
#    define	__inline			/* delete GCC keyword */
#   endif /* ! __GNUC__ */
#  endif /* defined(__cplusplus) */

# else /* defined(__STDC__) || defined(__cplusplus) */
#  define	__P(protos)	()		/* traditional C preprocessor */
#  ifndef __CONCAT
#   define	__CONCAT(x,y)	x/**/y
#  endif /* ! __CONCAT */
#  define	__STRING(x)	"x"

#  ifndef __GNUC__
#   define	__const				/* delete pseudo-ANSI C keywords */
#   define	__inline
#   define	__signed
#   define	__volatile
/*
 * In non-ANSI C environments, new programs will want ANSI-only C keywords
 * deleted from the program and old programs will want them left alone.
 * When using a compiler other than gcc, programs using the ANSI C keywords
 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
 * When using "gcc -traditional", we assume that this is the intent; if
 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
 */
#   ifndef NO_ANSI_KEYWORDS
#    define	const				/* delete ANSI C keywords */
#    define	inline
#    define	signed
#    define	volatile
#   endif /* ! NO_ANSI_KEYWORDS */
#  endif /* ! __GNUC__ */
# endif /* defined(__STDC__) || defined(__cplusplus) */

/*
 * GCC1 and some versions of GCC2 declare dead (non-returning) and
 * pure (no side effects) functions using "volatile" and "const";
 * unfortunately, these then cause warnings under "-ansi -pedantic".
 * GCC2 uses a new, peculiar __attribute__((attrs)) style.  All of
 * these work for GNU C++ (modulo a slight glitch in the C++ grammar
 * in the distribution version of 2.5.5).
 */
# if !defined(__GNUC__) || __GNUC__ < 2 || \
	(__GNUC__ == 2 && __GNUC_MINOR__ < 5)
#  define	__attribute__(x)	/* delete __attribute__ if non-gcc or gcc1 */
#  if defined(__GNUC__) && !defined(__STRICT_ANSI__)
#   define	__dead		__volatile
#   define	__pure		__const
#  endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) */
# endif /* !defined(__GNUC__) || __GNUC__ < 2 || \ */

/* Delete pseudo-keywords wherever they are not available or needed. */
# ifndef __dead
#  define	__dead
#  define	__pure
# endif /* ! __dead */

#endif /* ! _CDEFS_H_ */
OpenPOWER on IntegriCloud