On 10/26/2011 06:42 PM, Paul Berry wrote: > In order to implement the GLSL 1.30 isinf() function, it will be > necessary to be able to represent infinity in the GLSL IR s-expression > format. This patch extends the s-expression parser so that it treats > the string "#inf" as a floating point value representing positive > infinity. > --- > src/glsl/s_expression.cpp | 33 +++++++++++++++++++-------------- > 1 files changed, 19 insertions(+), 14 deletions(-)
Two kind of stupid comments: Scheme represents infinity as +inf.0 or -inf.0 and NaN as +nan.0. If you wanted to be more Scheme-like, you could do that (and also gain a representation of -infinity if you wanted...) Also...strtod() already accepts "INF"/"INFINITY" and "NAN" for these cases. Which actually kind of sucks because somebody could totally name their variables that (unlike #inf or +inf.0). That should be fixed someday. But there are a lot of things the reader can't do (like structs), so...not terribly important. It works well enough for now and we can always fix it when it actually matters. So, I guess you've got a few options: 1. Keep patch as is (#inf) 2. Switch to +inf.0, -inf.0, +nan.0 to be like Scheme 3. Drop this patch and just use INFINITY in the built-in files. I'm honestly okay with any of these. For the series: Reviewed-by: Kenneth Graunke <kenn...@whitecape.org> > diff --git a/src/glsl/s_expression.cpp b/src/glsl/s_expression.cpp > index e704a3b..4391488 100644 > --- a/src/glsl/s_expression.cpp > +++ b/src/glsl/s_expression.cpp > @@ -64,21 +64,26 @@ 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 > + if (n == 4 && strncmp(src, "#inf", 4) == 0) { > + expr = new(ctx) s_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; _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev