diff options
author | Andreas Eversberg <jolly@eversberg.eu> | 2016-06-12 10:50:55 +0200 |
---|---|---|
committer | Andreas Eversberg <jolly@eversberg.eu> | 2016-06-12 16:14:29 +0200 |
commit | 7cfd11eb179acb35712506d3e93ab0860ba5907d (patch) | |
tree | f4db0637873370b8d31235b81021b24a22e90b0e /src | |
parent | 051cc81b139bd553158a87a26dc49563f5f1ec6b (diff) |
common code: Add feature to select debug category rather than showing all
Diffstat (limited to 'src')
-rw-r--r-- | src/common/debug.c | 63 | ||||
-rw-r--r-- | src/common/debug.h | 4 | ||||
-rw-r--r-- | src/common/main_common.c | 22 |
3 files changed, 81 insertions, 8 deletions
diff --git a/src/common/debug.c b/src/common/debug.c index aaaa6b4..61f303c 100644 --- a/src/common/debug.c +++ b/src/common/debug.c @@ -20,6 +20,9 @@ #include <stdarg.h> #include <stdio.h> #include <string.h> +#include <stdlib.h> +#include <stdint.h> +#include <errno.h> #include "debug.h" const char *debug_level[] = { @@ -27,6 +30,7 @@ const char *debug_level[] = { "info ", "notice ", "error ", + NULL, }; struct debug_cat { @@ -44,9 +48,12 @@ struct debug_cat { { "call", "\033[1;37m" }, { "mncc", "\033[1;32m" }, { "database", "\033[0;33m" }, + { "transaction", "\033[0;32m" }, + { NULL, NULL } }; int debuglevel = DEBUG_INFO; +uint64_t debug_mask = ~0; void _printdebug(const char *file, const char *function, int line, int cat, int level, const char *fmt, ...) { @@ -57,6 +64,9 @@ void _printdebug(const char *file, const char *function, int line, int cat, int if (debuglevel > level) return; + if (!(debug_mask & (1 << cat))) + return; + va_start(args, fmt); vsnprintf(buffer, sizeof(buffer) - 1, fmt, args); buffer[sizeof(buffer) - 1] = '\0'; @@ -84,3 +94,56 @@ const char *debug_amplitude(double level) return text; } +void debug_list_cat(void) +{ + int i; + + printf("Give number of debug level:\n"); + for (i = 0; debug_level[i]; i++) + printf(" %d = %s\n", i, debug_level[i]); + printf("\n"); + + printf("Give name(s) of debug category:\n"); + for (i = 0; debug_cat[i].name; i++) + printf(" %s%s\033[0;39m\n", debug_cat[i].color, debug_cat[i].name); + printf("\n"); +} + +int parse_debug_opt(const char *optarg) +{ + int i, max_level = 0; + char *dstring, *p; + + for (i = 0; debug_level[i]; i++) + max_level = i; + + dstring = strdup(optarg); + p = strsep(&dstring, ","); + for (i = 0; i < p[i]; i++) { + if (p[i] < '0' || p[i] > '9') { + fprintf(stderr, "Only digits are allowed for debug level!\n"); + return -EINVAL; + } + } + debuglevel = atoi(p); + if (debuglevel > max_level) { + fprintf(stderr, "Debug level too high, use 'list' to show available levels!\n"); + return -EINVAL; + } + if (dstring) + debug_mask = 0; + while((p = strsep(&dstring, ","))) { + for (i = 0; debug_cat[i].name; i++) { + if (!strcasecmp(p, debug_cat[i].name)) + break; + } + if (!debug_cat[i].name) { + fprintf(stderr, "Given debug category '%s' unknown, use 'list' to show available categories!\n", p); + return -EINVAL; + } + debug_mask |= (1 << i); + } + + return 0; +} + diff --git a/src/common/debug.h b/src/common/debug.h index 53aa9bf..67b020a 100644 --- a/src/common/debug.h +++ b/src/common/debug.h @@ -15,11 +15,15 @@ #define DCALL 8 #define DMNCC 9 #define DDB 10 +#define DTRANS 11 #define PDEBUG(cat, level, fmt, arg...) _printdebug(__FILE__, __FUNCTION__, __LINE__, cat, level, fmt, ## arg) void _printdebug(const char *file, const char *function, int line, int cat, int level, const char *fmt, ...); const char *debug_amplitude(double level); +void debug_list_cat(void); +int parse_debug_opt(const char *opt); + extern int debuglevel; diff --git a/src/common/main_common.c b/src/common/main_common.c index 3b80e02..4f4d2ea 100644 --- a/src/common/main_common.c +++ b/src/common/main_common.c @@ -54,8 +54,11 @@ void print_help_common(const char *arg0, const char *ext_usage) /* - - */ printf(" -h --help\n"); printf(" This help\n"); - printf(" -D --debug <level>\n"); - printf(" Debug level: 0 = debug | 1 = info | 2 = notice (default = '%d')\n", debuglevel); + printf(" -D --debug <level> | <level>,<category>[,<category>[,...]] | list\n"); + printf(" Use 'list' to get a list of all levels and categories\n"); + printf(" Debug level: digit of debug level (default = '%d')\n", debuglevel); + printf(" Debug level+category: level digit followed by one or more categories\n"); + printf(" -> If no category is specified, all categories are selected\n"); printf(" -k --kanal <channel>\n"); printf(" Channel number of \"Sender\"\n"); printf(" -d --device hw:<card>,<device>\n"); @@ -76,7 +79,7 @@ void print_help_common(const char *arg0, const char *ext_usage) printf(" -G --rx-gain <dB>\n"); printf(" Raise receiver RX level by given gain in dB. This is useful if input\n"); printf(" level of the sound device is too low, even after setting maximum level\n"); - printf(" with the mixer settings.\n"); + printf(" with the mixer settings.\n"); printf(" -m --mncc-sock\n"); printf(" Disable built-in call contol and offer socket (to LCR)\n"); printf(" -c --call-device hw:<card>,<device>\n"); @@ -143,11 +146,14 @@ void opt_switch_common(int c, char *arg0, int *skip_args) print_help(arg0); exit(0); case 'D': - debuglevel = atoi(optarg); - if (debuglevel > 2) - debuglevel = 2; - if (debuglevel < 0) - debuglevel = 0; + if (!strcasecmp(optarg, "list")) { + debug_list_cat(); + exit(0); + } + if (parse_debug_opt(optarg)) { + fprintf(stderr, "Failed to parse debug option, please use -h for help.\n"); + exit(0); + } *skip_args += 2; break; case 'k': |