xref: /aosp_15_r20/external/mdnsresponder/mDNSShared/DebugServices.c (revision 48a54d368dc4fa860885eef7b70b6c53499e7c25)
1*48a54d36SAndroid Build Coastguard Worker /* -*- Mode: C; tab-width: 4 -*-
2*48a54d36SAndroid Build Coastguard Worker  *
3*48a54d36SAndroid Build Coastguard Worker  * Copyright (c) 1997-2004 Apple Computer, Inc. All rights reserved.
4*48a54d36SAndroid Build Coastguard Worker  *
5*48a54d36SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
6*48a54d36SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
7*48a54d36SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
8*48a54d36SAndroid Build Coastguard Worker  *
9*48a54d36SAndroid Build Coastguard Worker  *     http://www.apache.org/licenses/LICENSE-2.0
10*48a54d36SAndroid Build Coastguard Worker  *
11*48a54d36SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
12*48a54d36SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
13*48a54d36SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*48a54d36SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
15*48a54d36SAndroid Build Coastguard Worker  * limitations under the License.
16*48a54d36SAndroid Build Coastguard Worker 
17*48a54d36SAndroid Build Coastguard Worker 	To Do:
18*48a54d36SAndroid Build Coastguard Worker 
19*48a54d36SAndroid Build Coastguard Worker 	- Use StackWalk on Windows to optionally print stack frames.
20*48a54d36SAndroid Build Coastguard Worker */
21*48a54d36SAndroid Build Coastguard Worker 
22*48a54d36SAndroid Build Coastguard Worker #if 0
23*48a54d36SAndroid Build Coastguard Worker #pragma mark == Includes ==
24*48a54d36SAndroid Build Coastguard Worker #endif
25*48a54d36SAndroid Build Coastguard Worker 
26*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
27*48a54d36SAndroid Build Coastguard Worker //	Includes
28*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
29*48a54d36SAndroid Build Coastguard Worker 
30*48a54d36SAndroid Build Coastguard Worker #if( !KERNEL )
31*48a54d36SAndroid Build Coastguard Worker 	#include	<ctype.h>
32*48a54d36SAndroid Build Coastguard Worker 	#include	<stdio.h>
33*48a54d36SAndroid Build Coastguard Worker 	#include	<string.h>
34*48a54d36SAndroid Build Coastguard Worker #endif
35*48a54d36SAndroid Build Coastguard Worker 
36*48a54d36SAndroid Build Coastguard Worker #include	"CommonServices.h"
37*48a54d36SAndroid Build Coastguard Worker 
38*48a54d36SAndroid Build Coastguard Worker #include	"DebugServices.h"
39*48a54d36SAndroid Build Coastguard Worker 
40*48a54d36SAndroid Build Coastguard Worker #if( DEBUG )
41*48a54d36SAndroid Build Coastguard Worker 
42*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS )
43*48a54d36SAndroid Build Coastguard Worker 	#include	"intLib.h"
44*48a54d36SAndroid Build Coastguard Worker #endif
45*48a54d36SAndroid Build Coastguard Worker 
46*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
47*48a54d36SAndroid Build Coastguard Worker 	#include	<time.h>
48*48a54d36SAndroid Build Coastguard Worker 
49*48a54d36SAndroid Build Coastguard Worker 	#if( !TARGET_OS_WINDOWS_CE )
50*48a54d36SAndroid Build Coastguard Worker 		#include	<fcntl.h>
51*48a54d36SAndroid Build Coastguard Worker 		#include	<io.h>
52*48a54d36SAndroid Build Coastguard Worker 	#endif
53*48a54d36SAndroid Build Coastguard Worker #endif
54*48a54d36SAndroid Build Coastguard Worker 
55*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_IDEBUG_ENABLED && TARGET_API_MAC_OSX_KERNEL )
56*48a54d36SAndroid Build Coastguard Worker 	#include	<IOKit/IOLib.h>
57*48a54d36SAndroid Build Coastguard Worker #endif
58*48a54d36SAndroid Build Coastguard Worker 
59*48a54d36SAndroid Build Coastguard Worker // If MDNS_DEBUGMSGS is defined (even if defined 0), it is aware of mDNS and it is probably safe to include mDNSEmbeddedAPI.h.
60*48a54d36SAndroid Build Coastguard Worker 
61*48a54d36SAndroid Build Coastguard Worker #if( defined( MDNS_DEBUGMSGS ) )
62*48a54d36SAndroid Build Coastguard Worker 	#include	"mDNSEmbeddedAPI.h"
63*48a54d36SAndroid Build Coastguard Worker #endif
64*48a54d36SAndroid Build Coastguard Worker 
65*48a54d36SAndroid Build Coastguard Worker #if 0
66*48a54d36SAndroid Build Coastguard Worker #pragma mark == Macros ==
67*48a54d36SAndroid Build Coastguard Worker #endif
68*48a54d36SAndroid Build Coastguard Worker 
69*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
70*48a54d36SAndroid Build Coastguard Worker //	Macros
71*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
72*48a54d36SAndroid Build Coastguard Worker 
73*48a54d36SAndroid Build Coastguard Worker #define DebugIsPrint( C )		( ( ( C ) >= 0x20 ) && ( ( C ) <= 0x7E ) )
74*48a54d36SAndroid Build Coastguard Worker 
75*48a54d36SAndroid Build Coastguard Worker #if 0
76*48a54d36SAndroid Build Coastguard Worker #pragma mark == Prototypes ==
77*48a54d36SAndroid Build Coastguard Worker #endif
78*48a54d36SAndroid Build Coastguard Worker 
79*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
80*48a54d36SAndroid Build Coastguard Worker //	Prototypes
81*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
82*48a54d36SAndroid Build Coastguard Worker 
83*48a54d36SAndroid Build Coastguard Worker static OSStatus	DebugPrint( DebugLevel inLevel, char *inData, size_t inSize );
84*48a54d36SAndroid Build Coastguard Worker 
85*48a54d36SAndroid Build Coastguard Worker // fprintf
86*48a54d36SAndroid Build Coastguard Worker 
87*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_FPRINTF_ENABLED )
88*48a54d36SAndroid Build Coastguard Worker 	static OSStatus	DebugFPrintFInit( DebugOutputTypeFlags inFlags, const char *inFilename );
89*48a54d36SAndroid Build Coastguard Worker 	static void		DebugFPrintFPrint( char *inData, size_t inSize );
90*48a54d36SAndroid Build Coastguard Worker #endif
91*48a54d36SAndroid Build Coastguard Worker 
92*48a54d36SAndroid Build Coastguard Worker // iDebug (Mac OS X user and kernel)
93*48a54d36SAndroid Build Coastguard Worker 
94*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_IDEBUG_ENABLED )
95*48a54d36SAndroid Build Coastguard Worker 	static OSStatus	DebugiDebugInit( void );
96*48a54d36SAndroid Build Coastguard Worker 	static void		DebugiDebugPrint( char *inData, size_t inSize );
97*48a54d36SAndroid Build Coastguard Worker #endif
98*48a54d36SAndroid Build Coastguard Worker 
99*48a54d36SAndroid Build Coastguard Worker // kprintf (Mac OS X Kernel)
100*48a54d36SAndroid Build Coastguard Worker 
101*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_KPRINTF_ENABLED )
102*48a54d36SAndroid Build Coastguard Worker 	static void	DebugKPrintFPrint( char *inData, size_t inSize );
103*48a54d36SAndroid Build Coastguard Worker #endif
104*48a54d36SAndroid Build Coastguard Worker 
105*48a54d36SAndroid Build Coastguard Worker // Mac OS X IOLog (Mac OS X Kernel)
106*48a54d36SAndroid Build Coastguard Worker 
107*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
108*48a54d36SAndroid Build Coastguard Worker 	static void	DebugMacOSXIOLogPrint( char *inData, size_t inSize );
109*48a54d36SAndroid Build Coastguard Worker #endif
110*48a54d36SAndroid Build Coastguard Worker 
111*48a54d36SAndroid Build Coastguard Worker // Mac OS X Log
112*48a54d36SAndroid Build Coastguard Worker 
113*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_MAC )
114*48a54d36SAndroid Build Coastguard Worker 	static OSStatus	DebugMacOSXLogInit( void );
115*48a54d36SAndroid Build Coastguard Worker 	static void		DebugMacOSXLogPrint( char *inData, size_t inSize );
116*48a54d36SAndroid Build Coastguard Worker #endif
117*48a54d36SAndroid Build Coastguard Worker 
118*48a54d36SAndroid Build Coastguard Worker // Windows Debugger
119*48a54d36SAndroid Build Coastguard Worker 
120*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
121*48a54d36SAndroid Build Coastguard Worker 	static void	DebugWindowsDebuggerPrint( char *inData, size_t inSize );
122*48a54d36SAndroid Build Coastguard Worker #endif
123*48a54d36SAndroid Build Coastguard Worker 
124*48a54d36SAndroid Build Coastguard Worker // Windows Event Log
125*48a54d36SAndroid Build Coastguard Worker 
126*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
127*48a54d36SAndroid Build Coastguard Worker 	static OSStatus	DebugWindowsEventLogInit( const char *inName, HMODULE inModule );
128*48a54d36SAndroid Build Coastguard Worker 	static void	DebugWindowsEventLogPrint( DebugLevel inLevel, char *inData, size_t inSize );
129*48a54d36SAndroid Build Coastguard Worker #endif
130*48a54d36SAndroid Build Coastguard Worker 
131*48a54d36SAndroid Build Coastguard Worker // DebugLib support
132*48a54d36SAndroid Build Coastguard Worker 
133*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
134*48a54d36SAndroid Build Coastguard Worker 	static pascal void
135*48a54d36SAndroid Build Coastguard Worker 		DebugAssertOutputHandler(
136*48a54d36SAndroid Build Coastguard Worker 			OSType 				inComponentSignature,
137*48a54d36SAndroid Build Coastguard Worker 			UInt32 				inOptions,
138*48a54d36SAndroid Build Coastguard Worker 			const char *		inAssertionString,
139*48a54d36SAndroid Build Coastguard Worker 			const char *		inExceptionString,
140*48a54d36SAndroid Build Coastguard Worker 			const char *		inErrorString,
141*48a54d36SAndroid Build Coastguard Worker 			const char *		inFileName,
142*48a54d36SAndroid Build Coastguard Worker 			long 				inLineNumber,
143*48a54d36SAndroid Build Coastguard Worker 			void *				inValue,
144*48a54d36SAndroid Build Coastguard Worker 			ConstStr255Param 	inOutputMsg );
145*48a54d36SAndroid Build Coastguard Worker #endif
146*48a54d36SAndroid Build Coastguard Worker 
147*48a54d36SAndroid Build Coastguard Worker // Utilities
148*48a54d36SAndroid Build Coastguard Worker 
149*48a54d36SAndroid Build Coastguard Worker static char *	DebugNumVersionToString( uint32_t inVersion, char *inString );
150*48a54d36SAndroid Build Coastguard Worker 
151*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
152*48a54d36SAndroid Build Coastguard Worker 	static void	DebugWinEnableConsole( void );
153*48a54d36SAndroid Build Coastguard Worker #endif
154*48a54d36SAndroid Build Coastguard Worker 
155*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
156*48a54d36SAndroid Build Coastguard Worker 	static TCHAR *
157*48a54d36SAndroid Build Coastguard Worker 		DebugWinCharToTCharString(
158*48a54d36SAndroid Build Coastguard Worker 			const char *	inCharString,
159*48a54d36SAndroid Build Coastguard Worker 			size_t 			inCharCount,
160*48a54d36SAndroid Build Coastguard Worker 			TCHAR *			outTCharString,
161*48a54d36SAndroid Build Coastguard Worker 			size_t 			inTCharCountMax,
162*48a54d36SAndroid Build Coastguard Worker 			size_t *		outTCharCount );
163*48a54d36SAndroid Build Coastguard Worker #endif
164*48a54d36SAndroid Build Coastguard Worker 
165*48a54d36SAndroid Build Coastguard Worker #if 0
166*48a54d36SAndroid Build Coastguard Worker #pragma mark == Globals ==
167*48a54d36SAndroid Build Coastguard Worker #endif
168*48a54d36SAndroid Build Coastguard Worker 
169*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
170*48a54d36SAndroid Build Coastguard Worker //	Private Globals
171*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
172*48a54d36SAndroid Build Coastguard Worker 
173*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS )
174*48a54d36SAndroid Build Coastguard Worker 	// TCP States for inetstatShow.
175*48a54d36SAndroid Build Coastguard Worker 
176*48a54d36SAndroid Build Coastguard Worker 	extern char **	pTcpstates;		// defined in tcpLib.c
177*48a54d36SAndroid Build Coastguard Worker 
178*48a54d36SAndroid Build Coastguard Worker 	const char *		kDebugTCPStates[] =
179*48a54d36SAndroid Build Coastguard Worker 	{
180*48a54d36SAndroid Build Coastguard Worker 		"(0)  TCPS_CLOSED",
181*48a54d36SAndroid Build Coastguard Worker 		"(1)  TCPS_LISTEN",
182*48a54d36SAndroid Build Coastguard Worker 		"(2)  TCPS_SYN_SENT",
183*48a54d36SAndroid Build Coastguard Worker 		"(3)  TCPS_SYN_RECEIVED",
184*48a54d36SAndroid Build Coastguard Worker 		"(4)  TCPS_ESTABLISHED",
185*48a54d36SAndroid Build Coastguard Worker 		"(5)  TCPS_CLOSE_WAIT",
186*48a54d36SAndroid Build Coastguard Worker 		"(6)  TCPS_FIN_WAIT_1",
187*48a54d36SAndroid Build Coastguard Worker 		"(7)  TCPS_CLOSING",
188*48a54d36SAndroid Build Coastguard Worker 		"(8)  TCPS_LAST_ACK",
189*48a54d36SAndroid Build Coastguard Worker 		"(9)  TCPS_FIN_WAIT_2",
190*48a54d36SAndroid Build Coastguard Worker 		"(10) TCPS_TIME_WAIT",
191*48a54d36SAndroid Build Coastguard Worker 	};
192*48a54d36SAndroid Build Coastguard Worker #endif
193*48a54d36SAndroid Build Coastguard Worker 
194*48a54d36SAndroid Build Coastguard Worker // General
195*48a54d36SAndroid Build Coastguard Worker 
196*48a54d36SAndroid Build Coastguard Worker static bool									gDebugInitialized				= false;
197*48a54d36SAndroid Build Coastguard Worker static DebugOutputType						gDebugOutputType 				= kDebugOutputTypeNone;
198*48a54d36SAndroid Build Coastguard Worker static DebugLevel							gDebugPrintLevelMin				= kDebugLevelInfo;
199*48a54d36SAndroid Build Coastguard Worker static DebugLevel							gDebugPrintLevelMax				= kDebugLevelMax;
200*48a54d36SAndroid Build Coastguard Worker static DebugLevel							gDebugBreakLevel				= kDebugLevelAssert;
201*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
202*48a54d36SAndroid Build Coastguard Worker 	static DebugAssertOutputHandlerUPP		gDebugAssertOutputHandlerUPP	= NULL;
203*48a54d36SAndroid Build Coastguard Worker #endif
204*48a54d36SAndroid Build Coastguard Worker 
205*48a54d36SAndroid Build Coastguard Worker // Custom
206*48a54d36SAndroid Build Coastguard Worker 
207*48a54d36SAndroid Build Coastguard Worker static DebugOutputFunctionPtr				gDebugCustomOutputFunction 		= NULL;
208*48a54d36SAndroid Build Coastguard Worker static void *								gDebugCustomOutputContext 		= NULL;
209*48a54d36SAndroid Build Coastguard Worker 
210*48a54d36SAndroid Build Coastguard Worker // fprintf
211*48a54d36SAndroid Build Coastguard Worker 
212*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_FPRINTF_ENABLED )
213*48a54d36SAndroid Build Coastguard Worker 	static FILE *							gDebugFPrintFFile 				= NULL;
214*48a54d36SAndroid Build Coastguard Worker #endif
215*48a54d36SAndroid Build Coastguard Worker 
216*48a54d36SAndroid Build Coastguard Worker // MacOSXLog
217*48a54d36SAndroid Build Coastguard Worker 
218*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_MAC )
219*48a54d36SAndroid Build Coastguard Worker 	typedef int	( *DebugMacOSXLogFunctionPtr )( const char *inFormat, ... );
220*48a54d36SAndroid Build Coastguard Worker 
221*48a54d36SAndroid Build Coastguard Worker 	static DebugMacOSXLogFunctionPtr		gDebugMacOSXLogFunction			= NULL;
222*48a54d36SAndroid Build Coastguard Worker #endif
223*48a54d36SAndroid Build Coastguard Worker 
224*48a54d36SAndroid Build Coastguard Worker // WindowsEventLog
225*48a54d36SAndroid Build Coastguard Worker 
226*48a54d36SAndroid Build Coastguard Worker 
227*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
228*48a54d36SAndroid Build Coastguard Worker 	static HANDLE							gDebugWindowsEventLogEventSource = NULL;
229*48a54d36SAndroid Build Coastguard Worker #endif
230*48a54d36SAndroid Build Coastguard Worker 
231*48a54d36SAndroid Build Coastguard Worker #if 0
232*48a54d36SAndroid Build Coastguard Worker #pragma mark -
233*48a54d36SAndroid Build Coastguard Worker #pragma mark == General ==
234*48a54d36SAndroid Build Coastguard Worker #endif
235*48a54d36SAndroid Build Coastguard Worker 
236*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
237*48a54d36SAndroid Build Coastguard Worker //	DebugInitialize
238*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
239*48a54d36SAndroid Build Coastguard Worker 
DebugInitialize(DebugOutputType inType,...)240*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus	DebugInitialize( DebugOutputType inType, ... )
241*48a54d36SAndroid Build Coastguard Worker {
242*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err;
243*48a54d36SAndroid Build Coastguard Worker 	DebugOutputType		type;
244*48a54d36SAndroid Build Coastguard Worker 	va_list				args;
245*48a54d36SAndroid Build Coastguard Worker 
246*48a54d36SAndroid Build Coastguard Worker 	va_start( args, inType );
247*48a54d36SAndroid Build Coastguard Worker 
248*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS )
249*48a54d36SAndroid Build Coastguard Worker 	// Set up the TCP state strings if they are not already set up by VxWorks (normally not set up for some reason).
250*48a54d36SAndroid Build Coastguard Worker 
251*48a54d36SAndroid Build Coastguard Worker 	if( !pTcpstates )
252*48a54d36SAndroid Build Coastguard Worker 	{
253*48a54d36SAndroid Build Coastguard Worker 		pTcpstates = (char **) kDebugTCPStates;
254*48a54d36SAndroid Build Coastguard Worker 	}
255*48a54d36SAndroid Build Coastguard Worker #endif
256*48a54d36SAndroid Build Coastguard Worker 
257*48a54d36SAndroid Build Coastguard Worker 	// Set up DebugLib stuff (if building with Debugging.h).
258*48a54d36SAndroid Build Coastguard Worker 
259*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
260*48a54d36SAndroid Build Coastguard Worker 	if( !gDebugAssertOutputHandlerUPP )
261*48a54d36SAndroid Build Coastguard Worker 	{
262*48a54d36SAndroid Build Coastguard Worker 		gDebugAssertOutputHandlerUPP = NewDebugAssertOutputHandlerUPP( DebugAssertOutputHandler );
263*48a54d36SAndroid Build Coastguard Worker 		check( gDebugAssertOutputHandlerUPP );
264*48a54d36SAndroid Build Coastguard Worker 		if( gDebugAssertOutputHandlerUPP )
265*48a54d36SAndroid Build Coastguard Worker 		{
266*48a54d36SAndroid Build Coastguard Worker 			InstallDebugAssertOutputHandler( gDebugAssertOutputHandlerUPP );
267*48a54d36SAndroid Build Coastguard Worker 		}
268*48a54d36SAndroid Build Coastguard Worker 	}
269*48a54d36SAndroid Build Coastguard Worker #endif
270*48a54d36SAndroid Build Coastguard Worker 
271*48a54d36SAndroid Build Coastguard Worker 	// Pre-process meta-output kind to pick an appropriate output kind for the platform.
272*48a54d36SAndroid Build Coastguard Worker 
273*48a54d36SAndroid Build Coastguard Worker 	type = inType;
274*48a54d36SAndroid Build Coastguard Worker 	if( type == kDebugOutputTypeMetaConsole )
275*48a54d36SAndroid Build Coastguard Worker 	{
276*48a54d36SAndroid Build Coastguard Worker 		#if( TARGET_OS_MAC )
277*48a54d36SAndroid Build Coastguard Worker 			type = kDebugOutputTypeMacOSXLog;
278*48a54d36SAndroid Build Coastguard Worker 		#elif( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
279*48a54d36SAndroid Build Coastguard Worker 			#if( DEBUG_FPRINTF_ENABLED )
280*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeFPrintF;
281*48a54d36SAndroid Build Coastguard Worker 			#else
282*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeWindowsDebugger;
283*48a54d36SAndroid Build Coastguard Worker 			#endif
284*48a54d36SAndroid Build Coastguard Worker 		#elif( TARGET_API_MAC_OSX_KERNEL )
285*48a54d36SAndroid Build Coastguard Worker 			#if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
286*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeMacOSXIOLog;
287*48a54d36SAndroid Build Coastguard Worker 			#elif( DEBUG_IDEBUG_ENABLED )
288*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeiDebug;
289*48a54d36SAndroid Build Coastguard Worker 			#elif( DEBUG_KPRINTF_ENABLED )
290*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeKPrintF;
291*48a54d36SAndroid Build Coastguard Worker 			#endif
292*48a54d36SAndroid Build Coastguard Worker 		#elif( TARGET_OS_VXWORKS )
293*48a54d36SAndroid Build Coastguard Worker 			#if( DEBUG_FPRINTF_ENABLED )
294*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeFPrintF;
295*48a54d36SAndroid Build Coastguard Worker 			#else
296*48a54d36SAndroid Build Coastguard Worker 				#error target is VxWorks, but fprintf output is disabled
297*48a54d36SAndroid Build Coastguard Worker 			#endif
298*48a54d36SAndroid Build Coastguard Worker 		#else
299*48a54d36SAndroid Build Coastguard Worker 			#if( DEBUG_FPRINTF_ENABLED )
300*48a54d36SAndroid Build Coastguard Worker 				type = kDebugOutputTypeFPrintF;
301*48a54d36SAndroid Build Coastguard Worker 			#endif
302*48a54d36SAndroid Build Coastguard Worker 		#endif
303*48a54d36SAndroid Build Coastguard Worker 	}
304*48a54d36SAndroid Build Coastguard Worker 
305*48a54d36SAndroid Build Coastguard Worker 	// Process output kind.
306*48a54d36SAndroid Build Coastguard Worker 
307*48a54d36SAndroid Build Coastguard Worker 	gDebugOutputType = type;
308*48a54d36SAndroid Build Coastguard Worker 	switch( type )
309*48a54d36SAndroid Build Coastguard Worker 	{
310*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeNone:
311*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
312*48a54d36SAndroid Build Coastguard Worker 			break;
313*48a54d36SAndroid Build Coastguard Worker 
314*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeCustom:
315*48a54d36SAndroid Build Coastguard Worker 			gDebugCustomOutputFunction = va_arg( args, DebugOutputFunctionPtr );
316*48a54d36SAndroid Build Coastguard Worker 			gDebugCustomOutputContext  = va_arg( args, void * );
317*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
318*48a54d36SAndroid Build Coastguard Worker 			break;
319*48a54d36SAndroid Build Coastguard Worker 
320*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_FPRINTF_ENABLED )
321*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeFPrintF:
322*48a54d36SAndroid Build Coastguard Worker 			if( inType == kDebugOutputTypeMetaConsole )
323*48a54d36SAndroid Build Coastguard Worker 			{
324*48a54d36SAndroid Build Coastguard Worker 				err = DebugFPrintFInit( kDebugOutputTypeFlagsStdErr, NULL );
325*48a54d36SAndroid Build Coastguard Worker 			}
326*48a54d36SAndroid Build Coastguard Worker 			else
327*48a54d36SAndroid Build Coastguard Worker 			{
328*48a54d36SAndroid Build Coastguard Worker 				DebugOutputTypeFlags		flags;
329*48a54d36SAndroid Build Coastguard Worker 				const char *				filename;
330*48a54d36SAndroid Build Coastguard Worker 
331*48a54d36SAndroid Build Coastguard Worker 				flags = (DebugOutputTypeFlags) va_arg( args, unsigned int );
332*48a54d36SAndroid Build Coastguard Worker 				if( ( flags & kDebugOutputTypeFlagsTypeMask ) == kDebugOutputTypeFlagsFile )
333*48a54d36SAndroid Build Coastguard Worker 				{
334*48a54d36SAndroid Build Coastguard Worker 					filename = va_arg( args, const char * );
335*48a54d36SAndroid Build Coastguard Worker 				}
336*48a54d36SAndroid Build Coastguard Worker 				else
337*48a54d36SAndroid Build Coastguard Worker 				{
338*48a54d36SAndroid Build Coastguard Worker 					filename = NULL;
339*48a54d36SAndroid Build Coastguard Worker 				}
340*48a54d36SAndroid Build Coastguard Worker 				err = DebugFPrintFInit( flags, filename );
341*48a54d36SAndroid Build Coastguard Worker 			}
342*48a54d36SAndroid Build Coastguard Worker 			break;
343*48a54d36SAndroid Build Coastguard Worker #endif
344*48a54d36SAndroid Build Coastguard Worker 
345*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_IDEBUG_ENABLED )
346*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeiDebug:
347*48a54d36SAndroid Build Coastguard Worker 			err = DebugiDebugInit();
348*48a54d36SAndroid Build Coastguard Worker 			break;
349*48a54d36SAndroid Build Coastguard Worker #endif
350*48a54d36SAndroid Build Coastguard Worker 
351*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_KPRINTF_ENABLED )
352*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeKPrintF:
353*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
354*48a54d36SAndroid Build Coastguard Worker 			break;
355*48a54d36SAndroid Build Coastguard Worker #endif
356*48a54d36SAndroid Build Coastguard Worker 
357*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
358*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeMacOSXIOLog:
359*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
360*48a54d36SAndroid Build Coastguard Worker 			break;
361*48a54d36SAndroid Build Coastguard Worker #endif
362*48a54d36SAndroid Build Coastguard Worker 
363*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_MAC )
364*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeMacOSXLog:
365*48a54d36SAndroid Build Coastguard Worker 			err = DebugMacOSXLogInit();
366*48a54d36SAndroid Build Coastguard Worker 			break;
367*48a54d36SAndroid Build Coastguard Worker #endif
368*48a54d36SAndroid Build Coastguard Worker 
369*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
370*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeWindowsDebugger:
371*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
372*48a54d36SAndroid Build Coastguard Worker 			break;
373*48a54d36SAndroid Build Coastguard Worker #endif
374*48a54d36SAndroid Build Coastguard Worker 
375*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
376*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeWindowsEventLog:
377*48a54d36SAndroid Build Coastguard Worker 		{
378*48a54d36SAndroid Build Coastguard Worker 			const char *		name;
379*48a54d36SAndroid Build Coastguard Worker 			HMODULE				module;
380*48a54d36SAndroid Build Coastguard Worker 
381*48a54d36SAndroid Build Coastguard Worker 			name   = va_arg( args, const char * );
382*48a54d36SAndroid Build Coastguard Worker 			module = va_arg( args, HMODULE );
383*48a54d36SAndroid Build Coastguard Worker 			err = DebugWindowsEventLogInit( name, module );
384*48a54d36SAndroid Build Coastguard Worker 		}
385*48a54d36SAndroid Build Coastguard Worker 		break;
386*48a54d36SAndroid Build Coastguard Worker #endif
387*48a54d36SAndroid Build Coastguard Worker 
388*48a54d36SAndroid Build Coastguard Worker 		default:
389*48a54d36SAndroid Build Coastguard Worker 			err = kParamErr;
390*48a54d36SAndroid Build Coastguard Worker 			goto exit;
391*48a54d36SAndroid Build Coastguard Worker 	}
392*48a54d36SAndroid Build Coastguard Worker 	gDebugInitialized = true;
393*48a54d36SAndroid Build Coastguard Worker 
394*48a54d36SAndroid Build Coastguard Worker exit:
395*48a54d36SAndroid Build Coastguard Worker 	va_end( args );
396*48a54d36SAndroid Build Coastguard Worker 	return( err );
397*48a54d36SAndroid Build Coastguard Worker }
398*48a54d36SAndroid Build Coastguard Worker 
399*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
400*48a54d36SAndroid Build Coastguard Worker //	DebugFinalize
401*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
402*48a54d36SAndroid Build Coastguard Worker 
DebugFinalize(void)403*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT void		DebugFinalize( void )
404*48a54d36SAndroid Build Coastguard Worker {
405*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
406*48a54d36SAndroid Build Coastguard Worker 	check( gDebugAssertOutputHandlerUPP );
407*48a54d36SAndroid Build Coastguard Worker 	if( gDebugAssertOutputHandlerUPP )
408*48a54d36SAndroid Build Coastguard Worker 	{
409*48a54d36SAndroid Build Coastguard Worker 		InstallDebugAssertOutputHandler( NULL );
410*48a54d36SAndroid Build Coastguard Worker 		DisposeDebugAssertOutputHandlerUPP( gDebugAssertOutputHandlerUPP );
411*48a54d36SAndroid Build Coastguard Worker 		gDebugAssertOutputHandlerUPP = NULL;
412*48a54d36SAndroid Build Coastguard Worker 	}
413*48a54d36SAndroid Build Coastguard Worker #endif
414*48a54d36SAndroid Build Coastguard Worker }
415*48a54d36SAndroid Build Coastguard Worker 
416*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
417*48a54d36SAndroid Build Coastguard Worker //	DebugGetProperty
418*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
419*48a54d36SAndroid Build Coastguard Worker 
DebugGetProperty(DebugPropertyTag inTag,...)420*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus	DebugGetProperty( DebugPropertyTag inTag, ... )
421*48a54d36SAndroid Build Coastguard Worker {
422*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err;
423*48a54d36SAndroid Build Coastguard Worker 	va_list				args;
424*48a54d36SAndroid Build Coastguard Worker 	DebugLevel *		level;
425*48a54d36SAndroid Build Coastguard Worker 
426*48a54d36SAndroid Build Coastguard Worker 	va_start( args, inTag );
427*48a54d36SAndroid Build Coastguard Worker 	switch( inTag )
428*48a54d36SAndroid Build Coastguard Worker 	{
429*48a54d36SAndroid Build Coastguard Worker 		case kDebugPropertyTagPrintLevelMin:
430*48a54d36SAndroid Build Coastguard Worker 			level  = va_arg( args, DebugLevel * );
431*48a54d36SAndroid Build Coastguard Worker 			*level = gDebugPrintLevelMin;
432*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
433*48a54d36SAndroid Build Coastguard Worker 			break;
434*48a54d36SAndroid Build Coastguard Worker 
435*48a54d36SAndroid Build Coastguard Worker 		case kDebugPropertyTagPrintLevelMax:
436*48a54d36SAndroid Build Coastguard Worker 			level  = va_arg( args, DebugLevel * );
437*48a54d36SAndroid Build Coastguard Worker 			*level = gDebugPrintLevelMax;
438*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
439*48a54d36SAndroid Build Coastguard Worker 			break;
440*48a54d36SAndroid Build Coastguard Worker 
441*48a54d36SAndroid Build Coastguard Worker 		case kDebugPropertyTagBreakLevel:
442*48a54d36SAndroid Build Coastguard Worker 			level  = va_arg( args, DebugLevel * );
443*48a54d36SAndroid Build Coastguard Worker 			*level = gDebugBreakLevel;
444*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
445*48a54d36SAndroid Build Coastguard Worker 			break;
446*48a54d36SAndroid Build Coastguard Worker 
447*48a54d36SAndroid Build Coastguard Worker 		default:
448*48a54d36SAndroid Build Coastguard Worker 			err = kUnsupportedErr;
449*48a54d36SAndroid Build Coastguard Worker 			break;
450*48a54d36SAndroid Build Coastguard Worker 	}
451*48a54d36SAndroid Build Coastguard Worker 	va_end( args );
452*48a54d36SAndroid Build Coastguard Worker 	return( err );
453*48a54d36SAndroid Build Coastguard Worker }
454*48a54d36SAndroid Build Coastguard Worker 
455*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
456*48a54d36SAndroid Build Coastguard Worker //	DebugSetProperty
457*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
458*48a54d36SAndroid Build Coastguard Worker 
DebugSetProperty(DebugPropertyTag inTag,...)459*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus	DebugSetProperty( DebugPropertyTag inTag, ... )
460*48a54d36SAndroid Build Coastguard Worker {
461*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
462*48a54d36SAndroid Build Coastguard Worker 	va_list			args;
463*48a54d36SAndroid Build Coastguard Worker 	DebugLevel		level;
464*48a54d36SAndroid Build Coastguard Worker 
465*48a54d36SAndroid Build Coastguard Worker 	va_start( args, inTag );
466*48a54d36SAndroid Build Coastguard Worker 	switch( inTag )
467*48a54d36SAndroid Build Coastguard Worker 	{
468*48a54d36SAndroid Build Coastguard Worker 		case kDebugPropertyTagPrintLevelMin:
469*48a54d36SAndroid Build Coastguard Worker 			level  = va_arg( args, DebugLevel );
470*48a54d36SAndroid Build Coastguard Worker 			gDebugPrintLevelMin = level;
471*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
472*48a54d36SAndroid Build Coastguard Worker 			break;
473*48a54d36SAndroid Build Coastguard Worker 
474*48a54d36SAndroid Build Coastguard Worker 		case kDebugPropertyTagPrintLevelMax:
475*48a54d36SAndroid Build Coastguard Worker 			level  = va_arg( args, DebugLevel );
476*48a54d36SAndroid Build Coastguard Worker 			gDebugPrintLevelMax = level;
477*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
478*48a54d36SAndroid Build Coastguard Worker 			break;
479*48a54d36SAndroid Build Coastguard Worker 
480*48a54d36SAndroid Build Coastguard Worker 		case kDebugPropertyTagBreakLevel:
481*48a54d36SAndroid Build Coastguard Worker 			level  = va_arg( args, DebugLevel );
482*48a54d36SAndroid Build Coastguard Worker 			gDebugBreakLevel = level;
483*48a54d36SAndroid Build Coastguard Worker 			err = kNoErr;
484*48a54d36SAndroid Build Coastguard Worker 			break;
485*48a54d36SAndroid Build Coastguard Worker 
486*48a54d36SAndroid Build Coastguard Worker 		default:
487*48a54d36SAndroid Build Coastguard Worker 			err = kUnsupportedErr;
488*48a54d36SAndroid Build Coastguard Worker 			break;
489*48a54d36SAndroid Build Coastguard Worker 	}
490*48a54d36SAndroid Build Coastguard Worker 	va_end( args );
491*48a54d36SAndroid Build Coastguard Worker 	return( err );
492*48a54d36SAndroid Build Coastguard Worker }
493*48a54d36SAndroid Build Coastguard Worker 
494*48a54d36SAndroid Build Coastguard Worker #if 0
495*48a54d36SAndroid Build Coastguard Worker #pragma mark -
496*48a54d36SAndroid Build Coastguard Worker #pragma mark == Output ==
497*48a54d36SAndroid Build Coastguard Worker #endif
498*48a54d36SAndroid Build Coastguard Worker 
499*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
500*48a54d36SAndroid Build Coastguard Worker //	DebugPrintF
501*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
502*48a54d36SAndroid Build Coastguard Worker 
DebugPrintF(DebugLevel inLevel,const char * inFormat,...)503*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t	DebugPrintF( DebugLevel inLevel, const char *inFormat, ... )
504*48a54d36SAndroid Build Coastguard Worker {
505*48a54d36SAndroid Build Coastguard Worker 	va_list		args;
506*48a54d36SAndroid Build Coastguard Worker 	size_t		n;
507*48a54d36SAndroid Build Coastguard Worker 
508*48a54d36SAndroid Build Coastguard Worker 	// Skip if the level is not in the enabled range..
509*48a54d36SAndroid Build Coastguard Worker 
510*48a54d36SAndroid Build Coastguard Worker 	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
511*48a54d36SAndroid Build Coastguard Worker 	{
512*48a54d36SAndroid Build Coastguard Worker 		n = 0;
513*48a54d36SAndroid Build Coastguard Worker 		goto exit;
514*48a54d36SAndroid Build Coastguard Worker 	}
515*48a54d36SAndroid Build Coastguard Worker 
516*48a54d36SAndroid Build Coastguard Worker 	va_start( args, inFormat );
517*48a54d36SAndroid Build Coastguard Worker 	n = DebugPrintFVAList( inLevel, inFormat, args );
518*48a54d36SAndroid Build Coastguard Worker 	va_end( args );
519*48a54d36SAndroid Build Coastguard Worker 
520*48a54d36SAndroid Build Coastguard Worker exit:
521*48a54d36SAndroid Build Coastguard Worker 	return( n );
522*48a54d36SAndroid Build Coastguard Worker }
523*48a54d36SAndroid Build Coastguard Worker 
524*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
525*48a54d36SAndroid Build Coastguard Worker //	DebugPrintFVAList
526*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
527*48a54d36SAndroid Build Coastguard Worker 
DebugPrintFVAList(DebugLevel inLevel,const char * inFormat,va_list inArgs)528*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t	DebugPrintFVAList( DebugLevel inLevel, const char *inFormat, va_list inArgs )
529*48a54d36SAndroid Build Coastguard Worker {
530*48a54d36SAndroid Build Coastguard Worker 	size_t		n;
531*48a54d36SAndroid Build Coastguard Worker 	char		buffer[ 512 ];
532*48a54d36SAndroid Build Coastguard Worker 
533*48a54d36SAndroid Build Coastguard Worker 	// Skip if the level is not in the enabled range..
534*48a54d36SAndroid Build Coastguard Worker 
535*48a54d36SAndroid Build Coastguard Worker 	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
536*48a54d36SAndroid Build Coastguard Worker 	{
537*48a54d36SAndroid Build Coastguard Worker 		n = 0;
538*48a54d36SAndroid Build Coastguard Worker 		goto exit;
539*48a54d36SAndroid Build Coastguard Worker 	}
540*48a54d36SAndroid Build Coastguard Worker 
541*48a54d36SAndroid Build Coastguard Worker 	n = DebugSNPrintFVAList( buffer, sizeof( buffer ), inFormat, inArgs );
542*48a54d36SAndroid Build Coastguard Worker 	DebugPrint( inLevel, buffer, (size_t) n );
543*48a54d36SAndroid Build Coastguard Worker 
544*48a54d36SAndroid Build Coastguard Worker exit:
545*48a54d36SAndroid Build Coastguard Worker 	return( n );
546*48a54d36SAndroid Build Coastguard Worker }
547*48a54d36SAndroid Build Coastguard Worker 
548*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
549*48a54d36SAndroid Build Coastguard Worker //	DebugPrint
550*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
551*48a54d36SAndroid Build Coastguard Worker 
DebugPrint(DebugLevel inLevel,char * inData,size_t inSize)552*48a54d36SAndroid Build Coastguard Worker static OSStatus	DebugPrint( DebugLevel inLevel, char *inData, size_t inSize )
553*48a54d36SAndroid Build Coastguard Worker {
554*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
555*48a54d36SAndroid Build Coastguard Worker 
556*48a54d36SAndroid Build Coastguard Worker 	// Skip if the level is not in the enabled range..
557*48a54d36SAndroid Build Coastguard Worker 
558*48a54d36SAndroid Build Coastguard Worker 	if( ( inLevel < gDebugPrintLevelMin ) || ( inLevel > gDebugPrintLevelMax ) )
559*48a54d36SAndroid Build Coastguard Worker 	{
560*48a54d36SAndroid Build Coastguard Worker 		err = kRangeErr;
561*48a54d36SAndroid Build Coastguard Worker 		goto exit;
562*48a54d36SAndroid Build Coastguard Worker 	}
563*48a54d36SAndroid Build Coastguard Worker 
564*48a54d36SAndroid Build Coastguard Worker 	// Printing is not safe at interrupt time so check for this and warn with an interrupt safe mechanism (if available).
565*48a54d36SAndroid Build Coastguard Worker 
566*48a54d36SAndroid Build Coastguard Worker 	if( DebugTaskLevel() & kDebugInterruptLevelMask )
567*48a54d36SAndroid Build Coastguard Worker 	{
568*48a54d36SAndroid Build Coastguard Worker 		#if( TARGET_OS_VXWORKS )
569*48a54d36SAndroid Build Coastguard Worker 			logMsg( "\ncannot print at interrupt time\n\n", 1, 2, 3, 4, 5, 6 );
570*48a54d36SAndroid Build Coastguard Worker 		#endif
571*48a54d36SAndroid Build Coastguard Worker 
572*48a54d36SAndroid Build Coastguard Worker 		err = kExecutionStateErr;
573*48a54d36SAndroid Build Coastguard Worker 		goto exit;
574*48a54d36SAndroid Build Coastguard Worker 	}
575*48a54d36SAndroid Build Coastguard Worker 
576*48a54d36SAndroid Build Coastguard Worker 	// Initialize the debugging library if it hasn't already been initialized (allows for zero-config usage).
577*48a54d36SAndroid Build Coastguard Worker 
578*48a54d36SAndroid Build Coastguard Worker 	if( !gDebugInitialized )
579*48a54d36SAndroid Build Coastguard Worker 	{
580*48a54d36SAndroid Build Coastguard Worker 		debug_initialize( kDebugOutputTypeMetaConsole );
581*48a54d36SAndroid Build Coastguard Worker 	}
582*48a54d36SAndroid Build Coastguard Worker 
583*48a54d36SAndroid Build Coastguard Worker 	// Print based on the current output type.
584*48a54d36SAndroid Build Coastguard Worker 
585*48a54d36SAndroid Build Coastguard Worker 	switch( gDebugOutputType )
586*48a54d36SAndroid Build Coastguard Worker 	{
587*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeNone:
588*48a54d36SAndroid Build Coastguard Worker 			break;
589*48a54d36SAndroid Build Coastguard Worker 
590*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeCustom:
591*48a54d36SAndroid Build Coastguard Worker 			if( gDebugCustomOutputFunction )
592*48a54d36SAndroid Build Coastguard Worker 			{
593*48a54d36SAndroid Build Coastguard Worker 				gDebugCustomOutputFunction( inData, inSize, gDebugCustomOutputContext );
594*48a54d36SAndroid Build Coastguard Worker 			}
595*48a54d36SAndroid Build Coastguard Worker 			break;
596*48a54d36SAndroid Build Coastguard Worker 
597*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_FPRINTF_ENABLED )
598*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeFPrintF:
599*48a54d36SAndroid Build Coastguard Worker 			DebugFPrintFPrint( inData, inSize );
600*48a54d36SAndroid Build Coastguard Worker 			break;
601*48a54d36SAndroid Build Coastguard Worker #endif
602*48a54d36SAndroid Build Coastguard Worker 
603*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_IDEBUG_ENABLED )
604*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeiDebug:
605*48a54d36SAndroid Build Coastguard Worker 			DebugiDebugPrint( inData, inSize );
606*48a54d36SAndroid Build Coastguard Worker 			break;
607*48a54d36SAndroid Build Coastguard Worker #endif
608*48a54d36SAndroid Build Coastguard Worker 
609*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_KPRINTF_ENABLED )
610*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeKPrintF:
611*48a54d36SAndroid Build Coastguard Worker 			DebugKPrintFPrint( inData, inSize );
612*48a54d36SAndroid Build Coastguard Worker 			break;
613*48a54d36SAndroid Build Coastguard Worker #endif
614*48a54d36SAndroid Build Coastguard Worker 
615*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
616*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeMacOSXIOLog:
617*48a54d36SAndroid Build Coastguard Worker 			DebugMacOSXIOLogPrint( inData, inSize );
618*48a54d36SAndroid Build Coastguard Worker 			break;
619*48a54d36SAndroid Build Coastguard Worker #endif
620*48a54d36SAndroid Build Coastguard Worker 
621*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_MAC )
622*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeMacOSXLog:
623*48a54d36SAndroid Build Coastguard Worker 			DebugMacOSXLogPrint( inData, inSize );
624*48a54d36SAndroid Build Coastguard Worker 			break;
625*48a54d36SAndroid Build Coastguard Worker #endif
626*48a54d36SAndroid Build Coastguard Worker 
627*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
628*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeWindowsDebugger:
629*48a54d36SAndroid Build Coastguard Worker 			DebugWindowsDebuggerPrint( inData, inSize );
630*48a54d36SAndroid Build Coastguard Worker 			break;
631*48a54d36SAndroid Build Coastguard Worker #endif
632*48a54d36SAndroid Build Coastguard Worker 
633*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
634*48a54d36SAndroid Build Coastguard Worker 		case kDebugOutputTypeWindowsEventLog:
635*48a54d36SAndroid Build Coastguard Worker 			DebugWindowsEventLogPrint( inLevel, inData, inSize );
636*48a54d36SAndroid Build Coastguard Worker 			break;
637*48a54d36SAndroid Build Coastguard Worker #endif
638*48a54d36SAndroid Build Coastguard Worker 
639*48a54d36SAndroid Build Coastguard Worker 		default:
640*48a54d36SAndroid Build Coastguard Worker 			break;
641*48a54d36SAndroid Build Coastguard Worker 	}
642*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
643*48a54d36SAndroid Build Coastguard Worker 
644*48a54d36SAndroid Build Coastguard Worker exit:
645*48a54d36SAndroid Build Coastguard Worker 	return( err );
646*48a54d36SAndroid Build Coastguard Worker }
647*48a54d36SAndroid Build Coastguard Worker 
648*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
649*48a54d36SAndroid Build Coastguard Worker //	DebugPrintAssert
650*48a54d36SAndroid Build Coastguard Worker //
651*48a54d36SAndroid Build Coastguard Worker //	Warning: This routine relies on several of the strings being string constants that will exist forever because the
652*48a54d36SAndroid Build Coastguard Worker //           underlying logMsg API that does the printing is asynchronous so it cannot use temporary/stack-based
653*48a54d36SAndroid Build Coastguard Worker //           pointer variables (e.g. local strings). The debug macros that invoke this function only use constant
654*48a54d36SAndroid Build Coastguard Worker //           constant strings, but if this function is invoked directly from other places, it must use constant strings.
655*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
656*48a54d36SAndroid Build Coastguard Worker 
657*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT void
DebugPrintAssert(int_least32_t inErrorCode,const char * inAssertString,const char * inMessage,const char * inFilename,int_least32_t inLineNumber,const char * inFunction)658*48a54d36SAndroid Build Coastguard Worker 	DebugPrintAssert(
659*48a54d36SAndroid Build Coastguard Worker 		int_least32_t	inErrorCode,
660*48a54d36SAndroid Build Coastguard Worker 		const char *	inAssertString,
661*48a54d36SAndroid Build Coastguard Worker 		const char *	inMessage,
662*48a54d36SAndroid Build Coastguard Worker 		const char *	inFilename,
663*48a54d36SAndroid Build Coastguard Worker 		int_least32_t	inLineNumber,
664*48a54d36SAndroid Build Coastguard Worker 		const char *	inFunction )
665*48a54d36SAndroid Build Coastguard Worker {
666*48a54d36SAndroid Build Coastguard Worker 	// Skip if the level is not in the enabled range..
667*48a54d36SAndroid Build Coastguard Worker 
668*48a54d36SAndroid Build Coastguard Worker 	if( ( kDebugLevelAssert < gDebugPrintLevelMin ) || ( kDebugLevelAssert > gDebugPrintLevelMax ) )
669*48a54d36SAndroid Build Coastguard Worker 	{
670*48a54d36SAndroid Build Coastguard Worker 		return;
671*48a54d36SAndroid Build Coastguard Worker 	}
672*48a54d36SAndroid Build Coastguard Worker 
673*48a54d36SAndroid Build Coastguard Worker 	if( inErrorCode != 0 )
674*48a54d36SAndroid Build Coastguard Worker 	{
675*48a54d36SAndroid Build Coastguard Worker 		DebugPrintF(
676*48a54d36SAndroid Build Coastguard Worker 			kDebugLevelAssert,
677*48a54d36SAndroid Build Coastguard Worker 			"\n"
678*48a54d36SAndroid Build Coastguard Worker 			"[ASSERT] error:  %ld (%m)\n"
679*48a54d36SAndroid Build Coastguard Worker 			"[ASSERT] where:  \"%s\", line %ld, \"%s\"\n"
680*48a54d36SAndroid Build Coastguard Worker 			"\n",
681*48a54d36SAndroid Build Coastguard Worker 			inErrorCode, inErrorCode,
682*48a54d36SAndroid Build Coastguard Worker 			inFilename ? inFilename : "",
683*48a54d36SAndroid Build Coastguard Worker 			inLineNumber,
684*48a54d36SAndroid Build Coastguard Worker 			inFunction ? inFunction : "" );
685*48a54d36SAndroid Build Coastguard Worker 	}
686*48a54d36SAndroid Build Coastguard Worker 	else
687*48a54d36SAndroid Build Coastguard Worker 	{
688*48a54d36SAndroid Build Coastguard Worker 		DebugPrintF(
689*48a54d36SAndroid Build Coastguard Worker 			kDebugLevelAssert,
690*48a54d36SAndroid Build Coastguard Worker 			"\n"
691*48a54d36SAndroid Build Coastguard Worker 			"[ASSERT] assert: \"%s\" %s\n"
692*48a54d36SAndroid Build Coastguard Worker 			"[ASSERT] where:  \"%s\", line %ld, \"%s\"\n"
693*48a54d36SAndroid Build Coastguard Worker 			"\n",
694*48a54d36SAndroid Build Coastguard Worker 			inAssertString ? inAssertString : "",
695*48a54d36SAndroid Build Coastguard Worker 			inMessage ? inMessage : "",
696*48a54d36SAndroid Build Coastguard Worker 			inFilename ? inFilename : "",
697*48a54d36SAndroid Build Coastguard Worker 			inLineNumber,
698*48a54d36SAndroid Build Coastguard Worker 			inFunction ? inFunction : "" );
699*48a54d36SAndroid Build Coastguard Worker 	}
700*48a54d36SAndroid Build Coastguard Worker 
701*48a54d36SAndroid Build Coastguard Worker 	// Break into the debugger if enabled.
702*48a54d36SAndroid Build Coastguard Worker 
703*48a54d36SAndroid Build Coastguard Worker 	#if( TARGET_OS_WIN32 )
704*48a54d36SAndroid Build Coastguard Worker 		if( gDebugBreakLevel <= kDebugLevelAssert )
705*48a54d36SAndroid Build Coastguard Worker 		{
706*48a54d36SAndroid Build Coastguard Worker 			if( IsDebuggerPresent() )
707*48a54d36SAndroid Build Coastguard Worker 			{
708*48a54d36SAndroid Build Coastguard Worker 				DebugBreak();
709*48a54d36SAndroid Build Coastguard Worker 			}
710*48a54d36SAndroid Build Coastguard Worker 		}
711*48a54d36SAndroid Build Coastguard Worker 	#endif
712*48a54d36SAndroid Build Coastguard Worker }
713*48a54d36SAndroid Build Coastguard Worker 
714*48a54d36SAndroid Build Coastguard Worker #if 0
715*48a54d36SAndroid Build Coastguard Worker #pragma mark -
716*48a54d36SAndroid Build Coastguard Worker #endif
717*48a54d36SAndroid Build Coastguard Worker 
718*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_FPRINTF_ENABLED )
719*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
720*48a54d36SAndroid Build Coastguard Worker //	DebugFPrintFInit
721*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
722*48a54d36SAndroid Build Coastguard Worker 
DebugFPrintFInit(DebugOutputTypeFlags inFlags,const char * inFilename)723*48a54d36SAndroid Build Coastguard Worker static OSStatus	DebugFPrintFInit( DebugOutputTypeFlags inFlags, const char *inFilename )
724*48a54d36SAndroid Build Coastguard Worker {
725*48a54d36SAndroid Build Coastguard Worker 	OSStatus					err;
726*48a54d36SAndroid Build Coastguard Worker 	DebugOutputTypeFlags		typeFlags;
727*48a54d36SAndroid Build Coastguard Worker 
728*48a54d36SAndroid Build Coastguard Worker 	typeFlags = inFlags & kDebugOutputTypeFlagsTypeMask;
729*48a54d36SAndroid Build Coastguard Worker 	if( typeFlags == kDebugOutputTypeFlagsStdOut )
730*48a54d36SAndroid Build Coastguard Worker 	{
731*48a54d36SAndroid Build Coastguard Worker 		#if( TARGET_OS_WIN32 )
732*48a54d36SAndroid Build Coastguard Worker 			DebugWinEnableConsole();
733*48a54d36SAndroid Build Coastguard Worker 		#endif
734*48a54d36SAndroid Build Coastguard Worker 
735*48a54d36SAndroid Build Coastguard Worker 		gDebugFPrintFFile = stdout;
736*48a54d36SAndroid Build Coastguard Worker 	}
737*48a54d36SAndroid Build Coastguard Worker 	else if( typeFlags == kDebugOutputTypeFlagsStdErr )
738*48a54d36SAndroid Build Coastguard Worker 	{
739*48a54d36SAndroid Build Coastguard Worker 		#if( TARGET_OS_WIN32 )
740*48a54d36SAndroid Build Coastguard Worker 			DebugWinEnableConsole();
741*48a54d36SAndroid Build Coastguard Worker 		#endif
742*48a54d36SAndroid Build Coastguard Worker 
743*48a54d36SAndroid Build Coastguard Worker 		gDebugFPrintFFile = stdout;
744*48a54d36SAndroid Build Coastguard Worker 	}
745*48a54d36SAndroid Build Coastguard Worker 	else if( typeFlags == kDebugOutputTypeFlagsFile )
746*48a54d36SAndroid Build Coastguard Worker 	{
747*48a54d36SAndroid Build Coastguard Worker 		require_action_quiet( inFilename && ( *inFilename != '\0' ), exit, err = kOpenErr );
748*48a54d36SAndroid Build Coastguard Worker 
749*48a54d36SAndroid Build Coastguard Worker 		gDebugFPrintFFile = fopen( inFilename, "a" );
750*48a54d36SAndroid Build Coastguard Worker 		require_action_quiet( gDebugFPrintFFile, exit, err = kOpenErr );
751*48a54d36SAndroid Build Coastguard Worker 	}
752*48a54d36SAndroid Build Coastguard Worker 	else
753*48a54d36SAndroid Build Coastguard Worker 	{
754*48a54d36SAndroid Build Coastguard Worker 		err = kParamErr;
755*48a54d36SAndroid Build Coastguard Worker 		goto exit;
756*48a54d36SAndroid Build Coastguard Worker 	}
757*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
758*48a54d36SAndroid Build Coastguard Worker 
759*48a54d36SAndroid Build Coastguard Worker exit:
760*48a54d36SAndroid Build Coastguard Worker 	return( err );
761*48a54d36SAndroid Build Coastguard Worker }
762*48a54d36SAndroid Build Coastguard Worker 
763*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
764*48a54d36SAndroid Build Coastguard Worker //	DebugFPrintFPrint
765*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
766*48a54d36SAndroid Build Coastguard Worker 
DebugFPrintFPrint(char * inData,size_t inSize)767*48a54d36SAndroid Build Coastguard Worker static void	DebugFPrintFPrint( char *inData, size_t inSize )
768*48a54d36SAndroid Build Coastguard Worker {
769*48a54d36SAndroid Build Coastguard Worker 	char *		p;
770*48a54d36SAndroid Build Coastguard Worker 	char *		q;
771*48a54d36SAndroid Build Coastguard Worker 
772*48a54d36SAndroid Build Coastguard Worker 	// Convert \r to \n. fprintf will interpret \n and convert to whatever is appropriate for the platform.
773*48a54d36SAndroid Build Coastguard Worker 
774*48a54d36SAndroid Build Coastguard Worker 	p = inData;
775*48a54d36SAndroid Build Coastguard Worker 	q = p + inSize;
776*48a54d36SAndroid Build Coastguard Worker 	while( p < q )
777*48a54d36SAndroid Build Coastguard Worker 	{
778*48a54d36SAndroid Build Coastguard Worker 		if( *p == '\r' )
779*48a54d36SAndroid Build Coastguard Worker 		{
780*48a54d36SAndroid Build Coastguard Worker 			*p = '\n';
781*48a54d36SAndroid Build Coastguard Worker 		}
782*48a54d36SAndroid Build Coastguard Worker 		++p;
783*48a54d36SAndroid Build Coastguard Worker 	}
784*48a54d36SAndroid Build Coastguard Worker 
785*48a54d36SAndroid Build Coastguard Worker 	// Write the data and flush.
786*48a54d36SAndroid Build Coastguard Worker 
787*48a54d36SAndroid Build Coastguard Worker 	if( gDebugFPrintFFile )
788*48a54d36SAndroid Build Coastguard Worker 	{
789*48a54d36SAndroid Build Coastguard Worker 		fprintf( gDebugFPrintFFile, "%.*s", (int) inSize, inData );
790*48a54d36SAndroid Build Coastguard Worker 		fflush( gDebugFPrintFFile );
791*48a54d36SAndroid Build Coastguard Worker 	}
792*48a54d36SAndroid Build Coastguard Worker }
793*48a54d36SAndroid Build Coastguard Worker #endif	// DEBUG_FPRINTF_ENABLED
794*48a54d36SAndroid Build Coastguard Worker 
795*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_IDEBUG_ENABLED )
796*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
797*48a54d36SAndroid Build Coastguard Worker //	DebugiDebugInit
798*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
799*48a54d36SAndroid Build Coastguard Worker 
DebugiDebugInit(void)800*48a54d36SAndroid Build Coastguard Worker static OSStatus	DebugiDebugInit( void )
801*48a54d36SAndroid Build Coastguard Worker {
802*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
803*48a54d36SAndroid Build Coastguard Worker 
804*48a54d36SAndroid Build Coastguard Worker 	#if( TARGET_API_MAC_OSX_KERNEL )
805*48a54d36SAndroid Build Coastguard Worker 
806*48a54d36SAndroid Build Coastguard Worker 		extern uint32_t *		_giDebugReserved1;
807*48a54d36SAndroid Build Coastguard Worker 
808*48a54d36SAndroid Build Coastguard Worker 		// Emulate the iDebugSetOutputType macro in iDebugServices.h.
809*48a54d36SAndroid Build Coastguard Worker 		// Note: This is not thread safe, but neither is iDebugServices.h nor iDebugKext.
810*48a54d36SAndroid Build Coastguard Worker 
811*48a54d36SAndroid Build Coastguard Worker 		if( !_giDebugReserved1 )
812*48a54d36SAndroid Build Coastguard Worker 		{
813*48a54d36SAndroid Build Coastguard Worker 			_giDebugReserved1 = (uint32_t *) IOMalloc( sizeof( uint32_t ) );
814*48a54d36SAndroid Build Coastguard Worker 			require_action_quiet( _giDebugReserved1, exit, err = kNoMemoryErr );
815*48a54d36SAndroid Build Coastguard Worker 		}
816*48a54d36SAndroid Build Coastguard Worker 		*_giDebugReserved1 = 0x00010000U;
817*48a54d36SAndroid Build Coastguard Worker 		err = kNoErr;
818*48a54d36SAndroid Build Coastguard Worker exit:
819*48a54d36SAndroid Build Coastguard Worker 	#else
820*48a54d36SAndroid Build Coastguard Worker 
821*48a54d36SAndroid Build Coastguard Worker 		__private_extern__ void	iDebugSetOutputTypeInternal( uint32_t inType );
822*48a54d36SAndroid Build Coastguard Worker 
823*48a54d36SAndroid Build Coastguard Worker 		iDebugSetOutputTypeInternal( 0x00010000U );
824*48a54d36SAndroid Build Coastguard Worker 		err = kNoErr;
825*48a54d36SAndroid Build Coastguard Worker 
826*48a54d36SAndroid Build Coastguard Worker 	#endif
827*48a54d36SAndroid Build Coastguard Worker 
828*48a54d36SAndroid Build Coastguard Worker 	return( err );
829*48a54d36SAndroid Build Coastguard Worker }
830*48a54d36SAndroid Build Coastguard Worker 
831*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
832*48a54d36SAndroid Build Coastguard Worker //	DebugiDebugPrint
833*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
834*48a54d36SAndroid Build Coastguard Worker 
DebugiDebugPrint(char * inData,size_t inSize)835*48a54d36SAndroid Build Coastguard Worker static void	DebugiDebugPrint( char *inData, size_t inSize )
836*48a54d36SAndroid Build Coastguard Worker {
837*48a54d36SAndroid Build Coastguard Worker 	#if( TARGET_API_MAC_OSX_KERNEL )
838*48a54d36SAndroid Build Coastguard Worker 
839*48a54d36SAndroid Build Coastguard Worker 		// Locally declared here so we do not need to include iDebugKext.h.
840*48a54d36SAndroid Build Coastguard Worker 		// Note: IOKit uses a global namespace for all code and only a partial link occurs at build time. When the
841*48a54d36SAndroid Build Coastguard Worker 		// KEXT is loaded, the runtime linker will link in this extern'd symbol (assuming iDebug is present).
842*48a54d36SAndroid Build Coastguard Worker 		// _giDebugLogInternal is actually part of IOKit proper so this should link even if iDebug is not present.
843*48a54d36SAndroid Build Coastguard Worker 
844*48a54d36SAndroid Build Coastguard Worker 		typedef void ( *iDebugLogFunctionPtr )( uint32_t inLevel, uint32_t inTag, const char *inFormat, ... );
845*48a54d36SAndroid Build Coastguard Worker 
846*48a54d36SAndroid Build Coastguard Worker 		extern iDebugLogFunctionPtr		_giDebugLogInternal;
847*48a54d36SAndroid Build Coastguard Worker 
848*48a54d36SAndroid Build Coastguard Worker 		if( _giDebugLogInternal )
849*48a54d36SAndroid Build Coastguard Worker 		{
850*48a54d36SAndroid Build Coastguard Worker 			_giDebugLogInternal( 0, 0, "%.*s", (int) inSize, inData );
851*48a54d36SAndroid Build Coastguard Worker 		}
852*48a54d36SAndroid Build Coastguard Worker 
853*48a54d36SAndroid Build Coastguard Worker 	#else
854*48a54d36SAndroid Build Coastguard Worker 
855*48a54d36SAndroid Build Coastguard Worker 		__private_extern__ void	iDebugLogInternal( uint32_t inLevel, uint32_t inTag, const char *inFormat, ... );
856*48a54d36SAndroid Build Coastguard Worker 
857*48a54d36SAndroid Build Coastguard Worker 		iDebugLogInternal( 0, 0, "%.*s", (int) inSize, inData );
858*48a54d36SAndroid Build Coastguard Worker 
859*48a54d36SAndroid Build Coastguard Worker 	#endif
860*48a54d36SAndroid Build Coastguard Worker }
861*48a54d36SAndroid Build Coastguard Worker #endif
862*48a54d36SAndroid Build Coastguard Worker 
863*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_KPRINTF_ENABLED )
864*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
865*48a54d36SAndroid Build Coastguard Worker //	DebugKPrintFPrint
866*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
867*48a54d36SAndroid Build Coastguard Worker 
DebugKPrintFPrint(char * inData,size_t inSize)868*48a54d36SAndroid Build Coastguard Worker static void	DebugKPrintFPrint( char *inData, size_t inSize )
869*48a54d36SAndroid Build Coastguard Worker {
870*48a54d36SAndroid Build Coastguard Worker 	extern void	kprintf( const char *inFormat, ... );
871*48a54d36SAndroid Build Coastguard Worker 
872*48a54d36SAndroid Build Coastguard Worker 	kprintf( "%.*s", (int) inSize, inData );
873*48a54d36SAndroid Build Coastguard Worker }
874*48a54d36SAndroid Build Coastguard Worker #endif
875*48a54d36SAndroid Build Coastguard Worker 
876*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_MAC_OS_X_IOLOG_ENABLED )
877*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
878*48a54d36SAndroid Build Coastguard Worker //	DebugMacOSXIOLogPrint
879*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
880*48a54d36SAndroid Build Coastguard Worker 
DebugMacOSXIOLogPrint(char * inData,size_t inSize)881*48a54d36SAndroid Build Coastguard Worker static void	DebugMacOSXIOLogPrint( char *inData, size_t inSize )
882*48a54d36SAndroid Build Coastguard Worker {
883*48a54d36SAndroid Build Coastguard Worker 	extern void	IOLog( const char *inFormat, ... );
884*48a54d36SAndroid Build Coastguard Worker 
885*48a54d36SAndroid Build Coastguard Worker 	IOLog( "%.*s", (int) inSize, inData );
886*48a54d36SAndroid Build Coastguard Worker }
887*48a54d36SAndroid Build Coastguard Worker #endif
888*48a54d36SAndroid Build Coastguard Worker 
889*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_MAC )
890*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
891*48a54d36SAndroid Build Coastguard Worker //	DebugMacOSXLogInit
892*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
893*48a54d36SAndroid Build Coastguard Worker 
DebugMacOSXLogInit(void)894*48a54d36SAndroid Build Coastguard Worker static OSStatus	DebugMacOSXLogInit( void )
895*48a54d36SAndroid Build Coastguard Worker {
896*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
897*48a54d36SAndroid Build Coastguard Worker 	CFStringRef		path;
898*48a54d36SAndroid Build Coastguard Worker 	CFURLRef		url;
899*48a54d36SAndroid Build Coastguard Worker 	CFBundleRef		bundle;
900*48a54d36SAndroid Build Coastguard Worker 	CFStringRef		functionName;
901*48a54d36SAndroid Build Coastguard Worker 	void *			functionPtr;
902*48a54d36SAndroid Build Coastguard Worker 
903*48a54d36SAndroid Build Coastguard Worker 	bundle = NULL;
904*48a54d36SAndroid Build Coastguard Worker 
905*48a54d36SAndroid Build Coastguard Worker 	// Create a bundle reference for System.framework.
906*48a54d36SAndroid Build Coastguard Worker 
907*48a54d36SAndroid Build Coastguard Worker 	path = CFSTR( "/System/Library/Frameworks/System.framework" );
908*48a54d36SAndroid Build Coastguard Worker 	url = CFURLCreateWithFileSystemPath( NULL, path, kCFURLPOSIXPathStyle, true );
909*48a54d36SAndroid Build Coastguard Worker 	require_action_quiet( url, exit, err = memFullErr );
910*48a54d36SAndroid Build Coastguard Worker 
911*48a54d36SAndroid Build Coastguard Worker 	bundle = CFBundleCreate( NULL, url );
912*48a54d36SAndroid Build Coastguard Worker 	CFRelease( url );
913*48a54d36SAndroid Build Coastguard Worker 	require_action_quiet( bundle, exit, err = memFullErr );
914*48a54d36SAndroid Build Coastguard Worker 
915*48a54d36SAndroid Build Coastguard Worker 	// Get a ptr to the system's "printf" function from System.framework.
916*48a54d36SAndroid Build Coastguard Worker 
917*48a54d36SAndroid Build Coastguard Worker 	functionName = CFSTR( "printf" );
918*48a54d36SAndroid Build Coastguard Worker 	functionPtr = CFBundleGetFunctionPointerForName( bundle, functionName );
919*48a54d36SAndroid Build Coastguard Worker 	require_action_quiet( functionPtr, exit, err = memFullErr );
920*48a54d36SAndroid Build Coastguard Worker 
921*48a54d36SAndroid Build Coastguard Worker 	// Success! Note: The bundle cannot be released because it would invalidate the function ptr.
922*48a54d36SAndroid Build Coastguard Worker 
923*48a54d36SAndroid Build Coastguard Worker 	gDebugMacOSXLogFunction = (DebugMacOSXLogFunctionPtr) functionPtr;
924*48a54d36SAndroid Build Coastguard Worker 	bundle = NULL;
925*48a54d36SAndroid Build Coastguard Worker 	err = noErr;
926*48a54d36SAndroid Build Coastguard Worker 
927*48a54d36SAndroid Build Coastguard Worker exit:
928*48a54d36SAndroid Build Coastguard Worker 	if( bundle )
929*48a54d36SAndroid Build Coastguard Worker 	{
930*48a54d36SAndroid Build Coastguard Worker 		CFRelease( bundle );
931*48a54d36SAndroid Build Coastguard Worker 	}
932*48a54d36SAndroid Build Coastguard Worker 	return( err );
933*48a54d36SAndroid Build Coastguard Worker }
934*48a54d36SAndroid Build Coastguard Worker 
935*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
936*48a54d36SAndroid Build Coastguard Worker //	DebugMacOSXLogPrint
937*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
938*48a54d36SAndroid Build Coastguard Worker 
DebugMacOSXLogPrint(char * inData,size_t inSize)939*48a54d36SAndroid Build Coastguard Worker static void	DebugMacOSXLogPrint( char *inData, size_t inSize )
940*48a54d36SAndroid Build Coastguard Worker {
941*48a54d36SAndroid Build Coastguard Worker 	if( gDebugMacOSXLogFunction )
942*48a54d36SAndroid Build Coastguard Worker 	{
943*48a54d36SAndroid Build Coastguard Worker 		gDebugMacOSXLogFunction( "%.*s", (int) inSize, inData );
944*48a54d36SAndroid Build Coastguard Worker 	}
945*48a54d36SAndroid Build Coastguard Worker }
946*48a54d36SAndroid Build Coastguard Worker #endif
947*48a54d36SAndroid Build Coastguard Worker 
948*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
949*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
950*48a54d36SAndroid Build Coastguard Worker //	DebugWindowsDebuggerPrint
951*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
952*48a54d36SAndroid Build Coastguard Worker 
DebugWindowsDebuggerPrint(char * inData,size_t inSize)953*48a54d36SAndroid Build Coastguard Worker void	DebugWindowsDebuggerPrint( char *inData, size_t inSize )
954*48a54d36SAndroid Build Coastguard Worker {
955*48a54d36SAndroid Build Coastguard Worker 	TCHAR				buffer[ 512 ];
956*48a54d36SAndroid Build Coastguard Worker 	const char *		src;
957*48a54d36SAndroid Build Coastguard Worker 	const char *		end;
958*48a54d36SAndroid Build Coastguard Worker 	TCHAR *				dst;
959*48a54d36SAndroid Build Coastguard Worker 	char				c;
960*48a54d36SAndroid Build Coastguard Worker 
961*48a54d36SAndroid Build Coastguard Worker 	// Copy locally and null terminate the string. This also converts from char to TCHAR in case we are
962*48a54d36SAndroid Build Coastguard Worker 	// building with UNICODE enabled since the input is always char. Also convert \r to \n in the process.
963*48a54d36SAndroid Build Coastguard Worker 
964*48a54d36SAndroid Build Coastguard Worker 	src = inData;
965*48a54d36SAndroid Build Coastguard Worker 	if( inSize >= sizeof_array( buffer ) )
966*48a54d36SAndroid Build Coastguard Worker 	{
967*48a54d36SAndroid Build Coastguard Worker 		inSize = sizeof_array( buffer ) - 1;
968*48a54d36SAndroid Build Coastguard Worker 	}
969*48a54d36SAndroid Build Coastguard Worker 	end = src + inSize;
970*48a54d36SAndroid Build Coastguard Worker 	dst = buffer;
971*48a54d36SAndroid Build Coastguard Worker 	while( src < end )
972*48a54d36SAndroid Build Coastguard Worker 	{
973*48a54d36SAndroid Build Coastguard Worker 		c = *src++;
974*48a54d36SAndroid Build Coastguard Worker 		if( c == '\r' )
975*48a54d36SAndroid Build Coastguard Worker 		{
976*48a54d36SAndroid Build Coastguard Worker 			c = '\n';
977*48a54d36SAndroid Build Coastguard Worker 		}
978*48a54d36SAndroid Build Coastguard Worker 		*dst++ = (TCHAR) c;
979*48a54d36SAndroid Build Coastguard Worker 	}
980*48a54d36SAndroid Build Coastguard Worker 	*dst = 0;
981*48a54d36SAndroid Build Coastguard Worker 
982*48a54d36SAndroid Build Coastguard Worker 	// Print out the string to the debugger.
983*48a54d36SAndroid Build Coastguard Worker 
984*48a54d36SAndroid Build Coastguard Worker 	OutputDebugString( buffer );
985*48a54d36SAndroid Build Coastguard Worker }
986*48a54d36SAndroid Build Coastguard Worker #endif
987*48a54d36SAndroid Build Coastguard Worker 
988*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
989*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
990*48a54d36SAndroid Build Coastguard Worker //	DebugWindowsEventLogInit
991*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
992*48a54d36SAndroid Build Coastguard Worker 
DebugWindowsEventLogInit(const char * inName,HMODULE inModule)993*48a54d36SAndroid Build Coastguard Worker static OSStatus	DebugWindowsEventLogInit( const char *inName, HMODULE inModule )
994*48a54d36SAndroid Build Coastguard Worker {
995*48a54d36SAndroid Build Coastguard Worker 	OSStatus			err;
996*48a54d36SAndroid Build Coastguard Worker 	HKEY				key;
997*48a54d36SAndroid Build Coastguard Worker 	TCHAR				name[ 128 ];
998*48a54d36SAndroid Build Coastguard Worker 	const char *		src;
999*48a54d36SAndroid Build Coastguard Worker 	TCHAR				path[ MAX_PATH ];
1000*48a54d36SAndroid Build Coastguard Worker 	size_t				size;
1001*48a54d36SAndroid Build Coastguard Worker 	DWORD				typesSupported;
1002*48a54d36SAndroid Build Coastguard Worker 	DWORD 				n;
1003*48a54d36SAndroid Build Coastguard Worker 
1004*48a54d36SAndroid Build Coastguard Worker 	key = NULL;
1005*48a54d36SAndroid Build Coastguard Worker 
1006*48a54d36SAndroid Build Coastguard Worker 	// Use a default name if needed then convert the name to TCHARs so it works on ANSI or Unicode builds.
1007*48a54d36SAndroid Build Coastguard Worker 
1008*48a54d36SAndroid Build Coastguard Worker 	if( !inName || ( *inName == '\0' ) )
1009*48a54d36SAndroid Build Coastguard Worker 	{
1010*48a54d36SAndroid Build Coastguard Worker 		inName = "DefaultApp";
1011*48a54d36SAndroid Build Coastguard Worker 	}
1012*48a54d36SAndroid Build Coastguard Worker 	DebugWinCharToTCharString( inName, kSizeCString, name, sizeof( name ), NULL );
1013*48a54d36SAndroid Build Coastguard Worker 
1014*48a54d36SAndroid Build Coastguard Worker 	// Build the path string using the fixed registry path and app name.
1015*48a54d36SAndroid Build Coastguard Worker 
1016*48a54d36SAndroid Build Coastguard Worker 	src = "SYSTEM\\CurrentControlSet\\Services\\EventLog\\Application\\";
1017*48a54d36SAndroid Build Coastguard Worker 	DebugWinCharToTCharString( src, kSizeCString, path, sizeof_array( path ), &size );
1018*48a54d36SAndroid Build Coastguard Worker 	DebugWinCharToTCharString( inName, kSizeCString, path + size, sizeof_array( path ) - size, NULL );
1019*48a54d36SAndroid Build Coastguard Worker 
1020*48a54d36SAndroid Build Coastguard Worker 	// Add/Open the source name as a sub-key under the Application key in the EventLog registry key.
1021*48a54d36SAndroid Build Coastguard Worker 
1022*48a54d36SAndroid Build Coastguard Worker 	err = RegCreateKeyEx( HKEY_LOCAL_MACHINE, path, 0, NULL, REG_OPTION_NON_VOLATILE, KEY_ALL_ACCESS, NULL, &key, NULL );
1023*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
1024*48a54d36SAndroid Build Coastguard Worker 
1025*48a54d36SAndroid Build Coastguard Worker 	// Set the path in the EventMessageFile subkey. Add 1 to the TCHAR count to include the null terminator.
1026*48a54d36SAndroid Build Coastguard Worker 
1027*48a54d36SAndroid Build Coastguard Worker 	n = GetModuleFileName( inModule, path, sizeof_array( path ) );
1028*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( n > 0, (OSStatus) GetLastError(), kParamErr );
1029*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
1030*48a54d36SAndroid Build Coastguard Worker 	n += 1;
1031*48a54d36SAndroid Build Coastguard Worker 	n *= sizeof( TCHAR );
1032*48a54d36SAndroid Build Coastguard Worker 
1033*48a54d36SAndroid Build Coastguard Worker 	err = RegSetValueEx( key, TEXT( "EventMessageFile" ), 0, REG_EXPAND_SZ, (const LPBYTE) path, n );
1034*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
1035*48a54d36SAndroid Build Coastguard Worker 
1036*48a54d36SAndroid Build Coastguard Worker 	// Set the supported event types in the TypesSupported subkey.
1037*48a54d36SAndroid Build Coastguard Worker 
1038*48a54d36SAndroid Build Coastguard Worker 	typesSupported = EVENTLOG_SUCCESS | EVENTLOG_ERROR_TYPE | EVENTLOG_WARNING_TYPE | EVENTLOG_INFORMATION_TYPE |
1039*48a54d36SAndroid Build Coastguard Worker 					 EVENTLOG_AUDIT_SUCCESS | EVENTLOG_AUDIT_FAILURE;
1040*48a54d36SAndroid Build Coastguard Worker 	err = RegSetValueEx( key, TEXT( "TypesSupported" ), 0, REG_DWORD, (const LPBYTE) &typesSupported, sizeof( DWORD ) );
1041*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
1042*48a54d36SAndroid Build Coastguard Worker 
1043*48a54d36SAndroid Build Coastguard Worker 	// Set up the event source.
1044*48a54d36SAndroid Build Coastguard Worker 
1045*48a54d36SAndroid Build Coastguard Worker 	gDebugWindowsEventLogEventSource = RegisterEventSource( NULL, name );
1046*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( gDebugWindowsEventLogEventSource, (OSStatus) GetLastError(), kParamErr );
1047*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
1048*48a54d36SAndroid Build Coastguard Worker 
1049*48a54d36SAndroid Build Coastguard Worker exit:
1050*48a54d36SAndroid Build Coastguard Worker 	if( key )
1051*48a54d36SAndroid Build Coastguard Worker 	{
1052*48a54d36SAndroid Build Coastguard Worker 		RegCloseKey( key );
1053*48a54d36SAndroid Build Coastguard Worker 	}
1054*48a54d36SAndroid Build Coastguard Worker 	return( err );
1055*48a54d36SAndroid Build Coastguard Worker }
1056*48a54d36SAndroid Build Coastguard Worker 
1057*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1058*48a54d36SAndroid Build Coastguard Worker //	DebugWindowsEventLogPrint
1059*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1060*48a54d36SAndroid Build Coastguard Worker 
DebugWindowsEventLogPrint(DebugLevel inLevel,char * inData,size_t inSize)1061*48a54d36SAndroid Build Coastguard Worker static void	DebugWindowsEventLogPrint( DebugLevel inLevel, char *inData, size_t inSize )
1062*48a54d36SAndroid Build Coastguard Worker {
1063*48a54d36SAndroid Build Coastguard Worker 	WORD				type;
1064*48a54d36SAndroid Build Coastguard Worker 	TCHAR				buffer[ 512 ];
1065*48a54d36SAndroid Build Coastguard Worker 	const char *		src;
1066*48a54d36SAndroid Build Coastguard Worker 	const char *		end;
1067*48a54d36SAndroid Build Coastguard Worker 	TCHAR *				dst;
1068*48a54d36SAndroid Build Coastguard Worker 	char				c;
1069*48a54d36SAndroid Build Coastguard Worker 	const TCHAR *		array[ 1 ];
1070*48a54d36SAndroid Build Coastguard Worker 
1071*48a54d36SAndroid Build Coastguard Worker 	// Map the debug level to a Windows EventLog type.
1072*48a54d36SAndroid Build Coastguard Worker 
1073*48a54d36SAndroid Build Coastguard Worker 	if( inLevel <= kDebugLevelNotice )
1074*48a54d36SAndroid Build Coastguard Worker 	{
1075*48a54d36SAndroid Build Coastguard Worker 		type = EVENTLOG_INFORMATION_TYPE;
1076*48a54d36SAndroid Build Coastguard Worker 	}
1077*48a54d36SAndroid Build Coastguard Worker 	else if( inLevel <= kDebugLevelWarning )
1078*48a54d36SAndroid Build Coastguard Worker 	{
1079*48a54d36SAndroid Build Coastguard Worker 		type = EVENTLOG_WARNING_TYPE;
1080*48a54d36SAndroid Build Coastguard Worker 	}
1081*48a54d36SAndroid Build Coastguard Worker 	else
1082*48a54d36SAndroid Build Coastguard Worker 	{
1083*48a54d36SAndroid Build Coastguard Worker 		type = EVENTLOG_ERROR_TYPE;
1084*48a54d36SAndroid Build Coastguard Worker 	}
1085*48a54d36SAndroid Build Coastguard Worker 
1086*48a54d36SAndroid Build Coastguard Worker 	// Copy locally and null terminate the string. This also converts from char to TCHAR in case we are
1087*48a54d36SAndroid Build Coastguard Worker 	// building with UNICODE enabled since the input is always char. Also convert \r to \n in the process.
1088*48a54d36SAndroid Build Coastguard Worker 
1089*48a54d36SAndroid Build Coastguard Worker 	src = inData;
1090*48a54d36SAndroid Build Coastguard Worker 	if( inSize >= sizeof_array( buffer ) )
1091*48a54d36SAndroid Build Coastguard Worker 	{
1092*48a54d36SAndroid Build Coastguard Worker 		inSize = sizeof_array( buffer ) - 1;
1093*48a54d36SAndroid Build Coastguard Worker 	}
1094*48a54d36SAndroid Build Coastguard Worker 	end = src + inSize;
1095*48a54d36SAndroid Build Coastguard Worker 	dst = buffer;
1096*48a54d36SAndroid Build Coastguard Worker 	while( src < end )
1097*48a54d36SAndroid Build Coastguard Worker 	{
1098*48a54d36SAndroid Build Coastguard Worker 		c = *src++;
1099*48a54d36SAndroid Build Coastguard Worker 		if( c == '\r' )
1100*48a54d36SAndroid Build Coastguard Worker 		{
1101*48a54d36SAndroid Build Coastguard Worker 			c = '\n';
1102*48a54d36SAndroid Build Coastguard Worker 		}
1103*48a54d36SAndroid Build Coastguard Worker 		*dst++ = (TCHAR) c;
1104*48a54d36SAndroid Build Coastguard Worker 	}
1105*48a54d36SAndroid Build Coastguard Worker 	*dst = 0;
1106*48a54d36SAndroid Build Coastguard Worker 
1107*48a54d36SAndroid Build Coastguard Worker 	// Add the the string to the event log.
1108*48a54d36SAndroid Build Coastguard Worker 
1109*48a54d36SAndroid Build Coastguard Worker 	array[ 0 ] = buffer;
1110*48a54d36SAndroid Build Coastguard Worker 	if( gDebugWindowsEventLogEventSource )
1111*48a54d36SAndroid Build Coastguard Worker 	{
1112*48a54d36SAndroid Build Coastguard Worker 		ReportEvent( gDebugWindowsEventLogEventSource, type, 0, 0x20000001L, NULL, 1, 0, array, NULL );
1113*48a54d36SAndroid Build Coastguard Worker 	}
1114*48a54d36SAndroid Build Coastguard Worker }
1115*48a54d36SAndroid Build Coastguard Worker #endif	// TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE
1116*48a54d36SAndroid Build Coastguard Worker 
1117*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_CORE_SERVICE_ASSERTS_ENABLED )
1118*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1119*48a54d36SAndroid Build Coastguard Worker //	DebugAssertOutputHandler
1120*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1121*48a54d36SAndroid Build Coastguard Worker 
1122*48a54d36SAndroid Build Coastguard Worker static pascal void
DebugAssertOutputHandler(OSType inComponentSignature,UInt32 inOptions,const char * inAssertString,const char * inExceptionString,const char * inErrorString,const char * inFileName,long inLineNumber,void * inValue,ConstStr255Param inOutputMsg)1123*48a54d36SAndroid Build Coastguard Worker 	DebugAssertOutputHandler(
1124*48a54d36SAndroid Build Coastguard Worker 		OSType 				inComponentSignature,
1125*48a54d36SAndroid Build Coastguard Worker 		UInt32 				inOptions,
1126*48a54d36SAndroid Build Coastguard Worker 		const char *		inAssertString,
1127*48a54d36SAndroid Build Coastguard Worker 		const char *		inExceptionString,
1128*48a54d36SAndroid Build Coastguard Worker 		const char *		inErrorString,
1129*48a54d36SAndroid Build Coastguard Worker 		const char *		inFileName,
1130*48a54d36SAndroid Build Coastguard Worker 		long 				inLineNumber,
1131*48a54d36SAndroid Build Coastguard Worker 		void *				inValue,
1132*48a54d36SAndroid Build Coastguard Worker 		ConstStr255Param 	inOutputMsg )
1133*48a54d36SAndroid Build Coastguard Worker {
1134*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inComponentSignature );
1135*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inOptions );
1136*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inExceptionString );
1137*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inValue );
1138*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inOutputMsg );
1139*48a54d36SAndroid Build Coastguard Worker 
1140*48a54d36SAndroid Build Coastguard Worker 	DebugPrintAssert( 0, inAssertString, inErrorString, inFileName, (int_least32_t) inLineNumber, "" );
1141*48a54d36SAndroid Build Coastguard Worker }
1142*48a54d36SAndroid Build Coastguard Worker #endif
1143*48a54d36SAndroid Build Coastguard Worker 
1144*48a54d36SAndroid Build Coastguard Worker #if 0
1145*48a54d36SAndroid Build Coastguard Worker #pragma mark -
1146*48a54d36SAndroid Build Coastguard Worker #pragma mark == Utilities ==
1147*48a54d36SAndroid Build Coastguard Worker #endif
1148*48a54d36SAndroid Build Coastguard Worker 
1149*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1150*48a54d36SAndroid Build Coastguard Worker //	DebugSNPrintF
1151*48a54d36SAndroid Build Coastguard Worker //
1152*48a54d36SAndroid Build Coastguard Worker //	Stolen from mDNS.c's mDNS_snprintf/mDNS_vsnprintf with the following changes:
1153*48a54d36SAndroid Build Coastguard Worker //
1154*48a54d36SAndroid Build Coastguard Worker //	Changed names to avoid name collisions with the mDNS versions.
1155*48a54d36SAndroid Build Coastguard Worker //	Changed types to standard C types since mDNSEmbeddedAPI.h may not be available.
1156*48a54d36SAndroid Build Coastguard Worker //	Conditionalized mDNS stuff so it can be used with or with mDNSEmbeddedAPI.h.
1157*48a54d36SAndroid Build Coastguard Worker //	Added 64-bit support for %d (%lld), %i (%lli), %u (%llu), %o (%llo), %x (%llx), and %b (%llb).
1158*48a54d36SAndroid Build Coastguard Worker //	Added %@   - Cocoa/CoreFoundation object. Param is the object. Strings are used directly. Others use CFCopyDescription.
1159*48a54d36SAndroid Build Coastguard Worker //	Added %.8a - FIbre Channel address. Arg=ptr to address.
1160*48a54d36SAndroid Build Coastguard Worker //	Added %##a - IPv4 (if AF_INET defined) or IPv6 (if AF_INET6 defined) sockaddr. Arg=ptr to sockaddr.
1161*48a54d36SAndroid Build Coastguard Worker //	Added %b   - Binary representation of integer (e.g. 01101011). Modifiers and arg=the same as %d, %x, etc.
1162*48a54d36SAndroid Build Coastguard Worker //	Added %C   - Mac-style FourCharCode (e.g. 'APPL'). Arg=32-bit value to print as a Mac-style FourCharCode.
1163*48a54d36SAndroid Build Coastguard Worker //	Added %H   - Hex Dump (e.g. "\x6b\xa7" -> "6B A7"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
1164*48a54d36SAndroid Build Coastguard Worker //	Added %#H  - Hex Dump & ASCII (e.g. "\x41\x62" -> "6B A7 'Ab'"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size.
1165*48a54d36SAndroid Build Coastguard Worker //	Added %m   - Error Message (e.g. 0 -> "kNoErr"). Modifiers and error code args are the same as %d, %x, etc.
1166*48a54d36SAndroid Build Coastguard Worker //	Added %S   - UTF-16 string. Host order if no BOM. Precision is UTF-16 char count. BOM counts in any precision. Arg=ptr.
1167*48a54d36SAndroid Build Coastguard Worker //	Added %#S  - Big Endian UTF-16 string (unless BOM overrides). Otherwise the same as %S.
1168*48a54d36SAndroid Build Coastguard Worker //	Added %##S - Little Endian UTF-16 string (unless BOM overrides). Otherwise the same as %S.
1169*48a54d36SAndroid Build Coastguard Worker //	Added %U   - Universally Unique Identifier (UUID) (e.g. 6ba7b810-9dad-11d1-80b4-00c04fd430c8). Arg=ptr to 16-byte UUID.
1170*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1171*48a54d36SAndroid Build Coastguard Worker 
DebugSNPrintF(char * sbuffer,size_t buflen,const char * fmt,...)1172*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t DebugSNPrintF(char *sbuffer, size_t buflen, const char *fmt, ...)
1173*48a54d36SAndroid Build Coastguard Worker 	{
1174*48a54d36SAndroid Build Coastguard Worker 	size_t length;
1175*48a54d36SAndroid Build Coastguard Worker 
1176*48a54d36SAndroid Build Coastguard Worker 	va_list ptr;
1177*48a54d36SAndroid Build Coastguard Worker 	va_start(ptr,fmt);
1178*48a54d36SAndroid Build Coastguard Worker 	length = DebugSNPrintFVAList(sbuffer, buflen, fmt, ptr);
1179*48a54d36SAndroid Build Coastguard Worker 	va_end(ptr);
1180*48a54d36SAndroid Build Coastguard Worker 
1181*48a54d36SAndroid Build Coastguard Worker 	return(length);
1182*48a54d36SAndroid Build Coastguard Worker 	}
1183*48a54d36SAndroid Build Coastguard Worker 
1184*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1185*48a54d36SAndroid Build Coastguard Worker //	DebugSNPrintFVAList	- va_list version of DebugSNPrintF. See DebugSNPrintF for more info.
1186*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1187*48a54d36SAndroid Build Coastguard Worker 
DebugSNPrintFVAList(char * sbuffer,size_t buflen,const char * fmt,va_list arg)1188*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t DebugSNPrintFVAList(char *sbuffer, size_t buflen, const char *fmt, va_list arg)
1189*48a54d36SAndroid Build Coastguard Worker 	{
1190*48a54d36SAndroid Build Coastguard Worker 	static const struct DebugSNPrintF_format
1191*48a54d36SAndroid Build Coastguard Worker 		{
1192*48a54d36SAndroid Build Coastguard Worker 		unsigned      leftJustify : 1;
1193*48a54d36SAndroid Build Coastguard Worker 		unsigned      forceSign : 1;
1194*48a54d36SAndroid Build Coastguard Worker 		unsigned      zeroPad : 1;
1195*48a54d36SAndroid Build Coastguard Worker 		unsigned      havePrecision : 1;
1196*48a54d36SAndroid Build Coastguard Worker 		unsigned      hSize : 1;
1197*48a54d36SAndroid Build Coastguard Worker 		char          lSize;
1198*48a54d36SAndroid Build Coastguard Worker 		char          altForm;
1199*48a54d36SAndroid Build Coastguard Worker 		char          sign;		// +, - or space
1200*48a54d36SAndroid Build Coastguard Worker 		unsigned int  fieldWidth;
1201*48a54d36SAndroid Build Coastguard Worker 		unsigned int  precision;
1202*48a54d36SAndroid Build Coastguard Worker 		} DebugSNPrintF_format_default = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1203*48a54d36SAndroid Build Coastguard Worker 
1204*48a54d36SAndroid Build Coastguard Worker 	size_t nwritten = 0;
1205*48a54d36SAndroid Build Coastguard Worker 	int c;
1206*48a54d36SAndroid Build Coastguard Worker 	if (buflen == 0) return(0);
1207*48a54d36SAndroid Build Coastguard Worker 	buflen--;		// Pre-reserve one space in the buffer for the terminating nul
1208*48a54d36SAndroid Build Coastguard Worker 	if (buflen == 0) goto exit;
1209*48a54d36SAndroid Build Coastguard Worker 
1210*48a54d36SAndroid Build Coastguard Worker 	for (c = *fmt; c != 0; c = *++fmt)
1211*48a54d36SAndroid Build Coastguard Worker 		{
1212*48a54d36SAndroid Build Coastguard Worker 		if (c != '%')
1213*48a54d36SAndroid Build Coastguard Worker 			{
1214*48a54d36SAndroid Build Coastguard Worker 			*sbuffer++ = (char)c;
1215*48a54d36SAndroid Build Coastguard Worker 			if (++nwritten >= buflen) goto exit;
1216*48a54d36SAndroid Build Coastguard Worker 			}
1217*48a54d36SAndroid Build Coastguard Worker 		else
1218*48a54d36SAndroid Build Coastguard Worker 			{
1219*48a54d36SAndroid Build Coastguard Worker 			size_t i=0, j;
1220*48a54d36SAndroid Build Coastguard Worker 			// The mDNS Vsprintf Argument Conversion Buffer is used as a temporary holding area for
1221*48a54d36SAndroid Build Coastguard Worker 			// generating decimal numbers, hexdecimal numbers, IP addresses, domain name strings, etc.
1222*48a54d36SAndroid Build Coastguard Worker 			// The size needs to be enough for a 256-byte domain name plus some error text.
1223*48a54d36SAndroid Build Coastguard Worker 			#define mDNS_VACB_Size 300
1224*48a54d36SAndroid Build Coastguard Worker 			char mDNS_VACB[mDNS_VACB_Size];
1225*48a54d36SAndroid Build Coastguard Worker 			#define mDNS_VACB_Lim (&mDNS_VACB[mDNS_VACB_Size])
1226*48a54d36SAndroid Build Coastguard Worker 			#define mDNS_VACB_Remain(s) ((size_t)(mDNS_VACB_Lim - s))
1227*48a54d36SAndroid Build Coastguard Worker 			char *s = mDNS_VACB_Lim;
1228*48a54d36SAndroid Build Coastguard Worker 			const char *digits = "0123456789ABCDEF";
1229*48a54d36SAndroid Build Coastguard Worker 			struct DebugSNPrintF_format F = DebugSNPrintF_format_default;
1230*48a54d36SAndroid Build Coastguard Worker 
1231*48a54d36SAndroid Build Coastguard Worker 			for(;;)	//  decode flags
1232*48a54d36SAndroid Build Coastguard Worker 				{
1233*48a54d36SAndroid Build Coastguard Worker 				c = *++fmt;
1234*48a54d36SAndroid Build Coastguard Worker 				if      (c == '-') F.leftJustify = 1;
1235*48a54d36SAndroid Build Coastguard Worker 				else if (c == '+') F.forceSign = 1;
1236*48a54d36SAndroid Build Coastguard Worker 				else if (c == ' ') F.sign = ' ';
1237*48a54d36SAndroid Build Coastguard Worker 				else if (c == '#') F.altForm++;
1238*48a54d36SAndroid Build Coastguard Worker 				else if (c == '0') F.zeroPad = 1;
1239*48a54d36SAndroid Build Coastguard Worker 				else break;
1240*48a54d36SAndroid Build Coastguard Worker 				}
1241*48a54d36SAndroid Build Coastguard Worker 
1242*48a54d36SAndroid Build Coastguard Worker 			if (c == '*')	//  decode field width
1243*48a54d36SAndroid Build Coastguard Worker 				{
1244*48a54d36SAndroid Build Coastguard Worker 				int f = va_arg(arg, int);
1245*48a54d36SAndroid Build Coastguard Worker 				if (f < 0) { f = -f; F.leftJustify = 1; }
1246*48a54d36SAndroid Build Coastguard Worker 				F.fieldWidth = (unsigned int)f;
1247*48a54d36SAndroid Build Coastguard Worker 				c = *++fmt;
1248*48a54d36SAndroid Build Coastguard Worker 				}
1249*48a54d36SAndroid Build Coastguard Worker 			else
1250*48a54d36SAndroid Build Coastguard Worker 				{
1251*48a54d36SAndroid Build Coastguard Worker 				for (; c >= '0' && c <= '9'; c = *++fmt)
1252*48a54d36SAndroid Build Coastguard Worker 					F.fieldWidth = (10 * F.fieldWidth) + (c - '0');
1253*48a54d36SAndroid Build Coastguard Worker 				}
1254*48a54d36SAndroid Build Coastguard Worker 
1255*48a54d36SAndroid Build Coastguard Worker 			if (c == '.')	//  decode precision
1256*48a54d36SAndroid Build Coastguard Worker 				{
1257*48a54d36SAndroid Build Coastguard Worker 				if ((c = *++fmt) == '*')
1258*48a54d36SAndroid Build Coastguard Worker 					{ F.precision = va_arg(arg, unsigned int); c = *++fmt; }
1259*48a54d36SAndroid Build Coastguard Worker 				else for (; c >= '0' && c <= '9'; c = *++fmt)
1260*48a54d36SAndroid Build Coastguard Worker 						F.precision = (10 * F.precision) + (c - '0');
1261*48a54d36SAndroid Build Coastguard Worker 				F.havePrecision = 1;
1262*48a54d36SAndroid Build Coastguard Worker 				}
1263*48a54d36SAndroid Build Coastguard Worker 
1264*48a54d36SAndroid Build Coastguard Worker 			if (F.leftJustify) F.zeroPad = 0;
1265*48a54d36SAndroid Build Coastguard Worker 
1266*48a54d36SAndroid Build Coastguard Worker 			conv:
1267*48a54d36SAndroid Build Coastguard Worker 			switch (c)	//  perform appropriate conversion
1268*48a54d36SAndroid Build Coastguard Worker 				{
1269*48a54d36SAndroid Build Coastguard Worker 				#if TYPE_LONGLONG_NATIVE
1270*48a54d36SAndroid Build Coastguard Worker 					unsigned_long_long_compat n;
1271*48a54d36SAndroid Build Coastguard Worker 					unsigned_long_long_compat base;
1272*48a54d36SAndroid Build Coastguard Worker 				#else
1273*48a54d36SAndroid Build Coastguard Worker 					unsigned long n;
1274*48a54d36SAndroid Build Coastguard Worker 					unsigned long base;
1275*48a54d36SAndroid Build Coastguard Worker 				#endif
1276*48a54d36SAndroid Build Coastguard Worker 				case 'h' :	F.hSize = 1; c = *++fmt; goto conv;
1277*48a54d36SAndroid Build Coastguard Worker 				case 'l' :	// fall through
1278*48a54d36SAndroid Build Coastguard Worker 				case 'L' :	F.lSize++; c = *++fmt; goto conv;
1279*48a54d36SAndroid Build Coastguard Worker 				case 'd' :
1280*48a54d36SAndroid Build Coastguard Worker 				case 'i' :	base = 10;
1281*48a54d36SAndroid Build Coastguard Worker 							goto canBeSigned;
1282*48a54d36SAndroid Build Coastguard Worker 				case 'u' :	base = 10;
1283*48a54d36SAndroid Build Coastguard Worker 							goto notSigned;
1284*48a54d36SAndroid Build Coastguard Worker 				case 'o' :	base = 8;
1285*48a54d36SAndroid Build Coastguard Worker 							goto notSigned;
1286*48a54d36SAndroid Build Coastguard Worker 				case 'b' :	base = 2;
1287*48a54d36SAndroid Build Coastguard Worker 							goto notSigned;
1288*48a54d36SAndroid Build Coastguard Worker 				case 'p' :	n = va_arg(arg, uintptr_t);
1289*48a54d36SAndroid Build Coastguard Worker 							F.havePrecision = 1;
1290*48a54d36SAndroid Build Coastguard Worker 							F.precision = (sizeof(uintptr_t) == 4) ? 8 : 16;
1291*48a54d36SAndroid Build Coastguard Worker 							F.sign = 0;
1292*48a54d36SAndroid Build Coastguard Worker 							base = 16;
1293*48a54d36SAndroid Build Coastguard Worker 							c = 'x';
1294*48a54d36SAndroid Build Coastguard Worker 							goto number;
1295*48a54d36SAndroid Build Coastguard Worker 				case 'x' :	digits = "0123456789abcdef";
1296*48a54d36SAndroid Build Coastguard Worker 				case 'X' :	base = 16;
1297*48a54d36SAndroid Build Coastguard Worker 							goto notSigned;
1298*48a54d36SAndroid Build Coastguard Worker 				canBeSigned:
1299*48a54d36SAndroid Build Coastguard Worker 							#if TYPE_LONGLONG_NATIVE
1300*48a54d36SAndroid Build Coastguard Worker 								if (F.lSize == 1) n = (unsigned_long_long_compat)va_arg(arg, long);
1301*48a54d36SAndroid Build Coastguard Worker 								else if (F.lSize == 2) n = (unsigned_long_long_compat)va_arg(arg, long_long_compat);
1302*48a54d36SAndroid Build Coastguard Worker 								else n = (unsigned_long_long_compat)va_arg(arg, int);
1303*48a54d36SAndroid Build Coastguard Worker 							#else
1304*48a54d36SAndroid Build Coastguard Worker 								if (F.lSize == 1) n = (unsigned long)va_arg(arg, long);
1305*48a54d36SAndroid Build Coastguard Worker 								else if (F.lSize == 2) goto exit;
1306*48a54d36SAndroid Build Coastguard Worker 								else n = (unsigned long)va_arg(arg, int);
1307*48a54d36SAndroid Build Coastguard Worker 							#endif
1308*48a54d36SAndroid Build Coastguard Worker 							if (F.hSize) n = (short) n;
1309*48a54d36SAndroid Build Coastguard Worker 							#if TYPE_LONGLONG_NATIVE
1310*48a54d36SAndroid Build Coastguard Worker 								if ((long_long_compat) n < 0) { n = (unsigned_long_long_compat)-(long_long_compat)n; F.sign = '-'; }
1311*48a54d36SAndroid Build Coastguard Worker 							#else
1312*48a54d36SAndroid Build Coastguard Worker 								if ((long) n < 0) { n = (unsigned long)-(long)n; F.sign = '-'; }
1313*48a54d36SAndroid Build Coastguard Worker 							#endif
1314*48a54d36SAndroid Build Coastguard Worker 							else if (F.forceSign) F.sign = '+';
1315*48a54d36SAndroid Build Coastguard Worker 							goto number;
1316*48a54d36SAndroid Build Coastguard Worker 
1317*48a54d36SAndroid Build Coastguard Worker 				notSigned:	if (F.lSize == 1) n = va_arg(arg, unsigned long);
1318*48a54d36SAndroid Build Coastguard Worker 							else if (F.lSize == 2)
1319*48a54d36SAndroid Build Coastguard Worker 								{
1320*48a54d36SAndroid Build Coastguard Worker 								#if TYPE_LONGLONG_NATIVE
1321*48a54d36SAndroid Build Coastguard Worker 									n = va_arg(arg, unsigned_long_long_compat);
1322*48a54d36SAndroid Build Coastguard Worker 								#else
1323*48a54d36SAndroid Build Coastguard Worker 									goto exit;
1324*48a54d36SAndroid Build Coastguard Worker 								#endif
1325*48a54d36SAndroid Build Coastguard Worker 								}
1326*48a54d36SAndroid Build Coastguard Worker 							else n = va_arg(arg, unsigned int);
1327*48a54d36SAndroid Build Coastguard Worker 							if (F.hSize) n = (unsigned short) n;
1328*48a54d36SAndroid Build Coastguard Worker 							F.sign = 0;
1329*48a54d36SAndroid Build Coastguard Worker 							goto number;
1330*48a54d36SAndroid Build Coastguard Worker 
1331*48a54d36SAndroid Build Coastguard Worker 				number:		if (!F.havePrecision)
1332*48a54d36SAndroid Build Coastguard Worker 								{
1333*48a54d36SAndroid Build Coastguard Worker 								if (F.zeroPad)
1334*48a54d36SAndroid Build Coastguard Worker 									{
1335*48a54d36SAndroid Build Coastguard Worker 									F.precision = F.fieldWidth;
1336*48a54d36SAndroid Build Coastguard Worker 									if (F.altForm) F.precision -= 2;
1337*48a54d36SAndroid Build Coastguard Worker 									if (F.sign) --F.precision;
1338*48a54d36SAndroid Build Coastguard Worker 									}
1339*48a54d36SAndroid Build Coastguard Worker 								if (F.precision < 1) F.precision = 1;
1340*48a54d36SAndroid Build Coastguard Worker 								}
1341*48a54d36SAndroid Build Coastguard Worker 							if (F.precision > mDNS_VACB_Size - 1)
1342*48a54d36SAndroid Build Coastguard Worker 								F.precision = mDNS_VACB_Size - 1;
1343*48a54d36SAndroid Build Coastguard Worker 							for (i = 0; n; n /= base, i++) *--s = (char)(digits[n % base]);
1344*48a54d36SAndroid Build Coastguard Worker 							for (; i < F.precision; i++) *--s = '0';
1345*48a54d36SAndroid Build Coastguard Worker 							if (F.altForm) { *--s = (char)c; *--s = '0'; i += 2; }
1346*48a54d36SAndroid Build Coastguard Worker 							if (F.sign) { *--s = F.sign; i++; }
1347*48a54d36SAndroid Build Coastguard Worker 							break;
1348*48a54d36SAndroid Build Coastguard Worker 
1349*48a54d36SAndroid Build Coastguard Worker 				case 'a' :	{
1350*48a54d36SAndroid Build Coastguard Worker 							unsigned char *a = va_arg(arg, unsigned char *);
1351*48a54d36SAndroid Build Coastguard Worker 							char pre[4] = "";
1352*48a54d36SAndroid Build Coastguard Worker 							char post[32] = "";
1353*48a54d36SAndroid Build Coastguard Worker 							if (!a) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
1354*48a54d36SAndroid Build Coastguard Worker 							else
1355*48a54d36SAndroid Build Coastguard Worker 								{
1356*48a54d36SAndroid Build Coastguard Worker 								s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1357*48a54d36SAndroid Build Coastguard Worker 								if (F.altForm == 1)
1358*48a54d36SAndroid Build Coastguard Worker 									{
1359*48a54d36SAndroid Build Coastguard Worker 									#if(defined(MDNS_DEBUGMSGS))
1360*48a54d36SAndroid Build Coastguard Worker 										mDNSAddr *ip = (mDNSAddr*)a;
1361*48a54d36SAndroid Build Coastguard Worker 										switch (ip->type)
1362*48a54d36SAndroid Build Coastguard Worker 											{
1363*48a54d36SAndroid Build Coastguard Worker 											case mDNSAddrType_IPv4: F.precision =  4; a = (unsigned char *)&ip->ip.v4; break;
1364*48a54d36SAndroid Build Coastguard Worker 											case mDNSAddrType_IPv6: F.precision = 16; a = (unsigned char *)&ip->ip.v6; break;
1365*48a54d36SAndroid Build Coastguard Worker 											default:                F.precision =  0; break;
1366*48a54d36SAndroid Build Coastguard Worker 											}
1367*48a54d36SAndroid Build Coastguard Worker 									#else
1368*48a54d36SAndroid Build Coastguard Worker 										F.precision = 0;	// mDNSEmbeddedAPI.h not included so no mDNSAddr support
1369*48a54d36SAndroid Build Coastguard Worker 									#endif
1370*48a54d36SAndroid Build Coastguard Worker 									}
1371*48a54d36SAndroid Build Coastguard Worker 								else if (F.altForm == 2)
1372*48a54d36SAndroid Build Coastguard Worker 									{
1373*48a54d36SAndroid Build Coastguard Worker 									#ifdef AF_INET
1374*48a54d36SAndroid Build Coastguard Worker 										const struct sockaddr *sa;
1375*48a54d36SAndroid Build Coastguard Worker 										unsigned char *port;
1376*48a54d36SAndroid Build Coastguard Worker 										sa = (const struct sockaddr*)a;
1377*48a54d36SAndroid Build Coastguard Worker 										switch (sa->sa_family)
1378*48a54d36SAndroid Build Coastguard Worker 											{
1379*48a54d36SAndroid Build Coastguard Worker 											case AF_INET:  F.precision =  4; a = (unsigned char*)&((const struct sockaddr_in *)a)->sin_addr;
1380*48a54d36SAndroid Build Coastguard Worker 											               port = (unsigned char*)&((const struct sockaddr_in *)sa)->sin_port;
1381*48a54d36SAndroid Build Coastguard Worker 											               DebugSNPrintF(post, sizeof(post), ":%d", (port[0] << 8) | port[1]); break;
1382*48a54d36SAndroid Build Coastguard Worker 											#ifdef AF_INET6
1383*48a54d36SAndroid Build Coastguard Worker 											case AF_INET6: F.precision = 16; a = (unsigned char*)&((const struct sockaddr_in6 *)a)->sin6_addr;
1384*48a54d36SAndroid Build Coastguard Worker 											               pre[0] = '['; pre[1] = '\0';
1385*48a54d36SAndroid Build Coastguard Worker 											               port = (unsigned char*)&((const struct sockaddr_in6 *)sa)->sin6_port;
1386*48a54d36SAndroid Build Coastguard Worker 											               DebugSNPrintF(post, sizeof(post), "%%%d]:%d",
1387*48a54d36SAndroid Build Coastguard Worker 											               		(int)((const struct sockaddr_in6 *)sa)->sin6_scope_id,
1388*48a54d36SAndroid Build Coastguard Worker 											               		(port[0] << 8) | port[1]); break;
1389*48a54d36SAndroid Build Coastguard Worker 											#endif
1390*48a54d36SAndroid Build Coastguard Worker 											default:       F.precision =  0; break;
1391*48a54d36SAndroid Build Coastguard Worker 											}
1392*48a54d36SAndroid Build Coastguard Worker 									#else
1393*48a54d36SAndroid Build Coastguard Worker 										F.precision = 0;	// socket interfaces not included so no sockaddr support
1394*48a54d36SAndroid Build Coastguard Worker 									#endif
1395*48a54d36SAndroid Build Coastguard Worker 									}
1396*48a54d36SAndroid Build Coastguard Worker 								switch (F.precision)
1397*48a54d36SAndroid Build Coastguard Worker 									{
1398*48a54d36SAndroid Build Coastguard Worker 									case  4: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%d.%d.%d.%d%s",
1399*48a54d36SAndroid Build Coastguard Worker 														a[0], a[1], a[2], a[3], post); break;
1400*48a54d36SAndroid Build Coastguard Worker 									case  6: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%02X:%02X:%02X:%02X:%02X:%02X",
1401*48a54d36SAndroid Build Coastguard Worker 														a[0], a[1], a[2], a[3], a[4], a[5]); break;
1402*48a54d36SAndroid Build Coastguard Worker 									case  8: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%02X:%02X:%02X:%02X:%02X:%02X:%02X:%02X",
1403*48a54d36SAndroid Build Coastguard Worker 														a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7]); break;
1404*48a54d36SAndroid Build Coastguard Worker 									case 16: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB),
1405*48a54d36SAndroid Build Coastguard Worker 														"%s%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X:%02X%02X%s",
1406*48a54d36SAndroid Build Coastguard Worker 														pre, a[0], a[1], a[2], a[3], a[4], a[5], a[6], a[7], a[8],
1407*48a54d36SAndroid Build Coastguard Worker 														a[9], a[10], a[11], a[12], a[13], a[14], a[15], post); break;
1408*48a54d36SAndroid Build Coastguard Worker 									default: i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%s", "<< ERROR: Must specify address size "
1409*48a54d36SAndroid Build Coastguard Worker 														"(i.e. %.4a=IPv4, %.6a=Ethernet, %.8a=Fibre Channel %.16a=IPv6) >>"); break;
1410*48a54d36SAndroid Build Coastguard Worker 									}
1411*48a54d36SAndroid Build Coastguard Worker 								}
1412*48a54d36SAndroid Build Coastguard Worker 							}
1413*48a54d36SAndroid Build Coastguard Worker 							break;
1414*48a54d36SAndroid Build Coastguard Worker 
1415*48a54d36SAndroid Build Coastguard Worker 				case 'U' :	{
1416*48a54d36SAndroid Build Coastguard Worker 							unsigned char *a = va_arg(arg, unsigned char *);
1417*48a54d36SAndroid Build Coastguard Worker 							if (!a) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
1418*48a54d36SAndroid Build Coastguard Worker 							else
1419*48a54d36SAndroid Build Coastguard Worker 								{
1420*48a54d36SAndroid Build Coastguard Worker 								s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1421*48a54d36SAndroid Build Coastguard Worker 								i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%08x-%04x-%04x-%02x%02x-%02x%02x%02x%02x%02x%02x",
1422*48a54d36SAndroid Build Coastguard Worker 										*((uint32_t*) &a[0]), *((uint16_t*) &a[4]), *((uint16_t*) &a[6]),
1423*48a54d36SAndroid Build Coastguard Worker 										a[8], a[9], a[10], a[11], a[12], a[13], a[14], a[15]); break;
1424*48a54d36SAndroid Build Coastguard Worker 								}
1425*48a54d36SAndroid Build Coastguard Worker 							}
1426*48a54d36SAndroid Build Coastguard Worker 							break;
1427*48a54d36SAndroid Build Coastguard Worker 
1428*48a54d36SAndroid Build Coastguard Worker 				case 'c' :	*--s = (char)va_arg(arg, int); i = 1; break;
1429*48a54d36SAndroid Build Coastguard Worker 
1430*48a54d36SAndroid Build Coastguard Worker 				case 'C' :	if (F.lSize) n = va_arg(arg, unsigned long);
1431*48a54d36SAndroid Build Coastguard Worker 							else n = va_arg(arg, unsigned int);
1432*48a54d36SAndroid Build Coastguard Worker 							if (F.hSize) n = (unsigned short) n;
1433*48a54d36SAndroid Build Coastguard Worker 							c = (int)( n        & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
1434*48a54d36SAndroid Build Coastguard Worker 							c = (int)((n >>  8) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
1435*48a54d36SAndroid Build Coastguard Worker 							c = (int)((n >> 16) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
1436*48a54d36SAndroid Build Coastguard Worker 							c = (int)((n >> 24) & 0xFF); *--s = (char)(DebugIsPrint(c) ? c : '^');
1437*48a54d36SAndroid Build Coastguard Worker 							i = 4;
1438*48a54d36SAndroid Build Coastguard Worker 							break;
1439*48a54d36SAndroid Build Coastguard Worker 
1440*48a54d36SAndroid Build Coastguard Worker 				case 's' :	s = va_arg(arg, char *);
1441*48a54d36SAndroid Build Coastguard Worker 							if (!s) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
1442*48a54d36SAndroid Build Coastguard Worker 							else switch (F.altForm)
1443*48a54d36SAndroid Build Coastguard Worker 								{
1444*48a54d36SAndroid Build Coastguard Worker 								case 0:	i=0;
1445*48a54d36SAndroid Build Coastguard Worker 										if (F.havePrecision)				// C string
1446*48a54d36SAndroid Build Coastguard Worker 											{
1447*48a54d36SAndroid Build Coastguard Worker 											while((i < F.precision) && s[i]) i++;
1448*48a54d36SAndroid Build Coastguard Worker 											// Make sure we don't truncate in the middle of a UTF-8 character.
1449*48a54d36SAndroid Build Coastguard Worker 											// If the last character is part of a multi-byte UTF-8 character, back up to the start of it.
1450*48a54d36SAndroid Build Coastguard Worker 											j=0;
1451*48a54d36SAndroid Build Coastguard Worker 											while((i > 0) && ((c = s[i-1]) & 0x80)) { j++; i--; if((c & 0xC0) != 0x80) break; }
1452*48a54d36SAndroid Build Coastguard Worker 											// If the actual count of UTF-8 characters matches the encoded UTF-8 count, add it back.
1453*48a54d36SAndroid Build Coastguard Worker 											if((j > 1) && (j <= 6))
1454*48a54d36SAndroid Build Coastguard Worker 												{
1455*48a54d36SAndroid Build Coastguard Worker 												int test = (0xFF << (8-j)) & 0xFF;
1456*48a54d36SAndroid Build Coastguard Worker 												int mask = test | (1 << ((8-j)-1));
1457*48a54d36SAndroid Build Coastguard Worker 												if((c & mask) == test) i += j;
1458*48a54d36SAndroid Build Coastguard Worker 												}
1459*48a54d36SAndroid Build Coastguard Worker 											}
1460*48a54d36SAndroid Build Coastguard Worker 										else
1461*48a54d36SAndroid Build Coastguard Worker 											while(s[i]) i++;
1462*48a54d36SAndroid Build Coastguard Worker 										break;
1463*48a54d36SAndroid Build Coastguard Worker 								case 1: i = (unsigned char) *s++; break;	// Pascal string
1464*48a54d36SAndroid Build Coastguard Worker 								case 2: {									// DNS label-sequence name
1465*48a54d36SAndroid Build Coastguard Worker 										unsigned char *a = (unsigned char *)s;
1466*48a54d36SAndroid Build Coastguard Worker 										s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1467*48a54d36SAndroid Build Coastguard Worker 										if (*a == 0) *s++ = '.';	// Special case for root DNS name
1468*48a54d36SAndroid Build Coastguard Worker 										while (*a)
1469*48a54d36SAndroid Build Coastguard Worker 											{
1470*48a54d36SAndroid Build Coastguard Worker 											if (*a > 63) { s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "<<INVALID LABEL LENGTH %u>>", *a); break; }
1471*48a54d36SAndroid Build Coastguard Worker 											if (s + *a >= &mDNS_VACB[254]) { s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "<<NAME TOO LONG>>"); break; }
1472*48a54d36SAndroid Build Coastguard Worker 											s += DebugSNPrintF(s, mDNS_VACB_Remain(s), "%#s.", a);
1473*48a54d36SAndroid Build Coastguard Worker 											a += 1 + *a;
1474*48a54d36SAndroid Build Coastguard Worker 											}
1475*48a54d36SAndroid Build Coastguard Worker 										i = (size_t)(s - mDNS_VACB);
1476*48a54d36SAndroid Build Coastguard Worker 										s = mDNS_VACB;	// Reset s back to the start of the buffer
1477*48a54d36SAndroid Build Coastguard Worker 										break;
1478*48a54d36SAndroid Build Coastguard Worker 										}
1479*48a54d36SAndroid Build Coastguard Worker 								}
1480*48a54d36SAndroid Build Coastguard Worker 							if (F.havePrecision && i > F.precision)		// Make sure we don't truncate in the middle of a UTF-8 character
1481*48a54d36SAndroid Build Coastguard Worker 								{ i = F.precision; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
1482*48a54d36SAndroid Build Coastguard Worker 							break;
1483*48a54d36SAndroid Build Coastguard Worker 
1484*48a54d36SAndroid Build Coastguard Worker 				case 'S':	{	// UTF-16 string
1485*48a54d36SAndroid Build Coastguard Worker 							unsigned char *a = va_arg(arg, unsigned char *);
1486*48a54d36SAndroid Build Coastguard Worker 							uint16_t      *u = (uint16_t*)a;
1487*48a54d36SAndroid Build Coastguard Worker 							if (!u) { static char emsg[] = "<<NULL>>"; s = emsg; i = sizeof(emsg)-1; }
1488*48a54d36SAndroid Build Coastguard Worker 							if ((!F.havePrecision || F.precision))
1489*48a54d36SAndroid Build Coastguard Worker 								{
1490*48a54d36SAndroid Build Coastguard Worker 								if      ((a[0] == 0xFE) && (a[1] == 0xFF)) { F.altForm = 1; u += 1; a += 2; F.precision--; }	// Big Endian
1491*48a54d36SAndroid Build Coastguard Worker 								else if ((a[0] == 0xFF) && (a[1] == 0xFE)) { F.altForm = 2; u += 1; a += 2; F.precision--; }	// Little Endian
1492*48a54d36SAndroid Build Coastguard Worker 								}
1493*48a54d36SAndroid Build Coastguard Worker 							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1494*48a54d36SAndroid Build Coastguard Worker 							switch (F.altForm)
1495*48a54d36SAndroid Build Coastguard Worker 								{
1496*48a54d36SAndroid Build Coastguard Worker 								case 0:	while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Host Endian
1497*48a54d36SAndroid Build Coastguard Worker 											{ c = u[i]; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; }
1498*48a54d36SAndroid Build Coastguard Worker 										break;
1499*48a54d36SAndroid Build Coastguard Worker 								case 1: while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Big Endian
1500*48a54d36SAndroid Build Coastguard Worker 											{ c = ((a[0] << 8) | a[1]) & 0xFF; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; a += 2; }
1501*48a54d36SAndroid Build Coastguard Worker 										break;
1502*48a54d36SAndroid Build Coastguard Worker 								case 2: while ((!F.havePrecision || (i < F.precision)) && u[i] && mDNS_VACB_Remain(s))	// Little Endian
1503*48a54d36SAndroid Build Coastguard Worker 											{ c = ((a[1] << 8) | a[0]) & 0xFF; *s++ = (char)(DebugIsPrint(c) ? c : '^'); i++; a += 2; }
1504*48a54d36SAndroid Build Coastguard Worker 										break;
1505*48a54d36SAndroid Build Coastguard Worker 								}
1506*48a54d36SAndroid Build Coastguard Worker 							}
1507*48a54d36SAndroid Build Coastguard Worker 							s = mDNS_VACB;	// Reset s back to the start of the buffer
1508*48a54d36SAndroid Build Coastguard Worker 							break;
1509*48a54d36SAndroid Build Coastguard Worker 
1510*48a54d36SAndroid Build Coastguard Worker 			#if TARGET_OS_MAC
1511*48a54d36SAndroid Build Coastguard Worker 				case '@':	{	// Cocoa/CoreFoundation object
1512*48a54d36SAndroid Build Coastguard Worker 							CFTypeRef cfObj;
1513*48a54d36SAndroid Build Coastguard Worker 							CFStringRef cfStr;
1514*48a54d36SAndroid Build Coastguard Worker 							cfObj = (CFTypeRef) va_arg(arg, void *);
1515*48a54d36SAndroid Build Coastguard Worker 							cfStr = (CFGetTypeID(cfObj) == CFStringGetTypeID()) ? (CFStringRef)CFRetain(cfObj) : CFCopyDescription(cfObj);
1516*48a54d36SAndroid Build Coastguard Worker 							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1517*48a54d36SAndroid Build Coastguard Worker 							if (cfStr)
1518*48a54d36SAndroid Build Coastguard Worker 								{
1519*48a54d36SAndroid Build Coastguard Worker 								CFRange range;
1520*48a54d36SAndroid Build Coastguard Worker 								CFIndex m;
1521*48a54d36SAndroid Build Coastguard Worker 								range = CFRangeMake(0, CFStringGetLength(cfStr));
1522*48a54d36SAndroid Build Coastguard Worker 								m = 0;
1523*48a54d36SAndroid Build Coastguard Worker 								CFStringGetBytes(cfStr, range, kCFStringEncodingUTF8, '^', false, (UInt8*)mDNS_VACB, (CFIndex)sizeof(mDNS_VACB), &m);
1524*48a54d36SAndroid Build Coastguard Worker 								CFRelease(cfStr);
1525*48a54d36SAndroid Build Coastguard Worker 								i = (size_t) m;
1526*48a54d36SAndroid Build Coastguard Worker 								}
1527*48a54d36SAndroid Build Coastguard Worker 							else
1528*48a54d36SAndroid Build Coastguard Worker 								{
1529*48a54d36SAndroid Build Coastguard Worker 								i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "%s", "ERROR: <invalid CF object>" );
1530*48a54d36SAndroid Build Coastguard Worker 								}
1531*48a54d36SAndroid Build Coastguard Worker 							}
1532*48a54d36SAndroid Build Coastguard Worker 							if (F.havePrecision && i > F.precision)		// Make sure we don't truncate in the middle of a UTF-8 character
1533*48a54d36SAndroid Build Coastguard Worker 								{ i = F.precision; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
1534*48a54d36SAndroid Build Coastguard Worker 							break;
1535*48a54d36SAndroid Build Coastguard Worker 			#endif
1536*48a54d36SAndroid Build Coastguard Worker 
1537*48a54d36SAndroid Build Coastguard Worker 				case 'm' :	{	// Error Message
1538*48a54d36SAndroid Build Coastguard Worker 							long err;
1539*48a54d36SAndroid Build Coastguard Worker 							if (F.lSize) err = va_arg(arg, long);
1540*48a54d36SAndroid Build Coastguard Worker 							else err = va_arg(arg, int);
1541*48a54d36SAndroid Build Coastguard Worker 							if (F.hSize) err = (short)err;
1542*48a54d36SAndroid Build Coastguard Worker 							DebugGetErrorString(err, mDNS_VACB, sizeof(mDNS_VACB));
1543*48a54d36SAndroid Build Coastguard Worker 							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1544*48a54d36SAndroid Build Coastguard Worker 							for(i=0;s[i];i++) {}
1545*48a54d36SAndroid Build Coastguard Worker 							}
1546*48a54d36SAndroid Build Coastguard Worker 							break;
1547*48a54d36SAndroid Build Coastguard Worker 
1548*48a54d36SAndroid Build Coastguard Worker 				case 'H' :	{	// Hex Dump
1549*48a54d36SAndroid Build Coastguard Worker 							void *a = va_arg(arg, void *);
1550*48a54d36SAndroid Build Coastguard Worker 							size_t size = (size_t)va_arg(arg, int);
1551*48a54d36SAndroid Build Coastguard Worker 							size_t max = (size_t)va_arg(arg, int);
1552*48a54d36SAndroid Build Coastguard Worker 							DebugFlags flags =
1553*48a54d36SAndroid Build Coastguard Worker 								kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoNewLine |
1554*48a54d36SAndroid Build Coastguard Worker 								kDebugFlags8BitSeparator | kDebugFlagsNo32BitSeparator |
1555*48a54d36SAndroid Build Coastguard Worker 								kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount;
1556*48a54d36SAndroid Build Coastguard Worker 							if (F.altForm == 0) flags |= kDebugFlagsNoASCII;
1557*48a54d36SAndroid Build Coastguard Worker 							size = (max < size) ? max : size;
1558*48a54d36SAndroid Build Coastguard Worker 							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1559*48a54d36SAndroid Build Coastguard Worker 							i = DebugHexDump(kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, a, a, size, flags, mDNS_VACB, sizeof(mDNS_VACB));
1560*48a54d36SAndroid Build Coastguard Worker 							}
1561*48a54d36SAndroid Build Coastguard Worker 							break;
1562*48a54d36SAndroid Build Coastguard Worker 
1563*48a54d36SAndroid Build Coastguard Worker 				case 'v' :	{	// Version
1564*48a54d36SAndroid Build Coastguard Worker 							uint32_t version;
1565*48a54d36SAndroid Build Coastguard Worker 							version = va_arg(arg, unsigned int);
1566*48a54d36SAndroid Build Coastguard Worker 							DebugNumVersionToString(version, mDNS_VACB);
1567*48a54d36SAndroid Build Coastguard Worker 							s = mDNS_VACB;	// Adjust s to point to the start of the buffer, not the end
1568*48a54d36SAndroid Build Coastguard Worker 							for(i=0;s[i];i++) {}
1569*48a54d36SAndroid Build Coastguard Worker 							}
1570*48a54d36SAndroid Build Coastguard Worker 							break;
1571*48a54d36SAndroid Build Coastguard Worker 
1572*48a54d36SAndroid Build Coastguard Worker 				case 'n' :	s = va_arg(arg, char *);
1573*48a54d36SAndroid Build Coastguard Worker 							if      (F.hSize) * (short *) s = (short)nwritten;
1574*48a54d36SAndroid Build Coastguard Worker 							else if (F.lSize) * (long  *) s = (long)nwritten;
1575*48a54d36SAndroid Build Coastguard Worker 							else              * (int   *) s = (int)nwritten;
1576*48a54d36SAndroid Build Coastguard Worker 							continue;
1577*48a54d36SAndroid Build Coastguard Worker 
1578*48a54d36SAndroid Build Coastguard Worker 				default:	s = mDNS_VACB;
1579*48a54d36SAndroid Build Coastguard Worker 							i = DebugSNPrintF(mDNS_VACB, sizeof(mDNS_VACB), "<<UNKNOWN FORMAT CONVERSION CODE %%%c>>", c);
1580*48a54d36SAndroid Build Coastguard Worker 
1581*48a54d36SAndroid Build Coastguard Worker 				case '%' :	*sbuffer++ = (char)c;
1582*48a54d36SAndroid Build Coastguard Worker 							if (++nwritten >= buflen) goto exit;
1583*48a54d36SAndroid Build Coastguard Worker 							break;
1584*48a54d36SAndroid Build Coastguard Worker 				}
1585*48a54d36SAndroid Build Coastguard Worker 
1586*48a54d36SAndroid Build Coastguard Worker 			if (i < F.fieldWidth && !F.leftJustify)			// Pad on the left
1587*48a54d36SAndroid Build Coastguard Worker 				do	{
1588*48a54d36SAndroid Build Coastguard Worker 					*sbuffer++ = ' ';
1589*48a54d36SAndroid Build Coastguard Worker 					if (++nwritten >= buflen) goto exit;
1590*48a54d36SAndroid Build Coastguard Worker 					} while (i < --F.fieldWidth);
1591*48a54d36SAndroid Build Coastguard Worker 
1592*48a54d36SAndroid Build Coastguard Worker 			if (i > buflen - nwritten)	// Make sure we don't truncate in the middle of a UTF-8 character
1593*48a54d36SAndroid Build Coastguard Worker 				{ i = buflen - nwritten; while (i>0 && (s[i] & 0xC0) == 0x80) i--; }
1594*48a54d36SAndroid Build Coastguard Worker 			for (j=0; j<i; j++) *sbuffer++ = *s++;			// Write the converted result
1595*48a54d36SAndroid Build Coastguard Worker 			nwritten += i;
1596*48a54d36SAndroid Build Coastguard Worker 			if (nwritten >= buflen) goto exit;
1597*48a54d36SAndroid Build Coastguard Worker 
1598*48a54d36SAndroid Build Coastguard Worker 			for (; i < F.fieldWidth; i++)					// Pad on the right
1599*48a54d36SAndroid Build Coastguard Worker 				{
1600*48a54d36SAndroid Build Coastguard Worker 				*sbuffer++ = ' ';
1601*48a54d36SAndroid Build Coastguard Worker 				if (++nwritten >= buflen) goto exit;
1602*48a54d36SAndroid Build Coastguard Worker 				}
1603*48a54d36SAndroid Build Coastguard Worker 			}
1604*48a54d36SAndroid Build Coastguard Worker 		}
1605*48a54d36SAndroid Build Coastguard Worker 	exit:
1606*48a54d36SAndroid Build Coastguard Worker 	*sbuffer++ = 0;
1607*48a54d36SAndroid Build Coastguard Worker 	return(nwritten);
1608*48a54d36SAndroid Build Coastguard Worker 	}
1609*48a54d36SAndroid Build Coastguard Worker 
1610*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1611*48a54d36SAndroid Build Coastguard Worker //	DebugGetErrorString
1612*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
1613*48a54d36SAndroid Build Coastguard Worker 
DebugGetErrorString(int_least32_t inErrorCode,char * inBuffer,size_t inBufferSize)1614*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT const char *	DebugGetErrorString( int_least32_t inErrorCode, char *inBuffer, size_t inBufferSize )
1615*48a54d36SAndroid Build Coastguard Worker {
1616*48a54d36SAndroid Build Coastguard Worker 	const char *		s;
1617*48a54d36SAndroid Build Coastguard Worker 	char *				dst;
1618*48a54d36SAndroid Build Coastguard Worker 	char *				end;
1619*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
1620*48a54d36SAndroid Build Coastguard Worker 	char				buffer[ 256 ];
1621*48a54d36SAndroid Build Coastguard Worker #endif
1622*48a54d36SAndroid Build Coastguard Worker 
1623*48a54d36SAndroid Build Coastguard Worker 	switch( inErrorCode )
1624*48a54d36SAndroid Build Coastguard Worker 	{
1625*48a54d36SAndroid Build Coastguard Worker 		#define	CaseErrorString( X, STR )					case X: s = STR; break
1626*48a54d36SAndroid Build Coastguard Worker 		#define	CaseErrorStringify( X )						case X: s = # X; break
1627*48a54d36SAndroid Build Coastguard Worker 		#define	CaseErrorStringifyHardCode( VALUE, X )		case VALUE: s = # X; break
1628*48a54d36SAndroid Build Coastguard Worker 
1629*48a54d36SAndroid Build Coastguard Worker 		// General Errors
1630*48a54d36SAndroid Build Coastguard Worker 
1631*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 0,  "no error" );
1632*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 1,  "in-progress/waiting" );
1633*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( -1, "catch-all unknown error" );
1634*48a54d36SAndroid Build Coastguard Worker 
1635*48a54d36SAndroid Build Coastguard Worker 		// ACP Errors
1636*48a54d36SAndroid Build Coastguard Worker 
1637*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -2,  kACPBadRequestErr );
1638*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -3,  kACPNoMemoryErr );
1639*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -4,  kACPBadParamErr );
1640*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -5,  kACPNotFoundErr );
1641*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -6,  kACPBadChecksumErr );
1642*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -7,  kACPCommandNotHandledErr );
1643*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -8,  kACPNetworkErr );
1644*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -9,  kACPDuplicateCommandHandlerErr );
1645*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -10, kACPUnknownPropertyErr );
1646*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -11, kACPImmutablePropertyErr );
1647*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -12, kACPBadPropertyValueErr );
1648*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -13, kACPNoResourcesErr );
1649*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -14, kACPBadOptionErr );
1650*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -15, kACPBadSizeErr );
1651*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -16, kACPBadPasswordErr );
1652*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -17, kACPNotInitializedErr );
1653*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -18, kACPNonReadablePropertyErr );
1654*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -19, kACPBadVersionErr );
1655*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -20, kACPBadSignatureErr );
1656*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -21, kACPBadIndexErr );
1657*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -22, kACPUnsupportedErr );
1658*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -23, kACPInUseErr );
1659*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -24, kACPParamCountErr );
1660*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -25, kACPIDErr );
1661*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -26, kACPFormatErr );
1662*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -27, kACPUnknownUserErr );
1663*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -28, kACPAccessDeniedErr );
1664*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -29, kACPIncorrectFWErr );
1665*48a54d36SAndroid Build Coastguard Worker 
1666*48a54d36SAndroid Build Coastguard Worker 		// Common Services Errors
1667*48a54d36SAndroid Build Coastguard Worker 
1668*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kUnknownErr );
1669*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kOptionErr );
1670*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kSelectorErr );
1671*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kExecutionStateErr );
1672*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kPathErr );
1673*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kParamErr );
1674*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kParamCountErr );
1675*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kCommandErr );
1676*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kIDErr );
1677*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kStateErr );
1678*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kRangeErr );
1679*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kRequestErr );
1680*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kResponseErr );
1681*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kChecksumErr );
1682*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotHandledErr );
1683*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kVersionErr );
1684*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kSignatureErr );
1685*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kFormatErr );
1686*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotInitializedErr );
1687*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kAlreadyInitializedErr );
1688*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotInUseErr );
1689*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kInUseErr );
1690*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kTimeoutErr );
1691*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kCanceledErr );
1692*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kAlreadyCanceledErr );
1693*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kCannotCancelErr );
1694*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kDeletedErr );
1695*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotFoundErr );
1696*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNoMemoryErr );
1697*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNoResourcesErr );
1698*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kDuplicateErr );
1699*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kImmutableErr );
1700*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kUnsupportedDataErr );
1701*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kIntegrityErr );
1702*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kIncompatibleErr );
1703*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kUnsupportedErr );
1704*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kUnexpectedErr );
1705*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kValueErr );
1706*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotReadableErr );
1707*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotWritableErr );
1708*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kBadReferenceErr );
1709*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kFlagErr );
1710*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kMalformedErr );
1711*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kSizeErr );
1712*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNameErr );
1713*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNotReadyErr );
1714*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kReadErr );
1715*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kWriteErr );
1716*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kMismatchErr );
1717*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kDateErr );
1718*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kUnderrunErr );
1719*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kOverrunErr );
1720*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kEndingErr );
1721*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kConnectionErr );
1722*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kAuthenticationErr );
1723*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kOpenErr );
1724*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kTypeErr );
1725*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kSkipErr );
1726*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNoAckErr );
1727*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kCollisionErr );
1728*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kBackoffErr );
1729*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNoAddressAckErr );
1730*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kBusyErr );
1731*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringify( kNoSpaceErr );
1732*48a54d36SAndroid Build Coastguard Worker 
1733*48a54d36SAndroid Build Coastguard Worker 		// mDNS/DNS-SD Errors
1734*48a54d36SAndroid Build Coastguard Worker 
1735*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65537, mStatus_UnknownErr );
1736*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65538, mStatus_NoSuchNameErr );
1737*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65539, mStatus_NoMemoryErr );
1738*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65540, mStatus_BadParamErr );
1739*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65541, mStatus_BadReferenceErr );
1740*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65542, mStatus_BadStateErr );
1741*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65543, mStatus_BadFlagsErr );
1742*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65544, mStatus_UnsupportedErr );
1743*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65545, mStatus_NotInitializedErr );
1744*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65546, mStatus_NoCache );
1745*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65547, mStatus_AlreadyRegistered );
1746*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65548, mStatus_NameConflict );
1747*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65549, mStatus_Invalid );
1748*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65550, mStatus_GrowCache );
1749*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65551, mStatus_BadInterfaceErr );
1750*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65552, mStatus_Incompatible );
1751*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65791, mStatus_ConfigChanged );
1752*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -65792, mStatus_MemFree );
1753*48a54d36SAndroid Build Coastguard Worker 
1754*48a54d36SAndroid Build Coastguard Worker 		// RSP Errors
1755*48a54d36SAndroid Build Coastguard Worker 
1756*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -400000, kRSPUnknownErr );
1757*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -400050, kRSPParamErr );
1758*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -400108, kRSPNoMemoryErr );
1759*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -405246, kRSPRangeErr );
1760*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -409057, kRSPSizeErr );
1761*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -400200, kRSPHardwareErr );
1762*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -401712, kRSPTimeoutErr );
1763*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -402053, kRSPUnsupportedErr );
1764*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -402419, kRSPIDErr );
1765*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -403165, kRSPFlagErr );
1766*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 			-200000, "kRSPControllerStatusBase - 0x50" );
1767*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString(			-200080, "kRSPCommandSucceededErr - 0x50" );
1768*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 			-200001, "kRSPCommandFailedErr - 0x01" );
1769*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 			-200051, "kRSPChecksumErr - 0x33" );
1770*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 			-200132, "kRSPCommandTimeoutErr - 0x84" );
1771*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 			-200034, "kRSPPasswordRequiredErr - 0x22 OBSOLETE" );
1772*48a54d36SAndroid Build Coastguard Worker 		CaseErrorString( 			-200128, "kRSPCanceledErr - 0x02 Async" );
1773*48a54d36SAndroid Build Coastguard Worker 
1774*48a54d36SAndroid Build Coastguard Worker 		// XML Errors
1775*48a54d36SAndroid Build Coastguard Worker 
1776*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -100043, kXMLNotFoundErr );
1777*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -100050, kXMLParamErr );
1778*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -100108, kXMLNoMemoryErr );
1779*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -100206, kXMLFormatErr );
1780*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -100586, kXMLNoRootElementErr );
1781*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -101703, kXMLWrongDataTypeErr );
1782*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -101726, kXMLKeyErr );
1783*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -102053, kXMLUnsupportedErr );
1784*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -102063, kXMLMissingElementErr );
1785*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -103026, kXMLParseErr );
1786*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -103159, kXMLBadDataErr );
1787*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -103170, kXMLBadNameErr );
1788*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -105246, kXMLRangeErr );
1789*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -105251, kXMLUnknownElementErr );
1790*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -108739, kXMLMalformedInputErr );
1791*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -109057, kXMLBadSizeErr );
1792*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -101730, kXMLMissingChildElementErr );
1793*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -102107, kXMLMissingParentElementErr );
1794*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -130587, kXMLNonRootElementErr );
1795*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( -102015, kXMLDateErr );
1796*48a54d36SAndroid Build Coastguard Worker 
1797*48a54d36SAndroid Build Coastguard Worker 	#if( __MACH__ )
1798*48a54d36SAndroid Build Coastguard Worker 
1799*48a54d36SAndroid Build Coastguard Worker 		// Mach Errors
1800*48a54d36SAndroid Build Coastguard Worker 
1801*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x00002000, MACH_MSG_IPC_SPACE );
1802*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x00001000, MACH_MSG_VM_SPACE );
1803*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x00000800, MACH_MSG_IPC_KERNEL );
1804*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x00000400, MACH_MSG_VM_KERNEL );
1805*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000001, MACH_SEND_IN_PROGRESS );
1806*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000002, MACH_SEND_INVALID_DATA );
1807*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000003, MACH_SEND_INVALID_DEST );
1808*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000004, MACH_SEND_TIMED_OUT );
1809*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000007, MACH_SEND_INTERRUPTED );
1810*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000008, MACH_SEND_MSG_TOO_SMALL );
1811*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000009, MACH_SEND_INVALID_REPLY );
1812*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000000A, MACH_SEND_INVALID_RIGHT );
1813*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000000B, MACH_SEND_INVALID_NOTIFY );
1814*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000000C, MACH_SEND_INVALID_MEMORY );
1815*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000000D, MACH_SEND_NO_BUFFER );
1816*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000000E, MACH_SEND_TOO_LARGE );
1817*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000000F, MACH_SEND_INVALID_TYPE );
1818*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000010, MACH_SEND_INVALID_HEADER );
1819*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000011, MACH_SEND_INVALID_TRAILER );
1820*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10000015, MACH_SEND_INVALID_RT_OOL_SIZE );
1821*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004001, MACH_RCV_IN_PROGRESS );
1822*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004002, MACH_RCV_INVALID_NAME );
1823*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004003, MACH_RCV_TIMED_OUT );
1824*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004004, MACH_RCV_TOO_LARGE );
1825*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004005, MACH_RCV_INTERRUPTED );
1826*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004006, MACH_RCV_PORT_CHANGED );
1827*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004007, MACH_RCV_INVALID_NOTIFY );
1828*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004008, MACH_RCV_INVALID_DATA );
1829*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004009, MACH_RCV_PORT_DIED );
1830*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000400A, MACH_RCV_IN_SET );
1831*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000400B, MACH_RCV_HEADER_ERROR );
1832*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000400C, MACH_RCV_BODY_ERROR );
1833*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000400D, MACH_RCV_INVALID_TYPE );
1834*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000400E, MACH_RCV_SCATTER_SMALL );
1835*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x1000400F, MACH_RCV_INVALID_TRAILER );
1836*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0x10004011, MACH_RCV_IN_PROGRESS_TIMED );
1837*48a54d36SAndroid Build Coastguard Worker 
1838*48a54d36SAndroid Build Coastguard Worker 		// Mach OSReturn Errors
1839*48a54d36SAndroid Build Coastguard Worker 
1840*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC000001, kOSReturnError );
1841*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004001, kOSMetaClassInternal );
1842*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004002, kOSMetaClassHasInstances );
1843*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004003, kOSMetaClassNoInit );
1844*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004004, kOSMetaClassNoTempData );
1845*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004005, kOSMetaClassNoDicts );
1846*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004006, kOSMetaClassNoKModSet );
1847*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004007, kOSMetaClassNoInsKModSet );
1848*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004008, kOSMetaClassNoSuper );
1849*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC004009, kOSMetaClassInstNoSuper );
1850*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xDC00400A, kOSMetaClassDuplicateClass );
1851*48a54d36SAndroid Build Coastguard Worker 
1852*48a54d36SAndroid Build Coastguard Worker 		// IOKit Errors
1853*48a54d36SAndroid Build Coastguard Worker 
1854*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002BC, kIOReturnError );
1855*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002BD, kIOReturnNoMemory );
1856*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002BE, kIOReturnNoResources );
1857*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002BF, kIOReturnIPCError );
1858*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C0, kIOReturnNoDevice );
1859*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C1, kIOReturnNotPrivileged );
1860*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C2, kIOReturnBadArgument );
1861*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C3, kIOReturnLockedRead );
1862*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C4, kIOReturnLockedWrite );
1863*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C5, kIOReturnExclusiveAccess );
1864*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C6, kIOReturnBadMessageID );
1865*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C7, kIOReturnUnsupported );
1866*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C8, kIOReturnVMError );
1867*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002C9, kIOReturnInternalError );
1868*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002CA, kIOReturnIOError );
1869*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002CC, kIOReturnCannotLock );
1870*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002CD, kIOReturnNotOpen );
1871*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002CE, kIOReturnNotReadable );
1872*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002CF, kIOReturnNotWritable );
1873*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D0, kIOReturnNotAligned );
1874*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D1, kIOReturnBadMedia );
1875*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D2, kIOReturnStillOpen );
1876*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D3, kIOReturnRLDError );
1877*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D4, kIOReturnDMAError );
1878*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D5, kIOReturnBusy );
1879*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D6, kIOReturnTimeout );
1880*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D7, kIOReturnOffline );
1881*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D8, kIOReturnNotReady );
1882*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002D9, kIOReturnNotAttached );
1883*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002DA, kIOReturnNoChannels );
1884*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002DB, kIOReturnNoSpace );
1885*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002DD, kIOReturnPortExists );
1886*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002DE, kIOReturnCannotWire );
1887*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002DF, kIOReturnNoInterrupt );
1888*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E0, kIOReturnNoFrames );
1889*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E1, kIOReturnMessageTooLarge );
1890*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E2, kIOReturnNotPermitted );
1891*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E3, kIOReturnNoPower );
1892*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E4, kIOReturnNoMedia );
1893*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E5, kIOReturnUnformattedMedia );
1894*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E6, kIOReturnUnsupportedMode );
1895*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E7, kIOReturnUnderrun );
1896*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E8, kIOReturnOverrun );
1897*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002E9, kIOReturnDeviceError	 );
1898*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002EA, kIOReturnNoCompletion	 );
1899*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002EB, kIOReturnAborted	 );
1900*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002EC, kIOReturnNoBandwidth	 );
1901*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002ED, kIOReturnNotResponding	 );
1902*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002EE, kIOReturnIsoTooOld	 );
1903*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002EF, kIOReturnIsoTooNew	 );
1904*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00002F0, kIOReturnNotFound );
1905*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0000001, kIOReturnInvalid );
1906*48a54d36SAndroid Build Coastguard Worker 
1907*48a54d36SAndroid Build Coastguard Worker 		// IOKit FireWire Errors
1908*48a54d36SAndroid Build Coastguard Worker 
1909*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008010, kIOFireWireResponseBase );
1910*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008020, kIOFireWireBusReset );
1911*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008001, kIOConfigNoEntry );
1912*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008002, kIOFireWirePending );
1913*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008003, kIOFireWireLastDCLToken );
1914*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008004, kIOFireWireConfigROMInvalid );
1915*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008005, kIOFireWireAlreadyRegistered );
1916*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008006, kIOFireWireMultipleTalkers );
1917*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008007, kIOFireWireChannelActive );
1918*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008008, kIOFireWireNoListenerOrTalker );
1919*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008009, kIOFireWireNoChannels );
1920*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000800A, kIOFireWireChannelNotAvailable );
1921*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000800B, kIOFireWireSeparateBus );
1922*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000800C, kIOFireWireBadSelfIDs );
1923*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000800D, kIOFireWireLowCableVoltage );
1924*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000800E, kIOFireWireInsufficientPower );
1925*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000800F, kIOFireWireOutOfTLabels );
1926*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008101, kIOFireWireBogusDCLProgram );
1927*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008102, kIOFireWireTalkingAndListening );
1928*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0008103, kIOFireWireHardwareSlept );
1929*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00087D0, kIOFWMessageServiceIsRequestingClose );
1930*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00087D1, kIOFWMessagePowerStateChanged );
1931*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE00087D2, kIOFWMessageTopologyChanged );
1932*48a54d36SAndroid Build Coastguard Worker 
1933*48a54d36SAndroid Build Coastguard Worker 		// IOKit USB Errors
1934*48a54d36SAndroid Build Coastguard Worker 
1935*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004061, kIOUSBUnknownPipeErr );
1936*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004060, kIOUSBTooManyPipesErr );
1937*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000405F, kIOUSBNoAsyncPortErr );
1938*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000405E, kIOUSBNotEnoughPipesErr );
1939*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000405D, kIOUSBNotEnoughPowerErr );
1940*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004057, kIOUSBEndpointNotFound );
1941*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004056, kIOUSBConfigNotFound );
1942*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004051, kIOUSBTransactionTimeout );
1943*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004050, kIOUSBTransactionReturned );
1944*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000404F, kIOUSBPipeStalled );
1945*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000404E, kIOUSBInterfaceNotFound );
1946*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000404D, kIOUSBLowLatencyBufferNotPreviouslyAllocated );
1947*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000404C, kIOUSBLowLatencyFrameListNotPreviouslyAllocated );
1948*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000404B, kIOUSBHighSpeedSplitError );
1949*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004010, kIOUSBLinkErr );
1950*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000400F, kIOUSBNotSent2Err );
1951*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000400E, kIOUSBNotSent1Err );
1952*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000400D, kIOUSBBufferUnderrunErr );
1953*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000400C, kIOUSBBufferOverrunErr );
1954*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000400B, kIOUSBReserved2Err );
1955*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE000400A, kIOUSBReserved1Err );
1956*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004007, kIOUSBWrongPIDErr );
1957*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004006, kIOUSBPIDCheckErr );
1958*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004003, kIOUSBDataToggleErr );
1959*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004002, kIOUSBBitstufErr );
1960*48a54d36SAndroid Build Coastguard Worker 		CaseErrorStringifyHardCode( 0xE0004001, kIOUSBCRCErr );
1961*48a54d36SAndroid Build Coastguard Worker 
1962*48a54d36SAndroid Build Coastguard Worker 	#endif	// __MACH__
1963*48a54d36SAndroid Build Coastguard Worker 
1964*48a54d36SAndroid Build Coastguard Worker 		// Other Errors
1965*48a54d36SAndroid Build Coastguard Worker 
1966*48a54d36SAndroid Build Coastguard Worker 		default:
1967*48a54d36SAndroid Build Coastguard Worker 			s = NULL;
1968*48a54d36SAndroid Build Coastguard Worker 			#if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
1969*48a54d36SAndroid Build Coastguard Worker 				if( inBuffer && ( inBufferSize > 0 ) )
1970*48a54d36SAndroid Build Coastguard Worker 				{
1971*48a54d36SAndroid Build Coastguard Worker 					DWORD		n;
1972*48a54d36SAndroid Build Coastguard Worker 
1973*48a54d36SAndroid Build Coastguard Worker 					n = FormatMessageA( FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, (DWORD) inErrorCode,
1974*48a54d36SAndroid Build Coastguard Worker 						MAKELANGID( LANG_NEUTRAL, SUBLANG_DEFAULT ), buffer, sizeof( buffer ), NULL );
1975*48a54d36SAndroid Build Coastguard Worker 					if( n > 0 )
1976*48a54d36SAndroid Build Coastguard Worker 					{
1977*48a54d36SAndroid Build Coastguard Worker 						// Remove any trailing CR's or LF's since some messages have them.
1978*48a54d36SAndroid Build Coastguard Worker 
1979*48a54d36SAndroid Build Coastguard Worker 						while( ( n > 0 ) && isspace( ( (unsigned char *) buffer )[ n - 1 ] ) )
1980*48a54d36SAndroid Build Coastguard Worker 						{
1981*48a54d36SAndroid Build Coastguard Worker 							buffer[ --n ] = '\0';
1982*48a54d36SAndroid Build Coastguard Worker 						}
1983*48a54d36SAndroid Build Coastguard Worker 						s = buffer;
1984*48a54d36SAndroid Build Coastguard Worker 					}
1985*48a54d36SAndroid Build Coastguard Worker 				}
1986*48a54d36SAndroid Build Coastguard Worker 			#endif
1987*48a54d36SAndroid Build Coastguard Worker 
1988*48a54d36SAndroid Build Coastguard Worker 			if( !s )
1989*48a54d36SAndroid Build Coastguard Worker 			{
1990*48a54d36SAndroid Build Coastguard Worker 				#if( !TARGET_API_MAC_OSX_KERNEL && !TARGET_OS_WINDOWS_CE )
1991*48a54d36SAndroid Build Coastguard Worker 					s = strerror( inErrorCode );
1992*48a54d36SAndroid Build Coastguard Worker 				#endif
1993*48a54d36SAndroid Build Coastguard Worker 				if( !s )
1994*48a54d36SAndroid Build Coastguard Worker 				{
1995*48a54d36SAndroid Build Coastguard Worker 					s = "<unknown error code>";
1996*48a54d36SAndroid Build Coastguard Worker 				}
1997*48a54d36SAndroid Build Coastguard Worker 			}
1998*48a54d36SAndroid Build Coastguard Worker 			break;
1999*48a54d36SAndroid Build Coastguard Worker 	}
2000*48a54d36SAndroid Build Coastguard Worker 
2001*48a54d36SAndroid Build Coastguard Worker 	// Copy the string to the output buffer. If no buffer is supplied or it is empty, return an empty string.
2002*48a54d36SAndroid Build Coastguard Worker 
2003*48a54d36SAndroid Build Coastguard Worker 	if( inBuffer && ( inBufferSize > 0 ) )
2004*48a54d36SAndroid Build Coastguard Worker 	{
2005*48a54d36SAndroid Build Coastguard Worker 		dst = inBuffer;
2006*48a54d36SAndroid Build Coastguard Worker 		end = dst + ( inBufferSize - 1 );
2007*48a54d36SAndroid Build Coastguard Worker 		while( ( ( end - dst ) > 0 ) && ( *s != '\0' ) )
2008*48a54d36SAndroid Build Coastguard Worker 		{
2009*48a54d36SAndroid Build Coastguard Worker 			*dst++ = *s++;
2010*48a54d36SAndroid Build Coastguard Worker 		}
2011*48a54d36SAndroid Build Coastguard Worker 		*dst = '\0';
2012*48a54d36SAndroid Build Coastguard Worker 		s = inBuffer;
2013*48a54d36SAndroid Build Coastguard Worker 	}
2014*48a54d36SAndroid Build Coastguard Worker 	return( s );
2015*48a54d36SAndroid Build Coastguard Worker }
2016*48a54d36SAndroid Build Coastguard Worker 
2017*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2018*48a54d36SAndroid Build Coastguard Worker //	DebugHexDump
2019*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2020*48a54d36SAndroid Build Coastguard Worker 
2021*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t
DebugHexDump(DebugLevel inLevel,int inIndent,const char * inLabel,size_t inLabelSize,int inLabelMinWidth,const char * inType,size_t inTypeSize,const void * inDataStart,const void * inData,size_t inDataSize,DebugFlags inFlags,char * outBuffer,size_t inBufferSize)2022*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump(
2023*48a54d36SAndroid Build Coastguard Worker 		DebugLevel		inLevel,
2024*48a54d36SAndroid Build Coastguard Worker 		int				inIndent,
2025*48a54d36SAndroid Build Coastguard Worker 		const char * 	inLabel,
2026*48a54d36SAndroid Build Coastguard Worker 		size_t 			inLabelSize,
2027*48a54d36SAndroid Build Coastguard Worker 		int				inLabelMinWidth,
2028*48a54d36SAndroid Build Coastguard Worker 		const char *	inType,
2029*48a54d36SAndroid Build Coastguard Worker 		size_t 			inTypeSize,
2030*48a54d36SAndroid Build Coastguard Worker 		const void *	inDataStart,
2031*48a54d36SAndroid Build Coastguard Worker 		const void *	inData,
2032*48a54d36SAndroid Build Coastguard Worker 		size_t 			inDataSize,
2033*48a54d36SAndroid Build Coastguard Worker 		DebugFlags	 	inFlags,
2034*48a54d36SAndroid Build Coastguard Worker 		char *			outBuffer,
2035*48a54d36SAndroid Build Coastguard Worker 		size_t			inBufferSize )
2036*48a54d36SAndroid Build Coastguard Worker {
2037*48a54d36SAndroid Build Coastguard Worker 	static const char		kHexChars[] = "0123456789ABCDEF";
2038*48a54d36SAndroid Build Coastguard Worker 	const uint8_t *			start;
2039*48a54d36SAndroid Build Coastguard Worker 	const uint8_t *			src;
2040*48a54d36SAndroid Build Coastguard Worker 	char *					dst;
2041*48a54d36SAndroid Build Coastguard Worker 	char *					end;
2042*48a54d36SAndroid Build Coastguard Worker 	size_t					n;
2043*48a54d36SAndroid Build Coastguard Worker 	int						offset;
2044*48a54d36SAndroid Build Coastguard Worker 	int						width;
2045*48a54d36SAndroid Build Coastguard Worker 	const char *			newline;
2046*48a54d36SAndroid Build Coastguard Worker 	char					separator[ 8 ];
2047*48a54d36SAndroid Build Coastguard Worker 	char *					s;
2048*48a54d36SAndroid Build Coastguard Worker 
2049*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inType );
2050*48a54d36SAndroid Build Coastguard Worker 	DEBUG_UNUSED( inTypeSize );
2051*48a54d36SAndroid Build Coastguard Worker 
2052*48a54d36SAndroid Build Coastguard Worker 	// Set up the function-wide variables.
2053*48a54d36SAndroid Build Coastguard Worker 
2054*48a54d36SAndroid Build Coastguard Worker 	if( inLabelSize == kSizeCString )
2055*48a54d36SAndroid Build Coastguard Worker 	{
2056*48a54d36SAndroid Build Coastguard Worker 		inLabelSize = strlen( inLabel );
2057*48a54d36SAndroid Build Coastguard Worker 	}
2058*48a54d36SAndroid Build Coastguard Worker 	start 	= (const uint8_t *) inData;
2059*48a54d36SAndroid Build Coastguard Worker 	src 	= start;
2060*48a54d36SAndroid Build Coastguard Worker 	dst		= outBuffer;
2061*48a54d36SAndroid Build Coastguard Worker 	end		= dst + inBufferSize;
2062*48a54d36SAndroid Build Coastguard Worker 	offset 	= (int)( (intptr_t) inData - (intptr_t) inDataStart );
2063*48a54d36SAndroid Build Coastguard Worker 	width	= ( (int) inLabelSize > inLabelMinWidth ) ? (int) inLabelSize : inLabelMinWidth;
2064*48a54d36SAndroid Build Coastguard Worker 	newline	= ( inFlags & kDebugFlagsNoNewLine ) ? "" : "\n";
2065*48a54d36SAndroid Build Coastguard Worker 
2066*48a54d36SAndroid Build Coastguard Worker 	// Set up the separator string. This is used to insert spaces on subsequent "lines" when not using newlines.
2067*48a54d36SAndroid Build Coastguard Worker 
2068*48a54d36SAndroid Build Coastguard Worker 	s = separator;
2069*48a54d36SAndroid Build Coastguard Worker 	if( inFlags & kDebugFlagsNoNewLine )
2070*48a54d36SAndroid Build Coastguard Worker 	{
2071*48a54d36SAndroid Build Coastguard Worker 		if( inFlags & kDebugFlags8BitSeparator )
2072*48a54d36SAndroid Build Coastguard Worker 		{
2073*48a54d36SAndroid Build Coastguard Worker 			*s++ = ' ';
2074*48a54d36SAndroid Build Coastguard Worker 		}
2075*48a54d36SAndroid Build Coastguard Worker 		if( inFlags & kDebugFlags16BitSeparator )
2076*48a54d36SAndroid Build Coastguard Worker 		{
2077*48a54d36SAndroid Build Coastguard Worker 			*s++ = ' ';
2078*48a54d36SAndroid Build Coastguard Worker 		}
2079*48a54d36SAndroid Build Coastguard Worker 		if( !( inFlags & kDebugFlagsNo32BitSeparator ) )
2080*48a54d36SAndroid Build Coastguard Worker 		{
2081*48a54d36SAndroid Build Coastguard Worker 			*s++ = ' ';
2082*48a54d36SAndroid Build Coastguard Worker 		}
2083*48a54d36SAndroid Build Coastguard Worker 		check( ( (size_t)( s - separator ) ) < sizeof( separator ) );
2084*48a54d36SAndroid Build Coastguard Worker 	}
2085*48a54d36SAndroid Build Coastguard Worker 	*s = '\0';
2086*48a54d36SAndroid Build Coastguard Worker 
2087*48a54d36SAndroid Build Coastguard Worker 	for( ;; )
2088*48a54d36SAndroid Build Coastguard Worker 	{
2089*48a54d36SAndroid Build Coastguard Worker 		char		prefixString[ 32 ];
2090*48a54d36SAndroid Build Coastguard Worker 		char		hexString[ 64 ];
2091*48a54d36SAndroid Build Coastguard Worker 		char		asciiString[ 32 ];
2092*48a54d36SAndroid Build Coastguard Worker 		char		byteCountString[ 32 ];
2093*48a54d36SAndroid Build Coastguard Worker 		int			c;
2094*48a54d36SAndroid Build Coastguard Worker 		size_t		chunkSize;
2095*48a54d36SAndroid Build Coastguard Worker 		size_t		i;
2096*48a54d36SAndroid Build Coastguard Worker 
2097*48a54d36SAndroid Build Coastguard Worker 		// If this is a label-only item (i.e. no data), print the label (accounting for prefix string spacing) and exit.
2098*48a54d36SAndroid Build Coastguard Worker 
2099*48a54d36SAndroid Build Coastguard Worker 		if( inDataSize == 0 )
2100*48a54d36SAndroid Build Coastguard Worker 		{
2101*48a54d36SAndroid Build Coastguard Worker 			if( inLabel && ( inLabelSize > 0 ) )
2102*48a54d36SAndroid Build Coastguard Worker 			{
2103*48a54d36SAndroid Build Coastguard Worker 				width = 0;
2104*48a54d36SAndroid Build Coastguard Worker 				if( !( inFlags & kDebugFlagsNoAddress ) )
2105*48a54d36SAndroid Build Coastguard Worker 				{
2106*48a54d36SAndroid Build Coastguard Worker 					width += 8;			// "00000000"
2107*48a54d36SAndroid Build Coastguard Worker 					if( !( inFlags & kDebugFlagsNoOffset ) )
2108*48a54d36SAndroid Build Coastguard Worker 					{
2109*48a54d36SAndroid Build Coastguard Worker 						width += 1;		// "+"
2110*48a54d36SAndroid Build Coastguard Worker 					}
2111*48a54d36SAndroid Build Coastguard Worker 				}
2112*48a54d36SAndroid Build Coastguard Worker 				if( inFlags & kDebugFlags32BitOffset )
2113*48a54d36SAndroid Build Coastguard Worker 				{
2114*48a54d36SAndroid Build Coastguard Worker 					width += 8;			// "00000000"
2115*48a54d36SAndroid Build Coastguard Worker 				}
2116*48a54d36SAndroid Build Coastguard Worker 				else if( !( inFlags & kDebugFlagsNoOffset ) )
2117*48a54d36SAndroid Build Coastguard Worker 				{
2118*48a54d36SAndroid Build Coastguard Worker 					width += 4;			// "0000"
2119*48a54d36SAndroid Build Coastguard Worker 				}
2120*48a54d36SAndroid Build Coastguard Worker 
2121*48a54d36SAndroid Build Coastguard Worker 				if( outBuffer )
2122*48a54d36SAndroid Build Coastguard Worker 				{
2123*48a54d36SAndroid Build Coastguard Worker 					dst += DebugSNPrintF( dst, (size_t)( end - dst ), "%*s" "%-*.*s" "%.*s" "%s",
2124*48a54d36SAndroid Build Coastguard Worker 						width, "",
2125*48a54d36SAndroid Build Coastguard Worker 						( width > 0 ) ? ": " : "",
2126*48a54d36SAndroid Build Coastguard Worker 						width, (int) inLabelSize, inLabel,
2127*48a54d36SAndroid Build Coastguard Worker 						newline );
2128*48a54d36SAndroid Build Coastguard Worker 				}
2129*48a54d36SAndroid Build Coastguard Worker 				else
2130*48a54d36SAndroid Build Coastguard Worker 				{
2131*48a54d36SAndroid Build Coastguard Worker 					dst += DebugPrintF( inLevel, "%*s" "%-*.*s" "%.*s" "%s",
2132*48a54d36SAndroid Build Coastguard Worker 						width, "",
2133*48a54d36SAndroid Build Coastguard Worker 						( width > 0 ) ? ": " : "",
2134*48a54d36SAndroid Build Coastguard Worker 						width, (int) inLabelSize, inLabel,
2135*48a54d36SAndroid Build Coastguard Worker 						newline );
2136*48a54d36SAndroid Build Coastguard Worker 				}
2137*48a54d36SAndroid Build Coastguard Worker 			}
2138*48a54d36SAndroid Build Coastguard Worker 			break;
2139*48a54d36SAndroid Build Coastguard Worker 		}
2140*48a54d36SAndroid Build Coastguard Worker 
2141*48a54d36SAndroid Build Coastguard Worker 		// Build the prefix string. It will be in one of the following formats:
2142*48a54d36SAndroid Build Coastguard Worker 		//
2143*48a54d36SAndroid Build Coastguard Worker 		// 1) "00000000+0000[0000]"	(address and offset)
2144*48a54d36SAndroid Build Coastguard Worker 		// 2) "00000000"			(address only)
2145*48a54d36SAndroid Build Coastguard Worker 		// 3) "0000[0000]"			(offset only)
2146*48a54d36SAndroid Build Coastguard Worker 		// 4) ""					(no address or offset)
2147*48a54d36SAndroid Build Coastguard Worker 		//
2148*48a54d36SAndroid Build Coastguard Worker 		// Note: If we're printing multiple "lines", but not printing newlines, a space is used to separate.
2149*48a54d36SAndroid Build Coastguard Worker 
2150*48a54d36SAndroid Build Coastguard Worker 		s = prefixString;
2151*48a54d36SAndroid Build Coastguard Worker 		if( !( inFlags & kDebugFlagsNoAddress ) )
2152*48a54d36SAndroid Build Coastguard Worker 		{
2153*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 28 ) & 0xF ];
2154*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 24 ) & 0xF ];
2155*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 20 ) & 0xF ];
2156*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 16 ) & 0xF ];
2157*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >> 12 ) & 0xF ];
2158*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >>  8 ) & 0xF ];
2159*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( ( (uintptr_t) src ) >>  4 ) & 0xF ];
2160*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[   ( (uintptr_t) src )         & 0xF ];
2161*48a54d36SAndroid Build Coastguard Worker 
2162*48a54d36SAndroid Build Coastguard Worker 			if( !( inFlags & kDebugFlagsNoOffset ) )
2163*48a54d36SAndroid Build Coastguard Worker 			{
2164*48a54d36SAndroid Build Coastguard Worker 				*s++ = '+';
2165*48a54d36SAndroid Build Coastguard Worker 			}
2166*48a54d36SAndroid Build Coastguard Worker 		}
2167*48a54d36SAndroid Build Coastguard Worker 		if( !( inFlags & kDebugFlagsNoOffset ) )
2168*48a54d36SAndroid Build Coastguard Worker 		{
2169*48a54d36SAndroid Build Coastguard Worker 			if( inFlags & kDebugFlags32BitOffset )
2170*48a54d36SAndroid Build Coastguard Worker 			{
2171*48a54d36SAndroid Build Coastguard Worker 				*s++ = kHexChars[ ( offset >> 28 ) & 0xF ];
2172*48a54d36SAndroid Build Coastguard Worker 				*s++ = kHexChars[ ( offset >> 24 ) & 0xF ];
2173*48a54d36SAndroid Build Coastguard Worker 				*s++ = kHexChars[ ( offset >> 20 ) & 0xF ];
2174*48a54d36SAndroid Build Coastguard Worker 				*s++ = kHexChars[ ( offset >> 16 ) & 0xF ];
2175*48a54d36SAndroid Build Coastguard Worker 			}
2176*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( offset >> 12 ) & 0xF ];
2177*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( offset >>  8 ) & 0xF ];
2178*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[ ( offset >>  4 ) & 0xF ];
2179*48a54d36SAndroid Build Coastguard Worker 			*s++ = kHexChars[   offset         & 0xF ];
2180*48a54d36SAndroid Build Coastguard Worker 		}
2181*48a54d36SAndroid Build Coastguard Worker 		if( s != prefixString )
2182*48a54d36SAndroid Build Coastguard Worker 		{
2183*48a54d36SAndroid Build Coastguard Worker 			*s++ = ':';
2184*48a54d36SAndroid Build Coastguard Worker 			*s++ = ' ';
2185*48a54d36SAndroid Build Coastguard Worker 		}
2186*48a54d36SAndroid Build Coastguard Worker 		check( ( (size_t)( s - prefixString ) ) < sizeof( prefixString ) );
2187*48a54d36SAndroid Build Coastguard Worker 		*s = '\0';
2188*48a54d36SAndroid Build Coastguard Worker 
2189*48a54d36SAndroid Build Coastguard Worker 		// Build a hex string with a optional spaces after every 1, 2, and/or 4 bytes to make it easier to read.
2190*48a54d36SAndroid Build Coastguard Worker 		// Optionally pads the hex string with space to fill the full 16 byte range (so it lines up).
2191*48a54d36SAndroid Build Coastguard Worker 
2192*48a54d36SAndroid Build Coastguard Worker 		s = hexString;
2193*48a54d36SAndroid Build Coastguard Worker 		chunkSize = ( inDataSize < 16 ) ? inDataSize : 16;
2194*48a54d36SAndroid Build Coastguard Worker 		n = ( inFlags & kDebugFlagsNo16ByteHexPad ) ? chunkSize : 16;
2195*48a54d36SAndroid Build Coastguard Worker 		for( i = 0; i < n; ++i )
2196*48a54d36SAndroid Build Coastguard Worker 		{
2197*48a54d36SAndroid Build Coastguard Worker 			if( ( inFlags & kDebugFlags8BitSeparator ) && ( i > 0 ) )
2198*48a54d36SAndroid Build Coastguard Worker 			{
2199*48a54d36SAndroid Build Coastguard Worker 				*s++ = ' ';
2200*48a54d36SAndroid Build Coastguard Worker 			}
2201*48a54d36SAndroid Build Coastguard Worker 			if( ( inFlags & kDebugFlags16BitSeparator ) && ( i > 0 ) && ( ( i % 2 ) == 0 ) )
2202*48a54d36SAndroid Build Coastguard Worker 			{
2203*48a54d36SAndroid Build Coastguard Worker 				*s++ = ' ';
2204*48a54d36SAndroid Build Coastguard Worker 			}
2205*48a54d36SAndroid Build Coastguard Worker 			if( !( inFlags & kDebugFlagsNo32BitSeparator ) && ( i > 0 ) && ( ( i % 4 ) == 0 ) )
2206*48a54d36SAndroid Build Coastguard Worker 			{
2207*48a54d36SAndroid Build Coastguard Worker 				*s++ = ' ';
2208*48a54d36SAndroid Build Coastguard Worker 			}
2209*48a54d36SAndroid Build Coastguard Worker 			if( i < chunkSize )
2210*48a54d36SAndroid Build Coastguard Worker 			{
2211*48a54d36SAndroid Build Coastguard Worker 				*s++ = kHexChars[ src[ i ] >> 4   ];
2212*48a54d36SAndroid Build Coastguard Worker 				*s++ = kHexChars[ src[ i ] &  0xF ];
2213*48a54d36SAndroid Build Coastguard Worker 			}
2214*48a54d36SAndroid Build Coastguard Worker 			else
2215*48a54d36SAndroid Build Coastguard Worker 			{
2216*48a54d36SAndroid Build Coastguard Worker 				*s++ = ' ';
2217*48a54d36SAndroid Build Coastguard Worker 				*s++ = ' ';
2218*48a54d36SAndroid Build Coastguard Worker 			}
2219*48a54d36SAndroid Build Coastguard Worker 		}
2220*48a54d36SAndroid Build Coastguard Worker 		check( ( (size_t)( s - hexString ) ) < sizeof( hexString ) );
2221*48a54d36SAndroid Build Coastguard Worker 		*s = '\0';
2222*48a54d36SAndroid Build Coastguard Worker 
2223*48a54d36SAndroid Build Coastguard Worker 		// Build a string with the ASCII version of the data (replaces non-printable characters with '^').
2224*48a54d36SAndroid Build Coastguard Worker 		// Optionally pads the string with '`' to fill the full 16 byte range (so it lines up).
2225*48a54d36SAndroid Build Coastguard Worker 
2226*48a54d36SAndroid Build Coastguard Worker 		s = asciiString;
2227*48a54d36SAndroid Build Coastguard Worker 		if( !( inFlags & kDebugFlagsNoASCII ) )
2228*48a54d36SAndroid Build Coastguard Worker 		{
2229*48a54d36SAndroid Build Coastguard Worker 			*s++ = ' ';
2230*48a54d36SAndroid Build Coastguard Worker 			*s++ = '|';
2231*48a54d36SAndroid Build Coastguard Worker 			for( i = 0; i < n; ++i )
2232*48a54d36SAndroid Build Coastguard Worker 			{
2233*48a54d36SAndroid Build Coastguard Worker 				if( i < chunkSize )
2234*48a54d36SAndroid Build Coastguard Worker 				{
2235*48a54d36SAndroid Build Coastguard Worker 					c = src[ i ];
2236*48a54d36SAndroid Build Coastguard Worker 					if( !DebugIsPrint( c ) )
2237*48a54d36SAndroid Build Coastguard Worker 					{
2238*48a54d36SAndroid Build Coastguard Worker 						c = '^';
2239*48a54d36SAndroid Build Coastguard Worker 					}
2240*48a54d36SAndroid Build Coastguard Worker 				}
2241*48a54d36SAndroid Build Coastguard Worker 				else
2242*48a54d36SAndroid Build Coastguard Worker 				{
2243*48a54d36SAndroid Build Coastguard Worker 					c = '`';
2244*48a54d36SAndroid Build Coastguard Worker 				}
2245*48a54d36SAndroid Build Coastguard Worker 				*s++ = (char) c;
2246*48a54d36SAndroid Build Coastguard Worker 			}
2247*48a54d36SAndroid Build Coastguard Worker 			*s++ = '|';
2248*48a54d36SAndroid Build Coastguard Worker 			check( ( (size_t)( s - asciiString ) ) < sizeof( asciiString ) );
2249*48a54d36SAndroid Build Coastguard Worker 		}
2250*48a54d36SAndroid Build Coastguard Worker 		*s = '\0';
2251*48a54d36SAndroid Build Coastguard Worker 
2252*48a54d36SAndroid Build Coastguard Worker 		// Build a string indicating how bytes are in the hex dump. Only printed on the first line.
2253*48a54d36SAndroid Build Coastguard Worker 
2254*48a54d36SAndroid Build Coastguard Worker 		s = byteCountString;
2255*48a54d36SAndroid Build Coastguard Worker 		if( !( inFlags & kDebugFlagsNoByteCount ) )
2256*48a54d36SAndroid Build Coastguard Worker 		{
2257*48a54d36SAndroid Build Coastguard Worker 			if( src == start )
2258*48a54d36SAndroid Build Coastguard Worker 			{
2259*48a54d36SAndroid Build Coastguard Worker 				s += DebugSNPrintF( s, sizeof( byteCountString ), " (%d bytes)", (int) inDataSize );
2260*48a54d36SAndroid Build Coastguard Worker 			}
2261*48a54d36SAndroid Build Coastguard Worker 		}
2262*48a54d36SAndroid Build Coastguard Worker 		check( ( (size_t)( s - byteCountString ) ) < sizeof( byteCountString ) );
2263*48a54d36SAndroid Build Coastguard Worker 		*s = '\0';
2264*48a54d36SAndroid Build Coastguard Worker 
2265*48a54d36SAndroid Build Coastguard Worker 		// Build the entire line from all the pieces we've previously built.
2266*48a54d36SAndroid Build Coastguard Worker 
2267*48a54d36SAndroid Build Coastguard Worker 		if( outBuffer )
2268*48a54d36SAndroid Build Coastguard Worker 		{
2269*48a54d36SAndroid Build Coastguard Worker 			if( src == start )
2270*48a54d36SAndroid Build Coastguard Worker 			{
2271*48a54d36SAndroid Build Coastguard Worker 				dst += DebugSNPrintF( dst, (size_t)( end - dst ),
2272*48a54d36SAndroid Build Coastguard Worker 					"%*s"		// Indention
2273*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Separator (only if needed)
2274*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Prefix
2275*48a54d36SAndroid Build Coastguard Worker 					"%-*.*s"	// Label
2276*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Separator
2277*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Hex
2278*48a54d36SAndroid Build Coastguard Worker 					"%s"		// ASCII
2279*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Byte Count
2280*48a54d36SAndroid Build Coastguard Worker 					"%s", 		// Newline
2281*48a54d36SAndroid Build Coastguard Worker 					inIndent, "",
2282*48a54d36SAndroid Build Coastguard Worker 					( src != start ) ? separator : "",
2283*48a54d36SAndroid Build Coastguard Worker 					prefixString,
2284*48a54d36SAndroid Build Coastguard Worker 					width, (int) inLabelSize, inLabel ? inLabel : "",
2285*48a54d36SAndroid Build Coastguard Worker 					( width > 0 ) ? " " : "",
2286*48a54d36SAndroid Build Coastguard Worker 					hexString,
2287*48a54d36SAndroid Build Coastguard Worker 					asciiString,
2288*48a54d36SAndroid Build Coastguard Worker 					byteCountString,
2289*48a54d36SAndroid Build Coastguard Worker 					newline );
2290*48a54d36SAndroid Build Coastguard Worker 			}
2291*48a54d36SAndroid Build Coastguard Worker 			else
2292*48a54d36SAndroid Build Coastguard Worker 			{
2293*48a54d36SAndroid Build Coastguard Worker 				dst += DebugSNPrintF( dst, (size_t)( end - dst ),
2294*48a54d36SAndroid Build Coastguard Worker 					"%*s"		// Indention
2295*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Separator (only if needed)
2296*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Prefix
2297*48a54d36SAndroid Build Coastguard Worker 					"%*s"		// Label Spacing
2298*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Separator
2299*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Hex
2300*48a54d36SAndroid Build Coastguard Worker 					"%s"		// ASCII
2301*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Byte Count
2302*48a54d36SAndroid Build Coastguard Worker 					"%s", 		// Newline
2303*48a54d36SAndroid Build Coastguard Worker 					inIndent, "",
2304*48a54d36SAndroid Build Coastguard Worker 					( src != start ) ? separator : "",
2305*48a54d36SAndroid Build Coastguard Worker 					prefixString,
2306*48a54d36SAndroid Build Coastguard Worker 					width, "",
2307*48a54d36SAndroid Build Coastguard Worker 					( width > 0 ) ? " " : "",
2308*48a54d36SAndroid Build Coastguard Worker 					hexString,
2309*48a54d36SAndroid Build Coastguard Worker 					asciiString,
2310*48a54d36SAndroid Build Coastguard Worker 					byteCountString,
2311*48a54d36SAndroid Build Coastguard Worker 					newline );
2312*48a54d36SAndroid Build Coastguard Worker 			}
2313*48a54d36SAndroid Build Coastguard Worker 		}
2314*48a54d36SAndroid Build Coastguard Worker 		else
2315*48a54d36SAndroid Build Coastguard Worker 		{
2316*48a54d36SAndroid Build Coastguard Worker 			if( src == start )
2317*48a54d36SAndroid Build Coastguard Worker 			{
2318*48a54d36SAndroid Build Coastguard Worker 				dst += DebugPrintF( inLevel,
2319*48a54d36SAndroid Build Coastguard Worker 					"%*s"		// Indention
2320*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Separator (only if needed)
2321*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Prefix
2322*48a54d36SAndroid Build Coastguard Worker 					"%-*.*s"	// Label
2323*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Separator
2324*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Hex
2325*48a54d36SAndroid Build Coastguard Worker 					"%s"		// ASCII
2326*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Byte Count
2327*48a54d36SAndroid Build Coastguard Worker 					"%s", 		// Newline
2328*48a54d36SAndroid Build Coastguard Worker 					inIndent, "",
2329*48a54d36SAndroid Build Coastguard Worker 					( src != start ) ? separator : "",
2330*48a54d36SAndroid Build Coastguard Worker 					prefixString,
2331*48a54d36SAndroid Build Coastguard Worker 					width, (int) inLabelSize, inLabel,
2332*48a54d36SAndroid Build Coastguard Worker 					( width > 0 ) ? " " : "",
2333*48a54d36SAndroid Build Coastguard Worker 					hexString,
2334*48a54d36SAndroid Build Coastguard Worker 					asciiString,
2335*48a54d36SAndroid Build Coastguard Worker 					byteCountString,
2336*48a54d36SAndroid Build Coastguard Worker 					newline );
2337*48a54d36SAndroid Build Coastguard Worker 			}
2338*48a54d36SAndroid Build Coastguard Worker 			else
2339*48a54d36SAndroid Build Coastguard Worker 			{
2340*48a54d36SAndroid Build Coastguard Worker 				dst += DebugPrintF( inLevel,
2341*48a54d36SAndroid Build Coastguard Worker 					"%*s"		// Indention
2342*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Separator (only if needed)
2343*48a54d36SAndroid Build Coastguard Worker 					"%s" 		// Prefix
2344*48a54d36SAndroid Build Coastguard Worker 					"%*s"		// Label Spacing
2345*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Separator
2346*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Hex
2347*48a54d36SAndroid Build Coastguard Worker 					"%s"		// ASCII
2348*48a54d36SAndroid Build Coastguard Worker 					"%s"		// Byte Count
2349*48a54d36SAndroid Build Coastguard Worker 					"%s", 		// Newline
2350*48a54d36SAndroid Build Coastguard Worker 					inIndent, "",
2351*48a54d36SAndroid Build Coastguard Worker 					( src != start ) ? separator : "",
2352*48a54d36SAndroid Build Coastguard Worker 					prefixString,
2353*48a54d36SAndroid Build Coastguard Worker 					width, "",
2354*48a54d36SAndroid Build Coastguard Worker 					( width > 0 ) ? " " : "",
2355*48a54d36SAndroid Build Coastguard Worker 					hexString,
2356*48a54d36SAndroid Build Coastguard Worker 					asciiString,
2357*48a54d36SAndroid Build Coastguard Worker 					byteCountString,
2358*48a54d36SAndroid Build Coastguard Worker 					newline );
2359*48a54d36SAndroid Build Coastguard Worker 			}
2360*48a54d36SAndroid Build Coastguard Worker 		}
2361*48a54d36SAndroid Build Coastguard Worker 
2362*48a54d36SAndroid Build Coastguard Worker 		// Move to the next chunk. Exit if there is no more data.
2363*48a54d36SAndroid Build Coastguard Worker 
2364*48a54d36SAndroid Build Coastguard Worker 		offset		+= (int) chunkSize;
2365*48a54d36SAndroid Build Coastguard Worker 		src 		+= chunkSize;
2366*48a54d36SAndroid Build Coastguard Worker 		inDataSize	-= chunkSize;
2367*48a54d36SAndroid Build Coastguard Worker 		if( inDataSize == 0 )
2368*48a54d36SAndroid Build Coastguard Worker 		{
2369*48a54d36SAndroid Build Coastguard Worker 			break;
2370*48a54d36SAndroid Build Coastguard Worker 		}
2371*48a54d36SAndroid Build Coastguard Worker 	}
2372*48a54d36SAndroid Build Coastguard Worker 
2373*48a54d36SAndroid Build Coastguard Worker 	// Note: The "dst - outBuffer" size calculation works even if "outBuffer" is NULL because it's all relative.
2374*48a54d36SAndroid Build Coastguard Worker 
2375*48a54d36SAndroid Build Coastguard Worker 	return( (size_t)( dst - outBuffer ) );
2376*48a54d36SAndroid Build Coastguard Worker }
2377*48a54d36SAndroid Build Coastguard Worker 
2378*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2379*48a54d36SAndroid Build Coastguard Worker //	DebugNumVersionToString
2380*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2381*48a54d36SAndroid Build Coastguard Worker 
DebugNumVersionToString(uint32_t inVersion,char * inString)2382*48a54d36SAndroid Build Coastguard Worker static char *	DebugNumVersionToString( uint32_t inVersion, char *inString )
2383*48a54d36SAndroid Build Coastguard Worker {
2384*48a54d36SAndroid Build Coastguard Worker 	char *		s;
2385*48a54d36SAndroid Build Coastguard Worker 	uint8_t		majorRev;
2386*48a54d36SAndroid Build Coastguard Worker 	uint8_t		minor;
2387*48a54d36SAndroid Build Coastguard Worker 	uint8_t		bugFix;
2388*48a54d36SAndroid Build Coastguard Worker 	uint8_t		stage;
2389*48a54d36SAndroid Build Coastguard Worker 	uint8_t		revision;
2390*48a54d36SAndroid Build Coastguard Worker 
2391*48a54d36SAndroid Build Coastguard Worker 	check( inString );
2392*48a54d36SAndroid Build Coastguard Worker 
2393*48a54d36SAndroid Build Coastguard Worker 	majorRev 	= (uint8_t)( ( inVersion >> 24 ) & 0xFF );
2394*48a54d36SAndroid Build Coastguard Worker 	minor		= (uint8_t)( ( inVersion >> 20 ) & 0x0F );
2395*48a54d36SAndroid Build Coastguard Worker 	bugFix		= (uint8_t)( ( inVersion >> 16 ) & 0x0F );
2396*48a54d36SAndroid Build Coastguard Worker 	stage 		= (uint8_t)( ( inVersion >>  8 ) & 0xFF );
2397*48a54d36SAndroid Build Coastguard Worker 	revision 	= (uint8_t)(   inVersion         & 0xFF );
2398*48a54d36SAndroid Build Coastguard Worker 
2399*48a54d36SAndroid Build Coastguard Worker 	// Convert the major, minor, and bugfix numbers.
2400*48a54d36SAndroid Build Coastguard Worker 
2401*48a54d36SAndroid Build Coastguard Worker 	s  = inString;
2402*48a54d36SAndroid Build Coastguard Worker 	s += sprintf( s, "%u", majorRev );
2403*48a54d36SAndroid Build Coastguard Worker 	s += sprintf( s, ".%u", minor );
2404*48a54d36SAndroid Build Coastguard Worker 	if( bugFix != 0 )
2405*48a54d36SAndroid Build Coastguard Worker 	{
2406*48a54d36SAndroid Build Coastguard Worker 		s += sprintf( s, ".%u", bugFix );
2407*48a54d36SAndroid Build Coastguard Worker 	}
2408*48a54d36SAndroid Build Coastguard Worker 
2409*48a54d36SAndroid Build Coastguard Worker 	// Convert the version stage and non-release revision number.
2410*48a54d36SAndroid Build Coastguard Worker 
2411*48a54d36SAndroid Build Coastguard Worker 	switch( stage )
2412*48a54d36SAndroid Build Coastguard Worker 	{
2413*48a54d36SAndroid Build Coastguard Worker 		case kVersionStageDevelopment:
2414*48a54d36SAndroid Build Coastguard Worker 			s += sprintf( s, "d%u", revision );
2415*48a54d36SAndroid Build Coastguard Worker 			break;
2416*48a54d36SAndroid Build Coastguard Worker 
2417*48a54d36SAndroid Build Coastguard Worker 		case kVersionStageAlpha:
2418*48a54d36SAndroid Build Coastguard Worker 			s += sprintf( s, "a%u", revision );
2419*48a54d36SAndroid Build Coastguard Worker 			break;
2420*48a54d36SAndroid Build Coastguard Worker 
2421*48a54d36SAndroid Build Coastguard Worker 		case kVersionStageBeta:
2422*48a54d36SAndroid Build Coastguard Worker 			s += sprintf( s, "b%u", revision );
2423*48a54d36SAndroid Build Coastguard Worker 			break;
2424*48a54d36SAndroid Build Coastguard Worker 
2425*48a54d36SAndroid Build Coastguard Worker 		case kVersionStageFinal:
2426*48a54d36SAndroid Build Coastguard Worker 
2427*48a54d36SAndroid Build Coastguard Worker 			// A non-release revision of zero is a special case indicating the software is GM (at the golden master
2428*48a54d36SAndroid Build Coastguard Worker 			// stage) and therefore, the non-release revision should not be added to the string.
2429*48a54d36SAndroid Build Coastguard Worker 
2430*48a54d36SAndroid Build Coastguard Worker 			if( revision != 0 )
2431*48a54d36SAndroid Build Coastguard Worker 			{
2432*48a54d36SAndroid Build Coastguard Worker 				s += sprintf( s, "f%u", revision );
2433*48a54d36SAndroid Build Coastguard Worker 			}
2434*48a54d36SAndroid Build Coastguard Worker 			break;
2435*48a54d36SAndroid Build Coastguard Worker 
2436*48a54d36SAndroid Build Coastguard Worker 		default:
2437*48a54d36SAndroid Build Coastguard Worker 			dlog( kDebugLevelError, "invalid NumVersion stage (0x%02X)\n", stage );
2438*48a54d36SAndroid Build Coastguard Worker 			break;
2439*48a54d36SAndroid Build Coastguard Worker 	}
2440*48a54d36SAndroid Build Coastguard Worker 	return( inString );
2441*48a54d36SAndroid Build Coastguard Worker }
2442*48a54d36SAndroid Build Coastguard Worker 
2443*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2444*48a54d36SAndroid Build Coastguard Worker //	DebugTaskLevel
2445*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2446*48a54d36SAndroid Build Coastguard Worker 
DebugTaskLevel(void)2447*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT uint32_t	DebugTaskLevel( void )
2448*48a54d36SAndroid Build Coastguard Worker {
2449*48a54d36SAndroid Build Coastguard Worker 	uint32_t		level;
2450*48a54d36SAndroid Build Coastguard Worker 
2451*48a54d36SAndroid Build Coastguard Worker 	level = 0;
2452*48a54d36SAndroid Build Coastguard Worker 
2453*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS )
2454*48a54d36SAndroid Build Coastguard Worker 	if( intContext() )
2455*48a54d36SAndroid Build Coastguard Worker 	{
2456*48a54d36SAndroid Build Coastguard Worker 		level |= ( ( 1 << kDebugInterruptLevelShift ) & kDebugInterruptLevelMask );
2457*48a54d36SAndroid Build Coastguard Worker 	}
2458*48a54d36SAndroid Build Coastguard Worker #endif
2459*48a54d36SAndroid Build Coastguard Worker 
2460*48a54d36SAndroid Build Coastguard Worker 	return( level );
2461*48a54d36SAndroid Build Coastguard Worker }
2462*48a54d36SAndroid Build Coastguard Worker 
2463*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE )
2464*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2465*48a54d36SAndroid Build Coastguard Worker //	DebugWinEnableConsole
2466*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2467*48a54d36SAndroid Build Coastguard Worker 
2468*48a54d36SAndroid Build Coastguard Worker #pragma warning( disable:4311 )
2469*48a54d36SAndroid Build Coastguard Worker 
DebugWinEnableConsole(void)2470*48a54d36SAndroid Build Coastguard Worker static void	DebugWinEnableConsole( void )
2471*48a54d36SAndroid Build Coastguard Worker {
2472*48a54d36SAndroid Build Coastguard Worker 	static bool		sConsoleEnabled = false;
2473*48a54d36SAndroid Build Coastguard Worker 	BOOL			result;
2474*48a54d36SAndroid Build Coastguard Worker 	int				fileHandle;
2475*48a54d36SAndroid Build Coastguard Worker 	FILE *			file;
2476*48a54d36SAndroid Build Coastguard Worker 	int				err;
2477*48a54d36SAndroid Build Coastguard Worker 
2478*48a54d36SAndroid Build Coastguard Worker 	if( sConsoleEnabled )
2479*48a54d36SAndroid Build Coastguard Worker 	{
2480*48a54d36SAndroid Build Coastguard Worker 		goto exit;
2481*48a54d36SAndroid Build Coastguard Worker 	}
2482*48a54d36SAndroid Build Coastguard Worker 
2483*48a54d36SAndroid Build Coastguard Worker 	// Create console window.
2484*48a54d36SAndroid Build Coastguard Worker 
2485*48a54d36SAndroid Build Coastguard Worker 	result = AllocConsole();
2486*48a54d36SAndroid Build Coastguard Worker 	require_quiet( result, exit );
2487*48a54d36SAndroid Build Coastguard Worker 
2488*48a54d36SAndroid Build Coastguard Worker 	// Redirect stdin to the console stdin.
2489*48a54d36SAndroid Build Coastguard Worker 
2490*48a54d36SAndroid Build Coastguard Worker 	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_INPUT_HANDLE ), _O_TEXT );
2491*48a54d36SAndroid Build Coastguard Worker 
2492*48a54d36SAndroid Build Coastguard Worker 	#if( defined( __MWERKS__ ) )
2493*48a54d36SAndroid Build Coastguard Worker 		file = __handle_reopen( (unsigned long) fileHandle, "r", stdin );
2494*48a54d36SAndroid Build Coastguard Worker 		require_quiet( file, exit );
2495*48a54d36SAndroid Build Coastguard Worker 	#else
2496*48a54d36SAndroid Build Coastguard Worker 		file = _fdopen( fileHandle, "r" );
2497*48a54d36SAndroid Build Coastguard Worker 		require_quiet( file, exit );
2498*48a54d36SAndroid Build Coastguard Worker 
2499*48a54d36SAndroid Build Coastguard Worker 		*stdin = *file;
2500*48a54d36SAndroid Build Coastguard Worker 	#endif
2501*48a54d36SAndroid Build Coastguard Worker 
2502*48a54d36SAndroid Build Coastguard Worker 	err = setvbuf( stdin, NULL, _IONBF, 0 );
2503*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
2504*48a54d36SAndroid Build Coastguard Worker 
2505*48a54d36SAndroid Build Coastguard Worker 	// Redirect stdout to the console stdout.
2506*48a54d36SAndroid Build Coastguard Worker 
2507*48a54d36SAndroid Build Coastguard Worker 	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_OUTPUT_HANDLE ), _O_TEXT );
2508*48a54d36SAndroid Build Coastguard Worker 
2509*48a54d36SAndroid Build Coastguard Worker 	#if( defined( __MWERKS__ ) )
2510*48a54d36SAndroid Build Coastguard Worker 		file = __handle_reopen( (unsigned long) fileHandle, "w", stdout );
2511*48a54d36SAndroid Build Coastguard Worker 		require_quiet( file, exit );
2512*48a54d36SAndroid Build Coastguard Worker 	#else
2513*48a54d36SAndroid Build Coastguard Worker 		file = _fdopen( fileHandle, "w" );
2514*48a54d36SAndroid Build Coastguard Worker 		require_quiet( file, exit );
2515*48a54d36SAndroid Build Coastguard Worker 
2516*48a54d36SAndroid Build Coastguard Worker 		*stdout = *file;
2517*48a54d36SAndroid Build Coastguard Worker 	#endif
2518*48a54d36SAndroid Build Coastguard Worker 
2519*48a54d36SAndroid Build Coastguard Worker 	err = setvbuf( stdout, NULL, _IONBF, 0 );
2520*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
2521*48a54d36SAndroid Build Coastguard Worker 
2522*48a54d36SAndroid Build Coastguard Worker 	// Redirect stderr to the console stdout.
2523*48a54d36SAndroid Build Coastguard Worker 
2524*48a54d36SAndroid Build Coastguard Worker 	fileHandle = _open_osfhandle( (long) GetStdHandle( STD_OUTPUT_HANDLE ), _O_TEXT );
2525*48a54d36SAndroid Build Coastguard Worker 
2526*48a54d36SAndroid Build Coastguard Worker 	#if( defined( __MWERKS__ ) )
2527*48a54d36SAndroid Build Coastguard Worker 		file = __handle_reopen( (unsigned long) fileHandle, "w", stderr );
2528*48a54d36SAndroid Build Coastguard Worker 		require_quiet( file, exit );
2529*48a54d36SAndroid Build Coastguard Worker 	#else
2530*48a54d36SAndroid Build Coastguard Worker 		file = _fdopen( fileHandle, "w" );
2531*48a54d36SAndroid Build Coastguard Worker 		require_quiet( file, exit );
2532*48a54d36SAndroid Build Coastguard Worker 
2533*48a54d36SAndroid Build Coastguard Worker 		*stderr = *file;
2534*48a54d36SAndroid Build Coastguard Worker 	#endif
2535*48a54d36SAndroid Build Coastguard Worker 
2536*48a54d36SAndroid Build Coastguard Worker 	err = setvbuf( stderr, NULL, _IONBF, 0 );
2537*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( err, exit );
2538*48a54d36SAndroid Build Coastguard Worker 
2539*48a54d36SAndroid Build Coastguard Worker 	sConsoleEnabled = true;
2540*48a54d36SAndroid Build Coastguard Worker 
2541*48a54d36SAndroid Build Coastguard Worker exit:
2542*48a54d36SAndroid Build Coastguard Worker 	return;
2543*48a54d36SAndroid Build Coastguard Worker }
2544*48a54d36SAndroid Build Coastguard Worker 
2545*48a54d36SAndroid Build Coastguard Worker #pragma warning( default:4311 )
2546*48a54d36SAndroid Build Coastguard Worker 
2547*48a54d36SAndroid Build Coastguard Worker #endif	// TARGET_OS_WIN32 && !TARGET_OS_WINDOWS_CE
2548*48a54d36SAndroid Build Coastguard Worker 
2549*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_WIN32 )
2550*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2551*48a54d36SAndroid Build Coastguard Worker //	DebugWinCharToTCharString
2552*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2553*48a54d36SAndroid Build Coastguard Worker 
2554*48a54d36SAndroid Build Coastguard Worker static TCHAR *
DebugWinCharToTCharString(const char * inCharString,size_t inCharCount,TCHAR * outTCharString,size_t inTCharCountMax,size_t * outTCharCount)2555*48a54d36SAndroid Build Coastguard Worker 	DebugWinCharToTCharString(
2556*48a54d36SAndroid Build Coastguard Worker 		const char *	inCharString,
2557*48a54d36SAndroid Build Coastguard Worker 		size_t 			inCharCount,
2558*48a54d36SAndroid Build Coastguard Worker 		TCHAR *			outTCharString,
2559*48a54d36SAndroid Build Coastguard Worker 		size_t 			inTCharCountMax,
2560*48a54d36SAndroid Build Coastguard Worker 		size_t *		outTCharCount )
2561*48a54d36SAndroid Build Coastguard Worker {
2562*48a54d36SAndroid Build Coastguard Worker 	const char *		src;
2563*48a54d36SAndroid Build Coastguard Worker 	TCHAR *				dst;
2564*48a54d36SAndroid Build Coastguard Worker 	TCHAR *				end;
2565*48a54d36SAndroid Build Coastguard Worker 
2566*48a54d36SAndroid Build Coastguard Worker 	if( inCharCount == kSizeCString )
2567*48a54d36SAndroid Build Coastguard Worker 	{
2568*48a54d36SAndroid Build Coastguard Worker 		inCharCount = strlen( inCharString );
2569*48a54d36SAndroid Build Coastguard Worker 	}
2570*48a54d36SAndroid Build Coastguard Worker 	src = inCharString;
2571*48a54d36SAndroid Build Coastguard Worker 	dst = outTCharString;
2572*48a54d36SAndroid Build Coastguard Worker 	if( inTCharCountMax > 0 )
2573*48a54d36SAndroid Build Coastguard Worker 	{
2574*48a54d36SAndroid Build Coastguard Worker 		inTCharCountMax -= 1;
2575*48a54d36SAndroid Build Coastguard Worker 		if( inTCharCountMax > inCharCount )
2576*48a54d36SAndroid Build Coastguard Worker 		{
2577*48a54d36SAndroid Build Coastguard Worker 			inTCharCountMax = inCharCount;
2578*48a54d36SAndroid Build Coastguard Worker 		}
2579*48a54d36SAndroid Build Coastguard Worker 
2580*48a54d36SAndroid Build Coastguard Worker 		end = dst + inTCharCountMax;
2581*48a54d36SAndroid Build Coastguard Worker 		while( dst < end )
2582*48a54d36SAndroid Build Coastguard Worker 		{
2583*48a54d36SAndroid Build Coastguard Worker 			*dst++ = (TCHAR) *src++;
2584*48a54d36SAndroid Build Coastguard Worker 		}
2585*48a54d36SAndroid Build Coastguard Worker 		*dst = 0;
2586*48a54d36SAndroid Build Coastguard Worker 	}
2587*48a54d36SAndroid Build Coastguard Worker 	if( outTCharCount )
2588*48a54d36SAndroid Build Coastguard Worker 	{
2589*48a54d36SAndroid Build Coastguard Worker 		*outTCharCount = (size_t)( dst - outTCharString );
2590*48a54d36SAndroid Build Coastguard Worker 	}
2591*48a54d36SAndroid Build Coastguard Worker 	return( outTCharString );
2592*48a54d36SAndroid Build Coastguard Worker }
2593*48a54d36SAndroid Build Coastguard Worker #endif
2594*48a54d36SAndroid Build Coastguard Worker 
2595*48a54d36SAndroid Build Coastguard Worker #if 0
2596*48a54d36SAndroid Build Coastguard Worker #pragma mark -
2597*48a54d36SAndroid Build Coastguard Worker #pragma mark == Debugging ==
2598*48a54d36SAndroid Build Coastguard Worker #endif
2599*48a54d36SAndroid Build Coastguard Worker 
2600*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2601*48a54d36SAndroid Build Coastguard Worker //	DebugServicesTest
2602*48a54d36SAndroid Build Coastguard Worker //===========================================================================================================================
2603*48a54d36SAndroid Build Coastguard Worker 
DebugServicesTest(void)2604*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus	DebugServicesTest( void )
2605*48a54d36SAndroid Build Coastguard Worker {
2606*48a54d36SAndroid Build Coastguard Worker 	OSStatus		err;
2607*48a54d36SAndroid Build Coastguard Worker 	char			s[ 512 ];
2608*48a54d36SAndroid Build Coastguard Worker 	uint8_t *		p;
2609*48a54d36SAndroid Build Coastguard Worker 	uint8_t			data[] =
2610*48a54d36SAndroid Build Coastguard Worker 	{
2611*48a54d36SAndroid Build Coastguard Worker 		0x11, 0x22, 0x33, 0x44,
2612*48a54d36SAndroid Build Coastguard Worker 		0x55, 0x66,
2613*48a54d36SAndroid Build Coastguard Worker 		0x77, 0x88, 0x99, 0xAA,
2614*48a54d36SAndroid Build Coastguard Worker 		0xBB, 0xCC, 0xDD,
2615*48a54d36SAndroid Build Coastguard Worker 		0xEE,
2616*48a54d36SAndroid Build Coastguard Worker 		0xFF,
2617*48a54d36SAndroid Build Coastguard Worker 		0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A,
2618*48a54d36SAndroid Build Coastguard Worker 		0x10, 0x20, 0x30, 0x40, 0x50, 0x60, 0x70, 0x80, 0x90, 0xA0,
2619*48a54d36SAndroid Build Coastguard Worker 		0x11, 0x21, 0x31, 0x41, 0x51, 0x61, 0x71, 0x81, 0x91, 0xA1
2620*48a54d36SAndroid Build Coastguard Worker 	};
2621*48a54d36SAndroid Build Coastguard Worker 
2622*48a54d36SAndroid Build Coastguard Worker 	debug_initialize( kDebugOutputTypeMetaConsole );
2623*48a54d36SAndroid Build Coastguard Worker 
2624*48a54d36SAndroid Build Coastguard Worker 	// check's
2625*48a54d36SAndroid Build Coastguard Worker 
2626*48a54d36SAndroid Build Coastguard Worker 	check( 0 && "SHOULD SEE: check" );
2627*48a54d36SAndroid Build Coastguard Worker 	check( 1 && "SHOULD *NOT* SEE: check (valid)" );
2628*48a54d36SAndroid Build Coastguard Worker 	check_string( 0, "SHOULD SEE: check_string" );
2629*48a54d36SAndroid Build Coastguard Worker 	check_string( 1, "SHOULD *NOT* SEE: check_string (valid)" );
2630*48a54d36SAndroid Build Coastguard Worker 	check_noerr( -123 );
2631*48a54d36SAndroid Build Coastguard Worker 	check_noerr( 10038 );
2632*48a54d36SAndroid Build Coastguard Worker 	check_noerr( 22 );
2633*48a54d36SAndroid Build Coastguard Worker 	check_noerr( 0 );
2634*48a54d36SAndroid Build Coastguard Worker 	check_noerr_string( -6712, "SHOULD SEE: check_noerr_string" );
2635*48a54d36SAndroid Build Coastguard Worker 	check_noerr_string( 0, "SHOULD *NOT* SEE: check_noerr_string (valid)" );
2636*48a54d36SAndroid Build Coastguard Worker 	check_translated_errno( 0 >= 0 && "SHOULD *NOT* SEE", -384, -999 );
2637*48a54d36SAndroid Build Coastguard Worker 	check_translated_errno( -1 >= 0 && "SHOULD SEE", -384, -999 );
2638*48a54d36SAndroid Build Coastguard Worker 	check_translated_errno( -1 >= 0 && "SHOULD SEE", 0, -999 );
2639*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD *NOT* SEE" ? 10 : 0, 10, 22, 10 );
2640*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD SEE" ? 10 : 0, 10,  5, 10 );
2641*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD SEE" ? 10 : 0, 10, 12,  6 );
2642*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD SEE" ? 12 : 0,  6, 10, 10 );
2643*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD SEE" ? 12 : 0, 10, 10, 10 );
2644*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD *NOT* SEE" ? 22 : 0, 10, 10, 10 );
2645*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD *NOT* SEE" ? 10 : 0, 10, 20, 10 );
2646*48a54d36SAndroid Build Coastguard Worker 	check_ptr_overlap( "SHOULD *NOT* SEE" ? 20 : 0, 10, 10, 10 );
2647*48a54d36SAndroid Build Coastguard Worker 
2648*48a54d36SAndroid Build Coastguard Worker 	// require's
2649*48a54d36SAndroid Build Coastguard Worker 
2650*48a54d36SAndroid Build Coastguard Worker 	require( 0 && "SHOULD SEE", require1 );
2651*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2652*48a54d36SAndroid Build Coastguard Worker require1:
2653*48a54d36SAndroid Build Coastguard Worker 	require( 1 && "SHOULD *NOT* SEE", require2 );
2654*48a54d36SAndroid Build Coastguard Worker 	goto require2Good;
2655*48a54d36SAndroid Build Coastguard Worker require2:
2656*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2657*48a54d36SAndroid Build Coastguard Worker require2Good:
2658*48a54d36SAndroid Build Coastguard Worker 	require_string( 0 && "SHOULD SEE", require3, "SHOULD SEE: require_string" );
2659*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2660*48a54d36SAndroid Build Coastguard Worker require3:
2661*48a54d36SAndroid Build Coastguard Worker 	require_string( 1 && "SHOULD *NOT* SEE", require4, "SHOULD *NOT* SEE: require_string (valid)" );
2662*48a54d36SAndroid Build Coastguard Worker 	goto require4Good;
2663*48a54d36SAndroid Build Coastguard Worker require4:
2664*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2665*48a54d36SAndroid Build Coastguard Worker require4Good:
2666*48a54d36SAndroid Build Coastguard Worker 	require_quiet( 0 && "SHOULD SEE", require5 );
2667*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2668*48a54d36SAndroid Build Coastguard Worker require5:
2669*48a54d36SAndroid Build Coastguard Worker 	require_quiet( 1 && "SHOULD *NOT* SEE", require6 );
2670*48a54d36SAndroid Build Coastguard Worker 	goto require6Good;
2671*48a54d36SAndroid Build Coastguard Worker require6:
2672*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2673*48a54d36SAndroid Build Coastguard Worker require6Good:
2674*48a54d36SAndroid Build Coastguard Worker 	require_noerr( -1, require7 );
2675*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2676*48a54d36SAndroid Build Coastguard Worker require7:
2677*48a54d36SAndroid Build Coastguard Worker 	require_noerr( 0, require8 );
2678*48a54d36SAndroid Build Coastguard Worker 	goto require8Good;
2679*48a54d36SAndroid Build Coastguard Worker require8:
2680*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2681*48a54d36SAndroid Build Coastguard Worker require8Good:
2682*48a54d36SAndroid Build Coastguard Worker 	require_noerr_string( -2, require9, "SHOULD SEE: require_noerr_string");
2683*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2684*48a54d36SAndroid Build Coastguard Worker require9:
2685*48a54d36SAndroid Build Coastguard Worker 	require_noerr_string( 0, require10, "SHOULD *NOT* SEE: require_noerr_string (valid)" );
2686*48a54d36SAndroid Build Coastguard Worker 	goto require10Good;
2687*48a54d36SAndroid Build Coastguard Worker require10:
2688*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2689*48a54d36SAndroid Build Coastguard Worker require10Good:
2690*48a54d36SAndroid Build Coastguard Worker 	require_noerr_action_string( -3, require11, dlog( kDebugLevelMax, "action 1 (expected)\n" ), "require_noerr_action_string" );
2691*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2692*48a54d36SAndroid Build Coastguard Worker require11:
2693*48a54d36SAndroid Build Coastguard Worker 	require_noerr_action_string( 0, require12, dlog( kDebugLevelMax, "action 2\n" ), "require_noerr_action_string (valid)" );
2694*48a54d36SAndroid Build Coastguard Worker 	goto require12Good;
2695*48a54d36SAndroid Build Coastguard Worker require12:
2696*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2697*48a54d36SAndroid Build Coastguard Worker require12Good:
2698*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( -4, require13 );
2699*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2700*48a54d36SAndroid Build Coastguard Worker require13:
2701*48a54d36SAndroid Build Coastguard Worker 	require_noerr_quiet( 0, require14 );
2702*48a54d36SAndroid Build Coastguard Worker 	goto require14Good;
2703*48a54d36SAndroid Build Coastguard Worker require14:
2704*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2705*48a54d36SAndroid Build Coastguard Worker require14Good:
2706*48a54d36SAndroid Build Coastguard Worker 	require_noerr_action( -5, require15, dlog( kDebugLevelMax, "SHOULD SEE: action 3 (expected)\n" ) );
2707*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2708*48a54d36SAndroid Build Coastguard Worker require15:
2709*48a54d36SAndroid Build Coastguard Worker 	require_noerr_action( 0, require16, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 4\n" ) );
2710*48a54d36SAndroid Build Coastguard Worker 	goto require16Good;
2711*48a54d36SAndroid Build Coastguard Worker require16:
2712*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2713*48a54d36SAndroid Build Coastguard Worker require16Good:
2714*48a54d36SAndroid Build Coastguard Worker 	require_noerr_action_quiet( -4, require17, dlog( kDebugLevelMax, "SHOULD SEE: action 5 (expected)\n" ) );
2715*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2716*48a54d36SAndroid Build Coastguard Worker require17:
2717*48a54d36SAndroid Build Coastguard Worker 	require_noerr_action_quiet( 0, require18, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 6\n" ) );
2718*48a54d36SAndroid Build Coastguard Worker 	goto require18Good;
2719*48a54d36SAndroid Build Coastguard Worker require18:
2720*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2721*48a54d36SAndroid Build Coastguard Worker require18Good:
2722*48a54d36SAndroid Build Coastguard Worker 	require_action( 0 && "SHOULD SEE", require19, dlog( kDebugLevelMax, "SHOULD SEE: action 7 (expected)\n" ) );
2723*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2724*48a54d36SAndroid Build Coastguard Worker require19:
2725*48a54d36SAndroid Build Coastguard Worker 	require_action( 1 && "SHOULD *NOT* SEE", require20, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 8\n" ) );
2726*48a54d36SAndroid Build Coastguard Worker 	goto require20Good;
2727*48a54d36SAndroid Build Coastguard Worker require20:
2728*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2729*48a54d36SAndroid Build Coastguard Worker require20Good:
2730*48a54d36SAndroid Build Coastguard Worker 	require_action_quiet( 0, require21, dlog( kDebugLevelMax, "SHOULD SEE: action 9 (expected)\n" ) );
2731*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2732*48a54d36SAndroid Build Coastguard Worker require21:
2733*48a54d36SAndroid Build Coastguard Worker 	require_action_quiet( 1, require22, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 10\n" ) );
2734*48a54d36SAndroid Build Coastguard Worker 	goto require22Good;
2735*48a54d36SAndroid Build Coastguard Worker require22:
2736*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2737*48a54d36SAndroid Build Coastguard Worker require22Good:
2738*48a54d36SAndroid Build Coastguard Worker 	require_action_string( 0, require23, dlog( kDebugLevelMax, "SHOULD SEE: action 11 (expected)\n" ), "SHOULD SEE: require_action_string" );
2739*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2740*48a54d36SAndroid Build Coastguard Worker require23:
2741*48a54d36SAndroid Build Coastguard Worker 	require_action_string( 1, require24, dlog( kDebugLevelMax, "SHOULD *NOT* SEE: action 12\n" ), "SHOULD *NOT* SEE: require_action_string" );
2742*48a54d36SAndroid Build Coastguard Worker 	goto require24Good;
2743*48a54d36SAndroid Build Coastguard Worker require24:
2744*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2745*48a54d36SAndroid Build Coastguard Worker require24Good:
2746*48a54d36SAndroid Build Coastguard Worker 
2747*48a54d36SAndroid Build Coastguard Worker #if( defined( __MWERKS__ )  )
2748*48a54d36SAndroid Build Coastguard Worker 	#if( defined( __cplusplus ) && __option( exceptions ) )
2749*48a54d36SAndroid Build Coastguard Worker 		#define COMPILER_HAS_EXCEPTIONS		1
2750*48a54d36SAndroid Build Coastguard Worker 	#else
2751*48a54d36SAndroid Build Coastguard Worker 		#define COMPILER_HAS_EXCEPTIONS		0
2752*48a54d36SAndroid Build Coastguard Worker 	#endif
2753*48a54d36SAndroid Build Coastguard Worker #else
2754*48a54d36SAndroid Build Coastguard Worker 	#if( defined( __cplusplus ) )
2755*48a54d36SAndroid Build Coastguard Worker 		#define COMPILER_HAS_EXCEPTIONS		1
2756*48a54d36SAndroid Build Coastguard Worker 	#else
2757*48a54d36SAndroid Build Coastguard Worker 		#define COMPILER_HAS_EXCEPTIONS		0
2758*48a54d36SAndroid Build Coastguard Worker 	#endif
2759*48a54d36SAndroid Build Coastguard Worker #endif
2760*48a54d36SAndroid Build Coastguard Worker 
2761*48a54d36SAndroid Build Coastguard Worker #if( COMPILER_HAS_EXCEPTIONS )
2762*48a54d36SAndroid Build Coastguard Worker 	try
2763*48a54d36SAndroid Build Coastguard Worker 	{
2764*48a54d36SAndroid Build Coastguard Worker 		require_throw( 1 && "SHOULD *NOT* SEE" );
2765*48a54d36SAndroid Build Coastguard Worker 		require_throw( 0 && "SHOULD SEE" );
2766*48a54d36SAndroid Build Coastguard Worker 	}
2767*48a54d36SAndroid Build Coastguard Worker 	catch( ... )
2768*48a54d36SAndroid Build Coastguard Worker 	{
2769*48a54d36SAndroid Build Coastguard Worker 		goto require26Good;
2770*48a54d36SAndroid Build Coastguard Worker 	}
2771*48a54d36SAndroid Build Coastguard Worker 	{ err = kResponseErr; goto exit; }
2772*48a54d36SAndroid Build Coastguard Worker require26Good:
2773*48a54d36SAndroid Build Coastguard Worker #endif
2774*48a54d36SAndroid Build Coastguard Worker 
2775*48a54d36SAndroid Build Coastguard Worker 	// translate_errno
2776*48a54d36SAndroid Build Coastguard Worker 
2777*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( 1 != -1, -123, -567 );
2778*48a54d36SAndroid Build Coastguard Worker 	require( ( err == 0 ) && "SHOULD *NOT* SEE", exit );
2779*48a54d36SAndroid Build Coastguard Worker 
2780*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( -1 != -1, -123, -567 );
2781*48a54d36SAndroid Build Coastguard Worker 	require( ( err == -123 ) && "SHOULD *NOT* SEE", exit );
2782*48a54d36SAndroid Build Coastguard Worker 
2783*48a54d36SAndroid Build Coastguard Worker 	err = translate_errno( -1 != -1, 0, -567 );
2784*48a54d36SAndroid Build Coastguard Worker 	require( ( err == -567 ) && "SHOULD *NOT* SEE", exit );
2785*48a54d36SAndroid Build Coastguard Worker 
2786*48a54d36SAndroid Build Coastguard Worker 	// debug_string
2787*48a54d36SAndroid Build Coastguard Worker 
2788*48a54d36SAndroid Build Coastguard Worker 	debug_string( "debug_string" );
2789*48a54d36SAndroid Build Coastguard Worker 
2790*48a54d36SAndroid Build Coastguard Worker 	// DebugSNPrintF
2791*48a54d36SAndroid Build Coastguard Worker 
2792*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%d", 1234 );
2793*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "1234" ) == 0, exit, err = -1 );
2794*48a54d36SAndroid Build Coastguard Worker 
2795*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%X", 0x2345 );
2796*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "2345" ) == 0, exit, err = -1 );
2797*48a54d36SAndroid Build Coastguard Worker 
2798*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%#s", "\05test" );
2799*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "test" ) == 0, exit, err = -1 );
2800*48a54d36SAndroid Build Coastguard Worker 
2801*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%##s", "\03www\05apple\03com" );
2802*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "www.apple.com." ) == 0, exit, err = -1 );
2803*48a54d36SAndroid Build Coastguard Worker 
2804*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%ld", (long) INT32_C( 2147483647 ) );
2805*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "2147483647" ) == 0, exit, err = -1 );
2806*48a54d36SAndroid Build Coastguard Worker 
2807*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%lu", (unsigned long) UINT32_C( 4294967295 ) );
2808*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "4294967295" ) == 0, exit, err = -1 );
2809*48a54d36SAndroid Build Coastguard Worker 
2810*48a54d36SAndroid Build Coastguard Worker 	#if( TYPE_LONGLONG_NATIVE )
2811*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%lld", (long_long_compat) INT64_C( 9223372036854775807 ) );
2812*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "9223372036854775807" ) == 0, exit, err = -1 );
2813*48a54d36SAndroid Build Coastguard Worker 
2814*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%lld", (long_long_compat) INT64_C( -9223372036854775807 ) );
2815*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "-9223372036854775807" ) == 0, exit, err = -1 );
2816*48a54d36SAndroid Build Coastguard Worker 
2817*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%llu", (unsigned_long_long_compat) UINT64_C( 18446744073709551615 ) );
2818*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "18446744073709551615" ) == 0, exit, err = -1 );
2819*48a54d36SAndroid Build Coastguard Worker 	#endif
2820*48a54d36SAndroid Build Coastguard Worker 
2821*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%lb", (unsigned long) binary_32( 01111011, 01111011, 01111011, 01111011 ) );
2822*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "1111011011110110111101101111011" ) == 0, exit, err = -1 );
2823*48a54d36SAndroid Build Coastguard Worker 
2824*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%C", 0x41624364 );	// 'AbCd'
2825*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "AbCd" ) == 0, exit, err = -1 );
2826*48a54d36SAndroid Build Coastguard Worker 
2827*48a54d36SAndroid Build Coastguard Worker 	#if( defined( MDNS_DEBUGMSGS ) )
2828*48a54d36SAndroid Build Coastguard Worker 	{
2829*48a54d36SAndroid Build Coastguard Worker 		mDNSAddr		maddr;
2830*48a54d36SAndroid Build Coastguard Worker 
2831*48a54d36SAndroid Build Coastguard Worker 		memset( &maddr, 0, sizeof( maddr ) );
2832*48a54d36SAndroid Build Coastguard Worker 		maddr.type = mDNSAddrType_IPv4;
2833*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v4.b[ 0 ] = 127;
2834*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v4.b[ 1 ] = 0;
2835*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v4.b[ 2 ] = 0;
2836*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v4.b[ 3 ] = 1;
2837*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%#a", &maddr );
2838*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "127.0.0.1" ) == 0, exit, err = -1 );
2839*48a54d36SAndroid Build Coastguard Worker 
2840*48a54d36SAndroid Build Coastguard Worker 		memset( &maddr, 0, sizeof( maddr ) );
2841*48a54d36SAndroid Build Coastguard Worker 		maddr.type = mDNSAddrType_IPv6;
2842*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v6.b[  0 ]	= 0xFE;
2843*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v6.b[  1 ]	= 0x80;
2844*48a54d36SAndroid Build Coastguard Worker 		maddr.ip.v6.b[ 15 ]	= 0x01;
2845*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%#a", &maddr );
2846*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "FE80:0000:0000:0000:0000:0000:0000:0001" ) == 0, exit, err = -1 );
2847*48a54d36SAndroid Build Coastguard Worker 	}
2848*48a54d36SAndroid Build Coastguard Worker 	#endif
2849*48a54d36SAndroid Build Coastguard Worker 
2850*48a54d36SAndroid Build Coastguard Worker 	#if( AF_INET )
2851*48a54d36SAndroid Build Coastguard Worker 	{
2852*48a54d36SAndroid Build Coastguard Worker 		struct sockaddr_in		sa4;
2853*48a54d36SAndroid Build Coastguard Worker 
2854*48a54d36SAndroid Build Coastguard Worker 		memset( &sa4, 0, sizeof( sa4 ) );
2855*48a54d36SAndroid Build Coastguard Worker 		sa4.sin_family 		= AF_INET;
2856*48a54d36SAndroid Build Coastguard Worker 		p 					= (uint8_t *) &sa4.sin_port;
2857*48a54d36SAndroid Build Coastguard Worker 		p[ 0 ] 				= (uint8_t)( ( 80 >> 8 ) & 0xFF );
2858*48a54d36SAndroid Build Coastguard Worker 		p[ 1 ] 				= (uint8_t)(   80        & 0xFF );
2859*48a54d36SAndroid Build Coastguard Worker 		p 					= (uint8_t *) &sa4.sin_addr.s_addr;
2860*48a54d36SAndroid Build Coastguard Worker 		p[ 0 ] 				= (uint8_t)( ( INADDR_LOOPBACK >> 24 ) & 0xFF );
2861*48a54d36SAndroid Build Coastguard Worker 		p[ 1 ] 				= (uint8_t)( ( INADDR_LOOPBACK >> 16 ) & 0xFF );
2862*48a54d36SAndroid Build Coastguard Worker 		p[ 2 ] 				= (uint8_t)( ( INADDR_LOOPBACK >>  8 ) & 0xFF );
2863*48a54d36SAndroid Build Coastguard Worker 		p[ 3 ] 				= (uint8_t)(   INADDR_LOOPBACK         & 0xFF );
2864*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%##a", &sa4 );
2865*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "127.0.0.1:80" ) == 0, exit, err = -1 );
2866*48a54d36SAndroid Build Coastguard Worker 	}
2867*48a54d36SAndroid Build Coastguard Worker 	#endif
2868*48a54d36SAndroid Build Coastguard Worker 
2869*48a54d36SAndroid Build Coastguard Worker 	#if( AF_INET6 )
2870*48a54d36SAndroid Build Coastguard Worker 	{
2871*48a54d36SAndroid Build Coastguard Worker 		struct sockaddr_in6		sa6;
2872*48a54d36SAndroid Build Coastguard Worker 
2873*48a54d36SAndroid Build Coastguard Worker 		memset( &sa6, 0, sizeof( sa6 ) );
2874*48a54d36SAndroid Build Coastguard Worker 		sa6.sin6_family 			= AF_INET6;
2875*48a54d36SAndroid Build Coastguard Worker 		p 							= (uint8_t *) &sa6.sin6_port;
2876*48a54d36SAndroid Build Coastguard Worker 		p[ 0 ] 						= (uint8_t)( ( 80 >> 8 ) & 0xFF );
2877*48a54d36SAndroid Build Coastguard Worker 		p[ 1 ] 						= (uint8_t)(   80        & 0xFF );
2878*48a54d36SAndroid Build Coastguard Worker 		sa6.sin6_addr.s6_addr[  0 ]	= 0xFE;
2879*48a54d36SAndroid Build Coastguard Worker 		sa6.sin6_addr.s6_addr[  1 ]	= 0x80;
2880*48a54d36SAndroid Build Coastguard Worker 		sa6.sin6_addr.s6_addr[ 15 ]	= 0x01;
2881*48a54d36SAndroid Build Coastguard Worker 		sa6.sin6_scope_id			= 2;
2882*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%##a", &sa6 );
2883*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "[FE80:0000:0000:0000:0000:0000:0000:0001%2]:80" ) == 0, exit, err = -1 );
2884*48a54d36SAndroid Build Coastguard Worker 	}
2885*48a54d36SAndroid Build Coastguard Worker 	#endif
2886*48a54d36SAndroid Build Coastguard Worker 
2887*48a54d36SAndroid Build Coastguard Worker 	// Unicode
2888*48a54d36SAndroid Build Coastguard Worker 
2889*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "tes" );
2890*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "tes" ) == 0, exit, err = kResponseErr );
2891*48a54d36SAndroid Build Coastguard Worker 
2892*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "test" );
2893*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "test" ) == 0, exit, err = kResponseErr );
2894*48a54d36SAndroid Build Coastguard Worker 
2895*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "testing" );
2896*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "test" ) == 0, exit, err = kResponseErr );
2897*48a54d36SAndroid Build Coastguard Worker 
2898*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xC3\xA9" );
2899*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
2900*48a54d36SAndroid Build Coastguard Worker 
2901*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xC3\xA9ing" );
2902*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
2903*48a54d36SAndroid Build Coastguard Worker 
2904*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "tes\xC3\xA9ing" );
2905*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "tes" ) == 0, exit, err = kResponseErr );
2906*48a54d36SAndroid Build Coastguard Worker 
2907*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "t\xed\x9f\xbf" );
2908*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "t\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
2909*48a54d36SAndroid Build Coastguard Worker 
2910*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "t\xed\x9f\xbfing" );
2911*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "t\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
2912*48a54d36SAndroid Build Coastguard Worker 
2913*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xed\x9f\xbf" );
2914*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te" ) == 0, exit, err = kResponseErr );
2915*48a54d36SAndroid Build Coastguard Worker 
2916*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 4, "te\xed\x9f\xbfing" );
2917*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te" ) == 0, exit, err = kResponseErr );
2918*48a54d36SAndroid Build Coastguard Worker 
2919*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 7, "te\xC3\xA9\xed\x9f\xbfing" );
2920*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te\xC3\xA9\xed\x9f\xbf" ) == 0, exit, err = kResponseErr );
2921*48a54d36SAndroid Build Coastguard Worker 
2922*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 6, "te\xC3\xA9\xed\x9f\xbfing" );
2923*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
2924*48a54d36SAndroid Build Coastguard Worker 
2925*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF(s, sizeof(s), "%.*s", 5, "te\xC3\xA9\xed\x9f\xbfing" );
2926*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "te\xC3\xA9" ) == 0, exit, err = kResponseErr );
2927*48a54d36SAndroid Build Coastguard Worker 
2928*48a54d36SAndroid Build Coastguard Worker 	#if( TARGET_RT_BIG_ENDIAN )
2929*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%S", "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );
2930*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
2931*48a54d36SAndroid Build Coastguard Worker 	#else
2932*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%S", "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );
2933*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
2934*48a54d36SAndroid Build Coastguard Worker 	#endif
2935*48a54d36SAndroid Build Coastguard Worker 
2936*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%S",
2937*48a54d36SAndroid Build Coastguard Worker 		"\xFE\xFF" "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );	// Big Endian BOM
2938*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
2939*48a54d36SAndroid Build Coastguard Worker 
2940*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%S",
2941*48a54d36SAndroid Build Coastguard Worker 		"\xFF\xFE" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );	// Little Endian BOM
2942*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
2943*48a54d36SAndroid Build Coastguard Worker 
2944*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%#S", "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" );	// Big Endian
2945*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
2946*48a54d36SAndroid Build Coastguard Worker 
2947*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%##S", "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" "\x00" "\x00" );	// Little Endian
2948*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abcd" ) == 0, exit, err = -1 );
2949*48a54d36SAndroid Build Coastguard Worker 
2950*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%.*S",
2951*48a54d36SAndroid Build Coastguard Worker 		4, "\xFE\xFF" "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );	// Big Endian BOM
2952*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
2953*48a54d36SAndroid Build Coastguard Worker 
2954*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%.*S",
2955*48a54d36SAndroid Build Coastguard Worker 		4, "\xFF\xFE" "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );	// Little Endian BOM
2956*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
2957*48a54d36SAndroid Build Coastguard Worker 
2958*48a54d36SAndroid Build Coastguard Worker 	#if( TARGET_RT_BIG_ENDIAN )
2959*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%.*S", 3, "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );
2960*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
2961*48a54d36SAndroid Build Coastguard Worker 	#else
2962*48a54d36SAndroid Build Coastguard Worker 		DebugSNPrintF( s, sizeof( s ), "%.*S", 3, "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );
2963*48a54d36SAndroid Build Coastguard Worker 		require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
2964*48a54d36SAndroid Build Coastguard Worker 	#endif
2965*48a54d36SAndroid Build Coastguard Worker 
2966*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%#.*S", 3, "\x00" "a" "\x00" "b" "\x00" "c" "\x00" "d" );	// Big Endian
2967*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
2968*48a54d36SAndroid Build Coastguard Worker 
2969*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%##.*S", 3, "a" "\x00" "b" "\x00" "c" "\x00" "d" "\x00" );	// Little Endian
2970*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "abc" ) == 0, exit, err = -1 );
2971*48a54d36SAndroid Build Coastguard Worker 
2972*48a54d36SAndroid Build Coastguard Worker 	// Misc
2973*48a54d36SAndroid Build Coastguard Worker 
2974*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%U", "\x10\xb8\xa7\x6b" "\xad\x9d" "\xd1\x11" "\x80\xb4" "\x00\xc0\x4f\xd4\x30\xc8" );
2975*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "6ba7b810-9dad-11d1-80b4-00c04fd430c8" ) == 0, exit, err = -1 );
2976*48a54d36SAndroid Build Coastguard Worker 
2977*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%m", 0 );
2978*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "no error" ) == 0, exit, err = -1 );
2979*48a54d36SAndroid Build Coastguard Worker 
2980*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "%lm", (long) 0 );
2981*48a54d36SAndroid Build Coastguard Worker 	require_action( strcmp( s, "no error" ) == 0, exit, err = -1 );
2982*48a54d36SAndroid Build Coastguard Worker 
2983*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "\"%H\"", "\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8", 16, 16 );
2984*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
2985*48a54d36SAndroid Build Coastguard Worker 
2986*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "\"%H\"",
2987*48a54d36SAndroid Build Coastguard Worker 		"\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8"
2988*48a54d36SAndroid Build Coastguard Worker 		"\x6b\xa7\xb8\x10\x9d\xad\x11\xd1\x80\xb4\x00\xc0\x4f\xd4\x30\xc8",
2989*48a54d36SAndroid Build Coastguard Worker 		32, 32 );
2990*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
2991*48a54d36SAndroid Build Coastguard Worker 
2992*48a54d36SAndroid Build Coastguard Worker 	DebugSNPrintF( s, sizeof( s ), "\"%H\"", "\x6b\xa7", 2, 2 );
2993*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n\n", s );
2994*48a54d36SAndroid Build Coastguard Worker 
2995*48a54d36SAndroid Build Coastguard Worker 	// Hex Dumps
2996*48a54d36SAndroid Build Coastguard Worker 
2997*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
2998*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ),
2999*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNone, s, sizeof( s ) );
3000*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3001*48a54d36SAndroid Build Coastguard Worker 
3002*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3003*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
3004*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoAddress | kDebugFlagsNoOffset, s, sizeof( s ) );
3005*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3006*48a54d36SAndroid Build Coastguard Worker 
3007*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3008*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ),
3009*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoAddress | kDebugFlagsNoOffset, s, sizeof( s ) );
3010*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3011*48a54d36SAndroid Build Coastguard Worker 
3012*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3013*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, "My Label", kSizeCString, 0, NULL, 0, data, data, sizeof( data ),
3014*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoAddress, s, sizeof( s ) );
3015*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3016*48a54d36SAndroid Build Coastguard Worker 
3017*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3018*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
3019*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoOffset, s, sizeof( s ) );
3020*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3021*48a54d36SAndroid Build Coastguard Worker 
3022*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3023*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
3024*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoAddress, s, sizeof( s ) );
3025*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3026*48a54d36SAndroid Build Coastguard Worker 
3027*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3028*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
3029*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoOffset, s, sizeof( s ) );
3030*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3031*48a54d36SAndroid Build Coastguard Worker 
3032*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3033*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
3034*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoByteCount, s, sizeof( s ) );
3035*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3036*48a54d36SAndroid Build Coastguard Worker 
3037*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3038*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, "\x41\x62\x43\x64", "\x41\x62\x43\x64", 4,	// 'AbCd'
3039*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoNewLine |
3040*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNo32BitSeparator | kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount,
3041*48a54d36SAndroid Build Coastguard Worker 		s, sizeof( s ) );
3042*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3043*48a54d36SAndroid Build Coastguard Worker 
3044*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3045*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 0, NULL, 0, 0, NULL, 0, data, data, sizeof( data ),
3046*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNoAddress | kDebugFlagsNoOffset | kDebugFlagsNoASCII | kDebugFlagsNoNewLine |
3047*48a54d36SAndroid Build Coastguard Worker 		kDebugFlags16BitSeparator | kDebugFlagsNo32BitSeparator |
3048*48a54d36SAndroid Build Coastguard Worker 		kDebugFlagsNo16ByteHexPad | kDebugFlagsNoByteCount, s, sizeof( s ) );
3049*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3050*48a54d36SAndroid Build Coastguard Worker 
3051*48a54d36SAndroid Build Coastguard Worker 	s[ 0 ] = '\0';
3052*48a54d36SAndroid Build Coastguard Worker 	DebugHexDump( kDebugLevelMax, 8, NULL, 0, 0, NULL, 0, data, data, sizeof( data ), kDebugFlagsNone, s, sizeof( s ) );
3053*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "%s\n", s );
3054*48a54d36SAndroid Build Coastguard Worker 
3055*48a54d36SAndroid Build Coastguard Worker 	// dlog's
3056*48a54d36SAndroid Build Coastguard Worker 
3057*48a54d36SAndroid Build Coastguard Worker 	dlog( kDebugLevelNotice, "dlog\n" );
3058*48a54d36SAndroid Build Coastguard Worker 	dlog( kDebugLevelNotice, "dlog integer: %d\n", 123 );
3059*48a54d36SAndroid Build Coastguard Worker 	dlog( kDebugLevelNotice, "dlog string:  \"%s\"\n", "test string" );
3060*48a54d36SAndroid Build Coastguard Worker 	dlogmem( kDebugLevelNotice, data, sizeof( data ) );
3061*48a54d36SAndroid Build Coastguard Worker 
3062*48a54d36SAndroid Build Coastguard Worker 	// Done
3063*48a54d36SAndroid Build Coastguard Worker 
3064*48a54d36SAndroid Build Coastguard Worker 	DebugPrintF( kDebugLevelMax, "\n\nALL TESTS DONE\n\n" );
3065*48a54d36SAndroid Build Coastguard Worker 	err = kNoErr;
3066*48a54d36SAndroid Build Coastguard Worker 
3067*48a54d36SAndroid Build Coastguard Worker exit:
3068*48a54d36SAndroid Build Coastguard Worker 	if( err )
3069*48a54d36SAndroid Build Coastguard Worker 	{
3070*48a54d36SAndroid Build Coastguard Worker 		DebugPrintF( kDebugLevelMax, "\n\n### TEST FAILED ###\n\n" );
3071*48a54d36SAndroid Build Coastguard Worker 	}
3072*48a54d36SAndroid Build Coastguard Worker 	return( err );
3073*48a54d36SAndroid Build Coastguard Worker }
3074*48a54d36SAndroid Build Coastguard Worker 
3075*48a54d36SAndroid Build Coastguard Worker #endif	// DEBUG
3076