1 /* 2 * Copyright (c) 1991, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Berkeley Software Design, Inc. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 3. All advertising materials mentioning features or use of this software 17 * must display the following acknowledgement: 18 * This product includes software developed by the University of 19 * California, Berkeley and its contributors. 20 * 4. Neither the name of the University nor the names of its contributors 21 * may be used to endorse or promote products derived from this software 22 * without specific prior written permission. 23 * 24 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 25 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 26 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 27 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 28 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 29 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 30 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 31 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 32 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 33 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 34 * SUCH DAMAGE. 35 * 36 * @(#)cdefs.h 8.8 (Berkeley) 1/9/95 37 * $FreeBSD: src/sys/sys/cdefs.h,v 1.28.2.8 2002/09/18 04:05:13 mikeh 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 * Compiler-dependent macros to help declare dead (non-returning) and 110 * pure (no side effects) functions, and unused variables. They are 111 * null except for versions of gcc that are known to support the features 112 * properly (old versions of gcc-2 supported the dead and pure features 113 * in a different (wrong) way). 114 */ 115 #if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 5 116 #define __dead2 117 #define __pure2 118 #define __unused 119 #endif 120 #if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 121 #define __dead2 __attribute__((__noreturn__)) 122 #define __pure2 __attribute__((__const__)) 123 #define __unused 124 #endif 125 #if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ == 3 126 #define __dead2 __attribute__((__noreturn__)) 127 #define __pure2 __attribute__((__const__)) 128 #define __unused __attribute__((__unused__)) 129 #endif 130 131 /* XXX: should use `#if __STDC_VERSION__ < 199901'. */ 132 #if !(__GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ >= 3) 133 #define __func__ NULL 134 #endif 135 136 #if __GNUC__ >= 2 && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901 137 #define __LONG_LONG_SUPPORTED 138 #endif 139 140 /* 141 * GCC 2.95 provides `__restrict' as an extention to C90 to support the 142 * C99-specific `restrict' type qualifier. We happen to use `__restrict' as 143 * a way to define the `restrict' type qualifier without disturbing older 144 * software that is unaware of C99 keywords. 145 */ 146 #if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95) 147 #if __STDC_VERSION__ < 199901 148 #define __restrict 149 #else 150 #define __restrict restrict 151 #endif 152 #endif 153 154 /* 155 * Compiler-dependent macros to declare that functions take printf-like 156 * or scanf-like arguments. They are null except for versions of gcc 157 * that are known to support the features properly (old versions of gcc-2 158 * didn't permit keeping the keywords out of the application namespace). 159 */ 160 #if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 7 161 #define __printflike(fmtarg, firstvararg) 162 #define __scanflike(fmtarg, firstvararg) 163 #else 164 #define __printflike(fmtarg, firstvararg) \ 165 __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 166 #define __scanflike(fmtarg, firstvararg) \ 167 __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) 168 #endif 169 170 /* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ 171 #if __FreeBSD_cc_version >= 300001 172 #define __printf0like(fmtarg, firstvararg) \ 173 __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) 174 #else 175 #define __printf0like(fmtarg, firstvararg) 176 #endif 177 178 #ifdef __GNUC__ 179 #define __strong_reference(sym,aliassym) \ 180 extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))); 181 #ifdef __ELF__ 182 #ifdef __STDC__ 183 #define __weak_reference(sym,alias) \ 184 __asm__(".weak " #alias); \ 185 __asm__(".equ " #alias ", " #sym) 186 #define __warn_references(sym,msg) \ 187 __asm__(".section .gnu.warning." #sym); \ 188 __asm__(".asciz \"" msg "\""); \ 189 __asm__(".previous") 190 #else 191 #define __weak_reference(sym,alias) \ 192 __asm__(".weak alias"); \ 193 __asm__(".equ alias, sym") 194 #define __warn_references(sym,msg) \ 195 __asm__(".section .gnu.warning.sym"); \ 196 __asm__(".asciz \"msg\""); \ 197 __asm__(".previous") 198 #endif /* __STDC__ */ 199 #else /* !__ELF__ */ 200 #ifdef __STDC__ 201 #define __weak_reference(sym,alias) \ 202 __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ 203 __asm__(".stabs \"_" #sym "\",1,0,0,0") 204 #define __warn_references(sym,msg) \ 205 __asm__(".stabs \"" msg "\",30,0,0,0"); \ 206 __asm__(".stabs \"_" #sym "\",1,0,0,0") 207 #else 208 #define __weak_reference(sym,alias) \ 209 __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ 210 __asm__(".stabs \"_/**/sym\",1,0,0,0") 211 #define __warn_references(sym,msg) \ 212 __asm__(".stabs msg,30,0,0,0"); \ 213 __asm__(".stabs \"_/**/sym\",1,0,0,0") 214 #endif /* __STDC__ */ 215 #endif /* __ELF__ */ 216 #endif /* __GNUC__ */ 217 218 #if defined(__GNUC__) && defined(__ELF__) 219 #define __IDSTRING(name,string) __asm__(".ident\t\"" string "\"") 220 #else 221 #define __IDSTRING(name,string) static const char name[] __unused = string 222 #endif 223 224 #ifndef __RCSID 225 #define __RCSID(s) __IDSTRING(rcsid,s) 226 #endif 227 228 /* 229 * Embed the rcs id of a source file in the resulting library. Note that in 230 * more recent ELF binutils, we use .ident allowing the ID to be stripped. 231 * Usage: 232 * __FBSDID("$FreeBSD: src/sys/sys/cdefs.h,v 1.28.2.8 2002/09/18 04:05:13 mikeh Exp $"); 233 */ 234 #ifndef __FBSDID 235 #if !defined(lint) && !defined(STRIP_FBSDID) 236 #define __FBSDID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) 237 #else 238 #define __FBSDID(s) struct __hack 239 #endif 240 #endif 241 242 #ifndef __RCSID_SOURCE 243 #define __RCSID_SOURCE(s) __IDSTRING(rcsid_source,s) 244 #endif 245 246 #ifndef __COPYRIGHT 247 #define __COPYRIGHT(s) __IDSTRING(copyright,s) 248 #endif 249 250 /*- 251 * The following definitions are an extension of the behavior originally 252 * implemented in <sys/_posix.h>, but with a different level of granularity. 253 * POSIX.1 requires that the macros we test be defined before any standard 254 * header file is included. 255 * 256 * Here's a quick run-down of the versions: 257 * defined(_POSIX_SOURCE) 1003.1-1988 258 * _POSIX_C_SOURCE == 1 1003.1-1990 259 * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option 260 * _POSIX_C_SOURCE == 199309 1003.1b-1993 261 * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995, 262 * and the omnibus ISO/IEC 9945-1: 1996 263 * _POSIX_C_SOURCE == 200112 1003.1-2001 264 * 265 * In addition, the X/Open Portability Guide, which is now the Single UNIX 266 * Specification, defines a feature-test macro which indicates the version of 267 * that specification, and which subsumes _POSIX_C_SOURCE. 268 * 269 * Our macros begin with two underscores to avoid namespace screwage. 270 */ 271 272 /* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */ 273 #if _POSIX_C_SOURCE == 1 274 #undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */ 275 #define _POSIX_C_SOURCE 199009 276 #endif 277 278 /* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */ 279 #if _POSIX_C_SOURCE == 2 280 #undef _POSIX_C_SOURCE 281 #define _POSIX_C_SOURCE 199209 282 #endif 283 284 /* Deal with various X/Open Portability Guides and Single UNIX Spec. */ 285 #ifdef _XOPEN_SOURCE 286 #if _XOPEN_SOURCE - 0 >= 600 287 #define __XSI_VISIBLE 600 288 #undef _POSIX_C_SOURCE 289 #define _POSIX_C_SOURCE 200112 290 #elif _XOPEN_SOURCE - 0 >= 500 291 #define __XSI_VISIBLE 500 292 #undef _POSIX_C_SOURCE 293 #define _POSIX_C_SOURCE 199506 294 #endif 295 #endif 296 297 /* 298 * Deal with all versions of POSIX. The ordering relative to the tests above is 299 * important. 300 */ 301 #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) 302 #define _POSIX_C_SOURCE 198808 303 #endif 304 #ifdef _POSIX_C_SOURCE 305 #if _POSIX_C_SOURCE >= 200112 306 #define __POSIX_VISIBLE 200112 307 #define __ISO_C_VISIBLE 1999 308 #elif _POSIX_C_SOURCE >= 199506 309 #define __POSIX_VISIBLE 199506 310 #define __ISO_C_VISIBLE 1990 311 #elif _POSIX_C_SOURCE >= 199309 312 #define __POSIX_VISIBLE 199309 313 #define __ISO_C_VISIBLE 1990 314 #elif _POSIX_C_SOURCE >= 199209 315 #define __POSIX_VISIBLE 199209 316 #define __ISO_C_VISIBLE 1990 317 #elif _POSIX_C_SOURCE >= 199009 318 #define __POSIX_VISIBLE 199009 319 #define __ISO_C_VISIBLE 1990 320 #else 321 #define __POSIX_VISIBLE 198808 322 #define __ISO_C_VISIBLE 0 323 #endif /* _POSIX_C_SOURCE */ 324 #else 325 /*- 326 * Deal with _ANSI_SOURCE: 327 * If it is defined, and no other compilation environment is explicitly 328 * requested, then define our internal feature-test macros to zero. This 329 * makes no difference to the preprocessor (undefined symbols in preprocessing 330 * expressions are defined to have value zero), but makes it more convenient for 331 * a test program to print out the values. 332 * 333 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as 334 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation 335 * environment (and in fact we will never get here). 336 */ 337 #ifdef _ANSI_SOURCE /* Hide almost everything. */ 338 #define __POSIX_VISIBLE 0 339 #define __XSI_VISIBLE 0 340 #define __BSD_VISIBLE 0 341 #define __ISO_C_VISIBLE 1990 342 #else /* Default environment: show everything. */ 343 #define __POSIX_VISIBLE 200112 344 #define __XSI_VISIBLE 600 345 #define __BSD_VISIBLE 1 346 #define __ISO_C_VISIBLE 1999 347 #endif 348 #endif 349 350 #endif /* !_SYS_CDEFS_H_ */ 351