From 39bdc0a999a5cab41763729d5add3b610e07dc62 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Tue, 15 Jun 2010 10:37:32 +0200 Subject: [PATCH] strtod: Stop using AC_FUNC_STRTOD. --- ChangeLog | 4 ++++ m4/strtod.m4 | 32 ++++++++++++++++++++++++++++---- 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/ChangeLog b/ChangeLog index 747e29d3d..5570b8185 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,7 @@ +2010-06-15 Bruno Haible + + * m4/strtod.m4 (gl_FUNC_STRTOD): Stop using AC_FUNC_STRTOD. + 2010-06-15 René Berber (tiny change) select: Correct timeout. diff --git a/m4/strtod.m4 b/m4/strtod.m4 index 4cccb6dc6..00b8e64b4 100644 --- a/m4/strtod.m4 +++ b/m4/strtod.m4 @@ -1,4 +1,4 @@ -# strtod.m4 serial 14 +# strtod.m4 serial 15 dnl Copyright (C) 2002-2003, 2006-2010 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -7,11 +7,17 @@ dnl with or without modifications, as long as this notice is preserved. AC_DEFUN([gl_FUNC_STRTOD], [ AC_REQUIRE([gl_STDLIB_H_DEFAULTS]) - AC_FUNC_STRTOD - dnl Note: AC_FUNC_STRTOD does AC_LIBOBJ([strtod]). - if test $ac_cv_func_strtod = no; then + dnl Test whether strtod is declared. + dnl Don't call AC_FUNC_STRTOD, because it does not have the right guess + dnl when cross-compiling. + dnl Don't call AC_CHECK_FUNCS([strtod]) because it would collide with the + dnl ac_cv_func_strtod variable set by the AC_FUNC_STRTOD macro, + AC_CHECK_DECLS_ONCE([strtod]) + if test $ac_cv_have_decl_strtod != yes; then HAVE_STRTOD=0 gl_PREREQ_STRTOD + dnl Use undocumented macro to set POW_LIB correctly. + _AC_LIBOBJ_STRTOD else AC_CACHE_CHECK([whether strtod obeys C99], [gl_cv_func_strtod_works], [AC_RUN_IFELSE([AC_LANG_PROGRAM([[ @@ -28,6 +34,24 @@ numeric_equal (double x, double y) } ]], [[ { + /* In some old versions of Linux (2000 or before), strtod mis-parses + strings with leading '+'. */ + const char *string = " +69"; + char *term; + double value = strtod (string, &term); + if (value != 69 || term != (string + 4)) + return 1; + } + { + /* Under Solaris 2.4, strtod returns the wrong value for the + terminating character under some conditions. */ + const char *string = "NaN"; + char *term; + strtod (string, &term); + if (term != string && *(term - 1) == 0) + return 1; + } + { /* Older glibc and Cygwin mis-parse "-0x". */ const char *string = "-0x"; char *term; -- 2.11.0