olaf@57: #include "logging.h" olaf@57: #include universe@80: #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; 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@67: void ucx_logger_log(UcxLogger *logger, unsigned int level, universe@80: const sstr_t message, const char* file, const unsigned int line) { olaf@57: if (level <= logger->level) { universe@80: size_t n = message.length; universe@80: if ((logger->mask & UCX_LOGGER_SOURCE) > 0) { universe@80: n += strlen(file); universe@80: n += 10; // line universe@80: } universe@80: // TODO: add k bytes for timestamp universe@80: n += 16; // extra space for fill characters (:, -, etc.) universe@80: universe@80: char msg[n]; universe@80: off_t k = 0; universe@80: universe@80: if ((logger->mask & UCX_LOGGER_LEVEL) > 0) { universe@80: k += sprintf(msg+k, "%s ", (char*) universe@80: ucx_map_int_get(logger->levels, level)); universe@80: } universe@80: // TODO: timestamp universe@80: if ((logger->mask & UCX_LOGGER_SOURCE) > 0) { universe@80: k += sprintf(msg+k, "%s:%d ", file, line); universe@80: } universe@80: universe@80: msg[k++] = '-'; msg[k++] = ' '; msg[k] = 0; universe@80: strncat(msg, message.ptr, message.length); universe@80: k += message.length; universe@80: msg[k++] = '\n'; universe@80: universe@80: fwrite(msg, 1, k, logger->stream); olaf@57: fflush(logger->stream); olaf@57: } olaf@57: }