[Mesa-dev] Mesa (master): util: fix parsing debug options

José Fonseca jfonseca at vmware.com
Sun Jan 30 02:17:24 PST 2011


Looks perfect. Thanks for doing this Marek.

Jose

On Thu, 2011-01-27 at 11:32 -0800, Marek Olšák wrote:
> 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++;
>        }
>     }
>  
> 
> _______________________________________________
> mesa-commit mailing list
> mesa-commit at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-commit




More information about the mesa-dev mailing list