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 18*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 19*48a54d36SAndroid Build Coastguard Worker /*! @header DebugServices 20*48a54d36SAndroid Build Coastguard Worker 21*48a54d36SAndroid Build Coastguard Worker Debugging Library 22*48a54d36SAndroid Build Coastguard Worker */ 23*48a54d36SAndroid Build Coastguard Worker 24*48a54d36SAndroid Build Coastguard Worker #ifndef __DEBUG_SERVICES__ 25*48a54d36SAndroid Build Coastguard Worker #define __DEBUG_SERVICES__ 26*48a54d36SAndroid Build Coastguard Worker 27*48a54d36SAndroid Build Coastguard Worker #include <stdarg.h> 28*48a54d36SAndroid Build Coastguard Worker 29*48a54d36SAndroid Build Coastguard Worker #include "CommonServices.h" 30*48a54d36SAndroid Build Coastguard Worker 31*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS ) 32*48a54d36SAndroid Build Coastguard Worker #include "logLib.h" 33*48a54d36SAndroid Build Coastguard Worker #endif 34*48a54d36SAndroid Build Coastguard Worker 35*48a54d36SAndroid Build Coastguard Worker #if 0 36*48a54d36SAndroid Build Coastguard Worker #pragma mark == Settings == 37*48a54d36SAndroid Build Coastguard Worker #endif 38*48a54d36SAndroid Build Coastguard Worker 39*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 40*48a54d36SAndroid Build Coastguard Worker // Settings 41*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 42*48a54d36SAndroid Build Coastguard Worker 43*48a54d36SAndroid Build Coastguard Worker // General 44*48a54d36SAndroid Build Coastguard Worker 45*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG ) ) 46*48a54d36SAndroid Build Coastguard Worker #define DEBUG 0 47*48a54d36SAndroid Build Coastguard Worker #endif 48*48a54d36SAndroid Build Coastguard Worker 49*48a54d36SAndroid Build Coastguard Worker #if( defined( NDEBUG ) && DEBUG ) 50*48a54d36SAndroid Build Coastguard Worker #error NDEBUG defined and DEBUG is also enabled...they need to be in-sync 51*48a54d36SAndroid Build Coastguard Worker #endif 52*48a54d36SAndroid Build Coastguard Worker 53*48a54d36SAndroid Build Coastguard Worker // AssertMacros.h/Debugging.h overrides. 54*48a54d36SAndroid Build Coastguard Worker 55*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_OVERRIDE_APPLE_MACROS ) ) 56*48a54d36SAndroid Build Coastguard Worker #define DEBUG_OVERRIDE_APPLE_MACROS 1 57*48a54d36SAndroid Build Coastguard Worker #endif 58*48a54d36SAndroid Build Coastguard Worker 59*48a54d36SAndroid Build Coastguard Worker // Routine name. Uses ISO __func__ where possible. Otherwise, uses the best thing that is available (if anything). 60*48a54d36SAndroid Build Coastguard Worker 61*48a54d36SAndroid Build Coastguard Worker #if( defined( __MWERKS__ ) || ( __GNUC__ > 2 ) || ( ( __GNUC__ == 2 ) && ( __GNUC_MINOR__ >= 9 ) ) ) 62*48a54d36SAndroid Build Coastguard Worker #define __ROUTINE__ __func__ 63*48a54d36SAndroid Build Coastguard Worker #elif( defined( __GNUC__ ) ) 64*48a54d36SAndroid Build Coastguard Worker #define __ROUTINE__ __PRETTY_FUNCTION__ 65*48a54d36SAndroid Build Coastguard Worker #elif( defined( _MSC_VER ) && !defined( _WIN32_WCE ) ) 66*48a54d36SAndroid Build Coastguard Worker #define __ROUTINE__ __FUNCTION__ 67*48a54d36SAndroid Build Coastguard Worker #else 68*48a54d36SAndroid Build Coastguard Worker #define __ROUTINE__ "" 69*48a54d36SAndroid Build Coastguard Worker #endif 70*48a54d36SAndroid Build Coastguard Worker 71*48a54d36SAndroid Build Coastguard Worker // Variable argument macro support. Use ANSI C99 __VA_ARGS__ where possible. Otherwise, use the next best thing. 72*48a54d36SAndroid Build Coastguard Worker 73*48a54d36SAndroid Build Coastguard Worker #if( defined( __GNUC__ ) ) 74*48a54d36SAndroid Build Coastguard Worker #if( ( __GNUC__ > 3 ) || ( ( __GNUC__ == 3 ) && ( __GNUC_MINOR__ >= 3) ) ) 75*48a54d36SAndroid Build Coastguard Worker #define DEBUG_C99_VA_ARGS 1 76*48a54d36SAndroid Build Coastguard Worker #define DEBUG_GNU_VA_ARGS 0 77*48a54d36SAndroid Build Coastguard Worker #else 78*48a54d36SAndroid Build Coastguard Worker #define DEBUG_C99_VA_ARGS 0 79*48a54d36SAndroid Build Coastguard Worker #define DEBUG_GNU_VA_ARGS 1 80*48a54d36SAndroid Build Coastguard Worker #endif 81*48a54d36SAndroid Build Coastguard Worker #elif( defined( __MWERKS__ ) ) 82*48a54d36SAndroid Build Coastguard Worker #define DEBUG_C99_VA_ARGS 1 83*48a54d36SAndroid Build Coastguard Worker #define DEBUG_GNU_VA_ARGS 0 84*48a54d36SAndroid Build Coastguard Worker #else 85*48a54d36SAndroid Build Coastguard Worker #define DEBUG_C99_VA_ARGS 0 86*48a54d36SAndroid Build Coastguard Worker #define DEBUG_GNU_VA_ARGS 0 87*48a54d36SAndroid Build Coastguard Worker #endif 88*48a54d36SAndroid Build Coastguard Worker 89*48a54d36SAndroid Build Coastguard Worker #if 0 90*48a54d36SAndroid Build Coastguard Worker #pragma mark == Output == 91*48a54d36SAndroid Build Coastguard Worker #endif 92*48a54d36SAndroid Build Coastguard Worker 93*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 94*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_FPRINTF_ENABLED 95*48a54d36SAndroid Build Coastguard Worker 96*48a54d36SAndroid Build Coastguard Worker @abstract Enables ANSI C fprintf output. 97*48a54d36SAndroid Build Coastguard Worker */ 98*48a54d36SAndroid Build Coastguard Worker 99*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_FPRINTF_ENABLED ) ) 100*48a54d36SAndroid Build Coastguard Worker #if( !TARGET_API_MAC_OSX_KERNEL && !TARGET_OS_WINDOWS_CE ) 101*48a54d36SAndroid Build Coastguard Worker #define DEBUG_FPRINTF_ENABLED 1 102*48a54d36SAndroid Build Coastguard Worker #else 103*48a54d36SAndroid Build Coastguard Worker #define DEBUG_FPRINTF_ENABLED 0 104*48a54d36SAndroid Build Coastguard Worker #endif 105*48a54d36SAndroid Build Coastguard Worker #else 106*48a54d36SAndroid Build Coastguard Worker #if( TARGET_API_MAC_OSX_KERNEL || TARGET_OS_WINDOWS_CE ) 107*48a54d36SAndroid Build Coastguard Worker #error fprintf enabled, but not supported on Mac OS X kernel or Windows CE 108*48a54d36SAndroid Build Coastguard Worker #endif 109*48a54d36SAndroid Build Coastguard Worker #endif 110*48a54d36SAndroid Build Coastguard Worker 111*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 112*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_MAC_OS_X_IOLOG_ENABLED 113*48a54d36SAndroid Build Coastguard Worker 114*48a54d36SAndroid Build Coastguard Worker @abstract Enables IOLog (Mac OS X Kernel) output. 115*48a54d36SAndroid Build Coastguard Worker */ 116*48a54d36SAndroid Build Coastguard Worker 117*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_MAC_OS_X_IOLOG_ENABLED ) ) 118*48a54d36SAndroid Build Coastguard Worker #define DEBUG_MAC_OS_X_IOLOG_ENABLED TARGET_API_MAC_OSX_KERNEL 119*48a54d36SAndroid Build Coastguard Worker #endif 120*48a54d36SAndroid Build Coastguard Worker 121*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 122*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_KPRINTF_ENABLED 123*48a54d36SAndroid Build Coastguard Worker 124*48a54d36SAndroid Build Coastguard Worker @abstract Enables kprintf (Mac OS X Kernel) output. 125*48a54d36SAndroid Build Coastguard Worker */ 126*48a54d36SAndroid Build Coastguard Worker 127*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_KPRINTF_ENABLED ) ) 128*48a54d36SAndroid Build Coastguard Worker #define DEBUG_KPRINTF_ENABLED TARGET_API_MAC_OSX_KERNEL 129*48a54d36SAndroid Build Coastguard Worker #endif 130*48a54d36SAndroid Build Coastguard Worker 131*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 132*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_IDEBUG_ENABLED 133*48a54d36SAndroid Build Coastguard Worker 134*48a54d36SAndroid Build Coastguard Worker @abstract Enables iDebug (Mac OS X user and Kernel) output. 135*48a54d36SAndroid Build Coastguard Worker 136*48a54d36SAndroid Build Coastguard Worker @discussion 137*48a54d36SAndroid Build Coastguard Worker 138*48a54d36SAndroid Build Coastguard Worker For Mac OS X kernel development, iDebug is enabled by default because we can dynamically check for the presence 139*48a54d36SAndroid Build Coastguard Worker of iDebug via some exported IOKit symbols. Mac OS X app usage doesn't allow dynamic detection because it relies 140*48a54d36SAndroid Build Coastguard Worker on statically linking to the iDebugServices.cp file so for Mac OS X app usage, you have to manually enable iDebug. 141*48a54d36SAndroid Build Coastguard Worker */ 142*48a54d36SAndroid Build Coastguard Worker 143*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_IDEBUG_ENABLED ) ) 144*48a54d36SAndroid Build Coastguard Worker #define DEBUG_IDEBUG_ENABLED TARGET_API_MAC_OSX_KERNEL 145*48a54d36SAndroid Build Coastguard Worker #endif 146*48a54d36SAndroid Build Coastguard Worker 147*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 148*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_CORE_SERVICE_ASSERTS_ENABLED 149*48a54d36SAndroid Build Coastguard Worker 150*48a54d36SAndroid Build Coastguard Worker @abstract Controls whether Core Services assert handling is enabled. Enabling requires CoreServices framework. 151*48a54d36SAndroid Build Coastguard Worker */ 152*48a54d36SAndroid Build Coastguard Worker 153*48a54d36SAndroid Build Coastguard Worker #if( !defined( DEBUG_CORE_SERVICE_ASSERTS_ENABLED ) ) 154*48a54d36SAndroid Build Coastguard Worker #if( defined( __DEBUGGING__ ) ) 155*48a54d36SAndroid Build Coastguard Worker #define DEBUG_CORE_SERVICE_ASSERTS_ENABLED 1 156*48a54d36SAndroid Build Coastguard Worker #else 157*48a54d36SAndroid Build Coastguard Worker #define DEBUG_CORE_SERVICE_ASSERTS_ENABLED 0 158*48a54d36SAndroid Build Coastguard Worker #endif 159*48a54d36SAndroid Build Coastguard Worker #endif 160*48a54d36SAndroid Build Coastguard Worker 161*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 162*48a54d36SAndroid Build Coastguard Worker /*! @typedef DebugOutputType 163*48a54d36SAndroid Build Coastguard Worker 164*48a54d36SAndroid Build Coastguard Worker @abstract Type of debug output (i.e. where the output goes). 165*48a54d36SAndroid Build Coastguard Worker */ 166*48a54d36SAndroid Build Coastguard Worker 167*48a54d36SAndroid Build Coastguard Worker typedef uint32_t DebugOutputType; 168*48a54d36SAndroid Build Coastguard Worker 169*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeNone 0x6E6F6E65U // 'none' - no params 170*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeCustom 0x63757374U // 'cust' - 1st param = function ptr, 2nd param = context 171*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeFPrintF 0x66707269U // 'fpri' - 1st param = DebugOutputTypeFlags [, 2nd param = filename] 172*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeiDebug 0x69646267U // 'idbg' - no params 173*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeKPrintF 0x6B707266U // 'kprf' - no params 174*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeMacOSXIOLog 0x696C6F67U // 'ilog' - no params 175*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeMacOSXLog 0x786C6F67U // 'xlog' - no params 176*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeWindowsDebugger 0x77696E64U // 'wind' - no params 177*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeWindowsEventLog 0x7765766CU // 'wevl' - 1st param = C-string name, 2nd param = HMODULE or NULL. 178*48a54d36SAndroid Build Coastguard Worker 179*48a54d36SAndroid Build Coastguard Worker // Console meta output kind - Any kind of Console output (in horizontal order of preference): 180*48a54d36SAndroid Build Coastguard Worker // 181*48a54d36SAndroid Build Coastguard Worker // Mac OS X = ANSI printf (viewable in Console.app) 182*48a54d36SAndroid Build Coastguard Worker // Mac OS X Kernel = IOLog (/var/log/system.log) or kprintf (serial). 183*48a54d36SAndroid Build Coastguard Worker // Windows = ANSI printf (Console window) or OutputDebugString (debugger). 184*48a54d36SAndroid Build Coastguard Worker // Other = ANSI printf (viewer varies). 185*48a54d36SAndroid Build Coastguard Worker 186*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeMetaConsole 0x434F4E53U // 'CONS' - no params 187*48a54d36SAndroid Build Coastguard Worker 188*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 189*48a54d36SAndroid Build Coastguard Worker /*! @typedef DebugOutputTypeFlags 190*48a54d36SAndroid Build Coastguard Worker 191*48a54d36SAndroid Build Coastguard Worker @abstract Flags controlling how the output type is configured. 192*48a54d36SAndroid Build Coastguard Worker 193*48a54d36SAndroid Build Coastguard Worker @constant kDebugOutputTypeFlagsTypeMask Bit mask for the output type (e.g. stdout, stderr, file, etc.). 194*48a54d36SAndroid Build Coastguard Worker @constant kDebugOutputTypeFlagsStdOut fprintf should go to stdout. 195*48a54d36SAndroid Build Coastguard Worker @constant kDebugOutputTypeFlagsStdErr fprintf should go to stderr. 196*48a54d36SAndroid Build Coastguard Worker @constant kDebugOutputTypeFlagsFile fprintf should go to a specific file (filename passed as va_arg). 197*48a54d36SAndroid Build Coastguard Worker */ 198*48a54d36SAndroid Build Coastguard Worker 199*48a54d36SAndroid Build Coastguard Worker typedef unsigned int DebugOutputTypeFlags; 200*48a54d36SAndroid Build Coastguard Worker 201*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeFlagsTypeMask 0xF 202*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeFlagsStdOut 1 203*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeFlagsStdErr 2 204*48a54d36SAndroid Build Coastguard Worker #define kDebugOutputTypeFlagsFile 10 205*48a54d36SAndroid Build Coastguard Worker 206*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 207*48a54d36SAndroid Build Coastguard Worker /*! @typedef DebugOutputFunctionPtr 208*48a54d36SAndroid Build Coastguard Worker 209*48a54d36SAndroid Build Coastguard Worker @abstract Function ptr for a custom callback to print debug output. 210*48a54d36SAndroid Build Coastguard Worker */ 211*48a54d36SAndroid Build Coastguard Worker 212*48a54d36SAndroid Build Coastguard Worker typedef void ( *DebugOutputFunctionPtr )( char *inData, size_t inSize, void *inContext ); 213*48a54d36SAndroid Build Coastguard Worker 214*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 215*48a54d36SAndroid Build Coastguard Worker // Constants 216*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 217*48a54d36SAndroid Build Coastguard Worker 218*48a54d36SAndroid Build Coastguard Worker #if 0 219*48a54d36SAndroid Build Coastguard Worker #pragma mark == Flags == 220*48a54d36SAndroid Build Coastguard Worker #endif 221*48a54d36SAndroid Build Coastguard Worker 222*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 223*48a54d36SAndroid Build Coastguard Worker /*! @typedef DebugFlags 224*48a54d36SAndroid Build Coastguard Worker 225*48a54d36SAndroid Build Coastguard Worker @abstract Flags controlling how output is printed. 226*48a54d36SAndroid Build Coastguard Worker */ 227*48a54d36SAndroid Build Coastguard Worker 228*48a54d36SAndroid Build Coastguard Worker typedef uint32_t DebugFlags; 229*48a54d36SAndroid Build Coastguard Worker 230*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNone 0 231*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNoAddress ( 1 << 0 ) 232*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNoOffset ( 1 << 1 ) 233*48a54d36SAndroid Build Coastguard Worker #define kDebugFlags32BitOffset ( 1 << 2 ) 234*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNoASCII ( 1 << 3 ) 235*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNoNewLine ( 1 << 4 ) 236*48a54d36SAndroid Build Coastguard Worker #define kDebugFlags8BitSeparator ( 1 << 5 ) 237*48a54d36SAndroid Build Coastguard Worker #define kDebugFlags16BitSeparator ( 1 << 6 ) 238*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNo32BitSeparator ( 1 << 7 ) 239*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNo16ByteHexPad ( 1 << 8 ) 240*48a54d36SAndroid Build Coastguard Worker #define kDebugFlagsNoByteCount ( 1 << 9 ) 241*48a54d36SAndroid Build Coastguard Worker 242*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 243*48a54d36SAndroid Build Coastguard Worker /*! @enum DebugTaskLevelFlags 244*48a54d36SAndroid Build Coastguard Worker 245*48a54d36SAndroid Build Coastguard Worker @abstract Flags indicating the task level. 246*48a54d36SAndroid Build Coastguard Worker */ 247*48a54d36SAndroid Build Coastguard Worker 248*48a54d36SAndroid Build Coastguard Worker enum 249*48a54d36SAndroid Build Coastguard Worker { 250*48a54d36SAndroid Build Coastguard Worker kDebugInterruptLevelShift = 0, 251*48a54d36SAndroid Build Coastguard Worker kDebugInterruptLevelMask = 0x00000007, 252*48a54d36SAndroid Build Coastguard Worker kDebugInVBLTaskMask = 0x00000010, 253*48a54d36SAndroid Build Coastguard Worker kDebugInDeferredTaskMask = 0x00000020, 254*48a54d36SAndroid Build Coastguard Worker kDebugInSecondaryInterruptHandlerMask = 0x00000040, 255*48a54d36SAndroid Build Coastguard Worker kDebugPageFaultFatalMask = 0x00000100, // There should be a "kPageFaultFatalMask" in Debugging.h. 256*48a54d36SAndroid Build Coastguard Worker kDebugMPTaskLevelMask = 0x00000200, // There should be a "kMPTaskLevelMask" in Debugging.h. 257*48a54d36SAndroid Build Coastguard Worker kDebugInterruptDepthShift = 16, 258*48a54d36SAndroid Build Coastguard Worker kDebugInterruptDepthMask = 0x00FF0000 259*48a54d36SAndroid Build Coastguard Worker }; 260*48a54d36SAndroid Build Coastguard Worker 261*48a54d36SAndroid Build Coastguard Worker #define DebugExtractTaskLevelInterruptLevel( LEVEL ) \ 262*48a54d36SAndroid Build Coastguard Worker ( ( ( LEVEL ) & kDebugInterruptLevelMask ) >> kDebugInterruptLevelShift ) 263*48a54d36SAndroid Build Coastguard Worker 264*48a54d36SAndroid Build Coastguard Worker #define DebugExtractTaskLevelInterruptDepth( LEVEL ) \ 265*48a54d36SAndroid Build Coastguard Worker ( ( ( LEVEL ) & kDebugInterruptDepthMask ) >> kDebugInterruptDepthShift ) 266*48a54d36SAndroid Build Coastguard Worker 267*48a54d36SAndroid Build Coastguard Worker #if 0 268*48a54d36SAndroid Build Coastguard Worker #pragma mark == Levels == 269*48a54d36SAndroid Build Coastguard Worker #endif 270*48a54d36SAndroid Build Coastguard Worker 271*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 272*48a54d36SAndroid Build Coastguard Worker // Constants & Types - Levels 273*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 274*48a54d36SAndroid Build Coastguard Worker 275*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 276*48a54d36SAndroid Build Coastguard Worker /*! @typedef DebugLevel 277*48a54d36SAndroid Build Coastguard Worker 278*48a54d36SAndroid Build Coastguard Worker @abstract Level used to control debug logging. 279*48a54d36SAndroid Build Coastguard Worker */ 280*48a54d36SAndroid Build Coastguard Worker 281*48a54d36SAndroid Build Coastguard Worker typedef int32_t DebugLevel; 282*48a54d36SAndroid Build Coastguard Worker 283*48a54d36SAndroid Build Coastguard Worker // Levels 284*48a54d36SAndroid Build Coastguard Worker 285*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelMask 0x0000FFFF 286*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelChatty 100 287*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelVerbose 500 288*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelTrace 800 289*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelInfo 1000 290*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelNotice 3000 291*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelWarning 5000 292*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelAssert 6000 293*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelRequire 7000 294*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelError 8000 295*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelCritical 9000 296*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelAlert 10000 297*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelEmergency 11000 298*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelTragic 12000 299*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelMax 0x0000FFFF 300*48a54d36SAndroid Build Coastguard Worker 301*48a54d36SAndroid Build Coastguard Worker // Level Flags 302*48a54d36SAndroid Build Coastguard Worker 303*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelFlagMask 0xFFFF0000 304*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelFlagStackTrace 0x00010000 305*48a54d36SAndroid Build Coastguard Worker #define kDebugLevelFlagDebugBreak 0x00020000 306*48a54d36SAndroid Build Coastguard Worker 307*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 308*48a54d36SAndroid Build Coastguard Worker /*! @typedef LogLevel 309*48a54d36SAndroid Build Coastguard Worker 310*48a54d36SAndroid Build Coastguard Worker @abstract Level used to control which events are logged. 311*48a54d36SAndroid Build Coastguard Worker */ 312*48a54d36SAndroid Build Coastguard Worker 313*48a54d36SAndroid Build Coastguard Worker typedef int32_t LogLevel; 314*48a54d36SAndroid Build Coastguard Worker 315*48a54d36SAndroid Build Coastguard Worker #define kLogLevelUninitialized -1L 316*48a54d36SAndroid Build Coastguard Worker #define kLogLevelAll 0L 317*48a54d36SAndroid Build Coastguard Worker #define kLogLevelChatty 100L 318*48a54d36SAndroid Build Coastguard Worker #define kLogLevelVerbose 500L 319*48a54d36SAndroid Build Coastguard Worker #define kLogLevelTrace 800L 320*48a54d36SAndroid Build Coastguard Worker #define kLogLevelInfo 1000L 321*48a54d36SAndroid Build Coastguard Worker #define kLogLevelNotice 3000L 322*48a54d36SAndroid Build Coastguard Worker #define kLogLevelWarning 4000L 323*48a54d36SAndroid Build Coastguard Worker #define kLogLevelAssert 6000L 324*48a54d36SAndroid Build Coastguard Worker #define kLogLevelRequire 7000L 325*48a54d36SAndroid Build Coastguard Worker #define kLogLevelError 8000L 326*48a54d36SAndroid Build Coastguard Worker #define kLogLevelCritical 9000L 327*48a54d36SAndroid Build Coastguard Worker #define kLogLevelAlert 10000L 328*48a54d36SAndroid Build Coastguard Worker #define kLogLevelEmergency 11000L 329*48a54d36SAndroid Build Coastguard Worker #define kLogLevelTragic 12000L 330*48a54d36SAndroid Build Coastguard Worker #define kLogLevelOff 0x0000FFFEL 331*48a54d36SAndroid Build Coastguard Worker 332*48a54d36SAndroid Build Coastguard Worker #if 0 333*48a54d36SAndroid Build Coastguard Worker #pragma mark == Properties == 334*48a54d36SAndroid Build Coastguard Worker #endif 335*48a54d36SAndroid Build Coastguard Worker 336*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 337*48a54d36SAndroid Build Coastguard Worker /*! @typedef DebugPropertyTag 338*48a54d36SAndroid Build Coastguard Worker 339*48a54d36SAndroid Build Coastguard Worker @abstract Tag for properties. 340*48a54d36SAndroid Build Coastguard Worker */ 341*48a54d36SAndroid Build Coastguard Worker 342*48a54d36SAndroid Build Coastguard Worker typedef uint32_t DebugPropertyTag; 343*48a54d36SAndroid Build Coastguard Worker 344*48a54d36SAndroid Build Coastguard Worker #define kDebugPropertyTagPrintLevelMin 0x6D696E70U // 'minp' Get: 1st param = DebugLevel * 345*48a54d36SAndroid Build Coastguard Worker // Set: 1st param = DebugLevel 346*48a54d36SAndroid Build Coastguard Worker 347*48a54d36SAndroid Build Coastguard Worker #define kDebugPropertyTagPrintLevel kDebugPropertyTagPrintLevelMin 348*48a54d36SAndroid Build Coastguard Worker 349*48a54d36SAndroid Build Coastguard Worker #define kDebugPropertyTagPrintLevelMax 0x706D786CU // 'maxp' Get: 1st param = DebugLevel * 350*48a54d36SAndroid Build Coastguard Worker // Set: 1st param = DebugLevel 351*48a54d36SAndroid Build Coastguard Worker 352*48a54d36SAndroid Build Coastguard Worker #define kDebugPropertyTagBreakLevel 0x62726B6CU // 'brkl' Get: 1st param = DebugLevel * 353*48a54d36SAndroid Build Coastguard Worker // Set: 1st param = DebugLevel 354*48a54d36SAndroid Build Coastguard Worker #if 0 355*48a54d36SAndroid Build Coastguard Worker #pragma mark == General macros == 356*48a54d36SAndroid Build Coastguard Worker #endif 357*48a54d36SAndroid Build Coastguard Worker 358*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 359*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_UNUSED 360*48a54d36SAndroid Build Coastguard Worker 361*48a54d36SAndroid Build Coastguard Worker @abstract Macro to mark a paramter as unused to avoid unused parameter warnings. 362*48a54d36SAndroid Build Coastguard Worker 363*48a54d36SAndroid Build Coastguard Worker @discussion 364*48a54d36SAndroid Build Coastguard Worker 365*48a54d36SAndroid Build Coastguard Worker There is no universally supported pragma/attribute for indicating a variable is unused. DEBUG_UNUSED lets us 366*48a54d36SAndroid Build Coastguard Worker indicate a variable is unused in a manner that is supported by most compilers. 367*48a54d36SAndroid Build Coastguard Worker */ 368*48a54d36SAndroid Build Coastguard Worker 369*48a54d36SAndroid Build Coastguard Worker #define DEBUG_UNUSED( X ) (void)( X ) 370*48a54d36SAndroid Build Coastguard Worker 371*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 372*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_USE_ONLY 373*48a54d36SAndroid Build Coastguard Worker 374*48a54d36SAndroid Build Coastguard Worker @abstract Macro to mark a variable as used only when debugging is enabled. 375*48a54d36SAndroid Build Coastguard Worker 376*48a54d36SAndroid Build Coastguard Worker @discussion 377*48a54d36SAndroid Build Coastguard Worker 378*48a54d36SAndroid Build Coastguard Worker Variables are sometimes needed only for debugging. When debugging is turned off, these debug-only variables generate 379*48a54d36SAndroid Build Coastguard Worker compiler warnings about unused variables. To eliminate these warnings, use these macros to indicate variables that 380*48a54d36SAndroid Build Coastguard Worker are only used for debugging. 381*48a54d36SAndroid Build Coastguard Worker */ 382*48a54d36SAndroid Build Coastguard Worker 383*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 384*48a54d36SAndroid Build Coastguard Worker #define DEBUG_USE_ONLY( X ) 385*48a54d36SAndroid Build Coastguard Worker #else 386*48a54d36SAndroid Build Coastguard Worker #define DEBUG_USE_ONLY( X ) (void)( X ) 387*48a54d36SAndroid Build Coastguard Worker #endif 388*48a54d36SAndroid Build Coastguard Worker 389*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 390*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_LOCAL 391*48a54d36SAndroid Build Coastguard Worker 392*48a54d36SAndroid Build Coastguard Worker @abstract Macros to make variables and functions static when debugging is off, but extern when debugging is on. 393*48a54d36SAndroid Build Coastguard Worker 394*48a54d36SAndroid Build Coastguard Worker @discussion 395*48a54d36SAndroid Build Coastguard Worker 396*48a54d36SAndroid Build Coastguard Worker Rather than using "static" directly, using this macros allows you to access these variables external while 397*48a54d36SAndroid Build Coastguard Worker debugging without being penalized for production builds. 398*48a54d36SAndroid Build Coastguard Worker */ 399*48a54d36SAndroid Build Coastguard Worker 400*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 401*48a54d36SAndroid Build Coastguard Worker #define DEBUG_LOCAL 402*48a54d36SAndroid Build Coastguard Worker #else 403*48a54d36SAndroid Build Coastguard Worker #define DEBUG_LOCAL static 404*48a54d36SAndroid Build Coastguard Worker #endif 405*48a54d36SAndroid Build Coastguard Worker 406*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 407*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_STATIC 408*48a54d36SAndroid Build Coastguard Worker 409*48a54d36SAndroid Build Coastguard Worker @abstract Macros to make variables and functions static when debugging is off, but extern when debugging is on. 410*48a54d36SAndroid Build Coastguard Worker 411*48a54d36SAndroid Build Coastguard Worker @discussion 412*48a54d36SAndroid Build Coastguard Worker 413*48a54d36SAndroid Build Coastguard Worker Rather than using "static" directly, using this macros allows you to access these variables external while 414*48a54d36SAndroid Build Coastguard Worker debugging without being penalized for production builds. 415*48a54d36SAndroid Build Coastguard Worker */ 416*48a54d36SAndroid Build Coastguard Worker 417*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 418*48a54d36SAndroid Build Coastguard Worker #define DEBUG_STATIC 419*48a54d36SAndroid Build Coastguard Worker #else 420*48a54d36SAndroid Build Coastguard Worker #define DEBUG_STATIC static 421*48a54d36SAndroid Build Coastguard Worker #endif 422*48a54d36SAndroid Build Coastguard Worker 423*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 424*48a54d36SAndroid Build Coastguard Worker /*! @defined DEBUG_EXPORT 425*48a54d36SAndroid Build Coastguard Worker 426*48a54d36SAndroid Build Coastguard Worker @abstract Macros to export variables. 427*48a54d36SAndroid Build Coastguard Worker 428*48a54d36SAndroid Build Coastguard Worker @discussion 429*48a54d36SAndroid Build Coastguard Worker 430*48a54d36SAndroid Build Coastguard Worker "__private_extern__" is a hack for IOKit to allow symbols to be exported from compilation units, but 431*48a54d36SAndroid Build Coastguard Worker // not exported outside a driver (IOKit uses a lame global namespace for symbols). This still does not 432*48a54d36SAndroid Build Coastguard Worker // solve the problem of multiple drivers in the same dependency chain since they share symbols. 433*48a54d36SAndroid Build Coastguard Worker */ 434*48a54d36SAndroid Build Coastguard Worker 435*48a54d36SAndroid Build Coastguard Worker #if( TARGET_API_MAC_OSX_KERNEL ) 436*48a54d36SAndroid Build Coastguard Worker #define DEBUG_EXPORT __private_extern__ 437*48a54d36SAndroid Build Coastguard Worker #else 438*48a54d36SAndroid Build Coastguard Worker #define DEBUG_EXPORT extern 439*48a54d36SAndroid Build Coastguard Worker #endif 440*48a54d36SAndroid Build Coastguard Worker 441*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 442*48a54d36SAndroid Build Coastguard Worker /*! @defined debug_add 443*48a54d36SAndroid Build Coastguard Worker 444*48a54d36SAndroid Build Coastguard Worker @abstract Macro to add (or subtract if negative) a value when debugging is on. Does nothing if debugging is off. 445*48a54d36SAndroid Build Coastguard Worker */ 446*48a54d36SAndroid Build Coastguard Worker 447*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 448*48a54d36SAndroid Build Coastguard Worker #define debug_add( A, B ) ( A ) += ( B ) 449*48a54d36SAndroid Build Coastguard Worker #else 450*48a54d36SAndroid Build Coastguard Worker #define debug_add( A, B ) 451*48a54d36SAndroid Build Coastguard Worker #endif 452*48a54d36SAndroid Build Coastguard Worker 453*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 454*48a54d36SAndroid Build Coastguard Worker /*! @defined debug_perform 455*48a54d36SAndroid Build Coastguard Worker 456*48a54d36SAndroid Build Coastguard Worker @abstract Macro to perform something in debug-only builds. 457*48a54d36SAndroid Build Coastguard Worker */ 458*48a54d36SAndroid Build Coastguard Worker 459*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 460*48a54d36SAndroid Build Coastguard Worker #define debug_perform( X ) do { X; } while( 0 ) 461*48a54d36SAndroid Build Coastguard Worker #else 462*48a54d36SAndroid Build Coastguard Worker #define debug_perform( X ) 463*48a54d36SAndroid Build Coastguard Worker #endif 464*48a54d36SAndroid Build Coastguard Worker 465*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 466*48a54d36SAndroid Build Coastguard Worker /*! @function translate_errno 467*48a54d36SAndroid Build Coastguard Worker 468*48a54d36SAndroid Build Coastguard Worker @abstract Returns 0 if the test success. If the test fails, returns errno if non-zero and othewise the alternate error. 469*48a54d36SAndroid Build Coastguard Worker */ 470*48a54d36SAndroid Build Coastguard Worker 471*48a54d36SAndroid Build Coastguard Worker #define translate_errno( TEST, ERRNO, ALTERNATE_ERROR ) ( ( TEST ) ? 0 : ( ERRNO ) ? ( ERRNO ) : ( ALTERNATE_ERROR ) ) 472*48a54d36SAndroid Build Coastguard Worker 473*48a54d36SAndroid Build Coastguard Worker #if 0 474*48a54d36SAndroid Build Coastguard Worker #pragma mark == Compile Time macros == 475*48a54d36SAndroid Build Coastguard Worker #endif 476*48a54d36SAndroid Build Coastguard Worker 477*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 478*48a54d36SAndroid Build Coastguard Worker /*! @defined check_compile_time 479*48a54d36SAndroid Build Coastguard Worker 480*48a54d36SAndroid Build Coastguard Worker @abstract Performs a compile-time check of something such as the size of an int. 481*48a54d36SAndroid Build Coastguard Worker 482*48a54d36SAndroid Build Coastguard Worker @discussion 483*48a54d36SAndroid Build Coastguard Worker 484*48a54d36SAndroid Build Coastguard Worker This declares an array with a size that is determined by a compile-time expression. If the expression evaluates 485*48a54d36SAndroid Build Coastguard Worker to 0, the array has a size of -1, which is illegal and generates a compile-time error. 486*48a54d36SAndroid Build Coastguard Worker 487*48a54d36SAndroid Build Coastguard Worker For example: 488*48a54d36SAndroid Build Coastguard Worker 489*48a54d36SAndroid Build Coastguard Worker check_compile_time( sizeof( int ) == 4 ); 490*48a54d36SAndroid Build Coastguard Worker 491*48a54d36SAndroid Build Coastguard Worker Note: This only works with compile-time expressions. 492*48a54d36SAndroid Build Coastguard Worker Note: This only works in places where extern declarations are allowed (e.g. global scope). 493*48a54d36SAndroid Build Coastguard Worker 494*48a54d36SAndroid Build Coastguard Worker References: 495*48a54d36SAndroid Build Coastguard Worker 496*48a54d36SAndroid Build Coastguard Worker <http://www.jaggersoft.com/pubs/CVu11_3.html> 497*48a54d36SAndroid Build Coastguard Worker <http://www.jaggersoft.com/pubs/CVu11_5.html> 498*48a54d36SAndroid Build Coastguard Worker 499*48a54d36SAndroid Build Coastguard Worker Note: The following macros differ from the macros on the www.jaggersoft.com web site because those versions do not 500*48a54d36SAndroid Build Coastguard Worker work with GCC due to GCC allow a zero-length array. Using a -1 condition turned out to be more portable. 501*48a54d36SAndroid Build Coastguard Worker */ 502*48a54d36SAndroid Build Coastguard Worker 503*48a54d36SAndroid Build Coastguard Worker #define check_compile_time( X ) extern int debug_compile_time_name[ ( X ) ? 1 : -1 ] 504*48a54d36SAndroid Build Coastguard Worker 505*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 506*48a54d36SAndroid Build Coastguard Worker /*! @defined check_compile_time_code 507*48a54d36SAndroid Build Coastguard Worker 508*48a54d36SAndroid Build Coastguard Worker @abstract Perform a compile-time check, suitable for placement in code, of something such as the size of an int. 509*48a54d36SAndroid Build Coastguard Worker 510*48a54d36SAndroid Build Coastguard Worker @discussion 511*48a54d36SAndroid Build Coastguard Worker 512*48a54d36SAndroid Build Coastguard Worker This creates a switch statement with an existing case for 0 and an additional case using the result of a 513*48a54d36SAndroid Build Coastguard Worker compile-time expression. A switch statement cannot have two case labels with the same constant so if the 514*48a54d36SAndroid Build Coastguard Worker compile-time expression evaluates to 0, it is illegal and generates a compile-time error. If the compile-time 515*48a54d36SAndroid Build Coastguard Worker expression does not evaluate to 0, the resulting value is used as the case label and it compiles without error. 516*48a54d36SAndroid Build Coastguard Worker 517*48a54d36SAndroid Build Coastguard Worker For example: 518*48a54d36SAndroid Build Coastguard Worker 519*48a54d36SAndroid Build Coastguard Worker check_compile_time_code( sizeof( int ) == 4 ); 520*48a54d36SAndroid Build Coastguard Worker 521*48a54d36SAndroid Build Coastguard Worker Note: This only works with compile-time expressions. 522*48a54d36SAndroid Build Coastguard Worker Note: This does not work in a global scope so it must be inside a function. 523*48a54d36SAndroid Build Coastguard Worker 524*48a54d36SAndroid Build Coastguard Worker References: 525*48a54d36SAndroid Build Coastguard Worker 526*48a54d36SAndroid Build Coastguard Worker <http://www.jaggersoft.com/pubs/CVu11_3.html> 527*48a54d36SAndroid Build Coastguard Worker <http://www.jaggersoft.com/pubs/CVu11_5.html> 528*48a54d36SAndroid Build Coastguard Worker */ 529*48a54d36SAndroid Build Coastguard Worker 530*48a54d36SAndroid Build Coastguard Worker #define check_compile_time_code( X ) switch( 0 ) { case 0: case X:; } 531*48a54d36SAndroid Build Coastguard Worker 532*48a54d36SAndroid Build Coastguard Worker #if 0 533*48a54d36SAndroid Build Coastguard Worker #pragma mark == check macros == 534*48a54d36SAndroid Build Coastguard Worker #endif 535*48a54d36SAndroid Build Coastguard Worker 536*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 537*48a54d36SAndroid Build Coastguard Worker /*! @defined check 538*48a54d36SAndroid Build Coastguard Worker 539*48a54d36SAndroid Build Coastguard Worker @abstract Check that an expression is true (non-zero). 540*48a54d36SAndroid Build Coastguard Worker 541*48a54d36SAndroid Build Coastguard Worker @discussion 542*48a54d36SAndroid Build Coastguard Worker 543*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this prints debugging information (actual expression string, file, line number, 544*48a54d36SAndroid Build Coastguard Worker function name, etc.) using the default debugging output method. 545*48a54d36SAndroid Build Coastguard Worker 546*48a54d36SAndroid Build Coastguard Worker Code inside check() statements is not compiled into production builds. 547*48a54d36SAndroid Build Coastguard Worker */ 548*48a54d36SAndroid Build Coastguard Worker 549*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 550*48a54d36SAndroid Build Coastguard Worker #undef check 551*48a54d36SAndroid Build Coastguard Worker #endif 552*48a54d36SAndroid Build Coastguard Worker #if( !defined( check ) ) 553*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 554*48a54d36SAndroid Build Coastguard Worker #define check( X ) \ 555*48a54d36SAndroid Build Coastguard Worker do \ 556*48a54d36SAndroid Build Coastguard Worker { \ 557*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 558*48a54d36SAndroid Build Coastguard Worker { \ 559*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 560*48a54d36SAndroid Build Coastguard Worker } \ 561*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 562*48a54d36SAndroid Build Coastguard Worker #else 563*48a54d36SAndroid Build Coastguard Worker #define check( X ) 564*48a54d36SAndroid Build Coastguard Worker #endif 565*48a54d36SAndroid Build Coastguard Worker #endif 566*48a54d36SAndroid Build Coastguard Worker 567*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 568*48a54d36SAndroid Build Coastguard Worker /*! @defined check_string 569*48a54d36SAndroid Build Coastguard Worker 570*48a54d36SAndroid Build Coastguard Worker @abstract Check that an expression is true (non-zero) with an explanation. 571*48a54d36SAndroid Build Coastguard Worker 572*48a54d36SAndroid Build Coastguard Worker @discussion 573*48a54d36SAndroid Build Coastguard Worker 574*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this prints debugging information (actual expression string, file, line number, 575*48a54d36SAndroid Build Coastguard Worker function name, etc.) and a custom explanation string using the default debugging output method. 576*48a54d36SAndroid Build Coastguard Worker 577*48a54d36SAndroid Build Coastguard Worker Code inside check_string() statements is not compiled into production builds. 578*48a54d36SAndroid Build Coastguard Worker */ 579*48a54d36SAndroid Build Coastguard Worker 580*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 581*48a54d36SAndroid Build Coastguard Worker #undef check_string 582*48a54d36SAndroid Build Coastguard Worker #endif 583*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_string ) ) 584*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 585*48a54d36SAndroid Build Coastguard Worker #define check_string( X, STR ) \ 586*48a54d36SAndroid Build Coastguard Worker do \ 587*48a54d36SAndroid Build Coastguard Worker { \ 588*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 589*48a54d36SAndroid Build Coastguard Worker { \ 590*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 591*48a54d36SAndroid Build Coastguard Worker } \ 592*48a54d36SAndroid Build Coastguard Worker \ 593*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 594*48a54d36SAndroid Build Coastguard Worker #else 595*48a54d36SAndroid Build Coastguard Worker #define check_string( X, STR ) 596*48a54d36SAndroid Build Coastguard Worker #endif 597*48a54d36SAndroid Build Coastguard Worker #endif 598*48a54d36SAndroid Build Coastguard Worker 599*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 600*48a54d36SAndroid Build Coastguard Worker /*! @defined check_noerr 601*48a54d36SAndroid Build Coastguard Worker 602*48a54d36SAndroid Build Coastguard Worker @abstract Check that an error code is noErr (0). 603*48a54d36SAndroid Build Coastguard Worker 604*48a54d36SAndroid Build Coastguard Worker @discussion 605*48a54d36SAndroid Build Coastguard Worker 606*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this prints debugging information (actual expression string, file, line number, 607*48a54d36SAndroid Build Coastguard Worker function name, etc.) using the default debugging output method. 608*48a54d36SAndroid Build Coastguard Worker 609*48a54d36SAndroid Build Coastguard Worker Code inside check_noerr() statements is not compiled into production builds. 610*48a54d36SAndroid Build Coastguard Worker */ 611*48a54d36SAndroid Build Coastguard Worker 612*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 613*48a54d36SAndroid Build Coastguard Worker #undef check_noerr 614*48a54d36SAndroid Build Coastguard Worker #endif 615*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_noerr ) ) 616*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 617*48a54d36SAndroid Build Coastguard Worker #define check_noerr( ERR ) \ 618*48a54d36SAndroid Build Coastguard Worker do \ 619*48a54d36SAndroid Build Coastguard Worker { \ 620*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 621*48a54d36SAndroid Build Coastguard Worker \ 622*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERR ); \ 623*48a54d36SAndroid Build Coastguard Worker if( localErr != 0 ) \ 624*48a54d36SAndroid Build Coastguard Worker { \ 625*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 626*48a54d36SAndroid Build Coastguard Worker } \ 627*48a54d36SAndroid Build Coastguard Worker \ 628*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 629*48a54d36SAndroid Build Coastguard Worker #else 630*48a54d36SAndroid Build Coastguard Worker #define check_noerr( ERR ) 631*48a54d36SAndroid Build Coastguard Worker #endif 632*48a54d36SAndroid Build Coastguard Worker #endif 633*48a54d36SAndroid Build Coastguard Worker 634*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 635*48a54d36SAndroid Build Coastguard Worker /*! @defined check_noerr_string 636*48a54d36SAndroid Build Coastguard Worker 637*48a54d36SAndroid Build Coastguard Worker @abstract Check that an error code is noErr (0) with an explanation. 638*48a54d36SAndroid Build Coastguard Worker 639*48a54d36SAndroid Build Coastguard Worker @discussion 640*48a54d36SAndroid Build Coastguard Worker 641*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this prints debugging information (actual expression string, file, line number, 642*48a54d36SAndroid Build Coastguard Worker function name, etc.) and a custom explanation string using the default debugging output method. 643*48a54d36SAndroid Build Coastguard Worker 644*48a54d36SAndroid Build Coastguard Worker Code inside check_noerr_string() statements is not compiled into production builds. 645*48a54d36SAndroid Build Coastguard Worker */ 646*48a54d36SAndroid Build Coastguard Worker 647*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 648*48a54d36SAndroid Build Coastguard Worker #undef check_noerr_string 649*48a54d36SAndroid Build Coastguard Worker #endif 650*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_noerr_string ) ) 651*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 652*48a54d36SAndroid Build Coastguard Worker #define check_noerr_string( ERR, STR ) \ 653*48a54d36SAndroid Build Coastguard Worker do \ 654*48a54d36SAndroid Build Coastguard Worker { \ 655*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 656*48a54d36SAndroid Build Coastguard Worker \ 657*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERR ); \ 658*48a54d36SAndroid Build Coastguard Worker if( localErr != 0 ) \ 659*48a54d36SAndroid Build Coastguard Worker { \ 660*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 661*48a54d36SAndroid Build Coastguard Worker } \ 662*48a54d36SAndroid Build Coastguard Worker \ 663*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 664*48a54d36SAndroid Build Coastguard Worker #else 665*48a54d36SAndroid Build Coastguard Worker #define check_noerr_string( ERR, STR ) 666*48a54d36SAndroid Build Coastguard Worker #endif 667*48a54d36SAndroid Build Coastguard Worker #endif 668*48a54d36SAndroid Build Coastguard Worker 669*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 670*48a54d36SAndroid Build Coastguard Worker /*! @defined check_translated_errno 671*48a54d36SAndroid Build Coastguard Worker 672*48a54d36SAndroid Build Coastguard Worker @abstract Check a condition and prints errno (if non-zero) to the log. 673*48a54d36SAndroid Build Coastguard Worker 674*48a54d36SAndroid Build Coastguard Worker @discussion 675*48a54d36SAndroid Build Coastguard Worker 676*48a54d36SAndroid Build Coastguard Worker Code inside check_translated_errno() statements is not compiled into production builds. 677*48a54d36SAndroid Build Coastguard Worker */ 678*48a54d36SAndroid Build Coastguard Worker 679*48a54d36SAndroid Build Coastguard Worker #if( !defined( check_translated_errno ) ) 680*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 681*48a54d36SAndroid Build Coastguard Worker #define check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR ) \ 682*48a54d36SAndroid Build Coastguard Worker do \ 683*48a54d36SAndroid Build Coastguard Worker { \ 684*48a54d36SAndroid Build Coastguard Worker if( !( TEST ) ) \ 685*48a54d36SAndroid Build Coastguard Worker { \ 686*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 687*48a54d36SAndroid Build Coastguard Worker \ 688*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERRNO ); \ 689*48a54d36SAndroid Build Coastguard Worker localErr = ( localErr != 0 ) ? localErr : (int_least32_t)( ALTERNATE_ERROR ); \ 690*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, #TEST, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 691*48a54d36SAndroid Build Coastguard Worker } \ 692*48a54d36SAndroid Build Coastguard Worker \ 693*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 694*48a54d36SAndroid Build Coastguard Worker #else 695*48a54d36SAndroid Build Coastguard Worker #define check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR ) 696*48a54d36SAndroid Build Coastguard Worker #endif 697*48a54d36SAndroid Build Coastguard Worker #endif 698*48a54d36SAndroid Build Coastguard Worker 699*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 700*48a54d36SAndroid Build Coastguard Worker /*! @defined check_ptr_overlap 701*48a54d36SAndroid Build Coastguard Worker 702*48a54d36SAndroid Build Coastguard Worker @abstract Checks that two ptrs do not overlap. 703*48a54d36SAndroid Build Coastguard Worker */ 704*48a54d36SAndroid Build Coastguard Worker 705*48a54d36SAndroid Build Coastguard Worker #define check_ptr_overlap( P1, P1_SIZE, P2, P2_SIZE ) \ 706*48a54d36SAndroid Build Coastguard Worker do \ 707*48a54d36SAndroid Build Coastguard Worker { \ 708*48a54d36SAndroid Build Coastguard Worker check( !( ( (uintptr_t)( P1 ) >= (uintptr_t)( P2 ) ) && \ 709*48a54d36SAndroid Build Coastguard Worker ( (uintptr_t)( P1 ) < ( ( (uintptr_t)( P2 ) ) + ( P2_SIZE ) ) ) ) ); \ 710*48a54d36SAndroid Build Coastguard Worker check( !( ( (uintptr_t)( P2 ) >= (uintptr_t)( P1 ) ) && \ 711*48a54d36SAndroid Build Coastguard Worker ( (uintptr_t)( P2 ) < ( ( (uintptr_t)( P1 ) ) + ( P1_SIZE ) ) ) ) ); \ 712*48a54d36SAndroid Build Coastguard Worker \ 713*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 714*48a54d36SAndroid Build Coastguard Worker 715*48a54d36SAndroid Build Coastguard Worker #if 0 716*48a54d36SAndroid Build Coastguard Worker #pragma mark == require macros == 717*48a54d36SAndroid Build Coastguard Worker #endif 718*48a54d36SAndroid Build Coastguard Worker 719*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 720*48a54d36SAndroid Build Coastguard Worker /*! @defined require 721*48a54d36SAndroid Build Coastguard Worker 722*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluate to true. 723*48a54d36SAndroid Build Coastguard Worker 724*48a54d36SAndroid Build Coastguard Worker @discussion 725*48a54d36SAndroid Build Coastguard Worker 726*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this prints debugging information (actual expression string, file, line number, 727*48a54d36SAndroid Build Coastguard Worker function name, etc.) using the default debugging output method then jumps to a label. 728*48a54d36SAndroid Build Coastguard Worker */ 729*48a54d36SAndroid Build Coastguard Worker 730*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 731*48a54d36SAndroid Build Coastguard Worker #undef require 732*48a54d36SAndroid Build Coastguard Worker #endif 733*48a54d36SAndroid Build Coastguard Worker #if( !defined( require ) ) 734*48a54d36SAndroid Build Coastguard Worker #define require( X, LABEL ) \ 735*48a54d36SAndroid Build Coastguard Worker do \ 736*48a54d36SAndroid Build Coastguard Worker { \ 737*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 738*48a54d36SAndroid Build Coastguard Worker { \ 739*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 740*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 741*48a54d36SAndroid Build Coastguard Worker } \ 742*48a54d36SAndroid Build Coastguard Worker \ 743*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 744*48a54d36SAndroid Build Coastguard Worker #endif 745*48a54d36SAndroid Build Coastguard Worker 746*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 747*48a54d36SAndroid Build Coastguard Worker /*! @defined require_string 748*48a54d36SAndroid Build Coastguard Worker 749*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluate to true with an explanation. 750*48a54d36SAndroid Build Coastguard Worker 751*48a54d36SAndroid Build Coastguard Worker @discussion 752*48a54d36SAndroid Build Coastguard Worker 753*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this prints debugging information (actual expression string, file, line number, 754*48a54d36SAndroid Build Coastguard Worker function name, etc.) and a custom explanation string using the default debugging output method then jumps to a label. 755*48a54d36SAndroid Build Coastguard Worker */ 756*48a54d36SAndroid Build Coastguard Worker 757*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 758*48a54d36SAndroid Build Coastguard Worker #undef require_string 759*48a54d36SAndroid Build Coastguard Worker #endif 760*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_string ) ) 761*48a54d36SAndroid Build Coastguard Worker #define require_string( X, LABEL, STR ) \ 762*48a54d36SAndroid Build Coastguard Worker do \ 763*48a54d36SAndroid Build Coastguard Worker { \ 764*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 765*48a54d36SAndroid Build Coastguard Worker { \ 766*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 767*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 768*48a54d36SAndroid Build Coastguard Worker } \ 769*48a54d36SAndroid Build Coastguard Worker \ 770*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 771*48a54d36SAndroid Build Coastguard Worker #endif 772*48a54d36SAndroid Build Coastguard Worker 773*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 774*48a54d36SAndroid Build Coastguard Worker /*! @defined require_quiet 775*48a54d36SAndroid Build Coastguard Worker 776*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluate to true. 777*48a54d36SAndroid Build Coastguard Worker 778*48a54d36SAndroid Build Coastguard Worker @discussion 779*48a54d36SAndroid Build Coastguard Worker 780*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this jumps to a label. No debugging information is printed. 781*48a54d36SAndroid Build Coastguard Worker */ 782*48a54d36SAndroid Build Coastguard Worker 783*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 784*48a54d36SAndroid Build Coastguard Worker #undef require_quiet 785*48a54d36SAndroid Build Coastguard Worker #endif 786*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_quiet ) ) 787*48a54d36SAndroid Build Coastguard Worker #define require_quiet( X, LABEL ) \ 788*48a54d36SAndroid Build Coastguard Worker do \ 789*48a54d36SAndroid Build Coastguard Worker { \ 790*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 791*48a54d36SAndroid Build Coastguard Worker { \ 792*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 793*48a54d36SAndroid Build Coastguard Worker } \ 794*48a54d36SAndroid Build Coastguard Worker \ 795*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 796*48a54d36SAndroid Build Coastguard Worker #endif 797*48a54d36SAndroid Build Coastguard Worker 798*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 799*48a54d36SAndroid Build Coastguard Worker /*! @defined require_noerr 800*48a54d36SAndroid Build Coastguard Worker 801*48a54d36SAndroid Build Coastguard Worker @abstract Require that an error code is noErr (0). 802*48a54d36SAndroid Build Coastguard Worker 803*48a54d36SAndroid Build Coastguard Worker @discussion 804*48a54d36SAndroid Build Coastguard Worker 805*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this prints debugging information (actual expression string, file, line number, 806*48a54d36SAndroid Build Coastguard Worker function name, etc.) using the default debugging output method then jumps to a label. 807*48a54d36SAndroid Build Coastguard Worker */ 808*48a54d36SAndroid Build Coastguard Worker 809*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 810*48a54d36SAndroid Build Coastguard Worker #undef require_noerr 811*48a54d36SAndroid Build Coastguard Worker #endif 812*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr ) ) 813*48a54d36SAndroid Build Coastguard Worker #define require_noerr( ERR, LABEL ) \ 814*48a54d36SAndroid Build Coastguard Worker do \ 815*48a54d36SAndroid Build Coastguard Worker { \ 816*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 817*48a54d36SAndroid Build Coastguard Worker \ 818*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERR ); \ 819*48a54d36SAndroid Build Coastguard Worker if( localErr != 0 ) \ 820*48a54d36SAndroid Build Coastguard Worker { \ 821*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 822*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 823*48a54d36SAndroid Build Coastguard Worker } \ 824*48a54d36SAndroid Build Coastguard Worker \ 825*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 826*48a54d36SAndroid Build Coastguard Worker #endif 827*48a54d36SAndroid Build Coastguard Worker 828*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 829*48a54d36SAndroid Build Coastguard Worker /*! @defined require_noerr_string 830*48a54d36SAndroid Build Coastguard Worker 831*48a54d36SAndroid Build Coastguard Worker @abstract Require that an error code is noErr (0). 832*48a54d36SAndroid Build Coastguard Worker 833*48a54d36SAndroid Build Coastguard Worker @discussion 834*48a54d36SAndroid Build Coastguard Worker 835*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this prints debugging information (actual expression string, file, line number, 836*48a54d36SAndroid Build Coastguard Worker function name, etc.), and a custom explanation string using the default debugging output method using the 837*48a54d36SAndroid Build Coastguard Worker default debugging output method then jumps to a label. 838*48a54d36SAndroid Build Coastguard Worker */ 839*48a54d36SAndroid Build Coastguard Worker 840*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 841*48a54d36SAndroid Build Coastguard Worker #undef require_noerr_string 842*48a54d36SAndroid Build Coastguard Worker #endif 843*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_string ) ) 844*48a54d36SAndroid Build Coastguard Worker #define require_noerr_string( ERR, LABEL, STR ) \ 845*48a54d36SAndroid Build Coastguard Worker do \ 846*48a54d36SAndroid Build Coastguard Worker { \ 847*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 848*48a54d36SAndroid Build Coastguard Worker \ 849*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERR ); \ 850*48a54d36SAndroid Build Coastguard Worker if( localErr != 0 ) \ 851*48a54d36SAndroid Build Coastguard Worker { \ 852*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 853*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 854*48a54d36SAndroid Build Coastguard Worker } \ 855*48a54d36SAndroid Build Coastguard Worker \ 856*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 857*48a54d36SAndroid Build Coastguard Worker #endif 858*48a54d36SAndroid Build Coastguard Worker 859*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 860*48a54d36SAndroid Build Coastguard Worker /*! @defined require_noerr_action_string 861*48a54d36SAndroid Build Coastguard Worker 862*48a54d36SAndroid Build Coastguard Worker @abstract Require that an error code is noErr (0). 863*48a54d36SAndroid Build Coastguard Worker 864*48a54d36SAndroid Build Coastguard Worker @discussion 865*48a54d36SAndroid Build Coastguard Worker 866*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this prints debugging information (actual expression string, file, line number, 867*48a54d36SAndroid Build Coastguard Worker function name, etc.), and a custom explanation string using the default debugging output method using the 868*48a54d36SAndroid Build Coastguard Worker default debugging output method then executes an action and jumps to a label. 869*48a54d36SAndroid Build Coastguard Worker */ 870*48a54d36SAndroid Build Coastguard Worker 871*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 872*48a54d36SAndroid Build Coastguard Worker #undef require_noerr_action_string 873*48a54d36SAndroid Build Coastguard Worker #endif 874*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_action_string ) ) 875*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_string( ERR, LABEL, ACTION, STR ) \ 876*48a54d36SAndroid Build Coastguard Worker do \ 877*48a54d36SAndroid Build Coastguard Worker { \ 878*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 879*48a54d36SAndroid Build Coastguard Worker \ 880*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERR ); \ 881*48a54d36SAndroid Build Coastguard Worker if( localErr != 0 ) \ 882*48a54d36SAndroid Build Coastguard Worker { \ 883*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, NULL, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 884*48a54d36SAndroid Build Coastguard Worker { ACTION; } \ 885*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 886*48a54d36SAndroid Build Coastguard Worker } \ 887*48a54d36SAndroid Build Coastguard Worker \ 888*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 889*48a54d36SAndroid Build Coastguard Worker #endif 890*48a54d36SAndroid Build Coastguard Worker 891*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 892*48a54d36SAndroid Build Coastguard Worker /*! @defined require_noerr_quiet 893*48a54d36SAndroid Build Coastguard Worker 894*48a54d36SAndroid Build Coastguard Worker @abstract Require that an error code is noErr (0). 895*48a54d36SAndroid Build Coastguard Worker 896*48a54d36SAndroid Build Coastguard Worker @discussion 897*48a54d36SAndroid Build Coastguard Worker 898*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this jumps to a label. No debugging information is printed. 899*48a54d36SAndroid Build Coastguard Worker */ 900*48a54d36SAndroid Build Coastguard Worker 901*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 902*48a54d36SAndroid Build Coastguard Worker #undef require_noerr_quiet 903*48a54d36SAndroid Build Coastguard Worker #endif 904*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_quiet ) ) 905*48a54d36SAndroid Build Coastguard Worker #define require_noerr_quiet( ERR, LABEL ) \ 906*48a54d36SAndroid Build Coastguard Worker do \ 907*48a54d36SAndroid Build Coastguard Worker { \ 908*48a54d36SAndroid Build Coastguard Worker if( ( ERR ) != 0 ) \ 909*48a54d36SAndroid Build Coastguard Worker { \ 910*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 911*48a54d36SAndroid Build Coastguard Worker } \ 912*48a54d36SAndroid Build Coastguard Worker \ 913*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 914*48a54d36SAndroid Build Coastguard Worker #endif 915*48a54d36SAndroid Build Coastguard Worker 916*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 917*48a54d36SAndroid Build Coastguard Worker /*! @defined require_noerr_action 918*48a54d36SAndroid Build Coastguard Worker 919*48a54d36SAndroid Build Coastguard Worker @abstract Require that an error code is noErr (0) with an action to execute otherwise. 920*48a54d36SAndroid Build Coastguard Worker 921*48a54d36SAndroid Build Coastguard Worker @discussion 922*48a54d36SAndroid Build Coastguard Worker 923*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this prints debugging information (actual expression string, file, line number, 924*48a54d36SAndroid Build Coastguard Worker function name, etc.) using the default debugging output method then executes an action and jumps to a label. 925*48a54d36SAndroid Build Coastguard Worker */ 926*48a54d36SAndroid Build Coastguard Worker 927*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 928*48a54d36SAndroid Build Coastguard Worker #undef require_noerr_action 929*48a54d36SAndroid Build Coastguard Worker #endif 930*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_action ) ) 931*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action( ERR, LABEL, ACTION ) \ 932*48a54d36SAndroid Build Coastguard Worker do \ 933*48a54d36SAndroid Build Coastguard Worker { \ 934*48a54d36SAndroid Build Coastguard Worker int_least32_t localErr; \ 935*48a54d36SAndroid Build Coastguard Worker \ 936*48a54d36SAndroid Build Coastguard Worker localErr = (int_least32_t)( ERR ); \ 937*48a54d36SAndroid Build Coastguard Worker if( localErr != 0 ) \ 938*48a54d36SAndroid Build Coastguard Worker { \ 939*48a54d36SAndroid Build Coastguard Worker debug_print_assert( localErr, NULL, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 940*48a54d36SAndroid Build Coastguard Worker { ACTION; } \ 941*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 942*48a54d36SAndroid Build Coastguard Worker } \ 943*48a54d36SAndroid Build Coastguard Worker \ 944*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 945*48a54d36SAndroid Build Coastguard Worker #endif 946*48a54d36SAndroid Build Coastguard Worker 947*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 948*48a54d36SAndroid Build Coastguard Worker /*! @defined require_noerr_action_quiet 949*48a54d36SAndroid Build Coastguard Worker 950*48a54d36SAndroid Build Coastguard Worker @abstract Require that an error code is noErr (0) with an action to execute otherwise. 951*48a54d36SAndroid Build Coastguard Worker 952*48a54d36SAndroid Build Coastguard Worker @discussion 953*48a54d36SAndroid Build Coastguard Worker 954*48a54d36SAndroid Build Coastguard Worker If the error code is non-0, this executes an action and jumps to a label. No debugging information is printed. 955*48a54d36SAndroid Build Coastguard Worker */ 956*48a54d36SAndroid Build Coastguard Worker 957*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 958*48a54d36SAndroid Build Coastguard Worker #undef require_noerr_action_quiet 959*48a54d36SAndroid Build Coastguard Worker #endif 960*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_noerr_action_quiet ) ) 961*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_quiet( ERR, LABEL, ACTION ) \ 962*48a54d36SAndroid Build Coastguard Worker do \ 963*48a54d36SAndroid Build Coastguard Worker { \ 964*48a54d36SAndroid Build Coastguard Worker if( ( ERR ) != 0 ) \ 965*48a54d36SAndroid Build Coastguard Worker { \ 966*48a54d36SAndroid Build Coastguard Worker { ACTION; } \ 967*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 968*48a54d36SAndroid Build Coastguard Worker } \ 969*48a54d36SAndroid Build Coastguard Worker \ 970*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 971*48a54d36SAndroid Build Coastguard Worker #endif 972*48a54d36SAndroid Build Coastguard Worker 973*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 974*48a54d36SAndroid Build Coastguard Worker /*! @defined require_action 975*48a54d36SAndroid Build Coastguard Worker 976*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluate to true with an action to execute otherwise. 977*48a54d36SAndroid Build Coastguard Worker 978*48a54d36SAndroid Build Coastguard Worker @discussion 979*48a54d36SAndroid Build Coastguard Worker 980*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this prints debugging information (actual expression string, file, line number, 981*48a54d36SAndroid Build Coastguard Worker function name, etc.) using the default debugging output method then executes an action and jumps to a label. 982*48a54d36SAndroid Build Coastguard Worker */ 983*48a54d36SAndroid Build Coastguard Worker 984*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 985*48a54d36SAndroid Build Coastguard Worker #undef require_action 986*48a54d36SAndroid Build Coastguard Worker #endif 987*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_action ) ) 988*48a54d36SAndroid Build Coastguard Worker #define require_action( X, LABEL, ACTION ) \ 989*48a54d36SAndroid Build Coastguard Worker do \ 990*48a54d36SAndroid Build Coastguard Worker { \ 991*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 992*48a54d36SAndroid Build Coastguard Worker { \ 993*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 994*48a54d36SAndroid Build Coastguard Worker { ACTION; } \ 995*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 996*48a54d36SAndroid Build Coastguard Worker } \ 997*48a54d36SAndroid Build Coastguard Worker \ 998*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 999*48a54d36SAndroid Build Coastguard Worker #endif 1000*48a54d36SAndroid Build Coastguard Worker 1001*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1002*48a54d36SAndroid Build Coastguard Worker /*! @defined require_action_quiet 1003*48a54d36SAndroid Build Coastguard Worker 1004*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluate to true with an action to execute otherwise. 1005*48a54d36SAndroid Build Coastguard Worker 1006*48a54d36SAndroid Build Coastguard Worker @discussion 1007*48a54d36SAndroid Build Coastguard Worker 1008*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this executes an action and jumps to a label. No debugging information is printed. 1009*48a54d36SAndroid Build Coastguard Worker */ 1010*48a54d36SAndroid Build Coastguard Worker 1011*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 1012*48a54d36SAndroid Build Coastguard Worker #undef require_action_quiet 1013*48a54d36SAndroid Build Coastguard Worker #endif 1014*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_action_quiet ) ) 1015*48a54d36SAndroid Build Coastguard Worker #define require_action_quiet( X, LABEL, ACTION ) \ 1016*48a54d36SAndroid Build Coastguard Worker do \ 1017*48a54d36SAndroid Build Coastguard Worker { \ 1018*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 1019*48a54d36SAndroid Build Coastguard Worker { \ 1020*48a54d36SAndroid Build Coastguard Worker { ACTION; } \ 1021*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 1022*48a54d36SAndroid Build Coastguard Worker } \ 1023*48a54d36SAndroid Build Coastguard Worker \ 1024*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 1025*48a54d36SAndroid Build Coastguard Worker #endif 1026*48a54d36SAndroid Build Coastguard Worker 1027*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1028*48a54d36SAndroid Build Coastguard Worker /*! @defined require_action_string 1029*48a54d36SAndroid Build Coastguard Worker 1030*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluate to true with an explanation and action to execute otherwise. 1031*48a54d36SAndroid Build Coastguard Worker 1032*48a54d36SAndroid Build Coastguard Worker @discussion 1033*48a54d36SAndroid Build Coastguard Worker 1034*48a54d36SAndroid Build Coastguard Worker If expression evalulates to false, this prints debugging information (actual expression string, file, line number, 1035*48a54d36SAndroid Build Coastguard Worker function name, etc.) and a custom explanation string using the default debugging output method then executes an 1036*48a54d36SAndroid Build Coastguard Worker action and jumps to a label. 1037*48a54d36SAndroid Build Coastguard Worker */ 1038*48a54d36SAndroid Build Coastguard Worker 1039*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 1040*48a54d36SAndroid Build Coastguard Worker #undef require_action_string 1041*48a54d36SAndroid Build Coastguard Worker #endif 1042*48a54d36SAndroid Build Coastguard Worker #if( !defined( require_action_string ) ) 1043*48a54d36SAndroid Build Coastguard Worker #define require_action_string( X, LABEL, ACTION, STR ) \ 1044*48a54d36SAndroid Build Coastguard Worker do \ 1045*48a54d36SAndroid Build Coastguard Worker { \ 1046*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 1047*48a54d36SAndroid Build Coastguard Worker { \ 1048*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 1049*48a54d36SAndroid Build Coastguard Worker { ACTION; } \ 1050*48a54d36SAndroid Build Coastguard Worker goto LABEL; \ 1051*48a54d36SAndroid Build Coastguard Worker } \ 1052*48a54d36SAndroid Build Coastguard Worker \ 1053*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 1054*48a54d36SAndroid Build Coastguard Worker 1055*48a54d36SAndroid Build Coastguard Worker #endif 1056*48a54d36SAndroid Build Coastguard Worker 1057*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1058*48a54d36SAndroid Build Coastguard Worker /*! @defined require_throw 1059*48a54d36SAndroid Build Coastguard Worker 1060*48a54d36SAndroid Build Coastguard Worker @abstract Requires that an expression evaluates to true or an exception is thrown. 1061*48a54d36SAndroid Build Coastguard Worker 1062*48a54d36SAndroid Build Coastguard Worker @discussion 1063*48a54d36SAndroid Build Coastguard Worker 1064*48a54d36SAndroid Build Coastguard Worker If the expression evaluates to false, this prints debugging information (actual expression string, file, 1065*48a54d36SAndroid Build Coastguard Worker line number, function name, etc.) using the default debugging output method then throws an exception. 1066*48a54d36SAndroid Build Coastguard Worker */ 1067*48a54d36SAndroid Build Coastguard Worker 1068*48a54d36SAndroid Build Coastguard Worker #if( defined( __cplusplus ) ) 1069*48a54d36SAndroid Build Coastguard Worker #define require_throw( X ) \ 1070*48a54d36SAndroid Build Coastguard Worker do \ 1071*48a54d36SAndroid Build Coastguard Worker { \ 1072*48a54d36SAndroid Build Coastguard Worker if( !( X ) ) \ 1073*48a54d36SAndroid Build Coastguard Worker { \ 1074*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, #X, NULL, __FILE__, __LINE__, __ROUTINE__ ); \ 1075*48a54d36SAndroid Build Coastguard Worker throw kUnknownErr; \ 1076*48a54d36SAndroid Build Coastguard Worker } \ 1077*48a54d36SAndroid Build Coastguard Worker \ 1078*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 1079*48a54d36SAndroid Build Coastguard Worker #endif 1080*48a54d36SAndroid Build Coastguard Worker 1081*48a54d36SAndroid Build Coastguard Worker #if 0 1082*48a54d36SAndroid Build Coastguard Worker #pragma mark == Design-By-Contract macros == 1083*48a54d36SAndroid Build Coastguard Worker #endif 1084*48a54d36SAndroid Build Coastguard Worker 1085*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 1086*48a54d36SAndroid Build Coastguard Worker // Design-By-Contract macros 1087*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 1088*48a54d36SAndroid Build Coastguard Worker 1089*48a54d36SAndroid Build Coastguard Worker #define ensure( X ) check( X ) 1090*48a54d36SAndroid Build Coastguard Worker #define ensure_string( X, STR ) check_string( X, STR ) 1091*48a54d36SAndroid Build Coastguard Worker #define ensure_noerr( ERR ) check_noerr( ERR ) 1092*48a54d36SAndroid Build Coastguard Worker #define ensure_noerr_string( ERR, STR ) check_noerr_string( ERR, STR ) 1093*48a54d36SAndroid Build Coastguard Worker #define ensure_translated_errno( TEST, ERRNO, ALTERNATE_ERROR ) check_translated_errno( TEST, ERRNO, ALTERNATE_ERROR ) 1094*48a54d36SAndroid Build Coastguard Worker 1095*48a54d36SAndroid Build Coastguard Worker // Note: Design-By-Contract "require" macros are already defined elsewhere. 1096*48a54d36SAndroid Build Coastguard Worker 1097*48a54d36SAndroid Build Coastguard Worker #if 0 1098*48a54d36SAndroid Build Coastguard Worker #pragma mark == Expect macros == 1099*48a54d36SAndroid Build Coastguard Worker #endif 1100*48a54d36SAndroid Build Coastguard Worker 1101*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 1102*48a54d36SAndroid Build Coastguard Worker // Expect macros 1103*48a54d36SAndroid Build Coastguard Worker //=========================================================================================================================== 1104*48a54d36SAndroid Build Coastguard Worker 1105*48a54d36SAndroid Build Coastguard Worker // Expect macros allow code to include runtime checking of things that should not happen in shipping code (e.g. internal 1106*48a54d36SAndroid Build Coastguard Worker // programmer errors, such as a NULL parameter where it is not allowed). Once the code has been verified to work correctly 1107*48a54d36SAndroid Build Coastguard Worker // without asserting, the DEBUG_EXPECT_VERIFIED conditional can be set to eliminate the error checking entirely. It can 1108*48a54d36SAndroid Build Coastguard Worker // also be useful to measure the cost of error checking code by profiling with it enable and with it disabled. 1109*48a54d36SAndroid Build Coastguard Worker 1110*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_EXPECT_VERIFIED ) 1111*48a54d36SAndroid Build Coastguard Worker #define require_expect 1112*48a54d36SAndroid Build Coastguard Worker #define require_string_expect 1113*48a54d36SAndroid Build Coastguard Worker #define require_quiet_expect 1114*48a54d36SAndroid Build Coastguard Worker #define require_noerr_expect 1115*48a54d36SAndroid Build Coastguard Worker #define require_noerr_string_expect 1116*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_string_expect 1117*48a54d36SAndroid Build Coastguard Worker #define require_noerr_quiet_expect 1118*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_expect 1119*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_quiet_expect 1120*48a54d36SAndroid Build Coastguard Worker #define require_action_expect 1121*48a54d36SAndroid Build Coastguard Worker #define require_action_quiet_expect 1122*48a54d36SAndroid Build Coastguard Worker #define require_action_string_expect 1123*48a54d36SAndroid Build Coastguard Worker #else 1124*48a54d36SAndroid Build Coastguard Worker #define require_expect require 1125*48a54d36SAndroid Build Coastguard Worker #define require_string_expect require_string 1126*48a54d36SAndroid Build Coastguard Worker #define require_quiet_expect require_quiet 1127*48a54d36SAndroid Build Coastguard Worker #define require_noerr_expect require_noerr 1128*48a54d36SAndroid Build Coastguard Worker #define require_noerr_string_expect require_noerr_string 1129*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_string_expect require_noerr_action_string 1130*48a54d36SAndroid Build Coastguard Worker #define require_noerr_quiet_expect require_noerr_quiet 1131*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_expect require_noerr_action 1132*48a54d36SAndroid Build Coastguard Worker #define require_noerr_action_quiet_expect require_noerr_action_quiet 1133*48a54d36SAndroid Build Coastguard Worker #define require_action_expect require_action 1134*48a54d36SAndroid Build Coastguard Worker #define require_action_quiet_expect require_action_quiet 1135*48a54d36SAndroid Build Coastguard Worker #define require_action_string_expect require_action_string 1136*48a54d36SAndroid Build Coastguard Worker #endif 1137*48a54d36SAndroid Build Coastguard Worker 1138*48a54d36SAndroid Build Coastguard Worker #if 0 1139*48a54d36SAndroid Build Coastguard Worker #pragma mark == Output macros == 1140*48a54d36SAndroid Build Coastguard Worker #endif 1141*48a54d36SAndroid Build Coastguard Worker 1142*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1143*48a54d36SAndroid Build Coastguard Worker /*! @defined debug_string 1144*48a54d36SAndroid Build Coastguard Worker 1145*48a54d36SAndroid Build Coastguard Worker @abstract Prints a debugging C string. 1146*48a54d36SAndroid Build Coastguard Worker */ 1147*48a54d36SAndroid Build Coastguard Worker 1148*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_OVERRIDE_APPLE_MACROS ) 1149*48a54d36SAndroid Build Coastguard Worker #undef debug_string 1150*48a54d36SAndroid Build Coastguard Worker #endif 1151*48a54d36SAndroid Build Coastguard Worker #if( !defined( debug_string ) ) 1152*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1153*48a54d36SAndroid Build Coastguard Worker #define debug_string( STR ) \ 1154*48a54d36SAndroid Build Coastguard Worker do \ 1155*48a54d36SAndroid Build Coastguard Worker { \ 1156*48a54d36SAndroid Build Coastguard Worker debug_print_assert( 0, NULL, STR, __FILE__, __LINE__, __ROUTINE__ ); \ 1157*48a54d36SAndroid Build Coastguard Worker \ 1158*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 1159*48a54d36SAndroid Build Coastguard Worker #else 1160*48a54d36SAndroid Build Coastguard Worker #define debug_string( STR ) 1161*48a54d36SAndroid Build Coastguard Worker #endif 1162*48a54d36SAndroid Build Coastguard Worker #endif 1163*48a54d36SAndroid Build Coastguard Worker 1164*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1165*48a54d36SAndroid Build Coastguard Worker /*! @defined debug_print_assert 1166*48a54d36SAndroid Build Coastguard Worker 1167*48a54d36SAndroid Build Coastguard Worker @abstract Prints an assertion. 1168*48a54d36SAndroid Build Coastguard Worker */ 1169*48a54d36SAndroid Build Coastguard Worker 1170*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1171*48a54d36SAndroid Build Coastguard Worker #define debug_print_assert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION ) \ 1172*48a54d36SAndroid Build Coastguard Worker DebugPrintAssert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION ) 1173*48a54d36SAndroid Build Coastguard Worker #else 1174*48a54d36SAndroid Build Coastguard Worker #define debug_print_assert( ERROR_CODE, ASSERT_STRING, MESSAGE, FILENAME, LINE_NUMBER, FUNCTION ) 1175*48a54d36SAndroid Build Coastguard Worker #endif 1176*48a54d36SAndroid Build Coastguard Worker 1177*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1178*48a54d36SAndroid Build Coastguard Worker /*! @defined dlog 1179*48a54d36SAndroid Build Coastguard Worker 1180*48a54d36SAndroid Build Coastguard Worker @abstract Prints a debug-only message. 1181*48a54d36SAndroid Build Coastguard Worker */ 1182*48a54d36SAndroid Build Coastguard Worker 1183*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1184*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1185*48a54d36SAndroid Build Coastguard Worker #define dlog( ... ) DebugPrintF( __VA_ARGS__ ) 1186*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1187*48a54d36SAndroid Build Coastguard Worker #define dlog( ARGS... ) DebugPrintF( ## ARGS ) 1188*48a54d36SAndroid Build Coastguard Worker #else 1189*48a54d36SAndroid Build Coastguard Worker #define dlog DebugPrintF 1190*48a54d36SAndroid Build Coastguard Worker #endif 1191*48a54d36SAndroid Build Coastguard Worker #else 1192*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1193*48a54d36SAndroid Build Coastguard Worker #define dlog( ... ) 1194*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1195*48a54d36SAndroid Build Coastguard Worker #define dlog( ARGS... ) 1196*48a54d36SAndroid Build Coastguard Worker #else 1197*48a54d36SAndroid Build Coastguard Worker #define dlog while( 0 ) 1198*48a54d36SAndroid Build Coastguard Worker #endif 1199*48a54d36SAndroid Build Coastguard Worker #endif 1200*48a54d36SAndroid Build Coastguard Worker 1201*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1202*48a54d36SAndroid Build Coastguard Worker /*! @defined dlogv 1203*48a54d36SAndroid Build Coastguard Worker 1204*48a54d36SAndroid Build Coastguard Worker @abstract Prints a debug-only message. 1205*48a54d36SAndroid Build Coastguard Worker */ 1206*48a54d36SAndroid Build Coastguard Worker 1207*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1208*48a54d36SAndroid Build Coastguard Worker #define dlogv( LEVEL, FORMAT, LIST ) DebugPrintFVAList( ( LEVEL ), ( FORMAT ), ( LIST ) ) 1209*48a54d36SAndroid Build Coastguard Worker #else 1210*48a54d36SAndroid Build Coastguard Worker #define dlogv( LEVEL, FORMAT, LIST ) 1211*48a54d36SAndroid Build Coastguard Worker #endif 1212*48a54d36SAndroid Build Coastguard Worker 1213*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1214*48a54d36SAndroid Build Coastguard Worker /*! @defined dlogmem 1215*48a54d36SAndroid Build Coastguard Worker 1216*48a54d36SAndroid Build Coastguard Worker @abstract Prints a debug-only dump of memory. 1217*48a54d36SAndroid Build Coastguard Worker */ 1218*48a54d36SAndroid Build Coastguard Worker 1219*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1220*48a54d36SAndroid Build Coastguard Worker #define dlogmem( LEVEL, PTR, SIZE ) \ 1221*48a54d36SAndroid Build Coastguard Worker DebugHexDump( ( LEVEL ), 0, NULL, 0, 0, NULL, 0, ( PTR ), ( PTR ), ( SIZE ), kDebugFlagsNone, NULL, 0 ) 1222*48a54d36SAndroid Build Coastguard Worker #else 1223*48a54d36SAndroid Build Coastguard Worker #define dlogmem( LEVEL, PTR, SIZE ) 1224*48a54d36SAndroid Build Coastguard Worker #endif 1225*48a54d36SAndroid Build Coastguard Worker 1226*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1227*48a54d36SAndroid Build Coastguard Worker /*! @defined DebugNSLog 1228*48a54d36SAndroid Build Coastguard Worker 1229*48a54d36SAndroid Build Coastguard Worker @abstract Debug-only macro for the Cocoa NSLog function. 1230*48a54d36SAndroid Build Coastguard Worker */ 1231*48a54d36SAndroid Build Coastguard Worker 1232*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1233*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1234*48a54d36SAndroid Build Coastguard Worker #define DebugNSLog( ... ) NSLog( __VA_ARGS__ ) 1235*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1236*48a54d36SAndroid Build Coastguard Worker #define DebugNSLog( ARGS... ) NSLog( ## ARGS ) 1237*48a54d36SAndroid Build Coastguard Worker #else 1238*48a54d36SAndroid Build Coastguard Worker #define DebugNSLog NSLog 1239*48a54d36SAndroid Build Coastguard Worker #endif 1240*48a54d36SAndroid Build Coastguard Worker #else 1241*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1242*48a54d36SAndroid Build Coastguard Worker #define DebugNSLog( ... ) 1243*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1244*48a54d36SAndroid Build Coastguard Worker #define DebugNSLog( ARGS... ) 1245*48a54d36SAndroid Build Coastguard Worker #else 1246*48a54d36SAndroid Build Coastguard Worker #define DebugNSLog while( 0 ) 1247*48a54d36SAndroid Build Coastguard Worker #endif 1248*48a54d36SAndroid Build Coastguard Worker #endif 1249*48a54d36SAndroid Build Coastguard Worker 1250*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1251*48a54d36SAndroid Build Coastguard Worker /*! @defined DebugLogMsg 1252*48a54d36SAndroid Build Coastguard Worker 1253*48a54d36SAndroid Build Coastguard Worker @abstract Debug-only macro for the VxWorks logMsg function. 1254*48a54d36SAndroid Build Coastguard Worker */ 1255*48a54d36SAndroid Build Coastguard Worker 1256*48a54d36SAndroid Build Coastguard Worker #if( TARGET_OS_VXWORKS ) 1257*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1258*48a54d36SAndroid Build Coastguard Worker #define DebugLogMsg( LEVEL, FORMAT, P1, P2, P3, P4, P5, P6 ) \ 1259*48a54d36SAndroid Build Coastguard Worker do \ 1260*48a54d36SAndroid Build Coastguard Worker { \ 1261*48a54d36SAndroid Build Coastguard Worker if( ( inLevel >= gDebugPrintLevelMin ) || ( inLevel <= gDebugPrintLevelMax ) ) \ 1262*48a54d36SAndroid Build Coastguard Worker { \ 1263*48a54d36SAndroid Build Coastguard Worker logMsg( ( FORMAT ), ( P1 ), ( P2 ), ( P3 ), ( P4 ), ( P5 ), ( P6 ) ); \ 1264*48a54d36SAndroid Build Coastguard Worker } \ 1265*48a54d36SAndroid Build Coastguard Worker \ 1266*48a54d36SAndroid Build Coastguard Worker } while( 0 ) 1267*48a54d36SAndroid Build Coastguard Worker #else 1268*48a54d36SAndroid Build Coastguard Worker #define DebugLogMsg( LEVEL, FORMAT, P1, P2, P3, P4, P5, P6 ) 1269*48a54d36SAndroid Build Coastguard Worker #endif 1270*48a54d36SAndroid Build Coastguard Worker #else 1271*48a54d36SAndroid Build Coastguard Worker #define DebugLogMsg dlog 1272*48a54d36SAndroid Build Coastguard Worker #endif 1273*48a54d36SAndroid Build Coastguard Worker 1274*48a54d36SAndroid Build Coastguard Worker #if 0 1275*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines - General == 1276*48a54d36SAndroid Build Coastguard Worker #endif 1277*48a54d36SAndroid Build Coastguard Worker 1278*48a54d36SAndroid Build Coastguard Worker #ifdef __cplusplus 1279*48a54d36SAndroid Build Coastguard Worker extern "C" { 1280*48a54d36SAndroid Build Coastguard Worker #endif 1281*48a54d36SAndroid Build Coastguard Worker 1282*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1283*48a54d36SAndroid Build Coastguard Worker /*! @function DebugInitialize 1284*48a54d36SAndroid Build Coastguard Worker 1285*48a54d36SAndroid Build Coastguard Worker @abstract Initializes the debugging library for a specific kind of output. 1286*48a54d36SAndroid Build Coastguard Worker 1287*48a54d36SAndroid Build Coastguard Worker @param inType 1288*48a54d36SAndroid Build Coastguard Worker @param varArg Variable number parameters, controlled by the "inType" parameter. 1289*48a54d36SAndroid Build Coastguard Worker */ 1290*48a54d36SAndroid Build Coastguard Worker 1291*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1292*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus DebugInitialize( DebugOutputType inType, ... ); 1293*48a54d36SAndroid Build Coastguard Worker #endif 1294*48a54d36SAndroid Build Coastguard Worker 1295*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1296*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1297*48a54d36SAndroid Build Coastguard Worker #define debug_initialize( ... ) DebugInitialize( __VA_ARGS__ ) 1298*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1299*48a54d36SAndroid Build Coastguard Worker #define debug_initialize( ARGS... ) DebugInitialize( ## ARGS ) 1300*48a54d36SAndroid Build Coastguard Worker #else 1301*48a54d36SAndroid Build Coastguard Worker #define debug_initialize DebugInitialize 1302*48a54d36SAndroid Build Coastguard Worker #endif 1303*48a54d36SAndroid Build Coastguard Worker #else 1304*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1305*48a54d36SAndroid Build Coastguard Worker #define debug_initialize( ... ) 1306*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1307*48a54d36SAndroid Build Coastguard Worker #define debug_initialize( ARGS... ) 1308*48a54d36SAndroid Build Coastguard Worker #else 1309*48a54d36SAndroid Build Coastguard Worker #define debug_initialize while( 0 ) 1310*48a54d36SAndroid Build Coastguard Worker #endif 1311*48a54d36SAndroid Build Coastguard Worker #endif 1312*48a54d36SAndroid Build Coastguard Worker 1313*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1314*48a54d36SAndroid Build Coastguard Worker /*! @function DebugFinalize 1315*48a54d36SAndroid Build Coastguard Worker 1316*48a54d36SAndroid Build Coastguard Worker @abstract Releases any resources used by the debugging library 1317*48a54d36SAndroid Build Coastguard Worker */ 1318*48a54d36SAndroid Build Coastguard Worker 1319*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1320*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT void DebugFinalize( void ); 1321*48a54d36SAndroid Build Coastguard Worker #endif 1322*48a54d36SAndroid Build Coastguard Worker 1323*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1324*48a54d36SAndroid Build Coastguard Worker #define debug_terminate() DebugFinalize() 1325*48a54d36SAndroid Build Coastguard Worker #else 1326*48a54d36SAndroid Build Coastguard Worker #define debug_terminate() 1327*48a54d36SAndroid Build Coastguard Worker #endif 1328*48a54d36SAndroid Build Coastguard Worker 1329*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1330*48a54d36SAndroid Build Coastguard Worker /*! @function DebugGetProperty 1331*48a54d36SAndroid Build Coastguard Worker 1332*48a54d36SAndroid Build Coastguard Worker @abstract Gets the specified property from the debugging library. 1333*48a54d36SAndroid Build Coastguard Worker */ 1334*48a54d36SAndroid Build Coastguard Worker 1335*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1336*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus DebugGetProperty( DebugPropertyTag inTag, ... ); 1337*48a54d36SAndroid Build Coastguard Worker #endif 1338*48a54d36SAndroid Build Coastguard Worker 1339*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1340*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1341*48a54d36SAndroid Build Coastguard Worker #define debug_get_property( ... ) DebugGetProperty( __VA_ARGS__ ) 1342*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1343*48a54d36SAndroid Build Coastguard Worker #define debug_get_property( ARGS... ) DebugGetProperty( ## ARGS ) 1344*48a54d36SAndroid Build Coastguard Worker #else 1345*48a54d36SAndroid Build Coastguard Worker #define debug_get_property DebugGetProperty 1346*48a54d36SAndroid Build Coastguard Worker #endif 1347*48a54d36SAndroid Build Coastguard Worker #else 1348*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1349*48a54d36SAndroid Build Coastguard Worker #define debug_get_property( ... ) 1350*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1351*48a54d36SAndroid Build Coastguard Worker #define debug_get_property( ARGS... ) 1352*48a54d36SAndroid Build Coastguard Worker #else 1353*48a54d36SAndroid Build Coastguard Worker #define debug_get_property while( 0 ) 1354*48a54d36SAndroid Build Coastguard Worker #endif 1355*48a54d36SAndroid Build Coastguard Worker #endif 1356*48a54d36SAndroid Build Coastguard Worker 1357*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1358*48a54d36SAndroid Build Coastguard Worker /*! @function DebugSetProperty 1359*48a54d36SAndroid Build Coastguard Worker 1360*48a54d36SAndroid Build Coastguard Worker @abstract Sets the specified property from the debugging library. 1361*48a54d36SAndroid Build Coastguard Worker */ 1362*48a54d36SAndroid Build Coastguard Worker 1363*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1364*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus DebugSetProperty( DebugPropertyTag inTag, ... ); 1365*48a54d36SAndroid Build Coastguard Worker #endif 1366*48a54d36SAndroid Build Coastguard Worker 1367*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1368*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1369*48a54d36SAndroid Build Coastguard Worker #define debug_set_property( ... ) DebugSetProperty( __VA_ARGS__ ) 1370*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1371*48a54d36SAndroid Build Coastguard Worker #define debug_set_property( ARGS... ) DebugSetProperty( ## ARGS ) 1372*48a54d36SAndroid Build Coastguard Worker #else 1373*48a54d36SAndroid Build Coastguard Worker #define debug_set_property DebugSetProperty 1374*48a54d36SAndroid Build Coastguard Worker #endif 1375*48a54d36SAndroid Build Coastguard Worker #else 1376*48a54d36SAndroid Build Coastguard Worker #if( DEBUG_C99_VA_ARGS ) 1377*48a54d36SAndroid Build Coastguard Worker #define debug_set_property( ... ) 1378*48a54d36SAndroid Build Coastguard Worker #elif( DEBUG_GNU_VA_ARGS ) 1379*48a54d36SAndroid Build Coastguard Worker #define debug_set_property( ARGS... ) 1380*48a54d36SAndroid Build Coastguard Worker #else 1381*48a54d36SAndroid Build Coastguard Worker #define debug_set_property while( 0 ) 1382*48a54d36SAndroid Build Coastguard Worker #endif 1383*48a54d36SAndroid Build Coastguard Worker #endif 1384*48a54d36SAndroid Build Coastguard Worker 1385*48a54d36SAndroid Build Coastguard Worker #if 0 1386*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines - Debugging Output == 1387*48a54d36SAndroid Build Coastguard Worker #endif 1388*48a54d36SAndroid Build Coastguard Worker 1389*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1390*48a54d36SAndroid Build Coastguard Worker /*! @function DebugPrintF 1391*48a54d36SAndroid Build Coastguard Worker 1392*48a54d36SAndroid Build Coastguard Worker @abstract Prints a debug message with printf-style formatting. 1393*48a54d36SAndroid Build Coastguard Worker 1394*48a54d36SAndroid Build Coastguard Worker @param inLevel Error that generated this assert or noErr. 1395*48a54d36SAndroid Build Coastguard Worker 1396*48a54d36SAndroid Build Coastguard Worker @param inFormatString 1397*48a54d36SAndroid Build Coastguard Worker C string containing assertion text. 1398*48a54d36SAndroid Build Coastguard Worker 1399*48a54d36SAndroid Build Coastguard Worker @param VAR_ARG 1400*48a54d36SAndroid Build Coastguard Worker Variable number of arguments depending on the format string. 1401*48a54d36SAndroid Build Coastguard Worker 1402*48a54d36SAndroid Build Coastguard Worker @result Number of bytes printed or -1 on error. 1403*48a54d36SAndroid Build Coastguard Worker */ 1404*48a54d36SAndroid Build Coastguard Worker 1405*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1406*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t DebugPrintF( DebugLevel inLevel, const char *inFormat, ... ); 1407*48a54d36SAndroid Build Coastguard Worker #endif 1408*48a54d36SAndroid Build Coastguard Worker 1409*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1410*48a54d36SAndroid Build Coastguard Worker /*! @function DebugPrintFVAList 1411*48a54d36SAndroid Build Coastguard Worker 1412*48a54d36SAndroid Build Coastguard Worker @abstract va_list version of DebugPrintF. See DebugPrintF for more info. 1413*48a54d36SAndroid Build Coastguard Worker */ 1414*48a54d36SAndroid Build Coastguard Worker 1415*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1416*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t DebugPrintFVAList( DebugLevel inLevel, const char *inFormat, va_list inArgs ); 1417*48a54d36SAndroid Build Coastguard Worker #endif 1418*48a54d36SAndroid Build Coastguard Worker 1419*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1420*48a54d36SAndroid Build Coastguard Worker /*! @function DebugPrintAssert 1421*48a54d36SAndroid Build Coastguard Worker 1422*48a54d36SAndroid Build Coastguard Worker @abstract Prints a message describing the reason the (e.g. an assert failed), an optional error message, 1423*48a54d36SAndroid Build Coastguard Worker an optional source filename, an optional source line number. 1424*48a54d36SAndroid Build Coastguard Worker 1425*48a54d36SAndroid Build Coastguard Worker @param inErrorCode Error that generated this assert or noErr. 1426*48a54d36SAndroid Build Coastguard Worker @param inAssertString C string containing assertion text. 1427*48a54d36SAndroid Build Coastguard Worker @param inMessage C string containing a message about the assert. 1428*48a54d36SAndroid Build Coastguard Worker @param inFileName C string containing path of file where the error occurred. 1429*48a54d36SAndroid Build Coastguard Worker @param inLineNumber Line number in source file where the error occurred. 1430*48a54d36SAndroid Build Coastguard Worker @param inFunction C string containing name of function where assert occurred. 1431*48a54d36SAndroid Build Coastguard Worker 1432*48a54d36SAndroid Build Coastguard Worker @discussion 1433*48a54d36SAndroid Build Coastguard Worker 1434*48a54d36SAndroid Build Coastguard Worker Example output: 1435*48a54d36SAndroid Build Coastguard Worker 1436*48a54d36SAndroid Build Coastguard Worker [ASSERT] assert: "dataPtr != NULL" allocate memory for object failed 1437*48a54d36SAndroid Build Coastguard Worker [ASSERT] where: "MyFile.c", line 123, ("MyFunction") 1438*48a54d36SAndroid Build Coastguard Worker 1439*48a54d36SAndroid Build Coastguard Worker OR 1440*48a54d36SAndroid Build Coastguard Worker 1441*48a54d36SAndroid Build Coastguard Worker [ASSERT] error: -6728 (kNoMemoryErr) 1442*48a54d36SAndroid Build Coastguard Worker [ASSERT] where: "MyFile.c", line 123, ("MyFunction") 1443*48a54d36SAndroid Build Coastguard Worker */ 1444*48a54d36SAndroid Build Coastguard Worker 1445*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1446*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT void 1447*48a54d36SAndroid Build Coastguard Worker DebugPrintAssert( 1448*48a54d36SAndroid Build Coastguard Worker int_least32_t inErrorCode, 1449*48a54d36SAndroid Build Coastguard Worker const char * inAssertString, 1450*48a54d36SAndroid Build Coastguard Worker const char * inMessage, 1451*48a54d36SAndroid Build Coastguard Worker const char * inFilename, 1452*48a54d36SAndroid Build Coastguard Worker int_least32_t inLineNumber, 1453*48a54d36SAndroid Build Coastguard Worker const char * inFunction ); 1454*48a54d36SAndroid Build Coastguard Worker #endif 1455*48a54d36SAndroid Build Coastguard Worker 1456*48a54d36SAndroid Build Coastguard Worker #if 0 1457*48a54d36SAndroid Build Coastguard Worker #pragma mark == Routines - Utilities == 1458*48a54d36SAndroid Build Coastguard Worker #endif 1459*48a54d36SAndroid Build Coastguard Worker 1460*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1461*48a54d36SAndroid Build Coastguard Worker /*! @function DebugSNPrintF 1462*48a54d36SAndroid Build Coastguard Worker 1463*48a54d36SAndroid Build Coastguard Worker @abstract Debugging versions of standard C snprintf with extra features. 1464*48a54d36SAndroid Build Coastguard Worker 1465*48a54d36SAndroid Build Coastguard Worker @param sbuffer Buffer to receive result. Null terminated unless the buffer size is 0. 1466*48a54d36SAndroid Build Coastguard Worker @param buflen Size of the buffer including space for the null terminator. 1467*48a54d36SAndroid Build Coastguard Worker @param fmt printf-style format string. 1468*48a54d36SAndroid Build Coastguard Worker @param VAR_ARG Variable number of arguments depending on the format string. 1469*48a54d36SAndroid Build Coastguard Worker 1470*48a54d36SAndroid Build Coastguard Worker @result Number of characters written (minus the null terminator). 1471*48a54d36SAndroid Build Coastguard Worker 1472*48a54d36SAndroid Build Coastguard Worker @discussion 1473*48a54d36SAndroid Build Coastguard Worker 1474*48a54d36SAndroid Build Coastguard Worker Extra features over the standard C snprintf: 1475*48a54d36SAndroid Build Coastguard Worker <pre> 1476*48a54d36SAndroid Build Coastguard Worker 64-bit support for %d (%lld), %i (%lli), %u (%llu), %o (%llo), %x (%llx), and %b (%llb). 1477*48a54d36SAndroid Build Coastguard Worker %@ - Cocoa/CoreFoundation object. Param is the object. Strings are used directly. Others use CFCopyDescription. 1478*48a54d36SAndroid Build Coastguard Worker %a - Network Address: %.4a=IPv4, %.6a=Ethernet, %.8a Fibre Channel, %.16a=IPv6. Arg=ptr to network address. 1479*48a54d36SAndroid Build Coastguard Worker %#a - IPv4 or IPv6 mDNSAddr. Arg=ptr to mDNSAddr. 1480*48a54d36SAndroid Build Coastguard Worker %##a - IPv4 (if AF_INET defined) or IPv6 (if AF_INET6 defined) sockaddr. Arg=ptr to sockaddr. 1481*48a54d36SAndroid Build Coastguard Worker %b - Binary representation of integer (e.g. 01101011). Modifiers and arg=the same as %d, %x, etc. 1482*48a54d36SAndroid Build Coastguard Worker %C - Mac-style FourCharCode (e.g. 'APPL'). Arg=32-bit value to print as a Mac-style FourCharCode. 1483*48a54d36SAndroid Build Coastguard Worker %H - Hex Dump (e.g. "\x6b\xa7" -> "6B A7"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size. 1484*48a54d36SAndroid Build Coastguard Worker %#H - Hex Dump & ASCII (e.g. "\x41\x62" -> "6B A7 'Ab'"). 1st arg=ptr, 2nd arg=size, 3rd arg=max size. 1485*48a54d36SAndroid Build Coastguard Worker %m - Error Message (e.g. 0 -> "kNoErr"). Modifiers and error code arg=the same as %d, %x, etc. 1486*48a54d36SAndroid Build Coastguard Worker %#s - Pascal-style length-prefixed string. Arg=ptr to string. 1487*48a54d36SAndroid Build Coastguard Worker %##s - DNS label-sequence name. Arg=ptr to name. 1488*48a54d36SAndroid Build Coastguard Worker %S - UTF-16 string, 0x0000 terminated. Host order if no BOM. Precision is UTF-16 count. Precision includes BOM. 1489*48a54d36SAndroid Build Coastguard Worker %#S - Big Endian UTF-16 string (unless BOM overrides). Otherwise, the same as %S. 1490*48a54d36SAndroid Build Coastguard Worker %##S - Little Endian UTF-16 string (unless BOM overrides). Otherwise, the same as %S. 1491*48a54d36SAndroid Build Coastguard Worker %U - Universally Unique Identifier (UUID) (e.g. 6ba7b810-9dad-11d1-80b4-00c04fd430c8). Arg=ptr to 16-byte UUID. 1492*48a54d36SAndroid Build Coastguard Worker </pre> 1493*48a54d36SAndroid Build Coastguard Worker */ 1494*48a54d36SAndroid Build Coastguard Worker 1495*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1496*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t DebugSNPrintF(char *sbuffer, size_t buflen, const char *fmt, ...); 1497*48a54d36SAndroid Build Coastguard Worker #endif 1498*48a54d36SAndroid Build Coastguard Worker 1499*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1500*48a54d36SAndroid Build Coastguard Worker /*! @function DebugSNPrintFVAList 1501*48a54d36SAndroid Build Coastguard Worker 1502*48a54d36SAndroid Build Coastguard Worker @abstract va_list version of DebugSNPrintF. See DebugSNPrintF for more info. 1503*48a54d36SAndroid Build Coastguard Worker */ 1504*48a54d36SAndroid Build Coastguard Worker 1505*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1506*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t DebugSNPrintFVAList(char *sbuffer, size_t buflen, const char *fmt, va_list arg); 1507*48a54d36SAndroid Build Coastguard Worker #endif 1508*48a54d36SAndroid Build Coastguard Worker 1509*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1510*48a54d36SAndroid Build Coastguard Worker /*! @function DebugGetErrorString 1511*48a54d36SAndroid Build Coastguard Worker 1512*48a54d36SAndroid Build Coastguard Worker @abstract Gets an error string from an error code. 1513*48a54d36SAndroid Build Coastguard Worker 1514*48a54d36SAndroid Build Coastguard Worker @param inStatus Error code to get the string for. 1515*48a54d36SAndroid Build Coastguard Worker @param inBuffer Optional buffer to copy the string to for non-static strings. May be null. 1516*48a54d36SAndroid Build Coastguard Worker @param inBufferSize Size of optional buffer. May be 0. 1517*48a54d36SAndroid Build Coastguard Worker 1518*48a54d36SAndroid Build Coastguard Worker @result C string containing error string for the error code. Guaranteed to be a valid, static string. If a 1519*48a54d36SAndroid Build Coastguard Worker buffer is supplied, the return value will always be a pointer to the supplied buffer, which will 1520*48a54d36SAndroid Build Coastguard Worker contain the best available description of the error code. If a buffer is not supplied, the return 1521*48a54d36SAndroid Build Coastguard Worker value will be the best available description of the error code that can be represented as a static 1522*48a54d36SAndroid Build Coastguard Worker string. This allows code that cannot use a temporary buffer to hold the result to still get a useful 1523*48a54d36SAndroid Build Coastguard Worker error string in most cases, but also allows code that can use a temporary buffer to get the best 1524*48a54d36SAndroid Build Coastguard Worker available description. 1525*48a54d36SAndroid Build Coastguard Worker */ 1526*48a54d36SAndroid Build Coastguard Worker 1527*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1528*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT const char * DebugGetErrorString( int_least32_t inErrorCode, char *inBuffer, size_t inBufferSize ); 1529*48a54d36SAndroid Build Coastguard Worker #endif 1530*48a54d36SAndroid Build Coastguard Worker 1531*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1532*48a54d36SAndroid Build Coastguard Worker /*! @function DebugHexDump 1533*48a54d36SAndroid Build Coastguard Worker 1534*48a54d36SAndroid Build Coastguard Worker @abstract Hex dumps data to a string or to the output device. 1535*48a54d36SAndroid Build Coastguard Worker */ 1536*48a54d36SAndroid Build Coastguard Worker 1537*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1538*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT size_t 1539*48a54d36SAndroid Build Coastguard Worker DebugHexDump( 1540*48a54d36SAndroid Build Coastguard Worker DebugLevel inLevel, 1541*48a54d36SAndroid Build Coastguard Worker int inIndent, 1542*48a54d36SAndroid Build Coastguard Worker const char * inLabel, 1543*48a54d36SAndroid Build Coastguard Worker size_t inLabelSize, 1544*48a54d36SAndroid Build Coastguard Worker int inLabelMinWidth, 1545*48a54d36SAndroid Build Coastguard Worker const char * inType, 1546*48a54d36SAndroid Build Coastguard Worker size_t inTypeSize, 1547*48a54d36SAndroid Build Coastguard Worker const void * inDataStart, 1548*48a54d36SAndroid Build Coastguard Worker const void * inData, 1549*48a54d36SAndroid Build Coastguard Worker size_t inDataSize, 1550*48a54d36SAndroid Build Coastguard Worker DebugFlags inFlags, 1551*48a54d36SAndroid Build Coastguard Worker char * outBuffer, 1552*48a54d36SAndroid Build Coastguard Worker size_t inBufferSize ); 1553*48a54d36SAndroid Build Coastguard Worker #endif 1554*48a54d36SAndroid Build Coastguard Worker 1555*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1556*48a54d36SAndroid Build Coastguard Worker #define dloghex( LEVEL, INDENT, LABEL, LABEL_SIZE, LABEL_MIN_SIZE, TYPE, TYPE_SIZE, DATA_START, DATA, DATA_SIZE, FLAGS, BUFFER, BUFFER_SIZE ) \ 1557*48a54d36SAndroid Build Coastguard Worker DebugHexDump( ( LEVEL ), (INDENT), ( LABEL ), ( LABEL_SIZE ), ( LABEL_MIN_SIZE ), ( TYPE ), ( TYPE_SIZE ), \ 1558*48a54d36SAndroid Build Coastguard Worker ( DATA_START ), ( DATA ), ( DATA_SIZE ), ( FLAGS ), ( BUFFER ), ( BUFFER_SIZE ) ) 1559*48a54d36SAndroid Build Coastguard Worker #else 1560*48a54d36SAndroid Build Coastguard Worker #define dloghex( LEVEL, INDENT, LABEL, LABEL_SIZE, LABEL_MIN_SIZE, TYPE, TYPE_SIZE, DATA_START, DATA, DATA_SIZE, FLAGS, BUFFER, BUFFER_SIZE ) 1561*48a54d36SAndroid Build Coastguard Worker #endif 1562*48a54d36SAndroid Build Coastguard Worker 1563*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1564*48a54d36SAndroid Build Coastguard Worker /*! @function DebugTaskLevel 1565*48a54d36SAndroid Build Coastguard Worker 1566*48a54d36SAndroid Build Coastguard Worker @abstract Returns the current task level. 1567*48a54d36SAndroid Build Coastguard Worker 1568*48a54d36SAndroid Build Coastguard Worker @result Current task level 1569*48a54d36SAndroid Build Coastguard Worker 1570*48a54d36SAndroid Build Coastguard Worker @discussion 1571*48a54d36SAndroid Build Coastguard Worker 1572*48a54d36SAndroid Build Coastguard Worker Bit masks to isolate portions of the result (note that some masks may also need bit shifts to right justify): 1573*48a54d36SAndroid Build Coastguard Worker <pre> 1574*48a54d36SAndroid Build Coastguard Worker kDebugInterruptLevelMask - Indicates the current interrupt level (> 0 means interrupt time). 1575*48a54d36SAndroid Build Coastguard Worker kDebugInVBLTaskMask - Indicates if a VBL task is currently being executed. 1576*48a54d36SAndroid Build Coastguard Worker kDebugInDeferredTaskMask - Indicates if a Deferred Task is currently being executed. 1577*48a54d36SAndroid Build Coastguard Worker kDebugInSecondaryInterruptHandlerMask - Indicates if a Secondary Interrupt Handler is currently being executed. 1578*48a54d36SAndroid Build Coastguard Worker kDebugPageFaultFatalMask - Indicates if it is unsafe to cause a page fault (worse than interrupt time). 1579*48a54d36SAndroid Build Coastguard Worker kDebugMPTaskLevelMask - Indicates if being called from an MP task. 1580*48a54d36SAndroid Build Coastguard Worker kDebugInterruptDepthMask - 0 means task level, 1 means in interrupt, > 1 means in nested interrupt. 1581*48a54d36SAndroid Build Coastguard Worker </pre> 1582*48a54d36SAndroid Build Coastguard Worker 1583*48a54d36SAndroid Build Coastguard Worker Helpers: 1584*48a54d36SAndroid Build Coastguard Worker <pre> 1585*48a54d36SAndroid Build Coastguard Worker DebugExtractTaskLevelInterruptDepth() - Macro to extract interrupt depth from task level value. 1586*48a54d36SAndroid Build Coastguard Worker </pre> 1587*48a54d36SAndroid Build Coastguard Worker */ 1588*48a54d36SAndroid Build Coastguard Worker 1589*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1590*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT uint32_t DebugTaskLevel( void ); 1591*48a54d36SAndroid Build Coastguard Worker #endif 1592*48a54d36SAndroid Build Coastguard Worker 1593*48a54d36SAndroid Build Coastguard Worker //--------------------------------------------------------------------------------------------------------------------------- 1594*48a54d36SAndroid Build Coastguard Worker /*! @function DebugServicesTest 1595*48a54d36SAndroid Build Coastguard Worker 1596*48a54d36SAndroid Build Coastguard Worker @abstract Unit test. 1597*48a54d36SAndroid Build Coastguard Worker */ 1598*48a54d36SAndroid Build Coastguard Worker 1599*48a54d36SAndroid Build Coastguard Worker #if( DEBUG ) 1600*48a54d36SAndroid Build Coastguard Worker DEBUG_EXPORT OSStatus DebugServicesTest( void ); 1601*48a54d36SAndroid Build Coastguard Worker #endif 1602*48a54d36SAndroid Build Coastguard Worker 1603*48a54d36SAndroid Build Coastguard Worker #ifdef __cplusplus 1604*48a54d36SAndroid Build Coastguard Worker } 1605*48a54d36SAndroid Build Coastguard Worker #endif 1606*48a54d36SAndroid Build Coastguard Worker 1607*48a54d36SAndroid Build Coastguard Worker #endif // __DEBUG_SERVICES__ 1608