cdefs.h revision 37052
190926Snectar/*
2178825Sdfr * Copyright (c) 1991, 1993
390926Snectar *	The Regents of the University of California.  All rights reserved.
490926Snectar *
590926Snectar * This code is derived from software contributed to Berkeley by
690926Snectar * Berkeley Software Design, Inc.
790926Snectar *
890926Snectar * Redistribution and use in source and binary forms, with or without
990926Snectar * modification, are permitted provided that the following conditions
1090926Snectar * are met:
1190926Snectar * 1. Redistributions of source code must retain the above copyright
1290926Snectar *    notice, this list of conditions and the following disclaimer.
1390926Snectar * 2. Redistributions in binary form must reproduce the above copyright
1490926Snectar *    notice, this list of conditions and the following disclaimer in the
1590926Snectar *    documentation and/or other materials provided with the distribution.
1690926Snectar * 3. All advertising materials mentioning features or use of this software
1790926Snectar *    must display the following acknowledgement:
1890926Snectar *	This product includes software developed by the University of
1990926Snectar *	California, Berkeley and its contributors.
2090926Snectar * 4. Neither the name of the University nor the names of its contributors
2190926Snectar *    may be used to endorse or promote products derived from this software
2290926Snectar *    without specific prior written permission.
2390926Snectar *
2490926Snectar * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
2590926Snectar * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
2690926Snectar * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
2790926Snectar * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
2890926Snectar * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
2990926Snectar * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
3090926Snectar * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
3190926Snectar * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
3290926Snectar * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
3390926Snectar * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
3490926Snectar * SUCH DAMAGE.
35 *
36 *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
37 * $Id: cdefs.h,v 1.17 1998/06/14 13:40:01 bde Exp $
38 */
39
40#ifndef	_SYS_CDEFS_H_
41#define	_SYS_CDEFS_H_
42
43#if defined(__cplusplus)
44#define	__BEGIN_DECLS	extern "C" {
45#define	__END_DECLS	}
46#else
47#define	__BEGIN_DECLS
48#define	__END_DECLS
49#endif
50
51/*
52 * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
53 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
54 * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI
55 * mode -- there must be no spaces between its arguments, and for nested
56 * __CONCAT's, all the __CONCAT's must be at the left.  __CONCAT can also
57 * concatenate double-quoted strings produced by the __STRING macro, but
58 * this only works with ANSI C.
59 *
60 * __XSTRING is like __STRING, but it expands any macros in its argument
61 * first.  It is only available with ANSI C.
62 */
63#if defined(__STDC__) || defined(__cplusplus)
64#define	__P(protos)	protos		/* full-blown ANSI C */
65#define	__CONCAT1(x,y)	x ## y
66#define	__CONCAT(x,y)	__CONCAT1(x,y)
67#define	__STRING(x)	#x		/* stringify without expanding x */
68#define	__XSTRING(x)	__STRING(x)	/* expand x, then stringify */
69
70#define	__const		const		/* define reserved names to standard */
71#define	__signed	signed
72#define	__volatile	volatile
73#if defined(__cplusplus)
74#define	__inline	inline		/* convert to C++ keyword */
75#else
76#ifndef __GNUC__
77#define	__inline			/* delete GCC keyword */
78#endif /* !__GNUC__ */
79#endif /* !__cplusplus */
80
81#else	/* !(__STDC__ || __cplusplus) */
82#define	__P(protos)	()		/* traditional C preprocessor */
83#define	__CONCAT(x,y)	x/**/y
84#define	__STRING(x)	"x"
85
86#ifndef __GNUC__
87#define	__const				/* delete pseudo-ANSI C keywords */
88#define	__inline
89#define	__signed
90#define	__volatile
91/*
92 * In non-ANSI C environments, new programs will want ANSI-only C keywords
93 * deleted from the program and old programs will want them left alone.
94 * When using a compiler other than gcc, programs using the ANSI C keywords
95 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
96 * When using "gcc -traditional", we assume that this is the intent; if
97 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
98 */
99#ifndef	NO_ANSI_KEYWORDS
100#define	const				/* delete ANSI C keywords */
101#define	inline
102#define	signed
103#define	volatile
104#endif	/* !NO_ANSI_KEYWORDS */
105#endif	/* !__GNUC__ */
106#endif	/* !(__STDC__ || __cplusplus) */
107
108/*
109 * GCC1 and some versions of GCC2 declare dead (non-returning) and
110 * pure (no side effects) functions using "volatile" and "const";
111 * unfortunately, these then cause warnings under "-ansi -pedantic".
112 * GCC2.5 uses a new, peculiar __attribute__((attrs)) style.  All of
113 * these work for GNU C++ (modulo a slight glitch in the C++ grammar
114 * in the distribution version of 2.5.5).
115 */
116#if __GNUC__ < 2
117#define __dead
118#define __dead2
119#define __pure
120#define __pure2
121#define __unused
122#endif
123#if __GNUC__ == 2 && __GNUC_MINOR__ < 5
124#define	__dead		__volatile
125#define __dead2
126#define	__pure		__const
127#define __pure2
128#define __unused
129#endif
130#if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7
131#define __dead
132#define __dead2		__attribute__((__noreturn__))
133#define __pure
134#define __pure2		__attribute__((__const__))
135#define __unused
136#endif
137#if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ >= 3
138#define __dead
139#define __dead2		__attribute__((__noreturn__))
140#define __pure
141#define __pure2		__attribute__((__const__))
142#define __unused	__attribute__((__unused__))
143#endif
144
145#ifdef __GNUC__
146#ifdef __ELF__
147#ifdef __STDC__
148#define	__weak_reference(sym,alias)	\
149	__asm__(".weak " #alias);	\
150	__asm__(".set "  #alias ", " #sym)
151#define	__warn_references(sym,msg)	\
152	__asm__(".section .gnu.warning." #sym);	\
153	__asm__(".ascii \"" msg "\"");	\
154	__asm__(".previous")
155#else
156#define	__weak_reference(sym,alias)	\
157	__asm__(".weak alias");		\
158	__asm__(".set alias, sym")
159#define	__warn_references(sym,msg)	\
160	__asm__(".section .gnu.warning.sym"); \
161	__asm__(".ascii \"msg\"");	\
162	__asm__(".previous")
163#endif	/* __STDC__ */
164#else	/* !__ELF__ */
165#ifdef __STDC__
166#define __weak_reference(sym,alias)	\
167	__asm__(".stabs \"_" #alias "\",11,0,0,0");	\
168	__asm__(".stabs \"_" #sym "\",1,0,0,0")
169#define __warn_references(sym,msg)	\
170	__asm__(".stabs \"" msg "\",30,0,0,0");		\
171	__asm__(".stabs \"_" #sym "\",1,0,0,0")
172#else
173#define __weak_reference(sym,alias)	\
174	__asm__(".stabs \"_/**/alias\",11,0,0,0");	\
175	__asm__(".stabs \"_/**/sym\",1,0,0,0")
176#define __warn_references(sym,msg)	\
177	__asm__(".stabs msg,30,0,0,0");			\
178	__asm__(".stabs \"_/**/sym\",1,0,0,0")
179#endif	/* __STDC__ */
180#endif	/* __ELF__ */
181#endif	/* __GNUC__ */
182
183#define	__IDSTRING(name,string)	static const char name[] __unused = string
184
185#ifndef	__RCSID
186#define	__RCSID(s)	__IDSTRING(rcsid,s)
187#endif
188
189#ifndef	__RCSID_SOURCE
190#define	__RCSID_SOURCE(s) __IDSTRING(rcsid_source,s)
191#endif
192
193#ifndef	__COPYRIGHT
194#define	__COPYRIGHT(s)	__IDSTRING(copyright,s)
195#endif
196
197#endif /* !_SYS_CDEFS_H_ */
198