Mesa (master): util: fix parsing debug options

Marek Olšák mareko at kemper.freedesktop.org
Thu Jan 27 19:32:36 UTC 2011


Module: Mesa
Branch: master
Commit: 387fe8dd475d70f098eabc48a8a3696cf0b72275
URL:    http://cgit.freedesktop.org/mesa/mesa/commit/?id=387fe8dd475d70f098eabc48a8a3696cf0b72275

Author: Marek Olšák <maraeo at gmail.com>
Date:   Wed Jan 26 11:46:39 2011 +0100

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.

---

 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 8cf7660..36ce4b5 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++;
       }
    }
 




More information about the mesa-commit mailing list