diff options
Diffstat (limited to 'src/Common/Logger.cpp')
-rw-r--r-- | src/Common/Logger.cpp | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/src/Common/Logger.cpp b/src/Common/Logger.cpp index e479979..22748d1 100644 --- a/src/Common/Logger.cpp +++ b/src/Common/Logger.cpp @@ -18,12 +18,42 @@ */ #include "Logger.h" +#include <cstdlib> namespace Mad { namespace Common { std::list<Logger*> Logger::loggers; + +void Logger::logfv(MessageLevel level, const char *format, va_list ap) { + int size = 100; + char *buf = (char*)std::malloc(size); + + // If buffer is too small, try again with bigger buffer + while(true) { + va_list ap2; + + va_copy(ap2, ap); + int n = std::vsnprintf(buf, size, format, ap2); + va_end(ap2); + + if(n > -1 && n < size) { + log(level, buf); + std::free(buf); + return; + } + + if(n > -1) + size = n+1; + else + size *= 2; + + buf = (char*)std::realloc(buf, size); + } + +} + void Logger::log(MessageLevel level, const std::string &message) { for(std::list<Logger*>::iterator logger = loggers.begin(); logger != loggers.end(); ++logger) { if((*logger)->getLevel() >= level) @@ -31,5 +61,21 @@ void Logger::log(MessageLevel level, const std::string &message) { } } +void Logger::logf(MessageLevel level, const char *format, ...) { + va_list ap; + + va_start(ap, format); + logfv(level, format, ap); + va_end(ap); +} + +void Logger::logf(const char *format, ...) { + va_list ap; + + va_start(ap, format); + logfv(DEFAULT, format, ap); + va_end(ap); +} + } } |