147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* -*- Mode: C; tab-width: 4 -*-
247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * you may not use this file except in compliance with the License.
747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * You may obtain a copy of the License at
847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *     http://www.apache.org/licenses/LICENSE-2.0
1047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
1147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
1247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
1347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * See the License for the specific language governing permissions and
1547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * limitations under the License.
1647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt */
1747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
1847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
1947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@header		DebugServices
2047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Debugging Library
2247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
2347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#ifndef	__DEBUG_SERVICES__
2547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	__DEBUG_SERVICES__
2647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include	<stdarg.h>
2847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include	"CommonServices.h"
3047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_VXWORKS )
3247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	"logLib.h"
3347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
3447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
3647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Settings ==
3747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
3847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
4047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Settings
4147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
4247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// General
4447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG ) )
4647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG		0
4747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
4847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( defined( NDEBUG ) && DEBUG )
5047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#error NDEBUG defined and DEBUG is also enabled...they need to be in-sync
5147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
5247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// AssertMacros.h/Debugging.h overrides.
5447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG_OVERRIDE_APPLE_MACROS ) )
5647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_OVERRIDE_APPLE_MACROS		1
5747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
5847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Routine name. Uses ISO __func__ where possible. Otherwise, uses the best thing that is available (if anything).
6047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( defined( __MWERKS__ ) || ( __GNUC__ > 2 ) || ( ( __GNUC__ == 2 ) && ( __GNUC_MINOR__ >= 9 ) ) )
6247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	__ROUTINE__					__func__
6347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#elif( defined( __GNUC__ ) )
6447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	__ROUTINE__					__PRETTY_FUNCTION__
6547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#elif( defined( _MSC_VER ) && !defined( _WIN32_WCE ) )
6647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	__ROUTINE__					__FUNCTION__
6747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
6847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	__ROUTINE__					""
6947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
7047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Variable argument macro support. Use ANSI C99 __VA_ARGS__ where possible. Otherwise, use the next best thing.
7247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( defined( __GNUC__ ) )
7447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( ( __GNUC__ > 3 ) || ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 3) ) )
7547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_C99_VA_ARGS		1
7647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_GNU_VA_ARGS		0
7747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
7847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_C99_VA_ARGS		0
7947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_GNU_VA_ARGS		1
8047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
8147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#elif( defined( __MWERKS__ ) )
8247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_C99_VA_ARGS			1
8347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_GNU_VA_ARGS			0
8447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
8547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_C99_VA_ARGS			0
8647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_GNU_VA_ARGS			0
8747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
8847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
9047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Output ==
9147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
9247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
9447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_FPRINTF_ENABLED
9547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Enables ANSI C fprintf output.
9747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
9847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG_FPRINTF_ENABLED ) )
10047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( !TARGET_API_MAC_OSX_KERNEL && !TARGET_OS_WINDOWS_CE )
10147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_FPRINTF_ENABLED			1
10247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
10347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_FPRINTF_ENABLED			0
10447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
10547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
10647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TARGET_API_MAC_OSX_KERNEL || TARGET_OS_WINDOWS_CE )
10747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#error fprintf enabled, but not supported on Mac OS X kernel or Windows CE
10847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
10947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
11047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
11147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
11247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_MAC_OS_X_IOLOG_ENABLED
11347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
11447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Enables IOLog (Mac OS X Kernel) output.
11547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
11647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
11747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG_MAC_OS_X_IOLOG_ENABLED ) )
11847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_MAC_OS_X_IOLOG_ENABLED		TARGET_API_MAC_OSX_KERNEL
11947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
12047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
12147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
12247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_KPRINTF_ENABLED
12347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
12447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Enables kprintf (Mac OS X Kernel) output.
12547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
12647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
12747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG_KPRINTF_ENABLED ) )
12847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_KPRINTF_ENABLED				TARGET_API_MAC_OSX_KERNEL
12947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
13047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
13247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_IDEBUG_ENABLED
13347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Enables iDebug (Mac OS X user and Kernel) output.
13547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
13747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	For Mac OS X kernel development, iDebug is enabled by default because we can dynamically check for the presence
13947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	of iDebug via some exported IOKit symbols. Mac OS X app usage doesn't allow dynamic detection because it relies
14047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	on statically linking to the iDebugServices.cp file so for Mac OS X app usage, you have to manually enable iDebug.
14147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
14247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG_IDEBUG_ENABLED ) )
14447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_IDEBUG_ENABLED				TARGET_API_MAC_OSX_KERNEL
14547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
14647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
14847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_CORE_SERVICE_ASSERTS_ENABLED
14947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
15047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Controls whether Core Services assert handling is enabled. Enabling requires CoreServices framework.
15147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
15247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
15347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( DEBUG_CORE_SERVICE_ASSERTS_ENABLED ) )
15447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( __DEBUGGING__ ) )
15547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_CORE_SERVICE_ASSERTS_ENABLED		1
15647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
15747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DEBUG_CORE_SERVICE_ASSERTS_ENABLED		0
15847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
15947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
16047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
16247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	DebugOutputType
16347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Type of debug output (i.e. where the output goes).
16547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
16647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef uint32_t			DebugOutputType;
16847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeNone				0x6E6F6E65U	// 'none' - no params
17047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeCustom				0x63757374U	// 'cust' - 1st param = function ptr, 2nd param = context
17147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeFPrintF				0x66707269U	// 'fpri' - 1st param = DebugOutputTypeFlags [, 2nd param = filename]
17247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeiDebug				0x69646267U	// 'idbg' - no params
17347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeKPrintF				0x6B707266U	// 'kprf' - no params
17447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeMacOSXIOLog			0x696C6F67U	// 'ilog' - no params
17547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeMacOSXLog			0x786C6F67U	// 'xlog' - no params
17647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeWindowsDebugger		0x77696E64U	// 'wind' - no params
17747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeWindowsEventLog		0x7765766CU	// 'wevl' - 1st param = C-string name, 2nd param = HMODULE or NULL.
17847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
17947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Console meta output kind - Any kind of Console output (in horizontal order of preference):
18047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//
18147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Mac OS X			= ANSI printf (viewable in Console.app)
18247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Mac OS X Kernel	= IOLog (/var/log/system.log) or kprintf (serial).
18347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Windows			= ANSI printf (Console window) or OutputDebugString (debugger).
18447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Other			= ANSI printf (viewer varies).
18547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
18647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugOutputTypeMetaConsole			0x434F4E53U	// 'CONS' - no params
18747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
18847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
18947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	DebugOutputTypeFlags
19047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
19147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Flags controlling how the output type is configured.
19247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
19347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@constant	kDebugOutputTypeFlagsTypeMask	Bit mask for the output type (e.g. stdout, stderr, file, etc.).
19447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@constant	kDebugOutputTypeFlagsStdOut		fprintf should go to stdout.
19547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@constant	kDebugOutputTypeFlagsStdErr		fprintf should go to stderr.
19647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@constant	kDebugOutputTypeFlagsFile		fprintf should go to a specific file (filename passed as va_arg).
19747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
19847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
19947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef unsigned int		DebugOutputTypeFlags;
20047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugOutputTypeFlagsTypeMask	0xF
20247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugOutputTypeFlagsStdOut		1
20347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugOutputTypeFlagsStdErr		2
20447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugOutputTypeFlagsFile		10
20547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
20747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	DebugOutputFunctionPtr
20847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Function ptr for a custom callback to print debug output.
21047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
21147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef void ( *DebugOutputFunctionPtr )( char *inData, size_t inSize, void *inContext );
21347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
21547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Constants
21647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
21747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
21947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Flags ==
22047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
22147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
22347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	DebugFlags
22447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Flags controlling how output is printed.
22647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
22747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef uint32_t		DebugFlags;
22947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
23047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNone					0
23147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNoAddress			( 1 << 0 )
23247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNoOffset				( 1 << 1 )
23347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlags32BitOffset			( 1 << 2 )
23447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNoASCII				( 1 << 3 )
23547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNoNewLine			( 1 << 4 )
23647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlags8BitSeparator		( 1 << 5 )
23747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlags16BitSeparator		( 1 << 6 )
23847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNo32BitSeparator		( 1 << 7 )
23947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNo16ByteHexPad		( 1 << 8 )
24047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugFlagsNoByteCount			( 1 << 9 )
24147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
24347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@enum		DebugTaskLevelFlags
24447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Flags indicating the task level.
24647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
24747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltenum
24947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
25047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugInterruptLevelShift				= 0,
25147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugInterruptLevelMask		  		= 0x00000007,
25247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugInVBLTaskMask			  			= 0x00000010,
25347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugInDeferredTaskMask		 		= 0x00000020,
25447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt    kDebugInSecondaryInterruptHandlerMask  	= 0x00000040,
25547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugPageFaultFatalMask 				= 0x00000100, 	// There should be a "kPageFaultFatalMask" in Debugging.h.
25647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugMPTaskLevelMask					= 0x00000200, 	// There should be a "kMPTaskLevelMask" in Debugging.h.
25747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugInterruptDepthShift				= 16,
25847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kDebugInterruptDepthMask				= 0x00FF0000
25947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt};
26047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
26147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	DebugExtractTaskLevelInterruptLevel( LEVEL )	\
26247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	( ( ( LEVEL ) & kDebugInterruptLevelMask ) >> kDebugInterruptLevelShift )
26347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
26447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	DebugExtractTaskLevelInterruptDepth( LEVEL )	\
26547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	( ( ( LEVEL ) & kDebugInterruptDepthMask ) >> kDebugInterruptDepthShift )
26647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
26747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
26847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Levels ==
26947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
27047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
27147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
27247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Constants & Types - Levels
27347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
27447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
27547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
27647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	DebugLevel
27747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
27847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Level used to control debug logging.
27947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
28047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
28147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef int32_t			DebugLevel;
28247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
28347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Levels
28447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
28547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelMask					0x0000FFFF
28647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelChatty				100
28747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelVerbose				500
28847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelTrace 				800
28947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelInfo 				1000
29047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelNotice				3000
29147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelWarning				5000
29247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelAssert 				6000
29347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelRequire				7000
29447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelError				8000
29547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelCritical				9000
29647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelAlert				10000
29747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelEmergency			11000
29847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelTragic				12000
29947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelMax					0x0000FFFF
30047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Level Flags
30247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelFlagMask				0xFFFF0000
30447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelFlagStackTrace		0x00010000
30547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kDebugLevelFlagDebugBreak		0x00020000
30647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
30847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	LogLevel
30947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
31047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Level used to control which events are logged.
31147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
31247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
31347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef int32_t						LogLevel;
31447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
31547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kLogLevelUninitialized		-1L
31647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelAll				0L
31747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelChatty				100L
31847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelVerbose			500L
31947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelTrace 				800L
32047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelInfo 				1000L
32147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelNotice				3000L
32247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelWarning			4000L
32347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelAssert 			6000L
32447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelRequire			7000L
32547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelError				8000L
32647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelCritical			9000L
32747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelAlert				10000L
32847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelEmergency			11000L
32947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelTragic				12000L
33047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define kLogLevelOff				0x0000FFFEL
33147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
33247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
33347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Properties ==
33447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
33547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
33647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
33747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@typedef	DebugPropertyTag
33847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
33947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Tag for properties.
34047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
34147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalttypedef uint32_t		DebugPropertyTag;
34347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugPropertyTagPrintLevelMin		0x6D696E70U		// 'minp'	Get: 1st param = DebugLevel *
34547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt															//			Set: 1st param = DebugLevel
34647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugPropertyTagPrintLevel			kDebugPropertyTagPrintLevelMin
34847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugPropertyTagPrintLevelMax		0x706D786CU		// 'maxp'	Get: 1st param = DebugLevel *
35047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt															//			Set: 1st param = DebugLevel
35147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
35247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	kDebugPropertyTagBreakLevel			0x62726B6CU		// 'brkl'	Get: 1st param = DebugLevel *
35347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt															//			Set: 1st param = DebugLevel
35447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
35547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == General macros ==
35647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
35747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
35847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
35947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_UNUSED
36047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macro to mark a paramter as unused to avoid unused parameter warnings.
36247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
36447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	There is no universally supported pragma/attribute for indicating a variable is unused. DEBUG_UNUSED lets us
36647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	indicate a variable is unused in a manner that is supported by most compilers.
36747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
36847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	DEBUG_UNUSED( X )			(void)( X )
37047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
37247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_USE_ONLY
37347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macro to mark a variable as used only when debugging is enabled.
37547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
37747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Variables are sometimes needed only for debugging. When debugging is turned off, these debug-only variables generate
37947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	compiler warnings about unused variables. To eliminate these warnings, use these macros to indicate variables that
38047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	are only used for debugging.
38147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
38247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
38347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
38447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_USE_ONLY( X )
38547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
38647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_USE_ONLY( X )		(void)( X )
38747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
38847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
38947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
39047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_LOCAL
39147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macros to make variables and functions static when debugging is off, but extern when debugging is on.
39347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
39547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Rather than using "static" directly, using this macros allows you to access these variables external while
39747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	debugging without being penalized for production builds.
39847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
39947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
40047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
40147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_LOCAL
40247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
40347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_LOCAL			static
40447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
40547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
40647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
40747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_STATIC
40847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
40947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macros to make variables and functions static when debugging is off, but extern when debugging is on.
41047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
41247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Rather than using "static" directly, using this macros allows you to access these variables external while
41447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	debugging without being penalized for production builds.
41547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
41647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
41847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_STATIC
41947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
42047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_STATIC	static
42147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
42247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
42447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DEBUG_EXPORT
42547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macros to export variables.
42747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
42947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
43047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	"__private_extern__" is a hack for IOKit to allow symbols to be exported from compilation units, but
43147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// not exported outside a driver (IOKit uses a lame global namespace for symbols). This still does not
43247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// solve the problem of multiple drivers in the same dependency chain since they share symbols.
43347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
43447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
43547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_API_MAC_OSX_KERNEL )
43647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_EXPORT		__private_extern__
43747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
43847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DEBUG_EXPORT		extern
43947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
44047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
44247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	debug_add
44347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macro to add (or subtract if negative) a value when debugging is on. Does nothing if debugging is off.
44547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
44647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
44847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_add( A, B )		( A ) += ( B )
44947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
45047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_add( A, B )
45147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
45247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
45447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	debug_perform
45547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Macro to perform something in debug-only builds.
45747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
45847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
46047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_perform( X )		do { X; } while( 0 )
46147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
46247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_perform( X )
46347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
46447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
46647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	translate_errno
46747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Returns 0 if the test success. If the test fails, returns errno if non-zero and othewise the alternate error.
46947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
47047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define translate_errno( TEST, ERRNO, ALTERNATE_ERROR )		( ( TEST ) ? 0 : ( ERRNO ) ? ( ERRNO ) : ( ALTERNATE_ERROR ) )
47247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
47447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Compile Time macros ==
47547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
47647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
47847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_compile_time
47947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Performs a compile-time check of something such as the size of an int.
48147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
48347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	This declares an array with a size that is determined by a compile-time expression. If the expression evaluates
48547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	to 0, the array has a size of -1, which is illegal and generates a compile-time error.
48647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	For example:
48847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_compile_time( sizeof( int ) == 4 );
49047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Note: This only works with compile-time expressions.
49247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Note: This only works in places where extern declarations are allowed (e.g. global scope).
49347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	References:
49547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<http://www.jaggersoft.com/pubs/CVu11_3.html>
49747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<http://www.jaggersoft.com/pubs/CVu11_5.html>
49847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Note: The following macros differ from the macros on the www.jaggersoft.com web site because those versions do not
50047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	work with GCC due to GCC allow a zero-length array. Using a -1 condition turned out to be more portable.
50147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
50247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	check_compile_time( X )		extern int debug_compile_time_name[ ( X ) ? 1 : -1 ]
50447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
50647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_compile_time_code
50747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Perform a compile-time check, suitable for placement in code, of something such as the size of an int.
50947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
51147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	This creates a switch statement with an existing case for 0 and an additional case using the result of a
51347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	compile-time expression. A switch statement cannot have two case labels with the same constant so if the
51447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	compile-time expression evaluates to 0, it is illegal and generates a compile-time error. If the compile-time
51547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	expression does not evaluate to 0, the resulting value is used as the case label and it compiles without error.
51647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	For example:
51847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_compile_time_code( sizeof( int ) == 4 );
52047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Note: This only works with compile-time expressions.
52247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Note: This does not work in a global scope so it must be inside a function.
52347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	References:
52547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<http://www.jaggersoft.com/pubs/CVu11_3.html>
52747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<http://www.jaggersoft.com/pubs/CVu11_5.html>
52847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
52947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	check_compile_time_code( X )	switch( 0 ) { case 0: case X:; }
53147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
53347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == check macros ==
53447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
53547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
53747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check
53847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Check that an expression is true (non-zero).
54047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
54247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
54447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) using the default debugging output method.
54547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Code inside check() statements is not compiled into production builds.
54747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
54847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
55047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef check
55147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
55247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( check ) )
55347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
55447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check( X )																					\
55547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																								\
55647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
55747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( !( X ) ) 																				\
55847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{																							\
55947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );						\
56047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}																							\
56147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			} while( 0 )
56247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
56347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check( X )
56447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
56547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
56647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
56747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
56847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_string
56947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Check that an expression is true (non-zero) with an explanation.
57147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
57347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
57547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) and a custom explanation string using the default debugging output method.
57647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Code inside check_string() statements is not compiled into production builds.
57847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
57947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
58047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
58147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef check_string
58247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
58347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( check_string ) )
58447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
58547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_string( X, STR )																		\
58647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																								\
58747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
58847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( !( X ) ) 																				\
58947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{																							\
59047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ );						\
59147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}																							\
59247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
59347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}	while( 0 )
59447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
59547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_string( X, STR )
59647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
59747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
59847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
59947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
60047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_noerr
60147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
60247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Check that an error code is noErr (0).
60347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
60447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
60547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
60647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
60747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) using the default debugging output method.
60847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
60947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Code inside check_noerr() statements is not compiled into production builds.
61047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
61147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
61247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
61347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef check_noerr
61447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
61547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( check_noerr ) )
61647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
61747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_noerr( ERR )																			\
61847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																								\
61947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
62047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				int_least32_t		localErr;																\
62147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
62247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				localErr = (int_least32_t)( ERR );															\
62347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( localErr != 0 ) 																		\
62447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{																							\
62547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ );			\
62647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}																							\
62747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
62847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}	while( 0 )
62947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
63047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_noerr( ERR )
63147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
63247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
63347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
63447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
63547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_noerr_string
63647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
63747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Check that an error code is noErr (0) with an explanation.
63847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
63947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
64047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
64147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
64247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) and a custom explanation string using the default debugging output method.
64347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
64447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Code inside check_noerr_string() statements is not compiled into production builds.
64547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
64647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
64747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
64847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef check_noerr_string
64947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
65047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( check_noerr_string ) )
65147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
65247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_noerr_string( ERR, STR )																\
65347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																								\
65447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
65547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				int_least32_t		localErr;																\
65647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
65747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				localErr = (int_least32_t)( ERR );															\
65847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( localErr != 0 ) 																		\
65947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{																							\
66047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );				\
66147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}																							\
66247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
66347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}	while( 0 )
66447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
66547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_noerr_string( ERR, STR )
66647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
66747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
66847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
66947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
67047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_translated_errno
67147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
67247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Check a condition and prints errno (if non-zero) to the log.
67347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
67447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
67547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
67647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Code inside check_translated_errno() statements is not compiled into production builds.
67747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
67847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
67947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( check_translated_errno ) )
68047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
68147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )										\
68247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																								\
68347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
68447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( !( TEST ) ) 																			\
68547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{																							\
68647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					int_least32_t		localErr;															\
68747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
68847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					localErr = (int_least32_t)( ERRNO );													\
68947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					localErr = ( localErr != 0 ) ? localErr : (int_least32_t)( ALTERNATE_ERROR );			\
69047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					debug_print_assert( localErr, #TEST, NULL, __FILE__, __LINE__, __ROUTINE__ );			\
69147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}																							\
69247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
69347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			} 	while( 0 )
69447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
69547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )
69647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
69747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
69847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
69947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
70047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	check_ptr_overlap
70147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
70247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Checks that two ptrs do not overlap.
70347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
70447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
70547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	check_ptr_overlap( P1, P1_SIZE, P2, P2_SIZE )										\
70647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	do																						\
70747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{																						\
70847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( !( ( (uintptr_t)( P1 ) >=     (uintptr_t)( P2 ) ) && 						\
70947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				  ( (uintptr_t)( P1 ) <  ( ( (uintptr_t)( P2 ) ) + ( P2_SIZE ) ) ) ) );		\
71047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( !( ( (uintptr_t)( P2 ) >=     (uintptr_t)( P1 ) ) && 						\
71147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				  ( (uintptr_t)( P2 ) <  ( ( (uintptr_t)( P1 ) ) + ( P1_SIZE ) ) ) ) );		\
71247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																							\
71347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}	while( 0 )
71447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
71547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
71647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == require macros ==
71747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
71847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
71947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
72047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require
72147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
72247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluate to true.
72347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
72447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
72547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
72647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
72747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) using the default debugging output method then jumps to a label.
72847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
72947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
73047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
73147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require
73247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
73347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require ) )
73447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require( X, LABEL )																				\
73547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
73647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
73747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
73847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
73947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );							\
74047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
74147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
74247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
74347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
74447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
74547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
74647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
74747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_string
74847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
74947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluate to true with an explanation.
75047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
75147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
75247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
75347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
75447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) and a custom explanation string using the default debugging output method then jumps to a label.
75547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
75647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
75747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
75847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_string
75947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
76047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_string ) )
76147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_string( X, LABEL, STR )																	\
76247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
76347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
76447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
76547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
76647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ );							\
76747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
76847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
76947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
77047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
77147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
77247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
77347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
77447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_quiet
77547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
77647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluate to true.
77747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
77847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
77947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
78047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this jumps to a label. No debugging information is printed.
78147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
78247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
78347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
78447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_quiet
78547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
78647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_quiet ) )
78747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_quiet( X, LABEL )																		\
78847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
78947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
79047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
79147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
79247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
79347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
79447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
79547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
79647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
79747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
79847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
79947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_noerr
80047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Require that an error code is noErr (0).
80247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
80447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
80647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) using the default debugging output method then jumps to a label.
80747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
80847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
81047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_noerr
81147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
81247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_noerr ) )
81347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr( ERR, LABEL )																		\
81447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
81547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
81647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int_least32_t		localErr;																	\
81747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
81847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			localErr = (int_least32_t)( ERR );																\
81947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( localErr != 0 ) 																			\
82047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
82147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ );				\
82247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
82347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
82447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
82547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
82647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
82747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
82847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
82947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_noerr_string
83047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
83147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Require that an error code is noErr (0).
83247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
83347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
83447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
83547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
83647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.), and a custom explanation string using the default debugging output method using the
83747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	default debugging output method then jumps to a label.
83847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
83947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
84047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
84147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_noerr_string
84247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
84347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_noerr_string ) )
84447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_string( ERR, LABEL, STR )															\
84547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
84647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
84747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int_least32_t		localErr;																	\
84847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
84947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			localErr = (int_least32_t)( ERR );																\
85047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( localErr != 0 ) 																			\
85147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
85247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );					\
85347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
85447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
85547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
85647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
85747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
85847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
85947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
86047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_noerr_action_string
86147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
86247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Require that an error code is noErr (0).
86347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
86447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
86547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
86647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
86747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.), and a custom explanation string using the default debugging output method using the
86847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	default debugging output method then executes an action and jumps to a label.
86947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
87047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
87147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
87247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_noerr_action_string
87347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
87447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_noerr_action_string ) )
87547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_string( ERR, LABEL, ACTION, STR )											\
87647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
87747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
87847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int_least32_t		localErr;																	\
87947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
88047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			localErr = (int_least32_t)( ERR );																\
88147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( localErr != 0 ) 																			\
88247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
88347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );					\
88447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ ACTION; }																					\
88547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
88647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
88747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
88847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
88947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
89047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
89147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
89247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_noerr_quiet
89347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
89447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Require that an error code is noErr (0).
89547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
89647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
89747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
89847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this jumps to a label. No debugging information is printed.
89947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
90047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
90147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
90247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_noerr_quiet
90347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
90447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_noerr_quiet ) )
90547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_quiet( ERR, LABEL )																\
90647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
90747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
90847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( ( ERR ) != 0 ) 																				\
90947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
91047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
91147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
91247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
91347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
91447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
91547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
91647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
91747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_noerr_action
91847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
91947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Require that an error code is noErr (0) with an action to execute otherwise.
92047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
92147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
92247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
92347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this prints debugging information (actual expression string, file, line number,
92447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) using the default debugging output method then executes an action and jumps to a label.
92547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
92647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
92747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
92847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_noerr_action
92947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
93047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_noerr_action ) )
93147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action( ERR, LABEL, ACTION )														\
93247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
93347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
93447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int_least32_t		localErr;																	\
93547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
93647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			localErr = (int_least32_t)( ERR );																\
93747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( localErr != 0 ) 																			\
93847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
93947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ );				\
94047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ ACTION; }																					\
94147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
94247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
94347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
94447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
94547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
94647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
94747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
94847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_noerr_action_quiet
94947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
95047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Require that an error code is noErr (0) with an action to execute otherwise.
95147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
95247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
95347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
95447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the error code is non-0, this executes an action and jumps to a label. No debugging information is printed.
95547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
95647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
95747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
95847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_noerr_action_quiet
95947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
96047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_noerr_action_quiet ) )
96147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_quiet( ERR, LABEL, ACTION )												\
96247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
96347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
96447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( ( ERR ) != 0 ) 																				\
96547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
96647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ ACTION; }																					\
96747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
96847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
96947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
97047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
97147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
97247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
97347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
97447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_action
97547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
97647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluate to true with an action to execute otherwise.
97747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
97847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
97947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
98047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
98147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) using the default debugging output method then executes an action and jumps to a label.
98247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
98347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
98447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
98547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_action
98647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
98747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_action ) )
98847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action( X, LABEL, ACTION )																\
98947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
99047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
99147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
99247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
99347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );							\
99447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ ACTION; }																					\
99547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
99647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
99747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
99847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
99947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
100047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
100247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_action_quiet
100347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluate to true with an action to execute otherwise.
100547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
100747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this executes an action and jumps to a label. No debugging information is printed.
100947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
101047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
101147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
101247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_action_quiet
101347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
101447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_action_quiet ) )
101547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_quiet( X, LABEL, ACTION )														\
101647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
101747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
101847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
101947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
102047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ ACTION; }																					\
102147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
102247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
102347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
102447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
102547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
102647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
102747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
102847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_action_string
102947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluate to true with an explanation and action to execute otherwise.
103147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
103347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If expression evalulates to false, this prints debugging information (actual expression string, file, line number,
103547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	function name, etc.) and a custom explanation string using the default debugging output method then executes an
103647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	action and jumps to a label.
103747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
103847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
104047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef require_action_string
104147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
104247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( require_action_string ) )
104347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_string( X, LABEL, ACTION, STR )													\
104447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
104547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
104647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
104747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
104847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ );						\
104947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ ACTION; }																					\
105047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				goto LABEL;																					\
105147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
105247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
105347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
105447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
105547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
105647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
105747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
105847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	require_throw
105947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
106047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Requires that an expression evaluates to true or an exception is thrown.
106147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
106247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
106347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
106447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	If the expression evaluates to false, this prints debugging information (actual expression string, file,
106547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	line number, function name, etc.) using the default debugging output method then throws an exception.
106647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
106747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
106847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( defined( __cplusplus ) )
106947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_throw( X )																				\
107047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		do 																									\
107147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{																									\
107247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( X ) ) 																					\
107347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																								\
107447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ );							\
107547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				throw kUnknownErr;																			\
107647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}																								\
107747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																											\
107847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}	while( 0 )
107947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
108047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
108147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
108247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Design-By-Contract macros ==
108347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
108447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
108547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
108647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Design-By-Contract macros
108747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
108847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
108947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	ensure( X )													check( X )
109047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	ensure_string( X, STR )										check_string( X, STR )
109147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	ensure_noerr( ERR )											check_noerr( ERR )
109247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	ensure_noerr_string( ERR, STR )								check_noerr_string( ERR, STR )
109347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define	ensure_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )		check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR )
109447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
109547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Note: Design-By-Contract "require" macros are already defined elsewhere.
109647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
109747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
109847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Expect macros ==
109947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
110047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
110147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
110247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Expect macros
110347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
110447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
110547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Expect macros allow code to include runtime checking of things that should not happen in shipping code (e.g. internal
110647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// programmer errors, such as a NULL parameter where it is not allowed). Once the code has been verified to work correctly
110747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// without asserting, the DEBUG_EXPECT_VERIFIED conditional can be set to eliminate the error checking entirely. It can
110847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// also be useful to measure the cost of error checking code by profiling with it enable and with it disabled.
110947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
111047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_EXPECT_VERIFIED )
111147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_expect
111247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_string_expect
111347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_quiet_expect
111447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_expect
111547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_string_expect
111647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_string_expect
111747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_quiet_expect
111847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_expect
111947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_quiet_expect
112047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_expect
112147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_quiet_expect
112247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_string_expect
112347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
112447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_expect							require
112547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_string_expect					require_string
112647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_quiet_expect					require_quiet
112747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_expect					require_noerr
112847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_string_expect				require_noerr_string
112947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_string_expect		require_noerr_action_string
113047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_quiet_expect				require_noerr_quiet
113147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_expect				require_noerr_action
113247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_noerr_action_quiet_expect		require_noerr_action_quiet
113347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_expect					require_action
113447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_quiet_expect				require_action_quiet
113547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	require_action_string_expect			require_action_string
113647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
113747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
113847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
113947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Output macros ==
114047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
114147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
114247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
114347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	debug_string
114447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
114547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints a debugging C string.
114647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
114747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
114847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_OVERRIDE_APPLE_MACROS )
114947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#undef debug_string
115047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
115147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !defined( debug_string ) )
115247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
115347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_string( STR )																		\
115447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																							\
115547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{																							\
115647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				debug_print_assert( 0, NULL, STR, __FILE__, __LINE__, __ROUTINE__ );					\
115747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																										\
115847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}	while( 0 )
115947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
116047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_string( STR )
116147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
116247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
116347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
116447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
116547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	debug_print_assert
116647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
116747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints an assertion.
116847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
116947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
117047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
117147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_print_assert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION )	\
117247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugPrintAssert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION )
117347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
117447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_print_assert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION )
117547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
117647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
117747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
117847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	dlog
117947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
118047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints a debug-only message.
118147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
118247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
118347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
118447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
118547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	dlog( ... )			DebugPrintF( __VA_ARGS__ )
118647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
118747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	dlog( ARGS... )		DebugPrintF( ## ARGS )
118847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
118947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	dlog				DebugPrintF
119047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
119147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
119247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
119347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	dlog( ... )
119447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
119547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	dlog( ARGS... )
119647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
119747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	dlog				while( 0 )
119847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
119947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
120047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
120147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
120247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	dlogv
120347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
120447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints a debug-only message.
120547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
120647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
120747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
120847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	dlogv( LEVEL, FORMAT, LIST )		DebugPrintFVAList( ( LEVEL ), ( FORMAT ), ( LIST ) )
120947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
121047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	dlogv( LEVEL, FORMAT, LIST )
121147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
121247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
121347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
121447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	dlogmem
121547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
121647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints a debug-only dump of memory.
121747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
121847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
121947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
122047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	dlogmem( LEVEL, PTR, SIZE )		\
122147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugHexDump( ( LEVEL ), 0, NULL, 0, 0, NULL, 0, ( PTR ), ( PTR ), ( SIZE ), kDebugFlagsNone, NULL, 0 )
122247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
122347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	dlogmem( LEVEL, PTR, SIZE )
122447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
122547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
122647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
122747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DebugNSLog
122847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
122947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Debug-only macro for the Cocoa NSLog function.
123047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
123147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
123247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
123347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
123447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DebugNSLog( ... )			NSLog( __VA_ARGS__ )
123547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
123647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DebugNSLog( ARGS... )		NSLog( ## ARGS )
123747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
123847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DebugNSLog					NSLog
123947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
124047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
124147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
124247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DebugNSLog( ... )
124347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
124447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DebugNSLog( ARGS... )
124547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
124647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	DebugNSLog					while( 0 )
124747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
124847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
124947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
125047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
125147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@defined	DebugLogMsg
125247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
125347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Debug-only macro for the VxWorks logMsg function.
125447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
125547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
125647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_VXWORKS )
125747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG )
125847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define DebugLogMsg( LEVEL, FORMAT, P1, P2, P3, P4, P5, P6 )							\
125947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			do 																					\
126047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{ 																					\
126147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( ( inLevel >= gDebugPrintLevelMin ) || ( inLevel <= gDebugPrintLevelMax ) )	\
126247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{																				\
126347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					logMsg( ( FORMAT ), ( P1 ), ( P2 ), ( P3 ), ( P4 ), ( P5 ), ( P6 ) );		\
126447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}																				\
126547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt																								\
126647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}	while( 0 )
126747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
126847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define DebugLogMsg( LEVEL, FORMAT, P1, P2, P3, P4, P5, P6 )
126947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
127047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
127147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	DebugLogMsg		dlog
127247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
127347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
127447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
127547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Routines - General ==
127647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
127747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
127847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#ifdef	__cplusplus
127947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	extern "C" {
128047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
128147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
128247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
128347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugInitialize
128447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
128547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Initializes the debugging library for a specific kind of output.
128647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
128747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inType
128847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		varArg		Variable number parameters, controlled by the "inType" parameter.
128947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
129047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
129147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
129247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT OSStatus	DebugInitialize( DebugOutputType inType, ... );
129347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
129447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
129547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
129647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
129747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_initialize( ... )			DebugInitialize( __VA_ARGS__ )
129847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
129947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_initialize( ARGS... )		DebugInitialize( ## ARGS )
130047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
130147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_initialize				DebugInitialize
130247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
130347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
130447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
130547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_initialize( ... )
130647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
130747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_initialize( ARGS... )
130847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
130947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_initialize				while( 0 )
131047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
131147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
131247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
131347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
131447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugFinalize
131547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
131647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Releases any resources used by the debugging library
131747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
131847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
131947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
132047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT void		DebugFinalize( void );
132147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
132247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
132347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
132447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_terminate()	DebugFinalize()
132547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
132647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	debug_terminate()
132747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
132847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
132947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
133047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugGetProperty
133147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
133247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Gets the specified property from the debugging library.
133347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
133447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
133547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
133647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT OSStatus	DebugGetProperty( DebugPropertyTag inTag, ... );
133747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
133847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
133947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
134047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
134147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_get_property( ... )			DebugGetProperty( __VA_ARGS__ )
134247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
134347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_get_property( ARGS... )		DebugGetProperty( ## ARGS )
134447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
134547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_get_property					DebugGetProperty
134647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
134747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
134847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
134947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_get_property( ... )
135047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
135147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_get_property( ARGS... )
135247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
135347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_get_property					while( 0 )
135447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
135547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
135647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
135747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
135847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugSetProperty
135947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
136047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Sets the specified property from the debugging library.
136147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
136247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
136347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
136447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT OSStatus	DebugSetProperty( DebugPropertyTag inTag, ... );
136547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
136647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
136747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
136847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
136947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_set_property( ... )			DebugSetProperty( __VA_ARGS__ )
137047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
137147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_set_property( ARGS... )		DebugSetProperty( ## ARGS )
137247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
137347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_set_property					DebugSetProperty
137447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
137547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
137647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( DEBUG_C99_VA_ARGS )
137747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_set_property( ... )
137847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#elif( DEBUG_GNU_VA_ARGS )
137947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_set_property( ARGS... )
138047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
138147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	debug_set_property					while( 0 )
138247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
138347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
138447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
138547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
138647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Routines - Debugging Output ==
138747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
138847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
138947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
139047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugPrintF
139147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
139247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints a debug message with printf-style formatting.
139347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
139447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inLevel	Error that generated this assert or noErr.
139547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
139647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inFormatString
139747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					C string containing assertion text.
139847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
139947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		VAR_ARG
140047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					Variable number of arguments depending on the format string.
140147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
140247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@result		Number of bytes printed or -1 on error.
140347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
140447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
140547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
140647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT size_t		DebugPrintF( DebugLevel inLevel, const char *inFormat, ... );
140747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
140847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
140947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
141047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugPrintFVAList
141147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
141247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	va_list version of DebugPrintF. See DebugPrintF for more info.
141347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
141447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
141547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
141647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT size_t		DebugPrintFVAList( DebugLevel inLevel, const char *inFormat, va_list inArgs );
141747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
141847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
141947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
142047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugPrintAssert
142147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
142247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Prints a message describing the reason the (e.g. an assert failed), an optional error message,
142347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				an optional source filename, an optional source line number.
142447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
142547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inErrorCode			Error that generated this assert or noErr.
142647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inAssertString		C string containing assertion text.
142747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inMessage			C string containing a message about the assert.
142847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inFileName			C string containing path of file where the error occurred.
142947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inLineNumber		Line number in source file where the error occurred.
143047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inFunction			C string containing name of function where assert occurred.
143147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
143247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
143347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
143447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Example output:
143547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
143647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	[ASSERT] assert: "dataPtr != NULL" allocate memory for object failed
143747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	[ASSERT] where:  "MyFile.c", line 123, ("MyFunction")
143847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
143947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OR
144047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
144147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	[ASSERT] error:  -6728 (kNoMemoryErr)
144247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	[ASSERT] where:  "MyFile.c", line 123, ("MyFunction")
144347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
144447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
144547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
144647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT void
144747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugPrintAssert(
144847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int_least32_t	inErrorCode,
144947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *	inAssertString,
145047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *	inMessage,
145147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *	inFilename,
145247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int_least32_t	inLineNumber,
145347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *	inFunction );
145447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
145547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
145647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
145747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Routines - Utilities ==
145847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
145947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
146047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
146147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugSNPrintF
146247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
146347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Debugging versions of standard C snprintf with extra features.
146447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
146547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		sbuffer		Buffer to receive result. Null terminated unless the buffer size is 0.
146647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		buflen		Size of the buffer including space for the null terminator.
146747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		fmt			printf-style format string.
146847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		VAR_ARG		Variable number of arguments depending on the format string.
146947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
147047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@result		Number of characters written (minus the null terminator).
147147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
147247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
147347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
147447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Extra features over the standard C snprintf:
147547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<pre>
147647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		64-bit support for %d (%lld), %i (%lli), %u (%llu), %o (%llo), %x (%llx), and %b (%llb).
147747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%@   - Cocoa/CoreFoundation object. Param is the object. Strings are used directly. Others use CFCopyDescription.
147847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%a   - Network Address: %.4a=IPv4, %.6a=Ethernet, %.8a Fibre Channel, %.16a=IPv6. Arg=ptr to network address.
147947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%#a  - IPv4 or IPv6 mDNSAddr. Arg=ptr to mDNSAddr.
148047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%##a - IPv4 (if AF_INET defined) or IPv6 (if AF_INET6 defined) sockaddr. Arg=ptr to sockaddr.
148147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%b   - Binary representation of integer (e.g. 01101011). Modifiers and arg=the same as %d, %x, etc.
148247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%C   - Mac-style FourCharCode (e.g. 'APPL'). Arg=32-bit value to print as a Mac-style FourCharCode.
148347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%H   - Hex Dump (e.g. "\x6b\xa7" -> "6B A7"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
148447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%#H  - Hex Dump & ASCII (e.g. "\x41\x62" -> "6B A7 'Ab'"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
148547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%m   - Error Message (e.g. 0 -> "kNoErr"). Modifiers and error code arg=the same as %d, %x, etc.
148647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%#s  - Pascal-style length-prefixed string. Arg=ptr to string.
148747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%##s - DNS label-sequence name. Arg=ptr to name.
148847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%S   - UTF-16 string, 0x0000 terminated. Host order if no BOM. Precision is UTF-16 count. Precision includes BOM.
148947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%#S  - Big Endian UTF-16 string (unless BOM overrides). Otherwise, the same as %S.
149047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%##S - Little Endian UTF-16 string (unless BOM overrides). Otherwise, the same as %S.
149147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		%U   - Universally Unique Identifier (UUID) (e.g. 6ba7b810-9dad-11d1-80b4-00c04fd430c8). Arg=ptr to 16-byte UUID.
149247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	</pre>
149347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
149447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
149547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
149647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT size_t DebugSNPrintF(char *sbuffer, size_t buflen, const char *fmt, ...);
149747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
149847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
149947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
150047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugSNPrintFVAList
150147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
150247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	va_list version of DebugSNPrintF. See DebugSNPrintF for more info.
150347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
150447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
150547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
150647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT size_t DebugSNPrintFVAList(char *sbuffer, size_t buflen, const char *fmt, va_list arg);
150747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
150847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
150947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
151047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugGetErrorString
151147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
151247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Gets an error string from an error code.
151347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
151447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inStatus		Error code to get the string for.
151547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inBuffer		Optional buffer to copy the string to for non-static strings. May be null.
151647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@param		inBufferSize	Size of optional buffer. May be 0.
151747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
151847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@result		C string containing error string for the error code. Guaranteed to be a valid, static string. If a
151947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				buffer is supplied, the return value will always be a pointer to the supplied buffer, which will
152047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				contain the best available description of the error code. If a buffer is not supplied, the return
152147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				value will be the best available description of the error code that can be represented as a static
152247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				string. This allows code that cannot use a temporary buffer to hold the result to still get a useful
152347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				error string in most cases, but also allows code that can use a temporary buffer to get the best
152447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				available description.
152547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
152647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
152747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
152847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT const char *	DebugGetErrorString( int_least32_t inErrorCode, char *inBuffer, size_t inBufferSize );
152947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
153047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
153147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
153247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugHexDump
153347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
153447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Hex dumps data to a string or to the output device.
153547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
153647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
153747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
153847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT size_t
153947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugHexDump(
154047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugLevel		inLevel,
154147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int				inIndent,
154247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char * 	inLabel,
154347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t 			inLabelSize,
154447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			int				inLabelMinWidth,
154547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *	inType,
154647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t 			inTypeSize,
154747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const void *	inDataStart,
154847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const void *	inData,
154947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t 			inDataSize,
155047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugFlags	 	inFlags,
155147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			char *			outBuffer,
155247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t			inBufferSize );
155347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
155447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
155547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
155647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	dloghex( LEVEL, INDENT, LABEL, LABEL_SIZE, LABEL_MIN_SIZE, TYPE, TYPE_SIZE, DATA_START, DATA, DATA_SIZE, FLAGS, BUFFER, BUFFER_SIZE )	\
155747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugHexDump( ( LEVEL ), (INDENT), ( LABEL ), ( LABEL_SIZE ), ( LABEL_MIN_SIZE ), ( TYPE ), ( TYPE_SIZE ), 								\
155847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			( DATA_START ), ( DATA ), ( DATA_SIZE ), ( FLAGS ), ( BUFFER ), ( BUFFER_SIZE ) )
155947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
156047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#define	dloghex( LEVEL, INDENT, LABEL, LABEL_SIZE, LABEL_MIN_SIZE, TYPE, TYPE_SIZE, DATA_START, DATA, DATA_SIZE, FLAGS, BUFFER, BUFFER_SIZE )
156147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
156247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
156347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
156447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugTaskLevel
156547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
156647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Returns the current task level.
156747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
156847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@result		Current task level
156947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
157047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@discussion
157147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
157247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Bit masks to isolate portions of the result (note that some masks may also need bit shifts to right justify):
157347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<pre>
157447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugInterruptLevelMask				- Indicates the current interrupt level (> 0 means interrupt time).
157547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugInVBLTaskMask						- Indicates if a VBL task is currently being executed.
157647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugInDeferredTaskMask				- Indicates if a Deferred Task is currently being executed.
157747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugInSecondaryInterruptHandlerMask	- Indicates if a Secondary Interrupt Handler is currently being executed.
157847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugPageFaultFatalMask				- Indicates if it is unsafe to cause a page fault (worse than interrupt time).
157947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugMPTaskLevelMask					- Indicates if being called from an MP task.
158047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugInterruptDepthMask				- 0 means task level, 1 means in interrupt, > 1 means in nested interrupt.
158147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	</pre>
158247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
158347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	Helpers:
158447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	<pre>
158547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugExtractTaskLevelInterruptDepth()   - Macro to extract interrupt depth from task level value.
158647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	</pre>
158747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
158847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
158947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
159047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT uint32_t	DebugTaskLevel( void );
159147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
159247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
159347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//---------------------------------------------------------------------------------------------------------------------------
159447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/*!	@function	DebugServicesTest
159547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
159647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	@abstract	Unit test.
159747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
159847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
159947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
160047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_EXPORT OSStatus	DebugServicesTest( void );
160147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
160247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
160347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#ifdef	__cplusplus
160447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
160547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
160647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
160747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif	// __DEBUG_SERVICES__
1608