00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021 #ifndef __EDELIB_DEBUG_H__
00022 #define __EDELIB_DEBUG_H__
00023
00024 #include "edelib-global.h"
00025 #include <stdarg.h>
00026
00027 #ifdef __cplusplus
00028 extern "C" {
00029 #endif
00030
00035 #ifndef SKIP_DOCS
00036 EDELIB_API void edelib_logv(const char *domain, int type, const char *fmt, va_list args);
00037 EDELIB_API void edelib_log(const char *domain, int type, const char *fmt, ...);
00038 #endif
00039
00044 typedef enum {
00045 EDELIB_ERROR_MESSAGE_DEBUG,
00046 EDELIB_ERROR_MESSAGE_WARNING,
00047 EDELIB_ERROR_MESSAGE_FATAL
00048 } EdelibErrorMessageType;
00049
00053 EDELIB_API void edelib_error_mesage_handler_install(void (*)(int t, const char* domain, const char* msg));
00054
00062 #ifndef E_LOG_DOMAIN
00063 #define E_LOG_DOMAIN ((char*)0)
00064 #endif
00065
00066 #ifdef __GNUC__
00067 #define _E_FUNCTION_NAME __PRETTY_FUNCTION__
00068 #else
00069 #define _E_FUNCTION_NAME "<unknown>"
00070 #endif
00071
00093 #ifdef EDELIB_HAVE_ISO_VARARGS
00094 #define E_DEBUG(...) edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_DEBUG, __VA_ARGS__)
00095 #define E_WARNING(...) edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_WARNING, __VA_ARGS__)
00096 #define E_FATAL(...) edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_FATAL, __VA_ARGS__)
00097 #elif defined(EDELIB_HAVE_GNUC_VARARGS)
00098 #define E_DEBUG(format...) edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_DEBUG, format)
00099 #define E_WARNING(format...) edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_WARNING, format)
00100 #define E_FATAL(format...) edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_FATAL, format)
00101 #else
00102 void E_DEBUG(const char *fmt, ...);
00103 void E_WARNING(const char *fmt, ...);
00104 void E_FATAL(const char *fmt, ...);
00105 #endif
00106
00114 #ifdef NDEBUG
00115 #define E_ASSERT(expr)
00116 #else
00117 #define E_ASSERT(expr) \
00118 do { \
00119 if(!(expr)) \
00120 edelib_log(E_LOG_DOMAIN, EDELIB_ERROR_MESSAGE_FATAL, "Assertion failed: \"%s\" in %s (%d), function: \"%s\"\n", \
00121 #expr, __FILE__, __LINE__, _E_FUNCTION_NAME); \
00122 } while(0);
00123 #endif
00124
00125 #define _E_STRLOC_STRINGIFY(arg) _E_STRLOC_STRINGIFY_ARG(arg)
00126 #define _E_STRLOC_STRINGIFY_ARG(content) #content
00127
00134 #define E_STRLOC __FILE__ ":" _E_STRLOC_STRINGIFY(__LINE__)
00135
00152 #if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
00153 #define _E_BOOLEAN_EXPR(expr) \
00154 __extension__ ({ \
00155 int _edelib_boolean_var_; \
00156 if(expr) \
00157 _edelib_boolean_var_ = 1; \
00158 else \
00159 _edelib_boolean_var_ = 0; \
00160 _edelib_boolean_var_; \
00161 })
00162
00163 #define E_LIKELY(expr) (__builtin_expect(_E_BOOLEAN_EXPR(expr), 1))
00164 #define E_UNLIKELY(expr) (__builtin_expect(_E_BOOLEAN_EXPR(expr), 0))
00165 #else
00166 #define E_LIKELY(expr) (expr)
00167 #define E_UNLIKELY(expr) (expr)
00168 #endif
00169
00178 #define E_RETURN_IF_FAIL(expr) \
00179 do { \
00180 if E_LIKELY(expr) { } \
00181 else { \
00182 E_WARNING(E_STRLOC ": Condition '%s' failed\n", #expr); \
00183 return; \
00184 } \
00185 } while(0)
00186
00194 #define E_RETURN_VAL_IF_FAIL(expr, val) \
00195 do { \
00196 if E_LIKELY(expr) { } \
00197 else { \
00198 E_WARNING(E_STRLOC ": Condition '%s' failed\n", #expr); \
00199 return (val); \
00200 } \
00201 } while(0)
00202
00203
00204
00205 #define EDEBUG E_DEBUG
00206 #define EWARNING E_WARNING
00207 #define EFATAL E_FATAL
00208 #define EASSERT E_ASSERT
00209 #define ESTRLOC E_STRLOC
00210
00211 #ifdef __cplusplus
00212 }
00213 #endif
00214
00215 #endif