xref: /aosp_15_r20/external/mdnsresponder/mDNSShared/DebugServices.h (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker  */
17*48a54d36SAndroid Build Coastguard Worker 
18*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
19*48a54d36SAndroid Build Coastguard Worker /*!	@header		DebugServices
20*48a54d36SAndroid Build Coastguard Worker 
21*48a54d36SAndroid Build Coastguard Worker 	Debugging Library
22*48a54d36SAndroid Build Coastguard Worker */
23*48a54d36SAndroid Build Coastguard Worker 
24*48a54d36SAndroid Build Coastguard Worker #ifndef	__DEBUG_SERVICES__
25*48a54d36SAndroid Build Coastguard Worker #define	__DEBUG_SERVICES__
26*48a54d36SAndroid Build Coastguard Worker 
27*48a54d36SAndroid Build Coastguard Worker #include	<stdarg.h>
28*48a54d36SAndroid Build Coastguard Worker 
29*48a54d36SAndroid Build Coastguard Worker #include	"CommonServices.h"
30*48a54d36SAndroid Build Coastguard Worker 
31*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS )
32*48a54d36SAndroid Build Coastguard Worker 	#include	"logLib.h"
33*48a54d36SAndroid Build Coastguard Worker #endif
34*48a54d36SAndroid Build Coastguard Worker 
35*48a54d36SAndroid Build Coastguard Worker #if 0
36*48a54d36SAndroid Build Coastguard Worker #pragma mark == Settings ==
37*48a54d36SAndroid Build Coastguard Worker #endif
38*48a54d36SAndroid Build Coastguard Worker 
39*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
40*48a54d36SAndroid Build Coastguard Worker //	Settings
41*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
42*48a54d36SAndroid Build Coastguard Worker 
43*48a54d36SAndroid Build Coastguard Worker // General
44*48a54d36SAndroid Build Coastguard Worker 
45*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG ) )
46*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG		0
47*48a54d36SAndroid Build Coastguard Worker #endif
48*48a54d36SAndroid Build Coastguard Worker 
49*48a54d36SAndroid Build Coastguard Worker #if( defined( NDEBUG ) && DEBUG )
50*48a54d36SAndroid Build Coastguard Worker 	#error NDEBUG defined and DEBUG is also enabled...they need to be in-sync
51*48a54d36SAndroid Build Coastguard Worker #endif
52*48a54d36SAndroid Build Coastguard Worker 
53*48a54d36SAndroid Build Coastguard Worker // AssertMacros.h/Debugging.h overrides.
54*48a54d36SAndroid Build Coastguard Worker 
55*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_OVERRIDE_APPLE_MACROS ) )
56*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_OVERRIDE_APPLE_MACROS		1
57*48a54d36SAndroid Build Coastguard Worker #endif
58*48a54d36SAndroid Build Coastguard Worker 
59*48a54d36SAndroid Build Coastguard Worker // Routine name. Uses ISO __func__ where possible. Otherwise, uses the best thing that is available (if anything).
60*48a54d36SAndroid Build Coastguard Worker 
61*48a54d36SAndroid Build Coastguard Worker #if( defined( __MWERKS__ ) || ( __GNUC__ > 2 ) || ( ( __GNUC__ == 2 ) && ( __GNUC_MINOR__ >= 9 ) ) )
62*48a54d36SAndroid Build Coastguard Worker 	#define	__ROUTINE__					__func__
63*48a54d36SAndroid Build Coastguard Worker #elif( defined( __GNUC__ ) )
64*48a54d36SAndroid Build Coastguard Worker 	#define	__ROUTINE__					__PRETTY_FUNCTION__
65*48a54d36SAndroid Build Coastguard Worker #elif( defined( _MSC_VER ) && !defined( _WIN32_WCE ) )
66*48a54d36SAndroid Build Coastguard Worker 	#define	__ROUTINE__					__FUNCTION__
67*48a54d36SAndroid Build Coastguard Worker #else
68*48a54d36SAndroid Build Coastguard Worker 	#define	__ROUTINE__					""
69*48a54d36SAndroid Build Coastguard Worker #endif
70*48a54d36SAndroid Build Coastguard Worker 
71*48a54d36SAndroid Build Coastguard Worker // Variable argument macro support. Use ANSI C99 __VA_ARGS__ where possible. Otherwise, use the next best thing.
72*48a54d36SAndroid Build Coastguard Worker 
73*48a54d36SAndroid Build Coastguard Worker #if( defined( __GNUC__ ) )
74*48a54d36SAndroid Build Coastguard Worker 	#if( ( __GNUC__ > 3 ) || ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 3) ) )
75*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_C99_VA_ARGS		1
76*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_GNU_VA_ARGS		0
77*48a54d36SAndroid Build Coastguard Worker 	#else
78*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_C99_VA_ARGS		0
79*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_GNU_VA_ARGS		1
80*48a54d36SAndroid Build Coastguard Worker 	#endif
81*48a54d36SAndroid Build Coastguard Worker #elif( defined( __MWERKS__ ) )
82*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_C99_VA_ARGS			1
83*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_GNU_VA_ARGS			0
84*48a54d36SAndroid Build Coastguard Worker #else
85*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_C99_VA_ARGS			0
86*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_GNU_VA_ARGS			0
87*48a54d36SAndroid Build Coastguard Worker #endif
88*48a54d36SAndroid Build Coastguard Worker 
89*48a54d36SAndroid Build Coastguard Worker #if 0
90*48a54d36SAndroid Build Coastguard Worker #pragma mark == Output ==
91*48a54d36SAndroid Build Coastguard Worker #endif
92*48a54d36SAndroid Build Coastguard Worker 
93*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
94*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_FPRINTF_ENABLED
95*48a54d36SAndroid Build Coastguard Worker 
96*48a54d36SAndroid Build Coastguard Worker 	@abstract	Enables ANSI C fprintf output.
97*48a54d36SAndroid Build Coastguard Worker */
98*48a54d36SAndroid Build Coastguard Worker 
99*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_FPRINTF_ENABLED ) )
100*48a54d36SAndroid Build Coastguard Worker 	#if( !TARGET_API_MAC_OSX_KERNEL && !TARGET_OS_WINDOWS_CE )
101*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_FPRINTF_ENABLED			1
102*48a54d36SAndroid Build Coastguard Worker 	#else
103*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_FPRINTF_ENABLED			0
104*48a54d36SAndroid Build Coastguard Worker 	#endif
105*48a54d36SAndroid Build Coastguard Worker #else
106*48a54d36SAndroid Build Coastguard Worker 	#if( TARGET_API_MAC_OSX_KERNEL || TARGET_OS_WINDOWS_CE )
107*48a54d36SAndroid Build Coastguard Worker 		#error fprintf enabled, but not supported on Mac OS X kernel or Windows CE
108*48a54d36SAndroid Build Coastguard Worker 	#endif
109*48a54d36SAndroid Build Coastguard Worker #endif
110*48a54d36SAndroid Build Coastguard Worker 
111*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
112*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_MAC_OS_X_IOLOG_ENABLED
113*48a54d36SAndroid Build Coastguard Worker 
114*48a54d36SAndroid Build Coastguard Worker 	@abstract	Enables IOLog (Mac OS X Kernel) output.
115*48a54d36SAndroid Build Coastguard Worker */
116*48a54d36SAndroid Build Coastguard Worker 
117*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_MAC_OS_X_IOLOG_ENABLED ) )
118*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_MAC_OS_X_IOLOG_ENABLED		TARGET_API_MAC_OSX_KERNEL
119*48a54d36SAndroid Build Coastguard Worker #endif
120*48a54d36SAndroid Build Coastguard Worker 
121*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
122*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_KPRINTF_ENABLED
123*48a54d36SAndroid Build Coastguard Worker 
124*48a54d36SAndroid Build Coastguard Worker 	@abstract	Enables kprintf (Mac OS X Kernel) output.
125*48a54d36SAndroid Build Coastguard Worker */
126*48a54d36SAndroid Build Coastguard Worker 
127*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_KPRINTF_ENABLED ) )
128*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_KPRINTF_ENABLED				TARGET_API_MAC_OSX_KERNEL
129*48a54d36SAndroid Build Coastguard Worker #endif
130*48a54d36SAndroid Build Coastguard Worker 
131*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
132*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_IDEBUG_ENABLED
133*48a54d36SAndroid Build Coastguard Worker 
134*48a54d36SAndroid Build Coastguard Worker 	@abstract	Enables iDebug (Mac OS X user and Kernel) output.
135*48a54d36SAndroid Build Coastguard Worker 
136*48a54d36SAndroid Build Coastguard Worker 	@discussion
137*48a54d36SAndroid Build Coastguard Worker 
138*48a54d36SAndroid Build Coastguard Worker 	For Mac OS X kernel development, iDebug is enabled by default because we can dynamically check for the presence
139*48a54d36SAndroid Build Coastguard Worker 	of iDebug via some exported IOKit symbols. Mac OS X app usage doesn't allow dynamic detection because it relies
140*48a54d36SAndroid Build Coastguard Worker 	on statically linking to the iDebugServices.cp file so for Mac OS X app usage, you have to manually enable iDebug.
141*48a54d36SAndroid Build Coastguard Worker */
142*48a54d36SAndroid Build Coastguard Worker 
143*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_IDEBUG_ENABLED ) )
144*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_IDEBUG_ENABLED				TARGET_API_MAC_OSX_KERNEL
145*48a54d36SAndroid Build Coastguard Worker #endif
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
148*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_CORE_SERVICE_ASSERTS_ENABLED
149*48a54d36SAndroid Build Coastguard Worker 
150*48a54d36SAndroid Build Coastguard Worker 	@abstract	Controls whether Core Services assert handling is enabled. Enabling requires CoreServices framework.
151*48a54d36SAndroid Build Coastguard Worker */
152*48a54d36SAndroid Build Coastguard Worker 
153*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_CORE_SERVICE_ASSERTS_ENABLED ) )
154*48a54d36SAndroid Build Coastguard Worker 	#if( defined( __DEBUGGING__ ) )
155*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_CORE_SERVICE_ASSERTS_ENABLED		1
156*48a54d36SAndroid Build Coastguard Worker 	#else
157*48a54d36SAndroid Build Coastguard Worker 		#define	DEBUG_CORE_SERVICE_ASSERTS_ENABLED		0
158*48a54d36SAndroid Build Coastguard Worker 	#endif
159*48a54d36SAndroid Build Coastguard Worker #endif
160*48a54d36SAndroid Build Coastguard Worker 
161*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
162*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	DebugOutputType
163*48a54d36SAndroid Build Coastguard Worker 
164*48a54d36SAndroid Build Coastguard Worker 	@abstract	Type of debug output (i.e. where the output goes).
165*48a54d36SAndroid Build Coastguard Worker */
166*48a54d36SAndroid Build Coastguard Worker 
167*48a54d36SAndroid Build Coastguard Worker typedef uint32_t			DebugOutputType;
168*48a54d36SAndroid Build Coastguard Worker 
169*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeNone				0x6E6F6E65U	// 'none' - no params
170*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeCustom				0x63757374U	// 'cust' - 1st param = function ptr, 2nd param = context
171*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeFPrintF				0x66707269U	// 'fpri' - 1st param = DebugOutputTypeFlags [, 2nd param = filename]
172*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeiDebug				0x69646267U	// 'idbg' - no params
173*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeKPrintF				0x6B707266U	// 'kprf' - no params
174*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeMacOSXIOLog			0x696C6F67U	// 'ilog' - no params
175*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeMacOSXLog			0x786C6F67U	// 'xlog' - no params
176*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeWindowsDebugger		0x77696E64U	// 'wind' - no params
177*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeWindowsEventLog		0x7765766CU	// 'wevl' - 1st param = C-string name, 2nd param = HMODULE or NULL.
178*48a54d36SAndroid Build Coastguard Worker 
179*48a54d36SAndroid Build Coastguard Worker // Console meta output kind - Any kind of Console output (in horizontal order of preference):
180*48a54d36SAndroid Build Coastguard Worker //
181*48a54d36SAndroid Build Coastguard Worker // Mac OS X			= ANSI printf (viewable in Console.app)
182*48a54d36SAndroid Build Coastguard Worker // Mac OS X Kernel	= IOLog (/var/log/system.log) or kprintf (serial).
183*48a54d36SAndroid Build Coastguard Worker // Windows			= ANSI printf (Console window) or OutputDebugString (debugger).
184*48a54d36SAndroid Build Coastguard Worker // Other			= ANSI printf (viewer varies).
185*48a54d36SAndroid Build Coastguard Worker 
186*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeMetaConsole			0x434F4E53U	// 'CONS' - no params
187*48a54d36SAndroid Build Coastguard Worker 
188*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
189*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	DebugOutputTypeFlags
190*48a54d36SAndroid Build Coastguard Worker 
191*48a54d36SAndroid Build Coastguard Worker 	@abstract	Flags controlling how the output type is configured.
192*48a54d36SAndroid Build Coastguard Worker 
193*48a54d36SAndroid Build Coastguard Worker 	@constant	kDebugOutputTypeFlagsTypeMask	Bit mask for the output type (e.g. stdout, stderr, file, etc.).
194*48a54d36SAndroid Build Coastguard Worker 	@constant	kDebugOutputTypeFlagsStdOut		fprintf should go to stdout.
195*48a54d36SAndroid Build Coastguard Worker 	@constant	kDebugOutputTypeFlagsStdErr		fprintf should go to stderr.
196*48a54d36SAndroid Build Coastguard Worker 	@constant	kDebugOutputTypeFlagsFile		fprintf should go to a specific file (filename passed as va_arg).
197*48a54d36SAndroid Build Coastguard Worker */
198*48a54d36SAndroid Build Coastguard Worker 
199*48a54d36SAndroid Build Coastguard Worker typedef unsigned int		DebugOutputTypeFlags;
200*48a54d36SAndroid Build Coastguard Worker 
201*48a54d36SAndroid Build Coastguard Worker #define	kDebugOutputTypeFlagsTypeMask	0xF
202*48a54d36SAndroid Build Coastguard Worker #define	kDebugOutputTypeFlagsStdOut		1
203*48a54d36SAndroid Build Coastguard Worker #define	kDebugOutputTypeFlagsStdErr		2
204*48a54d36SAndroid Build Coastguard Worker #define	kDebugOutputTypeFlagsFile		10
205*48a54d36SAndroid Build Coastguard Worker 
206*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
207*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	DebugOutputFunctionPtr
208*48a54d36SAndroid Build Coastguard Worker 
209*48a54d36SAndroid Build Coastguard Worker 	@abstract	Function ptr for a custom callback to print debug output.
210*48a54d36SAndroid Build Coastguard Worker */
211*48a54d36SAndroid Build Coastguard Worker 
212*48a54d36SAndroid Build Coastguard Worker typedef void ( *DebugOutputFunctionPtr )( char *inData, size_t inSize, void *inContext );
213*48a54d36SAndroid Build Coastguard Worker 
214*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
215*48a54d36SAndroid Build Coastguard Worker //	Constants
216*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
217*48a54d36SAndroid Build Coastguard Worker 
218*48a54d36SAndroid Build Coastguard Worker #if 0
219*48a54d36SAndroid Build Coastguard Worker #pragma mark == Flags ==
220*48a54d36SAndroid Build Coastguard Worker #endif
221*48a54d36SAndroid Build Coastguard Worker 
222*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
223*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	DebugFlags
224*48a54d36SAndroid Build Coastguard Worker 
225*48a54d36SAndroid Build Coastguard Worker 	@abstract	Flags controlling how output is printed.
226*48a54d36SAndroid Build Coastguard Worker */
227*48a54d36SAndroid Build Coastguard Worker 
228*48a54d36SAndroid Build Coastguard Worker typedef uint32_t		DebugFlags;
229*48a54d36SAndroid Build Coastguard Worker 
230*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNone					0
231*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNoAddress			( 1 << 0 )
232*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNoOffset				( 1 << 1 )
233*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlags32BitOffset			( 1 << 2 )
234*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNoASCII				( 1 << 3 )
235*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNoNewLine			( 1 << 4 )
236*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlags8BitSeparator		( 1 << 5 )
237*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlags16BitSeparator		( 1 << 6 )
238*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNo32BitSeparator		( 1 << 7 )
239*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNo16ByteHexPad		( 1 << 8 )
240*48a54d36SAndroid Build Coastguard Worker #define	kDebugFlagsNoByteCount			( 1 << 9 )
241*48a54d36SAndroid Build Coastguard Worker 
242*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
243*48a54d36SAndroid Build Coastguard Worker /*!	@enum		DebugTaskLevelFlags
244*48a54d36SAndroid Build Coastguard Worker 
245*48a54d36SAndroid Build Coastguard Worker 	@abstract	Flags indicating the task level.
246*48a54d36SAndroid Build Coastguard Worker */
247*48a54d36SAndroid Build Coastguard Worker 
248*48a54d36SAndroid Build Coastguard Worker enum
249*48a54d36SAndroid Build Coastguard Worker {
250*48a54d36SAndroid Build Coastguard Worker 	kDebugInterruptLevelShift				= 0,
251*48a54d36SAndroid Build Coastguard Worker 	kDebugInterruptLevelMask		  		= 0x00000007,
252*48a54d36SAndroid Build Coastguard Worker 	kDebugInVBLTaskMask			  			= 0x00000010,
253*48a54d36SAndroid Build Coastguard Worker 	kDebugInDeferredTaskMask		 		= 0x00000020,
254*48a54d36SAndroid Build Coastguard Worker     kDebugInSecondaryInterruptHandlerMask  	= 0x00000040,
255*48a54d36SAndroid Build Coastguard Worker 	kDebugPageFaultFatalMask 				= 0x00000100, 	// There should be a "kPageFaultFatalMask" in Debugging.h.
256*48a54d36SAndroid Build Coastguard Worker 	kDebugMPTaskLevelMask					= 0x00000200, 	// There should be a "kMPTaskLevelMask" in Debugging.h.
257*48a54d36SAndroid Build Coastguard Worker 	kDebugInterruptDepthShift				= 16,
258*48a54d36SAndroid Build Coastguard Worker 	kDebugInterruptDepthMask				= 0x00FF0000
259*48a54d36SAndroid Build Coastguard Worker };
260*48a54d36SAndroid Build Coastguard Worker 
261*48a54d36SAndroid Build Coastguard Worker #define	DebugExtractTaskLevelInterruptLevel( LEVEL )	\
262*48a54d36SAndroid Build Coastguard Worker 	( ( ( LEVEL ) & kDebugInterruptLevelMask ) >> kDebugInterruptLevelShift )
263*48a54d36SAndroid Build Coastguard Worker 
264*48a54d36SAndroid Build Coastguard Worker #define	DebugExtractTaskLevelInterruptDepth( LEVEL )	\
265*48a54d36SAndroid Build Coastguard Worker 	( ( ( LEVEL ) & kDebugInterruptDepthMask ) >> kDebugInterruptDepthShift )
266*48a54d36SAndroid Build Coastguard Worker 
267*48a54d36SAndroid Build Coastguard Worker #if 0
268*48a54d36SAndroid Build Coastguard Worker #pragma mark == Levels ==
269*48a54d36SAndroid Build Coastguard Worker #endif
270*48a54d36SAndroid Build Coastguard Worker 
271*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
272*48a54d36SAndroid Build Coastguard Worker //	Constants & Types - Levels
273*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
274*48a54d36SAndroid Build Coastguard Worker 
275*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
276*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	DebugLevel
277*48a54d36SAndroid Build Coastguard Worker 
278*48a54d36SAndroid Build Coastguard Worker 	@abstract	Level used to control debug logging.
279*48a54d36SAndroid Build Coastguard Worker */
280*48a54d36SAndroid Build Coastguard Worker 
281*48a54d36SAndroid Build Coastguard Worker typedef int32_t			DebugLevel;
282*48a54d36SAndroid Build Coastguard Worker 
283*48a54d36SAndroid Build Coastguard Worker // Levels
284*48a54d36SAndroid Build Coastguard Worker 
285*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelMask					0x0000FFFF
286*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelChatty				100
287*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelVerbose				500
288*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelTrace 				800
289*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelInfo 				1000
290*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelNotice				3000
291*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelWarning				5000
292*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelAssert 				6000
293*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelRequire				7000
294*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelError				8000
295*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelCritical				9000
296*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelAlert				10000
297*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelEmergency			11000
298*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelTragic				12000
299*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelMax					0x0000FFFF
300*48a54d36SAndroid Build Coastguard Worker 
301*48a54d36SAndroid Build Coastguard Worker // Level Flags
302*48a54d36SAndroid Build Coastguard Worker 
303*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelFlagMask				0xFFFF0000
304*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelFlagStackTrace		0x00010000
305*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelFlagDebugBreak		0x00020000
306*48a54d36SAndroid Build Coastguard Worker 
307*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
308*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	LogLevel
309*48a54d36SAndroid Build Coastguard Worker 
310*48a54d36SAndroid Build Coastguard Worker 	@abstract	Level used to control which events are logged.
311*48a54d36SAndroid Build Coastguard Worker */
312*48a54d36SAndroid Build Coastguard Worker 
313*48a54d36SAndroid Build Coastguard Worker typedef int32_t						LogLevel;
314*48a54d36SAndroid Build Coastguard Worker 
315*48a54d36SAndroid Build Coastguard Worker #define	kLogLevelUninitialized		-1L
316*48a54d36SAndroid Build Coastguard Worker #define kLogLevelAll				0L
317*48a54d36SAndroid Build Coastguard Worker #define kLogLevelChatty				100L
318*48a54d36SAndroid Build Coastguard Worker #define kLogLevelVerbose			500L
319*48a54d36SAndroid Build Coastguard Worker #define kLogLevelTrace 				800L
320*48a54d36SAndroid Build Coastguard Worker #define kLogLevelInfo 				1000L
321*48a54d36SAndroid Build Coastguard Worker #define kLogLevelNotice				3000L
322*48a54d36SAndroid Build Coastguard Worker #define kLogLevelWarning			4000L
323*48a54d36SAndroid Build Coastguard Worker #define kLogLevelAssert 			6000L
324*48a54d36SAndroid Build Coastguard Worker #define kLogLevelRequire			7000L
325*48a54d36SAndroid Build Coastguard Worker #define kLogLevelError				8000L
326*48a54d36SAndroid Build Coastguard Worker #define kLogLevelCritical			9000L
327*48a54d36SAndroid Build Coastguard Worker #define kLogLevelAlert				10000L
328*48a54d36SAndroid Build Coastguard Worker #define kLogLevelEmergency			11000L
329*48a54d36SAndroid Build Coastguard Worker #define kLogLevelTragic				12000L
330*48a54d36SAndroid Build Coastguard Worker #define kLogLevelOff				0x0000FFFEL
331*48a54d36SAndroid Build Coastguard Worker 
332*48a54d36SAndroid Build Coastguard Worker #if 0
333*48a54d36SAndroid Build Coastguard Worker #pragma mark == Properties ==
334*48a54d36SAndroid Build Coastguard Worker #endif
335*48a54d36SAndroid Build Coastguard Worker 
336*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
337*48a54d36SAndroid Build Coastguard Worker /*!	@typedef	DebugPropertyTag
338*48a54d36SAndroid Build Coastguard Worker 
339*48a54d36SAndroid Build Coastguard Worker 	@abstract	Tag for properties.
340*48a54d36SAndroid Build Coastguard Worker */
341*48a54d36SAndroid Build Coastguard Worker 
342*48a54d36SAndroid Build Coastguard Worker typedef uint32_t		DebugPropertyTag;
343*48a54d36SAndroid Build Coastguard Worker 
344*48a54d36SAndroid Build Coastguard Worker #define	kDebugPropertyTagPrintLevelMin		0x6D696E70U		// 'minp'	Get: 1st param = DebugLevel *
345*48a54d36SAndroid Build Coastguard Worker 															//			Set: 1st param = DebugLevel
346*48a54d36SAndroid Build Coastguard Worker 
347*48a54d36SAndroid Build Coastguard Worker #define	kDebugPropertyTagPrintLevel			kDebugPropertyTagPrintLevelMin
348*48a54d36SAndroid Build Coastguard Worker 
349*48a54d36SAndroid Build Coastguard Worker #define	kDebugPropertyTagPrintLevelMax		0x706D786CU		// 'maxp'	Get: 1st param = DebugLevel *
350*48a54d36SAndroid Build Coastguard Worker 															//			Set: 1st param = DebugLevel
351*48a54d36SAndroid Build Coastguard Worker 
352*48a54d36SAndroid Build Coastguard Worker #define	kDebugPropertyTagBreakLevel			0x62726B6CU		// 'brkl'	Get: 1st param = DebugLevel *
353*48a54d36SAndroid Build Coastguard Worker 															//			Set: 1st param = DebugLevel
354*48a54d36SAndroid Build Coastguard Worker #if 0
355*48a54d36SAndroid Build Coastguard Worker #pragma mark == General macros ==
356*48a54d36SAndroid Build Coastguard Worker #endif
357*48a54d36SAndroid Build Coastguard Worker 
358*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
359*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_UNUSED
360*48a54d36SAndroid Build Coastguard Worker 
361*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macro to mark a paramter as unused to avoid unused parameter warnings.
362*48a54d36SAndroid Build Coastguard Worker 
363*48a54d36SAndroid Build Coastguard Worker 	@discussion
364*48a54d36SAndroid Build Coastguard Worker 
365*48a54d36SAndroid Build Coastguard Worker 	There is no universally supported pragma/attribute for indicating a variable is unused. DEBUG_UNUSED lets us
366*48a54d36SAndroid Build Coastguard Worker 	indicate a variable is unused in a manner that is supported by most compilers.
367*48a54d36SAndroid Build Coastguard Worker */
368*48a54d36SAndroid Build Coastguard Worker 
369*48a54d36SAndroid Build Coastguard Worker #define	DEBUG_UNUSED( X )			(void)( X )
370*48a54d36SAndroid Build Coastguard Worker 
371*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
372*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_USE_ONLY
373*48a54d36SAndroid Build Coastguard Worker 
374*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macro to mark a variable as used only when debugging is enabled.
375*48a54d36SAndroid Build Coastguard Worker 
376*48a54d36SAndroid Build Coastguard Worker 	@discussion
377*48a54d36SAndroid Build Coastguard Worker 
378*48a54d36SAndroid Build Coastguard Worker 	Variables are sometimes needed only for debugging. When debugging is turned off, these debug-only variables generate
379*48a54d36SAndroid Build Coastguard Worker 	compiler warnings about unused variables. To eliminate these warnings, use these macros to indicate variables that
380*48a54d36SAndroid Build Coastguard Worker 	are only used for debugging.
381*48a54d36SAndroid Build Coastguard Worker */
382*48a54d36SAndroid Build Coastguard Worker 
383*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
384*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_USE_ONLY( X )
385*48a54d36SAndroid Build Coastguard Worker #else
386*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_USE_ONLY( X )		(void)( X )
387*48a54d36SAndroid Build Coastguard Worker #endif
388*48a54d36SAndroid Build Coastguard Worker 
389*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
390*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_LOCAL
391*48a54d36SAndroid Build Coastguard Worker 
392*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macros to make variables and functions static when debugging is off, but extern when debugging is on.
393*48a54d36SAndroid Build Coastguard Worker 
394*48a54d36SAndroid Build Coastguard Worker 	@discussion
395*48a54d36SAndroid Build Coastguard Worker 
396*48a54d36SAndroid Build Coastguard Worker 	Rather than using "static" directly, using this macros allows you to access these variables external while
397*48a54d36SAndroid Build Coastguard Worker 	debugging without being penalized for production builds.
398*48a54d36SAndroid Build Coastguard Worker */
399*48a54d36SAndroid Build Coastguard Worker 
400*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
401*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_LOCAL
402*48a54d36SAndroid Build Coastguard Worker #else
403*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_LOCAL			static
404*48a54d36SAndroid Build Coastguard Worker #endif
405*48a54d36SAndroid Build Coastguard Worker 
406*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
407*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_STATIC
408*48a54d36SAndroid Build Coastguard Worker 
409*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macros to make variables and functions static when debugging is off, but extern when debugging is on.
410*48a54d36SAndroid Build Coastguard Worker 
411*48a54d36SAndroid Build Coastguard Worker 	@discussion
412*48a54d36SAndroid Build Coastguard Worker 
413*48a54d36SAndroid Build Coastguard Worker 	Rather than using "static" directly, using this macros allows you to access these variables external while
414*48a54d36SAndroid Build Coastguard Worker 	debugging without being penalized for production builds.
415*48a54d36SAndroid Build Coastguard Worker */
416*48a54d36SAndroid Build Coastguard Worker 
417*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
418*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_STATIC
419*48a54d36SAndroid Build Coastguard Worker #else
420*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_STATIC	static
421*48a54d36SAndroid Build Coastguard Worker #endif
422*48a54d36SAndroid Build Coastguard Worker 
423*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
424*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DEBUG_EXPORT
425*48a54d36SAndroid Build Coastguard Worker 
426*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macros to export variables.
427*48a54d36SAndroid Build Coastguard Worker 
428*48a54d36SAndroid Build Coastguard Worker 	@discussion
429*48a54d36SAndroid Build Coastguard Worker 
430*48a54d36SAndroid Build Coastguard Worker 	"__private_extern__" is a hack for IOKit to allow symbols to be exported from compilation units, but
431*48a54d36SAndroid Build Coastguard Worker 	// not exported outside a driver (IOKit uses a lame global namespace for symbols). This still does not
432*48a54d36SAndroid Build Coastguard Worker 	// solve the problem of multiple drivers in the same dependency chain since they share symbols.
433*48a54d36SAndroid Build Coastguard Worker */
434*48a54d36SAndroid Build Coastguard Worker 
435*48a54d36SAndroid Build Coastguard Worker #if( TARGET_API_MAC_OSX_KERNEL )
436*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_EXPORT		__private_extern__
437*48a54d36SAndroid Build Coastguard Worker #else
438*48a54d36SAndroid Build Coastguard Worker 	#define	DEBUG_EXPORT		extern
439*48a54d36SAndroid Build Coastguard Worker #endif
440*48a54d36SAndroid Build Coastguard Worker 
441*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
442*48a54d36SAndroid Build Coastguard Worker /*!	@defined	debug_add
443*48a54d36SAndroid Build Coastguard Worker 
444*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macro to add (or subtract if negative) a value when debugging is on. Does nothing if debugging is off.
445*48a54d36SAndroid Build Coastguard Worker */
446*48a54d36SAndroid Build Coastguard Worker 
447*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
448*48a54d36SAndroid Build Coastguard Worker 	#define	debug_add( A, B )		( A ) += ( B )
449*48a54d36SAndroid Build Coastguard Worker #else
450*48a54d36SAndroid Build Coastguard Worker 	#define	debug_add( A, B )
451*48a54d36SAndroid Build Coastguard Worker #endif
452*48a54d36SAndroid Build Coastguard Worker 
453*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
454*48a54d36SAndroid Build Coastguard Worker /*!	@defined	debug_perform
455*48a54d36SAndroid Build Coastguard Worker 
456*48a54d36SAndroid Build Coastguard Worker 	@abstract	Macro to perform something in debug-only builds.
457*48a54d36SAndroid Build Coastguard Worker */
458*48a54d36SAndroid Build Coastguard Worker 
459*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
460*48a54d36SAndroid Build Coastguard Worker 	#define	debug_perform( X )		do { X; } while( 0 )
461*48a54d36SAndroid Build Coastguard Worker #else
462*48a54d36SAndroid Build Coastguard Worker 	#define	debug_perform( X )
463*48a54d36SAndroid Build Coastguard Worker #endif
464*48a54d36SAndroid Build Coastguard Worker 
465*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
466*48a54d36SAndroid Build Coastguard Worker /*!	@function	translate_errno
467*48a54d36SAndroid Build Coastguard Worker 
468*48a54d36SAndroid Build Coastguard Worker 	@abstract	Returns 0 if the test success. If the test fails, returns errno if non-zero and othewise the alternate error.
469*48a54d36SAndroid Build Coastguard Worker */
470*48a54d36SAndroid Build Coastguard Worker 
471*48a54d36SAndroid Build Coastguard Worker #define translate_errno( TEST, ERRNO, ALTERNATE_ERROR )		( ( TEST ) ? 0 : ( ERRNO ) ? ( ERRNO ) : ( ALTERNATE_ERROR ) )
472*48a54d36SAndroid Build Coastguard Worker 
473*48a54d36SAndroid Build Coastguard Worker #if 0
474*48a54d36SAndroid Build Coastguard Worker #pragma mark == Compile Time macros ==
475*48a54d36SAndroid Build Coastguard Worker #endif
476*48a54d36SAndroid Build Coastguard Worker 
477*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
478*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_compile_time
479*48a54d36SAndroid Build Coastguard Worker 
480*48a54d36SAndroid Build Coastguard Worker 	@abstract	Performs a compile-time check of something such as the size of an int.
481*48a54d36SAndroid Build Coastguard Worker 
482*48a54d36SAndroid Build Coastguard Worker 	@discussion
483*48a54d36SAndroid Build Coastguard Worker 
484*48a54d36SAndroid Build Coastguard Worker 	This declares an array with a size that is determined by a compile-time expression. If the expression evaluates
485*48a54d36SAndroid Build Coastguard Worker 	to 0, the array has a size of -1, which is illegal and generates a compile-time error.
486*48a54d36SAndroid Build Coastguard Worker 
487*48a54d36SAndroid Build Coastguard Worker 	For example:
488*48a54d36SAndroid Build Coastguard Worker 
489*48a54d36SAndroid Build Coastguard Worker 	check_compile_time( sizeof( int ) == 4 );
490*48a54d36SAndroid Build Coastguard Worker 
491*48a54d36SAndroid Build Coastguard Worker 	Note: This only works with compile-time expressions.
492*48a54d36SAndroid Build Coastguard Worker 	Note: This only works in places where extern declarations are allowed (e.g. global scope).
493*48a54d36SAndroid Build Coastguard Worker 
494*48a54d36SAndroid Build Coastguard Worker 	References:
495*48a54d36SAndroid Build Coastguard Worker 
496*48a54d36SAndroid Build Coastguard Worker 	<http://www.jaggersoft.com/pubs/CVu11_3.html>
497*48a54d36SAndroid Build Coastguard Worker 	<http://www.jaggersoft.com/pubs/CVu11_5.html>
498*48a54d36SAndroid Build Coastguard Worker 
499*48a54d36SAndroid Build Coastguard Worker 	Note: The following macros differ from the macros on the www.jaggersoft.com web site because those versions do not
500*48a54d36SAndroid Build Coastguard Worker 	work with GCC due to GCC allow a zero-length array. Using a -1 condition turned out to be more portable.
501*48a54d36SAndroid Build Coastguard Worker */
502*48a54d36SAndroid Build Coastguard Worker 
503*48a54d36SAndroid Build Coastguard Worker #define	check_compile_time( X )		extern int debug_compile_time_name[ ( X ) ? 1 : -1 ]
504*48a54d36SAndroid Build Coastguard Worker 
505*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
506*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_compile_time_code
507*48a54d36SAndroid Build Coastguard Worker 
508*48a54d36SAndroid Build Coastguard Worker 	@abstract	Perform a compile-time check, suitable for placement in code, of something such as the size of an int.
509*48a54d36SAndroid Build Coastguard Worker 
510*48a54d36SAndroid Build Coastguard Worker 	@discussion
511*48a54d36SAndroid Build Coastguard Worker 
512*48a54d36SAndroid Build Coastguard Worker 	This creates a switch statement with an existing case for 0 and an additional case using the result of a
513*48a54d36SAndroid Build Coastguard Worker 	compile-time expression. A switch statement cannot have two case labels with the same constant so if the
514*48a54d36SAndroid Build Coastguard Worker 	compile-time expression evaluates to 0, it is illegal and generates a compile-time error. If the compile-time
515*48a54d36SAndroid Build Coastguard Worker 	expression does not evaluate to 0, the resulting value is used as the case label and it compiles without error.
516*48a54d36SAndroid Build Coastguard Worker 
517*48a54d36SAndroid Build Coastguard Worker 	For example:
518*48a54d36SAndroid Build Coastguard Worker 
519*48a54d36SAndroid Build Coastguard Worker 	check_compile_time_code( sizeof( int ) == 4 );
520*48a54d36SAndroid Build Coastguard Worker 
521*48a54d36SAndroid Build Coastguard Worker 	Note: This only works with compile-time expressions.
522*48a54d36SAndroid Build Coastguard Worker 	Note: This does not work in a global scope so it must be inside a function.
523*48a54d36SAndroid Build Coastguard Worker 
524*48a54d36SAndroid Build Coastguard Worker 	References:
525*48a54d36SAndroid Build Coastguard Worker 
526*48a54d36SAndroid Build Coastguard Worker 	<http://www.jaggersoft.com/pubs/CVu11_3.html>
527*48a54d36SAndroid Build Coastguard Worker 	<http://www.jaggersoft.com/pubs/CVu11_5.html>
528*48a54d36SAndroid Build Coastguard Worker */
529*48a54d36SAndroid Build Coastguard Worker 
530*48a54d36SAndroid Build Coastguard Worker #define	check_compile_time_code( X )	switch( 0 ) { case 0: case X:; }
531*48a54d36SAndroid Build Coastguard Worker 
532*48a54d36SAndroid Build Coastguard Worker #if 0
533*48a54d36SAndroid Build Coastguard Worker #pragma mark == check macros ==
534*48a54d36SAndroid Build Coastguard Worker #endif
535*48a54d36SAndroid Build Coastguard Worker 
536*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
537*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check
538*48a54d36SAndroid Build Coastguard Worker 
539*48a54d36SAndroid Build Coastguard Worker 	@abstract	Check that an expression is true (non-zero).
540*48a54d36SAndroid Build Coastguard Worker 
541*48a54d36SAndroid Build Coastguard Worker 	@discussion
542*48a54d36SAndroid Build Coastguard Worker 
543*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
544*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) using the default debugging output method.
545*48a54d36SAndroid Build Coastguard Worker 
546*48a54d36SAndroid Build Coastguard Worker 	Code inside check() statements is not compiled into production builds.
547*48a54d36SAndroid Build Coastguard Worker */
548*48a54d36SAndroid Build Coastguard Worker 
549*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
550*48a54d36SAndroid Build Coastguard Worker 	#undef check
551*48a54d36SAndroid Build Coastguard Worker #endif
552*48a54d36SAndroid Build Coastguard Worker #if( !defined( check ) )
553*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
554*48a54d36SAndroid Build Coastguard Worker 		#define	check( X )																					\
555*48a54d36SAndroid Build Coastguard Worker 			do 																								\
556*48a54d36SAndroid Build Coastguard Worker 			{																								\
557*48a54d36SAndroid Build Coastguard Worker 				if( !( X ) ) 																				\
558*48a54d36SAndroid Build Coastguard Worker 				{																							\
559*48a54d36SAndroid Build Coastguard Worker 					debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );						\
560*48a54d36SAndroid Build Coastguard Worker 				}																							\
561*48a54d36SAndroid Build Coastguard Worker 			} while( 0 )
562*48a54d36SAndroid Build Coastguard Worker 	#else
563*48a54d36SAndroid Build Coastguard Worker 		#define	check( X )
564*48a54d36SAndroid Build Coastguard Worker 	#endif
565*48a54d36SAndroid Build Coastguard Worker #endif
566*48a54d36SAndroid Build Coastguard Worker 
567*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
568*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_string
569*48a54d36SAndroid Build Coastguard Worker 
570*48a54d36SAndroid Build Coastguard Worker 	@abstract	Check that an expression is true (non-zero) with an explanation.
571*48a54d36SAndroid Build Coastguard Worker 
572*48a54d36SAndroid Build Coastguard Worker 	@discussion
573*48a54d36SAndroid Build Coastguard Worker 
574*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
575*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) and a custom explanation string using the default debugging output method.
576*48a54d36SAndroid Build Coastguard Worker 
577*48a54d36SAndroid Build Coastguard Worker 	Code inside check_string() statements is not compiled into production builds.
578*48a54d36SAndroid Build Coastguard Worker */
579*48a54d36SAndroid Build Coastguard Worker 
580*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
581*48a54d36SAndroid Build Coastguard Worker 	#undef check_string
582*48a54d36SAndroid Build Coastguard Worker #endif
583*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_string ) )
584*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
585*48a54d36SAndroid Build Coastguard Worker 		#define	check_string( X, STR )																		\
586*48a54d36SAndroid Build Coastguard Worker 			do 																								\
587*48a54d36SAndroid Build Coastguard Worker 			{																								\
588*48a54d36SAndroid Build Coastguard Worker 				if( !( X ) ) 																				\
589*48a54d36SAndroid Build Coastguard Worker 				{																							\
590*48a54d36SAndroid Build Coastguard Worker 					debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ );						\
591*48a54d36SAndroid Build Coastguard Worker 				}																							\
592*48a54d36SAndroid Build Coastguard Worker 																											\
593*48a54d36SAndroid Build Coastguard Worker 			}	while( 0 )
594*48a54d36SAndroid Build Coastguard Worker 	#else
595*48a54d36SAndroid Build Coastguard Worker 		#define	check_string( X, STR )
596*48a54d36SAndroid Build Coastguard Worker 	#endif
597*48a54d36SAndroid Build Coastguard Worker #endif
598*48a54d36SAndroid Build Coastguard Worker 
599*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
600*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_noerr
601*48a54d36SAndroid Build Coastguard Worker 
602*48a54d36SAndroid Build Coastguard Worker 	@abstract	Check that an error code is noErr (0).
603*48a54d36SAndroid Build Coastguard Worker 
604*48a54d36SAndroid Build Coastguard Worker 	@discussion
605*48a54d36SAndroid Build Coastguard Worker 
606*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
607*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) using the default debugging output method.
608*48a54d36SAndroid Build Coastguard Worker 
609*48a54d36SAndroid Build Coastguard Worker 	Code inside check_noerr() statements is not compiled into production builds.
610*48a54d36SAndroid Build Coastguard Worker */
611*48a54d36SAndroid Build Coastguard Worker 
612*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
613*48a54d36SAndroid Build Coastguard Worker 	#undef check_noerr
614*48a54d36SAndroid Build Coastguard Worker #endif
615*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_noerr ) )
616*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
617*48a54d36SAndroid Build Coastguard Worker 		#define	check_noerr( ERR )																			\
618*48a54d36SAndroid Build Coastguard Worker 			do 																								\
619*48a54d36SAndroid Build Coastguard Worker 			{																								\
620*48a54d36SAndroid Build Coastguard Worker 				int_least32_t		localErr;																\
621*48a54d36SAndroid Build Coastguard Worker 																											\
622*48a54d36SAndroid Build Coastguard Worker 				localErr = (int_least32_t)( ERR );															\
623*48a54d36SAndroid Build Coastguard Worker 				if( localErr != 0 ) 																		\
624*48a54d36SAndroid Build Coastguard Worker 				{																							\
625*48a54d36SAndroid Build Coastguard Worker 					debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ );			\
626*48a54d36SAndroid Build Coastguard Worker 				}																							\
627*48a54d36SAndroid Build Coastguard Worker 																											\
628*48a54d36SAndroid Build Coastguard Worker 			}	while( 0 )
629*48a54d36SAndroid Build Coastguard Worker 	#else
630*48a54d36SAndroid Build Coastguard Worker 		#define	check_noerr( ERR )
631*48a54d36SAndroid Build Coastguard Worker 	#endif
632*48a54d36SAndroid Build Coastguard Worker #endif
633*48a54d36SAndroid Build Coastguard Worker 
634*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
635*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_noerr_string
636*48a54d36SAndroid Build Coastguard Worker 
637*48a54d36SAndroid Build Coastguard Worker 	@abstract	Check that an error code is noErr (0) with an explanation.
638*48a54d36SAndroid Build Coastguard Worker 
639*48a54d36SAndroid Build Coastguard Worker 	@discussion
640*48a54d36SAndroid Build Coastguard Worker 
641*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
642*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) and a custom explanation string using the default debugging output method.
643*48a54d36SAndroid Build Coastguard Worker 
644*48a54d36SAndroid Build Coastguard Worker 	Code inside check_noerr_string() statements is not compiled into production builds.
645*48a54d36SAndroid Build Coastguard Worker */
646*48a54d36SAndroid Build Coastguard Worker 
647*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
648*48a54d36SAndroid Build Coastguard Worker 	#undef check_noerr_string
649*48a54d36SAndroid Build Coastguard Worker #endif
650*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_noerr_string ) )
651*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
652*48a54d36SAndroid Build Coastguard Worker 		#define	check_noerr_string( ERR, STR )																\
653*48a54d36SAndroid Build Coastguard Worker 			do 																								\
654*48a54d36SAndroid Build Coastguard Worker 			{																								\
655*48a54d36SAndroid Build Coastguard Worker 				int_least32_t		localErr;																\
656*48a54d36SAndroid Build Coastguard Worker 																											\
657*48a54d36SAndroid Build Coastguard Worker 				localErr = (int_least32_t)( ERR );															\
658*48a54d36SAndroid Build Coastguard Worker 				if( localErr != 0 ) 																		\
659*48a54d36SAndroid Build Coastguard Worker 				{																							\
660*48a54d36SAndroid Build Coastguard Worker 					debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );				\
661*48a54d36SAndroid Build Coastguard Worker 				}																							\
662*48a54d36SAndroid Build Coastguard Worker 																											\
663*48a54d36SAndroid Build Coastguard Worker 			}	while( 0 )
664*48a54d36SAndroid Build Coastguard Worker 	#else
665*48a54d36SAndroid Build Coastguard Worker 		#define	check_noerr_string( ERR, STR )
666*48a54d36SAndroid Build Coastguard Worker 	#endif
667*48a54d36SAndroid Build Coastguard Worker #endif
668*48a54d36SAndroid Build Coastguard Worker 
669*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
670*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_translated_errno
671*48a54d36SAndroid Build Coastguard Worker 
672*48a54d36SAndroid Build Coastguard Worker 	@abstract	Check a condition and prints errno (if non-zero) to the log.
673*48a54d36SAndroid Build Coastguard Worker 
674*48a54d36SAndroid Build Coastguard Worker 	@discussion
675*48a54d36SAndroid Build Coastguard Worker 
676*48a54d36SAndroid Build Coastguard Worker 	Code inside check_translated_errno() statements is not compiled into production builds.
677*48a54d36SAndroid Build Coastguard Worker */
678*48a54d36SAndroid Build Coastguard Worker 
679*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_translated_errno ) )
680*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
681*48a54d36SAndroid Build Coastguard Worker 		#define	check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )										\
682*48a54d36SAndroid Build Coastguard Worker 			do 																								\
683*48a54d36SAndroid Build Coastguard Worker 			{																								\
684*48a54d36SAndroid Build Coastguard Worker 				if( !( TEST ) ) 																			\
685*48a54d36SAndroid Build Coastguard Worker 				{																							\
686*48a54d36SAndroid Build Coastguard Worker 					int_least32_t		localErr;															\
687*48a54d36SAndroid Build Coastguard Worker 																											\
688*48a54d36SAndroid Build Coastguard Worker 					localErr = (int_least32_t)( ERRNO );													\
689*48a54d36SAndroid Build Coastguard Worker 					localErr = ( localErr != 0 ) ? localErr : (int_least32_t)( ALTERNATE_ERROR );			\
690*48a54d36SAndroid Build Coastguard Worker 					debug_print_assert( localErr, #TEST, NULL, __FILE__, __LINE__, __ROUTINE__ );			\
691*48a54d36SAndroid Build Coastguard Worker 				}																							\
692*48a54d36SAndroid Build Coastguard Worker 																											\
693*48a54d36SAndroid Build Coastguard Worker 			} 	while( 0 )
694*48a54d36SAndroid Build Coastguard Worker 	#else
695*48a54d36SAndroid Build Coastguard Worker 		#define	check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )
696*48a54d36SAndroid Build Coastguard Worker 	#endif
697*48a54d36SAndroid Build Coastguard Worker #endif
698*48a54d36SAndroid Build Coastguard Worker 
699*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
700*48a54d36SAndroid Build Coastguard Worker /*!	@defined	check_ptr_overlap
701*48a54d36SAndroid Build Coastguard Worker 
702*48a54d36SAndroid Build Coastguard Worker 	@abstract	Checks that two ptrs do not overlap.
703*48a54d36SAndroid Build Coastguard Worker */
704*48a54d36SAndroid Build Coastguard Worker 
705*48a54d36SAndroid Build Coastguard Worker #define	check_ptr_overlap( P1, P1_SIZE, P2, P2_SIZE )										\
706*48a54d36SAndroid Build Coastguard Worker 	do																						\
707*48a54d36SAndroid Build Coastguard Worker 	{																						\
708*48a54d36SAndroid Build Coastguard Worker 		check( !( ( (uintptr_t)( P1 ) >=     (uintptr_t)( P2 ) ) && 						\
709*48a54d36SAndroid Build Coastguard Worker 				  ( (uintptr_t)( P1 ) <  ( ( (uintptr_t)( P2 ) ) + ( P2_SIZE ) ) ) ) );		\
710*48a54d36SAndroid Build Coastguard Worker 		check( !( ( (uintptr_t)( P2 ) >=     (uintptr_t)( P1 ) ) && 						\
711*48a54d36SAndroid Build Coastguard Worker 				  ( (uintptr_t)( P2 ) <  ( ( (uintptr_t)( P1 ) ) + ( P1_SIZE ) ) ) ) );		\
712*48a54d36SAndroid Build Coastguard Worker 																							\
713*48a54d36SAndroid Build Coastguard Worker 	}	while( 0 )
714*48a54d36SAndroid Build Coastguard Worker 
715*48a54d36SAndroid Build Coastguard Worker #if 0
716*48a54d36SAndroid Build Coastguard Worker #pragma mark == require macros ==
717*48a54d36SAndroid Build Coastguard Worker #endif
718*48a54d36SAndroid Build Coastguard Worker 
719*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
720*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require
721*48a54d36SAndroid Build Coastguard Worker 
722*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluate to true.
723*48a54d36SAndroid Build Coastguard Worker 
724*48a54d36SAndroid Build Coastguard Worker 	@discussion
725*48a54d36SAndroid Build Coastguard Worker 
726*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
727*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) using the default debugging output method then jumps to a label.
728*48a54d36SAndroid Build Coastguard Worker */
729*48a54d36SAndroid Build Coastguard Worker 
730*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
731*48a54d36SAndroid Build Coastguard Worker 	#undef require
732*48a54d36SAndroid Build Coastguard Worker #endif
733*48a54d36SAndroid Build Coastguard Worker #if( !defined( require ) )
734*48a54d36SAndroid Build Coastguard Worker 	#define	require( X, LABEL )																				\
735*48a54d36SAndroid Build Coastguard Worker 		do 																									\
736*48a54d36SAndroid Build Coastguard Worker 		{																									\
737*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
738*48a54d36SAndroid Build Coastguard Worker 			{																								\
739*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );							\
740*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
741*48a54d36SAndroid Build Coastguard Worker 			}																								\
742*48a54d36SAndroid Build Coastguard Worker 																											\
743*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
744*48a54d36SAndroid Build Coastguard Worker #endif
745*48a54d36SAndroid Build Coastguard Worker 
746*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
747*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_string
748*48a54d36SAndroid Build Coastguard Worker 
749*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluate to true with an explanation.
750*48a54d36SAndroid Build Coastguard Worker 
751*48a54d36SAndroid Build Coastguard Worker 	@discussion
752*48a54d36SAndroid Build Coastguard Worker 
753*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
754*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) and a custom explanation string using the default debugging output method then jumps to a label.
755*48a54d36SAndroid Build Coastguard Worker */
756*48a54d36SAndroid Build Coastguard Worker 
757*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
758*48a54d36SAndroid Build Coastguard Worker 	#undef require_string
759*48a54d36SAndroid Build Coastguard Worker #endif
760*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_string ) )
761*48a54d36SAndroid Build Coastguard Worker 	#define	require_string( X, LABEL, STR )																	\
762*48a54d36SAndroid Build Coastguard Worker 		do 																									\
763*48a54d36SAndroid Build Coastguard Worker 		{																									\
764*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
765*48a54d36SAndroid Build Coastguard Worker 			{																								\
766*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ );							\
767*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
768*48a54d36SAndroid Build Coastguard Worker 			}																								\
769*48a54d36SAndroid Build Coastguard Worker 																											\
770*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
771*48a54d36SAndroid Build Coastguard Worker #endif
772*48a54d36SAndroid Build Coastguard Worker 
773*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
774*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_quiet
775*48a54d36SAndroid Build Coastguard Worker 
776*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluate to true.
777*48a54d36SAndroid Build Coastguard Worker 
778*48a54d36SAndroid Build Coastguard Worker 	@discussion
779*48a54d36SAndroid Build Coastguard Worker 
780*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this jumps to a label. No debugging information is printed.
781*48a54d36SAndroid Build Coastguard Worker */
782*48a54d36SAndroid Build Coastguard Worker 
783*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
784*48a54d36SAndroid Build Coastguard Worker 	#undef require_quiet
785*48a54d36SAndroid Build Coastguard Worker #endif
786*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_quiet ) )
787*48a54d36SAndroid Build Coastguard Worker 	#define	require_quiet( X, LABEL )																		\
788*48a54d36SAndroid Build Coastguard Worker 		do 																									\
789*48a54d36SAndroid Build Coastguard Worker 		{																									\
790*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
791*48a54d36SAndroid Build Coastguard Worker 			{																								\
792*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
793*48a54d36SAndroid Build Coastguard Worker 			}																								\
794*48a54d36SAndroid Build Coastguard Worker 																											\
795*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
796*48a54d36SAndroid Build Coastguard Worker #endif
797*48a54d36SAndroid Build Coastguard Worker 
798*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
799*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_noerr
800*48a54d36SAndroid Build Coastguard Worker 
801*48a54d36SAndroid Build Coastguard Worker 	@abstract	Require that an error code is noErr (0).
802*48a54d36SAndroid Build Coastguard Worker 
803*48a54d36SAndroid Build Coastguard Worker 	@discussion
804*48a54d36SAndroid Build Coastguard Worker 
805*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
806*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) using the default debugging output method then jumps to a label.
807*48a54d36SAndroid Build Coastguard Worker */
808*48a54d36SAndroid Build Coastguard Worker 
809*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
810*48a54d36SAndroid Build Coastguard Worker 	#undef require_noerr
811*48a54d36SAndroid Build Coastguard Worker #endif
812*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr ) )
813*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr( ERR, LABEL )																		\
814*48a54d36SAndroid Build Coastguard Worker 		do 																									\
815*48a54d36SAndroid Build Coastguard Worker 		{																									\
816*48a54d36SAndroid Build Coastguard Worker 			int_least32_t		localErr;																	\
817*48a54d36SAndroid Build Coastguard Worker 																											\
818*48a54d36SAndroid Build Coastguard Worker 			localErr = (int_least32_t)( ERR );																\
819*48a54d36SAndroid Build Coastguard Worker 			if( localErr != 0 ) 																			\
820*48a54d36SAndroid Build Coastguard Worker 			{																								\
821*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ );				\
822*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
823*48a54d36SAndroid Build Coastguard Worker 			}																								\
824*48a54d36SAndroid Build Coastguard Worker 																											\
825*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
826*48a54d36SAndroid Build Coastguard Worker #endif
827*48a54d36SAndroid Build Coastguard Worker 
828*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
829*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_noerr_string
830*48a54d36SAndroid Build Coastguard Worker 
831*48a54d36SAndroid Build Coastguard Worker 	@abstract	Require that an error code is noErr (0).
832*48a54d36SAndroid Build Coastguard Worker 
833*48a54d36SAndroid Build Coastguard Worker 	@discussion
834*48a54d36SAndroid Build Coastguard Worker 
835*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
836*48a54d36SAndroid Build Coastguard Worker 	function name, etc.), and a custom explanation string using the default debugging output method using the
837*48a54d36SAndroid Build Coastguard Worker 	default debugging output method then jumps to a label.
838*48a54d36SAndroid Build Coastguard Worker */
839*48a54d36SAndroid Build Coastguard Worker 
840*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
841*48a54d36SAndroid Build Coastguard Worker 	#undef require_noerr_string
842*48a54d36SAndroid Build Coastguard Worker #endif
843*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_string ) )
844*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_string( ERR, LABEL, STR )															\
845*48a54d36SAndroid Build Coastguard Worker 		do 																									\
846*48a54d36SAndroid Build Coastguard Worker 		{																									\
847*48a54d36SAndroid Build Coastguard Worker 			int_least32_t		localErr;																	\
848*48a54d36SAndroid Build Coastguard Worker 																											\
849*48a54d36SAndroid Build Coastguard Worker 			localErr = (int_least32_t)( ERR );																\
850*48a54d36SAndroid Build Coastguard Worker 			if( localErr != 0 ) 																			\
851*48a54d36SAndroid Build Coastguard Worker 			{																								\
852*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );					\
853*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
854*48a54d36SAndroid Build Coastguard Worker 			}																								\
855*48a54d36SAndroid Build Coastguard Worker 																											\
856*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
857*48a54d36SAndroid Build Coastguard Worker #endif
858*48a54d36SAndroid Build Coastguard Worker 
859*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
860*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_noerr_action_string
861*48a54d36SAndroid Build Coastguard Worker 
862*48a54d36SAndroid Build Coastguard Worker 	@abstract	Require that an error code is noErr (0).
863*48a54d36SAndroid Build Coastguard Worker 
864*48a54d36SAndroid Build Coastguard Worker 	@discussion
865*48a54d36SAndroid Build Coastguard Worker 
866*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
867*48a54d36SAndroid Build Coastguard Worker 	function name, etc.), and a custom explanation string using the default debugging output method using the
868*48a54d36SAndroid Build Coastguard Worker 	default debugging output method then executes an action and jumps to a label.
869*48a54d36SAndroid Build Coastguard Worker */
870*48a54d36SAndroid Build Coastguard Worker 
871*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
872*48a54d36SAndroid Build Coastguard Worker 	#undef require_noerr_action_string
873*48a54d36SAndroid Build Coastguard Worker #endif
874*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_action_string ) )
875*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_string( ERR, LABEL, ACTION, STR )											\
876*48a54d36SAndroid Build Coastguard Worker 		do 																									\
877*48a54d36SAndroid Build Coastguard Worker 		{																									\
878*48a54d36SAndroid Build Coastguard Worker 			int_least32_t		localErr;																	\
879*48a54d36SAndroid Build Coastguard Worker 																											\
880*48a54d36SAndroid Build Coastguard Worker 			localErr = (int_least32_t)( ERR );																\
881*48a54d36SAndroid Build Coastguard Worker 			if( localErr != 0 ) 																			\
882*48a54d36SAndroid Build Coastguard Worker 			{																								\
883*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );					\
884*48a54d36SAndroid Build Coastguard Worker 				{ ACTION; }																					\
885*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
886*48a54d36SAndroid Build Coastguard Worker 			}																								\
887*48a54d36SAndroid Build Coastguard Worker 																											\
888*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
889*48a54d36SAndroid Build Coastguard Worker #endif
890*48a54d36SAndroid Build Coastguard Worker 
891*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
892*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_noerr_quiet
893*48a54d36SAndroid Build Coastguard Worker 
894*48a54d36SAndroid Build Coastguard Worker 	@abstract	Require that an error code is noErr (0).
895*48a54d36SAndroid Build Coastguard Worker 
896*48a54d36SAndroid Build Coastguard Worker 	@discussion
897*48a54d36SAndroid Build Coastguard Worker 
898*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this jumps to a label. No debugging information is printed.
899*48a54d36SAndroid Build Coastguard Worker */
900*48a54d36SAndroid Build Coastguard Worker 
901*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
902*48a54d36SAndroid Build Coastguard Worker 	#undef require_noerr_quiet
903*48a54d36SAndroid Build Coastguard Worker #endif
904*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_quiet ) )
905*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_quiet( ERR, LABEL )																\
906*48a54d36SAndroid Build Coastguard Worker 		do 																									\
907*48a54d36SAndroid Build Coastguard Worker 		{																									\
908*48a54d36SAndroid Build Coastguard Worker 			if( ( ERR ) != 0 ) 																				\
909*48a54d36SAndroid Build Coastguard Worker 			{																								\
910*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
911*48a54d36SAndroid Build Coastguard Worker 			}																								\
912*48a54d36SAndroid Build Coastguard Worker 																											\
913*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
914*48a54d36SAndroid Build Coastguard Worker #endif
915*48a54d36SAndroid Build Coastguard Worker 
916*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
917*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_noerr_action
918*48a54d36SAndroid Build Coastguard Worker 
919*48a54d36SAndroid Build Coastguard Worker 	@abstract	Require that an error code is noErr (0) with an action to execute otherwise.
920*48a54d36SAndroid Build Coastguard Worker 
921*48a54d36SAndroid Build Coastguard Worker 	@discussion
922*48a54d36SAndroid Build Coastguard Worker 
923*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
924*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) using the default debugging output method then executes an action and jumps to a label.
925*48a54d36SAndroid Build Coastguard Worker */
926*48a54d36SAndroid Build Coastguard Worker 
927*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
928*48a54d36SAndroid Build Coastguard Worker 	#undef require_noerr_action
929*48a54d36SAndroid Build Coastguard Worker #endif
930*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_action ) )
931*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action( ERR, LABEL, ACTION )														\
932*48a54d36SAndroid Build Coastguard Worker 		do 																									\
933*48a54d36SAndroid Build Coastguard Worker 		{																									\
934*48a54d36SAndroid Build Coastguard Worker 			int_least32_t		localErr;																	\
935*48a54d36SAndroid Build Coastguard Worker 																											\
936*48a54d36SAndroid Build Coastguard Worker 			localErr = (int_least32_t)( ERR );																\
937*48a54d36SAndroid Build Coastguard Worker 			if( localErr != 0 ) 																			\
938*48a54d36SAndroid Build Coastguard Worker 			{																								\
939*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ );				\
940*48a54d36SAndroid Build Coastguard Worker 				{ ACTION; }																					\
941*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
942*48a54d36SAndroid Build Coastguard Worker 			}																								\
943*48a54d36SAndroid Build Coastguard Worker 																											\
944*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
945*48a54d36SAndroid Build Coastguard Worker #endif
946*48a54d36SAndroid Build Coastguard Worker 
947*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
948*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_noerr_action_quiet
949*48a54d36SAndroid Build Coastguard Worker 
950*48a54d36SAndroid Build Coastguard Worker 	@abstract	Require that an error code is noErr (0) with an action to execute otherwise.
951*48a54d36SAndroid Build Coastguard Worker 
952*48a54d36SAndroid Build Coastguard Worker 	@discussion
953*48a54d36SAndroid Build Coastguard Worker 
954*48a54d36SAndroid Build Coastguard Worker 	If the error code is non-0, this executes an action and jumps to a label. No debugging information is printed.
955*48a54d36SAndroid Build Coastguard Worker */
956*48a54d36SAndroid Build Coastguard Worker 
957*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
958*48a54d36SAndroid Build Coastguard Worker 	#undef require_noerr_action_quiet
959*48a54d36SAndroid Build Coastguard Worker #endif
960*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_action_quiet ) )
961*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_quiet( ERR, LABEL, ACTION )												\
962*48a54d36SAndroid Build Coastguard Worker 		do 																									\
963*48a54d36SAndroid Build Coastguard Worker 		{																									\
964*48a54d36SAndroid Build Coastguard Worker 			if( ( ERR ) != 0 ) 																				\
965*48a54d36SAndroid Build Coastguard Worker 			{																								\
966*48a54d36SAndroid Build Coastguard Worker 				{ ACTION; }																					\
967*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
968*48a54d36SAndroid Build Coastguard Worker 			}																								\
969*48a54d36SAndroid Build Coastguard Worker 																											\
970*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
971*48a54d36SAndroid Build Coastguard Worker #endif
972*48a54d36SAndroid Build Coastguard Worker 
973*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
974*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_action
975*48a54d36SAndroid Build Coastguard Worker 
976*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluate to true with an action to execute otherwise.
977*48a54d36SAndroid Build Coastguard Worker 
978*48a54d36SAndroid Build Coastguard Worker 	@discussion
979*48a54d36SAndroid Build Coastguard Worker 
980*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
981*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) using the default debugging output method then executes an action and jumps to a label.
982*48a54d36SAndroid Build Coastguard Worker */
983*48a54d36SAndroid Build Coastguard Worker 
984*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
985*48a54d36SAndroid Build Coastguard Worker 	#undef require_action
986*48a54d36SAndroid Build Coastguard Worker #endif
987*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_action ) )
988*48a54d36SAndroid Build Coastguard Worker 	#define	require_action( X, LABEL, ACTION )																\
989*48a54d36SAndroid Build Coastguard Worker 		do 																									\
990*48a54d36SAndroid Build Coastguard Worker 		{																									\
991*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
992*48a54d36SAndroid Build Coastguard Worker 			{																								\
993*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );							\
994*48a54d36SAndroid Build Coastguard Worker 				{ ACTION; }																					\
995*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
996*48a54d36SAndroid Build Coastguard Worker 			}																								\
997*48a54d36SAndroid Build Coastguard Worker 																											\
998*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
999*48a54d36SAndroid Build Coastguard Worker #endif
1000*48a54d36SAndroid Build Coastguard Worker 
1001*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1002*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_action_quiet
1003*48a54d36SAndroid Build Coastguard Worker 
1004*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluate to true with an action to execute otherwise.
1005*48a54d36SAndroid Build Coastguard Worker 
1006*48a54d36SAndroid Build Coastguard Worker 	@discussion
1007*48a54d36SAndroid Build Coastguard Worker 
1008*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this executes an action and jumps to a label. No debugging information is printed.
1009*48a54d36SAndroid Build Coastguard Worker */
1010*48a54d36SAndroid Build Coastguard Worker 
1011*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
1012*48a54d36SAndroid Build Coastguard Worker 	#undef require_action_quiet
1013*48a54d36SAndroid Build Coastguard Worker #endif
1014*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_action_quiet ) )
1015*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_quiet( X, LABEL, ACTION )														\
1016*48a54d36SAndroid Build Coastguard Worker 		do 																									\
1017*48a54d36SAndroid Build Coastguard Worker 		{																									\
1018*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
1019*48a54d36SAndroid Build Coastguard Worker 			{																								\
1020*48a54d36SAndroid Build Coastguard Worker 				{ ACTION; }																					\
1021*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
1022*48a54d36SAndroid Build Coastguard Worker 			}																								\
1023*48a54d36SAndroid Build Coastguard Worker 																											\
1024*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
1025*48a54d36SAndroid Build Coastguard Worker #endif
1026*48a54d36SAndroid Build Coastguard Worker 
1027*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1028*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_action_string
1029*48a54d36SAndroid Build Coastguard Worker 
1030*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluate to true with an explanation and action to execute otherwise.
1031*48a54d36SAndroid Build Coastguard Worker 
1032*48a54d36SAndroid Build Coastguard Worker 	@discussion
1033*48a54d36SAndroid Build Coastguard Worker 
1034*48a54d36SAndroid Build Coastguard Worker 	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
1035*48a54d36SAndroid Build Coastguard Worker 	function name, etc.) and a custom explanation string using the default debugging output method then executes an
1036*48a54d36SAndroid Build Coastguard Worker 	action and jumps to a label.
1037*48a54d36SAndroid Build Coastguard Worker */
1038*48a54d36SAndroid Build Coastguard Worker 
1039*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
1040*48a54d36SAndroid Build Coastguard Worker 	#undef require_action_string
1041*48a54d36SAndroid Build Coastguard Worker #endif
1042*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_action_string ) )
1043*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_string( X, LABEL, ACTION, STR )													\
1044*48a54d36SAndroid Build Coastguard Worker 		do 																									\
1045*48a54d36SAndroid Build Coastguard Worker 		{																									\
1046*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
1047*48a54d36SAndroid Build Coastguard Worker 			{																								\
1048*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ );						\
1049*48a54d36SAndroid Build Coastguard Worker 				{ ACTION; }																					\
1050*48a54d36SAndroid Build Coastguard Worker 				goto LABEL;																					\
1051*48a54d36SAndroid Build Coastguard Worker 			}																								\
1052*48a54d36SAndroid Build Coastguard Worker 																											\
1053*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
1054*48a54d36SAndroid Build Coastguard Worker 
1055*48a54d36SAndroid Build Coastguard Worker #endif
1056*48a54d36SAndroid Build Coastguard Worker 
1057*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1058*48a54d36SAndroid Build Coastguard Worker /*!	@defined	require_throw
1059*48a54d36SAndroid Build Coastguard Worker 
1060*48a54d36SAndroid Build Coastguard Worker 	@abstract	Requires that an expression evaluates to true or an exception is thrown.
1061*48a54d36SAndroid Build Coastguard Worker 
1062*48a54d36SAndroid Build Coastguard Worker 	@discussion
1063*48a54d36SAndroid Build Coastguard Worker 
1064*48a54d36SAndroid Build Coastguard Worker 	If the expression evaluates to false, this prints debugging information (actual expression string, file,
1065*48a54d36SAndroid Build Coastguard Worker 	line number, function name, etc.) using the default debugging output method then throws an exception.
1066*48a54d36SAndroid Build Coastguard Worker */
1067*48a54d36SAndroid Build Coastguard Worker 
1068*48a54d36SAndroid Build Coastguard Worker #if( defined( __cplusplus ) )
1069*48a54d36SAndroid Build Coastguard Worker 	#define	require_throw( X )																				\
1070*48a54d36SAndroid Build Coastguard Worker 		do 																									\
1071*48a54d36SAndroid Build Coastguard Worker 		{																									\
1072*48a54d36SAndroid Build Coastguard Worker 			if( !( X ) ) 																					\
1073*48a54d36SAndroid Build Coastguard Worker 			{																								\
1074*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );							\
1075*48a54d36SAndroid Build Coastguard Worker 				throw kUnknownErr;																			\
1076*48a54d36SAndroid Build Coastguard Worker 			}																								\
1077*48a54d36SAndroid Build Coastguard Worker 																											\
1078*48a54d36SAndroid Build Coastguard Worker 		}	while( 0 )
1079*48a54d36SAndroid Build Coastguard Worker #endif
1080*48a54d36SAndroid Build Coastguard Worker 
1081*48a54d36SAndroid Build Coastguard Worker #if 0
1082*48a54d36SAndroid Build Coastguard Worker #pragma mark == Design-By-Contract macros ==
1083*48a54d36SAndroid Build Coastguard Worker #endif
1084*48a54d36SAndroid Build Coastguard Worker 
1085*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1086*48a54d36SAndroid Build Coastguard Worker //	Design-By-Contract macros
1087*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1088*48a54d36SAndroid Build Coastguard Worker 
1089*48a54d36SAndroid Build Coastguard Worker #define	ensure( X )													check( X )
1090*48a54d36SAndroid Build Coastguard Worker #define	ensure_string( X, STR )										check_string( X, STR )
1091*48a54d36SAndroid Build Coastguard Worker #define	ensure_noerr( ERR )											check_noerr( ERR )
1092*48a54d36SAndroid Build Coastguard Worker #define	ensure_noerr_string( ERR, STR )								check_noerr_string( ERR, STR )
1093*48a54d36SAndroid Build Coastguard Worker #define	ensure_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )		check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )
1094*48a54d36SAndroid Build Coastguard Worker 
1095*48a54d36SAndroid Build Coastguard Worker // Note: Design-By-Contract "require" macros are already defined elsewhere.
1096*48a54d36SAndroid Build Coastguard Worker 
1097*48a54d36SAndroid Build Coastguard Worker #if 0
1098*48a54d36SAndroid Build Coastguard Worker #pragma mark == Expect macros ==
1099*48a54d36SAndroid Build Coastguard Worker #endif
1100*48a54d36SAndroid Build Coastguard Worker 
1101*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1102*48a54d36SAndroid Build Coastguard Worker //	Expect macros
1103*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1104*48a54d36SAndroid Build Coastguard Worker 
1105*48a54d36SAndroid Build Coastguard Worker // Expect macros allow code to include runtime checking of things that should not happen in shipping code (e.g. internal
1106*48a54d36SAndroid Build Coastguard Worker // programmer errors, such as a NULL parameter where it is not allowed). Once the code has been verified to work correctly
1107*48a54d36SAndroid Build Coastguard Worker // without asserting, the DEBUG_EXPECT_VERIFIED conditional can be set to eliminate the error checking entirely. It can
1108*48a54d36SAndroid Build Coastguard Worker // also be useful to measure the cost of error checking code by profiling with it enable and with it disabled.
1109*48a54d36SAndroid Build Coastguard Worker 
1110*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_EXPECT_VERIFIED )
1111*48a54d36SAndroid Build Coastguard Worker 	#define	require_expect
1112*48a54d36SAndroid Build Coastguard Worker 	#define	require_string_expect
1113*48a54d36SAndroid Build Coastguard Worker 	#define	require_quiet_expect
1114*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_expect
1115*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_string_expect
1116*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_string_expect
1117*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_quiet_expect
1118*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_expect
1119*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_quiet_expect
1120*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_expect
1121*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_quiet_expect
1122*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_string_expect
1123*48a54d36SAndroid Build Coastguard Worker #else
1124*48a54d36SAndroid Build Coastguard Worker 	#define	require_expect							require
1125*48a54d36SAndroid Build Coastguard Worker 	#define	require_string_expect					require_string
1126*48a54d36SAndroid Build Coastguard Worker 	#define	require_quiet_expect					require_quiet
1127*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_expect					require_noerr
1128*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_string_expect				require_noerr_string
1129*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_string_expect		require_noerr_action_string
1130*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_quiet_expect				require_noerr_quiet
1131*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_expect				require_noerr_action
1132*48a54d36SAndroid Build Coastguard Worker 	#define	require_noerr_action_quiet_expect		require_noerr_action_quiet
1133*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_expect					require_action
1134*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_quiet_expect				require_action_quiet
1135*48a54d36SAndroid Build Coastguard Worker 	#define	require_action_string_expect			require_action_string
1136*48a54d36SAndroid Build Coastguard Worker #endif
1137*48a54d36SAndroid Build Coastguard Worker 
1138*48a54d36SAndroid Build Coastguard Worker #if 0
1139*48a54d36SAndroid Build Coastguard Worker #pragma mark == Output macros ==
1140*48a54d36SAndroid Build Coastguard Worker #endif
1141*48a54d36SAndroid Build Coastguard Worker 
1142*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1143*48a54d36SAndroid Build Coastguard Worker /*!	@defined	debug_string
1144*48a54d36SAndroid Build Coastguard Worker 
1145*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints a debugging C string.
1146*48a54d36SAndroid Build Coastguard Worker */
1147*48a54d36SAndroid Build Coastguard Worker 
1148*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS )
1149*48a54d36SAndroid Build Coastguard Worker 	#undef debug_string
1150*48a54d36SAndroid Build Coastguard Worker #endif
1151*48a54d36SAndroid Build Coastguard Worker #if( !defined( debug_string ) )
1152*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
1153*48a54d36SAndroid Build Coastguard Worker 		#define	debug_string( STR )																		\
1154*48a54d36SAndroid Build Coastguard Worker 			do 																							\
1155*48a54d36SAndroid Build Coastguard Worker 			{																							\
1156*48a54d36SAndroid Build Coastguard Worker 				debug_print_assert( 0, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );					\
1157*48a54d36SAndroid Build Coastguard Worker 																										\
1158*48a54d36SAndroid Build Coastguard Worker 			}	while( 0 )
1159*48a54d36SAndroid Build Coastguard Worker 	#else
1160*48a54d36SAndroid Build Coastguard Worker 		#define	debug_string( STR )
1161*48a54d36SAndroid Build Coastguard Worker 	#endif
1162*48a54d36SAndroid Build Coastguard Worker #endif
1163*48a54d36SAndroid Build Coastguard Worker 
1164*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1165*48a54d36SAndroid Build Coastguard Worker /*!	@defined	debug_print_assert
1166*48a54d36SAndroid Build Coastguard Worker 
1167*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints an assertion.
1168*48a54d36SAndroid Build Coastguard Worker */
1169*48a54d36SAndroid Build Coastguard Worker 
1170*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1171*48a54d36SAndroid Build Coastguard Worker 	#define	debug_print_assert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION )	\
1172*48a54d36SAndroid Build Coastguard Worker 		DebugPrintAssert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION )
1173*48a54d36SAndroid Build Coastguard Worker #else
1174*48a54d36SAndroid Build Coastguard Worker 	#define	debug_print_assert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION )
1175*48a54d36SAndroid Build Coastguard Worker #endif
1176*48a54d36SAndroid Build Coastguard Worker 
1177*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1178*48a54d36SAndroid Build Coastguard Worker /*!	@defined	dlog
1179*48a54d36SAndroid Build Coastguard Worker 
1180*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints a debug-only message.
1181*48a54d36SAndroid Build Coastguard Worker */
1182*48a54d36SAndroid Build Coastguard Worker 
1183*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1184*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1185*48a54d36SAndroid Build Coastguard Worker 		#define	dlog( ... )			DebugPrintF( __VA_ARGS__ )
1186*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1187*48a54d36SAndroid Build Coastguard Worker 		#define	dlog( ARGS... )		DebugPrintF( ## ARGS )
1188*48a54d36SAndroid Build Coastguard Worker 	#else
1189*48a54d36SAndroid Build Coastguard Worker 		#define	dlog				DebugPrintF
1190*48a54d36SAndroid Build Coastguard Worker 	#endif
1191*48a54d36SAndroid Build Coastguard Worker #else
1192*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1193*48a54d36SAndroid Build Coastguard Worker 		#define	dlog( ... )
1194*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1195*48a54d36SAndroid Build Coastguard Worker 		#define	dlog( ARGS... )
1196*48a54d36SAndroid Build Coastguard Worker 	#else
1197*48a54d36SAndroid Build Coastguard Worker 		#define	dlog				while( 0 )
1198*48a54d36SAndroid Build Coastguard Worker 	#endif
1199*48a54d36SAndroid Build Coastguard Worker #endif
1200*48a54d36SAndroid Build Coastguard Worker 
1201*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1202*48a54d36SAndroid Build Coastguard Worker /*!	@defined	dlogv
1203*48a54d36SAndroid Build Coastguard Worker 
1204*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints a debug-only message.
1205*48a54d36SAndroid Build Coastguard Worker */
1206*48a54d36SAndroid Build Coastguard Worker 
1207*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1208*48a54d36SAndroid Build Coastguard Worker 	#define	dlogv( LEVEL, FORMAT, LIST )		DebugPrintFVAList( ( LEVEL ), ( FORMAT ), ( LIST ) )
1209*48a54d36SAndroid Build Coastguard Worker #else
1210*48a54d36SAndroid Build Coastguard Worker 	#define	dlogv( LEVEL, FORMAT, LIST )
1211*48a54d36SAndroid Build Coastguard Worker #endif
1212*48a54d36SAndroid Build Coastguard Worker 
1213*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1214*48a54d36SAndroid Build Coastguard Worker /*!	@defined	dlogmem
1215*48a54d36SAndroid Build Coastguard Worker 
1216*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints a debug-only dump of memory.
1217*48a54d36SAndroid Build Coastguard Worker */
1218*48a54d36SAndroid Build Coastguard Worker 
1219*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1220*48a54d36SAndroid Build Coastguard Worker 	#define	dlogmem( LEVEL, PTR, SIZE )		\
1221*48a54d36SAndroid Build Coastguard Worker 		DebugHexDump( ( LEVEL ), 0, NULL, 0, 0, NULL, 0, ( PTR ), ( PTR ), ( SIZE ), kDebugFlagsNone, NULL, 0 )
1222*48a54d36SAndroid Build Coastguard Worker #else
1223*48a54d36SAndroid Build Coastguard Worker 	#define	dlogmem( LEVEL, PTR, SIZE )
1224*48a54d36SAndroid Build Coastguard Worker #endif
1225*48a54d36SAndroid Build Coastguard Worker 
1226*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1227*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DebugNSLog
1228*48a54d36SAndroid Build Coastguard Worker 
1229*48a54d36SAndroid Build Coastguard Worker 	@abstract	Debug-only macro for the Cocoa NSLog function.
1230*48a54d36SAndroid Build Coastguard Worker */
1231*48a54d36SAndroid Build Coastguard Worker 
1232*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1233*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1234*48a54d36SAndroid Build Coastguard Worker 		#define	DebugNSLog( ... )			NSLog( __VA_ARGS__ )
1235*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1236*48a54d36SAndroid Build Coastguard Worker 		#define	DebugNSLog( ARGS... )		NSLog( ## ARGS )
1237*48a54d36SAndroid Build Coastguard Worker 	#else
1238*48a54d36SAndroid Build Coastguard Worker 		#define	DebugNSLog					NSLog
1239*48a54d36SAndroid Build Coastguard Worker 	#endif
1240*48a54d36SAndroid Build Coastguard Worker #else
1241*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1242*48a54d36SAndroid Build Coastguard Worker 		#define	DebugNSLog( ... )
1243*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1244*48a54d36SAndroid Build Coastguard Worker 		#define	DebugNSLog( ARGS... )
1245*48a54d36SAndroid Build Coastguard Worker 	#else
1246*48a54d36SAndroid Build Coastguard Worker 		#define	DebugNSLog					while( 0 )
1247*48a54d36SAndroid Build Coastguard Worker 	#endif
1248*48a54d36SAndroid Build Coastguard Worker #endif
1249*48a54d36SAndroid Build Coastguard Worker 
1250*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1251*48a54d36SAndroid Build Coastguard Worker /*!	@defined	DebugLogMsg
1252*48a54d36SAndroid Build Coastguard Worker 
1253*48a54d36SAndroid Build Coastguard Worker 	@abstract	Debug-only macro for the VxWorks logMsg function.
1254*48a54d36SAndroid Build Coastguard Worker */
1255*48a54d36SAndroid Build Coastguard Worker 
1256*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS )
1257*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG )
1258*48a54d36SAndroid Build Coastguard Worker 		#define DebugLogMsg( LEVEL, FORMAT, P1, P2, P3, P4, P5, P6 )							\
1259*48a54d36SAndroid Build Coastguard Worker 			do 																					\
1260*48a54d36SAndroid Build Coastguard Worker 			{ 																					\
1261*48a54d36SAndroid Build Coastguard Worker 				if( ( inLevel >= gDebugPrintLevelMin ) || ( inLevel <= gDebugPrintLevelMax ) )	\
1262*48a54d36SAndroid Build Coastguard Worker 				{																				\
1263*48a54d36SAndroid Build Coastguard Worker 					logMsg( ( FORMAT ), ( P1 ), ( P2 ), ( P3 ), ( P4 ), ( P5 ), ( P6 ) );		\
1264*48a54d36SAndroid Build Coastguard Worker 				}																				\
1265*48a54d36SAndroid Build Coastguard Worker 																								\
1266*48a54d36SAndroid Build Coastguard Worker 			}	while( 0 )
1267*48a54d36SAndroid Build Coastguard Worker 	#else
1268*48a54d36SAndroid Build Coastguard Worker 		#define DebugLogMsg( LEVEL, FORMAT, P1, P2, P3, P4, P5, P6 )
1269*48a54d36SAndroid Build Coastguard Worker 	#endif
1270*48a54d36SAndroid Build Coastguard Worker #else
1271*48a54d36SAndroid Build Coastguard Worker 	#define	DebugLogMsg		dlog
1272*48a54d36SAndroid Build Coastguard Worker #endif
1273*48a54d36SAndroid Build Coastguard Worker 
1274*48a54d36SAndroid Build Coastguard Worker #if 0
1275*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines - General ==
1276*48a54d36SAndroid Build Coastguard Worker #endif
1277*48a54d36SAndroid Build Coastguard Worker 
1278*48a54d36SAndroid Build Coastguard Worker #ifdef	__cplusplus
1279*48a54d36SAndroid Build Coastguard Worker 	extern "C" {
1280*48a54d36SAndroid Build Coastguard Worker #endif
1281*48a54d36SAndroid Build Coastguard Worker 
1282*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1283*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugInitialize
1284*48a54d36SAndroid Build Coastguard Worker 
1285*48a54d36SAndroid Build Coastguard Worker 	@abstract	Initializes the debugging library for a specific kind of output.
1286*48a54d36SAndroid Build Coastguard Worker 
1287*48a54d36SAndroid Build Coastguard Worker 	@param		inType
1288*48a54d36SAndroid Build Coastguard Worker 	@param		varArg		Variable number parameters, controlled by the "inType" parameter.
1289*48a54d36SAndroid Build Coastguard Worker */
1290*48a54d36SAndroid Build Coastguard Worker 
1291*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1292*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT OSStatus	DebugInitialize( DebugOutputType inType, ... );
1293*48a54d36SAndroid Build Coastguard Worker #endif
1294*48a54d36SAndroid Build Coastguard Worker 
1295*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1296*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1297*48a54d36SAndroid Build Coastguard Worker 		#define	debug_initialize( ... )			DebugInitialize( __VA_ARGS__ )
1298*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1299*48a54d36SAndroid Build Coastguard Worker 		#define	debug_initialize( ARGS... )		DebugInitialize( ## ARGS )
1300*48a54d36SAndroid Build Coastguard Worker 	#else
1301*48a54d36SAndroid Build Coastguard Worker 		#define	debug_initialize				DebugInitialize
1302*48a54d36SAndroid Build Coastguard Worker 	#endif
1303*48a54d36SAndroid Build Coastguard Worker #else
1304*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1305*48a54d36SAndroid Build Coastguard Worker 		#define	debug_initialize( ... )
1306*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1307*48a54d36SAndroid Build Coastguard Worker 		#define	debug_initialize( ARGS... )
1308*48a54d36SAndroid Build Coastguard Worker 	#else
1309*48a54d36SAndroid Build Coastguard Worker 		#define	debug_initialize				while( 0 )
1310*48a54d36SAndroid Build Coastguard Worker 	#endif
1311*48a54d36SAndroid Build Coastguard Worker #endif
1312*48a54d36SAndroid Build Coastguard Worker 
1313*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1314*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugFinalize
1315*48a54d36SAndroid Build Coastguard Worker 
1316*48a54d36SAndroid Build Coastguard Worker 	@abstract	Releases any resources used by the debugging library
1317*48a54d36SAndroid Build Coastguard Worker */
1318*48a54d36SAndroid Build Coastguard Worker 
1319*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1320*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT void		DebugFinalize( void );
1321*48a54d36SAndroid Build Coastguard Worker #endif
1322*48a54d36SAndroid Build Coastguard Worker 
1323*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1324*48a54d36SAndroid Build Coastguard Worker 	#define	debug_terminate()	DebugFinalize()
1325*48a54d36SAndroid Build Coastguard Worker #else
1326*48a54d36SAndroid Build Coastguard Worker 	#define	debug_terminate()
1327*48a54d36SAndroid Build Coastguard Worker #endif
1328*48a54d36SAndroid Build Coastguard Worker 
1329*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1330*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugGetProperty
1331*48a54d36SAndroid Build Coastguard Worker 
1332*48a54d36SAndroid Build Coastguard Worker 	@abstract	Gets the specified property from the debugging library.
1333*48a54d36SAndroid Build Coastguard Worker */
1334*48a54d36SAndroid Build Coastguard Worker 
1335*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1336*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT OSStatus	DebugGetProperty( DebugPropertyTag inTag, ... );
1337*48a54d36SAndroid Build Coastguard Worker #endif
1338*48a54d36SAndroid Build Coastguard Worker 
1339*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1340*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1341*48a54d36SAndroid Build Coastguard Worker 		#define	debug_get_property( ... )			DebugGetProperty( __VA_ARGS__ )
1342*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1343*48a54d36SAndroid Build Coastguard Worker 		#define	debug_get_property( ARGS... )		DebugGetProperty( ## ARGS )
1344*48a54d36SAndroid Build Coastguard Worker 	#else
1345*48a54d36SAndroid Build Coastguard Worker 		#define	debug_get_property					DebugGetProperty
1346*48a54d36SAndroid Build Coastguard Worker 	#endif
1347*48a54d36SAndroid Build Coastguard Worker #else
1348*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1349*48a54d36SAndroid Build Coastguard Worker 		#define	debug_get_property( ... )
1350*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1351*48a54d36SAndroid Build Coastguard Worker 		#define	debug_get_property( ARGS... )
1352*48a54d36SAndroid Build Coastguard Worker 	#else
1353*48a54d36SAndroid Build Coastguard Worker 		#define	debug_get_property					while( 0 )
1354*48a54d36SAndroid Build Coastguard Worker 	#endif
1355*48a54d36SAndroid Build Coastguard Worker #endif
1356*48a54d36SAndroid Build Coastguard Worker 
1357*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1358*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugSetProperty
1359*48a54d36SAndroid Build Coastguard Worker 
1360*48a54d36SAndroid Build Coastguard Worker 	@abstract	Sets the specified property from the debugging library.
1361*48a54d36SAndroid Build Coastguard Worker */
1362*48a54d36SAndroid Build Coastguard Worker 
1363*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1364*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT OSStatus	DebugSetProperty( DebugPropertyTag inTag, ... );
1365*48a54d36SAndroid Build Coastguard Worker #endif
1366*48a54d36SAndroid Build Coastguard Worker 
1367*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1368*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1369*48a54d36SAndroid Build Coastguard Worker 		#define	debug_set_property( ... )			DebugSetProperty( __VA_ARGS__ )
1370*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1371*48a54d36SAndroid Build Coastguard Worker 		#define	debug_set_property( ARGS... )		DebugSetProperty( ## ARGS )
1372*48a54d36SAndroid Build Coastguard Worker 	#else
1373*48a54d36SAndroid Build Coastguard Worker 		#define	debug_set_property					DebugSetProperty
1374*48a54d36SAndroid Build Coastguard Worker 	#endif
1375*48a54d36SAndroid Build Coastguard Worker #else
1376*48a54d36SAndroid Build Coastguard Worker 	#if( DEBUG_C99_VA_ARGS )
1377*48a54d36SAndroid Build Coastguard Worker 		#define	debug_set_property( ... )
1378*48a54d36SAndroid Build Coastguard Worker 	#elif( DEBUG_GNU_VA_ARGS )
1379*48a54d36SAndroid Build Coastguard Worker 		#define	debug_set_property( ARGS... )
1380*48a54d36SAndroid Build Coastguard Worker 	#else
1381*48a54d36SAndroid Build Coastguard Worker 		#define	debug_set_property					while( 0 )
1382*48a54d36SAndroid Build Coastguard Worker 	#endif
1383*48a54d36SAndroid Build Coastguard Worker #endif
1384*48a54d36SAndroid Build Coastguard Worker 
1385*48a54d36SAndroid Build Coastguard Worker #if 0
1386*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines - Debugging Output ==
1387*48a54d36SAndroid Build Coastguard Worker #endif
1388*48a54d36SAndroid Build Coastguard Worker 
1389*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1390*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugPrintF
1391*48a54d36SAndroid Build Coastguard Worker 
1392*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints a debug message with printf-style formatting.
1393*48a54d36SAndroid Build Coastguard Worker 
1394*48a54d36SAndroid Build Coastguard Worker 	@param		inLevel	Error that generated this assert or noErr.
1395*48a54d36SAndroid Build Coastguard Worker 
1396*48a54d36SAndroid Build Coastguard Worker 	@param		inFormatString
1397*48a54d36SAndroid Build Coastguard Worker 					C string containing assertion text.
1398*48a54d36SAndroid Build Coastguard Worker 
1399*48a54d36SAndroid Build Coastguard Worker 	@param		VAR_ARG
1400*48a54d36SAndroid Build Coastguard Worker 					Variable number of arguments depending on the format string.
1401*48a54d36SAndroid Build Coastguard Worker 
1402*48a54d36SAndroid Build Coastguard Worker 	@result		Number of bytes printed or -1 on error.
1403*48a54d36SAndroid Build Coastguard Worker */
1404*48a54d36SAndroid Build Coastguard Worker 
1405*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1406*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT size_t		DebugPrintF( DebugLevel inLevel, const char *inFormat, ... );
1407*48a54d36SAndroid Build Coastguard Worker #endif
1408*48a54d36SAndroid Build Coastguard Worker 
1409*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1410*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugPrintFVAList
1411*48a54d36SAndroid Build Coastguard Worker 
1412*48a54d36SAndroid Build Coastguard Worker 	@abstract	va_list version of DebugPrintF. See DebugPrintF for more info.
1413*48a54d36SAndroid Build Coastguard Worker */
1414*48a54d36SAndroid Build Coastguard Worker 
1415*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1416*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT size_t		DebugPrintFVAList( DebugLevel inLevel, const char *inFormat, va_list inArgs );
1417*48a54d36SAndroid Build Coastguard Worker #endif
1418*48a54d36SAndroid Build Coastguard Worker 
1419*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1420*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugPrintAssert
1421*48a54d36SAndroid Build Coastguard Worker 
1422*48a54d36SAndroid Build Coastguard Worker 	@abstract	Prints a message describing the reason the (e.g. an assert failed), an optional error message,
1423*48a54d36SAndroid Build Coastguard Worker 				an optional source filename, an optional source line number.
1424*48a54d36SAndroid Build Coastguard Worker 
1425*48a54d36SAndroid Build Coastguard Worker 	@param		inErrorCode			Error that generated this assert or noErr.
1426*48a54d36SAndroid Build Coastguard Worker 	@param		inAssertString		C string containing assertion text.
1427*48a54d36SAndroid Build Coastguard Worker 	@param		inMessage			C string containing a message about the assert.
1428*48a54d36SAndroid Build Coastguard Worker 	@param		inFileName			C string containing path of file where the error occurred.
1429*48a54d36SAndroid Build Coastguard Worker 	@param		inLineNumber		Line number in source file where the error occurred.
1430*48a54d36SAndroid Build Coastguard Worker 	@param		inFunction			C string containing name of function where assert occurred.
1431*48a54d36SAndroid Build Coastguard Worker 
1432*48a54d36SAndroid Build Coastguard Worker 	@discussion
1433*48a54d36SAndroid Build Coastguard Worker 
1434*48a54d36SAndroid Build Coastguard Worker 	Example output:
1435*48a54d36SAndroid Build Coastguard Worker 
1436*48a54d36SAndroid Build Coastguard Worker 	[ASSERT] assert: "dataPtr != NULL" allocate memory for object failed
1437*48a54d36SAndroid Build Coastguard Worker 	[ASSERT] where:  "MyFile.c", line 123, ("MyFunction")
1438*48a54d36SAndroid Build Coastguard Worker 
1439*48a54d36SAndroid Build Coastguard Worker 	OR
1440*48a54d36SAndroid Build Coastguard Worker 
1441*48a54d36SAndroid Build Coastguard Worker 	[ASSERT] error:  -6728 (kNoMemoryErr)
1442*48a54d36SAndroid Build Coastguard Worker 	[ASSERT] where:  "MyFile.c", line 123, ("MyFunction")
1443*48a54d36SAndroid Build Coastguard Worker */
1444*48a54d36SAndroid Build Coastguard Worker 
1445*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1446*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT void
1447*48a54d36SAndroid Build Coastguard Worker 		DebugPrintAssert(
1448*48a54d36SAndroid Build Coastguard Worker 			int_least32_t	inErrorCode,
1449*48a54d36SAndroid Build Coastguard Worker 			const char *	inAssertString,
1450*48a54d36SAndroid Build Coastguard Worker 			const char *	inMessage,
1451*48a54d36SAndroid Build Coastguard Worker 			const char *	inFilename,
1452*48a54d36SAndroid Build Coastguard Worker 			int_least32_t	inLineNumber,
1453*48a54d36SAndroid Build Coastguard Worker 			const char *	inFunction );
1454*48a54d36SAndroid Build Coastguard Worker #endif
1455*48a54d36SAndroid Build Coastguard Worker 
1456*48a54d36SAndroid Build Coastguard Worker #if 0
1457*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines - Utilities ==
1458*48a54d36SAndroid Build Coastguard Worker #endif
1459*48a54d36SAndroid Build Coastguard Worker 
1460*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1461*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugSNPrintF
1462*48a54d36SAndroid Build Coastguard Worker 
1463*48a54d36SAndroid Build Coastguard Worker 	@abstract	Debugging versions of standard C snprintf with extra features.
1464*48a54d36SAndroid Build Coastguard Worker 
1465*48a54d36SAndroid Build Coastguard Worker 	@param		sbuffer		Buffer to receive result. Null terminated unless the buffer size is 0.
1466*48a54d36SAndroid Build Coastguard Worker 	@param		buflen		Size of the buffer including space for the null terminator.
1467*48a54d36SAndroid Build Coastguard Worker 	@param		fmt			printf-style format string.
1468*48a54d36SAndroid Build Coastguard Worker 	@param		VAR_ARG		Variable number of arguments depending on the format string.
1469*48a54d36SAndroid Build Coastguard Worker 
1470*48a54d36SAndroid Build Coastguard Worker 	@result		Number of characters written (minus the null terminator).
1471*48a54d36SAndroid Build Coastguard Worker 
1472*48a54d36SAndroid Build Coastguard Worker 	@discussion
1473*48a54d36SAndroid Build Coastguard Worker 
1474*48a54d36SAndroid Build Coastguard Worker 	Extra features over the standard C snprintf:
1475*48a54d36SAndroid Build Coastguard Worker 	<pre>
1476*48a54d36SAndroid Build Coastguard Worker 		64-bit support for %d (%lld), %i (%lli), %u (%llu), %o (%llo), %x (%llx), and %b (%llb).
1477*48a54d36SAndroid Build Coastguard Worker 		%@   - Cocoa/CoreFoundation object. Param is the object. Strings are used directly. Others use CFCopyDescription.
1478*48a54d36SAndroid Build Coastguard Worker 		%a   - Network Address: %.4a=IPv4, %.6a=Ethernet, %.8a Fibre Channel, %.16a=IPv6. Arg=ptr to network address.
1479*48a54d36SAndroid Build Coastguard Worker 		%#a  - IPv4 or IPv6 mDNSAddr. Arg=ptr to mDNSAddr.
1480*48a54d36SAndroid Build Coastguard Worker 		%##a - IPv4 (if AF_INET defined) or IPv6 (if AF_INET6 defined) sockaddr. Arg=ptr to sockaddr.
1481*48a54d36SAndroid Build Coastguard Worker 		%b   - Binary representation of integer (e.g. 01101011). Modifiers and arg=the same as %d, %x, etc.
1482*48a54d36SAndroid Build Coastguard Worker 		%C   - Mac-style FourCharCode (e.g. 'APPL'). Arg=32-bit value to print as a Mac-style FourCharCode.
1483*48a54d36SAndroid Build Coastguard Worker 		%H   - Hex Dump (e.g. "\x6b\xa7" -> "6B A7"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
1484*48a54d36SAndroid Build Coastguard Worker 		%#H  - Hex Dump & ASCII (e.g. "\x41\x62" -> "6B A7 'Ab'"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
1485*48a54d36SAndroid Build Coastguard Worker 		%m   - Error Message (e.g. 0 -> "kNoErr"). Modifiers and error code arg=the same as %d, %x, etc.
1486*48a54d36SAndroid Build Coastguard Worker 		%#s  - Pascal-style length-prefixed string. Arg=ptr to string.
1487*48a54d36SAndroid Build Coastguard Worker 		%##s - DNS label-sequence name. Arg=ptr to name.
1488*48a54d36SAndroid Build Coastguard Worker 		%S   - UTF-16 string, 0x0000 terminated. Host order if no BOM. Precision is UTF-16 count. Precision includes BOM.
1489*48a54d36SAndroid Build Coastguard Worker 		%#S  - Big Endian UTF-16 string (unless BOM overrides). Otherwise, the same as %S.
1490*48a54d36SAndroid Build Coastguard Worker 		%##S - Little Endian UTF-16 string (unless BOM overrides). Otherwise, the same as %S.
1491*48a54d36SAndroid Build Coastguard Worker 		%U   - Universally Unique Identifier (UUID) (e.g. 6ba7b810-9dad-11d1-80b4-00c04fd430c8). Arg=ptr to 16-byte UUID.
1492*48a54d36SAndroid Build Coastguard Worker 	</pre>
1493*48a54d36SAndroid Build Coastguard Worker */
1494*48a54d36SAndroid Build Coastguard Worker 
1495*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1496*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT size_t DebugSNPrintF(char *sbuffer, size_t buflen, const char *fmt, ...);
1497*48a54d36SAndroid Build Coastguard Worker #endif
1498*48a54d36SAndroid Build Coastguard Worker 
1499*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1500*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugSNPrintFVAList
1501*48a54d36SAndroid Build Coastguard Worker 
1502*48a54d36SAndroid Build Coastguard Worker 	@abstract	va_list version of DebugSNPrintF. See DebugSNPrintF for more info.
1503*48a54d36SAndroid Build Coastguard Worker */
1504*48a54d36SAndroid Build Coastguard Worker 
1505*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1506*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT size_t DebugSNPrintFVAList(char *sbuffer, size_t buflen, const char *fmt, va_list arg);
1507*48a54d36SAndroid Build Coastguard Worker #endif
1508*48a54d36SAndroid Build Coastguard Worker 
1509*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1510*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugGetErrorString
1511*48a54d36SAndroid Build Coastguard Worker 
1512*48a54d36SAndroid Build Coastguard Worker 	@abstract	Gets an error string from an error code.
1513*48a54d36SAndroid Build Coastguard Worker 
1514*48a54d36SAndroid Build Coastguard Worker 	@param		inStatus		Error code to get the string for.
1515*48a54d36SAndroid Build Coastguard Worker 	@param		inBuffer		Optional buffer to copy the string to for non-static strings. May be null.
1516*48a54d36SAndroid Build Coastguard Worker 	@param		inBufferSize	Size of optional buffer. May be 0.
1517*48a54d36SAndroid Build Coastguard Worker 
1518*48a54d36SAndroid Build Coastguard Worker 	@result		C string containing error string for the error code. Guaranteed to be a valid, static string. If a
1519*48a54d36SAndroid Build Coastguard Worker 				buffer is supplied, the return value will always be a pointer to the supplied buffer, which will
1520*48a54d36SAndroid Build Coastguard Worker 				contain the best available description of the error code. If a buffer is not supplied, the return
1521*48a54d36SAndroid Build Coastguard Worker 				value will be the best available description of the error code that can be represented as a static
1522*48a54d36SAndroid Build Coastguard Worker 				string. This allows code that cannot use a temporary buffer to hold the result to still get a useful
1523*48a54d36SAndroid Build Coastguard Worker 				error string in most cases, but also allows code that can use a temporary buffer to get the best
1524*48a54d36SAndroid Build Coastguard Worker 				available description.
1525*48a54d36SAndroid Build Coastguard Worker */
1526*48a54d36SAndroid Build Coastguard Worker 
1527*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1528*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT const char *	DebugGetErrorString( int_least32_t inErrorCode, char *inBuffer, size_t inBufferSize );
1529*48a54d36SAndroid Build Coastguard Worker #endif
1530*48a54d36SAndroid Build Coastguard Worker 
1531*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1532*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugHexDump
1533*48a54d36SAndroid Build Coastguard Worker 
1534*48a54d36SAndroid Build Coastguard Worker 	@abstract	Hex dumps data to a string or to the output device.
1535*48a54d36SAndroid Build Coastguard Worker */
1536*48a54d36SAndroid Build Coastguard Worker 
1537*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1538*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT size_t
1539*48a54d36SAndroid Build Coastguard Worker 		DebugHexDump(
1540*48a54d36SAndroid Build Coastguard Worker 			DebugLevel		inLevel,
1541*48a54d36SAndroid Build Coastguard Worker 			int				inIndent,
1542*48a54d36SAndroid Build Coastguard Worker 			const char * 	inLabel,
1543*48a54d36SAndroid Build Coastguard Worker 			size_t 			inLabelSize,
1544*48a54d36SAndroid Build Coastguard Worker 			int				inLabelMinWidth,
1545*48a54d36SAndroid Build Coastguard Worker 			const char *	inType,
1546*48a54d36SAndroid Build Coastguard Worker 			size_t 			inTypeSize,
1547*48a54d36SAndroid Build Coastguard Worker 			const void *	inDataStart,
1548*48a54d36SAndroid Build Coastguard Worker 			const void *	inData,
1549*48a54d36SAndroid Build Coastguard Worker 			size_t 			inDataSize,
1550*48a54d36SAndroid Build Coastguard Worker 			DebugFlags	 	inFlags,
1551*48a54d36SAndroid Build Coastguard Worker 			char *			outBuffer,
1552*48a54d36SAndroid Build Coastguard Worker 			size_t			inBufferSize );
1553*48a54d36SAndroid Build Coastguard Worker #endif
1554*48a54d36SAndroid Build Coastguard Worker 
1555*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1556*48a54d36SAndroid Build Coastguard Worker 	#define	dloghex( LEVEL, INDENT, LABEL, LABEL_SIZE, LABEL_MIN_SIZE, TYPE, TYPE_SIZE, DATA_START, DATA, DATA_SIZE, FLAGS, BUFFER, BUFFER_SIZE )	\
1557*48a54d36SAndroid Build Coastguard Worker 		DebugHexDump( ( LEVEL ), (INDENT), ( LABEL ), ( LABEL_SIZE ), ( LABEL_MIN_SIZE ), ( TYPE ), ( TYPE_SIZE ), 								\
1558*48a54d36SAndroid Build Coastguard Worker 			( DATA_START ), ( DATA ), ( DATA_SIZE ), ( FLAGS ), ( BUFFER ), ( BUFFER_SIZE ) )
1559*48a54d36SAndroid Build Coastguard Worker #else
1560*48a54d36SAndroid Build Coastguard Worker 	#define	dloghex( LEVEL, INDENT, LABEL, LABEL_SIZE, LABEL_MIN_SIZE, TYPE, TYPE_SIZE, DATA_START, DATA, DATA_SIZE, FLAGS, BUFFER, BUFFER_SIZE )
1561*48a54d36SAndroid Build Coastguard Worker #endif
1562*48a54d36SAndroid Build Coastguard Worker 
1563*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1564*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugTaskLevel
1565*48a54d36SAndroid Build Coastguard Worker 
1566*48a54d36SAndroid Build Coastguard Worker 	@abstract	Returns the current task level.
1567*48a54d36SAndroid Build Coastguard Worker 
1568*48a54d36SAndroid Build Coastguard Worker 	@result		Current task level
1569*48a54d36SAndroid Build Coastguard Worker 
1570*48a54d36SAndroid Build Coastguard Worker 	@discussion
1571*48a54d36SAndroid Build Coastguard Worker 
1572*48a54d36SAndroid Build Coastguard Worker 	Bit masks to isolate portions of the result (note that some masks may also need bit shifts to right justify):
1573*48a54d36SAndroid Build Coastguard Worker 	<pre>
1574*48a54d36SAndroid Build Coastguard Worker 		kDebugInterruptLevelMask				- Indicates the current interrupt level (> 0 means interrupt time).
1575*48a54d36SAndroid Build Coastguard Worker 		kDebugInVBLTaskMask						- Indicates if a VBL task is currently being executed.
1576*48a54d36SAndroid Build Coastguard Worker 		kDebugInDeferredTaskMask				- Indicates if a Deferred Task is currently being executed.
1577*48a54d36SAndroid Build Coastguard Worker 		kDebugInSecondaryInterruptHandlerMask	- Indicates if a Secondary Interrupt Handler is currently being executed.
1578*48a54d36SAndroid Build Coastguard Worker 		kDebugPageFaultFatalMask				- Indicates if it is unsafe to cause a page fault (worse than interrupt time).
1579*48a54d36SAndroid Build Coastguard Worker 		kDebugMPTaskLevelMask					- Indicates if being called from an MP task.
1580*48a54d36SAndroid Build Coastguard Worker 		kDebugInterruptDepthMask				- 0 means task level, 1 means in interrupt, > 1 means in nested interrupt.
1581*48a54d36SAndroid Build Coastguard Worker 	</pre>
1582*48a54d36SAndroid Build Coastguard Worker 
1583*48a54d36SAndroid Build Coastguard Worker 	Helpers:
1584*48a54d36SAndroid Build Coastguard Worker 	<pre>
1585*48a54d36SAndroid Build Coastguard Worker 		DebugExtractTaskLevelInterruptDepth()   - Macro to extract interrupt depth from task level value.
1586*48a54d36SAndroid Build Coastguard Worker 	</pre>
1587*48a54d36SAndroid Build Coastguard Worker */
1588*48a54d36SAndroid Build Coastguard Worker 
1589*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1590*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT uint32_t	DebugTaskLevel( void );
1591*48a54d36SAndroid Build Coastguard Worker #endif
1592*48a54d36SAndroid Build Coastguard Worker 
1593*48a54d36SAndroid Build Coastguard Worker //---------------------------------------------------------------------------------------------------------------------------
1594*48a54d36SAndroid Build Coastguard Worker /*!	@function	DebugServicesTest
1595*48a54d36SAndroid Build Coastguard Worker 
1596*48a54d36SAndroid Build Coastguard Worker 	@abstract	Unit test.
1597*48a54d36SAndroid Build Coastguard Worker */
1598*48a54d36SAndroid Build Coastguard Worker 
1599*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
1600*48a54d36SAndroid Build Coastguard Worker 	DEBUG_EXPORT OSStatus	DebugServicesTest( void );
1601*48a54d36SAndroid Build Coastguard Worker #endif
1602*48a54d36SAndroid Build Coastguard Worker 
1603*48a54d36SAndroid Build Coastguard Worker #ifdef	__cplusplus
1604*48a54d36SAndroid Build Coastguard Worker 	}
1605*48a54d36SAndroid Build Coastguard Worker #endif
1606*48a54d36SAndroid Build Coastguard Worker 
1607*48a54d36SAndroid Build Coastguard Worker #endif	// __DEBUG_SERVICES__
1608