[Mesa-dev] [PATCH] mesa: Use the proper feature test macros for strtod_l and strtof[_l].
Kenneth Graunke
kenneth at whitecape.org
Wed May 9 12:52:03 PDT 2012
From: Bryan Henderson <bryanh at giraffe-data.com>
[v2/Kayden: rebased version of Bryan's original patch from:
https://bugs.freedesktop.org/show_bug.cgi?id=33447]
Cc: Jeremy Huddleston <jeremyhu at apple.com>
Cc: Chad Versace <chad.versace at linux.intel.com>
Bugzilla: https://bugs.freedesktop.org/show_bug.cgi?id=33447
Signed-off-by: Kenneth Graunke <kenneth at whitecape.org>
---
src/glsl/strtod.c | 11 +++++++----
src/mesa/main/imports.c | 22 +++++++++++++++++-----
2 files changed, 24 insertions(+), 9 deletions(-)
Hey guys,
I just got pinged on IRC by someone trying to build Mesa with ucLibc,
which doesn't support strtod_l or strtof_l. I found this 1+ year old
patch from Bryan on Bugzilla which fixed up the feature macros to only
use locale_t on glibc, and figured it would help
I rebased it against master (adding the Haiku and Android changes), and
figured I'd send it out to the list for review.
Jeremy: Does this look right? I wasn't sure if Apple used glibc or not,
and was afraid this might break stuff there.
Chad: Why do we have !ANDROID for strtof_l but not strtod_l? Oversight?
Or does it actually support strtod_l?
Thanks!
--Ken
diff --git a/src/glsl/strtod.c b/src/glsl/strtod.c
index a876e13..876ed21 100644
--- a/src/glsl/strtod.c
+++ b/src/glsl/strtod.c
@@ -26,7 +26,7 @@
#include <stdlib.h>
-#ifdef _GNU_SOURCE
+#ifdef __GLIBC__
#include <locale.h>
#ifdef __APPLE__
#include <xlocale.h>
@@ -35,7 +35,11 @@
#include "strtod.h"
-
+#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ > 2 && !defined(__CYGWIN__) && !defined(__FreeBSD__) && !defined(__HAIKU__)
+ #define HAVE_STRTOD_L 1
+#else
+ #define HAVE_STRTOD_L 0
+#endif
/**
* Wrapper around strtod which uses the "C" locale so the decimal
@@ -44,8 +48,7 @@
double
glsl_strtod(const char *s, char **end)
{
-#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \
- !defined(__HAIKU__)
+#if HAVE_STRTOD_L
static locale_t loc = NULL;
if (!loc) {
loc = newlocale(LC_CTYPE_MASK, "C", NULL);
diff --git a/src/mesa/main/imports.c b/src/mesa/main/imports.c
index 2d592a6..c145101 100644
--- a/src/mesa/main/imports.c
+++ b/src/mesa/main/imports.c
@@ -42,20 +42,33 @@
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
-
+#define _XOPEN_SOURCE 600 /* We use strtof/strtof_l */
#include "imports.h"
#include "context.h"
#include "mtypes.h"
#include "version.h"
-#ifdef _GNU_SOURCE
+#ifdef __GLIBC__
#include <locale.h>
#ifdef __APPLE__
#include <xlocale.h>
#endif
#endif
+#if defined(__GLIBC__) && __GLIBC__ >= 2 && __GLIBC_MINOR__ > 2 && !defined(__CYGWIN__) && !defined(__FreeBSD__) && !defined(ANDROID) && !defined(__HAIKU__)
+ #define HAVE_STRTOF_L 1
+#else
+ #define HAVE_STRTOF_L 0
+#endif
+
+#if defined(__GLIBC__)
+ #define HAVE_STRTOF 1
+ /* True at least as long as we declare _XOPEN_SOURCE >= 600 */
+#else
+ #define HAVE_STRTOF 0
+#endif
+
#ifdef WIN32
#define vsnprintf _vsnprintf
@@ -761,14 +774,13 @@ _mesa_strdup( const char *s )
float
_mesa_strtof( const char *s, char **end )
{
-#if defined(_GNU_SOURCE) && !defined(__CYGWIN__) && !defined(__FreeBSD__) && \
- !defined(ANDROID) && !defined(__HAIKU__)
+#if HAVE_STRTOF_L
static locale_t loc = NULL;
if (!loc) {
loc = newlocale(LC_CTYPE_MASK, "C", NULL);
}
return strtof_l(s, end, loc);
-#elif defined(_ISOC99_SOURCE) || (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE >= 600)
+#elif HAVE_STRTOF
return strtof(s, end);
#else
return (float)strtod(s, end);
--
1.7.10.1
More information about the mesa-dev
mailing list