1/*
2 * Copyright (c) 2000-2012 Apple Inc. All rights reserved.
3 *
4 * @APPLE_OSREFERENCE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. The rights granted to you under the License
10 * may not be used to create, or enable the creation or redistribution of,
11 * unlawful or unlicensed copies of an Apple operating system, or to
12 * circumvent, violate, or enable the circumvention or violation of, any
13 * terms of an Apple operating system software license agreement.
14 *
15 * Please obtain a copy of the License at
16 * http://www.opensource.apple.com/apsl/ and read it before using this file.
17 *
18 * The Original Code and all software distributed under the License are
19 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
20 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
21 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
22 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
23 * Please see the License for the specific language governing rights and
24 * limitations under the License.
25 *
26 * @APPLE_OSREFERENCE_LICENSE_HEADER_END@
27 */
28/* Copyright 1995 NeXT Computer, Inc. All rights reserved. */
29/*
30 * Copyright (c) 1991, 1993
31 *	The Regents of the University of California.  All rights reserved.
32 *
33 * This code is derived from software contributed to Berkeley by
34 * Berkeley Software Design, Inc.
35 *
36 * Redistribution and use in source and binary forms, with or without
37 * modification, are permitted provided that the following conditions
38 * are met:
39 * 1. Redistributions of source code must retain the above copyright
40 *    notice, this list of conditions and the following disclaimer.
41 * 2. Redistributions in binary form must reproduce the above copyright
42 *    notice, this list of conditions and the following disclaimer in the
43 *    documentation and/or other materials provided with the distribution.
44 * 3. All advertising materials mentioning features or use of this software
45 *    must display the following acknowledgement:
46 *	This product includes software developed by the University of
47 *	California, Berkeley and its contributors.
48 * 4. Neither the name of the University nor the names of its contributors
49 *    may be used to endorse or promote products derived from this software
50 *    without specific prior written permission.
51 *
52 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
53 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
54 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
55 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
56 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
57 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
58 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
59 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
60 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
61 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
62 * SUCH DAMAGE.
63 *
64 *	@(#)cdefs.h	8.8 (Berkeley) 1/9/95
65 */
66
67#ifndef	_CDEFS_H_
68#define	_CDEFS_H_
69
70#if defined(__cplusplus)
71#define	__BEGIN_DECLS	extern "C" {
72#define	__END_DECLS	}
73#else
74#define	__BEGIN_DECLS
75#define	__END_DECLS
76#endif
77
78/* This SDK is designed to work with clang and specific versions of
79 * gcc >= 4.0 with Apple's patch sets */
80#if !defined(__GNUC__) || __GNUC__ < 4
81#warning "Unsupported compiler detected"
82#endif
83
84/*
85 * The __CONCAT macro is used to concatenate parts of symbol names, e.g.
86 * with "#define OLD(foo) __CONCAT(old,foo)", OLD(foo) produces oldfoo.
87 * The __CONCAT macro is a bit tricky -- make sure you don't put spaces
88 * in between its arguments.  __CONCAT can also concatenate double-quoted
89 * strings produced by the __STRING macro, but this only works with ANSI C.
90 */
91#if defined(__STDC__) || defined(__cplusplus)
92#define	__P(protos)	protos		/* full-blown ANSI C */
93#define	__CONCAT(x,y)	x ## y
94#define	__STRING(x)	#x
95
96#define	__const		const		/* define reserved names to standard */
97#define	__signed	signed
98#define	__volatile	volatile
99#if defined(__cplusplus)
100#define	__inline	inline		/* convert to C++ keyword */
101#else
102#ifndef __GNUC__
103#define	__inline			/* delete GCC keyword */
104#endif /* !__GNUC__ */
105#endif /* !__cplusplus */
106
107#else	/* !(__STDC__ || __cplusplus) */
108#define	__P(protos)	()		/* traditional C preprocessor */
109#define	__CONCAT(x,y)	x/**/y
110#define	__STRING(x)	"x"
111
112#ifndef __GNUC__
113#define	__const				/* delete pseudo-ANSI C keywords */
114#define	__inline
115#define	__signed
116#define	__volatile
117#endif	/* !__GNUC__ */
118
119/*
120 * In non-ANSI C environments, new programs will want ANSI-only C keywords
121 * deleted from the program and old programs will want them left alone.
122 * When using a compiler other than gcc, programs using the ANSI C keywords
123 * const, inline etc. as normal identifiers should define -DNO_ANSI_KEYWORDS.
124 * When using "gcc -traditional", we assume that this is the intent; if
125 * __GNUC__ is defined but __STDC__ is not, we leave the new keywords alone.
126 */
127#ifndef	NO_ANSI_KEYWORDS
128#define	const		__const			/* convert ANSI C keywords */
129#define	inline		__inline
130#define	signed		__signed
131#define	volatile	__volatile
132#endif /* !NO_ANSI_KEYWORDS */
133#endif /* !(__STDC__ || __cplusplus) */
134
135#define __dead2		__attribute__((noreturn))
136#define __pure2		__attribute__((const))
137
138/* __unused denotes variables and functions that may not be used, preventing
139 * the compiler from warning about it if not used.
140 */
141#define __unused	__attribute__((unused))
142
143/* __used forces variables and functions to be included even if it appears
144 * to the compiler that they are not used (and would thust be discarded).
145 */
146#define __used		__attribute__((used))
147
148/* __deprecated causes the compiler to produce a warning when encountering
149 * code using the deprecated functionality.
150 * __deprecated_msg() does the same, and compilers that support it will print
151 * a message along with the deprecation warning.
152 * This may require turning on such warning with the -Wdeprecated flag.
153 * __deprecated_enum_msg() should be used on enums, and compilers that support
154 * it will print the deprecation warning.
155 */
156#define __deprecated	__attribute__((deprecated))
157
158#ifdef __has_extension
159    #if __has_extension(attribute_deprecated_with_message)
160        #define __deprecated_msg(_msg) __attribute__((deprecated(_msg)))
161    #else
162        #define __deprecated_msg(_msg) __attribute__((deprecated))
163    #endif
164#elif defined(__GNUC__) && ((__GNUC__ >= 5) || ((__GNUC__ == 4) && (__GNUC_MINOR__ >= 5)))
165    #define __deprecated_msg(_msg) __attribute__((deprecated(_msg)))
166#else
167    #define __deprecated_msg(_msg) __attribute__((deprecated))
168#endif
169
170#ifdef __has_extension
171    #if __has_extension(enumerator_attributes)
172        #define __deprecated_enum_msg(_msg) __deprecated_msg(_msg)
173    #else
174        #define __deprecated_enum_msg(_msg)
175    #endif
176#else
177    #define __deprecated_enum_msg(_msg)
178#endif
179
180/* __unavailable causes the compiler to error out when encountering
181 * code using the tagged function of variable.
182 */
183#define __unavailable	__attribute__((unavailable))
184
185/* Delete pseudo-keywords wherever they are not available or needed. */
186#ifndef __dead
187#define	__dead
188#define	__pure
189#endif
190
191/*
192 * We use `__restrict' as a way to define the `restrict' type qualifier
193 * without disturbing older software that is unaware of C99 keywords.
194 */
195#if __STDC_VERSION__ < 199901
196#define __restrict
197#else
198#define __restrict	restrict
199#endif
200
201/* Declaring inline functions within headers is error-prone due to differences
202 * across various versions of the C language and extensions.  __header_inline
203 * can be used to declare inline functions within system headers.  In cases
204 * where you want to force inlining instead of letting the compiler make
205 * the decision, you can use __header_always_inline.
206 *
207 * Be aware that using inline for functions which compilers may also provide
208 * builtins can behave differently under various compilers.  If you intend to
209 * provide an inline version of such a function, you may want to use a macro
210 * instead.
211 *
212 * The check for !__GNUC__ || __clang__ is because gcc doesn't correctly
213 * support c99 inline in some cases:
214 * http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55965
215 */
216
217#if defined(__cplusplus) || \
218    (__STDC_VERSION__ >= 199901L && \
219     !defined(__GNUC_GNU_INLINE__) && \
220     (!defined(__GNUC__) || defined(__clang__)))
221# define __header_inline           inline
222#elif defined(__GNUC__) && defined(__GNUC_STDC_INLINE__)
223# define __header_inline           extern __inline __attribute__((__gnu_inline__))
224#elif defined(__GNUC__)
225# define __header_inline           extern __inline
226#else
227  /* If we land here, we've encountered an unsupported compiler,
228   * so hopefully it understands static __inline as a fallback.
229   */
230# define __header_inline           static __inline
231#endif
232
233#ifdef __GNUC__
234# define __header_always_inline    __header_inline __attribute__ ((__always_inline__))
235#else
236  /* Unfortunately, we're using a compiler that we don't know how to force to
237   * inline.  Oh well.
238   */
239# define __header_always_inline    __header_inline
240#endif
241
242/*
243 * Compiler-dependent macros that bracket portions of code where the
244 * "-Wunreachable-code" warning should be ignored. Please use sparingly.
245 */
246#if defined(__clang__)
247# define __unreachable_ok_push \
248         _Pragma("clang diagnostic push") \
249         _Pragma("clang diagnostic ignored \"-Wunreachable-code\"")
250# define __unreachable_ok_pop \
251         _Pragma("clang diagnostic pop")
252#elif defined(__GNUC__) && ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6))
253# define __unreachable_ok_push \
254         _Pragma("GCC diagnostic push") \
255         _Pragma("GCC diagnostic ignored \"-Wunreachable-code\"")
256# define __unreachable_ok_pop \
257         _Pragma("GCC diagnostic pop")
258#else
259# define __unreachable_ok_push
260# define __unreachable_ok_pop
261#endif
262
263/*
264 * Compiler-dependent macros to declare that functions take printf-like
265 * or scanf-like arguments.  They are null except for versions of gcc
266 * that are known to support the features properly.  Functions declared
267 * with these attributes will cause compilation warnings if there is a
268 * mismatch between the format string and subsequent function parameter
269 * types.
270 */
271#define __printflike(fmtarg, firstvararg) \
272		__attribute__((__format__ (__printf__, fmtarg, firstvararg)))
273#define __scanflike(fmtarg, firstvararg) \
274		__attribute__((__format__ (__scanf__, fmtarg, firstvararg)))
275
276#define __IDSTRING(name,string) static const char name[] __used = string
277
278#ifndef __COPYRIGHT
279#define __COPYRIGHT(s) __IDSTRING(copyright,s)
280#endif
281
282#ifndef __RCSID
283#define __RCSID(s) __IDSTRING(rcsid,s)
284#endif
285
286#ifndef __SCCSID
287#define __SCCSID(s) __IDSTRING(sccsid,s)
288#endif
289
290#ifndef __PROJECT_VERSION
291#define __PROJECT_VERSION(s) __IDSTRING(project_version,s)
292#endif
293
294/* Source compatibility only, ID string not emitted in object file */
295#ifndef __FBSDID
296#define __FBSDID(s)
297#endif
298
299#ifndef	__DECONST
300#define	__DECONST(type, var)	__CAST_AWAY_QUALIFIER(var, const, type)
301#endif
302
303#ifndef	__DEVOLATILE
304#define	__DEVOLATILE(type, var)	__CAST_AWAY_QUALIFIER(var, volatile, type)
305#endif
306
307#ifndef	__DEQUALIFY
308#define	__DEQUALIFY(type, var)	__CAST_AWAY_QUALIFIER(var, const volatile, type)
309#endif
310
311/*
312 * COMPILATION ENVIRONMENTS -- see compat(5) for additional detail
313 *
314 * DEFAULT	By default newly complied code will get POSIX APIs plus
315 *		Apple API extensions in scope.
316 *
317 *		Most users will use this compilation environment to avoid
318 *		behavioral differences between 32 and 64 bit code.
319 *
320 * LEGACY	Defining _NONSTD_SOURCE will get pre-POSIX APIs plus Apple
321 *		API extensions in scope.
322 *
323 *		This is generally equivalent to the Tiger release compilation
324 *		environment, except that it cannot be applied to 64 bit code;
325 *		its use is discouraged.
326 *
327 *		We expect this environment to be deprecated in the future.
328 *
329 * STRICT	Defining _POSIX_C_SOURCE or _XOPEN_SOURCE restricts the
330 *		available APIs to exactly the set of APIs defined by the
331 *		corresponding standard, based on the value defined.
332 *
333 *		A correct, portable definition for _POSIX_C_SOURCE is 200112L.
334 *		A correct, portable definition for _XOPEN_SOURCE is 600L.
335 *
336 *		Apple API extensions are not visible in this environment,
337 *		which can cause Apple specific code to fail to compile,
338 *		or behave incorrectly if prototypes are not in scope or
339 *		warnings about missing prototypes are not enabled or ignored.
340 *
341 * In any compilation environment, for correct symbol resolution to occur,
342 * function prototypes must be in scope.  It is recommended that all Apple
343 * tools users add either the "-Wall" or "-Wimplicit-function-declaration"
344 * compiler flags to their projects to be warned when a function is being
345 * used without a prototype in scope.
346 */
347
348/* These settings are particular to each product. */
349#ifdef KERNEL
350#define __DARWIN_ONLY_64_BIT_INO_T	0
351#define __DARWIN_ONLY_UNIX_CONFORMANCE	0
352#define __DARWIN_ONLY_VERS_1050		0
353#if defined(__x86_64__)
354#define	__DARWIN_SUF_DARWIN14	"_darwin14"
355#define	__DARWIN14_ALIAS(sym)	__asm("_" __STRING(sym) __DARWIN_SUF_DARWIN14)
356#else
357#define	__DARWIN14_ALIAS(sym)
358#endif
359#else /* !KERNEL */
360#ifdef PLATFORM_iPhoneOS
361/* Platform: iPhoneOS */
362#define __DARWIN_ONLY_64_BIT_INO_T	1
363#define __DARWIN_ONLY_UNIX_CONFORMANCE	1
364#define __DARWIN_ONLY_VERS_1050		1
365#endif /* PLATFORM_iPhoneOS */
366#ifdef PLATFORM_iPhoneSimulator
367/* Platform: iPhoneSimulator */
368#define __DARWIN_ONLY_64_BIT_INO_T	1
369#define __DARWIN_ONLY_UNIX_CONFORMANCE	1
370#define __DARWIN_ONLY_VERS_1050		1
371#endif /* PLATFORM_iPhoneSimulator */
372#ifdef PLATFORM_iPhoneOSNano
373/* Platform: iPhoneOSNano */
374#define __DARWIN_ONLY_64_BIT_INO_T	1
375#define __DARWIN_ONLY_UNIX_CONFORMANCE	1
376#define __DARWIN_ONLY_VERS_1050		1
377#endif /* PLATFORM_iPhoneOSNano */
378#ifdef PLATFORM_iPhoneNanoSimulator
379/* Platform: iPhoneNanoSimulator */
380#define __DARWIN_ONLY_64_BIT_INO_T	1
381#define __DARWIN_ONLY_UNIX_CONFORMANCE	1
382#define __DARWIN_ONLY_VERS_1050		1
383#endif /* PLATFORM_iPhoneNanoSimulator */
384#ifdef PLATFORM_MacOSX
385/* Platform: MacOSX */
386#define __DARWIN_ONLY_64_BIT_INO_T	0
387/* #undef __DARWIN_ONLY_UNIX_CONFORMANCE (automatically set for 64-bit) */
388#define __DARWIN_ONLY_VERS_1050		0
389#endif /* PLATFORM_MacOSX */
390#endif /* KERNEL */
391
392/*
393 * The __DARWIN_ALIAS macros are used to do symbol renaming; they allow
394 * legacy code to use the old symbol, thus maintaining binary compatibility
395 * while new code can use a standards compliant version of the same function.
396 *
397 * __DARWIN_ALIAS is used by itself if the function signature has not
398 * changed, it is used along with a #ifdef check for __DARWIN_UNIX03
399 * if the signature has changed.  Because the __LP64__ environment
400 * only supports UNIX03 semantics it causes __DARWIN_UNIX03 to be
401 * defined, but causes __DARWIN_ALIAS to do no symbol mangling.
402 *
403 * As a special case, when XCode is used to target a specific version of the
404 * OS, the manifest constant __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__
405 * will be defined by the compiler, with the digits representing major version
406 * time 100 + minor version times 10 (e.g. 10.5 := 1050).  If we are targeting
407 * pre-10.5, and it is the default compilation environment, revert the
408 * compilation environment to pre-__DARWIN_UNIX03.
409 */
410#if !defined(__DARWIN_ONLY_UNIX_CONFORMANCE)
411#  if defined(__LP64__)
412#    define __DARWIN_ONLY_UNIX_CONFORMANCE 1
413#  else /* !__LP64__ */
414#    define __DARWIN_ONLY_UNIX_CONFORMANCE 0
415#  endif /* __LP64__ */
416#endif /* !__DARWIN_ONLY_UNIX_CONFORMANCE */
417
418#if !defined(__DARWIN_UNIX03)
419#  if defined(KERNEL)
420#    define __DARWIN_UNIX03	0
421#  elif __DARWIN_ONLY_UNIX_CONFORMANCE
422#    if defined(_NONSTD_SOURCE)
423#      error "Can't define _NONSTD_SOURCE when only UNIX conformance is available."
424#    endif /* _NONSTD_SOURCE */
425#    define __DARWIN_UNIX03	1
426#  elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1040)
427#    define __DARWIN_UNIX03	0
428#  elif defined(_DARWIN_C_SOURCE) || defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE)
429#    if defined(_NONSTD_SOURCE)
430#      error "Can't define both _NONSTD_SOURCE and any of _DARWIN_C_SOURCE, _XOPEN_SOURCE or _POSIX_C_SOURCE."
431#    endif /* _NONSTD_SOURCE */
432#    define __DARWIN_UNIX03	1
433#  elif defined(_NONSTD_SOURCE)
434#    define __DARWIN_UNIX03	0
435#  else /* default */
436#    if defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1050)
437#      define __DARWIN_UNIX03	0
438#    else /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */
439#      define __DARWIN_UNIX03	1
440#    endif /* __ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__ >= 1050 */
441#  endif /* _DARWIN_C_SOURCE || _XOPEN_SOURCE || _POSIX_C_SOURCE || __LP64__ */
442#endif /* !__DARWIN_UNIX03 */
443
444#if !defined(__DARWIN_64_BIT_INO_T)
445#  if defined(KERNEL)
446#    define __DARWIN_64_BIT_INO_T 0
447#  elif defined(_DARWIN_USE_64_BIT_INODE)
448#    if defined(_DARWIN_NO_64_BIT_INODE)
449#      error "Can't define both _DARWIN_USE_64_BIT_INODE and _DARWIN_NO_64_BIT_INODE."
450#    endif /* _DARWIN_NO_64_BIT_INODE */
451#    define __DARWIN_64_BIT_INO_T 1
452#  elif defined(_DARWIN_NO_64_BIT_INODE)
453#    if __DARWIN_ONLY_64_BIT_INO_T
454#      error "Can't define _DARWIN_NO_64_BIT_INODE when only 64-bit inodes are available."
455#    endif /* __DARWIN_ONLY_64_BIT_INO_T */
456#    define __DARWIN_64_BIT_INO_T 0
457#  else /* default */
458#    if __DARWIN_ONLY_64_BIT_INO_T
459#      define __DARWIN_64_BIT_INO_T 1
460#    elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1060) || __DARWIN_UNIX03 == 0
461#      define __DARWIN_64_BIT_INO_T 0
462#    else /* default */
463#      define __DARWIN_64_BIT_INO_T 1
464#    endif /* __DARWIN_ONLY_64_BIT_INO_T */
465#  endif
466#endif /* !__DARWIN_64_BIT_INO_T */
467
468#if !defined(__DARWIN_VERS_1050)
469#  if defined(KERNEL)
470#    define __DARWIN_VERS_1050 0
471#  elif __DARWIN_ONLY_VERS_1050
472#    define __DARWIN_VERS_1050 1
473#  elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__) && ((__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__-0) < 1050) || __DARWIN_UNIX03 == 0
474#    define __DARWIN_VERS_1050 0
475#  else /* default */
476#    define __DARWIN_VERS_1050 1
477#  endif
478#endif /* !__DARWIN_VERS_1050 */
479
480#if !defined(__DARWIN_NON_CANCELABLE)
481#  if defined(KERNEL)
482#    define __DARWIN_NON_CANCELABLE 0
483#  else /* default */
484#    define __DARWIN_NON_CANCELABLE 0
485#  endif
486#endif /* !__DARWIN_NON_CANCELABLE */
487
488/*
489 * symbol suffixes used for symbol versioning
490 */
491#if __DARWIN_UNIX03
492#  if __DARWIN_ONLY_UNIX_CONFORMANCE
493#    define __DARWIN_SUF_UNIX03		/* nothing */
494#  else /* !__DARWIN_ONLY_UNIX_CONFORMANCE */
495#    define __DARWIN_SUF_UNIX03		"$UNIX2003"
496#  endif /* __DARWIN_ONLY_UNIX_CONFORMANCE */
497
498#  if __DARWIN_64_BIT_INO_T
499#    if __DARWIN_ONLY_64_BIT_INO_T
500#      define __DARWIN_SUF_64_BIT_INO_T	/* nothing */
501#    else /* !__DARWIN_ONLY_64_BIT_INO_T */
502#      define __DARWIN_SUF_64_BIT_INO_T	"$INODE64"
503#    endif /* __DARWIN_ONLY_64_BIT_INO_T */
504#  else /* !__DARWIN_64_BIT_INO_T */
505#    define __DARWIN_SUF_64_BIT_INO_T	/* nothing */
506#  endif /* __DARWIN_64_BIT_INO_T */
507
508#  if __DARWIN_VERS_1050
509#    if __DARWIN_ONLY_VERS_1050
510#      define __DARWIN_SUF_1050		/* nothing */
511#    else /* !__DARWIN_ONLY_VERS_1050 */
512#      define __DARWIN_SUF_1050		"$1050"
513#    endif /* __DARWIN_ONLY_VERS_1050 */
514#  else /* !__DARWIN_VERS_1050 */
515#    define __DARWIN_SUF_1050		/* nothing */
516#  endif /* __DARWIN_VERS_1050 */
517
518#  if __DARWIN_NON_CANCELABLE
519#    define __DARWIN_SUF_NON_CANCELABLE	"$NOCANCEL"
520#  else /* !__DARWIN_NON_CANCELABLE */
521#    define __DARWIN_SUF_NON_CANCELABLE	/* nothing */
522#  endif /* __DARWIN_NON_CANCELABLE */
523
524#else /* !__DARWIN_UNIX03 */
525#  define __DARWIN_SUF_UNIX03		/* nothing */
526#  define __DARWIN_SUF_64_BIT_INO_T	/* nothing */
527#  define __DARWIN_SUF_NON_CANCELABLE	/* nothing */
528#  define __DARWIN_SUF_1050		/* nothing */
529#endif /* __DARWIN_UNIX03 */
530
531#define __DARWIN_SUF_EXTSN		"$DARWIN_EXTSN"
532
533/*
534 * symbol versioning macros
535 */
536#define __DARWIN_ALIAS(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_UNIX03)
537#define __DARWIN_ALIAS_C(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03)
538#define __DARWIN_ALIAS_I(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03)
539#define __DARWIN_NOCANCEL(sym)  	__asm("_" __STRING(sym) __DARWIN_SUF_NON_CANCELABLE)
540#define __DARWIN_INODE64(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_64_BIT_INO_T)
541
542#define __DARWIN_1050(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_1050)
543#define __DARWIN_1050ALIAS(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_UNIX03)
544#define __DARWIN_1050ALIAS_C(sym)	__asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_NON_CANCELABLE __DARWIN_SUF_UNIX03)
545#define __DARWIN_1050ALIAS_I(sym)	__asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T __DARWIN_SUF_UNIX03)
546#define __DARWIN_1050INODE64(sym)	__asm("_" __STRING(sym) __DARWIN_SUF_1050 __DARWIN_SUF_64_BIT_INO_T)
547
548#define __DARWIN_EXTSN(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_EXTSN)
549#define __DARWIN_EXTSN_C(sym)		__asm("_" __STRING(sym) __DARWIN_SUF_EXTSN __DARWIN_SUF_NON_CANCELABLE)
550
551/*
552 * symbol release macros
553 */
554#ifdef KERNEL
555#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x)
556#else
557#include <sys/_symbol_aliasing.h>
558
559#if defined(__ENVIRONMENT_IPHONE_OS_VERSION_MIN_REQUIRED__)
560#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x)   __DARWIN_ALIAS_STARTING_IPHONE_##_iphone(x)
561#elif defined(__ENVIRONMENT_MAC_OS_X_VERSION_MIN_REQUIRED__)
562#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x)   __DARWIN_ALIAS_STARTING_MAC_##_mac(x)
563#else
564#define __DARWIN_ALIAS_STARTING(_mac, _iphone, x)
565#endif
566#endif /* KERNEL */
567
568
569/*
570 * POSIX.1 requires that the macros we test be defined before any standard
571 * header file is included.  This permits us to convert values for feature
572 * testing, as necessary, using only _POSIX_C_SOURCE.
573 *
574 * Here's a quick run-down of the versions:
575 *  defined(_POSIX_SOURCE)		1003.1-1988
576 *  _POSIX_C_SOURCE == 1L		1003.1-1990
577 *  _POSIX_C_SOURCE == 2L		1003.2-1992 C Language Binding Option
578 *  _POSIX_C_SOURCE == 199309L		1003.1b-1993
579 *  _POSIX_C_SOURCE == 199506L		1003.1c-1995, 1003.1i-1995,
580 *					and the omnibus ISO/IEC 9945-1: 1996
581 *  _POSIX_C_SOURCE == 200112L		1003.1-2001
582 *  _POSIX_C_SOURCE == 200809L		1003.1-2008
583 *
584 * In addition, the X/Open Portability Guide, which is now the Single UNIX
585 * Specification, defines a feature-test macro which indicates the version of
586 * that specification, and which subsumes _POSIX_C_SOURCE.
587 */
588
589/* Deal with IEEE Std. 1003.1-1990, in which _POSIX_C_SOURCE == 1L. */
590#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 1L
591#undef _POSIX_C_SOURCE
592#define	_POSIX_C_SOURCE		199009L
593#endif
594
595/* Deal with IEEE Std. 1003.2-1992, in which _POSIX_C_SOURCE == 2L. */
596#if defined(_POSIX_C_SOURCE) && _POSIX_C_SOURCE == 2L
597#undef _POSIX_C_SOURCE
598#define	_POSIX_C_SOURCE		199209L
599#endif
600
601/* Deal with various X/Open Portability Guides and Single UNIX Spec. */
602#ifdef _XOPEN_SOURCE
603#if _XOPEN_SOURCE - 0L >= 700L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200809L)
604#undef _POSIX_C_SOURCE
605#define _POSIX_C_SOURCE         200809L
606#elif _XOPEN_SOURCE - 0L >= 600L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 200112L)
607#undef _POSIX_C_SOURCE
608#define	_POSIX_C_SOURCE		200112L
609#elif _XOPEN_SOURCE - 0L >= 500L && (!defined(_POSIX_C_SOURCE) || _POSIX_C_SOURCE - 0L < 199506L)
610#undef _POSIX_C_SOURCE
611#define	_POSIX_C_SOURCE		199506L
612#endif
613#endif
614
615/*
616 * Deal with all versions of POSIX.  The ordering relative to the tests above is
617 * important.
618 */
619#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
620#define _POSIX_C_SOURCE         198808L
621#endif
622
623/* POSIX C deprecation macros */
624#ifdef KERNEL
625#define __POSIX_C_DEPRECATED(ver)
626#else
627#include <sys/_posix_availability.h>
628
629#define __POSIX_C_DEPRECATED(ver) ___POSIX_C_DEPRECATED_STARTING_##ver
630#endif
631
632/*
633 * Set a single macro which will always be defined and can be used to determine
634 * the appropriate namespace.  For POSIX, these values will correspond to
635 * _POSIX_C_SOURCE value.  Currently there are two additional levels corresponding
636 * to ANSI (_ANSI_SOURCE) and Darwin extensions (_DARWIN_C_SOURCE)
637 */
638#define __DARWIN_C_ANSI         010000L
639#define __DARWIN_C_FULL         900000L
640
641#if   defined(_ANSI_SOURCE)
642#define __DARWIN_C_LEVEL        __DARWIN_C_ANSI
643#elif defined(_POSIX_C_SOURCE) && !defined(_DARWIN_C_SOURCE) && !defined(_NONSTD_SOURCE)
644#define __DARWIN_C_LEVEL        _POSIX_C_SOURCE
645#else
646#define __DARWIN_C_LEVEL        __DARWIN_C_FULL
647#endif
648
649/* If the developer has neither requested a strict language mode nor a version
650 * of POSIX, turn on functionality provided by __STDC_WANT_LIB_EXT1__ as part
651 * of __DARWIN_C_FULL.
652 */
653#if !defined(__STDC_WANT_LIB_EXT1__) && !defined(__STRICT_ANSI__) && __DARWIN_C_LEVEL >= __DARWIN_C_FULL
654#define __STDC_WANT_LIB_EXT1__ 1
655#endif
656
657/*
658 * long long is not supported in c89 (__STRICT_ANSI__), but g++ -ansi and
659 * c99 still want long longs.  While not perfect, we allow long longs for
660 * g++.
661 */
662#define	__DARWIN_NO_LONG_LONG	(defined(__STRICT_ANSI__) \
663				&& (__STDC_VERSION__-0 < 199901L) \
664				&& !defined(__GNUG__))
665
666/*****************************************
667 *  Public darwin-specific feature macros
668 *****************************************/
669
670/*
671 * _DARWIN_FEATURE_64_BIT_INODE indicates that the ino_t type is 64-bit, and
672 * structures modified for 64-bit inodes (like struct stat) will be used.
673 */
674#if __DARWIN_64_BIT_INO_T
675#define _DARWIN_FEATURE_64_BIT_INODE		1
676#endif
677
678/*
679 * _DARWIN_FEATURE_64_ONLY_BIT_INODE indicates that the ino_t type may only
680 * be 64-bit; there is no support for 32-bit ino_t when this macro is defined
681 * (and non-zero).  There is no struct stat64 either, as the regular
682 * struct stat will already be the 64-bit version.
683 */
684#if __DARWIN_ONLY_64_BIT_INO_T
685#define _DARWIN_FEATURE_ONLY_64_BIT_INODE	1
686#endif
687
688/*
689 * _DARWIN_FEATURE_ONLY_VERS_1050 indicates that only those APIs updated
690 * in 10.5 exists; no pre-10.5 variants are available.
691 */
692#if __DARWIN_ONLY_VERS_1050
693#define _DARWIN_FEATURE_ONLY_VERS_1050		1
694#endif
695
696/*
697 * _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE indicates only UNIX conforming API
698 * are available (the legacy BSD APIs are not available)
699 */
700#if __DARWIN_ONLY_UNIX_CONFORMANCE
701#define _DARWIN_FEATURE_ONLY_UNIX_CONFORMANCE	1
702#endif
703
704/*
705 * _DARWIN_FEATURE_UNIX_CONFORMANCE indicates whether UNIX conformance is on,
706 * and specifies the conformance level (3 is SUSv3)
707 */
708#if __DARWIN_UNIX03
709#define _DARWIN_FEATURE_UNIX_CONFORMANCE	3
710#endif
711
712/*
713 * This macro casts away the qualifier from the variable
714 *
715 * Note: use at your own risk, removing qualifiers can result in
716 * catastrophic run-time failures.
717 */
718#ifndef __CAST_AWAY_QUALIFIER
719#define __CAST_AWAY_QUALIFIER(variable, qualifier, type)  (type) (long)(variable)
720#endif
721
722/*
723 * __XNU_PRIVATE_EXTERN is a linkage decoration indicating that a symbol can be
724 * used from other compilation units, but not other libraries or executables.
725 */
726#ifndef __XNU_PRIVATE_EXTERN
727#define __XNU_PRIVATE_EXTERN __attribute__((visibility("hidden")))
728#endif
729
730/*
731 * Architecture validation for current SDK
732 */
733#if !defined(__sys_cdefs_arch_unknown__) && defined(__i386__)
734#elif !defined(__sys_cdefs_arch_unknown__) && defined(__x86_64__)
735#else
736#error Unsupported architecture
737#endif
738
739#endif /* !_CDEFS_H_ */
740