/* File: Debugging.h Contains: Macros to handle exceptions and assertions. Version: QuickTime 7.3 Copyright: (c) 2007 (c) 1989-2001 by Apple Computer, Inc., all rights reserved. Bugs?: For bug reports, consult the following page on the World Wide Web: http://developer.apple.com/bugreporter/ */ #ifndef __DEBUGGING__ #define __DEBUGGING__ #ifndef __MACTYPES__ #include #endif #ifndef __MIXEDMODE__ #include #endif #ifndef __MACERRORS__ #include #endif #include #ifndef __GESTALT__ #include #endif #if PRAGMA_ONCE #pragma once #endif #ifdef __cplusplus extern "C" { #endif #if PRAGMA_IMPORT #pragma import on #endif /* This file supplies standard debugging routines and macros to Carbon and Classic Mac OS programs. Other C programs which wish to use the exception handling and assertion macros should include AssertMacros.h instead of this file. To activate debugger breaks, #define DEBUG to 1 (one) before including this file. Five further levels of debugging are available, selected by #defining one of the following conditionals to 1 after DEBUG is defined to 1. DEBUG_INTERNAL the default; asserts include file and line number information DEBUG_EXTERNAL used for code which must ship to developers outside your organization; no file or line number information is included in asserts DEBUG_BREAK_ONLY where an assertion string would normally be sent to the debugger; call Debugger() instead. PRODUCTION used for shipping code; no debugger breaks are emitted PERFORMANCE same as PRODUCTION #defining DEBUG to 0 is equivalent to #defining PRODUCTION 1 when DEBUG is 1. (No code for debugger breaks is emitted in either case.) #defining DEBUG to 1 without specifying a level is equivalent to #defining DEBUG_INTERNAL 1. In addition, these macros should also be #defined (they are described in detail below): kComponentSignatureString COMPONENT_SIGNATURE */ /* * Before including this file, #define kComponentSignatureString to a C-string * containing the name of your client and #define COMPONENT_SIGNATURE to your * client's unique signature (i.e., your program's registered creator type). * For example: * * #define kComponentSignatureString "SurfWriter" * #define COMPONENT_SIGNATURE 'WAVE' * * If you don't define kComponentSignatureString and COMPONENT_SIGNATURE, the * default kComponentSignatureString and COMPONENT_SIGNATURE values will be * used by the DEBUGASSERTMSG macros below. */ #ifndef kComponentSignatureString #define kComponentSignatureString "Third Party Client" #endif #ifndef COMPONENT_SIGNATURE #define COMPONENT_SIGNATURE '?*?*' #endif #define QuoteExceptionString(x) #x /* * The DEBUGLEVEL's */ #define DEBUG_LEVEL_PRODUCTION 0 #define DEBUG_LEVEL_BREAK_ONLY 1 #define DEBUG_LEVEL_EXTERNAL 3 #define DEBUG_LEVEL_INTERNAL 4 #define DEBUGFULL DEBUG_LEVEL_INTERNAL /* * define DEBUGLEVEL */ #if DEBUG #if PRODUCTION #define DEBUGLEVEL DEBUG_LEVEL_PRODUCTION #elif PERFORMANCE #define DEBUGLEVEL DEBUG_LEVEL_PRODUCTION #elif DEBUG_BREAK_ONLY #define DEBUGLEVEL DEBUG_LEVEL_BREAK_ONLY #elif DEBUG_EXTERNAL #define DEBUGLEVEL DEBUG_LEVEL_EXTERNAL #elif DEBUG_INTERNAL #define DEBUGLEVEL DEBUG_LEVEL_INTERNAL #else /* default to DEBUG_LEVEL_INTERNAL */ #define DEBUGLEVEL DEBUG_LEVEL_INTERNAL #endif #endif #ifndef DEBUGLEVEL #define DEBUGLEVEL DEBUG_LEVEL_PRODUCTION #endif /* * The options parameter to DebugAssert and DEBUGASSERTMSG is currently reserved (must be zero). */ #define DEBUG_NO_OPTIONS 0 /* * DEBUGASSERTMSG() * * Summary: * All error reporting is routed through this macro, which calls the system * routine DebugAssert(). If you wish to use your own assertion break * routine, you can override DEBUGASSERTMSG by defining it before including * this file. * * Parameters: * * componentSignature: * The unique signature of component causing the assertion. * * options: * reserved. * * assertionString: * A pointer to a string constant containing the assertion. * This must be a string constant (and not a string variable or * NULL) because the Proeprocessor concatenates it with other * string constants * * exceptionLabelString: * A pointer to a string containing the exceptionLabel, or NULL. * * errorString: * A pointer to the error string, or NULL. DEBUGASSERTMSG macros * must not attempt to concatenate this string with constant * character strings. * * fileName: * A pointer to the fileName or pathname (generated by the * preprocessor __FILE__ identifier), or NULL. * * lineNumber: * The line number in the file (generated by the preprocessor * __LINE__ identifier), or 0 (zero). * * value: * A value associated with the assertion, or NULL. */ #ifndef DEBUGASSERTMSG #if DEBUGLEVEL == DEBUG_LEVEL_PRODUCTION /* no debugger message */ #define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) #elif DEBUGLEVEL == DEBUG_LEVEL_BREAK_ONLY /* call Debugger() if it is available */ #define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ Debugger() #elif DEBUGLEVEL == DEBUG_LEVEL_EXTERNAL /* exclude fileName and lineNumber */ #define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ DebugAssert(componentSignature, options, assertionString, exceptionLabelString, errorString, 0, 0, (void*)value) #else /* include all info */ #define DEBUGASSERTMSG(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ DebugAssert(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, (void*)value) #endif #endif /* * Define the three inputs to AssertMacros.h */ #ifndef DEBUG_ASSERT_COMPONENT_NAME_STRING #define DEBUG_ASSERT_COMPONENT_NAME_STRING kComponentSignatureString #endif #ifndef DEBUG_ASSERT_PRODUCTION_CODE #define DEBUG_ASSERT_PRODUCTION_CODE (DEBUGLEVEL==0) #endif #ifndef DEBUG_ASSERT_MESSAGE #define DEBUG_ASSERT_MESSAGE(componentNameString, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) \ DEBUGASSERTMSG(COMPONENT_SIGNATURE, DEBUG_NO_OPTIONS, componentNameString ": " assertionString, exceptionLabelString, errorString, fileName, lineNumber, value) #endif /* * Include AssertMacros.h where all of the check, verify, and require macros are defined */ #include /* * The following check, verify, and require macros assert that TaskLevel is 0. */ #define ATTASKLEVEL0() \ (TaskLevel() == 0) #define check_tasklevel0() \ check(ATTASKLEVEL0()) #define check_tasklevel0_string(cstring) \ check_string(ATTASKLEVEL0(), cstring) #define verify_tasklevel0() \ verify(ATTASKLEVEL0()) #define verify_tasklevel0_string(cstring) \ verify_string(ATTASKLEVEL0(), cstring) #define require_tasklevel0(exceptionLabel) \ require(ATTASKLEVEL0(), exceptionLabel) #define require_tasklevel0_action(exceptionLabel, action) \ require_action(ATTASKLEVEL0(), exceptionLabel, action) #define require_tasklevel0_quiet(exceptionLabel) \ require_quiet(ATTASKLEVEL0(), exceptionLabel) #define require_tasklevel0_action_quiet(exceptionLabel, action) \ require_action_quiet(ATTASKLEVEL0(), exceptionLabel, action) #define require_tasklevel0_string(exceptionLabel, cstring) \ require_string(ATTASKLEVEL0(), exceptionLabel, cstring) #define require_tasklevel0_action_string(exceptionLabel, action, cstring) \ require_action_string(ATTASKLEVEL0(), exceptionLabel, action, cstring) /* * SafeDebugger and SafeDebugStr work like Debugger and DebugStr in both * production and non-preduction builds, but only call the debugger * if the debugger is installed. */ #if CALL_NOT_IN_CARBON /* Make sure a low level debugger is installed on Mac OS 8 or 9 */ #define SafeDebugger() \ do \ { \ if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ (((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ ((*((unsigned long *)0x0120)) != 0) && \ ((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ { \ Debugger(); \ } \ } while ( false ) #else /* Debugger() is always safe on Carbon under Mac OS X */ /* Otherwise we must make sure a low level debugger is installed */ #define SafeDebugger() \ do \ { \ long response; \ if ( (Gestalt(gestaltSystemVersion, &response) == noErr) && \ (response >= 0x1000) ) \ { \ Debugger(); \ } \ else \ { \ if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ (((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ ((*((unsigned long *)0x0120)) != 0) && \ ((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ { \ Debugger(); \ } \ } \ } while ( false ) #endif #if CALL_NOT_IN_CARBON /* Make sure low level debugger is installed on Mac OS 8 or 9 */ #define SafeDebugStr(str) \ do \ { \ if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ (((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ ((*((unsigned long *)0x0120)) != 0) && \ ((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ { \ DebugStr(str); \ } \ } while ( false ) #else /* DebugStr() is always safe on Carbon under Mac OS X */ /* Otherwise we must make sure a low level debugger is installed */ #define SafeDebugStr(str) \ do \ { \ long response; \ if ( (Gestalt(gestaltSystemVersion, &response) == noErr) && \ (response >= 0x1000) ) \ { \ DebugStr(str); \ } \ else \ { \ if ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ (((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ ((*((unsigned long *)0x0120)) != 0) && \ ((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) \ { \ DebugStr(str); \ } \ } \ } while ( false ) #endif /* * DEBUGGER and DEBUGSTR call SafeDebugger and SafeDebugStr only * in DEBUG builds. * * DEBUGGER and DEBUGSTR are defined only if they are not already defined to * prevent conflicts with developer code. */ #ifndef DEBUGGER #if DEBUG #define DEBUGGER() \ SafeDebugger() #else #define DEBUGGER() #endif #endif #ifndef DEBUGSTR #if DEBUG #define DEBUGSTR(str) \ SafeDebugStr(str) #else #define DEBUGSTR(str) #endif #endif /* * CapsLockDebugger and CapsLockDebugStr call SafeDebugger and SafeDebugStr * only if the Caps Lock key is down. */ #define CapsLockDebugger() \ do \ { \ KeyMap theKeys; \ GetKeys(theKeys); \ if ( ((theKeys[1] >> 1) & 0x01) != 0 ) \ { \ SafeDebugger(); \ } \ } while ( false ) #define CapsLockDebugStr(str) \ do \ { \ KeyMap theKeys; \ GetKeys(theKeys); \ if ( ((theKeys[1] >> 1) & 0x01) != 0 ) \ { \ SafeDebugStr(str); \ } \ } while ( false ) /* * ISCAPSLOCKKEYDOWN and ISLOWLEVELDEBUGGERCALLABLE are convenience macros * which are only defined for non-Carbon builds because they access * low memory addresses directly. They have been left in this file for * use by existing non-Carbon code. * * ISCAPSLOCKKEYDOWN and ISLOWLEVELDEBUGGERCALLABLE are defined only * if they are not already defined to prevent conflicts with developer code. */ #if CALL_NOT_IN_CARBON #ifndef ISCAPSLOCKKEYDOWN #define ISCAPSLOCKKEYDOWN() \ ((((UInt16 *)(0x0174))[3] & 0x0002) == 0x0002) #endif #ifndef ISLOWLEVELDEBUGGERCALLABLE #define ISLOWLEVELDEBUGGERCALLABLE() \ ( ((*((UInt8 *)0x0BFF)) != (UInt8)0xff) && \ (((*((UInt8 *)0x0BFF)) & (UInt8)0xe0) == (UInt8)0x60) && \ ((*((unsigned long *)0x0120)) != 0) && \ ((*((unsigned long *)0x0120)) != (unsigned long)0xffffffff) ) #endif #endif /* * You can use DPRINTF as a dprintf which goes away in production builds. * DPRINTF is not supported by Carbon because dprintf * is not supported by Carbon. * * To use it, double-parenthesize the argument - i.e., use: * * DPRINTF(("formatString %d", 5 )); * * This is sadly necessary because a macro can not have a variable number * of arguments. * * DPRINTF is defined only if it is not already defined to * prevent conflicts with developer code. */ #if DEBUG #define DPRINTF(x) dprintf x #else #define DPRINTF(x) { } #endif /* * kBlessedBusErrorBait is an address that will never be mapped by * Mac OS 8 or 9. It is close to the middle of the 64K range from 0x68F10000 * to 0x68F1FFFF that is unmapped and cannot be accessed without causing an * exception. Thus, it's a good value to use for filling uninitialized * pointers, etc. * * Mac OS X programs should NOT use kBlessedBusErrorBait and should use * zero (0) instead, since by default, page 0 is read and write protected * for user code. */ enum { kBlessedBusErrorBait = 0x68F168F1 }; /* * DebugAssert() * * Summary: * DebugAssert is the system routine that the DEBUGASSERTMSG macro * calls (by default) to display assertion messsages. The output * from DebugAssert can be redirected by installing a * DebugAssertOutputHandler with InstallDebugAssertOutputHandler. * * Parameters: * * componentSignature: * The unique signature of component causing the assertion. * * options: * reserved. * * assertionString: * A pointer to a string containing the assertion, or NULL. * * exceptionLabelString: * A pointer to a string containing the exceptionLabel, or NULL. * * errorString: * A pointer to the error string, or NULL. * * fileName: * A pointer to the fileName or pathname (generated by the * preprocessor __FILE__ identifier), or NULL. * * lineNumber: * The line number in the file (generated by the preprocessor * __LINE__ identifier), or 0 (zero). * * value: * A value associated with the assertion, or NULL. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( void ) DebugAssert( OSType componentSignature, UInt32 options, const char * assertionString, const char * exceptionLabelString, const char * errorString, const char * fileName, long lineNumber, void * value) TWOWORDINLINE(0x7000, 0xAA7E); /* * TaskLevel masks */ enum { k68kInterruptLevelMask = 0x00000007, /* 68K interrupt levels 0 through 7 */ kInVBLTaskMask = 0x00000010, /* VBLs are executing */ kInDeferredTaskMask = 0x00000020, /* Deferred tasks are executing */ kInSecondaryIntHandlerMask = 0x00000040, /* Secondary interrupt handlers are executing */ kInNestedInterruptMask = 0x00000080 /* The system is handling an interrupt */ }; /* * TaskLevel() * * Summary: * TaskLevel returns 0 if we're (probably) running at non-interrupt * time. There's no way to make this perfect, but this is as close * as we can get. If TaskLevel doesn't return 0, then one of the * TaskLevel masks can be used to learn more. * * Result: * The current task level. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( UInt32 ) TaskLevel(void) TWOWORDINLINE(0x7001, 0xAA7E); /* * Constants used by the DebugComponent functions */ enum { kComponentDebugOption = 0 /* optionSelectorNum to turn breaks for component On or Off*/ }; enum { kGetDebugOption = 1, /* get current debug option setting*/ kSetDebugOption = 2 /* set debug option*/ }; /* * DebugComponentCallbackProcPtr * * Discussion: * DebugComponentCallback is the callback into a component that * registers with DebugLib. It is called to get the debug option * setting, or to turn a debug option on or off. * * Parameters: * * optionSelectorNum: * The component debug option to set. * * command: * The command the DebugComponentCallbackProc must handle: * kGetDebugOption - get current debug option setting * kSetDebugOption - set debug option * * optionSetting: * A pointer to a Boolean where the DebugComponentCallbackProc * must return the option setting: the current setting if command * is kGetDebugOption; the new debug option if command is * kSetDebugOption */ typedef CALLBACK_API( void , DebugComponentCallbackProcPtr )(SInt32 optionSelectorNum, UInt32 command, Boolean *optionSetting); typedef STACK_UPP_TYPE(DebugComponentCallbackProcPtr) DebugComponentCallbackUPP; /* * NewDebugComponent() * * Summary: * NewDebugComponent registers a component with DebugLib. * * Parameters: * * componentSignature: * The unique signature of component. * * componentName: * The displayable string naming the component. * * componentCallback: * The callback into component for working with options. * * Result: * An operating system result code: noErr, memFullErr, * debuggingExecutionContextErr, debuggingDuplicateSignatureErr, or * debuggingInvalidNameErr. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( OSStatus ) NewDebugComponent( OSType componentSignature, ConstStr255Param componentName, DebugComponentCallbackUPP componentCallback) TWOWORDINLINE(0x7002, 0xAA7E); /* * NewDebugOption() * * Summary: * NewDebugOption registers a debug option with DebugLib. * * Parameters: * * componentSignature: * The signature of component to register a debug option for. * * optionSelectorNum: * The selector number of this debug option. * * optionName: * The displayable string naming this debug option. * * Result: * An operating system result code: noErr, memFullErr, * debuggingExecutionContextErr, debuggingDuplicateOptionErr, * debuggingInvalidSignatureErr, debuggingInvalidNameErr, or * debuggingNoCallbackErr. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( OSStatus ) NewDebugOption( OSType componentSignature, SInt32 optionSelectorNum, ConstStr255Param optionName) TWOWORDINLINE(0x7003, 0xAA7E); /* * DisposeDebugComponent() * * Summary: * DisposeDebugComponent removes a component registration and all * related debug options from DebugLib. * * Parameters: * * componentSignature: * The unique signature of a component. * * Result: * An operating system result code: noErr, * debuggingExecutionContextErr, or debuggingInvalidSignatureErr. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( OSStatus ) DisposeDebugComponent(OSType componentSignature) TWOWORDINLINE(0x7004, 0xAA7E); /* * GetDebugComponentInfo() * * Summary: * GetDebugComponentInfo returns a component registered with * DebugLib. * * Parameters: * * index: * The index into the list of registered components (1-based). * * componentSignature: * A pointer to an OSType where the unique signature of a * component is returned. * * componentName: * A pointer to an Str255 where the displayable string naming a * component is returned. * * Result: * An operating system result code: noErr or debuggingNoMatchErr. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( OSStatus ) GetDebugComponentInfo( UInt32 index, OSType * componentSignature, Str255 componentName) TWOWORDINLINE(0x7005, 0xAA7E); /* * GetDebugOptionInfo() * * Summary: * GetDebugOptionInfo returns a debug option registered with * DebugLib. * * Parameters: * * index: * The index into the list of registered debug options (0-based); * 0 = kComponentDebugOption. * * componentSignature: * The unique signature of a component. * * optionSelectorNum: * A pointer to an SInt32 where the selector number of this debug * option is returned. * * optionName: * A pointer to an Str255 where the displayable string naming this * debug option is returned. * * optionSetting: * A pointer to an Boolean where the current debug option setting * is returned. * * Result: * An operating system result code: noErr, * debuggingInvalidSignatureErr, or debuggingNoMatchErr. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( OSStatus ) GetDebugOptionInfo( UInt32 index, OSType componentSignature, SInt32 * optionSelectorNum, Str255 optionName, Boolean * optionSetting) TWOWORDINLINE(0x7006, 0xAA7E); /* * SetDebugOptionValue() * * Summary: * SetDebugOptionValue sets a debug option registered with DebugLib. * * Parameters: * * componentSignature: * The unique signature of a component. * * optionSelectorNum: * The selector number of this debug option. * * newOptionSetting: * The new debug option setting. * * Result: * An operating system result code: noErr, * debuggingInvalidSignatureErr, or debuggingInvalidOptionErr. * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( OSStatus ) SetDebugOptionValue( OSType componentSignature, SInt32 optionSelectorNum, Boolean newOptionSetting) TWOWORDINLINE(0x7007, 0xAA7E); /* * DebugAssertOutputHandlerProcPtr * * Discussion: * DebugAssertOutputHandler is the callback that registers with * DebugLib to handle the output from DebugAssert. The * "componentSignature" through "value" parameters are the raw * values passed to DebugAssert when an exception occurs. * * Parameters: * * componentSignature: * The unique signature of component causing the assertion. * * options: * reserved. * * assertionString: * A pointer to a string containing the assertion, or NULL. * * exceptionLabelString: * A pointer to a string containing the exceptionLabel, or NULL. * * errorString: * A pointer to the error string, or NULL. * * fileName: * A pointer to the fileName or pathname (generated by the * preprocessor __FILE__ identifier), or NULL. * * lineNumber: * The line number in the file (generated by the preprocessor * __LINE__ identifier), or 0 (zero). * * value: * A value associated with the assertion, or NULL. * * outputMsg: * The string DebugAssert build which would normally be passed to * DebugStr if a DebugAssertOutputHandler isn't installed. */ typedef CALLBACK_API( void , DebugAssertOutputHandlerProcPtr )(OSType componentSignature, UInt32 options, const char *assertionString, const char *exceptionLabelString, const char *errorString, const char *fileName, long lineNumber, void *value, ConstStr255Param outputMsg); typedef STACK_UPP_TYPE(DebugAssertOutputHandlerProcPtr) DebugAssertOutputHandlerUPP; /* * InstallDebugAssertOutputHandler() * * Summary: * InstallDebugAssertOutputHandler installs a * DebugAssertOutputHandler which DebugAssert calls instead of * DebugStr. * * Parameters: * * handler: * The DebugAssertOutputHandler to install or NULL to switch back * to the default handler (DebugStr). * * Availability: * Non-Carbon CFM: in DebugLib 1.0 and later * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API( void ) InstallDebugAssertOutputHandler(DebugAssertOutputHandlerUPP handler) TWOWORDINLINE(0x7008, 0xAA7E); #if CALL_NOT_IN_CARBON /* * dprintf() * * Summary: * printf takes a variable argument list and 'prints' that to the * debugging output handler. Calling dprintf() from anything but C * or C++ is tricky. * * Parameters: * * format: * The format string. * * ...: * The arguments to the format string. * * Availability: * Non-Carbon CFM: in DebugLib 1.1 and later * CarbonLib: not available * Mac OS X: not available */ EXTERN_API_C( void ) dprintf(const char * format, ...) SIXWORDINLINE(0x2057, 0x43EF, 0x0004, 0x303C, 0x000A, 0xAA7E); /* * vdprintf() * * Summary: * vdprintf takes a va_args list and 'prints' that to the debugging * output handler. * * Parameters: * * format: * The format string. * * va_args_list: * The va_args list. * * Availability: * Non-Carbon CFM: in DebugLib 1.1 and later * CarbonLib: not available * Mac OS X: not available */ EXTERN_API( void ) vdprintf( const char * format, char * va_args_list) TWOWORDINLINE(0x7009, 0xAA7E); #endif /* CALL_NOT_IN_CARBON */ /* * NewDebugComponentCallbackUPP() * * Availability: * Non-Carbon CFM: available as macro/inline * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API_C( DebugComponentCallbackUPP ) NewDebugComponentCallbackUPP(DebugComponentCallbackProcPtr userRoutine); #if !OPAQUE_UPP_TYPES enum { uppDebugComponentCallbackProcInfo = 0x00000FC0 }; /* pascal no_return_value Func(4_bytes, 4_bytes, 4_bytes) */ #ifdef __cplusplus inline DEFINE_API_C(DebugComponentCallbackUPP) NewDebugComponentCallbackUPP(DebugComponentCallbackProcPtr userRoutine) { return (DebugComponentCallbackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugComponentCallbackProcInfo, GetCurrentArchitecture()); } #else #define NewDebugComponentCallbackUPP(userRoutine) (DebugComponentCallbackUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugComponentCallbackProcInfo, GetCurrentArchitecture()) #endif #endif /* * NewDebugAssertOutputHandlerUPP() * * Availability: * Non-Carbon CFM: available as macro/inline * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API_C( DebugAssertOutputHandlerUPP ) NewDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerProcPtr userRoutine); #if !OPAQUE_UPP_TYPES enum { uppDebugAssertOutputHandlerProcInfo = 0x00FFFFC0 }; /* pascal no_return_value Func(4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes, 4_bytes) */ #ifdef __cplusplus inline DEFINE_API_C(DebugAssertOutputHandlerUPP) NewDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerProcPtr userRoutine) { return (DebugAssertOutputHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugAssertOutputHandlerProcInfo, GetCurrentArchitecture()); } #else #define NewDebugAssertOutputHandlerUPP(userRoutine) (DebugAssertOutputHandlerUPP)NewRoutineDescriptor((ProcPtr)(userRoutine), uppDebugAssertOutputHandlerProcInfo, GetCurrentArchitecture()) #endif #endif /* * DisposeDebugComponentCallbackUPP() * * Availability: * Non-Carbon CFM: available as macro/inline * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) DisposeDebugComponentCallbackUPP(DebugComponentCallbackUPP userUPP); #if !OPAQUE_UPP_TYPES #ifdef __cplusplus inline DEFINE_API_C(void) DisposeDebugComponentCallbackUPP(DebugComponentCallbackUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } #else #define DisposeDebugComponentCallbackUPP(userUPP) DisposeRoutineDescriptor(userUPP) #endif #endif /* * DisposeDebugAssertOutputHandlerUPP() * * Availability: * Non-Carbon CFM: available as macro/inline * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) DisposeDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerUPP userUPP); #if !OPAQUE_UPP_TYPES #ifdef __cplusplus inline DEFINE_API_C(void) DisposeDebugAssertOutputHandlerUPP(DebugAssertOutputHandlerUPP userUPP) { DisposeRoutineDescriptor((UniversalProcPtr)userUPP); } #else #define DisposeDebugAssertOutputHandlerUPP(userUPP) DisposeRoutineDescriptor(userUPP) #endif #endif /* * InvokeDebugComponentCallbackUPP() * * Availability: * Non-Carbon CFM: available as macro/inline * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) InvokeDebugComponentCallbackUPP( SInt32 optionSelectorNum, UInt32 command, Boolean * optionSetting, DebugComponentCallbackUPP userUPP); #if !OPAQUE_UPP_TYPES #ifdef __cplusplus inline DEFINE_API_C(void) InvokeDebugComponentCallbackUPP(SInt32 optionSelectorNum, UInt32 command, Boolean * optionSetting, DebugComponentCallbackUPP userUPP) { CALL_THREE_PARAMETER_UPP(userUPP, uppDebugComponentCallbackProcInfo, optionSelectorNum, command, optionSetting); } #else #define InvokeDebugComponentCallbackUPP(optionSelectorNum, command, optionSetting, userUPP) CALL_THREE_PARAMETER_UPP((userUPP), uppDebugComponentCallbackProcInfo, (optionSelectorNum), (command), (optionSetting)) #endif #endif /* * InvokeDebugAssertOutputHandlerUPP() * * Availability: * Non-Carbon CFM: available as macro/inline * CarbonLib: in CarbonLib 1.0 and later * Mac OS X: in version 10.0 and later */ EXTERN_API_C( void ) InvokeDebugAssertOutputHandlerUPP( OSType componentSignature, UInt32 options, const char * assertionString, const char * exceptionLabelString, const char * errorString, const char * fileName, long lineNumber, void * value, ConstStr255Param outputMsg, DebugAssertOutputHandlerUPP userUPP); #if !OPAQUE_UPP_TYPES #ifdef __cplusplus inline DEFINE_API_C(void) InvokeDebugAssertOutputHandlerUPP(OSType componentSignature, UInt32 options, const char * assertionString, const char * exceptionLabelString, const char * errorString, const char * fileName, long lineNumber, void * value, ConstStr255Param outputMsg, DebugAssertOutputHandlerUPP userUPP) { CALL_NINE_PARAMETER_UPP(userUPP, uppDebugAssertOutputHandlerProcInfo, componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg); } #else #define InvokeDebugAssertOutputHandlerUPP(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg, userUPP) CALL_NINE_PARAMETER_UPP((userUPP), uppDebugAssertOutputHandlerProcInfo, (componentSignature), (options), (assertionString), (exceptionLabelString), (errorString), (fileName), (lineNumber), (value), (outputMsg)) #endif #endif #if CALL_NOT_IN_CARBON || OLDROUTINENAMES /* support for pre-Carbon UPP routines: New...Proc and Call...Proc */ #define NewDebugComponentCallbackProc(userRoutine) NewDebugComponentCallbackUPP(userRoutine) #define NewDebugAssertOutputHandlerProc(userRoutine) NewDebugAssertOutputHandlerUPP(userRoutine) #define CallDebugComponentCallbackProc(userRoutine, optionSelectorNum, command, optionSetting) InvokeDebugComponentCallbackUPP(optionSelectorNum, command, optionSetting, userRoutine) #define CallDebugAssertOutputHandlerProc(userRoutine, componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg) InvokeDebugAssertOutputHandlerUPP(componentSignature, options, assertionString, exceptionLabelString, errorString, fileName, lineNumber, value, outputMsg, userRoutine) #endif /* CALL_NOT_IN_CARBON */ #ifdef PRAGMA_IMPORT_OFF #pragma import off #elif PRAGMA_IMPORT #pragma import reset #endif #ifdef __cplusplus } #endif #endif /* __DEBUGGING__ */