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.
diff --git a/configure.in b/configure.in
index 034972a..d4902d6 100644
--- a/configure.in
+++ b/configure.in
@@ -21,5 +21,6 @@
     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 b95b1a7..b3b1702 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 a814224..2b91814 100644
--- a/src/debug.c
+++ b/src/debug.c
@@ -1,5 +1,6 @@
 /* Debugging/Logging support code */
 /* (C) 2008 by Harald Welte <laforge@gnumonks.org>
+ * (C) 2008 by Holger Hans Peter Freyther <zecke@selfish.org>
  * All Rights Reserved
  *
  * This program is free software; you can redistribute it and/or modify
@@ -19,14 +20,61 @@
  */
 
 #include <stdarg.h>
+#include <stdlib.h>
 #include <stdio.h>
 #include <string.h>
+#include <strings.h>
 #include <time.h>
 
 #include <openbsc/debug.h>
 
 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 f7cfd54..f964be1 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 0000000..0cdf46a
--- /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 0000000..4fe539c
--- /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 <zecke@selfish.org>
+ * 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 <openbsc/debug.h>
+
+
+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");
+}