qnetdice

annotate 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
rev   line source
nuclear@1 1 #include <stdio.h>
nuclear@1 2 #include <stdlib.h>
nuclear@1 3 #include <string.h>
nuclear@1 4 #include <stdarg.h>
nuclear@1 5 #include <list>
nuclear@1 6 #include "logger.h"
nuclear@1 7
nuclear@1 8 struct LogTarget {
nuclear@1 9 enum LogTargetType { LOG_TYPE_STREAM, LOG_TYPE_CALLBACK } type;
nuclear@1 10 FILE *fp;
nuclear@1 11 void (*func)(const char*, void*);
nuclear@1 12 void *func_cls;
nuclear@1 13 };
nuclear@1 14
nuclear@1 15 static void logmsg(LogTarget &out, const char *msg);
nuclear@1 16
nuclear@1 17 static LogTarget def_log_target = { LogTarget::LOG_TYPE_STREAM, stderr, 0, 0 };
nuclear@1 18 static std::list<LogTarget> targets;
nuclear@1 19
nuclear@1 20 void set_log_file(FILE *fp)
nuclear@1 21 {
nuclear@1 22 LogTarget targ;
nuclear@1 23 memset(&targ, 0, sizeof targ);
nuclear@1 24 targ.type = LogTarget::LOG_TYPE_STREAM;
nuclear@1 25 targ.fp = fp;
nuclear@1 26 targets.push_back(targ);
nuclear@1 27 }
nuclear@1 28
nuclear@1 29 void set_log_callback(void (*cb)(const char*, void*), void *cls)
nuclear@1 30 {
nuclear@1 31 LogTarget targ;
nuclear@1 32 memset(&targ, 0, sizeof targ);
nuclear@1 33 targ.type = LogTarget::LOG_TYPE_CALLBACK;
nuclear@1 34 targ.func = cb;
nuclear@1 35 targ.func_cls = cls;
nuclear@1 36 targets.push_back(targ);
nuclear@1 37 }
nuclear@1 38
nuclear@1 39 void log_message(const char *fmt, ...)
nuclear@1 40 {
nuclear@1 41 static char buf[512];
nuclear@1 42
nuclear@1 43 va_list ap;
nuclear@1 44 va_start(ap, fmt);
nuclear@1 45 vsnprintf(buf, sizeof buf, fmt, ap);
nuclear@1 46 va_end(ap);
nuclear@1 47
nuclear@1 48 if(targets.empty()) {
nuclear@1 49 logmsg(def_log_target, buf);
nuclear@1 50 } else {
nuclear@1 51 std::list<LogTarget>::iterator it = targets.begin();
nuclear@1 52 while(it != targets.end()) {
nuclear@1 53 logmsg(*it++, buf);
nuclear@1 54 }
nuclear@1 55 }
nuclear@1 56 }
nuclear@1 57
nuclear@1 58
nuclear@1 59 static void logmsg(LogTarget &out, const char *msg)
nuclear@1 60 {
nuclear@1 61 switch(out.type) {
nuclear@1 62 case LogTarget::LOG_TYPE_STREAM:
nuclear@1 63 fputs(msg, out.fp);
nuclear@1 64 fflush(out.fp);
nuclear@1 65 break;
nuclear@1 66
nuclear@1 67 case LogTarget::LOG_TYPE_CALLBACK:
nuclear@1 68 out.func(msg, out.func_cls);
nuclear@1 69 break;
nuclear@1 70
nuclear@1 71 default:
nuclear@1 72 break;
nuclear@1 73 }
nuclear@1 74 }