diff options
| author | Jonas Suhr Christensen <jsc@umbraculum.org> | 2012-12-07 15:31:52 +0100 | 
|---|---|---|
| committer | Jonas Suhr Christensen <jsc@umbraculum.org> | 2012-12-07 15:31:52 +0100 | 
| commit | 3cca83a352842d58b8ab2d01fc2594ae2e284a50 (patch) | |
| tree | 641b4ef93cb08db735bf9f0178ad3467f95f137e | |
| parent | 2c628b69ab19817ff219bf1fd51f4517c3b87c67 (diff) | |
| parent | 26b8b48b4952249a13855a21946955a10c77837f (diff) | |
Merge branch 'master' of https://git.oftal.dk/debug
Conflicts:
	Makefile
	debug.c
	main.c
| -rw-r--r-- | Makefile | 3 | ||||
| -rw-r--r-- | Makefile.files | 6 | ||||
| -rw-r--r-- | debug.c | 176 | ||||
| -rw-r--r-- | debug.h | 9 | ||||
| -rw-r--r-- | debug_filter.c | 123 | ||||
| -rw-r--r-- | debug_filter.h | 36 | ||||
| -rw-r--r-- | main.c | 4 | 
7 files changed, 197 insertions, 160 deletions
@@ -1,5 +1,4 @@  include Makefile.files  all: -	gcc ${DEBUG_SOURCES} main.c debug_syslog.c -o debug  -DWITH_DBG_SYSLOG -# -DWITH_DBG_MUTEX +	gcc ${DEBUG_SOURCES} main.c debug_syslog.c -o debug  -DWITH_DBG_SYSLOG -DWITH_DBG_FILTER diff --git a/Makefile.files b/Makefile.files index e707d13..4781f2c 100644 --- a/Makefile.files +++ b/Makefile.files @@ -4,7 +4,9 @@  #  DEBUG_SOURCES = \ -	debug.c +	debug.c \ +	debug_filter.c  DEBUG_EXTRA_DIST = \ -	debug.h
\ No newline at end of file +	debug.h \ +	debug_filter.h
\ No newline at end of file @@ -41,6 +41,10 @@  #include <pthread.h>  #endif +#ifdef WITH_DBG_FILTER +#include "debug_filter.h" +#endif +  struct {    unsigned int flags;  #ifdef WITH_DBG_MUTEX @@ -126,6 +130,11 @@ dbg_status_t dbg_init(unsigned int flags, ...)        dbg_config.syslog_host = (const char*)va_arg(vl, char*);        break;  #endif +#ifdef WITH_DBG_FILTER +    case DBG_OPTION_FILTER: +      dbg_filter_parse((const char*)va_arg(vl, char*)); +      break; +#endif      default:        status = DBG_STATUS_UNKNOWN_OPTION;        printf("option: %x\n", option); @@ -160,9 +169,16 @@ void dbg_close()    dbg_mutex_close();  } -static const char * const debug_class_str[] = +const char * const debug_class_str[] =    { "fixme", "err", "warn", "info", "debug" }; +/* +static unsigned int gettid() +{ +  return (unsigned int)pthread_self(); +} +*/ +  static int dbg_create_header(char *hdr, size_t size)  {    time_t rawtime = time(NULL); @@ -200,6 +216,10 @@ int __debug(const char *func, const int line,    dbg_mutex_lock(); +#ifdef WITH_DBG_FILTER +  if(!dbg_filter_enabled(cl, ch)) goto done; +#endif +    //    // Generate message    // @@ -244,157 +264,3 @@ int __debug(const char *func, const int line,    return result;  } -#if 0 - -#include <stdlib.h> -#include <stdarg.h> -#include <string.h> -//#include <pthread.h> -#include <string> -#include <time.h> - -//#include "mutex.h" - -//static Mutex mutex; - -static unsigned int gettid() -{ -  return 0;//(unsigned int)pthread_self(); -} - -static FILE *logfp = stderr; - -#define NELEM(x)	(sizeof(x)/sizeof((x)[0])) -struct __debug_channel -{ -	char name[32]; -	unsigned flags; -}; - -static const char * const debug_class_str[] = -  { "fixme", "err", "warn", "info", "debug" }; - -#define __DEBUG_CHANNEL_MAX 256 - -static struct __debug_channel debug_channel[__DEBUG_CHANNEL_MAX]; -static unsigned n_debug_channel = 0; -static unsigned debug_flags = (1 << __class_err) | (1 << __class_fixme); - -static int __debug_enabled(const enum __debug_class cl, const char *ch) -{ -	unsigned i; -	for(i = 0; i < n_debug_channel; i++) { -		if(!strcmp(ch, debug_channel[i].name)) { -			return (debug_channel[i].flags & (1 << cl)) != 0; -		} -	} -	return debug_flags & (1 << cl); -} - -int __debug(const char *func, const int line, -            const enum __debug_class cl, -            const char *ch, const char *fmt, ...) -{ -  time_t rawtime = time(NULL); -  struct tm *t = localtime(&rawtime); - -  //  MutexAutolock m(mutex); -	int ret = 0; -	if(__debug_enabled(cl, ch)) { -		if((unsigned)cl < NELEM(debug_class_str)) -			ret += fprintf(logfp, "%d-%02d-%02d %02d:%02d:%02d %u %s:%s:%s:%d ", -                     t->tm_year + 1900, -                     t->tm_mon + 1, -                     t->tm_mday, -                     t->tm_hour, -                     t->tm_min, -                     t->tm_sec, -                     gettid(), -                     debug_class_str[(unsigned)cl], ch, func, line); -		if(fmt) { -			va_list va; -			va_start(va, fmt); -			ret += vfprintf(logfp, fmt, va); -			va_end(va); -		} -	} -	if(ret){ -		fflush(logfp); -  } -	return ret; -} - -void debug_init(FILE *fp) -{ -  //  mutex.name = "debug"; -  //  MutexAutolock m(mutex); -  logfp = fp; -} - -/* - * fmt := [set[,set]*]* - * set := [+-]channel - *     |  class[+-]channel - *     |  [+-]all - */ -void debug_parse(const char *fmt) -{ -  //  MutexAutolock m(mutex); -	char *s; -	char *next; -	char *opt; - -	if(!(s = strdup(fmt))) return; - -	for(opt = s; opt; opt = next) { -		int set = 0; -		int clr = 0; -		unsigned i; -		if((next = strchr(opt, ','))) *next++ = '\0'; -		char *p = opt + strcspn(opt, "+-"); -		if(!*p) p = opt;	// All chars -> a channel name -		if(p > opt) { -			// we have a class -			for(i = 0; i < NELEM(debug_class_str); i++) { -				int n = strlen(debug_class_str[i]); -				if(n != (p - opt)) continue; -				if(!memcmp(opt, debug_class_str[i], n)) { -					// Found the class -					if(*p == '+') -						set = 1 << i; -					else -						clr = 1 << i; -					break; -				} -			} -			if(i == NELEM(debug_class_str)) continue; -		} else { -			if(*p == '-') -				clr = ~0; -			else -				set = ~0; -		} -		if(*p == '+' || *p == '-') p++; -		if(!*p) continue; -		if(!strcmp("all", p)) { -			debug_flags = (debug_flags & ~clr) | set; -		} else { -			if(strlen(p) >= sizeof(debug_channel[0].name)) continue; -			for(i = 0; i < n_debug_channel; i++) { -				if(!strcmp(p, debug_channel[i].name)) { -					debug_channel[i].flags = (debug_channel[i].flags & ~clr) | set; -					break; -				} -			} -			if(i == n_debug_channel && n_debug_channel < __DEBUG_CHANNEL_MAX) { -				strcpy(debug_channel[i].name, p); -				debug_channel[i].flags = (debug_flags & ~clr) | set; -				n_debug_channel++; -			} -		} -	} -	free(s); -} - - -#endif @@ -89,8 +89,15 @@ enum DBG_OPTION {  #endif    /** -   *  +   * Filter option. Argument is a const char *. +   * fmt := [set[,set]*]* +   * set := [+-]channel +   *     |  class[+-]channel +   *     |  [+-]all        */ +#ifdef WITH_DBG_FILTER +  DBG_OPTION_FILTER, +#endif  };  typedef enum { diff --git a/debug_filter.c b/debug_filter.c new file mode 100644 index 0000000..f93b4c9 --- /dev/null +++ b/debug_filter.c @@ -0,0 +1,123 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + *            debug_filter.c + * + *  Fri Dec  7 14:24:27 CET 2012 + *  Copyright 2012 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of Debug Module. + * + *  Debug Module 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. + * + *  Debug Module 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 Debug Module; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#include "debug_filter.h" + +#include <string.h> +#include <stdlib.h> + +#define NELEM(x)	(sizeof(x)/sizeof((x)[0])) +struct __debug_channel +{ +	char name[32]; +	unsigned flags; +}; + +#define __DEBUG_CHANNEL_MAX 256 + +static struct __debug_channel debug_channel[__DEBUG_CHANNEL_MAX]; +static unsigned n_debug_channel = 0; +static unsigned debug_flags = (1 << __class_err) | (1 << __class_fixme); + +int dbg_filter_enabled(const enum __debug_class cl, const char *ch) +{ +	unsigned i; +	for(i = 0; i < n_debug_channel; i++) { +		if(!strcmp(ch, debug_channel[i].name)) { +			return (debug_channel[i].flags & (1 << cl)) != 0; +		} +	} +	return debug_flags & (1 << cl); +} + +extern const char * const *debug_class_str; + +/* + * fmt := [set[,set]*]* + * set := [+-]channel + *     |  class[+-]channel + *     |  [+-]all + */ +int dbg_filter_parse(const char *filter) +{ +	char *s; +	char *next; +	char *opt; + +	if(!(s = strdup(filter))) return 1; + +	for(opt = s; opt; opt = next) { +		int set = 0; +		int clr = 0; +		unsigned i; +		if((next = strchr(opt, ','))) *next++ = '\0'; +		char *p = opt + strcspn(opt, "+-"); +		if(!*p) p = opt;	// All chars -> a channel name +		if(p > opt) { +			// we have a class +			for(i = 0; i < NELEM(debug_class_str); i++) { +				int n = strlen(debug_class_str[i]); +				if(n != (p - opt)) continue; +				if(!memcmp(opt, debug_class_str[i], n)) { +					// Found the class +					if(*p == '+') +						set = 1 << i; +					else +						clr = 1 << i; +					break; +				} +			} +			if(i == NELEM(debug_class_str)) continue; +		} else { +			if(*p == '-') +				clr = ~0; +			else +				set = ~0; +		} +		if(*p == '+' || *p == '-') p++; +		if(!*p) continue; +		if(!strcmp("all", p)) { +			debug_flags = (debug_flags & ~clr) | set; +		} else { +			if(strlen(p) >= sizeof(debug_channel[0].name)) continue; +			for(i = 0; i < n_debug_channel; i++) { +				if(!strcmp(p, debug_channel[i].name)) { +					debug_channel[i].flags = (debug_channel[i].flags & ~clr) | set; +					break; +				} +			} +			if(i == n_debug_channel && n_debug_channel < __DEBUG_CHANNEL_MAX) { +				strcpy(debug_channel[i].name, p); +				debug_channel[i].flags = (debug_flags & ~clr) | set; +				n_debug_channel++; +			} +		} +	} +	free(s); + +  return 0; +} diff --git a/debug_filter.h b/debug_filter.h new file mode 100644 index 0000000..d312d56 --- /dev/null +++ b/debug_filter.h @@ -0,0 +1,36 @@ +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* vim: set et sw=2 ts=2: */ +/*************************************************************************** + *            debug_filter.h + * + *  Fri Dec  7 14:24:27 CET 2012 + *  Copyright 2012 Bent Bisballe Nyeng + *  deva@aasimon.org + ****************************************************************************/ + +/* + *  This file is part of Debug Module. + * + *  Debug Module 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. + * + *  Debug Module 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 Debug Module; if not, write to the Free Software + *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA. + */ +#ifndef __DEBUG_MODULE_DEBUG_FILTER_H__ +#define __DEBUG_MODULE_DEBUG_FILTER_H__ + +#include "debug.h" + +int dbg_filter_enabled(const enum __debug_class cl, const char *ch); +int dbg_filter_parse(const char *filter); + +#endif/*__DEBUG_MODULE_DEBUG_FILTER_H__*/ @@ -47,6 +47,7 @@ int main(int argc, char *argv[])  //                                 DBG_FLAG_OUTPUT_TO_STDOUT |                                   DBG_FLAG_OUTPUT_TO_SYSLOG |                                   //DBG_FLAG_OUTPUT_TO_STDERR | +                                 DBG_FLAG_USE_FILTER |                                   0,                                   //DBG_OPTION_FD, fd,  //                                 DBG_OPTION_FILENAME, "", @@ -54,6 +55,7 @@ int main(int argc, char *argv[])                                   "127.0.0.1",                                   DBG_OPTION_SYSLOG_PORT,                                   514, +                                 DBG_OPTION_FILTER, "+all",                                   DBG_OPTION_END);    if(status != DBG_STATUS_OK) { @@ -64,6 +66,8 @@ int main(int argc, char *argv[])    INFO(example, "We are up and running");    DEBUG(example, "Or are we %d?", 42); + +  DEBUG(foo, "Or are we %d?", 42);    dbg_close();  | 
