00001 #ifndef LOGERR_H
00002 #define LOGERR_H 1
00003 #include <stdarg.h>
00004 #include "project_utilities.h"
00005
00006 BEGIN_C_DECLARATIONS
00007
00008
00009
00010
00011 typedef enum
00012 {
00013 LOGERR_EMERG = 0,
00014 LOGERR_ALERT = 1,
00015 LOGERR_CRIT = 2,
00016 LOGERR_ERR = 3,
00017 LOGERR_WARNING = 4,
00018 LOGERR_NOTICE = 5,
00019 LOGERR_INFO = 6,
00020 LOGERR_DEBUG = 7
00021 } logerr_priority;
00022
00023 #ifndef LOGERR_THRESHOLD_REPORT
00024 #define LOGERR_THRESHOLD_REPORT LOGERR_DEBUG
00025 #endif
00026
00027 #ifndef LOGERR_THRESHOLD_ABORT
00028 #define LOGERR_THRESHOLD_ABORT LOGERR_ERR
00029 #endif
00030
00031 typedef void (*logerr_message_poster_t) (int priority, const char * title,
00032 const char * message);
00033 typedef void (*logerr_perror_poster_t) (int priority, const char * title,
00034 const char * message, const char * syserr);
00035
00036 void logerr_vdispatch (int priority, const char * title,
00037 const char * fmt, va_list ap);
00038 void logerr_dispatch (int priority, const char * title,
00039 const char * fmt, ...);
00040
00041 void logerr_vperror (int priority, int errnum, const char * title,
00042 const char * fmt, va_list ap);
00043
00044 void logerr_perror (int priority, int errnum, const char * title,
00045 const char * fmt, ...);
00046
00047 #if HAVE_C99_VARARGS
00048 #define logerr(priority, title, ...) do { \
00049 if (priority <= LOGERR_THRESHOLD_REPORT) \
00050 logerr_dispatch (priority, title, __VA_ARGS__); \
00051 } while (0)
00052 #define logerrno(priority, errnum, title, ...) do { \
00053 if (priority <= LOGERR_THRESHOLD_REPORT) \
00054 logerr_perror (priority, errnum, title, __VA_ARGS__); \
00055 } while (0)
00056 #define logerr_emerg(title, ...) do { \
00057 if (LOGERR_EMERG <= LOGERR_THRESHOLD_REPORT) \
00058 logerr_dispatch (LOGERR_EMERG, title, __VA_ARGS__); \
00059 } while (0)
00060 #define logerr_alert(title, ...) do { \
00061 if (LOGERR_ALERT <= LOGERR_THRESHOLD_REPORT) \
00062 logerr_dispatch (LOGERR_ALERT, title, __VA_ARGS__); \
00063 } while (0)
00064 #define logerr_crit(title, ...) do { \
00065 if (LOGERR_CRIT <= LOGERR_THRESHOLD_REPORT) \
00066 logerr_dispatch (LOGERR_CRIT, title, __VA_ARGS__); \
00067 } while (0)
00068 #define logerr_err(title, ...) do { \
00069 if (LOGERR_ERR <= LOGERR_THRESHOLD_REPORT) \
00070 logerr_dispatch (LOGERR_ERR, title, __VA_ARGS__); \
00071 } while (0)
00072 #define logerr_warning(title, ...) do { \
00073 if (LOGERR_WARNING <= LOGERR_THRESHOLD_REPORT) \
00074 logerr_dispatch (LOGERR_WARNING, title, __VA_ARGS__); \
00075 } while (0)
00076 #define logerr_notice(title, ...) do { \
00077 if (LOGERR_NOTICE <= LOGERR_THRESHOLD_REPORT) \
00078 logerr_dispatch (LOGERR_NOTICE, title, __VA_ARGS__); \
00079 } while (0)
00080 #define logerr_info(title, ...) do { \
00081 if (LOGERR_INFO <= LOGERR_THRESHOLD_REPORT) \
00082 logerr_dispatch (LOGERR_INFO, title, __VA_ARGS__); \
00083 } while (0)
00084 #define logerr_debug(title, ...) do { \
00085 if (LOGERR_DEBUG <= LOGERR_THRESHOLD_REPORT) \
00086 logerr_dispatch (LOGERR_DEBUG, title, __VA_ARGS__); \
00087 } while (0)
00088 #elif HAVE_OLDGCC_VARARGS
00089 #define logerr(priority, title, fmt...) do { \
00090 if (priority <= LOGERR_THRESHOLD_REPORT) \
00091 logerr_dispatch (priority, title, fmt); \
00092 } while (0)
00093 #define logerrno(priority, errnum, title, fmt...) do { \
00094 if (priority <= LOGERR_THRESHOLD_REPORT) \
00095 logerr_perror (priority, errnum, title, fmt); \
00096 } while (0)
00097 #define logerr_emerg(title, fmt...) do { \
00098 if (LOGERR_EMERG <= LOGERR_THRESHOLD_REPORT) \
00099 logerr_dispatch (LOGERR_EMERG, title, fmt); \
00100 } while (0)
00101 #define logerr_alert(title, fmt...) do { \
00102 if (LOGERR_ALERT <= LOGERR_THRESHOLD_REPORT) \
00103 logerr_dispatch (LOGERR_ALERT, title, fmt); \
00104 } while (0)
00105 #define logerr_crit(title, fmt...) do { \
00106 if (LOGERR_CRIT <= LOGERR_THRESHOLD_REPORT) \
00107 logerr_dispatch (LOGERR_CRIT, title, fmt); \
00108 } while (0)
00109 #define logerr_err(title, fmt...) do { \
00110 if (LOGERR_ERR <= LOGERR_THRESHOLD_REPORT) \
00111 logerr_dispatch (LOGERR_ERR, title, fmt); \
00112 } while (0)
00113 #define logerr_warning(title, fmt...) do { \
00114 if (LOGERR_WARNING <= LOGERR_THRESHOLD_REPORT) \
00115 logerr_dispatch (LOGERR_WARNING, title, fmt); \
00116 } while (0)
00117 #define logerr_notice(title, fmt...) do { \
00118 if (LOGERR_NOTICE <= LOGERR_THRESHOLD_REPORT) \
00119 logerr_dispatch (LOGERR_NOTICE, title, fmt); \
00120 } while (0)
00121 #define logerr_info(title, fmt...) do { \
00122 if (LOGERR_INFO <= LOGERR_THRESHOLD_REPORT) \
00123 logerr_dispatch (LOGERR_INFO, title, fmt); \
00124 } while (0)
00125 #define logerr_debug(title, fmt...) do { \
00126 if (LOGERR_DEBUG <= LOGERR_THRESHOLD_REPORT) \
00127 logerr_dispatch (LOGERR_DEBUG, title, fmt); \
00128 } while (0)
00129 #else
00130
00131 static void
00132 logerr (int priority, const char * title, const char * fmt, ...)
00133 {
00134 va_list ap;
00135
00136 if (priority <= LOGERR_THRESHOLD_REPORT)
00137 {
00138 va_start (ap, fmt);
00139 logerr_vdispatch (priority, title, fmt, ap);
00140 va_end (ap);
00141 }
00142 }
00143
00144 static void
00145 logerrno (int priority, int errnum, const char * title, const char * fmt, ...)
00146 {
00147 va_list ap;
00148
00149 if (priority <= LOGERR_THRESHOLD_REPORT)
00150 {
00151 va_start (ap, fmt);
00152 logerr_vperror (priority, errnum, title, fmt, ap);
00153 va_end (ap);
00154 }
00155 }
00156
00157 #define LOGERR_MAKE_EASY(NICENAME, UGLYCODE) static void \
00158 logerr_##NICENAME (const char * title, const char * fmt, ...) \
00159 { \
00160 va_list ap; \
00161 if (UGLYCODE <= LOGERR_THRESHOLD_REPORT) \
00162 { \
00163 va_start (ap, fmt); \
00164 logerr_vdispatch (UGLYCODE, title, fmt, ap); \
00165 va_end (ap); \
00166 } \
00167 }
00168
00169 LOGERR_MAKE_EASY (emerg, LOGERR_EMERG)
00170 LOGERR_MAKE_EASY (alert, LOGERR_ALERT)
00171 LOGERR_MAKE_EASY (crit, LOGERR_CRIT)
00172 LOGERR_MAKE_EASY (err, LOGERR_ERR)
00173 LOGERR_MAKE_EASY (warning, LOGERR_WARNING)
00174 LOGERR_MAKE_EASY (notice, LOGERR_NOTICE)
00175 LOGERR_MAKE_EASY (info, LOGERR_INFO)
00176 LOGERR_MAKE_EASY (debug, LOGERR_DEBUG)
00177
00178 #endif
00179
00180 #define logerr_assert(priority, title, condition) do { \
00181 if (priority <= LOGERR_THRESHOLD_REPORT) { \
00182 if (!(condition)) \
00183 logerr_dispatch(priority, title, \
00184 "file %s: line %d: assertion (%s) failed", \
00185 __FILE__, __LINE__, (#condition)); \
00186 } \
00187 } while (0);
00188
00189 void logerr_set_abort_threshold (int threshold);
00190 void logerr_set_messenger (logerr_message_poster_t messenger);
00191 void logerr_set_perror_messenger (logerr_message_poster_t poster);
00192
00193 #if HAVE_C99_FUNC
00194 #define LOGERR_FUNC __func__
00195 #elif HAVE_PRETTY_FUNCTION
00196 #define LOGERR_FUNC __PRETTY_FUNCTION__
00197 #else
00198 #define LOGERR_FUNC NULL
00199 #endif
00200
00201 END_C_DECLARATIONS
00202
00203 #endif
00204