/****************************************************************************** * * 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(cstuff_log_t self, uint8_t level) { self->target = stderr; self->level = level; } void cstuff_log_release(cstuff_log_t self) { if (self->target != stderr) fclose(self->target); } cstuff_retcode_t cstuff_log_set_file(cstuff_log_t 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(cstuff_log_t self, uint8_t 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(cstuff_log_t self, uint8_t 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; }