00001 
00002 
00003 
00004 
00005 
00006 
00007 
00008 
00009 
00010 
00011 
00012 
00013 
00014 
00015 
00016 
00017 
00018 
00019 
00020 
00021 
00022 
00023 
00024 
00025 
00026 
00027 
00038 #ifndef P_DEBUG_H_
00039 #define P_DEBUG_H_
00040 
00041 
00042 #include <stdarg.h>
00043 
00044 #include "p_compiler.h"
00045 
00046 
00047 #ifdef  __cplusplus
00048 extern "C" {
00049 #endif
00050 
00051 
00052 #if defined(DBG) || defined(DEBUG)
00053 #ifndef DEBUG
00054 #define DEBUG 1
00055 #endif
00056 #else
00057 #ifndef NDEBUG
00058 #define NDEBUG 1
00059 #endif
00060 #endif
00061 
00062    
00063 
00064 #if defined(_MSC_VER) && _MSC_VER < 1300
00065 #define __FUNCTION__ "???"
00066 #endif
00067 
00068 
00069 void _debug_vprintf(const char *format, va_list ap);
00070    
00071 
00072 static INLINE void
00073 _debug_printf(const char *format, ...)
00074 {
00075    va_list ap;
00076    va_start(ap, format);
00077    _debug_vprintf(format, ap);
00078    va_end(ap);
00079 }
00080 
00081 
00091 static INLINE void
00092 debug_printf(const char *format, ...)
00093 {
00094 #ifdef DEBUG
00095    va_list ap;
00096    va_start(ap, format);
00097    _debug_vprintf(format, ap);
00098    va_end(ap);
00099 #else
00100    (void) format; 
00101 #endif
00102 }
00103 
00104 
00105 #ifdef DEBUG
00106 #define debug_vprintf(_format, _ap) _debug_vprintf(_format, _ap)
00107 #else
00108 #define debug_vprintf(_format, _ap) ((void)0)
00109 #endif
00110 
00111 
00112 #ifdef DEBUG
00113 
00117 void debug_print_blob( const char *name, const void *blob, unsigned size );
00118 
00119 
00120 
00121 void debug_print_format(const char *msg, unsigned fmt );
00122 #else
00123 #define debug_print_blob(_name, _blob, _size) ((void)0)
00124 #define debug_print_format(_msg, _fmt) ((void)0)
00125 #endif
00126 
00127 
00128 void _debug_break(void);
00129 
00130 
00134 #ifdef DEBUG
00135 #if defined(PIPE_ARCH_X86) && defined(PIPE_CC_GCC)
00136 #define debug_break() __asm("int3")
00137 #elif defined(PIPE_ARCH_X86) && defined(PIPE_CC_MSVC)
00138 #define debug_break()  do { _asm {int 3} } while(0)
00139 #else
00140 #define debug_break() _debug_break()
00141 #endif
00142 #else 
00143 #define debug_break() ((void)0)
00144 #endif 
00145 
00146 
00147 long
00148 debug_get_num_option(const char *name, long dfault);
00149 
00150 void _debug_assert_fail(const char *expr, 
00151                         const char *file, 
00152                         unsigned line, 
00153                         const char *function);
00154 
00155 
00162 #ifdef DEBUG
00163 #define debug_assert(expr) ((expr) ? (void)0 : _debug_assert_fail(#expr, __FILE__, __LINE__, __FUNCTION__))
00164 #else
00165 #define debug_assert(expr) ((void)0)
00166 #endif
00167 
00168 
00170 #ifdef assert
00171 #undef assert
00172 #endif
00173 #define assert(expr) debug_assert(expr)
00174 
00175 
00179 #ifdef DEBUG
00180 #define debug_checkpoint() \
00181    _debug_printf("%s\n", __FUNCTION__)
00182 #else
00183 #define debug_checkpoint() \
00184    ((void)0) 
00185 #endif
00186 
00187 
00191 #ifdef DEBUG
00192 #define debug_checkpoint_full() \
00193    _debug_printf("%s:%u:%s", __FILE__, __LINE__, __FUNCTION__) 
00194 #else
00195 #define debug_checkpoint_full() \
00196    ((void)0) 
00197 #endif
00198 
00199 
00203 #ifdef DEBUG
00204 #define debug_warning(__msg) \
00205    _debug_printf("%s:%u:%s: warning: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg)
00206 #else
00207 #define debug_warning(__msg) \
00208    ((void)0) 
00209 #endif
00210 
00211 
00215 #ifdef DEBUG
00216 #define debug_error(__msg) \
00217    _debug_printf("%s:%u:%s: error: %s\n", __FILE__, __LINE__, __FUNCTION__, __msg) 
00218 #else
00219 #define debug_error(__msg) \
00220    _debug_printf("error: %s\n", __msg)
00221 #endif
00222 
00223 
00227 struct debug_named_value
00228 {
00229    const char *name;
00230    unsigned long value;
00231 };
00232 
00233 
00253 #define DEBUG_NAMED_VALUE(__symbol) {#__symbol, (unsigned long)__symbol} 
00254 #define DEBUG_NAMED_VALUE_END {NULL, 0} 
00255 
00256 
00260 const char *
00261 debug_dump_enum(const struct debug_named_value *names, 
00262                 unsigned long value);
00263 
00264 
00268 const char *
00269 debug_dump_flags(const struct debug_named_value *names, 
00270                  unsigned long value);
00271 
00272 
00285 const char *
00286 debug_get_option(const char *name, const char *dfault);
00287 
00288 boolean
00289 debug_get_bool_option(const char *name, boolean dfault);
00290 
00291 long
00292 debug_get_num_option(const char *name, long dfault);
00293 
00294 unsigned long
00295 debug_get_flags_option(const char *name, 
00296                        const struct debug_named_value *flags,
00297                        unsigned long dfault);
00298 
00299 
00300 void *
00301 debug_malloc(const char *file, unsigned line, const char *function,
00302              size_t size);
00303 
00304 void
00305 debug_free(const char *file, unsigned line, const char *function,
00306            void *ptr);
00307 
00308 void *
00309 debug_calloc(const char *file, unsigned line, const char *function,
00310              size_t count, size_t size );
00311 
00312 void *
00313 debug_realloc(const char *file, unsigned line, const char *function,
00314               void *old_ptr, size_t old_size, size_t new_size );
00315 
00316 unsigned long
00317 debug_memory_begin(void);
00318 
00319 void 
00320 debug_memory_end(unsigned long beginning);
00321 
00322 
00323 #if defined(PROFILE) && defined(PIPE_SUBSYSTEM_WINDOWS_DISPLAY)
00324 
00325 void
00326 debug_profile_start(void);
00327 
00328 void 
00329 debug_profile_stop(void);
00330 
00331 #endif
00332 
00333 
00334 #ifdef DEBUG
00335 struct pipe_surface;
00336 void debug_dump_image(const char *prefix,
00337                       unsigned format, unsigned cpp,
00338                       unsigned width, unsigned height,
00339                       unsigned stride,
00340                       const void *data);
00341 void debug_dump_surface(const char *prefix,
00342                         struct pipe_surface *surface);   
00343 void debug_dump_surface_bmp(const char *filename,
00344                             struct pipe_surface *surface);
00345 #else
00346 #define debug_dump_image(prefix, format, cpp, width, height, stride, data) ((void)0)
00347 #define debug_dump_surface(prefix, surface) ((void)0)
00348 #define debug_dump_surface_bmp(filename, surface) ((void)0)
00349 #endif
00350 
00351 
00352 #ifdef  __cplusplus
00353 }
00354 #endif
00355 
00356 #endif