[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