From d546e316280dabcca301699ba238c3bed35b10ec Mon Sep 17 00:00:00 2001 From: Holger Freyther Date: Sat, 27 Dec 2008 12:03:07 +0000 Subject: [PATCH] Add code to parse a debug category string Use strdup to be able to use strtok on the category string and add a test case. Also safe some more information to be able to use color in the print statement. --- configure.in | 1 + include/openbsc/debug.h | 1 + src/debug.c | 48 ++++++++++++++++++++++++++++++++++++++++ tests/Makefile.am | 2 +- tests/debug/Makefile.am | 4 ++++ tests/debug/debug_test.c | 34 ++++++++++++++++++++++++++++ 6 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 tests/debug/Makefile.am create mode 100644 tests/debug/debug_test.c diff --git a/configure.in b/configure.in index 034972a43..d4902d6d4 100644 --- a/configure.in +++ b/configure.in @@ -21,5 +21,6 @@ AC_OUTPUT( include/Makefile src/Makefile tests/Makefile + tests/debug/Makefile tests/timer/Makefile Makefile) diff --git a/include/openbsc/debug.h b/include/openbsc/debug.h index b95b1a7d4..b3b170260 100644 --- a/include/openbsc/debug.h +++ b/include/openbsc/debug.h @@ -18,5 +18,6 @@ #endif void debugp(unsigned int subsys, char *file, int line, const char *format, ...); +void parse_category_mask(const char* mask); #endif /* _DEBUG_H */ diff --git a/src/debug.c b/src/debug.c index a814224c8..2b91814ad 100644 --- a/src/debug.c +++ b/src/debug.c @@ -1,5 +1,6 @@ /* Debugging/Logging support code */ /* (C) 2008 by Harald Welte + * (C) 2008 by Holger Hans Peter Freyther * All Rights Reserved * * This program is free software; you can redistribute it and/or modify @@ -19,14 +20,61 @@ */ #include +#include #include #include +#include #include #include static unsigned int debug_mask = 0xffffffff & ~DMI; +struct debug_info { + const char *name; + const char *color; + const char *description; + int number; +}; + +#define DEBUG_CATEGORY(NUMBER, NAME, COLOR, DESCRIPTION) \ + { .name = NAME, .color = COLOR, .description = DESCRIPTION, .number = NUMBER }, + +#define ARRAY_SIZE(array) (sizeof(array)/sizeof(array[0])) + +static const struct debug_info debug_info[] = { + DEBUG_CATEGORY(DRLL, "DRLL", "", "") + DEBUG_CATEGORY(DCC, "DCC", "", "") + DEBUG_CATEGORY(DNM, "DMM", "", "") + DEBUG_CATEGORY(DRR, "DRR", "", "") + DEBUG_CATEGORY(DRSL, "DRSSL","", "") + DEBUG_CATEGORY(DNM, "DNM", "", "") +}; + +/* + * Parse the category mask. + * category1:category2:category3 + */ +void parse_category_mask(const char *_mask) +{ + unsigned int new_mask = 0; + int i = 0; + char *mask = strdup(_mask); + char *category_token = NULL; + + category_token = strtok(mask, ":"); + do { + for (i = 0; i < ARRAY_SIZE(debug_info); ++i) { + if (strcasecmp(debug_info[i].name, category_token) == 0) + new_mask |= debug_info[i].number; + } + } while (category_token = strtok(NULL, ":")); + + + free(mask); + debug_mask = new_mask; +} + void debugp(unsigned int subsys, char *file, int line, const char *format, ...) { char *timestr; diff --git a/tests/Makefile.am b/tests/Makefile.am index f7cfd549f..f964be129 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -1 +1 @@ -SUBDIRS = timer +SUBDIRS = debug timer diff --git a/tests/debug/Makefile.am b/tests/debug/Makefile.am new file mode 100644 index 000000000..0cdf46ad5 --- /dev/null +++ b/tests/debug/Makefile.am @@ -0,0 +1,4 @@ +INCLUDES = $(all_includes) -I$(top_srcdir)/include +noinst_PROGRAMS = debug_test + +debug_test_SOURCES = debug_test.c $(top_srcdir)/src/debug.c diff --git a/tests/debug/debug_test.c b/tests/debug/debug_test.c new file mode 100644 index 000000000..4fe539c5a --- /dev/null +++ b/tests/debug/debug_test.c @@ -0,0 +1,34 @@ +/* simple test for the debug interface */ +/* + * (C) 2008 by Holger Hans Peter Freyther + * All Rights Reserved + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include + + +int main(int argc, char** argv) +{ + parse_category_mask("DRLL"); + DEBUGP(DCC, "You should not see this\n"); + + parse_category_mask("DRLL:DCC"); + DEBUGP(DRLL, "You should see this\n"); + DEBUGP(DCC, "You should see this\n"); + DEBUGP(DMM, "You should not see this\n"); +}