nuclear@0: #ifndef LOGGER_H_ nuclear@0: #define LOGGER_H_ nuclear@0: nuclear@0: #include nuclear@0: #include nuclear@0: nuclear@0: enum { nuclear@0: LOG_INFO = 1, nuclear@0: LOG_WARNING = 2, nuclear@0: LOG_ERROR = 4, nuclear@0: LOG_DEBUG = 8 nuclear@0: }; nuclear@0: nuclear@0: #ifdef __cplusplus nuclear@0: extern "C" { nuclear@0: #endif nuclear@0: nuclear@0: /* Clear log outputs. Initially info/debug messages go to stdout, and nuclear@0: * warning/error messages to stderr. nuclear@0: */ nuclear@0: void log_clear_targets(void); nuclear@0: nuclear@0: /* set logging outputs for any combination of message types. nuclear@0: * type_mask expects a bitmask. nuclear@0: */ nuclear@0: int log_add_stream(unsigned int type_mask, FILE *fp); nuclear@0: int log_add_file(unsigned int type_mask, const char *fname); nuclear@0: int log_add_func(unsigned int type_mask, void (*func)(const char*, void*), void *cls); nuclear@0: nuclear@0: void log_msg(unsigned int type, const char *fmt, ...); nuclear@0: /* log_msg helpers */ nuclear@0: void log_info(const char *fmt, ...); nuclear@0: void log_warning(const char *fmt, ...); nuclear@0: void log_error(const char *fmt, ...); nuclear@0: void log_debug(const char *fmt, ...); nuclear@0: nuclear@0: void log_va_msg(unsigned int type, const char *fmt, va_list va); nuclear@0: /* log_va_msg helpers */ nuclear@0: void log_va_info(const char *fmt, va_list ap); nuclear@0: void log_va_warning(const char *fmt, va_list ap); nuclear@0: void log_va_error(const char *fmt, va_list ap); nuclear@0: void log_va_debug(const char *fmt, va_list ap); nuclear@0: nuclear@0: /* Intercept stdout/stderr and handle them through the logger. stdout as an nuclear@0: * info log, and stderr as an error log. This only works on UNIX. nuclear@0: */ nuclear@0: void log_grab_stdout(void); nuclear@0: void log_grab_stderr(void); nuclear@0: nuclear@0: #ifdef __cplusplus nuclear@0: } nuclear@0: #endif nuclear@0: nuclear@0: #endif /* LOGGER_H_ */