Main Page   Compound List   File List   Compound Members   File Members  

logerr.h

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 /* Based partly on ideas lifted from the error logging for GLib (the core
00009    library for GTK+ and GNOME). */
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 /* we can't use varadic preprocessor macros */
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 /* !HAVE_*_VARARGS */
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 /* HAVE_*_FUNCTION */
00200 
00201 END_C_DECLARATIONS
00202 
00203 #endif /* !LOGERR_H */
00204 

Generated on Tue Jun 22 14:32:07 2004 for trees by doxygen1.2.18