summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorBrian Paul <[email protected]>2013-01-23 09:05:30 -0700
committerBrian Paul <[email protected]>2013-01-25 15:41:39 -0700
commit811b5b4b398e4eb1617295fe7937e387ca0bcb44 (patch)
treed2f1e5071152ec7e5623e0cca0ac1c9a6e154422 /src
parent6102b9d44104bf8701830ca42dc64ed330e2b8e0 (diff)
glsl: add new glsl_strtof() function
Note, we could alternately implement this in terms of glsl_strtod() with a (float) cast. Reviewed-by: Ian Romanick <[email protected]>
Diffstat (limited to 'src')
-rw-r--r--src/glsl/strtod.c22
-rw-r--r--src/glsl/strtod.h3
2 files changed, 25 insertions, 0 deletions
diff --git a/src/glsl/strtod.c b/src/glsl/strtod.c
index 47c1f0ed69c..5d4346b5a2e 100644
--- a/src/glsl/strtod.c
+++ b/src/glsl/strtod.c
@@ -55,3 +55,25 @@ glsl_strtod(const char *s, char **end)
return strtod(s, end);
#endif
}
+
+
+/**
+ * Wrapper around strtof which uses the "C" locale so the decimal
+ * point is always '.'
+ */
+float
+glsl_strtof(const char *s, char **end)
+{
+#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \
+ !defined(__HAIKU__) && !defined(__UCLIBC__)
+ static locale_t loc = NULL;
+ if (!loc) {
+ loc = newlocale(LC_CTYPE_MASK, "C", NULL);
+ }
+ return strtof_l(s, end, loc);
+#elif _XOPEN_SOURCE >= 600 || _ISOC99_SOURCE
+ return strtof(s, end);
+#else
+ return (float) strtod(s, end);
+#endif
+}
diff --git a/src/glsl/strtod.h b/src/glsl/strtod.h
index 0cf6409d425..ad847dbb010 100644
--- a/src/glsl/strtod.h
+++ b/src/glsl/strtod.h
@@ -34,6 +34,9 @@ extern "C" {
extern double
glsl_strtod(const char *s, char **end);
+extern float
+glsl_strtof(const char *s, char **end);
+
#ifdef __cplusplus
}