log4c 1.2.1
category.h
Go to the documentation of this file.
00001 /* $Id$
00002  *
00003  * category.h
00004  * 
00005  * Copyright 2001-2003, Meiosys (www.meiosys.com). All rights reserved.
00006  *
00007  * See the COPYING file for the terms of usage and distribution.
00008  */
00009 
00010 #ifndef log4c_category_h
00011 #define log4c_category_h
00012 
00023 #include <stdio.h>
00024 #include <stdarg.h>
00025 #include <log4c/defs.h>
00026 #include <log4c/priority.h>
00027 #include <log4c/location_info.h>
00028 
00029 __LOG4C_BEGIN_DECLS
00030 
00031 struct __log4c_appender;
00032 struct __log4c_category;
00033 
00037 typedef struct __log4c_category log4c_category_t;
00038 
00046 LOG4C_API log4c_category_t* log4c_category_get(const char* a_name);
00047 
00057 LOG4C_API int log4c_category_list(log4c_category_t** a_cats, int a_ncats);
00058 
00068 LOG4C_API log4c_category_t* log4c_category_new(const char* a_name);
00069 
00075 LOG4C_API void log4c_category_delete(log4c_category_t* a_category);
00076 
00082 LOG4C_API const char* log4c_category_get_name(const log4c_category_t* a_category);
00083 
00090 LOG4C_API const struct __log4c_appender* log4c_category_get_appender(
00091     const log4c_category_t* a_category);
00092 
00099 LOG4C_API int log4c_category_get_additivity(const log4c_category_t* a_category);
00100 
00106 LOG4C_API int log4c_category_get_priority(const log4c_category_t* a_category);
00107 
00119 LOG4C_API int log4c_category_get_chainedpriority(const log4c_category_t* a_category);
00120 
00128 LOG4C_API const struct __log4c_appender* log4c_category_set_appender(
00129     log4c_category_t* a_category,
00130     struct __log4c_appender* a_appender);
00139 LOG4C_API int log4c_category_set_priority(log4c_category_t* a_category,
00140                                        int a_priority);
00141 
00149 LOG4C_API int log4c_category_set_additivity(log4c_category_t* a_category,
00150                                          int a_additivity);
00157 LOG4C_API void log4c_category_print(const log4c_category_t* a_category, FILE* a_stream); 
00158 
00166 #if !defined(_WIN32) && !defined(__HP_cc)
00167 static inline int log4c_category_is_priority_enabled(const log4c_category_t* a_category,
00168                                                      int a_priority)
00169 {
00170     return log4c_category_get_chainedpriority(a_category) >= a_priority;
00171 }
00172 #else
00173 #define log4c_category_is_priority_enabled(a,b) \
00174   (log4c_category_get_chainedpriority(a) >= b)
00175 #endif
00176 
00184 #if !defined(_WIN32) && !defined(__HP_cc)
00185 static inline int log4c_category_is_fatal_enabled(const log4c_category_t* a_category)
00186 {       
00187   return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_FATAL);
00188 }
00189 #else
00190 #define log4c_category_is_fatal_enabled(a)  \
00191   (log4c_category_is_priority_enabled(a,LOG4C_PRIORITY_FATAL))
00192 #endif
00193  
00201 #if !defined(_WIN32) && !defined(__HP_cc)
00202 static inline int log4c_category_is_alert_enabled(const log4c_category_t* a_category) 
00203 {       
00204     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_ALERT); 
00205 }
00206 #else
00207 #define log4c_category_is_alert_enabled(a) \
00208   (log4c_category_is_priority_enabled(a,LOG4C_PRIORITY_ALERT))
00209 #endif
00210  
00218 #if !defined(_WIN32) && !defined(__HP_cc)
00219 static inline int log4c_category_is_crit_enabled(const log4c_category_t* a_category) 
00220 {       
00221     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_CRIT); 
00222 }
00223 #else
00224 #define log4c_category_is_crit_enabled(a) \
00225   (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_CRIT))
00226 #endif
00227  
00235 #if !defined(_WIN32) && !defined(__HP_cc)
00236 static inline int log4c_category_is_error_enabled(const log4c_category_t* a_category) 
00237 {       
00238     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_ERROR); 
00239 }
00240 #else
00241 #define log4c_category_is_error_enabled(a) \
00242   (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_ERROR))
00243 #endif
00244  
00252 #if !defined(_WIN32) && !defined(__HP_cc)
00253 static inline int log4c_category_is_warn_enabled(const log4c_category_t* a_category) 
00254 {       
00255     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_WARN); 
00256 }
00257 #else
00258 #define log4c_category_is_warn_enabled(a) \
00259   log4c_category_is_warn_enabled(a) \
00260     (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_WARN))
00261 #endif
00262  
00270 #if !defined(_WIN32) && !defined(__HP_cc)
00271 static inline int log4c_category_is_notice_enabled(const log4c_category_t* a_category) 
00272 {       
00273     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_NOTICE); 
00274 }
00275 #else 
00276 #define log4c_category_is_notice_enabled(a) \
00277   (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_NOTICE))
00278 #endif
00279  
00287 #if !defined(_WIN32) && !defined(__HP_cc)
00288 static inline int log4c_category_is_info_enabled(const log4c_category_t* a_category) 
00289 {       
00290     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_INFO); 
00291 }
00292 #else
00293 #define log4c_category_is_info_enabled(a) \
00294   (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_INFO))
00295 #endif
00296  
00304 #if !defined(_WIN32) && !defined(__HP_cc)
00305 static inline int log4c_category_is_debug_enabled(const log4c_category_t* a_category) 
00306 {       
00307     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_DEBUG); 
00308 }
00309 #else
00310 #define log4c_category_is_debug_enabled(a) \
00311   (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_DEBUG))
00312 #endif
00313  
00321 #if !defined(_WIN32) && !defined(__HP_cc)
00322 static inline int log4c_category_is_trace_enabled(const log4c_category_t* a_category) 
00323 {       
00324     return log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_TRACE); 
00325 }
00326 #else
00327 #define log4c_category_is_trace_enabled(a) \
00328   (log4c_category_is_priority_enabled(a, LOG4C_PRIORITY_TRACE))
00329 #endif
00330  
00334 LOG4C_API void __log4c_category_vlog(const log4c_category_t* a_category, 
00335                                   const log4c_location_info_t* a_locinfo, 
00336                                   int a_priority,
00337                                   const char* a_format, 
00338                                   va_list a_args);
00339 
00347 /* msvc doesn't allow "inline" nor variable args in a macro
00348  * so cannot #define these ones.
00349  */
00350 
00351 static LOG4C_INLINE void log4c_category_vlog(const log4c_category_t* a_category, 
00352                                        int a_priority,
00353                                        const char* a_format, 
00354                                        va_list a_args)
00355 {
00356     const log4c_location_info_t locinfo = LOG4C_LOCATION_INFO_INITIALIZER(NULL);
00357 
00358     __log4c_category_vlog(a_category, &locinfo, a_priority, a_format, a_args);
00359 }
00360 
00369 static LOG4C_INLINE void log4c_category_log(const log4c_category_t* a_category,
00370                                       int a_priority,
00371                                       const char* a_format,
00372                                       ...)
00373 {
00374     if (log4c_category_is_priority_enabled(a_category, a_priority)) {
00375         va_list va;
00376         va_start(va, a_format);
00377         log4c_category_vlog(a_category, a_priority, a_format, va);
00378         va_end(va);
00379     }
00380 }
00381 
00391 static LOG4C_INLINE void log4c_category_log_locinfo(
00392     const log4c_category_t* a_category,
00393     const log4c_location_info_t* a_locinfo, 
00394     int a_priority,
00395     const char* a_format,
00396     ...)
00397 {
00398     if (log4c_category_is_priority_enabled(a_category, a_priority)) {
00399         va_list va;
00400         va_start(va, a_format);
00401         __log4c_category_vlog(a_category, a_locinfo, a_priority, a_format, va);
00402         va_end(va);
00403     }
00404 }
00405 
00413 static LOG4C_INLINE void log4c_category_fatal(const log4c_category_t* a_category,
00414                                         const char* a_format,
00415                                         ...)
00416 {
00417     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_FATAL)) {
00418         va_list va;
00419         va_start(va, a_format);
00420         log4c_category_vlog(a_category, LOG4C_PRIORITY_FATAL, a_format, va);
00421         va_end(va);
00422     }
00423 }
00424 
00432 static LOG4C_INLINE void log4c_category_alert(const log4c_category_t* a_category,
00433                                         const char* a_format,
00434                                         ...)
00435 {
00436     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_ALERT)) {
00437         va_list va;
00438         va_start(va, a_format);
00439         log4c_category_vlog(a_category, LOG4C_PRIORITY_ALERT, a_format, va);
00440         va_end(va);
00441     }
00442 }
00443 
00451 static LOG4C_INLINE void log4c_category_crit(const log4c_category_t* a_category,
00452                                        const char* a_format,
00453                                        ...)
00454 {
00455     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_CRIT)) {
00456         va_list va;
00457         va_start(va, a_format);
00458         log4c_category_vlog(a_category, LOG4C_PRIORITY_CRIT, a_format, va);
00459         va_end(va);
00460     }
00461 }
00462 
00470 static LOG4C_INLINE void log4c_category_error(const log4c_category_t* a_category,
00471                                         const char* a_format,
00472                                         ...)
00473 {
00474     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_ERROR)) {
00475         va_list va;
00476         va_start(va, a_format);
00477         log4c_category_vlog(a_category, LOG4C_PRIORITY_ERROR, a_format, va);
00478         va_end(va);
00479     }
00480 }
00481 
00489 static LOG4C_INLINE void log4c_category_warn(const log4c_category_t* a_category,
00490                                        const char* a_format,
00491                                        ...)
00492 {
00493     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_WARN)) {
00494         va_list va;
00495         va_start(va, a_format);
00496         log4c_category_vlog(a_category, LOG4C_PRIORITY_WARN, a_format, va);
00497         va_end(va);
00498     }
00499 }
00500 
00508 static LOG4C_INLINE void log4c_category_notice(const log4c_category_t* a_category,
00509                                          const char* a_format,
00510                                          ...)
00511 {
00512     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_NOTICE)) {
00513         va_list va;
00514         va_start(va, a_format);
00515         log4c_category_vlog(a_category, LOG4C_PRIORITY_NOTICE, a_format, va);
00516         va_end(va);
00517     }
00518 }
00519 
00527 static LOG4C_INLINE void log4c_category_info(const log4c_category_t* a_category,
00528                                        const char* a_format,
00529                                        ...)
00530 {
00531     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_INFO)) {
00532         va_list va;
00533         va_start(va, a_format);
00534         log4c_category_vlog(a_category, LOG4C_PRIORITY_INFO, a_format, va);
00535         va_end(va);
00536     }
00537 }
00538 
00546 static LOG4C_INLINE void log4c_category_debug(const log4c_category_t* a_category,
00547                                         const char* a_format,
00548                                         ...)
00549 {
00550     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_DEBUG)) {
00551         va_list va;
00552         va_start(va, a_format);
00553         log4c_category_vlog(a_category, LOG4C_PRIORITY_DEBUG, a_format, va);
00554         va_end(va);
00555     }
00556 }
00557 
00565 static LOG4C_INLINE void __log4c_category_trace(const log4c_category_t* a_category,
00566                                           const char* a_format,
00567                                           ...)
00568 {
00569     if (log4c_category_is_priority_enabled(a_category, LOG4C_PRIORITY_TRACE)) {
00570         va_list va;
00571         va_start(va, a_format);
00572         log4c_category_vlog(a_category, LOG4C_PRIORITY_TRACE, a_format, va);
00573         va_end(va);
00574     }
00575 }
00576 
00577 #ifdef __GNUC__
00578 
00579 #ifdef OLD_VARIADIC_MACRO
00580 
00581 #  define log4c_category_trace(a_category, a_format, args...) \
00582     __log4c_category_trace(a_category, log4c_location "\n" a_format, ##args )
00583 
00584 #else
00585 
00586 #  define log4c_category_trace(a_category, a_format, ...) \
00587     __log4c_category_trace(a_category, log4c_location "\n" a_format, ##__VA_ARGS__ )
00588 
00589 #endif /* OLD_VARIADIC_MACRO */
00590 
00591 
00592 #else
00593 #  define log4c_category_trace __log4c_category_trace
00594 #endif  /* __GNUC__ */
00595 
00602 #ifdef __GNUC__
00603 #   define log4c_category_define(a_category, a_name) \
00604     typedef log4c_category_t log4c_category_define_##a_category __attribute__((deprecated)); \
00605     static log4c_category_define_##a_category* a_category  __attribute__ ((unused)) = NULL;
00606 #else
00607 #   define log4c_category_define(a_category, a_name)
00608 #endif
00609 
00613 struct __sd_factory;
00614 LOG4C_API struct __sd_factory* log4c_category_factory;
00615 
00616 __LOG4C_END_DECLS
00617 
00618 #endif