From c85c6cc819eebc19ff9118f4182ff0f6ed7e39e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ilja=20Karta=C5=A1ov?= Date: Wed, 19 Jun 2019 21:04:14 +0200 Subject: [PATCH] Add log module --- log.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ log.h | 58 +++++++++++++++++++++++++++++++++ 2 files changed, 161 insertions(+) create mode 100644 log.c create mode 100644 log.h diff --git a/log.c b/log.c new file mode 100644 index 0000000..9de26fb --- /dev/null +++ b/log.c @@ -0,0 +1,103 @@ +/****************************************************************************** + * + * 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; +} diff --git a/log.h b/log.h new file mode 100644 index 0000000..d2b686c --- /dev/null +++ b/log.h @@ -0,0 +1,58 @@ +/****************************************************************************** + * + * Copyright (c) 2017-2019 by Löwenware Ltd + * Please, refer LICENSE file for legal information + * + ******************************************************************************/ + +/** + * @file log.h + * @author Ilja Kartašov + * @brief cStuff log module header file + * + * @see https://lowenware.com/cStuff/ + */ + +#ifndef CSTUFF_LOG_H_557ADEFE_2BE8_4B9B_A894_F08FF64008EF +#define CSTUFF_LOG_H_557ADEFE_2BE8_4B9B_A894_F08FF64008EF + +#include +#include +#include +#include "retcode.h" + +#define CSTUFF_LOG_OFF (0) +#define CSTUFF_LOG_ERROR (1<<0) +#define CSTUFF_LOG_ALERT (1<<1) +#define CSTUFF_LOG_STATE (1<<2) +#define CSTUFF_LOG_DEBUG (1<<3) +#define CSTUFF_LOG_ALL (0xFF) + +struct cstuff_log { + FILE *target; + uint8_t level; +}; + +typedef struct cstuff_log * CStuffLog; + + +void +cstuff_log_init(CStuffLog self, int level); + + +void +cstuff_log_release(CStuffLog self); + + +CStuffRetcode +cstuff_log_set_file(CStuffLog self, const char *filename); + + +int +cstuff_log_printf(CStuffLog self, int level, const char *format, ...); + + +int +cstuff_log_vprintf(CStuffLog self, int level, const char *format, va_list vl); + +#endif /* !CSTUFF_LOG_H */