Wed, 27 Feb 2013 13:30:21 +0100
added gnu++11 support
1 #include "logging.h"
2 #include <stdlib.h>
3 #include <string.h>
4 #include <stdarg.h>
5 #include <time.h>
7 UcxLogger *ucx_logger_new(void *stream, unsigned int level, unsigned int mask) {
8 UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger));
9 if (logger != NULL) {
10 logger->stream = stream;
11 logger->writer = (write_func)fwrite;
12 logger->dateformat = (char*) "%F %T %z ";
13 logger->level = level;
14 logger->mask = mask;
15 logger->levels = ucx_map_new(8);
17 unsigned int l;
18 l = UCX_LOGGER_ERROR;
19 ucx_map_int_put(logger->levels, l, (void*) "[ERROR]");
20 l = UCX_LOGGER_WARN;
21 ucx_map_int_put(logger->levels, l, (void*) "[WARNING]");
22 l = UCX_LOGGER_INFO;
23 ucx_map_int_put(logger->levels, l, (void*) "[INFO]");
24 l = UCX_LOGGER_TRACE;
25 ucx_map_int_put(logger->levels, l, (void*) "[TRACE]");
26 }
28 return logger;
29 }
31 void ucx_logger_free(UcxLogger *logger) {
32 ucx_map_free(logger->levels);
33 free(logger);
34 }
36 void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file,
37 const unsigned int line, const char *format, ...) {
38 if (level <= logger->level) {
39 const size_t max = 4096; // estimated maximum message length
40 char msg[max];
41 char *text;
42 size_t k = 0;
43 size_t n;
45 if ((logger->mask & UCX_LOGGER_LEVEL) > 0) {
46 text = (char*) ucx_map_int_get(logger->levels, level);
47 n = strlen(text);
48 memcpy(msg+k, text, n);
49 k += n;
50 msg[k++] = ' ';
51 }
52 if ((logger->mask & UCX_LOGGER_TIMESTAMP) > 0) {
53 time_t now = time(NULL);
54 k += strftime(msg+k, 128, logger->dateformat, localtime(&now));
55 }
56 if ((logger->mask & UCX_LOGGER_SOURCE) > 0) {
57 n = strlen(file);
58 memcpy(msg+k, file, n);
59 k += n;
60 k += sprintf(msg+k, ":%d ", line);
61 }
63 msg[k++] = '-'; msg[k++] = ' ';
65 va_list args;
66 va_start (args, format);
67 k += vsnprintf(msg+k, max-k-1, format, args);
68 va_end (args);
70 msg[k++] = '\n';
72 logger->writer(msg, 1, k, logger->stream);
73 }
74 }