diff options
author | 2021-03-15 22:43:44 +0200 | |
---|---|---|
committer | 2021-03-15 22:43:44 +0200 | |
commit | 2b6e3cc328aabcc0dda908f16b55874487b67499 (patch) | |
tree | 40b2d1e422d8c82869b06c14f712a5bf7e39978f /src | |
parent | 850b703becdc2b13a8ef613771ee385e81e8f4f5 (diff) | |
download | librin-2b6e3cc328aabcc0dda908f16b55874487b67499.tar.gz librin-2b6e3cc328aabcc0dda908f16b55874487b67499.tar.bz2 librin-2b6e3cc328aabcc0dda908f16b55874487b67499.zip |
diagnostics: add knobs to toggle channels.
Individual channels can now be turned off and on with a simple knob
call, providing an easy way to silence a channel.
Tests not included, as deemed too trivial while being complicated to
properly test.
Signed-off-by: Gediminas Jakutis <gediminas@varciai.lt>
Diffstat (limited to 'src')
-rw-r--r-- | src/diagnostic/diagnostic.c | 44 |
1 files changed, 43 insertions, 1 deletions
diff --git a/src/diagnostic/diagnostic.c b/src/diagnostic/diagnostic.c index 3ec7855..4378988 100644 --- a/src/diagnostic/diagnostic.c +++ b/src/diagnostic/diagnostic.c @@ -40,7 +40,11 @@ static struct iostate { char *warn_format; char *fixme_format; char *info_format; -} state = {{0, 0}, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL}; + unsigned int err_knob : 1; + unsigned int warn_knob : 1; + unsigned int fixme_knob : 1; + unsigned int info_knob : 1; +} state = {{0, 0}, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1, 1, 1, 1}; void rin_diag_cleanup(void) { @@ -141,10 +145,36 @@ int rin_diag_set_outstream(const enum rin_diag_outstream channel, FILE * const s return 0; } +int rin_diag_channel_set_enabled_state(const enum rin_diag_outstream channel, const unsigned int enable) +{ + switch (channel) { + case rin_diag_err: + state.err_knob = enable; + break; + case rin_diag_warn: + state.warn_knob = enable; + break; + case rin_diag_fixme: + state.fixme_knob = enable; + break; + case rin_diag_info: + state.info_knob = enable; + break; + default: + return EINVAL; + } + + return 0; +} + void __rin_err(const char * const func_name, int line_num, const char * const file_name, const char *format, ...) { va_list args; + if (!state.err_knob) { + return; + } + va_start(args, format); __rin_msg(state.err ? state.err : stderr, "error", func_name, line_num, file_name, state.err_format ? state.err_format : default_format, @@ -156,6 +186,10 @@ void __rin_warn(const char * const func_name, int line_num, const char * const f { va_list args; + if (!state.warn_knob) { + return; + } + va_start(args, format); __rin_msg(state.warn ? state.warn : stderr, "warning", func_name, line_num, file_name, state.warn_format ? state.warn_format : default_format, @@ -167,6 +201,10 @@ void __rin_fixme(const char * const func_name, int line_num, const char * const { va_list args; + if (!state.fixme_knob) { + return; + } + va_start(args, format); __rin_msg(state.fixme ? state.fixme : stderr, "fixme", func_name, line_num, file_name, state.fixme_format ? state.fixme_format : default_format, @@ -178,6 +216,10 @@ void __rin_info(const char * const func_name, int line_num, const char * const f { va_list args; + if (!state.info_knob) { + return; + } + va_start(args, format); __rin_msg(state.info ? state.info : stdout, "info", func_name, line_num, file_name, state.info_format ? state.info_format : default_format, |