[Mesa-dev] [PATCH] glsl: Fix isinf() for non-C99-compliant compilers.

Jose Fonseca jfonseca at vmware.com
Wed Jan 18 12:43:36 PST 2012


Looks good to me. Thanks

Should there be a case for -INF while we are at it?

Jose

----- Original Message -----
> Commit ede60bc4670a8d9c14921c77abee1ac57fc0e6bf (glsl: Add isinf()
> and
> isnan() builtins) uses "+INF" in the .ir file to represent infinity.
> This worked on C99-compliant compilers, since the s-expression reader
> uses strtod() to read numbers, and C99 requires strtod() to
> understand
> "+INF".  However, it didn't work on non-C99-compliant compilers such
> as MSVC.
> 
> This patch modifies the s-expression reader to explicitly check for
> "+INF" rather than relying on strtod() to support it.
> 
> This is a candidate for the 8.0 branch.
> 
> Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=44767
> Tested-by: Morgan Armand <morgan.devel at gmail.com>
> ---
>  src/glsl/s_expression.cpp |   36
>  ++++++++++++++++++++++--------------
>  1 files changed, 22 insertions(+), 14 deletions(-)
> 
> diff --git a/src/glsl/s_expression.cpp b/src/glsl/s_expression.cpp
> index e704a3b..57de9d3 100644
> --- a/src/glsl/s_expression.cpp
> +++ b/src/glsl/s_expression.cpp
> @@ -23,6 +23,7 @@
>   */
>  
>  #include <assert.h>
> +#include <limits>
>  #include "s_expression.h"
>  
>  s_symbol::s_symbol(const char *str, size_t n)
> @@ -64,21 +65,28 @@ read_atom(void *ctx, const char *&src, char
> *&symbol_buffer)
>     if (n == 0)
>        return NULL; // no atom
>  
> -   // Check if the atom is a number.
> -   char *float_end = NULL;
> -   double f = glsl_strtod(src, &float_end);
> -   if (float_end != src) {
> -      char *int_end = NULL;
> -      int i = strtol(src, &int_end, 10);
> -      // If strtod matched more characters, it must have a decimal
> part
> -      if (float_end > int_end)
> -	 expr = new(ctx) s_float(f);
> -      else
> -	 expr = new(ctx) s_int(i);
> +   // Check for the special symbol '+INF', which means +Infinity.
>  Note: C99
> +   // requires strtod to parse '+INF' as +Infinity, but we still
> support some
> +   // non-C99-compliant compilers (e.g. MSVC).
> +   if (n == 4 && strncmp(src, "+INF", 4) == 0) {
> +      expr = new(ctx)
> s_float(std::numeric_limits<float>::infinity());
>     } else {
> -      // Not a number; return a symbol.
> -      symbol_buffer[n] = '\0';
> -      expr = new(ctx) s_symbol(symbol_buffer, n);
> +      // Check if the atom is a number.
> +      char *float_end = NULL;
> +      double f = glsl_strtod(src, &float_end);
> +      if (float_end != src) {
> +         char *int_end = NULL;
> +         int i = strtol(src, &int_end, 10);
> +         // If strtod matched more characters, it must have a
> decimal part
> +         if (float_end > int_end)
> +            expr = new(ctx) s_float(f);
> +         else
> +            expr = new(ctx) s_int(i);
> +      } else {
> +         // Not a number; return a symbol.
> +         symbol_buffer[n] = '\0';
> +         expr = new(ctx) s_symbol(symbol_buffer, n);
> +      }
>     }
>  
>     src += n;
> --
> 1.7.6.5
> 
> _______________________________________________
> mesa-dev mailing list
> mesa-dev at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/mesa-dev
> 


More information about the mesa-dev mailing list