147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt/* -*- Mode: C; tab-width: 4 -*-
247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Licensed under the Apache License, Version 2.0 (the "License");
647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * you may not use this file except in compliance with the License.
747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * You may obtain a copy of the License at
847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *     http://www.apache.org/licenses/LICENSE-2.0
1047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt *
1147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * Unless required by applicable law or agreed to in writing, software
1247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * distributed under the License is distributed on an "AS IS" BASIS,
1347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * See the License for the specific language governing permissions and
1547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt * limitations under the License.
1647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
1747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	To Do:
1847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
1947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	- Use StackWalk on Windows to optionally print stack frames.
2047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt*/
2147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
2347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Includes ==
2447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
2547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
2647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
2747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Includes
2847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
2947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( !KERNEL )
3147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	<ctype.h>
3247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	<stdio.h>
3347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	<string.h>
3447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
3547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include	"CommonServices.h"
3747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
3847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#include	"DebugServices.h"
3947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG )
4147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_VXWORKS )
4347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	"intLib.h"
4447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
4547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
4747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	<time.h>
4847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
4947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( !TARGET_OS_WINDOWS_CE )
5047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#include	<fcntl.h>
5147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#include	<io.h>
5247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
5347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
5447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_IDEBUG_ENABLED && TARGET_API_MAC_OSX_KERNEL )
5647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	<IOKit/IOLib.h>
5747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
5847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
5947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// If MDNS_DEBUGMSGS is defined (even if defined 0), it is aware of mDNS and it is probably safe to include mDNSEmbeddedAPI.h.
6047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( defined( MDNS_DEBUGMSGS ) )
6247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#include	"mDNSEmbeddedAPI.h"
6347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
6447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
6647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Macros ==
6747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
6847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
6947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
7047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Macros
7147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
7247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#define DebugIsPrint( C )		( ( ( C ) >= 0x20 ) && ( ( C ) <= 0x7E ) )
7447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
7647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Prototypes ==
7747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
7847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
7947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
8047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Prototypes
8147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
8247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic OSStatus	DebugPrint( DebugLevel inLevel, char *inData, size_t inSize );
8447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// fprintf
8647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
8747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_FPRINTF_ENABLED )
8847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static OSStatus	DebugFPrintFInit( DebugOutputTypeFlags inFlags, const char *inFilename );
8947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void		DebugFPrintFPrint( char *inData, size_t inSize );
9047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
9147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// iDebug (Mac OS X user and kernel)
9347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_IDEBUG_ENABLED )
9547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static OSStatus	DebugiDebugInit( void );
9647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void		DebugiDebugPrint( char *inData, size_t inSize );
9747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
9847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
9947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// kprintf (Mac OS X Kernel)
10047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
10147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_KPRINTF_ENABLED )
10247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void	DebugKPrintFPrint( char *inData, size_t inSize );
10347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
10447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
10547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Mac OS X IOLog (Mac OS X Kernel)
10647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
10747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
10847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void	DebugMacOSXIOLogPrint( char *inData, size_t inSize );
10947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
11047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
11147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Mac OS X Log
11247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
11347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_MAC )
11447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static OSStatus	DebugMacOSXLogInit( void );
11547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void		DebugMacOSXLogPrint( char *inData, size_t inSize );
11647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
11747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
11847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Windows Debugger
11947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
12047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
12147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void	DebugWindowsDebuggerPrint( char *inData, size_t inSize );
12247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
12347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
12447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Windows Event Log
12547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
12647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
12747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static OSStatus	DebugWindowsEventLogInit( const char *inName, HMODULE inModule );
12847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void	DebugWindowsEventLogPrint( DebugLevel inLevel, char *inData, size_t inSize );
12947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
13047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// DebugLib support
13247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
13347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
13447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static pascal void
13547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugAssertOutputHandler(
13647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			OSType 				inComponentSignature,
13747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			UInt32 				inOptions,
13847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *		inAssertionString,
13947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *		inExceptionString,
14047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *		inErrorString,
14147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *		inFileName,
14247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			long 				inLineNumber,
14347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			void *				inValue,
14447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			ConstStr255Param 	inOutputMsg );
14547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
14647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Utilities
14847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
14947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic char *	DebugNumVersionToString( uint32_t inVersion, char *inString );
15047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
15147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
15247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static void	DebugWinEnableConsole( void );
15347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
15447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
15547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
15647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static TCHAR *
15747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugWinCharToTCharString(
15847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *	inCharString,
15947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t 			inCharCount,
16047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			TCHAR *			outTCharString,
16147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t 			inTCharCountMax,
16247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t *		outTCharCount );
16347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
16447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
16647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Globals ==
16747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
16847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
16947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
17047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Private Globals
17147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
17247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
17347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_VXWORKS )
17447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// TCP States for inetstatShow.
17547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
17647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	extern char **	pTcpstates;		// defined in tcpLib.c
17747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
17847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		kDebugTCPStates[] =
17947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
18047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(0)  TCPS_CLOSED",
18147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(1)  TCPS_LISTEN",
18247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(2)  TCPS_SYN_SENT",
18347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(3)  TCPS_SYN_RECEIVED",
18447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(4)  TCPS_ESTABLISHED",
18547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(5)  TCPS_CLOSE_WAIT",
18647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(6)  TCPS_FIN_WAIT_1",
18747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(7)  TCPS_CLOSING",
18847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(8)  TCPS_LAST_ACK",
18947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(9)  TCPS_FIN_WAIT_2",
19047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"(10) TCPS_TIME_WAIT",
19147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	};
19247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
19347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
19447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// General
19547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
19647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic bool									gDebugInitialized				= false;
19747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic DebugOutputType						gDebugOutputType 				= kDebugOutputTypeNone;
19847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic DebugLevel							gDebugPrintLevelMin				= kDebugLevelInfo;
19947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic DebugLevel							gDebugPrintLevelMax				= kDebugLevelMax;
20047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic DebugLevel							gDebugBreakLevel				= kDebugLevelAssert;
20147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
20247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static DebugAssertOutputHandlerUPP		gDebugAssertOutputHandlerUPP	= NULL;
20347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
20447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// Custom
20647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
20747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic DebugOutputFunctionPtr				gDebugCustomOutputFunction 		= NULL;
20847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void *								gDebugCustomOutputContext 		= NULL;
20947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// fprintf
21147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_FPRINTF_ENABLED )
21347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static FILE *							gDebugFPrintFFile 				= NULL;
21447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
21547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// MacOSXLog
21747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
21847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_MAC )
21947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	typedef int	( *DebugMacOSXLogFunctionPtr )( const char *inFormat, ... );
22047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static DebugMacOSXLogFunctionPtr		gDebugMacOSXLogFunction			= NULL;
22247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
22347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt// WindowsEventLog
22547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
22747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
22847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static HANDLE							gDebugWindowsEventLogEventSource = NULL;
22947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
23047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
23147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
23247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark -
23347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == General ==
23447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
23547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
23647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
23747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugInitialize
23847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
23947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24047e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT OSStatus	DebugInitialize( DebugOutputType inType, ... )
24147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
24247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus			err;
24347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugOutputType		type;
24447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_list				args;
24547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_start( args, inType );
24747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
24847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_VXWORKS )
24947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set up the TCP state strings if they are not already set up by VxWorks (normally not set up for some reason).
25047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
25147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( !pTcpstates )
25247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
25347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		pTcpstates = (char **) kDebugTCPStates;
25447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
25547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
25647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
25747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set up DebugLib stuff (if building with Debugging.h).
25847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
25947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
26047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( !gDebugAssertOutputHandlerUPP )
26147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
26247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		gDebugAssertOutputHandlerUPP = NewDebugAssertOutputHandlerUPP( DebugAssertOutputHandler );
26347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( gDebugAssertOutputHandlerUPP );
26447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( gDebugAssertOutputHandlerUPP )
26547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
26647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			InstallDebugAssertOutputHandler( gDebugAssertOutputHandlerUPP );
26747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
26847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
26947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
27047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
27147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Pre-process meta-output kind to pick an appropriate output kind for the platform.
27247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
27347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	type = inType;
27447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( type == kDebugOutputTypeMetaConsole )
27547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
27647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#if( TARGET_OS_MAC )
27747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			type = kDebugOutputTypeMacOSXLog;
27847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#elif( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
27947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#if( DEBUG_FPRINTF_ENABLED )
28047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeFPrintF;
28147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#else
28247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeWindowsDebugger;
28347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#endif
28447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#elif( TARGET_API_MAC_OSX_KERNEL )
28547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
28647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeMacOSXIOLog;
28747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#elif( DEBUG_IDEBUG_ENABLED )
28847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeiDebug;
28947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#elif( DEBUG_KPRINTF_ENABLED )
29047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeKPrintF;
29147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#endif
29247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#elif( TARGET_OS_VXWORKS )
29347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#if( DEBUG_FPRINTF_ENABLED )
29447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeFPrintF;
29547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#else
29647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				#error target is VxWorks, but fprintf output is disabled
29747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#endif
29847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#else
29947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#if( DEBUG_FPRINTF_ENABLED )
30047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				type = kDebugOutputTypeFPrintF;
30147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#endif
30247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#endif
30347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
30447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Process output kind.
30647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
30747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	gDebugOutputType = type;
30847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	switch( type )
30947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
31047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeNone:
31147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
31247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
31347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
31447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeCustom:
31547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			gDebugCustomOutputFunction = va_arg( args, DebugOutputFunctionPtr );
31647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			gDebugCustomOutputContext  = va_arg( args, void * );
31747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
31847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
31947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
32047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_FPRINTF_ENABLED )
32147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeFPrintF:
32247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( inType == kDebugOutputTypeMetaConsole )
32347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
32447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				err = DebugFPrintFInit( kDebugOutputTypeFlagsStdErr, NULL );
32547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
32647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			else
32747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
32847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				DebugOutputTypeFlags		flags;
32947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				const char *				filename;
33047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
33147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				flags = (DebugOutputTypeFlags) va_arg( args, unsigned int );
33247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( ( flags & kDebugOutputTypeFlagsTypeMask ) == kDebugOutputTypeFlagsFile )
33347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
33447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					filename = va_arg( args, const char * );
33547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
33647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else
33747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
33847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					filename = NULL;
33947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
34047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				err = DebugFPrintFInit( flags, filename );
34147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
34247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
34347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
34447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
34547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_IDEBUG_ENABLED )
34647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeiDebug:
34747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = DebugiDebugInit();
34847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
34947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
35047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
35147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_KPRINTF_ENABLED )
35247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeKPrintF:
35347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
35447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
35547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
35647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
35747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
35847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeMacOSXIOLog:
35947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
36047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
36147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
36247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_MAC )
36447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeMacOSXLog:
36547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = DebugMacOSXLogInit();
36647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
36747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
36847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
36947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
37047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeWindowsDebugger:
37147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
37247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
37347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
37447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
37547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
37647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeWindowsEventLog:
37747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
37847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *		name;
37947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			HMODULE				module;
38047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
38147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			name   = va_arg( args, const char * );
38247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			module = va_arg( args, HMODULE );
38347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = DebugWindowsEventLogInit( name, module );
38447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
38547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		break;
38647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
38747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
38847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		default:
38947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kParamErr;
39047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			goto exit;
39147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
39247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	gDebugInitialized = true;
39347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
39547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_end( args );
39647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
39747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
39847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
39947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
40047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugFinalize
40147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
40247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
40347e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT void		DebugFinalize( void )
40447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
40547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
40647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check( gDebugAssertOutputHandlerUPP );
40747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( gDebugAssertOutputHandlerUPP )
40847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
40947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		InstallDebugAssertOutputHandler( NULL );
41047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DisposeDebugAssertOutputHandlerUPP( gDebugAssertOutputHandlerUPP );
41147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		gDebugAssertOutputHandlerUPP = NULL;
41247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
41347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
41447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
41547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
41647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
41747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugGetProperty
41847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
41947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42047e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT OSStatus	DebugGetProperty( DebugPropertyTag inTag, ... )
42147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
42247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus			err;
42347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_list				args;
42447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugLevel *		level;
42547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
42647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_start( args, inTag );
42747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	switch( inTag )
42847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
42947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugPropertyTagPrintLevelMin:
43047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			level  = va_arg( args, DebugLevel * );
43147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*level = gDebugPrintLevelMin;
43247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
43347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
43447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
43547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugPropertyTagPrintLevelMax:
43647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			level  = va_arg( args, DebugLevel * );
43747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*level = gDebugPrintLevelMax;
43847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
43947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
44047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugPropertyTagBreakLevel:
44247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			level  = va_arg( args, DebugLevel * );
44347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*level = gDebugBreakLevel;
44447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
44547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
44647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
44747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		default:
44847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kUnsupportedErr;
44947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
45047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
45147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_end( args );
45247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
45347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
45447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
45647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugSetProperty
45747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
45847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
45947e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT OSStatus	DebugSetProperty( DebugPropertyTag inTag, ... )
46047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
46147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus		err;
46247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_list			args;
46347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugLevel		level;
46447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
46547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_start( args, inTag );
46647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	switch( inTag )
46747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
46847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugPropertyTagPrintLevelMin:
46947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			level  = va_arg( args, DebugLevel );
47047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			gDebugPrintLevelMin = level;
47147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
47247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
47347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
47447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugPropertyTagPrintLevelMax:
47547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			level  = va_arg( args, DebugLevel );
47647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			gDebugPrintLevelMax = level;
47747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
47847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
47947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugPropertyTagBreakLevel:
48147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			level  = va_arg( args, DebugLevel );
48247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			gDebugBreakLevel = level;
48347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kNoErr;
48447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
48547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
48647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		default:
48747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			err = kUnsupportedErr;
48847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
48947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
49047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_end( args );
49147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
49247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
49347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
49547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark -
49647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Output ==
49747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
49847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
49947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
50047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugPrintF
50147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
50247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50347e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT size_t	DebugPrintF( DebugLevel inLevel, const char *inFormat, ... )
50447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
50547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_list		args;
50647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t		n;
50747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
50847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Skip if the level is not in the enabled range..
50947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
51147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
51247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		n = 0;
51347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto exit;
51447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
51547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
51647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_start( args, inFormat );
51747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	n = DebugPrintFVAList( inLevel, inFormat, args );
51847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_end( args );
51947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
52147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( n );
52247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
52347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
52547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugPrintFVAList
52647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
52747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
52847e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT size_t	DebugPrintFVAList( DebugLevel inLevel, const char *inFormat, va_list inArgs )
52947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
53047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t		n;
53147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char		buffer[ 512 ];
53247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Skip if the level is not in the enabled range..
53447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
53547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
53647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
53747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		n = 0;
53847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto exit;
53947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
54047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	n = DebugSNPrintFVAList( buffer, sizeof( buffer ), inFormat, inArgs );
54247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrint( inLevel, buffer, (size_t) n );
54347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
54547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( n );
54647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
54747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
54847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
54947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugPrint
55047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
55147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
55247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic OSStatus	DebugPrint( DebugLevel inLevel, char *inData, size_t inSize )
55347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
55447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus		err;
55547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
55647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Skip if the level is not in the enabled range..
55747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
55847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
55947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
56047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		err = kRangeErr;
56147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto exit;
56247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
56347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
56447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Printing is not safe at interrupt time so check for this and warn with an interrupt safe mechanism (if available).
56547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
56647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( DebugTaskLevel() & kDebugInterruptLevelMask )
56747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
56847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#if( TARGET_OS_VXWORKS )
56947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			logMsg( "\ncannot print at interrupt time\n\n", 1, 2, 3, 4, 5, 6 );
57047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#endif
57147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		err = kExecutionStateErr;
57347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto exit;
57447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
57547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Initialize the debugging library if it hasn't already been initialized (allows for zero-config usage).
57747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
57847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( !gDebugInitialized )
57947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
58047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		debug_initialize( kDebugOutputTypeMetaConsole );
58147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
58247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
58347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Print based on the current output type.
58447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
58547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	switch( gDebugOutputType )
58647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
58747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeNone:
58847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
58947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
59047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeCustom:
59147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( gDebugCustomOutputFunction )
59247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
59347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				gDebugCustomOutputFunction( inData, inSize, gDebugCustomOutputContext );
59447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
59547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
59647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
59747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_FPRINTF_ENABLED )
59847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeFPrintF:
59947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugFPrintFPrint( inData, inSize );
60047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
60147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
60247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
60347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_IDEBUG_ENABLED )
60447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeiDebug:
60547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugiDebugPrint( inData, inSize );
60647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
60747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
60847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
60947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_KPRINTF_ENABLED )
61047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeKPrintF:
61147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugKPrintFPrint( inData, inSize );
61247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
61347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
61447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
61547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
61647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeMacOSXIOLog:
61747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugMacOSXIOLogPrint( inData, inSize );
61847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
61947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
62047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
62147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_MAC )
62247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeMacOSXLog:
62347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugMacOSXLogPrint( inData, inSize );
62447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
62547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
62647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
62747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
62847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeWindowsDebugger:
62947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugWindowsDebuggerPrint( inData, inSize );
63047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
63147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
63247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
63347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
63447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kDebugOutputTypeWindowsEventLog:
63547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugWindowsEventLogPrint( inLevel, inData, inSize );
63647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
63747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
63847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
63947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		default:
64047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
64147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
64247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = kNoErr;
64347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
64447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
64547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
64647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
64747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
64847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
64947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugPrintAssert
65047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//
65147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Warning: This routine relies on several of the strings being string constants that will exist forever because the
65247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//           underlying logMsg API that does the printing is asynchronous so it cannot use temporary/stack-based
65347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//           pointer variables (e.g. local strings). The debug macros that invoke this function only use constant
65447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//           constant strings, but if this function is invoked directly from other places, it must use constant strings.
65547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
65647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
65747e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT void
65847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintAssert(
65947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		int_least32_t	inErrorCode,
66047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *	inAssertString,
66147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *	inMessage,
66247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *	inFilename,
66347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		int_least32_t	inLineNumber,
66447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *	inFunction )
66547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
66647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Skip if the level is not in the enabled range..
66747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
66847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( ( kDebugLevelAssert < gDebugPrintLevelMin ) || ( kDebugLevelAssert > gDebugPrintLevelMax ) )
66947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
67047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		return;
67147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
67247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
67347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inErrorCode != 0 )
67447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
67547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugPrintF(
67647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			kDebugLevelAssert,
67747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"\n"
67847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"[ASSERT] error:  %ld (%m)\n"
67947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"[ASSERT] where:  \"%s\", line %ld, \"%s\"\n"
68047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"\n",
68147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inErrorCode, inErrorCode,
68247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inFilename ? inFilename : "",
68347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inLineNumber,
68447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inFunction ? inFunction : "" );
68547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
68647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	else
68747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
68847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugPrintF(
68947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			kDebugLevelAssert,
69047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"\n"
69147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"[ASSERT] assert: \"%s\" %s\n"
69247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"[ASSERT] where:  \"%s\", line %ld, \"%s\"\n"
69347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			"\n",
69447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inAssertString ? inAssertString : "",
69547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inMessage ? inMessage : "",
69647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inFilename ? inFilename : "",
69747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inLineNumber,
69847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inFunction ? inFunction : "" );
69947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
70047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
70147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Break into the debugger if enabled.
70247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
70347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TARGET_OS_WIN32 )
70447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( gDebugBreakLevel <= kDebugLevelAssert )
70547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
70647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( IsDebuggerPresent() )
70747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
70847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				DebugBreak();
70947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
71047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
71147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
71247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
71347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
71447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
71547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark -
71647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
71747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
71847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_FPRINTF_ENABLED )
71947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
72047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugFPrintFInit
72147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
72247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
72347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic OSStatus	DebugFPrintFInit( DebugOutputTypeFlags inFlags, const char *inFilename )
72447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
72547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus					err;
72647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugOutputTypeFlags		typeFlags;
72747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
72847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	typeFlags = inFlags & kDebugOutputTypeFlagsTypeMask;
72947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( typeFlags == kDebugOutputTypeFlagsStdOut )
73047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
73147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#if( TARGET_OS_WIN32 )
73247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugWinEnableConsole();
73347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#endif
73447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
73547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		gDebugFPrintFFile = stdout;
73647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
73747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	else if( typeFlags == kDebugOutputTypeFlagsStdErr )
73847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
73947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#if( TARGET_OS_WIN32 )
74047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			DebugWinEnableConsole();
74147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#endif
74247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
74347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		gDebugFPrintFFile = stdout;
74447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
74547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	else if( typeFlags == kDebugOutputTypeFlagsFile )
74647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
74747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action_quiet( inFilename && ( *inFilename != '\0' ), exit, err = kOpenErr );
74847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
74947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		gDebugFPrintFFile = fopen( inFilename, "a" );
75047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action_quiet( gDebugFPrintFFile, exit, err = kOpenErr );
75147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
75247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	else
75347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
75447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		err = kParamErr;
75547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto exit;
75647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
75747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = kNoErr;
75847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
75947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
76047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
76147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
76247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
76347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
76447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugFPrintFPrint
76547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
76647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
76747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugFPrintFPrint( char *inData, size_t inSize )
76847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
76947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *		p;
77047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *		q;
77147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
77247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Convert \r to \n. fprintf will interpret \n and convert to whatever is appropriate for the platform.
77347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
77447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	p = inData;
77547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	q = p + inSize;
77647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	while( p < q )
77747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
77847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( *p == '\r' )
77947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
78047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*p = '\n';
78147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
78247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		++p;
78347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
78447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
78547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Write the data and flush.
78647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
78747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( gDebugFPrintFFile )
78847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
78947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		fprintf( gDebugFPrintFFile, "%.*s", (int) inSize, inData );
79047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		fflush( gDebugFPrintFFile );
79147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
79247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
79347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif	// DEBUG_FPRINTF_ENABLED
79447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
79547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_IDEBUG_ENABLED )
79647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
79747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugiDebugInit
79847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
79947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic OSStatus	DebugiDebugInit( void )
80147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
80247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus		err;
80347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TARGET_API_MAC_OSX_KERNEL )
80547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		extern uint32_t *		_giDebugReserved1;
80747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
80847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Emulate the iDebugSetOutputType macro in iDebugServices.h.
80947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Note: This is not thread safe, but neither is iDebugServices.h nor iDebugKext.
81047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
81147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( !_giDebugReserved1 )
81247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
81347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			_giDebugReserved1 = (uint32_t *) IOMalloc( sizeof( uint32_t ) );
81447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			require_action_quiet( _giDebugReserved1, exit, err = kNoMemoryErr );
81547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
81647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*_giDebugReserved1 = 0x00010000U;
81747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		err = kNoErr;
81847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
81947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
82047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
82147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		__private_extern__ void	iDebugSetOutputTypeInternal( uint32_t inType );
82247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
82347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		iDebugSetOutputTypeInternal( 0x00010000U );
82447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		err = kNoErr;
82547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
82647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
82747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
82847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
82947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
83047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
83147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
83247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugiDebugPrint
83347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
83447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
83547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugiDebugPrint( char *inData, size_t inSize )
83647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
83747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TARGET_API_MAC_OSX_KERNEL )
83847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
83947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Locally declared here so we do not need to include iDebugKext.h.
84047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Note: IOKit uses a global namespace for all code and only a partial link occurs at build time. When the
84147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// KEXT is loaded, the runtime linker will link in this extern'd symbol (assuming iDebug is present).
84247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// _giDebugLogInternal is actually part of IOKit proper so this should link even if iDebug is not present.
84347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
84447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		typedef void ( *iDebugLogFunctionPtr )( uint32_t inLevel, uint32_t inTag, const char *inFormat, ... );
84547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
84647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		extern iDebugLogFunctionPtr		_giDebugLogInternal;
84747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
84847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( _giDebugLogInternal )
84947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
85047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			_giDebugLogInternal( 0, 0, "%.*s", (int) inSize, inData );
85147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
85247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
85347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
85447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
85547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		__private_extern__ void	iDebugLogInternal( uint32_t inLevel, uint32_t inTag, const char *inFormat, ... );
85647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
85747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		iDebugLogInternal( 0, 0, "%.*s", (int) inSize, inData );
85847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
85947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
86047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
86147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
86247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
86347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_KPRINTF_ENABLED )
86447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
86547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugKPrintFPrint
86647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
86747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
86847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugKPrintFPrint( char *inData, size_t inSize )
86947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
87047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	extern void	kprintf( const char *inFormat, ... );
87147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
87247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	kprintf( "%.*s", (int) inSize, inData );
87347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
87447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
87547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
87647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
87747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
87847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugMacOSXIOLogPrint
87947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
88047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
88147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugMacOSXIOLogPrint( char *inData, size_t inSize )
88247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
88347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	extern void	IOLog( const char *inFormat, ... );
88447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
88547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	IOLog( "%.*s", (int) inSize, inData );
88647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
88747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
88847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
88947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_MAC )
89047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
89147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugMacOSXLogInit
89247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
89347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
89447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic OSStatus	DebugMacOSXLogInit( void )
89547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
89647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus		err;
89747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	CFStringRef		path;
89847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	CFURLRef		url;
89947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	CFBundleRef		bundle;
90047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	CFStringRef		functionName;
90147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	void *			functionPtr;
90247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
90347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	bundle = NULL;
90447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
90547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Create a bundle reference for System.framework.
90647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
90747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	path = CFSTR( "/System/Library/Frameworks/System.framework" );
90847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	url = CFURLCreateWithFileSystemPath( NULL, path, kCFURLPOSIXPathStyle, true );
90947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_quiet( url, exit, err = memFullErr );
91047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
91147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	bundle = CFBundleCreate( NULL, url );
91247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	CFRelease( url );
91347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_quiet( bundle, exit, err = memFullErr );
91447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
91547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Get a ptr to the system's "printf" function from System.framework.
91647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
91747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	functionName = CFSTR( "printf" );
91847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	functionPtr = CFBundleGetFunctionPointerForName( bundle, functionName );
91947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_quiet( functionPtr, exit, err = memFullErr );
92047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
92147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Success! Note: The bundle cannot be released because it would invalidate the function ptr.
92247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
92347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	gDebugMacOSXLogFunction = (DebugMacOSXLogFunctionPtr) functionPtr;
92447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	bundle = NULL;
92547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = noErr;
92647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
92747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
92847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( bundle )
92947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
93047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CFRelease( bundle );
93147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
93247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
93347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
93447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
93547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
93647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugMacOSXLogPrint
93747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
93847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
93947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugMacOSXLogPrint( char *inData, size_t inSize )
94047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
94147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( gDebugMacOSXLogFunction )
94247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
94347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		gDebugMacOSXLogFunction( "%.*s", (int) inSize, inData );
94447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
94547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
94647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
94747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
94847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
94947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
95047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugWindowsDebuggerPrint
95147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
95247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
95347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltvoid	DebugWindowsDebuggerPrint( char *inData, size_t inSize )
95447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
95547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR				buffer[ 512 ];
95647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		src;
95747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		end;
95847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR *				dst;
95947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				c;
96047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
96147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Copy locally and null terminate the string. This also converts from char to TCHAR in case we are
96247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// building with UNICODE enabled since the input is always char. Also convert \r to \n in the process.
96347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
96447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	src = inData;
96547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inSize >= sizeof_array( buffer ) )
96647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
96747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inSize = sizeof_array( buffer ) - 1;
96847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
96947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	end = src + inSize;
97047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dst = buffer;
97147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	while( src < end )
97247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
97347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		c = *src++;
97447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( c == '\r' )
97547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
97647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			c = '\n';
97747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
97847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*dst++ = (TCHAR) c;
97947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
98047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	*dst = 0;
98147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
98247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Print out the string to the debugger.
98347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
98447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OutputDebugString( buffer );
98547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
98647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
98747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
98847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
98947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
99047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugWindowsEventLogInit
99147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
99247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
99347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic OSStatus	DebugWindowsEventLogInit( const char *inName, HMODULE inModule )
99447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
99547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus			err;
99647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	HKEY				key;
99747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR				name[ 128 ];
99847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		src;
99947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR				path[ MAX_PATH ];
100047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t				size;
100147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DWORD				typesSupported;
100247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DWORD 				n;
100347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	key = NULL;
100547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Use a default name if needed then convert the name to TCHARs so it works on ANSI or Unicode builds.
100747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
100847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( !inName || ( *inName == '\0' ) )
100947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
101047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inName = "DefaultApp";
101147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
101247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugWinCharToTCharString( inName, kSizeCString, name, sizeof( name ), NULL );
101347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
101447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Build the path string using the fixed registry path and app name.
101547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
101647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	src = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\";
101747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugWinCharToTCharString( src, kSizeCString, path, sizeof_array( path ), &size );
101847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugWinCharToTCharString( inName, kSizeCString, path + size, sizeof_array( path ) - size, NULL );
101947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
102047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Add/Open the source name as a sub-key under the Application key in the EventLog registry key.
102147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
102247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL );
102347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
102447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
102547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set the path in the EventMessageFile subkey. Add 1 to the TCHAR count to include the null terminator.
102647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
102747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	n = GetModuleFileName( inModule, path, sizeof_array( path ) );
102847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = translate_errno( n > 0, (OSStatus) GetLastError(), kParamErr );
102947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
103047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	n += 1;
103147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	n *= sizeof( TCHAR );
103247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = RegSetValueEx( key, TEXT( "EventMessageFile" ), 0, REG_EXPAND_SZ, (const LPBYTE) path, n );
103447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
103547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set the supported event types in the TypesSupported subkey.
103747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
103847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	typesSupported = EVENTLOG_SUCCESS | EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE |
103947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					 EVENTLOG_AUDIT_SUCCESS | EVENTLOG_AUDIT_FAILURE;
104047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = RegSetValueEx( key, TEXT( "TypesSupported" ), 0, REG_DWORD, (const LPBYTE) &typesSupported, sizeof( DWORD ) );
104147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
104247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
104347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set up the event source.
104447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
104547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	gDebugWindowsEventLogEventSource = RegisterEventSource( NULL, name );
104647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = translate_errno( gDebugWindowsEventLogEventSource, (OSStatus) GetLastError(), kParamErr );
104747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
104847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
104947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
105047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( key )
105147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
105247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		RegCloseKey( key );
105347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
105447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
105547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
105647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
105747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
105847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugWindowsEventLogPrint
105947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
106047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
106147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugWindowsEventLogPrint( DebugLevel inLevel, char *inData, size_t inSize )
106247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
106347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	WORD				type;
106447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR				buffer[ 512 ];
106547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		src;
106647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		end;
106747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR *				dst;
106847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				c;
106947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const TCHAR *		array[ 1 ];
107047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
107147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Map the debug level to a Windows EventLog type.
107247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
107347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inLevel <= kDebugLevelNotice )
107447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
107547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		type = EVENTLOG_INFORMATION_TYPE;
107647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
107747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	else if( inLevel <= kDebugLevelWarning )
107847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
107947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		type = EVENTLOG_WARNING_TYPE;
108047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
108147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	else
108247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
108347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		type = EVENTLOG_ERROR_TYPE;
108447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
108547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
108647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Copy locally and null terminate the string. This also converts from char to TCHAR in case we are
108747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// building with UNICODE enabled since the input is always char. Also convert \r to \n in the process.
108847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
108947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	src = inData;
109047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inSize >= sizeof_array( buffer ) )
109147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
109247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inSize = sizeof_array( buffer ) - 1;
109347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
109447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	end = src + inSize;
109547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dst = buffer;
109647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	while( src < end )
109747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
109847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		c = *src++;
109947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( c == '\r' )
110047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
110147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			c = '\n';
110247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
110347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*dst++ = (TCHAR) c;
110447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
110547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	*dst = 0;
110647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
110747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Add the the string to the event log.
110847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
110947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	array[ 0 ] = buffer;
111047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( gDebugWindowsEventLogEventSource )
111147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
111247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ReportEvent( gDebugWindowsEventLogEventSource, type, 0, 0x20000001L, NULL, 1, 0, array, NULL );
111347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
111447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
111547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif	// TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE
111647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
111747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
111847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
111947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugAssertOutputHandler
112047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
112147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
112247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic pascal void
112347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugAssertOutputHandler(
112447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		OSType 				inComponentSignature,
112547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		UInt32 				inOptions,
112647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *		inAssertString,
112747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *		inExceptionString,
112847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *		inErrorString,
112947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *		inFileName,
113047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		long 				inLineNumber,
113147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		void *				inValue,
113247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		ConstStr255Param 	inOutputMsg )
113347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
113447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inComponentSignature );
113547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inOptions );
113647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inExceptionString );
113747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inValue );
113847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inOutputMsg );
113947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
114047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintAssert( 0, inAssertString, inErrorString, inFileName, (int_least32_t) inLineNumber, "" );
114147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
114247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
114347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
114447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
114547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark -
114647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Utilities ==
114747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
114847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
114947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
115047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugSNPrintF
115147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//
115247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Stolen from mDNS.c's mDNS_snprintf/mDNS_vsnprintf with the following changes:
115347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//
115447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Changed names to avoid name collisions with the mDNS versions.
115547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Changed types to standard C types since mDNSEmbeddedAPI.h may not be available.
115647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Conditionalized mDNS stuff so it can be used with or with mDNSEmbeddedAPI.h.
115747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added 64-bit support for %d (%lld), %i (%lli), %u (%llu), %o (%llo), %x (%llx), and %b (%llb).
115847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %@   - Cocoa/CoreFoundation object. Param is the object. Strings are used directly. Others use CFCopyDescription.
115947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %.8a - FIbre Channel address. Arg=ptr to address.
116047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %##a - IPv4 (if AF_INET defined) or IPv6 (if AF_INET6 defined) sockaddr. Arg=ptr to sockaddr.
116147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %b   - Binary representation of integer (e.g. 01101011). Modifiers and arg=the same as %d, %x, etc.
116247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %C   - Mac-style FourCharCode (e.g. 'APPL'). Arg=32-bit value to print as a Mac-style FourCharCode.
116347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %H   - Hex Dump (e.g. "\x6b\xa7" -> "6B A7"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
116447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %#H  - Hex Dump & ASCII (e.g. "\x41\x62" -> "6B A7 'Ab'"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
116547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %m   - Error Message (e.g. 0 -> "kNoErr"). Modifiers and error code args are the same as %d, %x, etc.
116647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %S   - UTF-16 string. Host order if no BOM. Precision is UTF-16 char count. BOM counts in any precision. Arg=ptr.
116747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %#S  - Big Endian UTF-16 string (unless BOM overrides). Otherwise the same as %S.
116847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %##S - Little Endian UTF-16 string (unless BOM overrides). Otherwise the same as %S.
116947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	Added %U   - Universally Unique Identifier (UUID) (e.g. 6ba7b810-9dad-11d1-80b4-00c04fd430c8). Arg=ptr to 16-byte UUID.
117047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
117147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
117247e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT size_t DebugSNPrintF(char *sbuffer, size_t buflen, const char *fmt, ...)
117347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
117447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t length;
117547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
117647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_list ptr;
117747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_start(ptr,fmt);
117847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	length = DebugSNPrintFVAList(sbuffer, buflen, fmt, ptr);
117947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	va_end(ptr);
118047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
118147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return(length);
118247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
118347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
118447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
118547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugSNPrintFVAList	- va_list version of DebugSNPrintF. See DebugSNPrintF for more info.
118647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
118747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
118847e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT size_t DebugSNPrintFVAList(char *sbuffer, size_t buflen, const char *fmt, va_list arg)
118947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
119047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static const struct DebugSNPrintF_format
119147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
119247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned      leftJustify : 1;
119347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned      forceSign : 1;
119447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned      zeroPad : 1;
119547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned      havePrecision : 1;
119647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned      hSize : 1;
119747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char          lSize;
119847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char          altForm;
119947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char          sign;		// +, - or space
120047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned int  fieldWidth;
120147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		unsigned int  precision;
120247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		} DebugSNPrintF_format_default = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
120347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
120447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t nwritten = 0;
120547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int c;
120647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if (buflen == 0) return(0);
120747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	buflen--;		// Pre-reserve one space in the buffer for the terminating nul
120847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if (buflen == 0) goto exit;
120947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
121047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	for (c = *fmt; c != 0; c = *++fmt)
121147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
121247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if (c != '%')
121347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
121447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*sbuffer++ = (char)c;
121547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (++nwritten >= buflen) goto exit;
121647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
121747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		else
121847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
121947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			size_t i=0, j;
122047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// The mDNS Vsprintf Argument Conversion Buffer is used as a temporary holding area for
122147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// generating decimal numbers, hexdecimal numbers, IP addresses, domain name strings, etc.
122247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// The size needs to be enough for a 256-byte domain name plus some error text.
122347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#define mDNS_VACB_Size 300
122447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			char mDNS_VACB[mDNS_VACB_Size];
122547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#define mDNS_VACB_Lim (&mDNS_VACB[mDNS_VACB_Size])
122647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#define mDNS_VACB_Remain(s) ((size_t)(mDNS_VACB_Lim - s))
122747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			char *s = mDNS_VACB_Lim;
122847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			const char *digits = "0123456789ABCDEF";
122947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			struct DebugSNPrintF_format F = DebugSNPrintF_format_default;
123047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
123147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			for(;;)	//  decode flags
123247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
123347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				c = *++fmt;
123447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if      (c == '-') F.leftJustify = 1;
123547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else if (c == '+') F.forceSign = 1;
123647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else if (c == ' ') F.sign = ' ';
123747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else if (c == '#') F.altForm++;
123847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else if (c == '0') F.zeroPad = 1;
123947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else break;
124047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
124147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
124247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (c == '*')	//  decode field width
124347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
124447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				int f = va_arg(arg, int);
124547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if (f < 0) { f = -f; F.leftJustify = 1; }
124647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				F.fieldWidth = (unsigned int)f;
124747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				c = *++fmt;
124847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
124947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			else
125047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
125147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				for (; c >= '0' && c <= '9'; c = *++fmt)
125247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					F.fieldWidth = (10 * F.fieldWidth) + (c - '0');
125347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
125447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
125547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (c == '.')	//  decode precision
125647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
125747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if ((c = *++fmt) == '*')
125847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					{ F.precision = va_arg(arg, unsigned int); c = *++fmt; }
125947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else for (; c >= '0' && c <= '9'; c = *++fmt)
126047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						F.precision = (10 * F.precision) + (c - '0');
126147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				F.havePrecision = 1;
126247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
126347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
126447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (F.leftJustify) F.zeroPad = 0;
126547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
126647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			conv:
126747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			switch (c)	//  perform appropriate conversion
126847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
126947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				#if TYPE_LONGLONG_NATIVE
127047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					unsigned_long_long_compat n;
127147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					unsigned_long_long_compat base;
127247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				#else
127347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					unsigned long n;
127447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					unsigned long base;
127547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				#endif
127647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'h' :	F.hSize = 1; c = *++fmt; goto conv;
127747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'l' :	// fall through
127847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'L' :	F.lSize++; c = *++fmt; goto conv;
127947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'd' :
128047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'i' :	base = 10;
128147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto canBeSigned;
128247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'u' :	base = 10;
128347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto notSigned;
128447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'o' :	base = 8;
128547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto notSigned;
128647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'b' :	base = 2;
128747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto notSigned;
128847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'p' :	n = va_arg(arg, uintptr_t);
128947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							F.havePrecision = 1;
129047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							F.precision = (sizeof(uintptr_t) == 4) ? 8 : 16;
129147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							F.sign = 0;
129247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							base = 16;
129347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							c = 'x';
129447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto number;
129547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'x' :	digits = "0123456789abcdef";
129647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'X' :	base = 16;
129747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto notSigned;
129847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				canBeSigned:
129947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							#if TYPE_LONGLONG_NATIVE
130047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if (F.lSize == 1) n = (unsigned_long_long_compat)va_arg(arg, long);
130147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								else if (F.lSize == 2) n = (unsigned_long_long_compat)va_arg(arg, long_long_compat);
130247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								else n = (unsigned_long_long_compat)va_arg(arg, int);
130347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							#else
130447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if (F.lSize == 1) n = (unsigned long)va_arg(arg, long);
130547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								else if (F.lSize == 2) goto exit;
130647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								else n = (unsigned long)va_arg(arg, int);
130747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							#endif
130847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.hSize) n = (short) n;
130947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							#if TYPE_LONGLONG_NATIVE
131047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if ((long_long_compat) n < 0) { n = (unsigned_long_long_compat)-(long_long_compat)n; F.sign = '-'; }
131147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							#else
131247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if ((long) n < 0) { n = (unsigned long)-(long)n; F.sign = '-'; }
131347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							#endif
131447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else if (F.forceSign) F.sign = '+';
131547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto number;
131647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
131747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				notSigned:	if (F.lSize == 1) n = va_arg(arg, unsigned long);
131847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else if (F.lSize == 2)
131947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
132047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								#if TYPE_LONGLONG_NATIVE
132147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									n = va_arg(arg, unsigned_long_long_compat);
132247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								#else
132347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									goto exit;
132447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								#endif
132547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
132647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else n = va_arg(arg, unsigned int);
132747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.hSize) n = (unsigned short) n;
132847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							F.sign = 0;
132947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							goto number;
133047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
133147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				number:		if (!F.havePrecision)
133247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
133347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if (F.zeroPad)
133447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									{
133547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									F.precision = F.fieldWidth;
133647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									if (F.altForm) F.precision -= 2;
133747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									if (F.sign) --F.precision;
133847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									}
133947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if (F.precision < 1) F.precision = 1;
134047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
134147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.precision > mDNS_VACB_Size - 1)
134247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								F.precision = mDNS_VACB_Size - 1;
134347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							for (i = 0; n; n /= base, i++) *--s = (char)(digits[n % base]);
134447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							for (; i < F.precision; i++) *--s = '0';
134547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.altForm) { *--s = (char)c; *--s = '0'; i += 2; }
134647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.sign) { *--s = F.sign; i++; }
134747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
134847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
134947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'a' :	{
135047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							unsigned char *a = va_arg(arg, unsigned char *);
135147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							char pre[4] = "";
135247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							char post[32] = "";
135347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (!a) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
135447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else
135547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
135647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
135747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if (F.altForm == 1)
135847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									{
135947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									#if(defined(MDNS_DEBUGMSGS))
136047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										mDNSAddr *ip = (mDNSAddr*)a;
136147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										switch (ip->type)
136247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{
136347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											case mDNSAddrType_IPv4: F.precision =  4; a = (unsigned char *)&ip->ip.v4; break;
136447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											case mDNSAddrType_IPv6: F.precision = 16; a = (unsigned char *)&ip->ip.v6; break;
136547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											default:                F.precision =  0; break;
136647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											}
136747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									#else
136847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										F.precision = 0;	// mDNSEmbeddedAPI.h not included so no mDNSAddr support
136947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									#endif
137047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									}
137147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								else if (F.altForm == 2)
137247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									{
137347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									#ifdef AF_INET
137447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										const struct sockaddr *sa;
137547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										unsigned char *port;
137647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										sa = (const struct sockaddr*)a;
137747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										switch (sa->sa_family)
137847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{
137947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											case AF_INET:  F.precision =  4; a = (unsigned char*)&((const struct sockaddr_in *)a)->sin_addr;
138047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               port = (unsigned char*)&((const struct sockaddr_in *)sa)->sin_port;
138147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               DebugSNPrintF(post, sizeof(post), ":%d", (port[0] << 8) | port[1]); break;
138247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											#ifdef AF_INET6
138347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											case AF_INET6: F.precision = 16; a = (unsigned char*)&((const struct sockaddr_in6 *)a)->sin6_addr;
138447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               pre[0] = '['; pre[1] = '\0';
138547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               port = (unsigned char*)&((const struct sockaddr_in6 *)sa)->sin6_port;
138647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               DebugSNPrintF(post, sizeof(post), "%%%d]:%d",
138747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               		(int)((const struct sockaddr_in6 *)sa)->sin6_scope_id,
138847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											               		(port[0] << 8) | port[1]); break;
138947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											#endif
139047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											default:       F.precision =  0; break;
139147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											}
139247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									#else
139347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										F.precision = 0;	// socket interfaces not included so no sockaddr support
139447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									#endif
139547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									}
139647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								switch (F.precision)
139747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									{
139847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									case  4: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%d.%d.%d.%d%s",
139947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														a[0], a[1], a[2], a[3], post); break;
140047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									case  6: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%02X:%02X:%02X:%02X:%02X:%02X",
140147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														a[0], a[1], a[2], a[3], a[4], a[5]); break;
140247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									case  8: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
140347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); break;
140447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									case 16: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB),
140547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														"%s%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X%s",
140647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														pre, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
140747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														a[9], a[10], a[11], a[12], a[13], a[14], a[15], post); break;
140847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									default: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%s", "<< ERROR: Must specify address size "
140947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt														"(i.e. %.4a=IPv4, %.6a=Ethernet, %.8a=Fibre Channel %.16a=IPv6) >>"); break;
141047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt									}
141147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
141247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
141347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
141447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
141547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'U' :	{
141647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							unsigned char *a = va_arg(arg, unsigned char *);
141747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (!a) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
141847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else
141947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
142047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
142147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
142247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										*((uint32_t*) &a[0]), *((uint16_t*) &a[4]), *((uint16_t*) &a[6]),
142347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); break;
142447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
142547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
142647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
142747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
142847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'c' :	*--s = (char)va_arg(arg, int); i = 1; break;
142947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
143047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'C' :	if (F.lSize) n = va_arg(arg, unsigned long);
143147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else n = va_arg(arg, unsigned int);
143247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.hSize) n = (unsigned short) n;
143347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							c = (int)( n        & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
143447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							c = (int)((n >>  8) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
143547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							c = (int)((n >> 16) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
143647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							c = (int)((n >> 24) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
143747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							i = 4;
143847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
143947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
144047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 's' :	s = va_arg(arg, char *);
144147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (!s) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
144247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else switch (F.altForm)
144347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
144447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								case 0:	i=0;
144547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										if (F.havePrecision)				// C string
144647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{
144747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											while((i < F.precision) && s[i]) i++;
144847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											// Make sure we don't truncate in the middle of a UTF-8 character.
144947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											// If the last character is part of a multi-byte UTF-8 character, back up to the start of it.
145047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											j=0;
145147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											while((i > 0) && ((c = s[i-1]) & 0x80)) { j++; i--; if((c & 0xC0) != 0x80) break; }
145247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											// If the actual count of UTF-8 characters matches the encoded UTF-8 count, add it back.
145347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											if((j > 1) && (j <= 6))
145447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt												{
145547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt												int test = (0xFF << (8-j)) & 0xFF;
145647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt												int mask = test | (1 << ((8-j)-1));
145747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt												if((c & mask) == test) i += j;
145847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt												}
145947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											}
146047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										else
146147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											while(s[i]) i++;
146247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										break;
146347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								case 1: i = (unsigned char) *s++; break;	// Pascal string
146447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								case 2: {									// DNS label-sequence name
146547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										unsigned char *a = (unsigned char *)s;
146647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
146747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										if (*a == 0) *s++ = '.';	// Special case for root DNS name
146847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										while (*a)
146947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{
147047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											if (*a > 63) { s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "<<INVALID LABEL LENGTH %u>>", *a); break; }
147147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											if (s + *a >= &mDNS_VACB[254]) { s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "<<NAME TOO LONG>>"); break; }
147247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "%#s.", a);
147347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											a += 1 + *a;
147447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											}
147547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										i = (size_t)(s - mDNS_VACB);
147647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										s = mDNS_VACB;	// Reset s back to the start of the buffer
147747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										break;
147847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										}
147947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
148047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.havePrecision && i > F.precision)		// Make sure we don't truncate in the middle of a UTF-8 character
148147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{ i = F.precision; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
148247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
148347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
148447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'S':	{	// UTF-16 string
148547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							unsigned char *a = va_arg(arg, unsigned char *);
148647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							uint16_t      *u = (uint16_t*)a;
148747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (!u) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
148847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if ((!F.havePrecision || F.precision))
148947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
149047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								if      ((a[0] == 0xFE) && (a[1] == 0xFF)) { F.altForm = 1; u += 1; a += 2; F.precision--; }	// Big Endian
149147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								else if ((a[0] == 0xFF) && (a[1] == 0xFE)) { F.altForm = 2; u += 1; a += 2; F.precision--; }	// Little Endian
149247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
149347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
149447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							switch (F.altForm)
149547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
149647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								case 0:	while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Host Endian
149747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{ c = u[i]; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; }
149847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										break;
149947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								case 1: while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Big Endian
150047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{ c = ((a[0] << 8) | a[1]) & 0xFF; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; a += 2; }
150147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										break;
150247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								case 2: while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Little Endian
150347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt											{ c = ((a[1] << 8) | a[0]) & 0xFF; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; a += 2; }
150447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt										break;
150547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
150647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
150747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							s = mDNS_VACB;	// Reset s back to the start of the buffer
150847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
150947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
151047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#if TARGET_OS_MAC
151147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case '@':	{	// Cocoa/CoreFoundation object
151247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							CFTypeRef cfObj;
151347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							CFStringRef cfStr;
151447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							cfObj = (CFTypeRef) va_arg(arg, void *);
151547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							cfStr = (CFGetTypeID(cfObj) == CFStringGetTypeID()) ? (CFStringRef)CFRetain(cfObj) : CFCopyDescription(cfObj);
151647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
151747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (cfStr)
151847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
151947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								CFRange range;
152047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								CFIndex m;
152147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								range = CFRangeMake(0, CFStringGetLength(cfStr));
152247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								m = 0;
152347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								CFStringGetBytes(cfStr, range, kCFStringEncodingUTF8, '^', false, (UInt8*)mDNS_VACB, (CFIndex)sizeof(mDNS_VACB), &m);
152447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								CFRelease(cfStr);
152547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								i = (size_t) m;
152647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
152747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else
152847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{
152947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%s", "ERROR: <invalid CF object>" );
153047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								}
153147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
153247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.havePrecision && i > F.precision)		// Make sure we don't truncate in the middle of a UTF-8 character
153347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								{ i = F.precision; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
153447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
153547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#endif
153647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
153747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'm' :	{	// Error Message
153847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							long err;
153947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.lSize) err = va_arg(arg, long);
154047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else err = va_arg(arg, int);
154147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.hSize) err = (short)err;
154247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							DebugGetErrorString(err, mDNS_VACB, sizeof(mDNS_VACB));
154347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
154447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							for(i=0;s[i];i++) {}
154547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
154647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
154747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
154847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'H' :	{	// Hex Dump
154947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							void *a = va_arg(arg, void *);
155047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							size_t size = (size_t)va_arg(arg, int);
155147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							size_t max = (size_t)va_arg(arg, int);
155247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							DebugFlags flags =
155347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoNewLine |
155447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								kDebugFlags8BitSeparator | kDebugFlagsNo32BitSeparator |
155547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt								kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount;
155647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (F.altForm == 0) flags |= kDebugFlagsNoASCII;
155747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							size = (max < size) ? max : size;
155847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
155947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							i = DebugHexDump(kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, a, a, size, flags, mDNS_VACB, sizeof(mDNS_VACB));
156047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
156147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
156247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
156347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'v' :	{	// Version
156447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							uint32_t version;
156547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							version = va_arg(arg, unsigned int);
156647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							DebugNumVersionToString(version, mDNS_VACB);
156747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
156847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							for(i=0;s[i];i++) {}
156947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							}
157047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
157147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
157247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case 'n' :	s = va_arg(arg, char *);
157347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if      (F.hSize) * (short *) s = (short)nwritten;
157447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else if (F.lSize) * (long  *) s = (long)nwritten;
157547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							else              * (int   *) s = (int)nwritten;
157647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							continue;
157747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
157847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				default:	s = mDNS_VACB;
157947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "<<UNKNOWN FORMAT CONVERSION CODE %%%c>>", c);
158047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
158147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				case '%' :	*sbuffer++ = (char)c;
158247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							if (++nwritten >= buflen) goto exit;
158347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							break;
158447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
158547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
158647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (i < F.fieldWidth && !F.leftJustify)			// Pad on the left
158747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				do	{
158847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					*sbuffer++ = ' ';
158947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if (++nwritten >= buflen) goto exit;
159047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					} while (i < --F.fieldWidth);
159147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
159247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (i > buflen - nwritten)	// Make sure we don't truncate in the middle of a UTF-8 character
159347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{ i = buflen - nwritten; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
159447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			for (j=0; j<i; j++) *sbuffer++ = *s++;			// Write the converted result
159547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			nwritten += i;
159647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if (nwritten >= buflen) goto exit;
159747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
159847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			for (; i < F.fieldWidth; i++)					// Pad on the right
159947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
160047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*sbuffer++ = ' ';
160147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if (++nwritten >= buflen) goto exit;
160247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
160347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
160447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
160547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	exit:
160647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	*sbuffer++ = 0;
160747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return(nwritten);
160847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
160947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
161047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
161147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugGetErrorString
161247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
161347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
161447e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT const char *	DebugGetErrorString( int_least32_t inErrorCode, char *inBuffer, size_t inBufferSize )
161547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
161647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		s;
161747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *				dst;
161847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *				end;
161947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
162047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char				buffer[ 256 ];
162147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
162247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
162347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	switch( inErrorCode )
162447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
162547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	CaseErrorString( X, STR )					case X: s = STR; break
162647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	CaseErrorStringify( X )						case X: s = # X; break
162747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define	CaseErrorStringifyHardCode( VALUE, X )		case VALUE: s = # X; break
162847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
162947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// General Errors
163047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
163147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 0,  "no error" );
163247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 1,  "in-progress/waiting" );
163347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( -1, "catch-all unknown error" );
163447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
163547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// ACP Errors
163647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
163747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -2,  kACPBadRequestErr );
163847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -3,  kACPNoMemoryErr );
163947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -4,  kACPBadParamErr );
164047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -5,  kACPNotFoundErr );
164147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -6,  kACPBadChecksumErr );
164247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -7,  kACPCommandNotHandledErr );
164347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -8,  kACPNetworkErr );
164447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -9,  kACPDuplicateCommandHandlerErr );
164547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -10, kACPUnknownPropertyErr );
164647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -11, kACPImmutablePropertyErr );
164747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -12, kACPBadPropertyValueErr );
164847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -13, kACPNoResourcesErr );
164947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -14, kACPBadOptionErr );
165047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -15, kACPBadSizeErr );
165147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -16, kACPBadPasswordErr );
165247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -17, kACPNotInitializedErr );
165347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -18, kACPNonReadablePropertyErr );
165447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -19, kACPBadVersionErr );
165547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -20, kACPBadSignatureErr );
165647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -21, kACPBadIndexErr );
165747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -22, kACPUnsupportedErr );
165847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -23, kACPInUseErr );
165947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -24, kACPParamCountErr );
166047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -25, kACPIDErr );
166147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -26, kACPFormatErr );
166247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -27, kACPUnknownUserErr );
166347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -28, kACPAccessDeniedErr );
166447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -29, kACPIncorrectFWErr );
166547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
166647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Common Services Errors
166747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
166847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kUnknownErr );
166947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kOptionErr );
167047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kSelectorErr );
167147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kExecutionStateErr );
167247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kPathErr );
167347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kParamErr );
167447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kParamCountErr );
167547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kCommandErr );
167647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kIDErr );
167747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kStateErr );
167847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kRangeErr );
167947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kRequestErr );
168047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kResponseErr );
168147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kChecksumErr );
168247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotHandledErr );
168347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kVersionErr );
168447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kSignatureErr );
168547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kFormatErr );
168647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotInitializedErr );
168747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kAlreadyInitializedErr );
168847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotInUseErr );
168947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kInUseErr );
169047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kTimeoutErr );
169147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kCanceledErr );
169247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kAlreadyCanceledErr );
169347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kCannotCancelErr );
169447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kDeletedErr );
169547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotFoundErr );
169647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNoMemoryErr );
169747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNoResourcesErr );
169847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kDuplicateErr );
169947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kImmutableErr );
170047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kUnsupportedDataErr );
170147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kIntegrityErr );
170247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kIncompatibleErr );
170347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kUnsupportedErr );
170447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kUnexpectedErr );
170547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kValueErr );
170647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotReadableErr );
170747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotWritableErr );
170847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kBadReferenceErr );
170947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kFlagErr );
171047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kMalformedErr );
171147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kSizeErr );
171247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNameErr );
171347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNotReadyErr );
171447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kReadErr );
171547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kWriteErr );
171647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kMismatchErr );
171747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kDateErr );
171847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kUnderrunErr );
171947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kOverrunErr );
172047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kEndingErr );
172147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kConnectionErr );
172247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kAuthenticationErr );
172347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kOpenErr );
172447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kTypeErr );
172547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kSkipErr );
172647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNoAckErr );
172747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kCollisionErr );
172847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kBackoffErr );
172947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNoAddressAckErr );
173047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kBusyErr );
173147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringify( kNoSpaceErr );
173247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
173347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// mDNS/DNS-SD Errors
173447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
173547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65537, mStatus_UnknownErr );
173647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65538, mStatus_NoSuchNameErr );
173747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65539, mStatus_NoMemoryErr );
173847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65540, mStatus_BadParamErr );
173947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65541, mStatus_BadReferenceErr );
174047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65542, mStatus_BadStateErr );
174147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65543, mStatus_BadFlagsErr );
174247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65544, mStatus_UnsupportedErr );
174347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65545, mStatus_NotInitializedErr );
174447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65546, mStatus_NoCache );
174547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65547, mStatus_AlreadyRegistered );
174647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65548, mStatus_NameConflict );
174747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65549, mStatus_Invalid );
174847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65550, mStatus_GrowCache );
174947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65551, mStatus_BadInterfaceErr );
175047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65552, mStatus_Incompatible );
175147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65791, mStatus_ConfigChanged );
175247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -65792, mStatus_MemFree );
175347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
175447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// RSP Errors
175547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
175647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -400000, kRSPUnknownErr );
175747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -400050, kRSPParamErr );
175847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -400108, kRSPNoMemoryErr );
175947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -405246, kRSPRangeErr );
176047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -409057, kRSPSizeErr );
176147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -400200, kRSPHardwareErr );
176247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -401712, kRSPTimeoutErr );
176347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -402053, kRSPUnsupportedErr );
176447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -402419, kRSPIDErr );
176547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -403165, kRSPFlagErr );
176647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 			-200000, "kRSPControllerStatusBase - 0x50" );
176747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString(			-200080, "kRSPCommandSucceededErr - 0x50" );
176847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 			-200001, "kRSPCommandFailedErr - 0x01" );
176947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 			-200051, "kRSPChecksumErr - 0x33" );
177047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 			-200132, "kRSPCommandTimeoutErr - 0x84" );
177147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 			-200034, "kRSPPasswordRequiredErr - 0x22 OBSOLETE" );
177247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorString( 			-200128, "kRSPCanceledErr - 0x02 Async" );
177347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
177447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// XML Errors
177547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
177647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -100043, kXMLNotFoundErr );
177747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -100050, kXMLParamErr );
177847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -100108, kXMLNoMemoryErr );
177947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -100206, kXMLFormatErr );
178047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -100586, kXMLNoRootElementErr );
178147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -101703, kXMLWrongDataTypeErr );
178247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -101726, kXMLKeyErr );
178347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -102053, kXMLUnsupportedErr );
178447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -102063, kXMLMissingElementErr );
178547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -103026, kXMLParseErr );
178647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -103159, kXMLBadDataErr );
178747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -103170, kXMLBadNameErr );
178847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -105246, kXMLRangeErr );
178947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -105251, kXMLUnknownElementErr );
179047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -108739, kXMLMalformedInputErr );
179147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -109057, kXMLBadSizeErr );
179247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -101730, kXMLMissingChildElementErr );
179347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -102107, kXMLMissingParentElementErr );
179447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -130587, kXMLNonRootElementErr );
179547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( -102015, kXMLDateErr );
179647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
179747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( __MACH__ )
179847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
179947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Mach Errors
180047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
180147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x00002000, MACH_MSG_IPC_SPACE );
180247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x00001000, MACH_MSG_VM_SPACE );
180347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x00000800, MACH_MSG_IPC_KERNEL );
180447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x00000400, MACH_MSG_VM_KERNEL );
180547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000001, MACH_SEND_IN_PROGRESS );
180647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000002, MACH_SEND_INVALID_DATA );
180747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000003, MACH_SEND_INVALID_DEST );
180847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000004, MACH_SEND_TIMED_OUT );
180947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000007, MACH_SEND_INTERRUPTED );
181047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000008, MACH_SEND_MSG_TOO_SMALL );
181147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000009, MACH_SEND_INVALID_REPLY );
181247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000000A, MACH_SEND_INVALID_RIGHT );
181347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000000B, MACH_SEND_INVALID_NOTIFY );
181447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000000C, MACH_SEND_INVALID_MEMORY );
181547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000000D, MACH_SEND_NO_BUFFER );
181647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000000E, MACH_SEND_TOO_LARGE );
181747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000000F, MACH_SEND_INVALID_TYPE );
181847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000010, MACH_SEND_INVALID_HEADER );
181947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000011, MACH_SEND_INVALID_TRAILER );
182047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10000015, MACH_SEND_INVALID_RT_OOL_SIZE );
182147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004001, MACH_RCV_IN_PROGRESS );
182247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004002, MACH_RCV_INVALID_NAME );
182347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004003, MACH_RCV_TIMED_OUT );
182447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004004, MACH_RCV_TOO_LARGE );
182547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004005, MACH_RCV_INTERRUPTED );
182647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004006, MACH_RCV_PORT_CHANGED );
182747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004007, MACH_RCV_INVALID_NOTIFY );
182847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004008, MACH_RCV_INVALID_DATA );
182947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004009, MACH_RCV_PORT_DIED );
183047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000400A, MACH_RCV_IN_SET );
183147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000400B, MACH_RCV_HEADER_ERROR );
183247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000400C, MACH_RCV_BODY_ERROR );
183347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000400D, MACH_RCV_INVALID_TYPE );
183447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000400E, MACH_RCV_SCATTER_SMALL );
183547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x1000400F, MACH_RCV_INVALID_TRAILER );
183647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0x10004011, MACH_RCV_IN_PROGRESS_TIMED );
183747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
183847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Mach OSReturn Errors
183947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
184047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC000001, kOSReturnError );
184147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004001, kOSMetaClassInternal );
184247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004002, kOSMetaClassHasInstances );
184347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004003, kOSMetaClassNoInit );
184447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004004, kOSMetaClassNoTempData );
184547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004005, kOSMetaClassNoDicts );
184647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004006, kOSMetaClassNoKModSet );
184747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004007, kOSMetaClassNoInsKModSet );
184847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004008, kOSMetaClassNoSuper );
184947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC004009, kOSMetaClassInstNoSuper );
185047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xDC00400A, kOSMetaClassDuplicateClass );
185147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
185247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// IOKit Errors
185347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
185447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002BC, kIOReturnError );
185547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002BD, kIOReturnNoMemory );
185647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002BE, kIOReturnNoResources );
185747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002BF, kIOReturnIPCError );
185847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C0, kIOReturnNoDevice );
185947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C1, kIOReturnNotPrivileged );
186047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C2, kIOReturnBadArgument );
186147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C3, kIOReturnLockedRead );
186247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C4, kIOReturnLockedWrite );
186347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C5, kIOReturnExclusiveAccess );
186447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C6, kIOReturnBadMessageID );
186547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C7, kIOReturnUnsupported );
186647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C8, kIOReturnVMError );
186747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002C9, kIOReturnInternalError );
186847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002CA, kIOReturnIOError );
186947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002CC, kIOReturnCannotLock );
187047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002CD, kIOReturnNotOpen );
187147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002CE, kIOReturnNotReadable );
187247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002CF, kIOReturnNotWritable );
187347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D0, kIOReturnNotAligned );
187447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D1, kIOReturnBadMedia );
187547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D2, kIOReturnStillOpen );
187647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D3, kIOReturnRLDError );
187747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D4, kIOReturnDMAError );
187847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D5, kIOReturnBusy );
187947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D6, kIOReturnTimeout );
188047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D7, kIOReturnOffline );
188147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D8, kIOReturnNotReady );
188247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002D9, kIOReturnNotAttached );
188347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002DA, kIOReturnNoChannels );
188447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002DB, kIOReturnNoSpace );
188547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002DD, kIOReturnPortExists );
188647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002DE, kIOReturnCannotWire );
188747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002DF, kIOReturnNoInterrupt );
188847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E0, kIOReturnNoFrames );
188947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E1, kIOReturnMessageTooLarge );
189047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E2, kIOReturnNotPermitted );
189147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E3, kIOReturnNoPower );
189247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E4, kIOReturnNoMedia );
189347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E5, kIOReturnUnformattedMedia );
189447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E6, kIOReturnUnsupportedMode );
189547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E7, kIOReturnUnderrun );
189647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E8, kIOReturnOverrun );
189747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002E9, kIOReturnDeviceError	 );
189847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002EA, kIOReturnNoCompletion	 );
189947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002EB, kIOReturnAborted	 );
190047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002EC, kIOReturnNoBandwidth	 );
190147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002ED, kIOReturnNotResponding	 );
190247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002EE, kIOReturnIsoTooOld	 );
190347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002EF, kIOReturnIsoTooNew	 );
190447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00002F0, kIOReturnNotFound );
190547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0000001, kIOReturnInvalid );
190647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
190747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// IOKit FireWire Errors
190847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
190947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008010, kIOFireWireResponseBase );
191047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008020, kIOFireWireBusReset );
191147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008001, kIOConfigNoEntry );
191247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008002, kIOFireWirePending );
191347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008003, kIOFireWireLastDCLToken );
191447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008004, kIOFireWireConfigROMInvalid );
191547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008005, kIOFireWireAlreadyRegistered );
191647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008006, kIOFireWireMultipleTalkers );
191747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008007, kIOFireWireChannelActive );
191847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008008, kIOFireWireNoListenerOrTalker );
191947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008009, kIOFireWireNoChannels );
192047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000800A, kIOFireWireChannelNotAvailable );
192147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000800B, kIOFireWireSeparateBus );
192247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000800C, kIOFireWireBadSelfIDs );
192347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000800D, kIOFireWireLowCableVoltage );
192447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000800E, kIOFireWireInsufficientPower );
192547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000800F, kIOFireWireOutOfTLabels );
192647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008101, kIOFireWireBogusDCLProgram );
192747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008102, kIOFireWireTalkingAndListening );
192847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0008103, kIOFireWireHardwareSlept );
192947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00087D0, kIOFWMessageServiceIsRequestingClose );
193047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00087D1, kIOFWMessagePowerStateChanged );
193147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE00087D2, kIOFWMessageTopologyChanged );
193247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
193347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// IOKit USB Errors
193447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
193547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004061, kIOUSBUnknownPipeErr );
193647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004060, kIOUSBTooManyPipesErr );
193747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000405F, kIOUSBNoAsyncPortErr );
193847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000405E, kIOUSBNotEnoughPipesErr );
193947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000405D, kIOUSBNotEnoughPowerErr );
194047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004057, kIOUSBEndpointNotFound );
194147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004056, kIOUSBConfigNotFound );
194247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004051, kIOUSBTransactionTimeout );
194347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004050, kIOUSBTransactionReturned );
194447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000404F, kIOUSBPipeStalled );
194547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000404E, kIOUSBInterfaceNotFound );
194647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000404D, kIOUSBLowLatencyBufferNotPreviouslyAllocated );
194747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000404C, kIOUSBLowLatencyFrameListNotPreviouslyAllocated );
194847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000404B, kIOUSBHighSpeedSplitError );
194947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004010, kIOUSBLinkErr );
195047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000400F, kIOUSBNotSent2Err );
195147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000400E, kIOUSBNotSent1Err );
195247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000400D, kIOUSBBufferUnderrunErr );
195347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000400C, kIOUSBBufferOverrunErr );
195447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000400B, kIOUSBReserved2Err );
195547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE000400A, kIOUSBReserved1Err );
195647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004007, kIOUSBWrongPIDErr );
195747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004006, kIOUSBPIDCheckErr );
195847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004003, kIOUSBDataToggleErr );
195947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004002, kIOUSBBitstufErr );
196047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		CaseErrorStringifyHardCode( 0xE0004001, kIOUSBCRCErr );
196147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
196247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif	// __MACH__
196347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
196447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Other Errors
196547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
196647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		default:
196747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			s = NULL;
196847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
196947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( inBuffer && ( inBufferSize > 0 ) )
197047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
197147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					DWORD		n;
197247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
197347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					n = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, (DWORD) inErrorCode,
197447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), buffer, sizeof( buffer ), NULL );
197547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if( n > 0 )
197647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					{
197747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						// Remove any trailing CR's or LF's since some messages have them.
197847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
197947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						while( ( n > 0 ) && isspace( ( (unsigned char *) buffer )[ n - 1 ] ) )
198047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						{
198147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt							buffer[ --n ] = '\0';
198247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						}
198347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						s = buffer;
198447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					}
198547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
198647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			#endif
198747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
198847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !s )
198947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
199047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				#if( !TARGET_API_MAC_OSX_KERNEL && !TARGET_OS_WINDOWS_CE )
199147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					s = strerror( inErrorCode );
199247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				#endif
199347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( !s )
199447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
199547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					s = "<unknown error code>";
199647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
199747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
199847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
199947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
200047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
200147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Copy the string to the output buffer. If no buffer is supplied or it is empty, return an empty string.
200247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
200347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inBuffer && ( inBufferSize > 0 ) )
200447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
200547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		dst = inBuffer;
200647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		end = dst + ( inBufferSize - 1 );
200747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		while( ( ( end - dst ) > 0 ) && ( *s != '\0' ) )
200847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
200947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*dst++ = *s++;
201047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
201147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*dst = '\0';
201247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s = inBuffer;
201347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
201447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( s );
201547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
201647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
201747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
201847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugHexDump
201947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
202047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
202147e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT size_t
202247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump(
202347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugLevel		inLevel,
202447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		int				inIndent,
202547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char * 	inLabel,
202647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t 			inLabelSize,
202747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		int				inLabelMinWidth,
202847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *	inType,
202947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t 			inTypeSize,
203047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const void *	inDataStart,
203147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const void *	inData,
203247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t 			inDataSize,
203347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugFlags	 	inFlags,
203447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char *			outBuffer,
203547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t			inBufferSize )
203647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
203747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static const char		kHexChars[] = "0123456789ABCDEF";
203847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const uint8_t *			start;
203947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const uint8_t *			src;
204047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *					dst;
204147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *					end;
204247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	size_t					n;
204347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int						offset;
204447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int						width;
204547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *			newline;
204647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char					separator[ 8 ];
204747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *					s;
204847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
204947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inType );
205047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DEBUG_UNUSED( inTypeSize );
205147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
205247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set up the function-wide variables.
205347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
205447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inLabelSize == kSizeCString )
205547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
205647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inLabelSize = strlen( inLabel );
205747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
205847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	start 	= (const uint8_t *) inData;
205947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	src 	= start;
206047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dst		= outBuffer;
206147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	end		= dst + inBufferSize;
206247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	offset 	= (int)( (intptr_t) inData - (intptr_t) inDataStart );
206347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	width	= ( (int) inLabelSize > inLabelMinWidth ) ? (int) inLabelSize : inLabelMinWidth;
206447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	newline	= ( inFlags & kDebugFlagsNoNewLine ) ? "" : "\n";
206547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
206647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Set up the separator string. This is used to insert spaces on subsequent "lines" when not using newlines.
206747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
206847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s = separator;
206947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inFlags & kDebugFlagsNoNewLine )
207047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
207147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( inFlags & kDebugFlags8BitSeparator )
207247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
207347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = ' ';
207447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
207547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( inFlags & kDebugFlags16BitSeparator )
207647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
207747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = ' ';
207847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
207947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( !( inFlags & kDebugFlagsNo32BitSeparator ) )
208047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
208147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = ' ';
208247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
208347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( ( (size_t)( s - separator ) ) < sizeof( separator ) );
208447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
208547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	*s = '\0';
208647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
208747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	for( ;; )
208847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
208947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char		prefixString[ 32 ];
209047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char		hexString[ 64 ];
209147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char		asciiString[ 32 ];
209247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		char		byteCountString[ 32 ];
209347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		int			c;
209447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t		chunkSize;
209547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t		i;
209647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
209747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// If this is a label-only item (i.e. no data), print the label (accounting for prefix string spacing) and exit.
209847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
209947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( inDataSize == 0 )
210047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
210147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( inLabel && ( inLabelSize > 0 ) )
210247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
210347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				width = 0;
210447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( !( inFlags & kDebugFlagsNoAddress ) )
210547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
210647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width += 8;			// "00000000"
210747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if( !( inFlags & kDebugFlagsNoOffset ) )
210847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					{
210947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						width += 1;		// "+"
211047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					}
211147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
211247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( inFlags & kDebugFlags32BitOffset )
211347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
211447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width += 8;			// "00000000"
211547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
211647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else if( !( inFlags & kDebugFlagsNoOffset ) )
211747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
211847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width += 4;			// "0000"
211947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
212047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
212147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( outBuffer )
212247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
212347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					dst += DebugSNPrintF( dst, (size_t)( end - dst ), "%*s" "%-*.*s" "%.*s" "%s",
212447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						width, "",
212547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						( width > 0 ) ? ": " : "",
212647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						width, (int) inLabelSize, inLabel,
212747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						newline );
212847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
212947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else
213047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
213147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					dst += DebugPrintF( inLevel, "%*s" "%-*.*s" "%.*s" "%s",
213247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						width, "",
213347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						( width > 0 ) ? ": " : "",
213447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						width, (int) inLabelSize, inLabel,
213547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						newline );
213647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
213747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
213847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
213947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
214047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
214147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Build the prefix string. It will be in one of the following formats:
214247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		//
214347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// 1) "00000000+0000[0000]"	(address and offset)
214447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// 2) "00000000"			(address only)
214547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// 3) "0000[0000]"			(offset only)
214647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// 4) ""					(no address or offset)
214747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		//
214847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Note: If we're printing multiple "lines", but not printing newlines, a space is used to separate.
214947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
215047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s = prefixString;
215147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( !( inFlags & kDebugFlagsNoAddress ) )
215247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
215347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 28 ) & 0xF ];
215447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 24 ) & 0xF ];
215547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 20 ) & 0xF ];
215647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 16 ) & 0xF ];
215747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 12 ) & 0xF ];
215847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >>  8 ) & 0xF ];
215947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( ( (uintptr_t) src ) >>  4 ) & 0xF ];
216047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[   ( (uintptr_t) src )         & 0xF ];
216147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
216247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( inFlags & kDebugFlagsNoOffset ) )
216347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
216447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = '+';
216547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
216647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
216747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( !( inFlags & kDebugFlagsNoOffset ) )
216847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
216947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( inFlags & kDebugFlags32BitOffset )
217047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
217147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = kHexChars[ ( offset >> 28 ) & 0xF ];
217247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = kHexChars[ ( offset >> 24 ) & 0xF ];
217347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = kHexChars[ ( offset >> 20 ) & 0xF ];
217447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = kHexChars[ ( offset >> 16 ) & 0xF ];
217547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
217647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( offset >> 12 ) & 0xF ];
217747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( offset >>  8 ) & 0xF ];
217847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[ ( offset >>  4 ) & 0xF ];
217947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = kHexChars[   offset         & 0xF ];
218047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
218147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( s != prefixString )
218247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
218347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = ':';
218447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = ' ';
218547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
218647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( ( (size_t)( s - prefixString ) ) < sizeof( prefixString ) );
218747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*s = '\0';
218847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
218947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Build a hex string with a optional spaces after every 1, 2, and/or 4 bytes to make it easier to read.
219047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Optionally pads the hex string with space to fill the full 16 byte range (so it lines up).
219147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
219247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s = hexString;
219347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		chunkSize = ( inDataSize < 16 ) ? inDataSize : 16;
219447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		n = ( inFlags & kDebugFlagsNo16ByteHexPad ) ? chunkSize : 16;
219547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		for( i = 0; i < n; ++i )
219647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
219747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( ( inFlags & kDebugFlags8BitSeparator ) && ( i > 0 ) )
219847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
219947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = ' ';
220047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
220147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( ( inFlags & kDebugFlags16BitSeparator ) && ( i > 0 ) && ( ( i % 2 ) == 0 ) )
220247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
220347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = ' ';
220447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
220547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( !( inFlags & kDebugFlagsNo32BitSeparator ) && ( i > 0 ) && ( ( i % 4 ) == 0 ) )
220647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
220747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = ' ';
220847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
220947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( i < chunkSize )
221047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
221147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = kHexChars[ src[ i ] >> 4   ];
221247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = kHexChars[ src[ i ] &  0xF ];
221347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
221447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			else
221547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
221647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = ' ';
221747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = ' ';
221847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
221947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
222047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( ( (size_t)( s - hexString ) ) < sizeof( hexString ) );
222147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*s = '\0';
222247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
222347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Build a string with the ASCII version of the data (replaces non-printable characters with '^').
222447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Optionally pads the string with '`' to fill the full 16 byte range (so it lines up).
222547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
222647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s = asciiString;
222747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( !( inFlags & kDebugFlagsNoASCII ) )
222847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
222947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = ' ';
223047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = '|';
223147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			for( i = 0; i < n; ++i )
223247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
223347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				if( i < chunkSize )
223447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
223547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					c = src[ i ];
223647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					if( !DebugIsPrint( c ) )
223747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					{
223847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt						c = '^';
223947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					}
224047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
224147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				else
224247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				{
224347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					c = '`';
224447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				}
224547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				*s++ = (char) c;
224647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
224747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*s++ = '|';
224847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			check( ( (size_t)( s - asciiString ) ) < sizeof( asciiString ) );
224947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
225047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*s = '\0';
225147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
225247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Build a string indicating how bytes are in the hex dump. Only printed on the first line.
225347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
225447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s = byteCountString;
225547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( !( inFlags & kDebugFlagsNoByteCount ) )
225647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
225747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( src == start )
225847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
225947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				s += DebugSNPrintF( s, sizeof( byteCountString ), " (%d bytes)", (int) inDataSize );
226047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
226147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
226247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		check( ( (size_t)( s - byteCountString ) ) < sizeof( byteCountString ) );
226347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*s = '\0';
226447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
226547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Build the entire line from all the pieces we've previously built.
226647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
226747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( outBuffer )
226847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
226947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( src == start )
227047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
227147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				dst += DebugSNPrintF( dst, (size_t)( end - dst ),
227247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%*s"		// Indention
227347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Separator (only if needed)
227447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Prefix
227547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%-*.*s"	// Label
227647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Separator
227747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Hex
227847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// ASCII
227947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Byte Count
228047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s", 		// Newline
228147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					inIndent, "",
228247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( src != start ) ? separator : "",
228347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					prefixString,
228447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width, (int) inLabelSize, inLabel ? inLabel : "",
228547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( width > 0 ) ? " " : "",
228647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					hexString,
228747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					asciiString,
228847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					byteCountString,
228947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					newline );
229047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
229147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			else
229247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
229347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				dst += DebugSNPrintF( dst, (size_t)( end - dst ),
229447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%*s"		// Indention
229547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Separator (only if needed)
229647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Prefix
229747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%*s"		// Label Spacing
229847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Separator
229947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Hex
230047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// ASCII
230147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Byte Count
230247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s", 		// Newline
230347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					inIndent, "",
230447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( src != start ) ? separator : "",
230547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					prefixString,
230647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width, "",
230747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( width > 0 ) ? " " : "",
230847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					hexString,
230947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					asciiString,
231047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					byteCountString,
231147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					newline );
231247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
231347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
231447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		else
231547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
231647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( src == start )
231747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
231847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				dst += DebugPrintF( inLevel,
231947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%*s"		// Indention
232047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Separator (only if needed)
232147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Prefix
232247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%-*.*s"	// Label
232347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Separator
232447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Hex
232547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// ASCII
232647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Byte Count
232747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s", 		// Newline
232847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					inIndent, "",
232947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( src != start ) ? separator : "",
233047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					prefixString,
233147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width, (int) inLabelSize, inLabel,
233247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( width > 0 ) ? " " : "",
233347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					hexString,
233447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					asciiString,
233547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					byteCountString,
233647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					newline );
233747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
233847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			else
233947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
234047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				dst += DebugPrintF( inLevel,
234147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%*s"		// Indention
234247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Separator (only if needed)
234347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s" 		// Prefix
234447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%*s"		// Label Spacing
234547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Separator
234647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Hex
234747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// ASCII
234847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s"		// Byte Count
234947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					"%s", 		// Newline
235047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					inIndent, "",
235147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( src != start ) ? separator : "",
235247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					prefixString,
235347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					width, "",
235447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					( width > 0 ) ? " " : "",
235547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					hexString,
235647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					asciiString,
235747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					byteCountString,
235847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt					newline );
235947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
236047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
236147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
236247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		// Move to the next chunk. Exit if there is no more data.
236347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
236447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		offset		+= (int) chunkSize;
236547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		src 		+= chunkSize;
236647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inDataSize	-= chunkSize;
236747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( inDataSize == 0 )
236847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
236947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
237047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
237147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
237247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
237347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Note: The "dst - outBuffer" size calculation works even if "outBuffer" is NULL because it's all relative.
237447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
237547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( (size_t)( dst - outBuffer ) );
237647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
237747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
237847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
237947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugNumVersionToString
238047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
238147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
238247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic char *	DebugNumVersionToString( uint32_t inVersion, char *inString )
238347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
238447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char *		s;
238547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t		majorRev;
238647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t		minor;
238747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t		bugFix;
238847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t		stage;
238947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t		revision;
239047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
239147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check( inString );
239247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
239347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	majorRev 	= (uint8_t)( ( inVersion >> 24 ) & 0xFF );
239447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	minor		= (uint8_t)( ( inVersion >> 20 ) & 0x0F );
239547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	bugFix		= (uint8_t)( ( inVersion >> 16 ) & 0x0F );
239647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	stage 		= (uint8_t)( ( inVersion >>  8 ) & 0xFF );
239747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	revision 	= (uint8_t)(   inVersion         & 0xFF );
239847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
239947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Convert the major, minor, and bugfix numbers.
240047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
240147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s  = inString;
240247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s += sprintf( s, "%u", majorRev );
240347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s += sprintf( s, ".%u", minor );
240447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( bugFix != 0 )
240547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
240647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s += sprintf( s, ".%u", bugFix );
240747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
240847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
240947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Convert the version stage and non-release revision number.
241047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
241147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	switch( stage )
241247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
241347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kVersionStageDevelopment:
241447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			s += sprintf( s, "d%u", revision );
241547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
241647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
241747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kVersionStageAlpha:
241847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			s += sprintf( s, "a%u", revision );
241947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
242047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
242147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kVersionStageBeta:
242247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			s += sprintf( s, "b%u", revision );
242347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
242447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
242547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		case kVersionStageFinal:
242647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
242747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// A non-release revision of zero is a special case indicating the software is GM (at the golden master
242847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			// stage) and therefore, the non-release revision should not be added to the string.
242947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
243047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			if( revision != 0 )
243147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			{
243247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt				s += sprintf( s, "f%u", revision );
243347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			}
243447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
243547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
243647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		default:
243747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			dlog( kDebugLevelError, "invalid NumVersion stage (0x%02X)\n", stage );
243847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			break;
243947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
244047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( inString );
244147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
244247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
244347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
244447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugTaskLevel
244547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
244647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
244747e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT uint32_t	DebugTaskLevel( void )
244847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
244947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint32_t		level;
245047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
245147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	level = 0;
245247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
245347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_VXWORKS )
245447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( intContext() )
245547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
245647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		level |= ( ( 1 << kDebugInterruptLevelShift ) & kDebugInterruptLevelMask );
245747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
245847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
245947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
246047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( level );
246147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
246247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
246347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
246447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
246547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugWinEnableConsole
246647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
246747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
246847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma warning( disable:4311 )
246947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
247047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic void	DebugWinEnableConsole( void )
247147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
247247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	static bool		sConsoleEnabled = false;
247347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	BOOL			result;
247447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int				fileHandle;
247547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	FILE *			file;
247647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	int				err;
247747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
247847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( sConsoleEnabled )
247947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
248047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto exit;
248147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
248247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
248347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Create console window.
248447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
248547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	result = AllocConsole();
248647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_quiet( result, exit );
248747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
248847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Redirect stdin to the console stdin.
248947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
249047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_INPUT_HANDLE ), _O_TEXT );
249147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
249247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( __MWERKS__ ) )
249347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		file = __handle_reopen( (unsigned long) fileHandle, "r", stdin );
249447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_quiet( file, exit );
249547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
249647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		file = _fdopen( fileHandle, "r" );
249747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_quiet( file, exit );
249847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
249947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*stdin = *file;
250047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
250147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
250247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = setvbuf( stdin, NULL, _IONBF, 0 );
250347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
250447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
250547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Redirect stdout to the console stdout.
250647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
250747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_OUTPUT_HANDLE ), _O_TEXT );
250847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
250947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( __MWERKS__ ) )
251047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		file = __handle_reopen( (unsigned long) fileHandle, "w", stdout );
251147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_quiet( file, exit );
251247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
251347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		file = _fdopen( fileHandle, "w" );
251447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_quiet( file, exit );
251547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
251647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*stdout = *file;
251747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
251847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
251947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = setvbuf( stdout, NULL, _IONBF, 0 );
252047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
252147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
252247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Redirect stderr to the console stdout.
252347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
252447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_OUTPUT_HANDLE ), _O_TEXT );
252547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
252647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( __MWERKS__ ) )
252747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		file = __handle_reopen( (unsigned long) fileHandle, "w", stderr );
252847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_quiet( file, exit );
252947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
253047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		file = _fdopen( fileHandle, "w" );
253147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_quiet( file, exit );
253247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
253347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*stderr = *file;
253447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
253547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
253647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = setvbuf( stderr, NULL, _IONBF, 0 );
253747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( err, exit );
253847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
253947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	sConsoleEnabled = true;
254047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
254147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
254247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return;
254347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
254447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
254547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma warning( default:4311 )
254647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
254747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif	// TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE
254847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
254947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( TARGET_OS_WIN32 )
255047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
255147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugWinCharToTCharString
255247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
255347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
255447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltstatic TCHAR *
255547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugWinCharToTCharString(
255647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		const char *	inCharString,
255747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t 			inCharCount,
255847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		TCHAR *			outTCharString,
255947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t 			inTCharCountMax,
256047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		size_t *		outTCharCount )
256147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
256247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	const char *		src;
256347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR *				dst;
256447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	TCHAR *				end;
256547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
256647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inCharCount == kSizeCString )
256747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
256847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inCharCount = strlen( inCharString );
256947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
257047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	src = inCharString;
257147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dst = outTCharString;
257247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( inTCharCountMax > 0 )
257347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
257447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		inTCharCountMax -= 1;
257547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		if( inTCharCountMax > inCharCount )
257647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
257747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			inTCharCountMax = inCharCount;
257847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
257947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
258047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		end = dst + inTCharCountMax;
258147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		while( dst < end )
258247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		{
258347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt			*dst++ = (TCHAR) *src++;
258447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		}
258547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*dst = 0;
258647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
258747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( outTCharCount )
258847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
258947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		*outTCharCount = (size_t)( dst - outTCharString );
259047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
259147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( outTCharString );
259247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
259347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
259447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
259547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if 0
259647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark -
259747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#pragma mark == Debugging ==
259847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
259947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
260047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
260147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//	DebugServicesTest
260247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt//===========================================================================================================================
260347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
260447e4cebad7397422144bb03a21f3f7682c062c4aRobert GreenwaltDEBUG_EXPORT OSStatus	DebugServicesTest( void )
260547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt{
260647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	OSStatus		err;
260747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	char			s[ 512 ];
260847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t *		p;
260947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	uint8_t			data[] =
261047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
261147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0x11, 0x22, 0x33, 0x44,
261247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0x55, 0x66,
261347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0x77, 0x88, 0x99, 0xAA,
261447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0xBB, 0xCC, 0xDD,
261547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0xEE,
261647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0xFF,
261747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
261847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0,
261947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1
262047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	};
262147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
262247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	debug_initialize( kDebugOutputTypeMetaConsole );
262347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
262447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// check's
262547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
262647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check( 0 && "SHOULD SEE: check" );
262747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check( 1 && "SHOULD *NOT* SEE: check (valid)" );
262847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_string( 0, "SHOULD SEE: check_string" );
262947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_string( 1, "SHOULD *NOT* SEE: check_string (valid)" );
263047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_noerr( -123 );
263147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_noerr( 10038 );
263247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_noerr( 22 );
263347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_noerr( 0 );
263447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_noerr_string( -6712, "SHOULD SEE: check_noerr_string" );
263547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_noerr_string( 0, "SHOULD *NOT* SEE: check_noerr_string (valid)" );
263647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_translated_errno( 0 >= 0 && "SHOULD *NOT* SEE", -384, -999 );
263747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_translated_errno( -1 >= 0 && "SHOULD SEE", -384, -999 );
263847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_translated_errno( -1 >= 0 && "SHOULD SEE", 0, -999 );
263947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD *NOT* SEE" ? 10 : 0, 10, 22, 10 );
264047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD SEE" ? 10 : 0, 10,  5, 10 );
264147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD SEE" ? 10 : 0, 10, 12,  6 );
264247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD SEE" ? 12 : 0,  6, 10, 10 );
264347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD SEE" ? 12 : 0, 10, 10, 10 );
264447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD *NOT* SEE" ? 22 : 0, 10, 10, 10 );
264547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD *NOT* SEE" ? 10 : 0, 10, 20, 10 );
264647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	check_ptr_overlap( "SHOULD *NOT* SEE" ? 20 : 0, 10, 10, 10 );
264747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
264847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// require's
264947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
265047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require( 0 && "SHOULD SEE", require1 );
265147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
265247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire1:
265347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require( 1 && "SHOULD *NOT* SEE", require2 );
265447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require2Good;
265547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire2:
265647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
265747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire2Good:
265847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_string( 0 && "SHOULD SEE", require3, "SHOULD SEE: require_string" );
265947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
266047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire3:
266147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_string( 1 && "SHOULD *NOT* SEE", require4, "SHOULD *NOT* SEE: require_string (valid)" );
266247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require4Good;
266347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire4:
266447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
266547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire4Good:
266647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_quiet( 0 && "SHOULD SEE", require5 );
266747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
266847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire5:
266947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_quiet( 1 && "SHOULD *NOT* SEE", require6 );
267047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require6Good;
267147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire6:
267247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
267347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire6Good:
267447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr( -1, require7 );
267547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
267647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire7:
267747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr( 0, require8 );
267847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require8Good;
267947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire8:
268047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
268147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire8Good:
268247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_string( -2, require9, "SHOULD SEE: require_noerr_string");
268347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
268447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire9:
268547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_string( 0, require10, "SHOULD *NOT* SEE: require_noerr_string (valid)" );
268647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require10Good;
268747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire10:
268847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
268947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire10Good:
269047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_action_string( -3, require11, dlog( kDebugLevelMax, "action 1 (expected)\n" ), "require_noerr_action_string" );
269147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
269247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire11:
269347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_action_string( 0, require12, dlog( kDebugLevelMax, "action 2\n" ), "require_noerr_action_string (valid)" );
269447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require12Good;
269547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire12:
269647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
269747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire12Good:
269847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( -4, require13 );
269947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
270047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire13:
270147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_quiet( 0, require14 );
270247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require14Good;
270347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire14:
270447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
270547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire14Good:
270647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_action( -5, require15, dlog( kDebugLevelMax, "SHOULD SEE: action 3 (expected)\n" ) );
270747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
270847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire15:
270947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_action( 0, require16, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 4\n" ) );
271047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require16Good;
271147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire16:
271247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
271347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire16Good:
271447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_action_quiet( -4, require17, dlog( kDebugLevelMax, "SHOULD SEE: action 5 (expected)\n" ) );
271547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
271647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire17:
271747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_noerr_action_quiet( 0, require18, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 6\n" ) );
271847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require18Good;
271947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire18:
272047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
272147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire18Good:
272247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( 0 && "SHOULD SEE", require19, dlog( kDebugLevelMax, "SHOULD SEE: action 7 (expected)\n" ) );
272347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
272447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire19:
272547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( 1 && "SHOULD *NOT* SEE", require20, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 8\n" ) );
272647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require20Good;
272747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire20:
272847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
272947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire20Good:
273047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_quiet( 0, require21, dlog( kDebugLevelMax, "SHOULD SEE: action 9 (expected)\n" ) );
273147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
273247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire21:
273347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_quiet( 1, require22, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 10\n" ) );
273447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require22Good;
273547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire22:
273647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
273747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire22Good:
273847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_string( 0, require23, dlog( kDebugLevelMax, "SHOULD SEE: action 11 (expected)\n" ), "SHOULD SEE: require_action_string" );
273947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
274047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire23:
274147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action_string( 1, require24, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 12\n" ), "SHOULD *NOT* SEE: require_action_string" );
274247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	goto require24Good;
274347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire24:
274447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
274547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire24Good:
274647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
274747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( defined( __MWERKS__ )  )
274847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( __cplusplus ) && __option( exceptions ) )
274947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define COMPILER_HAS_EXCEPTIONS		1
275047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
275147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define COMPILER_HAS_EXCEPTIONS		0
275247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
275347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#else
275447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( __cplusplus ) )
275547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define COMPILER_HAS_EXCEPTIONS		1
275647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
275747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		#define COMPILER_HAS_EXCEPTIONS		0
275847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
275947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
276047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
276147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#if( COMPILER_HAS_EXCEPTIONS )
276247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	try
276347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
276447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_throw( 1 && "SHOULD *NOT* SEE" );
276547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_throw( 0 && "SHOULD SEE" );
276647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
276747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	catch( ... )
276847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
276947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		goto require26Good;
277047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
277147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{ err = kResponseErr; goto exit; }
277247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltrequire26Good:
277347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif
277447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
277547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// translate_errno
277647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
277747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = translate_errno( 1 != -1, -123, -567 );
277847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require( ( err == 0 ) && "SHOULD *NOT* SEE", exit );
277947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
278047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = translate_errno( -1 != -1, -123, -567 );
278147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require( ( err == -123 ) && "SHOULD *NOT* SEE", exit );
278247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
278347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = translate_errno( -1 != -1, 0, -567 );
278447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require( ( err == -567 ) && "SHOULD *NOT* SEE", exit );
278547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
278647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// debug_string
278747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
278847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	debug_string( "debug_string" );
278947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
279047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// DebugSNPrintF
279147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
279247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%d", 1234 );
279347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "1234" ) == 0, exit, err = -1 );
279447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
279547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%X", 0x2345 );
279647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "2345" ) == 0, exit, err = -1 );
279747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
279847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%#s", "\05test" );
279947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "test" ) == 0, exit, err = -1 );
280047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
280147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%##s", "\03www\05apple\03com" );
280247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "www.apple.com." ) == 0, exit, err = -1 );
280347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
280447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%ld", (long) INT32_C( 2147483647 ) );
280547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "2147483647" ) == 0, exit, err = -1 );
280647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
280747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%lu", (unsigned long) UINT32_C( 4294967295 ) );
280847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "4294967295" ) == 0, exit, err = -1 );
280947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
281047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TYPE_LONGLONG_NATIVE )
281147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%lld", (long_long_compat) INT64_C( 9223372036854775807 ) );
281247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "9223372036854775807" ) == 0, exit, err = -1 );
281347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
281447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%lld", (long_long_compat) INT64_C( -9223372036854775807 ) );
281547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "-9223372036854775807" ) == 0, exit, err = -1 );
281647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
281747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%llu", (unsigned_long_long_compat) UINT64_C( 18446744073709551615 ) );
281847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "18446744073709551615" ) == 0, exit, err = -1 );
281947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
282047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
282147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%lb", (unsigned long) binary_32( 01111011, 01111011, 01111011, 01111011 ) );
282247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "1111011011110110111101101111011" ) == 0, exit, err = -1 );
282347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
282447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%C", 0x41624364 );	// 'AbCd'
282547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "AbCd" ) == 0, exit, err = -1 );
282647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
282747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( defined( MDNS_DEBUGMSGS ) )
282847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
282947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		mDNSAddr		maddr;
283047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
283147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		memset( &maddr, 0, sizeof( maddr ) );
283247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.type = mDNSAddrType_IPv4;
283347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v4.b[ 0 ] = 127;
283447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v4.b[ 1 ] = 0;
283547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v4.b[ 2 ] = 0;
283647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v4.b[ 3 ] = 1;
283747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%#a", &maddr );
283847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "127.0.0.1" ) == 0, exit, err = -1 );
283947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
284047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		memset( &maddr, 0, sizeof( maddr ) );
284147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.type = mDNSAddrType_IPv6;
284247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v6.b[  0 ]	= 0xFE;
284347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v6.b[  1 ]	= 0x80;
284447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		maddr.ip.v6.b[ 15 ]	= 0x01;
284547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%#a", &maddr );
284647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "FE80:0000:0000:0000:0000:0000:0000:0001" ) == 0, exit, err = -1 );
284747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
284847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
284947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
285047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( AF_INET )
285147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
285247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		struct sockaddr_in		sa4;
285347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
285447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		memset( &sa4, 0, sizeof( sa4 ) );
285547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		sa4.sin_family 		= AF_INET;
285647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p 					= (uint8_t *) &sa4.sin_port;
285747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 0 ] 				= (uint8_t)( ( 80 >> 8 ) & 0xFF );
285847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 1 ] 				= (uint8_t)(   80        & 0xFF );
285947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p 					= (uint8_t *) &sa4.sin_addr.s_addr;
286047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 0 ] 				= (uint8_t)( ( INADDR_LOOPBACK >> 24 ) & 0xFF );
286147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 1 ] 				= (uint8_t)( ( INADDR_LOOPBACK >> 16 ) & 0xFF );
286247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 2 ] 				= (uint8_t)( ( INADDR_LOOPBACK >>  8 ) & 0xFF );
286347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 3 ] 				= (uint8_t)(   INADDR_LOOPBACK         & 0xFF );
286447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%##a", &sa4 );
286547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "127.0.0.1:80" ) == 0, exit, err = -1 );
286647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
286747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
286847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
286947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( AF_INET6 )
287047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
287147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		struct sockaddr_in6		sa6;
287247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
287347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		memset( &sa6, 0, sizeof( sa6 ) );
287447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		sa6.sin6_family 			= AF_INET6;
287547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p 							= (uint8_t *) &sa6.sin6_port;
287647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 0 ] 						= (uint8_t)( ( 80 >> 8 ) & 0xFF );
287747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		p[ 1 ] 						= (uint8_t)(   80        & 0xFF );
287847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		sa6.sin6_addr.s6_addr[  0 ]	= 0xFE;
287947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		sa6.sin6_addr.s6_addr[  1 ]	= 0x80;
288047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		sa6.sin6_addr.s6_addr[ 15 ]	= 0x01;
288147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		sa6.sin6_scope_id			= 2;
288247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%##a", &sa6 );
288347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "[FE80:0000:0000:0000:0000:0000:0000:0001%2]:80" ) == 0, exit, err = -1 );
288447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
288547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
288647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
288747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Unicode
288847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
288947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "tes" );
289047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "tes" ) == 0, exit, err = kResponseErr );
289147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
289247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "test" );
289347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "test" ) == 0, exit, err = kResponseErr );
289447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
289547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "testing" );
289647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "test" ) == 0, exit, err = kResponseErr );
289747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
289847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xC3\xA9" );
289947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
290047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
290147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xC3\xA9ing" );
290247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
290347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
290447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "tes\xC3\xA9ing" );
290547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "tes" ) == 0, exit, err = kResponseErr );
290647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
290747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "t\xed\x9f\xbf" );
290847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "t\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
290947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
291047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "t\xed\x9f\xbfing" );
291147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "t\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
291247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
291347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xed\x9f\xbf" );
291447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te" ) == 0, exit, err = kResponseErr );
291547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
291647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xed\x9f\xbfing" );
291747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te" ) == 0, exit, err = kResponseErr );
291847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
291947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 7, "te\xC3\xA9\xed\x9f\xbfing" );
292047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te\xC3\xA9\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
292147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
292247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 6, "te\xC3\xA9\xed\x9f\xbfing" );
292347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
292447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
292547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF(s, sizeof(s), "%.*s", 5, "te\xC3\xA9\xed\x9f\xbfing" );
292647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
292747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
292847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TARGET_RT_BIG_ENDIAN )
292947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%S", "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );
293047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
293147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
293247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%S", "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );
293347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
293447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
293547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
293647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%S",
293747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"\xFE\xFF" "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );	// Big Endian BOM
293847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
293947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
294047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%S",
294147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"\xFF\xFE" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );	// Little Endian BOM
294247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
294347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
294447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%#S", "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );	// Big Endian
294547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
294647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
294747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%##S", "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );	// Little Endian
294847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
294947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
295047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%.*S",
295147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		4, "\xFE\xFF" "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );	// Big Endian BOM
295247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
295347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
295447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%.*S",
295547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		4, "\xFF\xFE" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );	// Little Endian BOM
295647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
295747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
295847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#if( TARGET_RT_BIG_ENDIAN )
295947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%.*S", 3, "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );
296047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
296147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#else
296247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugSNPrintF( s, sizeof( s ), "%.*S", 3, "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );
296347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
296447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	#endif
296547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
296647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%#.*S", 3, "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );	// Big Endian
296747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
296847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
296947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%##.*S", 3, "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );	// Little Endian
297047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
297147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
297247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Misc
297347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
297447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%U", "\x10\xb8\xa7\x6b" "\xad\x9d" "\xd1\x11" "\x80\xb4" "\x00\xc0\x4f\xd4\x30\xc8" );
297547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "6ba7b810-9dad-11d1-80b4-00c04fd430c8" ) == 0, exit, err = -1 );
297647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
297747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%m", 0 );
297847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "no error" ) == 0, exit, err = -1 );
297947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
298047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "%lm", (long) 0 );
298147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	require_action( strcmp( s, "no error" ) == 0, exit, err = -1 );
298247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
298347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "\"%H\"", "\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8", 16, 16 );
298447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
298547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
298647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "\"%H\"",
298747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8"
298847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		"\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8",
298947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		32, 32 );
299047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
299147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
299247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugSNPrintF( s, sizeof( s ), "\"%H\"", "\x6b\xa7", 2, 2 );
299347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
299447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
299547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Hex Dumps
299647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
299747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
299847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ),
299947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNone, s, sizeof( s ) );
300047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
300147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
300247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
300347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
300447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoAddress | kDebugFlagsNoOffset, s, sizeof( s ) );
300547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
300647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
300747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
300847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ),
300947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoAddress | kDebugFlagsNoOffset, s, sizeof( s ) );
301047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
301147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
301247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
301347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ),
301447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoAddress, s, sizeof( s ) );
301547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
301647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
301747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
301847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
301947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoOffset, s, sizeof( s ) );
302047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
302147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
302247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
302347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
302447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoAddress, s, sizeof( s ) );
302547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
302647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
302747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
302847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
302947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoOffset, s, sizeof( s ) );
303047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
303147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
303247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
303347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
303447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoByteCount, s, sizeof( s ) );
303547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
303647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
303747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
303847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, "\x41\x62\x43\x64", "\x41\x62\x43\x64", 4,	// 'AbCd'
303947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoNewLine |
304047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNo32BitSeparator | kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount,
304147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		s, sizeof( s ) );
304247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
304347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
304447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
304547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
304647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoASCII | kDebugFlagsNoNewLine |
304747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlags16BitSeparator | kDebugFlagsNo32BitSeparator |
304847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount, s, sizeof( s ) );
304947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
305047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
305147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	s[ 0 ] = '\0';
305247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugHexDump( kDebugLevelMax, 8, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), kDebugFlagsNone, s, sizeof( s ) );
305347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "%s\n", s );
305447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
305547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// dlog's
305647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
305747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dlog( kDebugLevelNotice, "dlog\n" );
305847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dlog( kDebugLevelNotice, "dlog integer: %d\n", 123 );
305947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dlog( kDebugLevelNotice, "dlog string:  \"%s\"\n", "test string" );
306047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	dlogmem( kDebugLevelNotice, data, sizeof( data ) );
306147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
306247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	// Done
306347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
306447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	DebugPrintF( kDebugLevelMax, "\n\nALL TESTS DONE\n\n" );
306547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	err = kNoErr;
306647e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
306747e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwaltexit:
306847e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	if( err )
306947e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	{
307047e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt		DebugPrintF( kDebugLevelMax, "\n\n### TEST FAILED ###\n\n" );
307147e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	}
307247e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt	return( err );
307347e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt}
307447e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt
307547e4cebad7397422144bb03a21f3f7682c062c4aRobert Greenwalt#endif	// DEBUG
3076