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