00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00039 #ifndef DEBUG_H
00040 #define DEBUG_H
00041
00042 #include <stdio.h>
00043 #include <stdlib.h>
00044
00045
00046
00047
00048 #define ERRMSG(msg) \
00049 fprintf(stderr, "ERROR: %s, line %d: %s\n", __FILE__, __LINE__, msg)
00050
00051
00052
00053
00054
00055
00056
00057 #define BUG(msg) \
00058 do { ERRMSG(msg); abort(); } while (0)
00059
00060
00061 #if defined(DEBUG_SUPPORT) || defined(DEBUG_WATCH)
00062
00063 #include <string.h>
00064 #include <errno.h>
00065
00066
00067
00068
00069
00070
00071
00072 #define ASSERT(expr) \
00073 do { \
00074 if ( !(expr) ) { \
00075 fprintf(stderr, "ASSERTION FAILED: %s, line %d: \"%s\"\n", \
00076 __FILE__, __LINE__, #expr); \
00077 abort(); \
00078 } \
00079 } while (0)
00080
00081
00082
00083
00084
00085
00086
00087
00088 #define COND(expr) \
00089 do { \
00090 if ( expr ) { \
00091 fprintf(stderr, "EXCEPTIONAL CONDITION: %s, line %d: \"%s\"\n", \
00092 __FILE__, __LINE__, #expr); \
00093 abort(); \
00094 } \
00095 } while (0)
00096
00097
00098
00099
00100
00101
00102
00103
00104 #define ERRCOND(expr) \
00105 do { \
00106 if ( expr ) { \
00107 fprintf(stderr, "EXCEPTIONAL CONDITION: %s, line %d: \"%s\"\n" \
00108 "SYSTEM ERROR: %s\n", __FILE__, __LINE__, #expr, \
00109 (strerror(errno) ? strerror(errno) : "")); \
00110 abort(); \
00111 } \
00112 } while (0)
00113
00114 #ifdef DEBUG_WATCH
00115
00116
00117 static int DEBUG_COUNTER = 0;
00118
00119
00120 #ifndef DEBUG_TITLE
00121 #define DEBUG_TITLE "DEBUG"
00122 #endif
00123
00124
00125
00126
00127
00128
00129 #define TEXT(t) \
00130 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) text: %s\n", \
00131 DEBUG_COUNTER++, __FILE__, __LINE__, t)
00132
00133
00134
00135
00136
00137
00138
00139 #define STR(str) \
00140 do { \
00141 const char *DEBUG_str = (str); \
00142 (DEBUG_str ? \
00143 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) string: (%s)=\"%s\"\n", \
00144 DEBUG_COUNTER++, __FILE__, __LINE__, #str, DEBUG_str) : \
00145 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) string: (%s)=(nil)\n", \
00146 DEBUG_COUNTER++, __FILE__, __LINE__, #str)); \
00147 } while (0)
00148
00149
00150
00151
00152 #define INT(i) \
00153 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) int expr: (%s)=%d\n", \
00154 DEBUG_COUNTER++, __FILE__, __LINE__, #i, (int)(i))
00155
00156
00157
00158
00159 #define PTR(p) \
00160 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) hex addr: (%s)=%p\n", \
00161 DEBUG_COUNTER++, __FILE__, __LINE__, #p, (void *)(p))
00162
00163
00164
00165
00166 #define FLT(x) \
00167 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) fp expr: (%s)=%g\n", \
00168 DEBUG_COUNTER++, __FILE__, __LINE__, #x, (double)(x))
00169
00170
00171
00172
00173
00174
00175
00176
00177 #define VEC(v) \
00178 fprintf(stderr, DEBUG_TITLE " %d (%s, line %d) vec var: (%s)=(%g %g %g)\n", \
00179 DEBUG_COUNTER++, __FILE__, __LINE__, #v, \
00180 (double)((v).x), (double)((v).y), (double)((v).z))
00181
00182 #else
00183
00184 #define TEXT(t)
00185 #define STR(s)
00186 #define INT(i)
00187 #define PTR(p)
00188 #define FLT(x)
00189 #define VEC(v)
00190
00191 #endif
00192
00193 #else
00194
00195 #define ASSERT(expr)
00196 #define COND(expr)
00197 #define ERRCOND(expr)
00198
00199 #define TEXT(t)
00200 #define STR(s)
00201 #define INT(i)
00202 #define PTR(p)
00203 #define FLT(x)
00204 #define VEC(v)
00205
00206 #endif
00207
00208 #endif