-# strtod.m4 serial 13
-dnl Copyright (C) 2002-2003, 2006-2009 Free Software Foundation, Inc.
+# 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,
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
- REPLACE_STRTOD=1
- gl_PREREQ_STRTOD
else
AC_CACHE_CHECK([whether strtod obeys C99], [gl_cv_func_strtod_works],
[AC_RUN_IFELSE([AC_LANG_PROGRAM([[
return x == 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";
]])],
[gl_cv_func_strtod_works=yes],
[gl_cv_func_strtod_works=no],
- [gl_cv_func_strtod_works="guessing no"])])
+ [dnl The last known bugs in glibc strtod(), as of this writing,
+ dnl were fixed in version 2.8
+ AC_EGREP_CPP([Lucky user],
+ [
+#include <features.h>
+#ifdef __GNU_LIBRARY__
+ #if (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 8) || (__GLIBC__ > 2)
+ Lucky user
+ #endif
+#endif
+ ],
+ [gl_cv_func_strtod_works=yes],
+ [gl_cv_func_strtod_works="guessing no"])])])
if test "$gl_cv_func_strtod_works" != yes; then
REPLACE_STRTOD=1
- gl_PREREQ_STRTOD
- dnl Use undocumented macro to set POW_LIB correctly.
- _AC_LIBOBJ_STRTOD
fi
fi
+ if test $HAVE_STRTOD = 0 || test $REPLACE_STRTOD = 1; then
+ gl_PREREQ_STRTOD
+ dnl Use undocumented macro to set POW_LIB correctly.
+ _AC_LIBOBJ_STRTOD
+ fi
])
# Prerequisites of lib/strtod.c.