/****************************************************************************** * * Copyright (c) 2017-2019 by Löwenware Ltd * Please, refer LICENSE file for legal information * ******************************************************************************/ /** * @file log.c * @author Ilja Kartašov * @brief cStuff log module source file * * @see https://lowenware.com/ */ #include #include "log.h" void cstuff_log_init(CStuffLog self, uint8_t level) { self->target = stderr; self->level = level; } void cstuff_log_release(CStuffLog self) { if (self->target != stderr) fclose(self->target); } CStuffRetcode cstuff_log_set_file(CStuffLog self, const char *filename) { FILE *fp; if (!(fp = fopen(filename, "a"))) return CSTUFF_SYSCALL_ERROR; self->target = fp; return CSTUFF_SUCCESS; } int cstuff_log_printf(CStuffLog self, int level, const char *format, ...) { int result; va_list vl; va_start(vl, format); result = cstuff_log_vprintf(self, level, format, vl); va_end(vl); return result; } int cstuff_log_vprintf(CStuffLog self, int level, const char *format, va_list vl) { int result; if (self->level & level) { FILE *f = self->target; char *label; time_t rawtime; char strtime[32+1]; struct tm timeinfo; time(&rawtime); localtime_r(&rawtime, &timeinfo); strftime(strtime, 32, "%F %T", &timeinfo); switch (level) { case CSTUFF_LOG_ERROR: label = "!!"; break; case CSTUFF_LOG_ALERT: label = "~!"; break; case CSTUFF_LOG_DEBUG: label = "**"; break; default: label = "--"; } result = fprintf(f, "%s %s ", strtime, label); result += vfprintf(f, format, vl); fputc('\n', f); result++; fflush(f); } else { result = 0; } return result; }