debug.h
Go to the documentation of this file.00001
00007 #ifndef DEBUG_H
00008 #define DEBUG_H
00009
00010 #ifndef PP_H
00011 #include "pp.h"
00012 #endif
00013 #include <stdarg.h>
00014
00015 #ifdef MSVC
00016
00023 #define ppFileLine(txt) __FILE__ "(" ppTokStr(__LINE__) ") : " txt
00024 #else
00025
00029 #define ppFileLine(txt) __FILE__ ":" ppTokStr(__LINE__) ": " txt
00030 #endif
00031
00032
00033
00034 #ifdef NDEBUG
00035
00038 #define ppRelease(v) v
00039
00042 #define ppDebug(v)
00043
00046 #define ppReleaseParam(v) , v
00047
00050 #define ppDebugParam(v)
00051
00054 #define ppDebRel(deb,rel) rel
00055
00056 #else
00057
00058 #define ppRelease(v)
00059 #define ppDebug(v) v
00060 #define ppReleaseParam(v)
00061 #define ppDebugParam(v) , v
00062 #define ppDebRel(deb,rel) deb
00063
00064 #endif
00065
00066 #ifndef throwassert
00067
00076 #ifdef _MSC_VER
00077 #define throwassert(sz) ppDebug( { trace(( "%s\n", ppFileLine(sz) )); __asm { int 3 } } )
00078 #else
00079 #define throwassert(sz) ppDebug( { trace(( "%s\n", ppFileLine(sz) )); __asm__("int3"); } )
00080 #endif
00081 #endif
00082
00085 #ifndef isdebugger
00086 #define isdebugging() ppDebug( _isdebugging() )
00087 #endif
00088 #ifndef assert
00089
00093 #define assert(e) ppDebug( { if( !(e) ) throwassert(#e); } )
00094 #endif
00095 #ifndef assertptr
00096
00100 #define assertptr(p,len) assert( _checkptr((p),(len),1) )
00101 #endif
00102 #ifndef assertconst
00103
00107 #define assertconst(p,len) assert( _checkconst((p),(len),1) )
00108 #endif
00109 #ifndef assertobjptr
00110
00114 #define assertobjptr(p) assert( _checkptr((p),sizeof(*(p)),min(4,sizeof(*(p)))) )
00115 #endif
00116 #ifndef assertcodeptr
00117
00121 #define assertobjconst(p) assert( _checkconst((p),sizeof(*(p)),min(4,sizeof(*(p)))) )
00122 #endif
00123 #ifndef assertcodeptr
00124
00128 #define assertcodeptr(p) assert( _checkcall( p ) )
00129 #endif
00130
00131 #ifndef trace
00132
00136 #define trace(args) ppDebug( debug_trace args )
00137 #endif
00138 #ifndef traceline
00139
00143 #define traceline(args) ppDebug( { debug_trace("%s\n", ppFileLine(ppNULL) ); debug_trace args; } )
00144 #endif
00145
00146
00147 ppCPP(extern "C" {)
00148
00155 typedef int (*debug_vlog_t)( const char*, va_list );
00156 void debug_setvlog( debug_vlog_t debug_vlog );
00157 void debug_setlogmask( unsigned mask );
00158 unsigned debug_getlogmask(void);
00159 void debug_log( unsigned mask, const char* fmt, ... );
00160 void debug_vlog( unsigned mask, const char* fmt, va_list args );
00161 void debug_logalways(const char* fmt, ... );
00162 void debug_vlogalways(const char* fmt, va_list args );
00163 #define LOG debug_log
00164 void debug_loghex( unsigned mask, const void* ptr, size_t size );
00165 #define LOG_ERROR 0
00166 #define LOG_STARTUP 1
00167 #define LOG_WARNING 2
00168 #define LOG_SECURITY 4
00169 #define LOG_INFO 8
00170 #define LOG_PROFILE 16
00171
00172 #ifdef NDEBUG
00173 #define debug_settrace(fp)
00174 #else
00175
00178 typedef int (*debug_trace_t)(const char*,...);
00179 void debug_settrace( debug_trace_t trace );
00180 #ifndef DEBUG_C
00181 extern const debug_trace_t debug_trace;
00182 #endif
00183
00184 int _checkptr( void* p, size_t len, size_t align );
00185 int _checkconst( const void* p, size_t len, size_t align );
00186 int _checkcall( const void* p );
00187 int _isdebugging(void);
00188 #endif
00189
00190 ppCPP(})
00191
00192
00193 #endif