libsheepy

C lib for handling text files, strings and json like data structure with an object oriented system
git clone https://spartatek.se/git/libsheepy.git
Log | Files | Refs | README | LICENSE

commit 15e355a619af3cd8c511e81c757360503dea4f7b
parent 0d7a8b4334b148c8eb29d08cb759fa6469727912
Author: Remy Noulin <loader2x@gmail.com>
Date:   Tue, 14 Jul 2020 21:47:54 +0200

add log levels: emergency, alert, notice and debug

release/libsheepy.c   |  64 ++++++++++++------
release/libsheepy.h   | 183 +++++++++++++++++++++++++++++++++++++-------------
src/libsheepy.c       |  64 ++++++++++++------
src/libsheepy.h       | 183 +++++++++++++++++++++++++++++++++++++-------------
src/libsheepyCuTest.c |  54 ++++++++++++---
src/libsheepyTest.c   |  54 ++++++++++++---
6 files changed, 448 insertions(+), 154 deletions(-)

Diffstat:
Mrelease/libsheepy.c | 64++++++++++++++++++++++++++++++++++++++++++----------------------
Mrelease/libsheepy.h | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/libsheepy.c | 64++++++++++++++++++++++++++++++++++++++++++----------------------
Msrc/libsheepy.h | 183+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--------------------
Msrc/libsheepyCuTest.c | 54+++++++++++++++++++++++++++++++++++++++++++++---------
Msrc/libsheepyTest.c | 54+++++++++++++++++++++++++++++++++++++++++++++---------
6 files changed, 448 insertions(+), 154 deletions(-)

diff --git a/release/libsheepy.c b/release/libsheepy.c @@ -47,13 +47,17 @@ typedef enum { LOCALE_NORMAL, LOCALE_TURKIC, LOCALE_LITHUANIAN } localeType; #include <ctype.h> #include <sys/time.h> #include <stdio.h> +#if (!(__OpenBSD__ || __HAIKU__)) #include <ucontext.h> +#endif #include <libgen.h> #include <inttypes.h> #include <dirent.h> #include <stdarg.h> #include <errno.h> +#if (!(__OpenBSD__ || __HAIKU__)) #include <wordexp.h> +#endif #include <stdbool.h> #include <string.h> #include <stdlib.h> @@ -915,7 +919,7 @@ static bool _logToStdout = true; // logging file 0 is stdout static uint16_t _current_log_file = 1; -static const char *log_tags[LOG_INVALID_MODE][LOG_INVALID+1] = { { "[CRITICAL] ", "[ERROR] ", "[WARNING] ", "[PASS] ", "[INFO] ", "[INVALID LOG LEVEL] "}, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "", "", "", "", "", "" }, { "[⛔]", "[✖ ]", "[⚠ ]", "[✔ ]", "[ℹ ]", "[☁ ]" }}; +static const char *log_tags[LOG_INVALID_MODE][LOG_INVALID+1] = {{"[EMERGENCY] ","[ALERT] ","[CRITICAL] ","[ERROR] ","[WARNING] ","[NOTICE] ","[PASS] ","[INFO] ","[DEBUG] ","[INVALID LOG LEVEL] "},{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{ "", "", "", "", "", "", "", "", "", "" },{ "[⛔]","[⛔]","[⛔]", "[✖ ]", "[⚠ ]", "[ℹ ]", "[✔ ]", "[ℹ ]", "[☁ ]", "[~~]" }}; // static const char *LOG_DATE_FORMAT[LOG_INVALID_MODE] = { "%c\n", "CONCISE HAS NO DATE", "%y-%m-%d %H:%M:%S", "FUNC", "PROG", "%y-%m-%d %H:%M:%S", "VOID"}; @@ -1132,7 +1136,7 @@ void _pLog(int loglevel, const char *file, const char *func, int line, const cha char buffer[lenS(msg) + MAX_MSG_LEN]; if (_current_log_file == 1 && !_logToStdout) { - // log to stdout is disable and there are no log files + // log to stdout is disabled and there are no log files return; } @@ -1170,25 +1174,39 @@ void _pLog(int loglevel, const char *file, const char *func, int line, const cha } // set console color for printing the tag - switch (loglevel) { - case LOG_CRITICAL: - printf(BLD RED); - break; - case LOG_ERROR: - printf(RED); - break; - case LOG_WARNING: - printf(YLW); - break; - case LOG_INFO: - printf(BLU); - break; - case LOG_PASS: - printf(BLD GRN); - break; - case LOG_INVALID: - printf(MGT); - break; + if (_logToStdout) { + switch (loglevel) { + case LOG_EMERGENCY: + printf(BLD RED); + break; + case LOG_ALERT: + printf(BLD RED); + break; + case LOG_CRITICAL: + printf(BLD RED); + break; + case LOG_ERROR: + printf(RED); + break; + case LOG_WARNING: + printf(YLW); + break; + case LOG_NOTICE: + printf(BLU); + break; + case LOG_PASS: + printf(BLD GRN); + break; + case LOG_INFO: + printf(BLU); + break; + case LOG_DEBUG: + printf(BLD CYN); + break; + case LOG_INVALID: + printf(MGT); + break; + } } // long or short file path in VERBOSE mode @@ -1238,7 +1256,9 @@ void _pLog(int loglevel, const char *file, const char *func, int line, const cha fprintf(_logging_files[i], "%s", log_tags[tagSymbols][loglevel]); } - printf(RST); + if (_logToStdout) { + printf(RST); + } /* logVar(_log_current_mode, "d"); */ /* puts(log_tags[_log_current_mode][loglevel]); */ diff --git a/release/libsheepy.h b/release/libsheepy.h @@ -850,30 +850,25 @@ uint64_t shStopwatch(uint8_t op); /** * LOG LEVELS - * TODO: - * add levels: - * EMERGENCY - * ALERT - * CRITICAL - * ERROR - * WARNING - * NOTICE - * PASS - * INFO - * DEBUG - */ -#define LOG_CRITICAL 0 -#define LOG_ERROR 1 + * Note: When adding log levels or modes, the log_tags array in libsheepy.c + * must be updated. + */ +#define LOG_EMERGENCY 0 +#define LOG_ALERT 1 +#define LOG_CRITICAL 2 +#define LOG_ERROR 3 #ifdef LOG_WARNING #undef LOG_WARNING // conflict with syslog.h #endif -#define LOG_WARNING 2 +#define LOG_WARNING 4 +#define LOG_NOTICE 5 +#define LOG_PASS 6 #ifdef LOG_INFO #undef LOG_INFO // conflict with syslog.h #endif -#define LOG_PASS 3 -#define LOG_INFO 4 -#define LOG_INVALID 5 +#define LOG_INFO 7 +#define LOG_DEBUG 8 +#define LOG_INVALID 9 #define LOG_MAX_LEVEL LOG_INVALID /** getMaxLogLevel and setMaxLogLevel value disabling all logs */ @@ -984,42 +979,46 @@ bool openProgLogFile(void); void _pLog(int, const char *, const char *, int, const char *, ...); +#define logY(...) pLog(LOG_EMERGENCY, __VA_ARGS__) +#define logA(...) pLog(LOG_ALERT, __VA_ARGS__) +#define logC(...) pLog(LOG_CRITICAL, __VA_ARGS__) +#define logE(...) pLog(LOG_ERROR, __VA_ARGS__) +#define logW(...) pLog(LOG_WARNING, __VA_ARGS__) +#define logN(...) pLog(LOG_NOTICE, __VA_ARGS__) #define logP(...) pLog(LOG_PASS, __VA_ARGS__) #define logI(...) pLog(LOG_INFO, __VA_ARGS__) -#define logW(...) pLog(LOG_WARNING, __VA_ARGS__) -#define logE(...) pLog(LOG_ERROR, __VA_ARGS__) -#define logC(...) pLog(LOG_CRITICAL, __VA_ARGS__) +#define logD(...) pLog(LOG_DEBUG, __VA_ARGS__) /** * log string and free * Example: - * logSP("The list: %s", catS("1", "2")); + * logSY("The list: %s", catS("1", "2")); */ -#define logSP(format, string) do {\ +#define logSY(format, string) do {\ char *libsheepyInternalString = string;\ - logP(format, libsheepyInternalString);\ + logY(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) /** * log string and free * Example: - * logSI("The list: %s", catS("1", "2")); + * logSA("The list: %s", catS("1", "2")); */ -#define logSI(format, string) do {\ +#define logSA(format, string) do {\ char *libsheepyInternalString = string;\ - logI(format, libsheepyInternalString);\ + logA(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) /** * log string and free * Example: - * logSW("The list: %s", catS("1", "2")); + * logSC("The list: %s", catS("1", "2")); */ -#define logSW(format, string) do {\ +#define logSC(format, string) do {\ char *libsheepyInternalString = string;\ - logW(format, libsheepyInternalString);\ + logC(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1037,11 +1036,55 @@ void _pLog(int, const char *, const char *, int, const char *, ...); /** * log string and free * Example: - * logSC("The list: %s", catS("1", "2")); + * logSW("The list: %s", catS("1", "2")); */ -#define logSC(format, string) do {\ +#define logSW(format, string) do {\ char *libsheepyInternalString = string;\ - logC(format, libsheepyInternalString);\ + logW(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSN("The list: %s", catS("1", "2")); + */ +#define logSN(format, string) do {\ + char *libsheepyInternalString = string;\ + logN(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSP("The list: %s", catS("1", "2")); + */ +#define logSP(format, string) do {\ + char *libsheepyInternalString = string;\ + logP(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSI("The list: %s", catS("1", "2")); + */ +#define logSI(format, string) do {\ + char *libsheepyInternalString = string;\ + logI(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSD("The list: %s", catS("1", "2")); + */ +#define logSD(format, string) do {\ + char *libsheepyInternalString = string;\ + logD(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1081,11 +1124,15 @@ extern uint64_t logMask; */ #define pLogMask(mask, level, ...) if ((mask) & logMask) pLog(level, __VA_ARGS__) +#define logMY(mask, ...) pLogMask(mask, LOG_EMERGENCY, __VA_ARGS__) +#define logMA(mask, ...) pLogMask(mask, LOG_ALERT, __VA_ARGS__) +#define logMC(mask, ...) pLogMask(mask, LOG_CRITICAL, __VA_ARGS__) +#define logME(mask, ...) pLogMask(mask, LOG_ERROR, __VA_ARGS__) +#define logMW(mask, ...) pLogMask(mask, LOG_WARNING, __VA_ARGS__) +#define logMN(mask, ...) pLogMask(mask, LOG_NOTICE, __VA_ARGS__) #define logMP(mask, ...) pLogMask(mask, LOG_PASS, __VA_ARGS__) #define logMI(mask, ...) pLogMask(mask, LOG_INFO, __VA_ARGS__) -#define logMW(mask, ...) pLogMask(mask, LOG_WARNING, __VA_ARGS__) -#define logME(mask, ...) pLogMask(mask, LOG_ERROR, __VA_ARGS__) -#define logMC(mask, ...) pLogMask(mask, LOG_CRITICAL, __VA_ARGS__) +#define logMD(mask, ...) pLogMask(mask, LOG_DEBUG, __VA_ARGS__) // show log messages in mask #define showLogsInMask(mask) logMask |= mask @@ -1096,11 +1143,22 @@ extern uint64_t logMask; /** * log and mask string and then free * Example: - * logSMP("The list: %s", catS("1", "2")); + * logSMY("The list: %s", catS("1", "2")); */ -#define logSMP(mask, format, string) do {\ +#define logSMY(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logMP(mask, format, libsheepyInternalString);\ + logMY(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSMA("The list: %s", catS("1", "2")); + */ +#define logSMA(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logMA(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1109,9 +1167,20 @@ extern uint64_t logMask; * Example: * logSMI("The list: %s", catS("1", "2")); */ -#define logSMI(mask, format, string) do {\ +#define logSMC(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logMI(mask, format, libsheepyInternalString);\ + logMC(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSME("The list: %s", catS("1", "2")); + */ +#define logSME(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logME(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1129,11 +1198,22 @@ extern uint64_t logMask; /** * log and mask string and then free * Example: - * logSME("The list: %s", catS("1", "2")); + * logSMN("The list: %s", catS("1", "2")); */ -#define logSME(mask, format, string) do {\ +#define logSMN(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logME(mask, format, libsheepyInternalString);\ + logMN(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSMP("The list: %s", catS("1", "2")); + */ +#define logSMP(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logMP(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1142,9 +1222,20 @@ extern uint64_t logMask; * Example: * logSMI("The list: %s", catS("1", "2")); */ -#define logSMC(mask, format, string) do {\ +#define logSMI(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logMC(mask, format, libsheepyInternalString);\ + logMI(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSMD("The list: %s", catS("1", "2")); + */ +#define logSMD(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logMD(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) diff --git a/src/libsheepy.c b/src/libsheepy.c @@ -47,13 +47,17 @@ typedef enum { LOCALE_NORMAL, LOCALE_TURKIC, LOCALE_LITHUANIAN } localeType; #include <ctype.h> #include <sys/time.h> #include <stdio.h> +#if (!(__OpenBSD__ || __HAIKU__)) #include <ucontext.h> +#endif #include <libgen.h> #include <inttypes.h> #include <dirent.h> #include <stdarg.h> #include <errno.h> +#if (!(__OpenBSD__ || __HAIKU__)) #include <wordexp.h> +#endif #include <stdbool.h> #include <string.h> #include <stdlib.h> @@ -971,7 +975,7 @@ static bool _logToStdout = true; // logging file 0 is stdout static uint16_t _current_log_file = 1; -static const char *log_tags[LOG_INVALID_MODE][LOG_INVALID+1] = { { "[CRITICAL] ", "[ERROR] ", "[WARNING] ", "[PASS] ", "[INFO] ", "[INVALID LOG LEVEL] "}, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "[!] ", "[*] ", "[-] ", "[>] ", "[+] ", "[~] " }, { "", "", "", "", "", "" }, { "[⛔]", "[✖ ]", "[⚠ ]", "[✔ ]", "[ℹ ]", "[☁ ]" }}; +static const char *log_tags[LOG_INVALID_MODE][LOG_INVALID+1] = {{"[EMERGENCY] ","[ALERT] ","[CRITICAL] ","[ERROR] ","[WARNING] ","[NOTICE] ","[PASS] ","[INFO] ","[DEBUG] ","[INVALID LOG LEVEL] "},{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{"[_] ", "[_] ", "[!] ", "[*] ", "[-] ", "[#] ", "[>] ", "[+] ", "[$] ", "[~] " },{ "", "", "", "", "", "", "", "", "", "" },{ "[⛔]","[⛔]","[⛔]", "[✖ ]", "[⚠ ]", "[ℹ ]", "[✔ ]", "[ℹ ]", "[☁ ]", "[~~]" }}; // static const char *LOG_DATE_FORMAT[LOG_INVALID_MODE] = { "%c\n", "CONCISE HAS NO DATE", "%y-%m-%d %H:%M:%S", "FUNC", "PROG", "%y-%m-%d %H:%M:%S", "VOID"}; @@ -1188,7 +1192,7 @@ void _pLog(int loglevel, const char *file, const char *func, int line, const cha char buffer[lenS(msg) + MAX_MSG_LEN]; if (_current_log_file == 1 && !_logToStdout) { - // log to stdout is disable and there are no log files + // log to stdout is disabled and there are no log files return; } @@ -1226,25 +1230,39 @@ void _pLog(int loglevel, const char *file, const char *func, int line, const cha } // set console color for printing the tag - switch (loglevel) { - case LOG_CRITICAL: - printf(BLD RED); - break; - case LOG_ERROR: - printf(RED); - break; - case LOG_WARNING: - printf(YLW); - break; - case LOG_INFO: - printf(BLU); - break; - case LOG_PASS: - printf(BLD GRN); - break; - case LOG_INVALID: - printf(MGT); - break; + if (_logToStdout) { + switch (loglevel) { + case LOG_EMERGENCY: + printf(BLD RED); + break; + case LOG_ALERT: + printf(BLD RED); + break; + case LOG_CRITICAL: + printf(BLD RED); + break; + case LOG_ERROR: + printf(RED); + break; + case LOG_WARNING: + printf(YLW); + break; + case LOG_NOTICE: + printf(BLU); + break; + case LOG_PASS: + printf(BLD GRN); + break; + case LOG_INFO: + printf(BLU); + break; + case LOG_DEBUG: + printf(BLD CYN); + break; + case LOG_INVALID: + printf(MGT); + break; + } } // long or short file path in VERBOSE mode @@ -1294,7 +1312,9 @@ void _pLog(int loglevel, const char *file, const char *func, int line, const cha fprintf(_logging_files[i], "%s", log_tags[tagSymbols][loglevel]); } - printf(RST); + if (_logToStdout) { + printf(RST); + } /* logVar(_log_current_mode, "d"); */ /* puts(log_tags[_log_current_mode][loglevel]); */ diff --git a/src/libsheepy.h b/src/libsheepy.h @@ -850,30 +850,25 @@ uint64_t shStopwatch(uint8_t op); /** * LOG LEVELS - * TODO: - * add levels: - * EMERGENCY - * ALERT - * CRITICAL - * ERROR - * WARNING - * NOTICE - * PASS - * INFO - * DEBUG - */ -#define LOG_CRITICAL 0 -#define LOG_ERROR 1 + * Note: When adding log levels or modes, the log_tags array in libsheepy.c + * must be updated. + */ +#define LOG_EMERGENCY 0 +#define LOG_ALERT 1 +#define LOG_CRITICAL 2 +#define LOG_ERROR 3 #ifdef LOG_WARNING #undef LOG_WARNING // conflict with syslog.h #endif -#define LOG_WARNING 2 +#define LOG_WARNING 4 +#define LOG_NOTICE 5 +#define LOG_PASS 6 #ifdef LOG_INFO #undef LOG_INFO // conflict with syslog.h #endif -#define LOG_PASS 3 -#define LOG_INFO 4 -#define LOG_INVALID 5 +#define LOG_INFO 7 +#define LOG_DEBUG 8 +#define LOG_INVALID 9 #define LOG_MAX_LEVEL LOG_INVALID /** getMaxLogLevel and setMaxLogLevel value disabling all logs */ @@ -984,42 +979,46 @@ bool openProgLogFile(void); void _pLog(int, const char *, const char *, int, const char *, ...); +#define logY(...) pLog(LOG_EMERGENCY, __VA_ARGS__) +#define logA(...) pLog(LOG_ALERT, __VA_ARGS__) +#define logC(...) pLog(LOG_CRITICAL, __VA_ARGS__) +#define logE(...) pLog(LOG_ERROR, __VA_ARGS__) +#define logW(...) pLog(LOG_WARNING, __VA_ARGS__) +#define logN(...) pLog(LOG_NOTICE, __VA_ARGS__) #define logP(...) pLog(LOG_PASS, __VA_ARGS__) #define logI(...) pLog(LOG_INFO, __VA_ARGS__) -#define logW(...) pLog(LOG_WARNING, __VA_ARGS__) -#define logE(...) pLog(LOG_ERROR, __VA_ARGS__) -#define logC(...) pLog(LOG_CRITICAL, __VA_ARGS__) +#define logD(...) pLog(LOG_DEBUG, __VA_ARGS__) /** * log string and free * Example: - * logSP("The list: %s", catS("1", "2")); + * logSY("The list: %s", catS("1", "2")); */ -#define logSP(format, string) do {\ +#define logSY(format, string) do {\ char *libsheepyInternalString = string;\ - logP(format, libsheepyInternalString);\ + logY(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) /** * log string and free * Example: - * logSI("The list: %s", catS("1", "2")); + * logSA("The list: %s", catS("1", "2")); */ -#define logSI(format, string) do {\ +#define logSA(format, string) do {\ char *libsheepyInternalString = string;\ - logI(format, libsheepyInternalString);\ + logA(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) /** * log string and free * Example: - * logSW("The list: %s", catS("1", "2")); + * logSC("The list: %s", catS("1", "2")); */ -#define logSW(format, string) do {\ +#define logSC(format, string) do {\ char *libsheepyInternalString = string;\ - logW(format, libsheepyInternalString);\ + logC(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1037,11 +1036,55 @@ void _pLog(int, const char *, const char *, int, const char *, ...); /** * log string and free * Example: - * logSC("The list: %s", catS("1", "2")); + * logSW("The list: %s", catS("1", "2")); */ -#define logSC(format, string) do {\ +#define logSW(format, string) do {\ char *libsheepyInternalString = string;\ - logC(format, libsheepyInternalString);\ + logW(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSN("The list: %s", catS("1", "2")); + */ +#define logSN(format, string) do {\ + char *libsheepyInternalString = string;\ + logN(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSP("The list: %s", catS("1", "2")); + */ +#define logSP(format, string) do {\ + char *libsheepyInternalString = string;\ + logP(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSI("The list: %s", catS("1", "2")); + */ +#define logSI(format, string) do {\ + char *libsheepyInternalString = string;\ + logI(format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log string and free + * Example: + * logSD("The list: %s", catS("1", "2")); + */ +#define logSD(format, string) do {\ + char *libsheepyInternalString = string;\ + logD(format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1081,11 +1124,15 @@ extern uint64_t logMask; */ #define pLogMask(mask, level, ...) if ((mask) & logMask) pLog(level, __VA_ARGS__) +#define logMY(mask, ...) pLogMask(mask, LOG_EMERGENCY, __VA_ARGS__) +#define logMA(mask, ...) pLogMask(mask, LOG_ALERT, __VA_ARGS__) +#define logMC(mask, ...) pLogMask(mask, LOG_CRITICAL, __VA_ARGS__) +#define logME(mask, ...) pLogMask(mask, LOG_ERROR, __VA_ARGS__) +#define logMW(mask, ...) pLogMask(mask, LOG_WARNING, __VA_ARGS__) +#define logMN(mask, ...) pLogMask(mask, LOG_NOTICE, __VA_ARGS__) #define logMP(mask, ...) pLogMask(mask, LOG_PASS, __VA_ARGS__) #define logMI(mask, ...) pLogMask(mask, LOG_INFO, __VA_ARGS__) -#define logMW(mask, ...) pLogMask(mask, LOG_WARNING, __VA_ARGS__) -#define logME(mask, ...) pLogMask(mask, LOG_ERROR, __VA_ARGS__) -#define logMC(mask, ...) pLogMask(mask, LOG_CRITICAL, __VA_ARGS__) +#define logMD(mask, ...) pLogMask(mask, LOG_DEBUG, __VA_ARGS__) // show log messages in mask #define showLogsInMask(mask) logMask |= mask @@ -1096,11 +1143,22 @@ extern uint64_t logMask; /** * log and mask string and then free * Example: - * logSMP("The list: %s", catS("1", "2")); + * logSMY("The list: %s", catS("1", "2")); */ -#define logSMP(mask, format, string) do {\ +#define logSMY(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logMP(mask, format, libsheepyInternalString);\ + logMY(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSMA("The list: %s", catS("1", "2")); + */ +#define logSMA(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logMA(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1109,9 +1167,20 @@ extern uint64_t logMask; * Example: * logSMI("The list: %s", catS("1", "2")); */ -#define logSMI(mask, format, string) do {\ +#define logSMC(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logMI(mask, format, libsheepyInternalString);\ + logMC(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSME("The list: %s", catS("1", "2")); + */ +#define logSME(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logME(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1129,11 +1198,22 @@ extern uint64_t logMask; /** * log and mask string and then free * Example: - * logSME("The list: %s", catS("1", "2")); + * logSMN("The list: %s", catS("1", "2")); */ -#define logSME(mask, format, string) do {\ +#define logSMN(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logME(mask, format, libsheepyInternalString);\ + logMN(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSMP("The list: %s", catS("1", "2")); + */ +#define logSMP(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logMP(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) @@ -1142,9 +1222,20 @@ extern uint64_t logMask; * Example: * logSMI("The list: %s", catS("1", "2")); */ -#define logSMC(mask, format, string) do {\ +#define logSMI(mask, format, string) do {\ char *libsheepyInternalString = string;\ - logMC(mask, format, libsheepyInternalString);\ + logMI(mask, format, libsheepyInternalString);\ + free(libsheepyInternalString);\ + } while(0) + +/** + * log and mask string and then free + * Example: + * logSMD("The list: %s", catS("1", "2")); + */ +#define logSMD(mask, format, string) do {\ + char *libsheepyInternalString = string;\ + logMD(mask, format, libsheepyInternalString);\ free(libsheepyInternalString);\ } while(0) diff --git a/src/libsheepyCuTest.c b/src/libsheepyCuTest.c @@ -305,11 +305,15 @@ void _pLogT(CuTest *tc UNUSED) { // default log mode puts("Default mode"); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test\nmultiline"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test\nmultiline"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); pLog(-1, "pLog test"); @@ -317,88 +321,120 @@ void _pLogT(CuTest *tc UNUSED) { // concise mode puts("LOG_CONCISE mode"); setLogMode(LOG_CONCISE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // verbose mode puts("LOG_VERBOSE mode"); setLogMode(LOG_VERBOSE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // date mode puts("LOG_DATE mode"); setLogMode(LOG_DATE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // function mode puts("LOG_FUNC mode"); setLogMode(LOG_FUNC); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // program name mode puts("LOG_PROG mode"); setLogMode(LOG_PROG); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // program name and date mode puts("LOG_PROGNDATE mode"); setLogMode(LOG_PROGNDATE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // void mode puts("LOG_VOID mode"); setLogMode(LOG_VOID); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // void mode puts("LOG_UTF8 mode"); setLogMode(LOG_UTF8); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); diff --git a/src/libsheepyTest.c b/src/libsheepyTest.c @@ -294,11 +294,15 @@ START_TEST(_pLogT) // default log mode puts("Default mode"); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test\nmultiline"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test\nmultiline"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); pLog(-1, "pLog test"); @@ -306,88 +310,120 @@ START_TEST(_pLogT) // concise mode puts("LOG_CONCISE mode"); setLogMode(LOG_CONCISE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // verbose mode puts("LOG_VERBOSE mode"); setLogMode(LOG_VERBOSE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // date mode puts("LOG_DATE mode"); setLogMode(LOG_DATE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // function mode puts("LOG_FUNC mode"); setLogMode(LOG_FUNC); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // program name mode puts("LOG_PROG mode"); setLogMode(LOG_PROG); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // program name and date mode puts("LOG_PROGNDATE mode"); setLogMode(LOG_PROGNDATE); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // void mode puts("LOG_VOID mode"); setLogMode(LOG_VOID); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test"); // void mode puts("LOG_UTF8 mode"); setLogMode(LOG_UTF8); + pLog(LOG_EMERGENCY, "pLog test"); + pLog(LOG_ALERT, "pLog test"); pLog(LOG_CRITICAL, "pLog test"); pLog(LOG_ERROR, "pLog test"); pLog(LOG_WARNING, "pLog test"); - pLog(LOG_INFO, "pLog test"); + pLog(LOG_NOTICE, "pLog test"); pLog(LOG_PASS, "pLog test"); + pLog(LOG_INFO, "pLog test"); + pLog(LOG_DEBUG, "pLog test"); // invalid log level pLog(LOG_INFO+20, "pLog test");