diff options
author | Marek Olšák <maraeo@gmail.com> | 2011-01-26 11:46:39 +0100 |
---|---|---|
committer | Marek Olšák <maraeo@gmail.com> | 2011-01-27 20:32:03 +0100 |
commit | 387fe8dd475d70f098eabc48a8a3696cf0b72275 (patch) | |
tree | f544502a0a83fd38edf4deeb9f18bb191b6a090b | |
parent | db299a9f8244d53d9041fcdbd396a77ebe1f9e3e (diff) |
util: fix parsing debug options
So that 'foo' can be found in: OPTION=prefixfoosuffix,foo
Also allow that debug options can be separated by a non-alphanumeric characters
instead of just commas.
-rw-r--r-- | src/gallium/auxiliary/util/u_debug.c | 44 |
1 files changed, 25 insertions, 19 deletions
diff --git a/src/gallium/auxiliary/util/u_debug.c b/src/gallium/auxiliary/util/u_debug.c index 8cf76608e68..36ce4b57713 100644 --- a/src/gallium/auxiliary/util/u_debug.c +++ b/src/gallium/auxiliary/util/u_debug.c @@ -44,6 +44,7 @@ #include "util/u_surface.h" #include <limits.h> /* CHAR_BIT */ +#include <ctype.h> /* isalnum */ void _debug_vprintf(const char *format, va_list ap) { @@ -182,36 +183,41 @@ debug_get_num_option(const char *name, long dfault) static boolean str_has_option(const char *str, const char *name) { - const char *substr; + /* Empty string. */ + if (!*str) { + return FALSE; + } /* OPTION=all */ if (!util_strcmp(str, "all")) { return TRUE; } - /* OPTION=name */ - if (!util_strcmp(str, name)) { - return TRUE; - } + /* Find 'name' in 'str' surrounded by non-alphanumeric characters. */ + { + const char *start = str; + unsigned name_len = strlen(name); - substr = util_strstr(str, name); + /* 'start' is the beginning of the currently-parsed word, + * we increment 'str' each iteration. + * if we find either the end of string or a non-alphanumeric character, + * we compare 'start' up to 'str-1' with 'name'. */ - if (substr) { - unsigned name_len = strlen(name); + while (1) { + if (!*str || !isalnum(*str)) { + if (str-start == name_len && + !memcmp(start, name, name_len)) { + return TRUE; + } - /* OPTION=name,... */ - if (substr == str && substr[name_len] == ',') { - return TRUE; - } + if (!*str) { + return FALSE; + } - /* OPTION=...,name */ - if (substr+name_len == str+strlen(str) && substr[-1] == ',') { - return TRUE; - } + start = str+1; + } - /* OPTION=...,name,... */ - if (substr[-1] == ',' && substr[name_len] == ',') { - return TRUE; + str++; } } |