qnetdice
annotate src/logger.cc @ 2:ad12da657c00
removed the unused dice dialog
author | John Tsiombikas <nuclear@member.fsf.org> |
---|---|
date | Sun, 22 Dec 2013 04:09:23 +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 } |