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 * $DragonFly: src/sys/sys/cdefs.h,v 1.2 2003/06/17 04:28:58 dillon Exp $ 39 */ 40 41 #ifndef _SYS_CDEFS_H_ 42 #define _SYS_CDEFS_H_ 43 44 #if defined(__cplusplus) 45 #define __BEGIN_DECLS extern "C" { 46 #define __END_DECLS } 47 #else 48 #define __BEGIN_DECLS 49 #define __END_DECLS 50 #endif 51 52 /* 53 * The __CONCAT macro is used to concatenate parts of symbol names, e.g. 54 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo. 55 * The __CONCAT macro is a bit tricky to use if it must work in non-ANSI 56 * mode -- there must be no spaces between its arguments, and for nested 57 * __CONCAT's, all the __CONCAT's must be at the left. __CONCAT can also 58 * concatenate double-quoted strings produced by the __STRING macro, but 59 * this only works with ANSI C. 60 * 61 * __XSTRING is like __STRING, but it expands any macros in its argument 62 * first. It is only available with ANSI C. 63 */ 64 #if defined(__STDC__) || defined(__cplusplus) 65 #define __P(protos) protos /* full-blown ANSI C */ 66 #define __CONCAT1(x,y) x ## y 67 #define __CONCAT(x,y) __CONCAT1(x,y) 68 #define __STRING(x) #x /* stringify without expanding x */ 69 #define __XSTRING(x) __STRING(x) /* expand x, then stringify */ 70 71 #define __const const /* define reserved names to standard */ 72 #define __signed signed 73 #define __volatile volatile 74 #if defined(__cplusplus) 75 #define __inline inline /* convert to C++ keyword */ 76 #else 77 #ifndef __GNUC__ 78 #define __inline /* delete GCC keyword */ 79 #endif /* !__GNUC__ */ 80 #endif /* !__cplusplus */ 81 82 #else /* !(__STDC__ || __cplusplus) */ 83 #define __P(protos) () /* traditional C preprocessor */ 84 #define __CONCAT(x,y) x/**/y 85 #define __STRING(x) "x" 86 87 #ifndef __GNUC__ 88 #define __const /* delete pseudo-ANSI C keywords */ 89 #define __inline 90 #define __signed 91 #define __volatile 92 /* 93 * In non-ANSI C environments, new programs will want ANSI-only C keywords 94 * deleted from the program and old programs will want them left alone. 95 * When using a compiler other than gcc, programs using the ANSI C keywords 96 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS. 97 * When using "gcc -traditional", we assume that this is the intent; if 98 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone. 99 */ 100 #ifndef NO_ANSI_KEYWORDS 101 #define const /* delete ANSI C keywords */ 102 #define inline 103 #define signed 104 #define volatile 105 #endif /* !NO_ANSI_KEYWORDS */ 106 #endif /* !__GNUC__ */ 107 #endif /* !(__STDC__ || __cplusplus) */ 108 109 /* 110 * Compiler-dependent macros to help declare dead (non-returning) and 111 * pure (no side effects) functions, and unused variables. They are 112 * null except for versions of gcc that are known to support the features 113 * properly (old versions of gcc-2 supported the dead and pure features 114 * in a different (wrong) way). 115 */ 116 #if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 5 117 #define __dead2 118 #define __pure2 119 #define __unused 120 #endif 121 #if __GNUC__ == 2 && __GNUC_MINOR__ >= 5 && __GNUC_MINOR__ < 7 122 #define __dead2 __attribute__((__noreturn__)) 123 #define __pure2 __attribute__((__const__)) 124 #define __unused 125 #endif 126 #if __GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ == 3 127 #define __dead2 __attribute__((__noreturn__)) 128 #define __pure2 __attribute__((__const__)) 129 #define __unused __attribute__((__unused__)) 130 #endif 131 132 /* XXX: should use `#if __STDC_VERSION__ < 199901'. */ 133 #if !(__GNUC__ == 2 && __GNUC_MINOR__ >= 7 || __GNUC__ >= 3) 134 #define __func__ NULL 135 #endif 136 137 #if __GNUC__ >= 2 && !defined(__STRICT_ANSI__) || __STDC_VERSION__ >= 199901 138 #define __LONG_LONG_SUPPORTED 139 #endif 140 141 /* 142 * GCC 2.95 provides `__restrict' as an extention to C90 to support the 143 * C99-specific `restrict' type qualifier. We happen to use `__restrict' as 144 * a way to define the `restrict' type qualifier without disturbing older 145 * software that is unaware of C99 keywords. 146 */ 147 #if !(__GNUC__ == 2 && __GNUC_MINOR__ == 95) 148 #if __STDC_VERSION__ < 199901 149 #define __restrict 150 #else 151 #define __restrict restrict 152 #endif 153 #endif 154 155 /* 156 * Compiler-dependent macros to declare that functions take printf-like 157 * or scanf-like arguments. They are null except for versions of gcc 158 * that are known to support the features properly (old versions of gcc-2 159 * didn't permit keeping the keywords out of the application namespace). 160 */ 161 #if __GNUC__ < 2 || __GNUC__ == 2 && __GNUC_MINOR__ < 7 162 #define __printflike(fmtarg, firstvararg) 163 #define __scanflike(fmtarg, firstvararg) 164 #else 165 #define __printflike(fmtarg, firstvararg) \ 166 __attribute__((__format__ (__printf__, fmtarg, firstvararg))) 167 #define __scanflike(fmtarg, firstvararg) \ 168 __attribute__((__format__ (__scanf__, fmtarg, firstvararg))) 169 #endif 170 171 /* Compiler-dependent macros that rely on FreeBSD-specific extensions. */ 172 #if __FreeBSD_cc_version >= 300001 173 #define __printf0like(fmtarg, firstvararg) \ 174 __attribute__((__format__ (__printf0__, fmtarg, firstvararg))) 175 #else 176 #define __printf0like(fmtarg, firstvararg) 177 #endif 178 179 #ifdef __GNUC__ 180 #define __strong_reference(sym,aliassym) \ 181 extern __typeof (sym) aliassym __attribute__ ((__alias__ (#sym))); 182 #ifdef __ELF__ 183 #ifdef __STDC__ 184 #define __weak_reference(sym,alias) \ 185 __asm__(".weak " #alias); \ 186 __asm__(".equ " #alias ", " #sym) 187 #define __warn_references(sym,msg) \ 188 __asm__(".section .gnu.warning." #sym); \ 189 __asm__(".asciz \"" msg "\""); \ 190 __asm__(".previous") 191 #else 192 #define __weak_reference(sym,alias) \ 193 __asm__(".weak alias"); \ 194 __asm__(".equ alias, sym") 195 #define __warn_references(sym,msg) \ 196 __asm__(".section .gnu.warning.sym"); \ 197 __asm__(".asciz \"msg\""); \ 198 __asm__(".previous") 199 #endif /* __STDC__ */ 200 #else /* !__ELF__ */ 201 #ifdef __STDC__ 202 #define __weak_reference(sym,alias) \ 203 __asm__(".stabs \"_" #alias "\",11,0,0,0"); \ 204 __asm__(".stabs \"_" #sym "\",1,0,0,0") 205 #define __warn_references(sym,msg) \ 206 __asm__(".stabs \"" msg "\",30,0,0,0"); \ 207 __asm__(".stabs \"_" #sym "\",1,0,0,0") 208 #else 209 #define __weak_reference(sym,alias) \ 210 __asm__(".stabs \"_/**/alias\",11,0,0,0"); \ 211 __asm__(".stabs \"_/**/sym\",1,0,0,0") 212 #define __warn_references(sym,msg) \ 213 __asm__(".stabs msg,30,0,0,0"); \ 214 __asm__(".stabs \"_/**/sym\",1,0,0,0") 215 #endif /* __STDC__ */ 216 #endif /* __ELF__ */ 217 #endif /* __GNUC__ */ 218 219 #if defined(__GNUC__) && defined(__ELF__) 220 #define __IDSTRING(name,string) __asm__(".ident\t\"" string "\"") 221 #else 222 #define __IDSTRING(name,string) static const char name[] __unused = string 223 #endif 224 225 #ifndef __RCSID 226 #define __RCSID(s) __IDSTRING(rcsid,s) 227 #endif 228 229 /* 230 * Embed the rcs id of a source file in the resulting library. Note that in 231 * more recent ELF binutils, we use .ident allowing the ID to be stripped. 232 * Usage: 233 * __FBSDID("$FreeBSD: src/sys/sys/cdefs.h,v 1.28.2.8 2002/09/18 04:05:13 mikeh Exp $"); 234 */ 235 #ifndef __FBSDID 236 #if !defined(lint) && !defined(STRIP_FBSDID) 237 #define __FBSDID(s) __IDSTRING(__CONCAT(__rcsid_,__LINE__),s) 238 #else 239 #define __FBSDID(s) struct __hack 240 #endif 241 #endif 242 243 #ifndef __RCSID_SOURCE 244 #define __RCSID_SOURCE(s) __IDSTRING(rcsid_source,s) 245 #endif 246 247 #ifndef __COPYRIGHT 248 #define __COPYRIGHT(s) __IDSTRING(copyright,s) 249 #endif 250 251 /*- 252 * The following definitions are an extension of the behavior originally 253 * implemented in <sys/_posix.h>, but with a different level of granularity. 254 * POSIX.1 requires that the macros we test be defined before any standard 255 * header file is included. 256 * 257 * Here's a quick run-down of the versions: 258 * defined(_POSIX_SOURCE) 1003.1-1988 259 * _POSIX_C_SOURCE == 1 1003.1-1990 260 * _POSIX_C_SOURCE == 2 1003.2-1992 C Language Binding Option 261 * _POSIX_C_SOURCE == 199309 1003.1b-1993 262 * _POSIX_C_SOURCE == 199506 1003.1c-1995, 1003.1i-1995, 263 * and the omnibus ISO/IEC 9945-1: 1996 264 * _POSIX_C_SOURCE == 200112 1003.1-2001 265 * 266 * In addition, the X/Open Portability Guide, which is now the Single UNIX 267 * Specification, defines a feature-test macro which indicates the version of 268 * that specification, and which subsumes _POSIX_C_SOURCE. 269 * 270 * Our macros begin with two underscores to avoid namespace screwage. 271 */ 272 273 /* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1. */ 274 #if _POSIX_C_SOURCE == 1 275 #undef _POSIX_C_SOURCE /* Probably illegal, but beyond caring now. */ 276 #define _POSIX_C_SOURCE 199009 277 #endif 278 279 /* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2. */ 280 #if _POSIX_C_SOURCE == 2 281 #undef _POSIX_C_SOURCE 282 #define _POSIX_C_SOURCE 199209 283 #endif 284 285 /* Deal with various X/Open Portability Guides and Single UNIX Spec. */ 286 #ifdef _XOPEN_SOURCE 287 #if _XOPEN_SOURCE - 0 >= 600 288 #define __XSI_VISIBLE 600 289 #undef _POSIX_C_SOURCE 290 #define _POSIX_C_SOURCE 200112 291 #elif _XOPEN_SOURCE - 0 >= 500 292 #define __XSI_VISIBLE 500 293 #undef _POSIX_C_SOURCE 294 #define _POSIX_C_SOURCE 199506 295 #endif 296 #endif 297 298 /* 299 * Deal with all versions of POSIX. The ordering relative to the tests above is 300 * important. 301 */ 302 #if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE) 303 #define _POSIX_C_SOURCE 198808 304 #endif 305 #ifdef _POSIX_C_SOURCE 306 #if _POSIX_C_SOURCE >= 200112 307 #define __POSIX_VISIBLE 200112 308 #define __ISO_C_VISIBLE 1999 309 #elif _POSIX_C_SOURCE >= 199506 310 #define __POSIX_VISIBLE 199506 311 #define __ISO_C_VISIBLE 1990 312 #elif _POSIX_C_SOURCE >= 199309 313 #define __POSIX_VISIBLE 199309 314 #define __ISO_C_VISIBLE 1990 315 #elif _POSIX_C_SOURCE >= 199209 316 #define __POSIX_VISIBLE 199209 317 #define __ISO_C_VISIBLE 1990 318 #elif _POSIX_C_SOURCE >= 199009 319 #define __POSIX_VISIBLE 199009 320 #define __ISO_C_VISIBLE 1990 321 #else 322 #define __POSIX_VISIBLE 198808 323 #define __ISO_C_VISIBLE 0 324 #endif /* _POSIX_C_SOURCE */ 325 #else 326 /*- 327 * Deal with _ANSI_SOURCE: 328 * If it is defined, and no other compilation environment is explicitly 329 * requested, then define our internal feature-test macros to zero. This 330 * makes no difference to the preprocessor (undefined symbols in preprocessing 331 * expressions are defined to have value zero), but makes it more convenient for 332 * a test program to print out the values. 333 * 334 * If a program mistakenly defines _ANSI_SOURCE and some other macro such as 335 * _POSIX_C_SOURCE, we will assume that it wants the broader compilation 336 * environment (and in fact we will never get here). 337 */ 338 #ifdef _ANSI_SOURCE /* Hide almost everything. */ 339 #define __POSIX_VISIBLE 0 340 #define __XSI_VISIBLE 0 341 #define __BSD_VISIBLE 0 342 #define __ISO_C_VISIBLE 1990 343 #else /* Default environment: show everything. */ 344 #define __POSIX_VISIBLE 200112 345 #define __XSI_VISIBLE 600 346 #define __BSD_VISIBLE 1 347 #define __ISO_C_VISIBLE 1999 348 #endif 349 #endif 350 351 #endif /* !_SYS_CDEFS_H_ */ 352