[Piglit] [PATCH 1/4] util: Wrapper to load exact hex patterns for ints
Andres Gomez
agomez at igalia.com
Thu Jun 9 21:27:02 UTC 2016
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 <agomez at igalia.com>
---
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 */
+ 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;
--
2.8.1
More information about the Piglit
mailing list