qnetdice
diff src/logger.cc @ 1:92377189a5c6
moving along
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 22 Dec 2013 04:08:50 +0200 |
parents | |
children |
line diff
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/src/logger.cc Sun Dec 22 04:08:50 2013 +0200 1.3 @@ -0,0 +1,74 @@ 1.4 +#include <stdio.h> 1.5 +#include <stdlib.h> 1.6 +#include <string.h> 1.7 +#include <stdarg.h> 1.8 +#include <list> 1.9 +#include "logger.h" 1.10 + 1.11 +struct LogTarget { 1.12 + enum LogTargetType { LOG_TYPE_STREAM, LOG_TYPE_CALLBACK } type; 1.13 + FILE *fp; 1.14 + void (*func)(const char*, void*); 1.15 + void *func_cls; 1.16 +}; 1.17 + 1.18 +static void logmsg(LogTarget &out, const char *msg); 1.19 + 1.20 +static LogTarget def_log_target = { LogTarget::LOG_TYPE_STREAM, stderr, 0, 0 }; 1.21 +static std::list<LogTarget> targets; 1.22 + 1.23 +void set_log_file(FILE *fp) 1.24 +{ 1.25 + LogTarget targ; 1.26 + memset(&targ, 0, sizeof targ); 1.27 + targ.type = LogTarget::LOG_TYPE_STREAM; 1.28 + targ.fp = fp; 1.29 + targets.push_back(targ); 1.30 +} 1.31 + 1.32 +void set_log_callback(void (*cb)(const char*, void*), void *cls) 1.33 +{ 1.34 + LogTarget targ; 1.35 + memset(&targ, 0, sizeof targ); 1.36 + targ.type = LogTarget::LOG_TYPE_CALLBACK; 1.37 + targ.func = cb; 1.38 + targ.func_cls = cls; 1.39 + targets.push_back(targ); 1.40 +} 1.41 + 1.42 +void log_message(const char *fmt, ...) 1.43 +{ 1.44 + static char buf[512]; 1.45 + 1.46 + va_list ap; 1.47 + va_start(ap, fmt); 1.48 + vsnprintf(buf, sizeof buf, fmt, ap); 1.49 + va_end(ap); 1.50 + 1.51 + if(targets.empty()) { 1.52 + logmsg(def_log_target, buf); 1.53 + } else { 1.54 + std::list<LogTarget>::iterator it = targets.begin(); 1.55 + while(it != targets.end()) { 1.56 + logmsg(*it++, buf); 1.57 + } 1.58 + } 1.59 +} 1.60 + 1.61 + 1.62 +static void logmsg(LogTarget &out, const char *msg) 1.63 +{ 1.64 + switch(out.type) { 1.65 + case LogTarget::LOG_TYPE_STREAM: 1.66 + fputs(msg, out.fp); 1.67 + fflush(out.fp); 1.68 + break; 1.69 + 1.70 + case LogTarget::LOG_TYPE_CALLBACK: 1.71 + out.func(msg, out.func_cls); 1.72 + break; 1.73 + 1.74 + default: 1.75 + break; 1.76 + } 1.77 +}