On 14/06/16 23:36, Andres Gomez wrote:
> For some cases we want to have shaders where we load an exact bit
> pattern into a signed int.
>
> This fixes the errno-based range validation that was broken when the
> integer vbo attribute parsing on 32-bit systems was recently fixed.
>
> Signed-off-by: Andres Gomez <[email protected]>
> ---
>  tests/shaders/shader_runner.c |  2 +-
>  tests/util/piglit-util.h      | 24 ++++++++++++++++++++++++
>  tests/util/piglit-vbo.cpp     |  2 +-
>  3 files changed, 26 insertions(+), 2 deletions(-)
>
> diff --git a/tests/shaders/shader_runner.c b/tests/shaders/shader_runner.c
> index 564ae63..d6b6100 100644
> --- a/tests/shaders/shader_runner.c
> +++ b/tests/shaders/shader_runner.c
> @@ -1403,7 +1403,7 @@ get_ints(const char *line, int *ints, unsigned count)
>       unsigned i;
>  
>       for (i = 0; i < count; i++)
> -             ints[i] = strtoll(line, (char **) &line, 0);
> +             ints[i] = strtol_hex(line, (char **) &line);
>  }
>  
>  
> diff --git a/tests/util/piglit-util.h b/tests/util/piglit-util.h
> index 1e57215..4328863 100644
> --- a/tests/util/piglit-util.h
> +++ b/tests/util/piglit-util.h
> @@ -269,6 +269,30 @@ strtod_hex(const char *nptr, char **endptr)
>       }
>  }
>  
> +/**
> + * Wrapper for strtol() which allows using an exact hex bit pattern to
> + * generate a signed int value.
> + */
> +static inline int
> +strtol_hex(const char *nptr, char **endptr)
> +{
> +     /* skip spaces and tabs */
Nitpick: this code can be tricky, but curiously, the only comment is
about the simpler line to understand ;). I would just remove this comment.
> +     while (*nptr == ' ' || *nptr == '\t')
> +             nptr++;
> +
> +     if (strncmp(nptr, "0x", 2) == 0) {
> +             union {
> +                     uint32_t u;
> +                     int32_t i;
> +             } x;
> +
> +             x.u = strtoul(nptr, endptr, 16);
> +             return x.i;
> +     } else {
> +             return strtol(nptr, endptr, 0);
> +     }
> +}
> +
>  #ifndef HAVE_STRCHRNUL
>  static inline char *
>  strchrnul(const char *s, int c)
> diff --git a/tests/util/piglit-vbo.cpp b/tests/util/piglit-vbo.cpp
> index b8f2d48..274779f 100644
> --- a/tests/util/piglit-vbo.cpp
> +++ b/tests/util/piglit-vbo.cpp
> @@ -387,7 +387,7 @@ vertex_attrib_description::parse_datum(const char **text, 
> void *data) const
>               break;
>       }
>       case GL_INT: {
> -             long long value = strtoll(*text, &endptr, 0);
> +             long value = strtol_hex(*text, &endptr);
>               if (errno == ERANGE) {
>                       printf("Could not parse as signed integer\n");
>                       return false;

With or without that nitpick solved:
Reviewed-by: Alejandro Piñeiro <[email protected]>

_______________________________________________
Piglit mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/piglit

Reply via email to