view m4/sqrtl.m4 @ 15308:a3ba680ad389

strerror_r: fix OpenBSD behavior on 0 OpenBSD treats strerror_r(0,,) as a success, but with a message "Undefined error: 0"; while this is distinct from strerror_r(-1,,) returning "Unknown error: -1", it does not imply success. Meanwhile, if buf is short enough for ERANGE, then we can't use strstr to look for "Unknown" or "Undefined" in the resulting message, like we had been doing for strerror(). Fix this by shifting the burden - now the strerror-override code guarantees that 0 will have an override when needed. * lib/strerror-override.c (strerror_override): Also override 0 when needed. * lib/strerror-override.h (strerror_override): Likewise. * lib/strerror.c (strerror): Simplify, now that 0 override is done earlier. * lib/strerror_r.c (strerror_r): Likewise. * m4/strerror.m4 (gl_FUNC_STRERROR): Split detection of 0 behavior... (gl_FUNC_STRERROR_0): ...into new macro. * m4/strerror_r.m4 (gl_FUNC_STRERROR_R): Replace strerror_r if 0 is overridden. (gl_FUNC_STRERROR_R_WORKS): Avoid extra tests if 0 is broken. * modules/strerror-override (Files): Add strerror.m4. (configure.ac): Also provide override for 0 when needed. * doc/posix-functions/strerror.texi (strerror): Document this. * doc/posix-functions/perror.texi (perror): Likewise. Signed-off-by: Eric Blake <eblake@redhat.com>
author Eric Blake <eblake@redhat.com>
date Tue, 21 Jun 2011 08:50:51 -0600
parents e36ba7ba51ce
children a87db2cf4571
line wrap: on
line source

# sqrtl.m4 serial 4
dnl Copyright (C) 2010-2011 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_SQRTL],
[
  AC_REQUIRE([gl_MATH_H_DEFAULTS])
  dnl Persuade glibc <math.h> to declare sqrtl().
  AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS])

  SQRTL_LIBM=
  AC_CACHE_CHECK([whether sqrtl() can be used without linking with libm],
    [gl_cv_func_sqrtl_no_libm],
    [
      AC_LINK_IFELSE(
        [AC_LANG_PROGRAM(
           [[#ifndef __NO_MATH_INLINES
             # define __NO_MATH_INLINES 1 /* for glibc */
             #endif
             #include <math.h>
             long double x;]],
           [[return sqrtl (x) > 0.4;]])],
        [gl_cv_func_sqrtl_no_libm=yes],
        [gl_cv_func_sqrtl_no_libm=no])
    ])
  if test $gl_cv_func_sqrtl_no_libm = no; then
    AC_CACHE_CHECK([whether sqrtl() can be used with libm],
      [gl_cv_func_sqrtl_in_libm],
      [
        save_LIBS="$LIBS"
        LIBS="$LIBS -lm"
        AC_LINK_IFELSE(
          [AC_LANG_PROGRAM(
             [[#ifndef __NO_MATH_INLINES
               # define __NO_MATH_INLINES 1 /* for glibc */
               #endif
               #include <math.h>
               long double x;]],
             [[return sqrtl (x) > 0.4;]])],
          [gl_cv_func_sqrtl_in_libm=yes],
          [gl_cv_func_sqrtl_in_libm=no])
        LIBS="$save_LIBS"
      ])
    if test $gl_cv_func_sqrtl_in_libm = yes; then
      SQRTL_LIBM=-lm
    fi
  fi
  if test $gl_cv_func_sqrtl_no_libm = yes \
     || test $gl_cv_func_sqrtl_in_libm = yes; then
    dnl Also check whether it's declared.
    dnl MacOS X 10.3 has sqrtl() in libc but doesn't declare it in <math.h>.
    AC_CHECK_DECL([sqrtl], , [HAVE_DECL_SQRTL=0], [#include <math.h>])
  else
    HAVE_DECL_SQRTL=0
    HAVE_SQRTL=0
    dnl Find libraries needed to link lib/sqrtl.c.
    AC_REQUIRE([gl_FUNC_ISNANL])
    AC_REQUIRE([gl_FUNC_FREXPL])
    AC_REQUIRE([gl_FUNC_LDEXPL])
    AC_REQUIRE([gl_FUNC_SQRT])
    dnl Append $ISNANL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
    case " $SQRTL_LIBM " in
      *" $ISNANL_LIBM "*) ;;
      *) SQRTL_LIBM="$SQRTL_LIBM $ISNANL_LIBM" ;;
    esac
    dnl Append $FREXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
    case " $SQRTL_LIBM " in
      *" $FREXPL_LIBM "*) ;;
      *) SQRTL_LIBM="$SQRTL_LIBM $FREXPL_LIBM" ;;
    esac
    dnl Append $LDEXPL_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
    case " $SQRTL_LIBM " in
      *" $LDEXPL_LIBM "*) ;;
      *) SQRTL_LIBM="$SQRTL_LIBM $LDEXPL_LIBM" ;;
    esac
    dnl Append $SQRT_LIBM to SQRTL_LIBM, avoiding gratuitous duplicates.
    case " $SQRTL_LIBM " in
      *" $SQRT_LIBM "*) ;;
      *) SQRTL_LIBM="$SQRTL_LIBM $SQRT_LIBM" ;;
    esac
  fi
  AC_SUBST([SQRTL_LIBM])
])