/* -*- Mode: C; tab-width: 4 -*-
 *
 * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *     http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.

    Change History (most recent first):
    
$Log: DebugServices.c,v $
Revision 1.6  2006/08/14 23:24:56  cheshire
Re-licensed mDNSResponder daemon source code under Apache License, Version 2.0

Revision 1.5  2004/09/17 01:08:57  cheshire
Renamed mDNSClientAPI.h to mDNSEmbeddedAPI.h
  The name "mDNSClientAPI.h" is misleading to new developers looking at this code. The interfaces
  declared in that file are ONLY appropriate to single-address-space embedded applications.
  For clients on general-purpose computers, the interfaces defined in dns_sd.h should be used.

Revision 1.4  2004/04/15 08:59:08  bradley
Removed deprecated debug and log levels and replaced them with modern equivalents.

Revision 1.3  2004/04/08 09:29:55  bradley
Manually do host->network byte order conversion to avoid needing libraries for htons/htonl. Changed
hex dumps to better separate hex and ASCII. Added support for %.8a syntax in DebugSNPrintF for Fibre
Channel addresses (00:11:22:33:44:55:66:77). Fixed a few places where HeaderDoc was incorrect.

Revision 1.2  2004/03/07 05:59:34  bradley
Sync'd with internal version: Added expect macros, error codes, and CoreServices exclusion.

Revision 1.1  2004/01/30 02:27:30  bradley
Debugging support for various platforms.


	To Do:
	
	- Use StackWalk on Windows to optionally print stack frames.
*/

#if 0
#pragma mark == Includes ==
#endif

//===========================================================================================================================
//	Includes
//===========================================================================================================================

#if( !KERNEL )
	#include	<ctype.h>
	#include	<stdio.h>
	#include	<string.h>
#endif

#include	"CommonServices.h"

#include	"DebugServices.h"

#if( DEBUG )

#if( TARGET_OS_VXWORKS )
	#include	"intLib.h"
#endif

#if( TARGET_OS_WIN32 )
	#include	<time.h>
	
	#if( !TARGET_OS_WINDOWS_CE )
		#include	<fcntl.h>
		#include	<io.h>
	#endif
#endif

#if( DEBUG_IDEBUG_ENABLED && TARGET_API_MAC_OSX_KERNEL )
	#include	<IOKit/IOLib.h>
#endif

// If MDNS_DEBUGMSGS is defined (even if defined 0), it is aware of mDNS and it is probably safe to include mDNSEmbeddedAPI.h.

#if( defined( MDNS_DEBUGMSGS ) )
	#include	"mDNSEmbeddedAPI.h"
#endif

#if 0
#pragma mark == Macros ==
#endif

//===========================================================================================================================
//	Macros
//===========================================================================================================================

#define DebugIsPrint( C )		( ( ( C ) >= 0x20 ) && ( ( C ) <= 0x7E ) )

#if 0
#pragma mark == Prototypes ==
#endif

//===========================================================================================================================
//	Prototypes
//===========================================================================================================================

static OSStatus	DebugPrint( DebugLevel inLevel, char *inData, size_t inSize );

// fprintf

#if( DEBUG_FPRINTF_ENABLED )
	static OSStatus	DebugFPrintFInit( DebugOutputTypeFlags inFlags, const char *inFilename );
	static void		DebugFPrintFPrint( char *inData, size_t inSize );
#endif

// iDebug (Mac OS X user and kernel)

#if( DEBUG_IDEBUG_ENABLED )
	static OSStatus	DebugiDebugInit( void );
	static void		DebugiDebugPrint( char *inData, size_t inSize );
#endif

// kprintf (Mac OS X Kernel)

#if( DEBUG_KPRINTF_ENABLED )
	static void	DebugKPrintFPrint( char *inData, size_t inSize );
#endif

// Mac OS X IOLog (Mac OS X Kernel)

#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
	static void	DebugMacOSXIOLogPrint( char *inData, size_t inSize );
#endif

// Mac OS X Log

#if( TARGET_OS_MAC )
	static OSStatus	DebugMacOSXLogInit( void );
	static void		DebugMacOSXLogPrint( char *inData, size_t inSize );
#endif

// Windows Debugger

#if( TARGET_OS_WIN32 )
	static void	DebugWindowsDebuggerPrint( char *inData, size_t inSize );
#endif

// Windows Event Log

#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
	static OSStatus	DebugWindowsEventLogInit( const char *inName, HMODULE inModule );
	static void	DebugWindowsEventLogPrint( DebugLevel inLevel, char *inData, size_t inSize );
#endif

// DebugLib support

#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
	static pascal void	
		DebugAssertOutputHandler( 
			OSType 				inComponentSignature, 
			UInt32 				inOptions, 
			const char *		inAssertionString, 
			const char *		inExceptionString, 
			const char *		inErrorString, 
			const char *		inFileName, 
			long 				inLineNumber, 
			void *				inValue, 
			ConstStr255Param 	inOutputMsg );
#endif

// Utilities

static char *	DebugNumVersionToString( uint32_t inVersion, char *inString );

#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
	static void	DebugWinEnableConsole( void );
#endif

#if( TARGET_OS_WIN32 )
	static TCHAR *
		DebugWinCharToTCharString( 
			const char *	inCharString, 
			size_t 			inCharCount, 
			TCHAR *			outTCharString, 
			size_t 			inTCharCountMax, 
			size_t *		outTCharCount );
#endif

#if 0
#pragma mark == Globals ==
#endif

//===========================================================================================================================
//	Private Globals
//===========================================================================================================================

#if( TARGET_OS_VXWORKS )
	// TCP States for inetstatShow.

	extern char **	pTcpstates;		// defined in tcpLib.c

	const char *		kDebugTCPStates[] =
	{
		"(0)  TCPS_CLOSED", 
		"(1)  TCPS_LISTEN", 
		"(2)  TCPS_SYN_SENT", 
		"(3)  TCPS_SYN_RECEIVED", 
		"(4)  TCPS_ESTABLISHED", 
		"(5)  TCPS_CLOSE_WAIT", 
		"(6)  TCPS_FIN_WAIT_1", 
		"(7)  TCPS_CLOSING", 
		"(8)  TCPS_LAST_ACK", 
		"(9)  TCPS_FIN_WAIT_2", 
		"(10) TCPS_TIME_WAIT",
	};
#endif

// General

static bool									gDebugInitialized				= false;
static DebugOutputType						gDebugOutputType 				= kDebugOutputTypeNone;
static DebugLevel							gDebugPrintLevelMin				= kDebugLevelInfo;
static DebugLevel							gDebugPrintLevelMax				= kDebugLevelMax;
static DebugLevel							gDebugBreakLevel				= kDebugLevelAssert;
#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
	static DebugAssertOutputHandlerUPP		gDebugAssertOutputHandlerUPP	= NULL;
#endif

// Custom

static DebugOutputFunctionPtr				gDebugCustomOutputFunction 		= NULL;
static void *								gDebugCustomOutputContext 		= NULL;

// fprintf

#if( DEBUG_FPRINTF_ENABLED )
	static FILE *							gDebugFPrintFFile 				= NULL;
#endif

// MacOSXLog

#if( TARGET_OS_MAC )
	typedef int	( *DebugMacOSXLogFunctionPtr )( const char *inFormat, ... );
	
	static DebugMacOSXLogFunctionPtr		gDebugMacOSXLogFunction			= NULL;
#endif

// WindowsEventLog


#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
	static HANDLE							gDebugWindowsEventLogEventSource = NULL;
#endif

#if 0
#pragma mark -
#pragma mark == General ==
#endif

//===========================================================================================================================
//	DebugInitialize
//===========================================================================================================================

DEBUG_EXPORT OSStatus	DebugInitialize( DebugOutputType inType, ... )
{
	OSStatus			err;
	DebugOutputType		type;
	va_list				args;
	
	va_start( args, inType );

#if( TARGET_OS_VXWORKS )
	// Set up the TCP state strings if they are not already set up by VxWorks (normally not set up for some reason).
	
	if( !pTcpstates )
	{
		pTcpstates = (char **) kDebugTCPStates;
	}
#endif
	
	// Set up DebugLib stuff (if building with Debugging.h).
	
#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
	if( !gDebugAssertOutputHandlerUPP )
	{
		gDebugAssertOutputHandlerUPP = NewDebugAssertOutputHandlerUPP( DebugAssertOutputHandler );
		check( gDebugAssertOutputHandlerUPP );
		if( gDebugAssertOutputHandlerUPP )
		{
			InstallDebugAssertOutputHandler( gDebugAssertOutputHandlerUPP );
		}
	}
#endif
	
	// Pre-process meta-output kind to pick an appropriate output kind for the platform.
	
	type = inType;
	if( type == kDebugOutputTypeMetaConsole )
	{
		#if( TARGET_OS_MAC )
			type = kDebugOutputTypeMacOSXLog;
		#elif( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
			#if( DEBUG_FPRINTF_ENABLED )
				type = kDebugOutputTypeFPrintF;
			#else
				type = kDebugOutputTypeWindowsDebugger;
			#endif
		#elif( TARGET_API_MAC_OSX_KERNEL )
			#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
				type = kDebugOutputTypeMacOSXIOLog;
			#elif( DEBUG_IDEBUG_ENABLED )
				type = kDebugOutputTypeiDebug;
			#elif( DEBUG_KPRINTF_ENABLED )
				type = kDebugOutputTypeKPrintF;
			#endif
		#elif( TARGET_OS_VXWORKS )
			#if( DEBUG_FPRINTF_ENABLED )
				type = kDebugOutputTypeFPrintF;
			#else
				#error target is VxWorks, but fprintf output is disabled
			#endif
		#else
			#if( DEBUG_FPRINTF_ENABLED )
				type = kDebugOutputTypeFPrintF;
			#endif
		#endif
	}
	
	// Process output kind.
	
	gDebugOutputType = type;
	switch( type )
	{
		case kDebugOutputTypeNone:
			err = kNoErr;
			break;

		case kDebugOutputTypeCustom:
			gDebugCustomOutputFunction = va_arg( args, DebugOutputFunctionPtr );
			gDebugCustomOutputContext  = va_arg( args, void * );
			err = kNoErr;
			break;

#if( DEBUG_FPRINTF_ENABLED )
		case kDebugOutputTypeFPrintF:
			if( inType == kDebugOutputTypeMetaConsole )
			{
				err = DebugFPrintFInit( kDebugOutputTypeFlagsStdErr, NULL );
			}
			else
			{
				DebugOutputTypeFlags		flags;
				const char *				filename;
				
				flags = (DebugOutputTypeFlags) va_arg( args, unsigned int );
				if( ( flags & kDebugOutputTypeFlagsTypeMask ) == kDebugOutputTypeFlagsFile )
				{
					filename = va_arg( args, const char * );
				}
				else
				{
					filename = NULL;
				}
				err = DebugFPrintFInit( flags, filename );
			}
			break;
#endif

#if( DEBUG_IDEBUG_ENABLED )
		case kDebugOutputTypeiDebug:
			err = DebugiDebugInit();
			break;
#endif

#if( DEBUG_KPRINTF_ENABLED )
		case kDebugOutputTypeKPrintF:
			err = kNoErr;
			break;
#endif

#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
		case kDebugOutputTypeMacOSXIOLog:
			err = kNoErr;
			break;
#endif

#if( TARGET_OS_MAC )
		case kDebugOutputTypeMacOSXLog:
			err = DebugMacOSXLogInit();
			break;
#endif

#if( TARGET_OS_WIN32 )
		case kDebugOutputTypeWindowsDebugger:
			err = kNoErr;
			break;
#endif

#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
		case kDebugOutputTypeWindowsEventLog:
		{
			const char *		name;
			HMODULE				module;
			
			name   = va_arg( args, const char * );
			module = va_arg( args, HMODULE );
			err = DebugWindowsEventLogInit( name, module );
		}
		break;
#endif

		default:
			err = kParamErr;
			goto exit;
	}
	gDebugInitialized = true;
	
exit:
	va_end( args );
	return( err );
}

//===========================================================================================================================
//	DebugFinalize
//===========================================================================================================================

DEBUG_EXPORT void		DebugFinalize( void )
{
#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
	check( gDebugAssertOutputHandlerUPP );
	if( gDebugAssertOutputHandlerUPP )
	{
		InstallDebugAssertOutputHandler( NULL );
		DisposeDebugAssertOutputHandlerUPP( gDebugAssertOutputHandlerUPP );
		gDebugAssertOutputHandlerUPP = NULL;
	}
#endif
}

//===========================================================================================================================
//	DebugGetProperty
//===========================================================================================================================

DEBUG_EXPORT OSStatus	DebugGetProperty( DebugPropertyTag inTag, ... )
{
	OSStatus			err;
	va_list				args;
	DebugLevel *		level;
	
	va_start( args, inTag );
	switch( inTag )
	{
		case kDebugPropertyTagPrintLevelMin:
			level  = va_arg( args, DebugLevel * );
			*level = gDebugPrintLevelMin;
			err = kNoErr;
			break;
		
		case kDebugPropertyTagPrintLevelMax:
			level  = va_arg( args, DebugLevel * );
			*level = gDebugPrintLevelMax;
			err = kNoErr;
			break;
		
		case kDebugPropertyTagBreakLevel:
			level  = va_arg( args, DebugLevel * );
			*level = gDebugBreakLevel;
			err = kNoErr;
			break;		
		
		default:
			err = kUnsupportedErr;
			break;
	}
	va_end( args );
	return( err );
}

//===========================================================================================================================
//	DebugSetProperty
//===========================================================================================================================

DEBUG_EXPORT OSStatus	DebugSetProperty( DebugPropertyTag inTag, ... )
{
	OSStatus		err;
	va_list			args;
	DebugLevel		level;
	
	va_start( args, inTag );
	switch( inTag )
	{
		case kDebugPropertyTagPrintLevelMin:
			level  = va_arg( args, DebugLevel );
			gDebugPrintLevelMin = level;
			err = kNoErr;
			break;
		
		case kDebugPropertyTagPrintLevelMax:
			level  = va_arg( args, DebugLevel );
			gDebugPrintLevelMax = level;
			err = kNoErr;
			break;
		
		case kDebugPropertyTagBreakLevel:
			level  = va_arg( args, DebugLevel );
			gDebugBreakLevel = level;
			err = kNoErr;
			break;		
		
		default:
			err = kUnsupportedErr;
			break;
	}
	va_end( args );
	return( err );
}

#if 0
#pragma mark -
#pragma mark == Output ==
#endif

//===========================================================================================================================
//	DebugPrintF
//===========================================================================================================================

DEBUG_EXPORT size_t	DebugPrintF( DebugLevel inLevel, const char *inFormat, ... )
{	
	va_list		args;
	size_t		n;
	
	// Skip if the level is not in the enabled range..
	
	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
	{
		n = 0;
		goto exit;
	}
	
	va_start( args, inFormat );
	n = DebugPrintFVAList( inLevel, inFormat, args );
	va_end( args );

exit:
	return( n );
}

//===========================================================================================================================
//	DebugPrintFVAList
//===========================================================================================================================

DEBUG_EXPORT size_t	DebugPrintFVAList( DebugLevel inLevel, const char *inFormat, va_list inArgs )
{
	size_t		n;
	char		buffer[ 512 ];
	
	// Skip if the level is not in the enabled range..
	
	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
	{
		n = 0;
		goto exit;
	}
	
	n = DebugSNPrintFVAList( buffer, sizeof( buffer ), inFormat, inArgs );
	DebugPrint( inLevel, buffer, (size_t) n );

exit:
	return( n );
}

//===========================================================================================================================
//	DebugPrint
//===========================================================================================================================

static OSStatus	DebugPrint( DebugLevel inLevel, char *inData, size_t inSize )
{
	OSStatus		err;
	
	// Skip if the level is not in the enabled range..
	
	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
	{
		err = kRangeErr;
		goto exit;
	}
	
	// Printing is not safe at interrupt time so check for this and warn with an interrupt safe mechanism (if available).
	
	if( DebugTaskLevel() & kDebugInterruptLevelMask )
	{
		#if( TARGET_OS_VXWORKS )
			logMsg( "\ncannot print at interrupt time\n\n", 1, 2, 3, 4, 5, 6 );
		#endif
		
		err = kExecutionStateErr;
		goto exit;
	}
	
	// Initialize the debugging library if it hasn't already been initialized (allows for zero-config usage).
	
	if( !gDebugInitialized )
	{
		debug_initialize( kDebugOutputTypeMetaConsole );
	}
	
	// Print based on the current output type.
	
	switch( gDebugOutputType )
	{
		case kDebugOutputTypeNone:
			break;
		
		case kDebugOutputTypeCustom:
			if( gDebugCustomOutputFunction )
			{
				gDebugCustomOutputFunction( inData, inSize, gDebugCustomOutputContext );
			}
			break;

#if( DEBUG_FPRINTF_ENABLED )
		case kDebugOutputTypeFPrintF:
			DebugFPrintFPrint( inData, inSize );
			break;
#endif

#if( DEBUG_IDEBUG_ENABLED )
		case kDebugOutputTypeiDebug:
			DebugiDebugPrint( inData, inSize );
			break;
#endif

#if( DEBUG_KPRINTF_ENABLED )
		case kDebugOutputTypeKPrintF:
			DebugKPrintFPrint( inData, inSize );
			break;
#endif

#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
		case kDebugOutputTypeMacOSXIOLog:
			DebugMacOSXIOLogPrint( inData, inSize );
			break;
#endif

#if( TARGET_OS_MAC )
		case kDebugOutputTypeMacOSXLog:
			DebugMacOSXLogPrint( inData, inSize );
			break;
#endif

#if( TARGET_OS_WIN32 )
		case kDebugOutputTypeWindowsDebugger:
			DebugWindowsDebuggerPrint( inData, inSize );
			break;
#endif

#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
		case kDebugOutputTypeWindowsEventLog:
			DebugWindowsEventLogPrint( inLevel, inData, inSize );
			break;
#endif

		default:
			break;
	}
	err = kNoErr;
	
exit:
	return( err );
}

//===========================================================================================================================
//	DebugPrintAssert
//
//	Warning: This routine relies on several of the strings being string constants that will exist forever because the
//           underlying logMsg API that does the printing is asynchronous so it cannot use temporary/stack-based 
//           pointer variables (e.g. local strings). The debug macros that invoke this function only use constant 
//           constant strings, but if this function is invoked directly from other places, it must use constant strings.
//===========================================================================================================================

DEBUG_EXPORT void
	DebugPrintAssert( 
		int_least32_t	inErrorCode, 
		const char *	inAssertString, 
		const char *	inMessage, 
		const char *	inFilename, 
		int_least32_t	inLineNumber, 
		const char *	inFunction )
{
	// Skip if the level is not in the enabled range..
	
	if( ( kDebugLevelAssert < gDebugPrintLevelMin ) || ( kDebugLevelAssert > gDebugPrintLevelMax ) )
	{
		return;
	}
	
	if( inErrorCode != 0 )
	{
		DebugPrintF( 
			kDebugLevelAssert, 
			"\n"
			"[ASSERT] error:  %ld (%m)\n"
			"[ASSERT] where:  \"%s\", line %ld, \"%s\"\n"
			"\n", 
			inErrorCode, inErrorCode, 
			inFilename ? inFilename : "", 
			inLineNumber, 
			inFunction ? inFunction : "" );
	}
	else
	{
		DebugPrintF( 
			kDebugLevelAssert, 
			"\n"
			"[ASSERT] assert: \"%s\" %s\n"
			"[ASSERT] where:  \"%s\", line %ld, \"%s\"\n"
			"\n", 
			inAssertString ? inAssertString : "", 
			inMessage ? inMessage : "", 
			inFilename ? inFilename : "", 
			inLineNumber, 
			inFunction ? inFunction : "" );
	}
	
	// Break into the debugger if enabled.
	
	#if( TARGET_OS_WIN32 )
		if( gDebugBreakLevel <= kDebugLevelAssert )
		{
			if( IsDebuggerPresent() )
			{
				DebugBreak();
			}
		}
	#endif
}

#if 0
#pragma mark -
#endif

#if( DEBUG_FPRINTF_ENABLED )
//===========================================================================================================================
//	DebugFPrintFInit
//===========================================================================================================================

static OSStatus	DebugFPrintFInit( DebugOutputTypeFlags inFlags, const char *inFilename )
{
	OSStatus					err;
	DebugOutputTypeFlags		typeFlags;
	
	typeFlags = inFlags & kDebugOutputTypeFlagsTypeMask;
	if( typeFlags == kDebugOutputTypeFlagsStdOut )
	{
		#if( TARGET_OS_WIN32 )
			DebugWinEnableConsole();
		#endif

		gDebugFPrintFFile = stdout;
	}
	else if( typeFlags == kDebugOutputTypeFlagsStdErr )
	{
		#if( TARGET_OS_WIN32 )
			DebugWinEnableConsole();
		#endif
		
		gDebugFPrintFFile = stdout;
	}
	else if( typeFlags == kDebugOutputTypeFlagsFile )
	{
		require_action_quiet( inFilename && ( *inFilename != '\0' ), exit, err = kOpenErr );
		
		gDebugFPrintFFile = fopen( inFilename, "a" );
		require_action_quiet( gDebugFPrintFFile, exit, err = kOpenErr );
	}
	else
	{
		err = kParamErr;
		goto exit;
	}
	err = kNoErr;
	
exit:
	return( err );
}

//===========================================================================================================================
//	DebugFPrintFPrint
//===========================================================================================================================

static void	DebugFPrintFPrint( char *inData, size_t inSize )
{
	char *		p;
	char *		q;
	
	// Convert \r to \n. fprintf will interpret \n and convert to whatever is appropriate for the platform.
	
	p = inData;
	q = p + inSize;
	while( p < q )
	{
		if( *p == '\r' )
		{
			*p = '\n';
		}
		++p;
	}
	
	// Write the data and flush.
	
	if( gDebugFPrintFFile )
	{
		fprintf( gDebugFPrintFFile, "%.*s", (int) inSize, inData );
		fflush( gDebugFPrintFFile );
	}
}
#endif	// DEBUG_FPRINTF_ENABLED

#if( DEBUG_IDEBUG_ENABLED )
//===========================================================================================================================
//	DebugiDebugInit
//===========================================================================================================================

static OSStatus	DebugiDebugInit( void )
{
	OSStatus		err;
	
	#if( TARGET_API_MAC_OSX_KERNEL )
		
		extern uint32_t *		_giDebugReserved1;
		
		// Emulate the iDebugSetOutputType macro in iDebugServices.h.
		// Note: This is not thread safe, but neither is iDebugServices.h nor iDebugKext.
		
		if( !_giDebugReserved1 )
		{
			_giDebugReserved1 = (uint32_t *) IOMalloc( sizeof( uint32_t ) );
			require_action_quiet( _giDebugReserved1, exit, err = kNoMemoryErr );
		}
		*_giDebugReserved1 = 0x00010000U;
		err = kNoErr;
exit:
	#else
		
		__private_extern__ void	iDebugSetOutputTypeInternal( uint32_t inType );
		
		iDebugSetOutputTypeInternal( 0x00010000U );
		err = kNoErr;
		
	#endif
	
	return( err );
}

//===========================================================================================================================
//	DebugiDebugPrint
//===========================================================================================================================

static void	DebugiDebugPrint( char *inData, size_t inSize )
{
	#if( TARGET_API_MAC_OSX_KERNEL )
		
		// Locally declared here so we do not need to include iDebugKext.h.
		// Note: IOKit uses a global namespace for all code and only a partial link occurs at build time. When the 
		// KEXT is loaded, the runtime linker will link in this extern'd symbol (assuming iDebug is present).
		// _giDebugLogInternal is actually part of IOKit proper so this should link even if iDebug is not present.
		
		typedef void ( *iDebugLogFunctionPtr )( uint32_t inLevel, uint32_t inTag, const char *inFormat, ... );
		
		extern iDebugLogFunctionPtr		_giDebugLogInternal;
		
		if( _giDebugLogInternal )
		{
			_giDebugLogInternal( 0, 0, "%.*s", (int) inSize, inData );
		}
		
	#else
	
		__private_extern__ void	iDebugLogInternal( uint32_t inLevel, uint32_t inTag, const char *inFormat, ... );
		
		iDebugLogInternal( 0, 0, "%.*s", (int) inSize, inData );
	
	#endif
}
#endif

#if( DEBUG_KPRINTF_ENABLED )
//===========================================================================================================================
//	DebugKPrintFPrint
//===========================================================================================================================

static void	DebugKPrintFPrint( char *inData, size_t inSize )
{
	extern void	kprintf( const char *inFormat, ... );
	
	kprintf( "%.*s", (int) inSize, inData );
}
#endif

#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
//===========================================================================================================================
//	DebugMacOSXIOLogPrint
//===========================================================================================================================

static void	DebugMacOSXIOLogPrint( char *inData, size_t inSize )
{
	extern void	IOLog( const char *inFormat, ... );
	
	IOLog( "%.*s", (int) inSize, inData );
}
#endif

#if( TARGET_OS_MAC )
//===========================================================================================================================
//	DebugMacOSXLogInit
//===========================================================================================================================

static OSStatus	DebugMacOSXLogInit( void )
{
	OSStatus		err;
	CFStringRef		path;
	CFURLRef		url;
	CFBundleRef		bundle;
	CFStringRef		functionName;
	void *			functionPtr;
	
	bundle = NULL;
	
	// Create a bundle reference for System.framework.
	
	path = CFSTR( "/System/Library/Frameworks/System.framework" );
	url = CFURLCreateWithFileSystemPath( NULL, path, kCFURLPOSIXPathStyle, true );
	require_action_quiet( url, exit, err = memFullErr );
	
	bundle = CFBundleCreate( NULL, url );
	CFRelease( url );
	require_action_quiet( bundle, exit, err = memFullErr );
	
	// Get a ptr to the system's "printf" function from System.framework.
	
	functionName = CFSTR( "printf" );
	functionPtr = CFBundleGetFunctionPointerForName( bundle, functionName );
	require_action_quiet( functionPtr, exit, err = memFullErr );	
	
	// Success! Note: The bundle cannot be released because it would invalidate the function ptr.
	
	gDebugMacOSXLogFunction = (DebugMacOSXLogFunctionPtr) functionPtr;
	bundle = NULL;
	err = noErr;
	
exit:
	if( bundle )
	{
		CFRelease( bundle );
	}
	return( err );
}

//===========================================================================================================================
//	DebugMacOSXLogPrint
//===========================================================================================================================

static void	DebugMacOSXLogPrint( char *inData, size_t inSize )
{	
	if( gDebugMacOSXLogFunction )
	{
		gDebugMacOSXLogFunction( "%.*s", (int) inSize, inData );
	}
}
#endif

#if( TARGET_OS_WIN32 )
//===========================================================================================================================
//	DebugWindowsDebuggerPrint
//===========================================================================================================================

void	DebugWindowsDebuggerPrint( char *inData, size_t inSize )
{
	TCHAR				buffer[ 512 ];
	const char *		src;
	const char *		end;
	TCHAR *				dst;
	char				c;
	
	// Copy locally and null terminate the string. This also converts from char to TCHAR in case we are 
	// building with UNICODE enabled since the input is always char. Also convert \r to \n in the process.

	src = inData;
	if( inSize >= sizeof_array( buffer ) )
	{
		inSize = sizeof_array( buffer ) - 1;
	}
	end = src + inSize;
	dst = buffer;	
	while( src < end )
	{
		c = *src++;
		if( c == '\r' )
		{
			c = '\n';
		}
		*dst++ = (TCHAR) c;
	}
	*dst = 0;
	
	// Print out the string to the debugger.
	
	OutputDebugString( buffer );
}
#endif

#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
//===========================================================================================================================
//	DebugWindowsEventLogInit
//===========================================================================================================================

static OSStatus	DebugWindowsEventLogInit( const char *inName, HMODULE inModule )
{
	OSStatus			err;
	HKEY				key;
	TCHAR				name[ 128 ];
	const char *		src;
	TCHAR				path[ MAX_PATH ];
	size_t				size;
	DWORD				typesSupported;
	DWORD 				n;
	
	key = NULL;

	// Use a default name if needed then convert the name to TCHARs so it works on ANSI or Unicode builds.

	if( !inName || ( *inName == '\0' ) )
	{
		inName = "DefaultApp";
	}
	DebugWinCharToTCharString( inName, kSizeCString, name, sizeof( name ), NULL );
	
	// Build the path string using the fixed registry path and app name.
	
	src = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\";
	DebugWinCharToTCharString( src, kSizeCString, path, sizeof_array( path ), &size );
	DebugWinCharToTCharString( inName, kSizeCString, path + size, sizeof_array( path ) - size, NULL );
	
	// Add/Open the source name as a sub-key under the Application key in the EventLog registry key.
	
	err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL );
	require_noerr_quiet( err, exit );
	
	// Set the path in the EventMessageFile subkey. Add 1 to the TCHAR count to include the null terminator.
	
	n = GetModuleFileName( inModule, path, sizeof_array( path ) );
	err = translate_errno( n > 0, (OSStatus) GetLastError(), kParamErr );
	require_noerr_quiet( err, exit );
	n += 1;
	n *= sizeof( TCHAR );
	
	err = RegSetValueEx( key, TEXT( "EventMessageFile" ), 0, REG_EXPAND_SZ, (const LPBYTE) path, n );
	require_noerr_quiet( err, exit );
	
	// Set the supported event types in the TypesSupported subkey.
	
	typesSupported = EVENTLOG_SUCCESS | EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE |
					 EVENTLOG_AUDIT_SUCCESS | EVENTLOG_AUDIT_FAILURE;
	err = RegSetValueEx( key, TEXT( "TypesSupported" ), 0, REG_DWORD, (const LPBYTE) &typesSupported, sizeof( DWORD ) );
	require_noerr_quiet( err, exit );
	
	// Set up the event source.
	
	gDebugWindowsEventLogEventSource = RegisterEventSource( NULL, name );
	err = translate_errno( gDebugWindowsEventLogEventSource, (OSStatus) GetLastError(), kParamErr );
	require_noerr_quiet( err, exit );
	
exit:
	if( key )
	{
		RegCloseKey( key );
	}
	return( err );
}

//===========================================================================================================================
//	DebugWindowsEventLogPrint
//===========================================================================================================================

static void	DebugWindowsEventLogPrint( DebugLevel inLevel, char *inData, size_t inSize )
{
	WORD				type;
	TCHAR				buffer[ 512 ];
	const char *		src;
	const char *		end;
	TCHAR *				dst;
	char				c;
	const TCHAR *		array[ 1 ];
	
	// Map the debug level to a Windows EventLog type.
	
	if( inLevel <= kDebugLevelNotice )
	{
		type = EVENTLOG_INFORMATION_TYPE;
	}
	else if( inLevel <= kDebugLevelWarning )
	{
		type = EVENTLOG_WARNING_TYPE;
	}
	else
	{
		type = EVENTLOG_ERROR_TYPE;
	}
	
	// Copy locally and null terminate the string. This also converts from char to TCHAR in case we are 
	// building with UNICODE enabled since the input is always char. Also convert \r to \n in the process.
	
	src = inData;
	if( inSize >= sizeof_array( buffer ) )
	{
		inSize = sizeof_array( buffer ) - 1;
	}
	end = src + inSize;
	dst = buffer;	
	while( src < end )
	{
		c = *src++;
		if( c == '\r' )
		{
			c = '\n';
		}
		*dst++ = (TCHAR) c;
	}
	*dst = 0;
	
	// Add the the string to the event log.
	
	array[ 0 ] = buffer;
	if( gDebugWindowsEventLogEventSource )
	{
		ReportEvent( gDebugWindowsEventLogEventSource, type, 0, 0x20000001L, NULL, 1, 0, array, NULL );
	}
}
#endif	// TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE

#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
//===========================================================================================================================
//	DebugAssertOutputHandler
//===========================================================================================================================

static pascal void	
	DebugAssertOutputHandler( 
		OSType 				inComponentSignature, 
		UInt32 				inOptions, 
		const char *		inAssertString, 
		const char *		inExceptionString, 
		const char *		inErrorString, 
		const char *		inFileName, 
		long 				inLineNumber, 
		void *				inValue, 
		ConstStr255Param 	inOutputMsg )
{
	DEBUG_UNUSED( inComponentSignature );
	DEBUG_UNUSED( inOptions );
	DEBUG_UNUSED( inExceptionString );
	DEBUG_UNUSED( inValue );
	DEBUG_UNUSED( inOutputMsg );
	
	DebugPrintAssert( 0, inAssertString, inErrorString, inFileName, (int_least32_t) inLineNumber, "" );
}
#endif

#if 0
#pragma mark -
#pragma mark == Utilities ==
#endif

//===========================================================================================================================
//	DebugSNPrintF
//
//	Stolen from mDNS.c's mDNS_snprintf/mDNS_vsnprintf with the following changes:
//
//	Changed names to avoid name collisions with the mDNS versions.
//	Changed types to standard C types since mDNSEmbeddedAPI.h may not be available.
//	Conditionalized mDNS stuff so it can be used with or with mDNSEmbeddedAPI.h.
//	Added 64-bit support for %d (%lld), %i (%lli), %u (%llu), %o (%llo), %x (%llx), and %b (%llb).
//	Added %@   - Cocoa/CoreFoundation object. Param is the object. Strings are used directly. Others use CFCopyDescription.
//	Added %.8a - FIbre Channel address. Arg=ptr to address.
//	Added %##a - IPv4 (if AF_INET defined) or IPv6 (if AF_INET6 defined) sockaddr. Arg=ptr to sockaddr.
//	Added %b   - Binary representation of integer (e.g. 01101011). Modifiers and arg=the same as %d, %x, etc.
//	Added %C   - Mac-style FourCharCode (e.g. 'APPL'). Arg=32-bit value to print as a Mac-style FourCharCode.
//	Added %H   - Hex Dump (e.g. "\x6b\xa7" -> "6B A7"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
//	Added %#H  - Hex Dump & ASCII (e.g. "\x41\x62" -> "6B A7 'Ab'"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
//	Added %m   - Error Message (e.g. 0 -> "kNoErr"). Modifiers and error code args are the same as %d, %x, etc.
//	Added %S   - UTF-16 string. Host order if no BOM. Precision is UTF-16 char count. BOM counts in any precision. Arg=ptr.
//	Added %#S  - Big Endian UTF-16 string (unless BOM overrides). Otherwise the same as %S.
//	Added %##S - Little Endian UTF-16 string (unless BOM overrides). Otherwise the same as %S.
//	Added %U   - Universally Unique Identifier (UUID) (e.g. 6ba7b810-9dad-11d1-80b4-00c04fd430c8). Arg=ptr to 16-byte UUID.
//===========================================================================================================================

DEBUG_EXPORT size_t DebugSNPrintF(char *sbuffer, size_t buflen, const char *fmt, ...)
	{
	size_t length;
	
	va_list ptr;
	va_start(ptr,fmt);
	length = DebugSNPrintFVAList(sbuffer, buflen, fmt, ptr);
	va_end(ptr);
	
	return(length);
	}

//===========================================================================================================================
//	DebugSNPrintFVAList	- va_list version of DebugSNPrintF. See DebugSNPrintF for more info.
//===========================================================================================================================

DEBUG_EXPORT size_t DebugSNPrintFVAList(char *sbuffer, size_t buflen, const char *fmt, va_list arg)
	{
	static const struct DebugSNPrintF_format
		{
		unsigned      leftJustify : 1;
		unsigned      forceSign : 1;
		unsigned      zeroPad : 1;
		unsigned      havePrecision : 1;
		unsigned      hSize : 1;
		char          lSize;
		char          altForm;
		char          sign;		// +, - or space
		unsigned int  fieldWidth;
		unsigned int  precision;
		} DebugSNPrintF_format_default = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };

	size_t nwritten = 0;
	int c;
	if (buflen == 0) return(0);
	buflen--;		// Pre-reserve one space in the buffer for the terminating nul
	if (buflen == 0) goto exit;
	
	for (c = *fmt; c != 0; c = *++fmt)
		{
		if (c != '%')
			{
			*sbuffer++ = (char)c;
			if (++nwritten >= buflen) goto exit;
			}
		else
			{
			size_t i=0, j;
			// The mDNS Vsprintf Argument Conversion Buffer is used as a temporary holding area for
			// generating decimal numbers, hexdecimal numbers, IP addresses, domain name strings, etc.
			// The size needs to be enough for a 256-byte domain name plus some error text.
			#define mDNS_VACB_Size 300
			char mDNS_VACB[mDNS_VACB_Size];
			#define mDNS_VACB_Lim (&mDNS_VACB[mDNS_VACB_Size])
			#define mDNS_VACB_Remain(s) ((size_t)(mDNS_VACB_Lim - s))
			char *s = mDNS_VACB_Lim;
			const char *digits = "0123456789ABCDEF";
			struct DebugSNPrintF_format F = DebugSNPrintF_format_default;
	
			for(;;)	//  decode flags
				{
				c = *++fmt;
				if      (c == '-') F.leftJustify = 1;
				else if (c == '+') F.forceSign = 1;
				else if (c == ' ') F.sign = ' ';
				else if (c == '#') F.altForm++;
				else if (c == '0') F.zeroPad = 1;
				else break;
				}
	
			if (c == '*')	//  decode field width
				{
				int f = va_arg(arg, int);
				if (f < 0) { f = -f; F.leftJustify = 1; }
				F.fieldWidth = (unsigned int)f;
				c = *++fmt;
				}
			else
				{
				for (; c >= '0' && c <= '9'; c = *++fmt)
					F.fieldWidth = (10 * F.fieldWidth) + (c - '0');
				}
	
			if (c == '.')	//  decode precision
				{
				if ((c = *++fmt) == '*')
					{ F.precision = va_arg(arg, unsigned int); c = *++fmt; }
				else for (; c >= '0' && c <= '9'; c = *++fmt)
						F.precision = (10 * F.precision) + (c - '0');
				F.havePrecision = 1;
				}
	
			if (F.leftJustify) F.zeroPad = 0;
	
			conv:
			switch (c)	//  perform appropriate conversion
				{
				#if TYPE_LONGLONG_NATIVE
					unsigned_long_long_compat n;
					unsigned_long_long_compat base;
				#else
					unsigned long n;
					unsigned long base;
				#endif
				case 'h' :	F.hSize = 1; c = *++fmt; goto conv;
				case 'l' :	// fall through
				case 'L' :	F.lSize++; c = *++fmt; goto conv;
				case 'd' :
				case 'i' :	base = 10;
							goto canBeSigned;
				case 'u' :	base = 10;
							goto notSigned;
				case 'o' :	base = 8;
							goto notSigned;
				case 'b' :	base = 2;
							goto notSigned;
				case 'p' :	n = va_arg(arg, uintptr_t);
							F.havePrecision = 1;
							F.precision = (sizeof(uintptr_t) == 4) ? 8 : 16;
							F.sign = 0;
							base = 16;
							c = 'x';
							goto number;
				case 'x' :	digits = "0123456789abcdef";
				case 'X' :	base = 16;
							goto notSigned;
				canBeSigned:
							#if TYPE_LONGLONG_NATIVE
								if (F.lSize == 1) n = (unsigned_long_long_compat)va_arg(arg, long);
								else if (F.lSize == 2) n = (unsigned_long_long_compat)va_arg(arg, long_long_compat);
								else n = (unsigned_long_long_compat)va_arg(arg, int);
							#else
								if (F.lSize == 1) n = (unsigned long)va_arg(arg, long);
								else if (F.lSize == 2) goto exit;
								else n = (unsigned long)va_arg(arg, int);
							#endif
							if (F.hSize) n = (short) n;
							#if TYPE_LONGLONG_NATIVE
								if ((long_long_compat) n < 0) { n = (unsigned_long_long_compat)-(long_long_compat)n; F.sign = '-'; }
							#else
								if ((long) n < 0) { n = (unsigned long)-(long)n; F.sign = '-'; }
							#endif
							else if (F.forceSign) F.sign = '+';
							goto number;
				
				notSigned:	if (F.lSize == 1) n = va_arg(arg, unsigned long);
							else if (F.lSize == 2)
								{
								#if TYPE_LONGLONG_NATIVE
									n = va_arg(arg, unsigned_long_long_compat);
								#else
									goto exit;
								#endif
								}
							else n = va_arg(arg, unsigned int);
							if (F.hSize) n = (unsigned short) n;
							F.sign = 0;
							goto number;
				
				number:		if (!F.havePrecision)
								{
								if (F.zeroPad)
									{
									F.precision = F.fieldWidth;
									if (F.altForm) F.precision -= 2;
									if (F.sign) --F.precision;
									}
								if (F.precision < 1) F.precision = 1;
								}
							if (F.precision > mDNS_VACB_Size - 1)
								F.precision = mDNS_VACB_Size - 1;
							for (i = 0; n; n /= base, i++) *--s = (char)(digits[n % base]);
							for (; i < F.precision; i++) *--s = '0';
							if (F.altForm) { *--s = (char)c; *--s = '0'; i += 2; }
							if (F.sign) { *--s = F.sign; i++; }
							break;
	
				case 'a' :	{
							unsigned char *a = va_arg(arg, unsigned char *);
							char pre[4] = "";
							char post[32] = "";
							if (!a) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
							else
								{
								s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
								if (F.altForm == 1)
									{
									#if(defined(MDNS_DEBUGMSGS))
										mDNSAddr *ip = (mDNSAddr*)a;
										switch (ip->type)
											{
											case mDNSAddrType_IPv4: F.precision =  4; a = (unsigned char *)&ip->ip.v4; break;
											case mDNSAddrType_IPv6: F.precision = 16; a = (unsigned char *)&ip->ip.v6; break;
											default:                F.precision =  0; break;
											}
									#else
										F.precision = 0;	// mDNSEmbeddedAPI.h not included so no mDNSAddr support
									#endif
									}
								else if (F.altForm == 2)
									{
									#ifdef AF_INET
										const struct sockaddr *sa;
										unsigned char *port;
										sa = (const struct sockaddr*)a;
										switch (sa->sa_family)
											{
											case AF_INET:  F.precision =  4; a = (unsigned char*)&((const struct sockaddr_in *)a)->sin_addr;
											               port = (unsigned char*)&((const struct sockaddr_in *)sa)->sin_port;
											               DebugSNPrintF(post, sizeof(post), ":%d", (port[0] << 8) | port[1]); break;
											#ifdef AF_INET6
											case AF_INET6: F.precision = 16; a = (unsigned char*)&((const struct sockaddr_in6 *)a)->sin6_addr; 
											               pre[0] = '['; pre[1] = '\0';
											               port = (unsigned char*)&((const struct sockaddr_in6 *)sa)->sin6_port;
											               DebugSNPrintF(post, sizeof(post), "%%%d]:%d", 
											               		(int)((const struct sockaddr_in6 *)sa)->sin6_scope_id,
											               		(port[0] << 8) | port[1]); break;
											#endif
											default:       F.precision =  0; break;
											}
									#else
										F.precision = 0;	// socket interfaces not included so no sockaddr support
									#endif
									}
								switch (F.precision)
									{
									case  4: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%d.%d.%d.%d%s",
														a[0], a[1], a[2], a[3], post); break;
									case  6: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%02X:%02X:%02X:%02X:%02X:%02X",
														a[0], a[1], a[2], a[3], a[4], a[5]); break;
									case  8: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
														a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); break;
									case 16: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), 
														"%s%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X%s",
														pre, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8], 
														a[9], a[10], a[11], a[12], a[13], a[14], a[15], post); break;		
									default: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%s", "<< ERROR: Must specify address size "
														"(i.e. %.4a=IPv4, %.6a=Ethernet, %.8a=Fibre Channel %.16a=IPv6) >>"); break;
									}
								}
							}
							break;

				case 'U' :	{
							unsigned char *a = va_arg(arg, unsigned char *);
							if (!a) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
							else
								{
								s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
								i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
										*((uint32_t*) &a[0]), *((uint16_t*) &a[4]), *((uint16_t*) &a[6]), 
										a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); break;
								}
							}
							break;

				case 'c' :	*--s = (char)va_arg(arg, int); i = 1; break;
	
				case 'C' :	if (F.lSize) n = va_arg(arg, unsigned long);
							else n = va_arg(arg, unsigned int);
							if (F.hSize) n = (unsigned short) n;
							c = (int)( n        & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
							c = (int)((n >>  8) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
							c = (int)((n >> 16) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
							c = (int)((n >> 24) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
							i = 4;
							break;
	
				case 's' :	s = va_arg(arg, char *);
							if (!s) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
							else switch (F.altForm)
								{
								case 0:	i=0;
										if (F.havePrecision)				// C string
											{
											while((i < F.precision) && s[i]) i++;
											// Make sure we don't truncate in the middle of a UTF-8 character.
											// If the last character is part of a multi-byte UTF-8 character, back up to the start of it.
											j=0;
											while((i > 0) && ((c = s[i-1]) & 0x80)) { j++; i--; if((c & 0xC0) != 0x80) break; }
											// If the actual count of UTF-8 characters matches the encoded UTF-8 count, add it back.
											if((j > 1) && (j <= 6))
												{
												int test = (0xFF << (8-j)) & 0xFF;
												int mask = test | (1 << ((8-j)-1));
												if((c & mask) == test) i += j;
												}
											}
										else
											while(s[i]) i++;
										break;								
								case 1: i = (unsigned char) *s++; break;	// Pascal string
								case 2: {									// DNS label-sequence name
										unsigned char *a = (unsigned char *)s;
										s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
										if (*a == 0) *s++ = '.';	// Special case for root DNS name
										while (*a)
											{
											if (*a > 63) { s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "<<INVALID LABEL LENGTH %u>>", *a); break; }
											if (s + *a >= &mDNS_VACB[254]) { s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "<<NAME TOO LONG>>"); break; }
											s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "%#s.", a);
											a += 1 + *a;
											}
										i = (size_t)(s - mDNS_VACB);
										s = mDNS_VACB;	// Reset s back to the start of the buffer
										break;
										}
								}
							if (F.havePrecision && i > F.precision)		// Make sure we don't truncate in the middle of a UTF-8 character
								{ i = F.precision; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
							break;
				
				case 'S':	{	// UTF-16 string
							unsigned char *a = va_arg(arg, unsigned char *);
							uint16_t      *u = (uint16_t*)a;
							if (!u) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
							if ((!F.havePrecision || F.precision))
								{
								if      ((a[0] == 0xFE) && (a[1] == 0xFF)) { F.altForm = 1; u += 1; a += 2; F.precision--; }	// Big Endian
								else if ((a[0] == 0xFF) && (a[1] == 0xFE)) { F.altForm = 2; u += 1; a += 2; F.precision--; }	// Little Endian
								}
							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
							switch (F.altForm)
								{
								case 0:	while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Host Endian
											{ c = u[i]; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; }
										break;
								case 1: while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Big Endian
											{ c = ((a[0] << 8) | a[1]) & 0xFF; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; a += 2; }
										break;
								case 2: while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Little Endian
											{ c = ((a[1] << 8) | a[0]) & 0xFF; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; a += 2; }
										break;
								}
							}
							s = mDNS_VACB;	// Reset s back to the start of the buffer
							break;
			
			#if TARGET_OS_MAC
				case '@':	{	// Cocoa/CoreFoundation object
							CFTypeRef cfObj;
							CFStringRef cfStr;
							cfObj = (CFTypeRef) va_arg(arg, void *);
							cfStr = (CFGetTypeID(cfObj) == CFStringGetTypeID()) ? (CFStringRef)CFRetain(cfObj) : CFCopyDescription(cfObj);
							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
							if (cfStr)
								{
								CFRange range;
								CFIndex m;
								range = CFRangeMake(0, CFStringGetLength(cfStr));
								m = 0;
								CFStringGetBytes(cfStr, range, kCFStringEncodingUTF8, '^', false, (UInt8*)mDNS_VACB, (CFIndex)sizeof(mDNS_VACB), &m);
								CFRelease(cfStr);
								i = (size_t) m;
								}
							else
								{
								i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%s", "ERROR: <invalid CF object>" );
								}
							}
							if (F.havePrecision && i > F.precision)		// Make sure we don't truncate in the middle of a UTF-8 character
								{ i = F.precision; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
							break;
			#endif

				case 'm' :	{	// Error Message
							long err;
							if (F.lSize) err = va_arg(arg, long);
							else err = va_arg(arg, int);
							if (F.hSize) err = (short)err;
							DebugGetErrorString(err, mDNS_VACB, sizeof(mDNS_VACB));
							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
							for(i=0;s[i];i++) {}
							}
							break;

				case 'H' :	{	// Hex Dump
							void *a = va_arg(arg, void *);
							size_t size = (size_t)va_arg(arg, int);
							size_t max = (size_t)va_arg(arg, int);
							DebugFlags flags = 
								kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoNewLine |
								kDebugFlags8BitSeparator | kDebugFlagsNo32BitSeparator |
								kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount;
							if (F.altForm == 0) flags |= kDebugFlagsNoASCII;
							size = (max < size) ? max : size;
							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
							i = DebugHexDump(kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, a, a, size, flags, mDNS_VACB, sizeof(mDNS_VACB));
							}
							break;
				
				case 'v' :	{	// Version
							uint32_t version;
							version = va_arg(arg, unsigned int);
							DebugNumVersionToString(version, mDNS_VACB);
							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
							for(i=0;s[i];i++) {}
							}
							break;

				case 'n' :	s = va_arg(arg, char *);
							if      (F.hSize) * (short *) s = (short)nwritten;
							else if (F.lSize) * (long  *) s = (long)nwritten;
							else              * (int   *) s = (int)nwritten;
							continue;
	
				default:	s = mDNS_VACB;
							i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "<<UNKNOWN FORMAT CONVERSION CODE %%%c>>", c);

				case '%' :	*sbuffer++ = (char)c;
							if (++nwritten >= buflen) goto exit;
							break;
				}
	
			if (i < F.fieldWidth && !F.leftJustify)			// Pad on the left
				do	{
					*sbuffer++ = ' ';
					if (++nwritten >= buflen) goto exit;
					} while (i < --F.fieldWidth);
	
			if (i > buflen - nwritten)	// Make sure we don't truncate in the middle of a UTF-8 character
				{ i = buflen - nwritten; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
			for (j=0; j<i; j++) *sbuffer++ = *s++;			// Write the converted result
			nwritten += i;
			if (nwritten >= buflen) goto exit;
	
			for (; i < F.fieldWidth; i++)					// Pad on the right
				{
				*sbuffer++ = ' ';
				if (++nwritten >= buflen) goto exit;
				}
			}
		}
	exit:
	*sbuffer++ = 0;
	return(nwritten);
	}

//===========================================================================================================================
//	DebugGetErrorString
//===========================================================================================================================

DEBUG_EXPORT const char *	DebugGetErrorString( int_least32_t inErrorCode, char *inBuffer, size_t inBufferSize )
{
	const char *		s;
	char *				dst;
	char *				end;
#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
	char				buffer[ 256 ];
#endif
	
	switch( inErrorCode )
	{
		#define	CaseErrorString( X, STR )					case X: s = STR; break
		#define	CaseErrorStringify( X )						case X: s = # X; break
		#define	CaseErrorStringifyHardCode( VALUE, X )		case VALUE: s = # X; break
		
		// General Errors
		
		CaseErrorString( 0,  "no error" );
		CaseErrorString( 1,  "in-progress/waiting" );
		CaseErrorString( -1, "catch-all unknown error" );
				
		// ACP Errors
		
		CaseErrorStringifyHardCode( -2,  kACPBadRequestErr );
		CaseErrorStringifyHardCode( -3,  kACPNoMemoryErr );
		CaseErrorStringifyHardCode( -4,  kACPBadParamErr );
		CaseErrorStringifyHardCode( -5,  kACPNotFoundErr );
		CaseErrorStringifyHardCode( -6,  kACPBadChecksumErr );
		CaseErrorStringifyHardCode( -7,  kACPCommandNotHandledErr );
		CaseErrorStringifyHardCode( -8,  kACPNetworkErr );
		CaseErrorStringifyHardCode( -9,  kACPDuplicateCommandHandlerErr );
		CaseErrorStringifyHardCode( -10, kACPUnknownPropertyErr );
		CaseErrorStringifyHardCode( -11, kACPImmutablePropertyErr );
		CaseErrorStringifyHardCode( -12, kACPBadPropertyValueErr );
		CaseErrorStringifyHardCode( -13, kACPNoResourcesErr );
		CaseErrorStringifyHardCode( -14, kACPBadOptionErr );
		CaseErrorStringifyHardCode( -15, kACPBadSizeErr );
		CaseErrorStringifyHardCode( -16, kACPBadPasswordErr );
		CaseErrorStringifyHardCode( -17, kACPNotInitializedErr );
		CaseErrorStringifyHardCode( -18, kACPNonReadablePropertyErr );
		CaseErrorStringifyHardCode( -19, kACPBadVersionErr );
		CaseErrorStringifyHardCode( -20, kACPBadSignatureErr );
		CaseErrorStringifyHardCode( -21, kACPBadIndexErr );
		CaseErrorStringifyHardCode( -22, kACPUnsupportedErr );
		CaseErrorStringifyHardCode( -23, kACPInUseErr );
		CaseErrorStringifyHardCode( -24, kACPParamCountErr );
		CaseErrorStringifyHardCode( -25, kACPIDErr );
		CaseErrorStringifyHardCode( -26, kACPFormatErr );
		CaseErrorStringifyHardCode( -27, kACPUnknownUserErr );
		CaseErrorStringifyHardCode( -28, kACPAccessDeniedErr );
		CaseErrorStringifyHardCode( -29, kACPIncorrectFWErr );
		
		// Common Services Errors
		
		CaseErrorStringify( kUnknownErr );
		CaseErrorStringify( kOptionErr );
		CaseErrorStringify( kSelectorErr );
		CaseErrorStringify( kExecutionStateErr );
		CaseErrorStringify( kPathErr );
		CaseErrorStringify( kParamErr );
		CaseErrorStringify( kParamCountErr );
		CaseErrorStringify( kCommandErr );
		CaseErrorStringify( kIDErr );
		CaseErrorStringify( kStateErr );
		CaseErrorStringify( kRangeErr );
		CaseErrorStringify( kRequestErr );
		CaseErrorStringify( kResponseErr );
		CaseErrorStringify( kChecksumErr );
		CaseErrorStringify( kNotHandledErr );
		CaseErrorStringify( kVersionErr );
		CaseErrorStringify( kSignatureErr );
		CaseErrorStringify( kFormatErr );
		CaseErrorStringify( kNotInitializedErr );
		CaseErrorStringify( kAlreadyInitializedErr );
		CaseErrorStringify( kNotInUseErr );
		CaseErrorStringify( kInUseErr );
		CaseErrorStringify( kTimeoutErr );
		CaseErrorStringify( kCanceledErr );
		CaseErrorStringify( kAlreadyCanceledErr );
		CaseErrorStringify( kCannotCancelErr );
		CaseErrorStringify( kDeletedErr );
		CaseErrorStringify( kNotFoundErr );
		CaseErrorStringify( kNoMemoryErr );
		CaseErrorStringify( kNoResourcesErr );
		CaseErrorStringify( kDuplicateErr );
		CaseErrorStringify( kImmutableErr );
		CaseErrorStringify( kUnsupportedDataErr );
		CaseErrorStringify( kIntegrityErr );
		CaseErrorStringify( kIncompatibleErr );
		CaseErrorStringify( kUnsupportedErr );
		CaseErrorStringify( kUnexpectedErr );
		CaseErrorStringify( kValueErr );
		CaseErrorStringify( kNotReadableErr );
		CaseErrorStringify( kNotWritableErr );
		CaseErrorStringify( kBadReferenceErr );
		CaseErrorStringify( kFlagErr );
		CaseErrorStringify( kMalformedErr );
		CaseErrorStringify( kSizeErr );
		CaseErrorStringify( kNameErr );
		CaseErrorStringify( kNotReadyErr );
		CaseErrorStringify( kReadErr );
		CaseErrorStringify( kWriteErr );
		CaseErrorStringify( kMismatchErr );
		CaseErrorStringify( kDateErr );
		CaseErrorStringify( kUnderrunErr );
		CaseErrorStringify( kOverrunErr );
		CaseErrorStringify( kEndingErr );
		CaseErrorStringify( kConnectionErr );
		CaseErrorStringify( kAuthenticationErr );
		CaseErrorStringify( kOpenErr );
		CaseErrorStringify( kTypeErr );
		CaseErrorStringify( kSkipErr );
		CaseErrorStringify( kNoAckErr );
		CaseErrorStringify( kCollisionErr );
		CaseErrorStringify( kBackoffErr );
		CaseErrorStringify( kNoAddressAckErr );
		CaseErrorStringify( kBusyErr );
		CaseErrorStringify( kNoSpaceErr );
		
		// mDNS/DNS-SD Errors
		
		CaseErrorStringifyHardCode( -65537, mStatus_UnknownErr );
		CaseErrorStringifyHardCode( -65538, mStatus_NoSuchNameErr );
		CaseErrorStringifyHardCode( -65539, mStatus_NoMemoryErr );
		CaseErrorStringifyHardCode( -65540, mStatus_BadParamErr );
		CaseErrorStringifyHardCode( -65541, mStatus_BadReferenceErr );
		CaseErrorStringifyHardCode( -65542, mStatus_BadStateErr );
		CaseErrorStringifyHardCode( -65543, mStatus_BadFlagsErr );
		CaseErrorStringifyHardCode( -65544, mStatus_UnsupportedErr );
		CaseErrorStringifyHardCode( -65545, mStatus_NotInitializedErr );
		CaseErrorStringifyHardCode( -65546, mStatus_NoCache );
		CaseErrorStringifyHardCode( -65547, mStatus_AlreadyRegistered );
		CaseErrorStringifyHardCode( -65548, mStatus_NameConflict );
		CaseErrorStringifyHardCode( -65549, mStatus_Invalid );
		CaseErrorStringifyHardCode( -65550, mStatus_GrowCache );
		CaseErrorStringifyHardCode( -65551, mStatus_BadInterfaceErr );
		CaseErrorStringifyHardCode( -65552, mStatus_Incompatible );
		CaseErrorStringifyHardCode( -65791, mStatus_ConfigChanged );
		CaseErrorStringifyHardCode( -65792, mStatus_MemFree );
		
		// RSP Errors
		
		CaseErrorStringifyHardCode( -400000, kRSPUnknownErr );
		CaseErrorStringifyHardCode( -400050, kRSPParamErr );
		CaseErrorStringifyHardCode( -400108, kRSPNoMemoryErr );
		CaseErrorStringifyHardCode( -405246, kRSPRangeErr );
		CaseErrorStringifyHardCode( -409057, kRSPSizeErr );
		CaseErrorStringifyHardCode( -400200, kRSPHardwareErr );
		CaseErrorStringifyHardCode( -401712, kRSPTimeoutErr );	
		CaseErrorStringifyHardCode( -402053, kRSPUnsupportedErr );
		CaseErrorStringifyHardCode( -402419, kRSPIDErr );
		CaseErrorStringifyHardCode( -403165, kRSPFlagErr );
		CaseErrorString( 			-200000, "kRSPControllerStatusBase - 0x50" );		
		CaseErrorString(			-200080, "kRSPCommandSucceededErr - 0x50" );
		CaseErrorString( 			-200001, "kRSPCommandFailedErr - 0x01" );
		CaseErrorString( 			-200051, "kRSPChecksumErr - 0x33" );
		CaseErrorString( 			-200132, "kRSPCommandTimeoutErr - 0x84" );
		CaseErrorString( 			-200034, "kRSPPasswordRequiredErr - 0x22 OBSOLETE" );
		CaseErrorString( 			-200128, "kRSPCanceledErr - 0x02 Async" );
		
		// XML Errors
		
		CaseErrorStringifyHardCode( -100043, kXMLNotFoundErr );
		CaseErrorStringifyHardCode( -100050, kXMLParamErr );
		CaseErrorStringifyHardCode( -100108, kXMLNoMemoryErr );
		CaseErrorStringifyHardCode( -100206, kXMLFormatErr );
		CaseErrorStringifyHardCode( -100586, kXMLNoRootElementErr );
		CaseErrorStringifyHardCode( -101703, kXMLWrongDataTypeErr );
		CaseErrorStringifyHardCode( -101726, kXMLKeyErr );
		CaseErrorStringifyHardCode( -102053, kXMLUnsupportedErr );
		CaseErrorStringifyHardCode( -102063, kXMLMissingElementErr );
		CaseErrorStringifyHardCode( -103026, kXMLParseErr );
		CaseErrorStringifyHardCode( -103159, kXMLBadDataErr );
		CaseErrorStringifyHardCode( -103170, kXMLBadNameErr );
		CaseErrorStringifyHardCode( -105246, kXMLRangeErr );
		CaseErrorStringifyHardCode( -105251, kXMLUnknownElementErr );
		CaseErrorStringifyHardCode( -108739, kXMLMalformedInputErr );
		CaseErrorStringifyHardCode( -109057, kXMLBadSizeErr );
		CaseErrorStringifyHardCode( -101730, kXMLMissingChildElementErr );
		CaseErrorStringifyHardCode( -102107, kXMLMissingParentElementErr );
		CaseErrorStringifyHardCode( -130587, kXMLNonRootElementErr );
		CaseErrorStringifyHardCode( -102015, kXMLDateErr );

	#if( __MACH__ )
	
		// Mach Errors

		CaseErrorStringifyHardCode( 0x00002000, MACH_MSG_IPC_SPACE );
		CaseErrorStringifyHardCode( 0x00001000, MACH_MSG_VM_SPACE );
		CaseErrorStringifyHardCode( 0x00000800, MACH_MSG_IPC_KERNEL );
		CaseErrorStringifyHardCode( 0x00000400, MACH_MSG_VM_KERNEL );
		CaseErrorStringifyHardCode( 0x10000001, MACH_SEND_IN_PROGRESS );
		CaseErrorStringifyHardCode( 0x10000002, MACH_SEND_INVALID_DATA );
		CaseErrorStringifyHardCode( 0x10000003, MACH_SEND_INVALID_DEST );
		CaseErrorStringifyHardCode( 0x10000004, MACH_SEND_TIMED_OUT );
		CaseErrorStringifyHardCode( 0x10000007, MACH_SEND_INTERRUPTED );
		CaseErrorStringifyHardCode( 0x10000008, MACH_SEND_MSG_TOO_SMALL );
		CaseErrorStringifyHardCode( 0x10000009, MACH_SEND_INVALID_REPLY );
		CaseErrorStringifyHardCode( 0x1000000A, MACH_SEND_INVALID_RIGHT );
		CaseErrorStringifyHardCode( 0x1000000B, MACH_SEND_INVALID_NOTIFY );
		CaseErrorStringifyHardCode( 0x1000000C, MACH_SEND_INVALID_MEMORY );
		CaseErrorStringifyHardCode( 0x1000000D, MACH_SEND_NO_BUFFER );
		CaseErrorStringifyHardCode( 0x1000000E, MACH_SEND_TOO_LARGE );
		CaseErrorStringifyHardCode( 0x1000000F, MACH_SEND_INVALID_TYPE );
		CaseErrorStringifyHardCode( 0x10000010, MACH_SEND_INVALID_HEADER );
		CaseErrorStringifyHardCode( 0x10000011, MACH_SEND_INVALID_TRAILER );
		CaseErrorStringifyHardCode( 0x10000015, MACH_SEND_INVALID_RT_OOL_SIZE );
		CaseErrorStringifyHardCode( 0x10004001, MACH_RCV_IN_PROGRESS );
		CaseErrorStringifyHardCode( 0x10004002, MACH_RCV_INVALID_NAME );
		CaseErrorStringifyHardCode( 0x10004003, MACH_RCV_TIMED_OUT );
		CaseErrorStringifyHardCode( 0x10004004, MACH_RCV_TOO_LARGE );
		CaseErrorStringifyHardCode( 0x10004005, MACH_RCV_INTERRUPTED );
		CaseErrorStringifyHardCode( 0x10004006, MACH_RCV_PORT_CHANGED );
		CaseErrorStringifyHardCode( 0x10004007, MACH_RCV_INVALID_NOTIFY );
		CaseErrorStringifyHardCode( 0x10004008, MACH_RCV_INVALID_DATA );
		CaseErrorStringifyHardCode( 0x10004009, MACH_RCV_PORT_DIED );
		CaseErrorStringifyHardCode( 0x1000400A, MACH_RCV_IN_SET );
		CaseErrorStringifyHardCode( 0x1000400B, MACH_RCV_HEADER_ERROR );
		CaseErrorStringifyHardCode( 0x1000400C, MACH_RCV_BODY_ERROR );
		CaseErrorStringifyHardCode( 0x1000400D, MACH_RCV_INVALID_TYPE );
		CaseErrorStringifyHardCode( 0x1000400E, MACH_RCV_SCATTER_SMALL );
		CaseErrorStringifyHardCode( 0x1000400F, MACH_RCV_INVALID_TRAILER );
		CaseErrorStringifyHardCode( 0x10004011, MACH_RCV_IN_PROGRESS_TIMED );

		// Mach OSReturn Errors

		CaseErrorStringifyHardCode( 0xDC000001, kOSReturnError );
		CaseErrorStringifyHardCode( 0xDC004001, kOSMetaClassInternal );
		CaseErrorStringifyHardCode( 0xDC004002, kOSMetaClassHasInstances );
		CaseErrorStringifyHardCode( 0xDC004003, kOSMetaClassNoInit );
		CaseErrorStringifyHardCode( 0xDC004004, kOSMetaClassNoTempData );
		CaseErrorStringifyHardCode( 0xDC004005, kOSMetaClassNoDicts );
		CaseErrorStringifyHardCode( 0xDC004006, kOSMetaClassNoKModSet );
		CaseErrorStringifyHardCode( 0xDC004007, kOSMetaClassNoInsKModSet );
		CaseErrorStringifyHardCode( 0xDC004008, kOSMetaClassNoSuper );
		CaseErrorStringifyHardCode( 0xDC004009, kOSMetaClassInstNoSuper );
		CaseErrorStringifyHardCode( 0xDC00400A, kOSMetaClassDuplicateClass );

		// IOKit Errors

		CaseErrorStringifyHardCode( 0xE00002BC, kIOReturnError );
		CaseErrorStringifyHardCode( 0xE00002BD, kIOReturnNoMemory );
		CaseErrorStringifyHardCode( 0xE00002BE, kIOReturnNoResources );
		CaseErrorStringifyHardCode( 0xE00002BF, kIOReturnIPCError );
		CaseErrorStringifyHardCode( 0xE00002C0, kIOReturnNoDevice );
		CaseErrorStringifyHardCode( 0xE00002C1, kIOReturnNotPrivileged );
		CaseErrorStringifyHardCode( 0xE00002C2, kIOReturnBadArgument );
		CaseErrorStringifyHardCode( 0xE00002C3, kIOReturnLockedRead );
		CaseErrorStringifyHardCode( 0xE00002C4, kIOReturnLockedWrite );
		CaseErrorStringifyHardCode( 0xE00002C5, kIOReturnExclusiveAccess );
		CaseErrorStringifyHardCode( 0xE00002C6, kIOReturnBadMessageID );
		CaseErrorStringifyHardCode( 0xE00002C7, kIOReturnUnsupported );
		CaseErrorStringifyHardCode( 0xE00002C8, kIOReturnVMError );
		CaseErrorStringifyHardCode( 0xE00002C9, kIOReturnInternalError );
		CaseErrorStringifyHardCode( 0xE00002CA, kIOReturnIOError );
		CaseErrorStringifyHardCode( 0xE00002CC, kIOReturnCannotLock );
		CaseErrorStringifyHardCode( 0xE00002CD, kIOReturnNotOpen );
		CaseErrorStringifyHardCode( 0xE00002CE, kIOReturnNotReadable );
		CaseErrorStringifyHardCode( 0xE00002CF, kIOReturnNotWritable );
		CaseErrorStringifyHardCode( 0xE00002D0, kIOReturnNotAligned );
		CaseErrorStringifyHardCode( 0xE00002D1, kIOReturnBadMedia );
		CaseErrorStringifyHardCode( 0xE00002D2, kIOReturnStillOpen );
		CaseErrorStringifyHardCode( 0xE00002D3, kIOReturnRLDError );
		CaseErrorStringifyHardCode( 0xE00002D4, kIOReturnDMAError );
		CaseErrorStringifyHardCode( 0xE00002D5, kIOReturnBusy );
		CaseErrorStringifyHardCode( 0xE00002D6, kIOReturnTimeout );
		CaseErrorStringifyHardCode( 0xE00002D7, kIOReturnOffline );
		CaseErrorStringifyHardCode( 0xE00002D8, kIOReturnNotReady );
		CaseErrorStringifyHardCode( 0xE00002D9, kIOReturnNotAttached );
		CaseErrorStringifyHardCode( 0xE00002DA, kIOReturnNoChannels );
		CaseErrorStringifyHardCode( 0xE00002DB, kIOReturnNoSpace );
		CaseErrorStringifyHardCode( 0xE00002DD, kIOReturnPortExists );
		CaseErrorStringifyHardCode( 0xE00002DE, kIOReturnCannotWire );
		CaseErrorStringifyHardCode( 0xE00002DF, kIOReturnNoInterrupt );
		CaseErrorStringifyHardCode( 0xE00002E0, kIOReturnNoFrames );
		CaseErrorStringifyHardCode( 0xE00002E1, kIOReturnMessageTooLarge );
		CaseErrorStringifyHardCode( 0xE00002E2, kIOReturnNotPermitted );
		CaseErrorStringifyHardCode( 0xE00002E3, kIOReturnNoPower );
		CaseErrorStringifyHardCode( 0xE00002E4, kIOReturnNoMedia );
		CaseErrorStringifyHardCode( 0xE00002E5, kIOReturnUnformattedMedia );
		CaseErrorStringifyHardCode( 0xE00002E6, kIOReturnUnsupportedMode );
		CaseErrorStringifyHardCode( 0xE00002E7, kIOReturnUnderrun );
		CaseErrorStringifyHardCode( 0xE00002E8, kIOReturnOverrun );
		CaseErrorStringifyHardCode( 0xE00002E9, kIOReturnDeviceError	 );
		CaseErrorStringifyHardCode( 0xE00002EA, kIOReturnNoCompletion	 );
		CaseErrorStringifyHardCode( 0xE00002EB, kIOReturnAborted	 );
		CaseErrorStringifyHardCode( 0xE00002EC, kIOReturnNoBandwidth	 );
		CaseErrorStringifyHardCode( 0xE00002ED, kIOReturnNotResponding	 );
		CaseErrorStringifyHardCode( 0xE00002EE, kIOReturnIsoTooOld	 );
		CaseErrorStringifyHardCode( 0xE00002EF, kIOReturnIsoTooNew	 );
		CaseErrorStringifyHardCode( 0xE00002F0, kIOReturnNotFound );
		CaseErrorStringifyHardCode( 0xE0000001, kIOReturnInvalid );

		// IOKit FireWire Errors

		CaseErrorStringifyHardCode( 0xE0008010, kIOFireWireResponseBase );
		CaseErrorStringifyHardCode( 0xE0008020, kIOFireWireBusReset );
		CaseErrorStringifyHardCode( 0xE0008001, kIOConfigNoEntry );
		CaseErrorStringifyHardCode( 0xE0008002, kIOFireWirePending );
		CaseErrorStringifyHardCode( 0xE0008003, kIOFireWireLastDCLToken );
		CaseErrorStringifyHardCode( 0xE0008004, kIOFireWireConfigROMInvalid );
		CaseErrorStringifyHardCode( 0xE0008005, kIOFireWireAlreadyRegistered );
		CaseErrorStringifyHardCode( 0xE0008006, kIOFireWireMultipleTalkers );
		CaseErrorStringifyHardCode( 0xE0008007, kIOFireWireChannelActive );
		CaseErrorStringifyHardCode( 0xE0008008, kIOFireWireNoListenerOrTalker );
		CaseErrorStringifyHardCode( 0xE0008009, kIOFireWireNoChannels );
		CaseErrorStringifyHardCode( 0xE000800A, kIOFireWireChannelNotAvailable );
		CaseErrorStringifyHardCode( 0xE000800B, kIOFireWireSeparateBus );
		CaseErrorStringifyHardCode( 0xE000800C, kIOFireWireBadSelfIDs );
		CaseErrorStringifyHardCode( 0xE000800D, kIOFireWireLowCableVoltage );
		CaseErrorStringifyHardCode( 0xE000800E, kIOFireWireInsufficientPower );
		CaseErrorStringifyHardCode( 0xE000800F, kIOFireWireOutOfTLabels );
		CaseErrorStringifyHardCode( 0xE0008101, kIOFireWireBogusDCLProgram );
		CaseErrorStringifyHardCode( 0xE0008102, kIOFireWireTalkingAndListening );
		CaseErrorStringifyHardCode( 0xE0008103, kIOFireWireHardwareSlept );
		CaseErrorStringifyHardCode( 0xE00087D0, kIOFWMessageServiceIsRequestingClose );
		CaseErrorStringifyHardCode( 0xE00087D1, kIOFWMessagePowerStateChanged );
		CaseErrorStringifyHardCode( 0xE00087D2, kIOFWMessageTopologyChanged );

		// IOKit USB Errors
				
		CaseErrorStringifyHardCode( 0xE0004061, kIOUSBUnknownPipeErr );
		CaseErrorStringifyHardCode( 0xE0004060, kIOUSBTooManyPipesErr );
		CaseErrorStringifyHardCode( 0xE000405F, kIOUSBNoAsyncPortErr );
		CaseErrorStringifyHardCode( 0xE000405E, kIOUSBNotEnoughPipesErr );
		CaseErrorStringifyHardCode( 0xE000405D, kIOUSBNotEnoughPowerErr );
		CaseErrorStringifyHardCode( 0xE0004057, kIOUSBEndpointNotFound );
		CaseErrorStringifyHardCode( 0xE0004056, kIOUSBConfigNotFound );
		CaseErrorStringifyHardCode( 0xE0004051, kIOUSBTransactionTimeout );
		CaseErrorStringifyHardCode( 0xE0004050, kIOUSBTransactionReturned );
		CaseErrorStringifyHardCode( 0xE000404F, kIOUSBPipeStalled );
		CaseErrorStringifyHardCode( 0xE000404E, kIOUSBInterfaceNotFound );
		CaseErrorStringifyHardCode( 0xE000404D, kIOUSBLowLatencyBufferNotPreviouslyAllocated );
		CaseErrorStringifyHardCode( 0xE000404C, kIOUSBLowLatencyFrameListNotPreviouslyAllocated );
		CaseErrorStringifyHardCode( 0xE000404B, kIOUSBHighSpeedSplitError );
		CaseErrorStringifyHardCode( 0xE0004010, kIOUSBLinkErr );
		CaseErrorStringifyHardCode( 0xE000400F, kIOUSBNotSent2Err );
		CaseErrorStringifyHardCode( 0xE000400E, kIOUSBNotSent1Err );
		CaseErrorStringifyHardCode( 0xE000400D, kIOUSBBufferUnderrunErr );
		CaseErrorStringifyHardCode( 0xE000400C, kIOUSBBufferOverrunErr );
		CaseErrorStringifyHardCode( 0xE000400B, kIOUSBReserved2Err );
		CaseErrorStringifyHardCode( 0xE000400A, kIOUSBReserved1Err );
		CaseErrorStringifyHardCode( 0xE0004007, kIOUSBWrongPIDErr );
		CaseErrorStringifyHardCode( 0xE0004006, kIOUSBPIDCheckErr );
		CaseErrorStringifyHardCode( 0xE0004003, kIOUSBDataToggleErr );
		CaseErrorStringifyHardCode( 0xE0004002, kIOUSBBitstufErr );
		CaseErrorStringifyHardCode( 0xE0004001, kIOUSBCRCErr );
	
	#endif	// __MACH__

		// Other Errors
		
		default:
			s = NULL;
			#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
				if( inBuffer && ( inBufferSize > 0 ) )
				{
					DWORD		n;
					
					n = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, (DWORD) inErrorCode, 
						MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), buffer, sizeof( buffer ), NULL );
					if( n > 0 )
					{
						// Remove any trailing CR's or LF's since some messages have them.
						
						while( ( n > 0 ) && isspace( ( (unsigned char *) buffer )[ n - 1 ] ) )
						{
							buffer[ --n ] = '\0';
						}
						s = buffer;
					}
				}
			#endif
			
			if( !s )
			{
				#if( !TARGET_API_MAC_OSX_KERNEL && !TARGET_OS_WINDOWS_CE )
					s = strerror( inErrorCode );
				#endif
				if( !s )
				{
					s = "<unknown error code>";
				}
			}
			break;
	}
	
	// Copy the string to the output buffer. If no buffer is supplied or it is empty, return an empty string.
	
	if( inBuffer && ( inBufferSize > 0 ) )
	{
		dst = inBuffer;
		end = dst + ( inBufferSize - 1 );
		while( ( ( end - dst ) > 0 ) && ( *s != '\0' ) )
		{
			*dst++ = *s++;
		}
		*dst = '\0';
		s = inBuffer;
	}
	return( s );
}

//===========================================================================================================================
//	DebugHexDump
//===========================================================================================================================

DEBUG_EXPORT size_t
	DebugHexDump( 
		DebugLevel		inLevel, 
		int				inIndent, 
		const char * 	inLabel, 
		size_t 			inLabelSize, 
		int				inLabelMinWidth, 
		const char *	inType, 
		size_t 			inTypeSize, 
		const void *	inDataStart, 
		const void *	inData, 
		size_t 			inDataSize, 
		DebugFlags	 	inFlags, 
		char *			outBuffer, 
		size_t			inBufferSize )
{
	static const char		kHexChars[] = "0123456789ABCDEF";
	const uint8_t *			start;
	const uint8_t *			src;
	char *					dst;
	char *					end;
	size_t					n;
	int						offset;
	int						width;
	const char *			newline;
	char					separator[ 8 ];
	char *					s;
	
	DEBUG_UNUSED( inType );
	DEBUG_UNUSED( inTypeSize );
	
	// Set up the function-wide variables.
	
	if( inLabelSize == kSizeCString )
	{
		inLabelSize = strlen( inLabel );
	}
	start 	= (const uint8_t *) inData;
	src 	= start;
	dst		= outBuffer;
	end		= dst + inBufferSize;
	offset 	= (int)( (intptr_t) inData - (intptr_t) inDataStart );
	width	= ( (int) inLabelSize > inLabelMinWidth ) ? (int) inLabelSize : inLabelMinWidth;
	newline	= ( inFlags & kDebugFlagsNoNewLine ) ? "" : "\n";
		
	// Set up the separator string. This is used to insert spaces on subsequent "lines" when not using newlines.
	
	s = separator;
	if( inFlags & kDebugFlagsNoNewLine )
	{
		if( inFlags & kDebugFlags8BitSeparator )
		{
			*s++ = ' ';
		}
		if( inFlags & kDebugFlags16BitSeparator )
		{
			*s++ = ' ';
		}
		if( !( inFlags & kDebugFlagsNo32BitSeparator ) )
		{
			*s++ = ' ';
		}
		check( ( (size_t)( s - separator ) ) < sizeof( separator ) );
	}
	*s = '\0';
	
	for( ;; )
	{
		char		prefixString[ 32 ];
		char		hexString[ 64 ];
		char		asciiString[ 32 ];
		char		byteCountString[ 32 ];
		int			c;
		size_t		chunkSize;
		size_t		i;
		
		// If this is a label-only item (i.e. no data), print the label (accounting for prefix string spacing) and exit.
		
		if( inDataSize == 0 )
		{
			if( inLabel && ( inLabelSize > 0 ) )
			{
				width = 0;
				if( !( inFlags & kDebugFlagsNoAddress ) )
				{
					width += 8;			// "00000000"
					if( !( inFlags & kDebugFlagsNoOffset ) )
					{
						width += 1;		// "+"
					}
				}
				if( inFlags & kDebugFlags32BitOffset )
				{
					width += 8;			// "00000000"
				}
				else if( !( inFlags & kDebugFlagsNoOffset ) )
				{
					width += 4;			// "0000"
				}
				
				if( outBuffer )
				{
					dst += DebugSNPrintF( dst, (size_t)( end - dst ), "%*s" "%-*.*s" "%.*s" "%s", 
						width, "", 
						( width > 0 ) ? ": " : "", 
						width, (int) inLabelSize, inLabel, 
						newline );
				}
				else
				{
					dst += DebugPrintF( inLevel, "%*s" "%-*.*s" "%.*s" "%s", 
						width, "", 
						( width > 0 ) ? ": " : "", 
						width, (int) inLabelSize, inLabel, 
						newline );
				}
			}
			break;
		}
		
		// Build the prefix string. It will be in one of the following formats:
		//
		// 1) "00000000+0000[0000]"	(address and offset)
		// 2) "00000000"			(address only)
		// 3) "0000[0000]"			(offset only)
		// 4) ""					(no address or offset)
		//
		// Note: If we're printing multiple "lines", but not printing newlines, a space is used to separate.
		
		s = prefixString;
		if( !( inFlags & kDebugFlagsNoAddress ) )
		{
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 28 ) & 0xF ];
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 24 ) & 0xF ];
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 20 ) & 0xF ];
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 16 ) & 0xF ];
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 12 ) & 0xF ];
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >>  8 ) & 0xF ];
			*s++ = kHexChars[ ( ( (uintptr_t) src ) >>  4 ) & 0xF ];
			*s++ = kHexChars[   ( (uintptr_t) src )         & 0xF ];
			
			if( !( inFlags & kDebugFlagsNoOffset ) )
			{
				*s++ = '+';
			}
		}
		if( !( inFlags & kDebugFlagsNoOffset ) )
		{
			if( inFlags & kDebugFlags32BitOffset )
			{
				*s++ = kHexChars[ ( offset >> 28 ) & 0xF ];
				*s++ = kHexChars[ ( offset >> 24 ) & 0xF ];
				*s++ = kHexChars[ ( offset >> 20 ) & 0xF ];
				*s++ = kHexChars[ ( offset >> 16 ) & 0xF ];
			}
			*s++ = kHexChars[ ( offset >> 12 ) & 0xF ];
			*s++ = kHexChars[ ( offset >>  8 ) & 0xF ];
			*s++ = kHexChars[ ( offset >>  4 ) & 0xF ];
			*s++ = kHexChars[   offset         & 0xF ];
		}
		if( s != prefixString )
		{
			*s++ = ':';
			*s++ = ' ';
		}
		check( ( (size_t)( s - prefixString ) ) < sizeof( prefixString ) );
		*s = '\0';
		
		// Build a hex string with a optional spaces after every 1, 2, and/or 4 bytes to make it easier to read.
		// Optionally pads the hex string with space to fill the full 16 byte range (so it lines up).
		
		s = hexString;
		chunkSize = ( inDataSize < 16 ) ? inDataSize : 16;
		n = ( inFlags & kDebugFlagsNo16ByteHexPad ) ? chunkSize : 16;
		for( i = 0; i < n; ++i )
		{
			if( ( inFlags & kDebugFlags8BitSeparator ) && ( i > 0 ) )
			{
				*s++ = ' ';
			}
			if( ( inFlags & kDebugFlags16BitSeparator ) && ( i > 0 ) && ( ( i % 2 ) == 0 ) )
			{
				*s++ = ' ';
			}
			if( !( inFlags & kDebugFlagsNo32BitSeparator ) && ( i > 0 ) && ( ( i % 4 ) == 0 ) )
			{
				*s++ = ' ';
			}
			if( i < chunkSize )
			{
				*s++ = kHexChars[ src[ i ] >> 4   ];
				*s++ = kHexChars[ src[ i ] &  0xF ];
			}
			else
			{
				*s++ = ' ';
				*s++ = ' ';
			}
		}
		check( ( (size_t)( s - hexString ) ) < sizeof( hexString ) );
		*s = '\0';
		
		// Build a string with the ASCII version of the data (replaces non-printable characters with '^').
		// Optionally pads the string with '`' to fill the full 16 byte range (so it lines up).
		
		s = asciiString;
		if( !( inFlags & kDebugFlagsNoASCII ) )
		{
			*s++ = ' ';
			*s++ = '|';
			for( i = 0; i < n; ++i )
			{
				if( i < chunkSize )
				{
					c = src[ i ];
					if( !DebugIsPrint( c ) )
					{
						c = '^';
					}
				}
				else
				{
					c = '`';
				}
				*s++ = (char) c;
			}
			*s++ = '|';
			check( ( (size_t)( s - asciiString ) ) < sizeof( asciiString ) );
		}
		*s = '\0';
		
		// Build a string indicating how bytes are in the hex dump. Only printed on the first line.
		
		s = byteCountString;
		if( !( inFlags & kDebugFlagsNoByteCount ) )
		{
			if( src == start )
			{
				s += DebugSNPrintF( s, sizeof( byteCountString ), " (%d bytes)", (int) inDataSize );
			}
		}
		check( ( (size_t)( s - byteCountString ) ) < sizeof( byteCountString ) );
		*s = '\0';
		
		// Build the entire line from all the pieces we've previously built.
			
		if( outBuffer )
		{
			if( src == start )
			{
				dst += DebugSNPrintF( dst, (size_t)( end - dst ), 
					"%*s"		// Indention
					"%s" 		// Separator (only if needed)
					"%s" 		// Prefix
					"%-*.*s"	// Label
					"%s"		// Separator
					"%s"		// Hex
					"%s"		// ASCII
					"%s"		// Byte Count
					"%s", 		// Newline
					inIndent, "", 
					( src != start ) ? separator : "", 
					prefixString, 
					width, (int) inLabelSize, inLabel ? inLabel : "", 
					( width > 0 ) ? " " : "", 
					hexString, 
					asciiString, 
					byteCountString, 
					newline );
			}
			else
			{
				dst += DebugSNPrintF( dst, (size_t)( end - dst ), 
					"%*s"		// Indention
					"%s" 		// Separator (only if needed)
					"%s" 		// Prefix
					"%*s"		// Label Spacing
					"%s"		// Separator
					"%s"		// Hex
					"%s"		// ASCII
					"%s"		// Byte Count
					"%s", 		// Newline
					inIndent, "", 
					( src != start ) ? separator : "", 
					prefixString, 
					width, "", 
					( width > 0 ) ? " " : "", 
					hexString, 
					asciiString, 
					byteCountString, 
					newline );
			}
		}
		else
		{
			if( src == start )
			{
				dst += DebugPrintF( inLevel, 
					"%*s"		// Indention
					"%s" 		// Separator (only if needed)
					"%s" 		// Prefix
					"%-*.*s"	// Label
					"%s"		// Separator
					"%s"		// Hex
					"%s"		// ASCII
					"%s"		// Byte Count
					"%s", 		// Newline
					inIndent, "", 
					( src != start ) ? separator : "", 
					prefixString, 
					width, (int) inLabelSize, inLabel, 
					( width > 0 ) ? " " : "", 
					hexString, 
					asciiString, 
					byteCountString, 
					newline );
			}
			else
			{
				dst += DebugPrintF( inLevel, 
					"%*s"		// Indention
					"%s" 		// Separator (only if needed)
					"%s" 		// Prefix
					"%*s"		// Label Spacing
					"%s"		// Separator
					"%s"		// Hex
					"%s"		// ASCII
					"%s"		// Byte Count
					"%s", 		// Newline
					inIndent, "", 
					( src != start ) ? separator : "", 
					prefixString, 
					width, "", 
					( width > 0 ) ? " " : "", 
					hexString, 
					asciiString, 
					byteCountString, 
					newline );
			}
		}
		
		// Move to the next chunk. Exit if there is no more data.
		
		offset		+= (int) chunkSize;
		src 		+= chunkSize;
		inDataSize	-= chunkSize;
		if( inDataSize == 0 )
		{
			break;
		}
	}
	
	// Note: The "dst - outBuffer" size calculation works even if "outBuffer" is NULL because it's all relative.
	
	return( (size_t)( dst - outBuffer ) );
}

//===========================================================================================================================
//	DebugNumVersionToString
//===========================================================================================================================

static char *	DebugNumVersionToString( uint32_t inVersion, char *inString )
{
	char *		s;
	uint8_t		majorRev;
	uint8_t		minor;
	uint8_t		bugFix;
	uint8_t		stage;
	uint8_t		revision;
	
	check( inString );
	
	majorRev 	= (uint8_t)( ( inVersion >> 24 ) & 0xFF );
	minor		= (uint8_t)( ( inVersion >> 20 ) & 0x0F );
	bugFix		= (uint8_t)( ( inVersion >> 16 ) & 0x0F );
	stage 		= (uint8_t)( ( inVersion >>  8 ) & 0xFF );
	revision 	= (uint8_t)(   inVersion         & 0xFF );
	
	// Convert the major, minor, and bugfix numbers.
	
	s  = inString;
	s += sprintf( s, "%u", majorRev );
	s += sprintf( s, ".%u", minor );
	if( bugFix != 0 )
	{
		s += sprintf( s, ".%u", bugFix );
	}
	
	// Convert the version stage and non-release revision number.
	
	switch( stage )
	{
		case kVersionStageDevelopment:
			s += sprintf( s, "d%u", revision );
			break;
		
		case kVersionStageAlpha:
			s += sprintf( s, "a%u", revision );
			break;
		
		case kVersionStageBeta:
			s += sprintf( s, "b%u", revision );
			break;
		
		case kVersionStageFinal:
			
			// A non-release revision of zero is a special case indicating the software is GM (at the golden master 
			// stage) and therefore, the non-release revision should not be added to the string.
			
			if( revision != 0 )
			{
				s += sprintf( s, "f%u", revision );
			}
			break;
		
		default:
			dlog( kDebugLevelError, "invalid NumVersion stage (0x%02X)\n", stage );
			break;
	}
	return( inString );
}

//===========================================================================================================================
//	DebugTaskLevel
//===========================================================================================================================

DEBUG_EXPORT uint32_t	DebugTaskLevel( void )
{
	uint32_t		level;
	
	level = 0;
	
#if( TARGET_OS_VXWORKS )
	if( intContext() )
	{
		level |= ( ( 1 << kDebugInterruptLevelShift ) & kDebugInterruptLevelMask );
	}
#endif
	
	return( level );
}

#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
//===========================================================================================================================
//	DebugWinEnableConsole
//===========================================================================================================================

#pragma warning( disable:4311 )

static void	DebugWinEnableConsole( void )
{
	static bool		sConsoleEnabled = false;
	BOOL			result;
	int				fileHandle;
	FILE *			file;
	int				err;
	
	if( sConsoleEnabled )
	{
		goto exit;
	}
	
	// Create console window.
	
	result = AllocConsole();
	require_quiet( result, exit );

	// Redirect stdin to the console stdin.
	
	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_INPUT_HANDLE ), _O_TEXT );
	
	#if( defined( __MWERKS__ ) )
		file = __handle_reopen( (unsigned long) fileHandle, "r", stdin );
		require_quiet( file, exit );
	#else
		file = _fdopen( fileHandle, "r" );
		require_quiet( file, exit );
	
		*stdin = *file;
	#endif
	
	err = setvbuf( stdin, NULL, _IONBF, 0 );
	require_noerr_quiet( err, exit );
	
	// Redirect stdout to the console stdout.
		
	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_OUTPUT_HANDLE ), _O_TEXT );
	
	#if( defined( __MWERKS__ ) )
		file = __handle_reopen( (unsigned long) fileHandle, "w", stdout );
		require_quiet( file, exit );
	#else
		file = _fdopen( fileHandle, "w" );
		require_quiet( file, exit );
		
		*stdout = *file;
	#endif
	
	err = setvbuf( stdout, NULL, _IONBF, 0 );
	require_noerr_quiet( err, exit );
	
	// Redirect stderr to the console stdout.
	
	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_OUTPUT_HANDLE ), _O_TEXT );
	
	#if( defined( __MWERKS__ ) )
		file = __handle_reopen( (unsigned long) fileHandle, "w", stderr );
		require_quiet( file, exit );
	#else
		file = _fdopen( fileHandle, "w" );
		require_quiet( file, exit );
	
		*stderr = *file;
	#endif
	
	err = setvbuf( stderr, NULL, _IONBF, 0 );
	require_noerr_quiet( err, exit );
	
	sConsoleEnabled = true;
	
exit:
	return;
}

#pragma warning( default:4311 )

#endif	// TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE

#if( TARGET_OS_WIN32 )
//===========================================================================================================================
//	DebugWinCharToTCharString
//===========================================================================================================================

static TCHAR *
	DebugWinCharToTCharString( 
		const char *	inCharString, 
		size_t 			inCharCount, 
		TCHAR *			outTCharString, 
		size_t 			inTCharCountMax, 
		size_t *		outTCharCount )
{
	const char *		src;
	TCHAR *				dst;
	TCHAR *				end;
	
	if( inCharCount == kSizeCString )
	{
		inCharCount = strlen( inCharString );
	}
	src = inCharString;
	dst = outTCharString;
	if( inTCharCountMax > 0 )
	{
		inTCharCountMax -= 1;
		if( inTCharCountMax > inCharCount )
		{
			inTCharCountMax = inCharCount;
		}
		
		end = dst + inTCharCountMax;
		while( dst < end )
		{
			*dst++ = (TCHAR) *src++;
		}
		*dst = 0;
	}
	if( outTCharCount )
	{
		*outTCharCount = (size_t)( dst - outTCharString );
	}
	return( outTCharString );
}
#endif

#if 0
#pragma mark -
#pragma mark == Debugging ==
#endif

//===========================================================================================================================
//	DebugServicesTest
//===========================================================================================================================

DEBUG_EXPORT OSStatus	DebugServicesTest( void )
{
	OSStatus		err;
	char			s[ 512 ];
	uint8_t *		p;
	uint8_t			data[] = 
	{
		0x11, 0x22, 0x33, 0x44, 
		0x55, 0x66, 
		0x77, 0x88, 0x99, 0xAA, 
		0xBB, 0xCC, 0xDD, 
		0xEE,
		0xFF, 
		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 
		0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0, 
		0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1 
	};
	
	debug_initialize( kDebugOutputTypeMetaConsole );	
	
	// check's
	
	check( 0 && "SHOULD SEE: check" );
	check( 1 && "SHOULD *NOT* SEE: check (valid)" );
	check_string( 0, "SHOULD SEE: check_string" );
	check_string( 1, "SHOULD *NOT* SEE: check_string (valid)" );
	check_noerr( -123 );
	check_noerr( 10038 );
	check_noerr( 22 );
	check_noerr( 0 );
	check_noerr_string( -6712, "SHOULD SEE: check_noerr_string" );
	check_noerr_string( 0, "SHOULD *NOT* SEE: check_noerr_string (valid)" );
	check_translated_errno( 0 >= 0 && "SHOULD *NOT* SEE", -384, -999 );
	check_translated_errno( -1 >= 0 && "SHOULD SEE", -384, -999 );
	check_translated_errno( -1 >= 0 && "SHOULD SEE", 0, -999 );
	check_ptr_overlap( "SHOULD *NOT* SEE" ? 10 : 0, 10, 22, 10 );
	check_ptr_overlap( "SHOULD SEE" ? 10 : 0, 10,  5, 10 );
	check_ptr_overlap( "SHOULD SEE" ? 10 : 0, 10, 12,  6 );
	check_ptr_overlap( "SHOULD SEE" ? 12 : 0,  6, 10, 10 );
	check_ptr_overlap( "SHOULD SEE" ? 12 : 0, 10, 10, 10 );
	check_ptr_overlap( "SHOULD *NOT* SEE" ? 22 : 0, 10, 10, 10 );
	check_ptr_overlap( "SHOULD *NOT* SEE" ? 10 : 0, 10, 20, 10 );
	check_ptr_overlap( "SHOULD *NOT* SEE" ? 20 : 0, 10, 10, 10 );
		
	// require's
	
	require( 0 && "SHOULD SEE", require1 );
	{ err = kResponseErr; goto exit; }
require1:
	require( 1 && "SHOULD *NOT* SEE", require2 );
	goto require2Good;
require2:
	{ err = kResponseErr; goto exit; }
require2Good:
	require_string( 0 && "SHOULD SEE", require3, "SHOULD SEE: require_string" );
	{ err = kResponseErr; goto exit; }
require3:
	require_string( 1 && "SHOULD *NOT* SEE", require4, "SHOULD *NOT* SEE: require_string (valid)" );
	goto require4Good;
require4:
	{ err = kResponseErr; goto exit; }
require4Good:
	require_quiet( 0 && "SHOULD SEE", require5 );
	{ err = kResponseErr; goto exit; }
require5:
	require_quiet( 1 && "SHOULD *NOT* SEE", require6 );
	goto require6Good;
require6:
	{ err = kResponseErr; goto exit; }
require6Good:
	require_noerr( -1, require7 );
	{ err = kResponseErr; goto exit; }
require7:
	require_noerr( 0, require8 );
	goto require8Good;
require8:
	{ err = kResponseErr; goto exit; }
require8Good:
	require_noerr_string( -2, require9, "SHOULD SEE: require_noerr_string");
	{ err = kResponseErr; goto exit; }
require9:
	require_noerr_string( 0, require10, "SHOULD *NOT* SEE: require_noerr_string (valid)" );
	goto require10Good;
require10:
	{ err = kResponseErr; goto exit; }
require10Good:
	require_noerr_action_string( -3, require11, dlog( kDebugLevelMax, "action 1 (expected)\n" ), "require_noerr_action_string" );
	{ err = kResponseErr; goto exit; }
require11:
	require_noerr_action_string( 0, require12, dlog( kDebugLevelMax, "action 2\n" ), "require_noerr_action_string (valid)" );
	goto require12Good;
require12:
	{ err = kResponseErr; goto exit; }
require12Good:
	require_noerr_quiet( -4, require13 );
	{ err = kResponseErr; goto exit; }
require13:
	require_noerr_quiet( 0, require14 );
	goto require14Good;
require14:
	{ err = kResponseErr; goto exit; }
require14Good:
	require_noerr_action( -5, require15, dlog( kDebugLevelMax, "SHOULD SEE: action 3 (expected)\n" ) );
	{ err = kResponseErr; goto exit; }
require15:
	require_noerr_action( 0, require16, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 4\n" ) );
	goto require16Good;
require16:
	{ err = kResponseErr; goto exit; }
require16Good:
	require_noerr_action_quiet( -4, require17, dlog( kDebugLevelMax, "SHOULD SEE: action 5 (expected)\n" ) );
	{ err = kResponseErr; goto exit; }
require17:
	require_noerr_action_quiet( 0, require18, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 6\n" ) );
	goto require18Good;
require18:
	{ err = kResponseErr; goto exit; }
require18Good:
	require_action( 0 && "SHOULD SEE", require19, dlog( kDebugLevelMax, "SHOULD SEE: action 7 (expected)\n" ) );
	{ err = kResponseErr; goto exit; }
require19:
	require_action( 1 && "SHOULD *NOT* SEE", require20, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 8\n" ) );
	goto require20Good;
require20:
	{ err = kResponseErr; goto exit; }
require20Good:
	require_action_quiet( 0, require21, dlog( kDebugLevelMax, "SHOULD SEE: action 9 (expected)\n" ) );
	{ err = kResponseErr; goto exit; }
require21:
	require_action_quiet( 1, require22, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 10\n" ) );
	goto require22Good;
require22:
	{ err = kResponseErr; goto exit; }
require22Good:
	require_action_string( 0, require23, dlog( kDebugLevelMax, "SHOULD SEE: action 11 (expected)\n" ), "SHOULD SEE: require_action_string" );
	{ err = kResponseErr; goto exit; }
require23:
	require_action_string( 1, require24, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 12\n" ), "SHOULD *NOT* SEE: require_action_string" );
	goto require24Good;
require24:
	{ err = kResponseErr; goto exit; }
require24Good:

#if( defined( __MWERKS__ )  )
	#if( defined( __cplusplus ) && __option( exceptions ) )
		#define COMPILER_HAS_EXCEPTIONS		1
	#else
		#define COMPILER_HAS_EXCEPTIONS		0
	#endif
#else
	#if( defined( __cplusplus ) )
		#define COMPILER_HAS_EXCEPTIONS		1
	#else
		#define COMPILER_HAS_EXCEPTIONS		0
	#endif
#endif

#if( COMPILER_HAS_EXCEPTIONS )
	try
	{
		require_throw( 1 && "SHOULD *NOT* SEE" );
		require_throw( 0 && "SHOULD SEE" );
	}
	catch( ... )
	{
		goto require26Good;
	}
	{ err = kResponseErr; goto exit; }
require26Good:
#endif

	// translate_errno
	
	err = translate_errno( 1 != -1, -123, -567 );
	require( ( err == 0 ) && "SHOULD *NOT* SEE", exit );
	
	err = translate_errno( -1 != -1, -123, -567 );
	require( ( err == -123 ) && "SHOULD *NOT* SEE", exit );
	
	err = translate_errno( -1 != -1, 0, -567 );
	require( ( err == -567 ) && "SHOULD *NOT* SEE", exit );

	// debug_string
	
	debug_string( "debug_string" );
	
	// DebugSNPrintF
	
	DebugSNPrintF( s, sizeof( s ), "%d", 1234 );
	require_action( strcmp( s, "1234" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%X", 0x2345 );
	require_action( strcmp( s, "2345" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%#s", "\05test" );
	require_action( strcmp( s, "test" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%##s", "\03www\05apple\03com" );
	require_action( strcmp( s, "www.apple.com." ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%ld", (long) INT32_C( 2147483647 ) );
	require_action( strcmp( s, "2147483647" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%lu", (unsigned long) UINT32_C( 4294967295 ) );
	require_action( strcmp( s, "4294967295" ) == 0, exit, err = -1 );
	
	#if( TYPE_LONGLONG_NATIVE )
		DebugSNPrintF( s, sizeof( s ), "%lld", (long_long_compat) INT64_C( 9223372036854775807 ) );
		require_action( strcmp( s, "9223372036854775807" ) == 0, exit, err = -1 );
		
		DebugSNPrintF( s, sizeof( s ), "%lld", (long_long_compat) INT64_C( -9223372036854775807 ) );
		require_action( strcmp( s, "-9223372036854775807" ) == 0, exit, err = -1 );
		
		DebugSNPrintF( s, sizeof( s ), "%llu", (unsigned_long_long_compat) UINT64_C( 18446744073709551615 ) );
		require_action( strcmp( s, "18446744073709551615" ) == 0, exit, err = -1 );
	#endif
	
	DebugSNPrintF( s, sizeof( s ), "%lb", (unsigned long) binary_32( 01111011, 01111011, 01111011, 01111011 ) );
	require_action( strcmp( s, "1111011011110110111101101111011" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%C", 0x41624364 );	// 'AbCd'
	require_action( strcmp( s, "AbCd" ) == 0, exit, err = -1 );
	
	#if( defined( MDNS_DEBUGMSGS ) )
	{
		mDNSAddr		maddr;
		
		memset( &maddr, 0, sizeof( maddr ) );
		maddr.type = mDNSAddrType_IPv4;
		maddr.ip.v4.b[ 0 ] = 127;
		maddr.ip.v4.b[ 1 ] = 0;
		maddr.ip.v4.b[ 2 ] = 0;
		maddr.ip.v4.b[ 3 ] = 1;
		DebugSNPrintF( s, sizeof( s ), "%#a", &maddr );
		require_action( strcmp( s, "127.0.0.1" ) == 0, exit, err = -1 );
		
		memset( &maddr, 0, sizeof( maddr ) );
		maddr.type = mDNSAddrType_IPv6;
		maddr.ip.v6.b[  0 ]	= 0xFE;
		maddr.ip.v6.b[  1 ]	= 0x80;
		maddr.ip.v6.b[ 15 ]	= 0x01;
		DebugSNPrintF( s, sizeof( s ), "%#a", &maddr );
		require_action( strcmp( s, "FE80:0000:0000:0000:0000:0000:0000:0001" ) == 0, exit, err = -1 );
	}
	#endif
	
	#if( AF_INET )
	{
		struct sockaddr_in		sa4;
		
		memset( &sa4, 0, sizeof( sa4 ) );
		sa4.sin_family 		= AF_INET;
		p 					= (uint8_t *) &sa4.sin_port;
		p[ 0 ] 				= (uint8_t)( ( 80 >> 8 ) & 0xFF );
		p[ 1 ] 				= (uint8_t)(   80        & 0xFF );
		p 					= (uint8_t *) &sa4.sin_addr.s_addr;
		p[ 0 ] 				= (uint8_t)( ( INADDR_LOOPBACK >> 24 ) & 0xFF );
		p[ 1 ] 				= (uint8_t)( ( INADDR_LOOPBACK >> 16 ) & 0xFF );
		p[ 2 ] 				= (uint8_t)( ( INADDR_LOOPBACK >>  8 ) & 0xFF );
		p[ 3 ] 				= (uint8_t)(   INADDR_LOOPBACK         & 0xFF );
		DebugSNPrintF( s, sizeof( s ), "%##a", &sa4 );
		require_action( strcmp( s, "127.0.0.1:80" ) == 0, exit, err = -1 );
	}
	#endif
	
	#if( AF_INET6 )
	{
		struct sockaddr_in6		sa6;
		
		memset( &sa6, 0, sizeof( sa6 ) );
		sa6.sin6_family 			= AF_INET6;
		p 							= (uint8_t *) &sa6.sin6_port;
		p[ 0 ] 						= (uint8_t)( ( 80 >> 8 ) & 0xFF );
		p[ 1 ] 						= (uint8_t)(   80        & 0xFF );
		sa6.sin6_addr.s6_addr[  0 ]	= 0xFE;
		sa6.sin6_addr.s6_addr[  1 ]	= 0x80;
		sa6.sin6_addr.s6_addr[ 15 ]	= 0x01;
		sa6.sin6_scope_id			= 2;
		DebugSNPrintF( s, sizeof( s ), "%##a", &sa6 );
		require_action( strcmp( s, "[FE80:0000:0000:0000:0000:0000:0000:0001%2]:80" ) == 0, exit, err = -1 );
	}
	#endif
	
	// Unicode

	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "tes" );
	require_action( strcmp( s, "tes" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "test" );
	require_action( strcmp( s, "test" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "testing" );
	require_action( strcmp( s, "test" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xC3\xA9" );
	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xC3\xA9ing" );
	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "tes\xC3\xA9ing" );
	require_action( strcmp( s, "tes" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "t\xed\x9f\xbf" );
	require_action( strcmp( s, "t\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "t\xed\x9f\xbfing" );
	require_action( strcmp( s, "t\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xed\x9f\xbf" );
	require_action( strcmp( s, "te" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xed\x9f\xbfing" );
	require_action( strcmp( s, "te" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 7, "te\xC3\xA9\xed\x9f\xbfing" );
	require_action( strcmp( s, "te\xC3\xA9\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 6, "te\xC3\xA9\xed\x9f\xbfing" );
	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
	
	DebugSNPrintF(s, sizeof(s), "%.*s", 5, "te\xC3\xA9\xed\x9f\xbfing" );
	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );

	#if( TARGET_RT_BIG_ENDIAN )
		DebugSNPrintF( s, sizeof( s ), "%S", "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );
		require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
	#else
		DebugSNPrintF( s, sizeof( s ), "%S", "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );
		require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
	#endif
	
	DebugSNPrintF( s, sizeof( s ), "%S", 
		"\xFE\xFF" "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );	// Big Endian BOM
	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%S", 
		"\xFF\xFE" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );	// Little Endian BOM
	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%#S", "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );	// Big Endian
	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%##S", "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );	// Little Endian
	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%.*S", 
		4, "\xFE\xFF" "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );	// Big Endian BOM
	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%.*S", 
		4, "\xFF\xFE" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );	// Little Endian BOM
	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
	
	#if( TARGET_RT_BIG_ENDIAN )
		DebugSNPrintF( s, sizeof( s ), "%.*S", 3, "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );
		require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
	#else
		DebugSNPrintF( s, sizeof( s ), "%.*S", 3, "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );
		require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
	#endif
	
	DebugSNPrintF( s, sizeof( s ), "%#.*S", 3, "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );	// Big Endian
	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%##.*S", 3, "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );	// Little Endian
	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
	
	// Misc
	
	DebugSNPrintF( s, sizeof( s ), "%U", "\x10\xb8\xa7\x6b" "\xad\x9d" "\xd1\x11" "\x80\xb4" "\x00\xc0\x4f\xd4\x30\xc8" );
	require_action( strcmp( s, "6ba7b810-9dad-11d1-80b4-00c04fd430c8" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%m", 0 );
	require_action( strcmp( s, "no error" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "%lm", (long) 0 );
	require_action( strcmp( s, "no error" ) == 0, exit, err = -1 );
	
	DebugSNPrintF( s, sizeof( s ), "\"%H\"", "\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8", 16, 16 );
	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
	
	DebugSNPrintF( s, sizeof( s ), "\"%H\"", 
		"\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8"
		"\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8", 
		32, 32 );
	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
	
	DebugSNPrintF( s, sizeof( s ), "\"%H\"", "\x6b\xa7", 2, 2 );
	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
	
	// Hex Dumps
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNone, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoAddress | kDebugFlagsNoOffset, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoAddress | kDebugFlagsNoOffset, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoAddress, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoOffset, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoAddress, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoOffset, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoByteCount, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, "\x41\x62\x43\x64", "\x41\x62\x43\x64", 4,	// 'AbCd'
		kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoNewLine |
		kDebugFlagsNo32BitSeparator | kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount, 
		s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), 
		kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoASCII | kDebugFlagsNoNewLine |
		kDebugFlags16BitSeparator | kDebugFlagsNo32BitSeparator |
		kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	s[ 0 ] = '\0';
	DebugHexDump( kDebugLevelMax, 8, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), kDebugFlagsNone, s, sizeof( s ) );
	DebugPrintF( kDebugLevelMax, "%s\n", s );
	
	// dlog's
	
	dlog( kDebugLevelNotice, "dlog\n" );
	dlog( kDebugLevelNotice, "dlog integer: %d\n", 123 );
	dlog( kDebugLevelNotice, "dlog string:  \"%s\"\n", "test string" );
	dlogmem( kDebugLevelNotice, data, sizeof( data ) );
	
	// Done
	
	DebugPrintF( kDebugLevelMax, "\n\nALL TESTS DONE\n\n" );
	err = kNoErr;
	
exit:
	if( err )
	{
		DebugPrintF( kDebugLevelMax, "\n\n### TEST FAILED ###\n\n" );
	}
	return( err );
}

#endif	// DEBUG
