1 /*************************************************************************** 2 $RCSfile$ 3 ------------------- 4 cvs : $Id$ 5 begin : Thu Nov 28 2002 6 copyright : (C) 2002 by Martin Preuss 7 email : martin@libchipcard.de 8 9 *************************************************************************** 10 * * 11 * This library is free software; you can redistribute it and/or * 12 * modify it under the terms of the GNU Lesser General Public * 13 * License as published by the Free Software Foundation; either * 14 * version 2.1 of the License, or (at your option) any later version. * 15 * * 16 * This library is distributed in the hope that it will be useful, * 17 * but WITHOUT ANY WARRANTY; without even the implied warranty of * 18 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * 19 * Lesser General Public License for more details. * 20 * * 21 * You should have received a copy of the GNU Lesser General Public * 22 * License along with this library; if not, write to the Free Software * 23 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * 24 * MA 02111-1307 USA * 25 * * 26 ***************************************************************************/ 27 28 29 #ifndef GWEN_DEBUG_H 30 #define GWEN_DEBUG_H 31 32 #include <stdio.h> 33 #include <gwenhywfar/gwenhywfarapi.h> 34 #include <gwenhywfar/logger.h> 35 #include <gwenhywfar/error.h> 36 #include <gwenhywfar/types.h> 37 38 #ifdef __cplusplus 39 extern "C" { 40 #endif 41 42 #if (defined HAVE_FUNC && (DEBUGMODE>10)) 43 # define DBG_ENTER fprintf(stderr,"Enter \""__func__"\" \n") 44 # define DBG_LEAVE fprintf(stderr,"Leave \""__func__"\" \n") 45 #else 46 # define DBG_ENTER 47 # define DBG_LEAVE 48 #endif 49 50 #define GWEN_MEMORY_DEBUG_MODE_ALL 0 51 #define GWEN_MEMORY_DEBUG_MODE_OPEN 1 52 #define GWEN_MEMORY_DEBUG_MODE_DETAILED 2 53 #define GWEN_MEMORY_DEBUG_MODE_SHORT 3 54 55 typedef struct GWEN_MEMORY_DEBUG_OBJECT GWEN_MEMORY_DEBUG_OBJECT; 56 57 GWENHYWFAR_API 58 void GWEN_MemoryDebug_Increment(const char *name, 59 const char *wFile, 60 int wLine, 61 int attach); 62 GWENHYWFAR_API 63 void GWEN_MemoryDebug_Decrement(const char *name, 64 const char *wFile, 65 int wLine); 66 67 GWENHYWFAR_API 68 void GWEN_MemoryDebug_Dump(uint32_t mode); 69 70 GWENHYWFAR_API 71 void GWEN_MemoryDebug_DumpObject(const char *name, 72 uint32_t mode); 73 74 GWENHYWFAR_API 75 long int GWEN_MemoryDebug_GetObjectCount(const char *name); 76 77 GWENHYWFAR_API 78 void GWEN_MemoryDebug_CleanUp(void); 79 80 81 #ifdef GWEN_MEMORY_DEBUG 82 # define DBG_MEM_INC(o, attach)\ 83 GWEN_MemoryDebug_Increment(o, __FILE__, __LINE__, attach) 84 # define DBG_MEM_DEC(o)\ 85 GWEN_MemoryDebug_Decrement(o, __FILE__, __LINE__) 86 #else 87 # define DBG_MEM_INC(o, attach) 88 # define DBG_MEM_DEC(o) 89 #endif 90 91 GWENHYWFAR_API 92 uint32_t GWEN_Debug_Snprintf(char *buffer, 93 uint32_t size, 94 const char *fmt, ...); 95 96 #ifndef NO_VARIADIC_MACROS 97 # define DBG_ERROR(dbg_logger, format, args...) {\ 98 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Error) {\ 99 char dbg_buffer[300]; \ 100 \ 101 if (snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 102 __FILE__":%5d: " format , __LINE__ , ## args)>0) { \ 103 dbg_buffer[sizeof(dbg_buffer)-1]=(char)0; \ 104 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Error, dbg_buffer);\ 105 }\ 106 }\ 107 }; 108 #else /* #ifndef NO_VARIADIC_MACROS */ 109 GWENHYWFAR_API 110 void DBG_ERROR(const char *logdomain, const char *format, ...); 111 #endif /* #ifndef NO_VARIADIC_MACROS */ 112 113 #define DBG_ERROR_ERR(dbg_logger, dbg_err) {\ 114 char dbg_buffer[300]; \ 115 char dbg_errbuff[256]; \ 116 \ 117 GWEN_Error_ToString(dbg_err,dbg_errbuff, sizeof(dbg_errbuff)); \ 118 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 119 __FILE__":%5d: %s" , __LINE__ , dbg_errbuff); \ 120 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 121 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Error, dbg_buffer);}; 122 123 #ifndef NO_VARIADIC_MACROS 124 # define DBG_WARN(dbg_logger, format, args...) {\ 125 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Warning) {\ 126 char dbg_buffer[300]; \ 127 \ 128 if (snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 129 __FILE__":%5d: " format , __LINE__ , ## args)>0) { \ 130 dbg_buffer[sizeof(dbg_buffer)-1]=(char)0; \ 131 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Warning, dbg_buffer);\ 132 }\ 133 }\ 134 }; 135 #else /* #ifndef NO_VARIADIC_MACROS */ 136 GWENHYWFAR_API 137 void DBG_WARN(const char *logdomain, const char *format, ...); 138 #endif /* #ifndef NO_VARIADIC_MACROS */ 139 140 #define DBG_WARN_ERR(dbg_logger, dbg_err) {\ 141 char dbg_buffer[300]; \ 142 char dbg_errbuff[256]; \ 143 GWEN_Error_ToString(dbg_err,dbg_errbuff, sizeof(dbg_errbuff)); \ 144 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 145 __FILE__":%5d: %s" , __LINE__ , dbg_errbuff); \ 146 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 147 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Warning, dbg_buffer);}; 148 149 150 #ifndef NO_VARIADIC_MACROS 151 # define DBG_NOTICE(dbg_logger, format, args...) \ 152 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Notice) {\ 153 char dbg_buffer[300]; \ 154 \ 155 if (snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 156 __FILE__":%5d: " format , __LINE__ , ## args)>0) { \ 157 dbg_buffer[sizeof(dbg_buffer)-1]=(char)0; \ 158 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Notice, dbg_buffer);\ 159 }\ 160 }; 161 #else /* #ifndef NO_VARIADIC_MACROS */ 162 GWENHYWFAR_API 163 void DBG_NOTICE(const char *logdomain, const char *format, ...); 164 #endif /* #ifndef NO_VARIADIC_MACROS */ 165 166 #define DBG_NOTICE_ERR(dbg_logger, dbg_err) \ 167 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Notice) {\ 168 char dbg_buffer[300]; \ 169 char dbg_errbuff[256]; \ 170 GWEN_Error_ToString(dbg_err,dbg_errbuff, sizeof(dbg_errbuff)); \ 171 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 172 __FILE__":%5d: %s" , __LINE__ , dbg_errbuff); \ 173 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 174 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Notice, dbg_buffer);}; 175 176 177 #ifndef NO_VARIADIC_MACROS 178 # define DBG_INFO(dbg_logger, format, args...) \ 179 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Info) {\ 180 char dbg_buffer[300]; \ 181 \ 182 if (snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 183 __FILE__":%5d: " format , __LINE__ , ## args)>0) { \ 184 dbg_buffer[sizeof(dbg_buffer)-1]=(char)0; \ 185 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Info, dbg_buffer);\ 186 }\ 187 }; 188 #else /* #ifndef NO_VARIADIC_MACROS */ 189 GWENHYWFAR_API 190 void DBG_INFO(const char *logdomain, const char *format, ...); 191 #endif /* #ifndef NO_VARIADIC_MACROS */ 192 193 #define DBG_INFO_ERR(dbg_logger, dbg_err) \ 194 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Info) {\ 195 char dbg_buffer[300]; \ 196 char dbg_errbuff[256]; \ 197 GWEN_Error_ToString(dbg_err,dbg_errbuff, sizeof(dbg_errbuff)); \ 198 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 199 __FILE__":%5d: %s" , __LINE__ , dbg_errbuff); \ 200 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 201 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Info, dbg_buffer);}; 202 203 204 205 206 #ifndef DISABLE_DEBUGLOG 207 208 # ifndef NO_VARIADIC_MACROS 209 # define DBG_DEBUG(dbg_logger, format, args...) \ 210 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Debug) {\ 211 char dbg_buffer[300]; \ 212 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 213 __FILE__":%5d: " format , __LINE__ , ## args); \ 214 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 215 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Debug, dbg_buffer);}; 216 217 # define DBG_VERBOUS(dbg_logger, format, args...) \ 218 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Verbous) {\ 219 char dbg_buffer[300]; \ 220 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 221 __FILE__":%5d: " format , __LINE__ , ## args); \ 222 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 223 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Verbous, dbg_buffer);}; 224 # endif /* #ifndef NO_VARIADIC_MACROS */ 225 226 # define DBG_DEBUG_ERR(dbg_logger, dbg_err) \ 227 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Debug) {\ 228 char dbg_buffer[300]; \ 229 char dbg_errbuff[256]; \ 230 GWEN_Error_ToString(dbg_err,dbg_errbuff, sizeof(dbg_errbuff)); \ 231 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 232 __FILE__":%5d: %s" , __LINE__ , dbg_errbuff); \ 233 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 234 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Debug, dbg_buffer);}; 235 236 # define DBG_VERBOUS_ERR(dbg_logger, dbg_err) \ 237 if (GWEN_Logger_GetLevel(dbg_logger)>=GWEN_LoggerLevel_Verbous) {\ 238 char dbg_buffer[300]; \ 239 char dbg_errbuff[256]; \ 240 GWEN_Error_ToString(dbg_err,dbg_errbuff, sizeof(dbg_errbuff)); \ 241 snprintf(dbg_buffer, sizeof(dbg_buffer)-1,\ 242 __FILE__":%5d: %s" , __LINE__ , dbg_errbuff); \ 243 dbg_buffer[sizeof(dbg_buffer)-1]=0; \ 244 GWEN_Logger_Log(dbg_logger, GWEN_LoggerLevel_Verbous, dbg_buffer);}; 245 246 247 248 #else 249 250 # ifndef NO_VARIADIC_MACROS 251 # define DBG_DEBUG(dbg_logger, format, args...) 252 # define DBG_VERBOUS(dbg_logger, format, args...) 253 # endif /* ifndef NO_VARIADIC_MACROS */ 254 255 # define DBG_DEBUG_ERR(dbg_logger, dbg_err) 256 # define DBG_VERBOUS_ERR(dbg_logger, dbg_err) 257 258 #endif /* DISABLE_DEBUGLOG */ 259 260 #ifdef NO_VARIADIC_MACROS 261 GWENHYWFAR_API 262 void DBG_DEBUG(const char *logdomain, const char *format, ...); 263 GWENHYWFAR_API 264 void DBG_VERBOUS(const char *logdomain, const char *format, ...); 265 #endif /* #ifdef NO_VARIADIC_MACROS */ 266 267 268 #ifdef __cplusplus 269 } 270 #endif 271 272 273 #endif 274 275 276