[Mesa-dev] [PATCH] mesa: Use the proper feature test macros for strtod_l and strtof[_l].

Jeremy Huddleston jeremyhu at apple.com
Wed May 9 13:17:51 PDT 2012


No, that's not right.  We don't use glibc, and we support strtod_l, strtof_l, and strtof.  This change would do the wrong thing for __APPLE__.  Perhaps something more like this:


#if defined(__APPLE__) || (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
...
#if HAVE_STRTOD_L
#include <locale.h>
#ifdef __APPLE__
#include <xlocale.h>
#endif
#endif

etc...

On May 9, 2012, at 12:52 PM, Kenneth Graunke <kenneth at whitecape.org> wrote:

> 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