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 +}