From 666ce534702d65dd6ebefe0970022ff474a740e2 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Sun, 25 Mar 2007 21:35:38 +0000 Subject: [PATCH] Provide a replacement for frexpl() if the system has it but it doesn't work. --- ChangeLog | 10 ++++++++++ lib/math_.h | 5 ++++- m4/frexpl.m4 | 45 ++++++++++++++++++++++++++++++++++++++++++++- m4/math_h.m4 | 1 + modules/math | 1 + 5 files changed, 60 insertions(+), 2 deletions(-) diff --git a/ChangeLog b/ChangeLog index 532ae780a..4306d1ecb 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,15 @@ 2007-03-25 Bruno Haible + * m4/frexpl.m4 (gl_FUNC_FREXPL_WORKS): New macro. + (gl_FUNC_FREXPL): Invoke it. Set REPLACE_FREXPL to 1 if it frexpl + exists but doesn't work. + * lib/math_.h (frexpl): Define as a replacement macro if REPLACE_FREXPL + is set. Don't provide a prototype if REPLACE_FREXPL is not set. + * m4/math_h.m4 (gl_MATH_H_DEFAULTS): Initialize REPLACE_FREXPL. + * modules/math (Makefile.am) Substibute also REPLACE_FREXPL into math.h. + +2007-03-25 Bruno Haible + * m4/frexp.m4 (gl_FUNC_FREXP_WORKS): Add check whether frexp(inf) returns inf. Needed on IRIX 6.5. diff --git a/lib/math_.h b/lib/math_.h index 4ecc83b4d..0fa81d71f 100644 --- a/lib/math_.h +++ b/lib/math_.h @@ -135,7 +135,10 @@ extern long double floorl (long double x); If x is zero: mantissa = x, exp = 0. If x is infinite or NaN: mantissa = x, exp unspecified. Store exp and return mantissa. */ -#if @GNULIB_FREXPL@ || !@HAVE_DECL_FREXPL@ +#if @GNULIB_FREXPL@ && @REPLACE_FREXPL@ +# define frexpl rpl_frexpl +#endif +#if (@GNULIB_FREXPL@ && @REPLACE_FREXPL@) || !@HAVE_DECL_FREXPL@ extern long double frexpl (long double x, int *exp); #endif #if !@GNULIB_FREXPL@ && defined GNULIB_POSIXCHECK diff --git a/m4/frexpl.m4 b/m4/frexpl.m4 index 361fd2d86..b10fee210 100644 --- a/m4/frexpl.m4 +++ b/m4/frexpl.m4 @@ -1,4 +1,4 @@ -# frexpl.m4 serial 1 +# frexpl.m4 serial 2 dnl Copyright (C) 2007 Free Software Foundation, Inc. dnl This file is free software; the Free Software Foundation dnl gives unlimited permission to copy and/or distribute it, @@ -36,6 +36,18 @@ AC_DEFUN([gl_FUNC_FREXPL], fi if test $gl_cv_func_frexpl_no_libm = yes \ || test $gl_cv_func_frexpl_in_libm = yes; then + save_LIBS="$LIBS" + LIBS="$LIBS $FREXPL_LIBM" + gl_FUNC_FREXPL_WORKS + LIBS="$save_LIBS" + case "$gl_cv_func_frexpl_works" in + *yes) gl_func_frexpl=yes ;; + *) gl_func_frexpl=no; REPLACE_FREXPL=1; FREXPL_LIBM= ;; + esac + else + gl_func_frexpl=no + fi + if test $gl_func_frexpl = yes; then AC_DEFINE([HAVE_FREXPL], 1, [Define if the frexpl() function is available.]) dnl Also check whether it's declared. @@ -45,3 +57,34 @@ AC_DEFUN([gl_FUNC_FREXPL], AC_LIBOBJ([frexpl]) fi ]) + +dnl Test whether frexpl() works also on infinite numbers (this fails e.g. on +dnl IRIX 6.5). +AC_DEFUN([gl_FUNC_FREXPL_WORKS], +[ + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles + AC_CACHE_CHECK([whether frexpl works], [gl_cv_func_frexpl_works], + [ + AC_TRY_RUN([ +#include +int main() +{ + volatile long double x; + /* Test on infinite numbers. */ + { + x = 1.0L / 0.0L; + int exp; + long double y = frexpl (x, &exp); + if (y != x) + return 1; + } + return 0; +}], [gl_cv_func_frexpl_works=yes], [gl_cv_func_frexpl_works=no], + [case "$host_os" in + irix*) gl_cv_func_frexpl_works="guessing no";; + *) gl_cv_func_frexpl_works="guessing yes";; + esac + ]) + ]) +]) diff --git a/m4/math_h.m4 b/m4/math_h.m4 index fb3ea09f2..cc906f643 100644 --- a/m4/math_h.m4 +++ b/m4/math_h.m4 @@ -39,4 +39,5 @@ AC_DEFUN([gl_MATH_H_DEFAULTS], HAVE_DECL_SQRTL=1; AC_SUBST([HAVE_DECL_SQRTL]) HAVE_DECL_TANL=1; AC_SUBST([HAVE_DECL_TANL]) REPLACE_FREXP=0; AC_SUBST([REPLACE_FREXP]) + REPLACE_FREXPL=0; AC_SUBST([REPLACE_FREXPL]) ]) diff --git a/modules/math b/modules/math index 288ab92a0..5c28af7d1 100644 --- a/modules/math +++ b/modules/math @@ -38,6 +38,7 @@ math.h: math_.h -e 's|@''HAVE_DECL_SQRTL''@|$(HAVE_DECL_SQRTL)|g' \ -e 's|@''HAVE_DECL_TANL''@|$(HAVE_DECL_TANL)|g' \ -e 's|@''REPLACE_FREXP''@|$(REPLACE_FREXP)|g' \ + -e 's|@''REPLACE_FREXPL''@|$(REPLACE_FREXPL)|g' \ -e '/definition of GL_LINK_WARNING/r $(LINK_WARNING_H)' \ < $(srcdir)/math_.h; \ } > $@-t -- 2.11.0