olaf@57: #include "logging.h" olaf@57: #include universe@80: #include universe@81: #include olaf@57: universe@80: UcxLogger *ucx_logger_new(FILE *stream, unsigned int level, unsigned int mask) { olaf@57: UcxLogger *logger = (UcxLogger*) malloc(sizeof(UcxLogger)); olaf@57: if (logger != NULL) { olaf@57: logger->stream = stream; universe@81: logger->writer = fwrite; olaf@57: logger->level = level; universe@80: logger->mask = mask; universe@80: logger->levels = ucx_map_new(8); universe@80: universe@80: unsigned int l; universe@80: l = UCX_LOGGER_ERROR; universe@80: ucx_map_int_put(logger->levels, l, "[ERROR]"); universe@80: l = UCX_LOGGER_WARN; universe@80: ucx_map_int_put(logger->levels, l, "[WARNING]"); universe@80: l = UCX_LOGGER_INFO; universe@80: ucx_map_int_put(logger->levels, l, "[INFO]"); universe@80: l = UCX_LOGGER_TRACE; universe@80: ucx_map_int_put(logger->levels, l, "[TRACE]"); olaf@57: } olaf@57: olaf@57: return logger; olaf@57: } olaf@57: universe@80: void ucx_logger_free(UcxLogger *logger) { universe@80: ucx_map_free(logger->levels); universe@80: free(logger); universe@80: } universe@80: universe@81: void ucx_logger_setoutput(UcxLogger *logger, FILE *stream, universe@81: size_t(*writer)(const void*,size_t,size_t,FILE*)) { universe@81: if (stream) { universe@81: logger->stream = stream; universe@81: } universe@81: if (writer) { universe@81: logger->writer = writer; universe@81: } universe@81: } universe@81: universe@81: void ucx_logger_logf(UcxLogger *logger, unsigned int level, const char* file, universe@81: const unsigned int line, const char *format, ...) { olaf@57: if (level <= logger->level) { universe@81: const size_t max = 4096; // estimated maximum message length universe@81: char msg[max]; universe@81: char *text; universe@81: size_t k = 0; universe@81: size_t n; universe@80: universe@80: if ((logger->mask & UCX_LOGGER_LEVEL) > 0) { universe@81: text = (char*) ucx_map_int_get(logger->levels, level); universe@81: n = strlen(text); universe@81: memcpy(msg+k, text, n); universe@81: k += n; universe@81: msg[k++] = ' '; universe@80: } universe@80: // TODO: timestamp universe@80: if ((logger->mask & UCX_LOGGER_SOURCE) > 0) { universe@81: n = strlen(file); universe@81: memcpy(msg+k, file, n); universe@81: k += n; universe@81: k += sprintf(msg+k, ":%d ", line); universe@80: } universe@80: universe@81: msg[k++] = '-'; msg[k++] = ' '; universe@81: universe@81: va_list args; universe@81: va_start (args, format); universe@81: k += vsnprintf(msg+k, max-k-1, format, args); universe@81: va_end (args); universe@81: universe@80: msg[k++] = '\n'; universe@80: universe@81: logger->writer(msg, 1, k, logger->stream); olaf@57: fflush(logger->stream); olaf@57: } olaf@57: }