Blame gnulib/m4/printf.m4

Packit Service 51e54d
# printf.m4 serial 50
Packit Service 51e54d
dnl Copyright (C) 2003, 2007-2014 Free Software Foundation, Inc.
Packit Service 51e54d
dnl This file is free software; the Free Software Foundation
Packit Service 51e54d
dnl gives unlimited permission to copy and/or distribute it,
Packit Service 51e54d
dnl with or without modifications, as long as this notice is preserved.
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports the 'j', 'z', 't',
Packit Service 51e54d
dnl 'L' size specifiers. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_sizes_c99.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_SIZES_C99],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([gl_AC_HEADER_STDINT_H])
Packit Service 51e54d
  AC_REQUIRE([gl_AC_HEADER_INTTYPES_H])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports size specifiers as in C99],
Packit Service 51e54d
    [gl_cv_func_printf_sizes_c99],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stddef.h>
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
#include <sys/types.h>
Packit Service 51e54d
#if HAVE_STDINT_H_WITH_UINTMAX
Packit Service 51e54d
# include <stdint.h>
Packit Service 51e54d
#endif
Packit Service 51e54d
#if HAVE_INTTYPES_H_WITH_UINTMAX
Packit Service 51e54d
# include <inttypes.h>
Packit Service 51e54d
#endif
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
#if HAVE_STDINT_H_WITH_UINTMAX || HAVE_INTTYPES_H_WITH_UINTMAX
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%ju %d", (uintmax_t) 12345671, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "12345671 33") != 0)
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
#endif
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%zu %d", (size_t) 12345672, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "12345672 33") != 0)
Packit Service 51e54d
    result |= 2;
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%tu %d", (ptrdiff_t) 12345673, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "12345673 33") != 0)
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%Lg %d", (long double) 1.5, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "1.5 33") != 0)
Packit Service 51e54d
    result |= 8;
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_sizes_c99=yes],
Packit Service 51e54d
        [gl_cv_func_printf_sizes_c99=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 5.
Packit Service 51e54d
           freebsd[1-4]*)        gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on OpenBSD >= 3.9.
Packit Service 51e54d
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
Packit Service 51e54d
                                 gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
           openbsd*)             gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Solaris >= 2.10.
Packit Service 51e54d
           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
                                 # Guess yes on NetBSD >= 3.
Packit Service 51e54d
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
Packit Service 51e54d
                                 gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
           netbsd*)              gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports 'long double'
Packit Service 51e54d
dnl arguments together with the 'L' size specifier. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_long_double.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_LONG_DOUBLE],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports 'long double' arguments],
Packit Service 51e54d
    [gl_cv_func_printf_long_double],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[10000];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%Lf %d", 1.75L, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "1.750000 33") != 0)
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%Le %d", 1.75L, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "1.750000e+00 33") != 0)
Packit Service 51e54d
    result |= 2;
Packit Service 51e54d
  buf[0] = '\0';
Packit Service 51e54d
  if (sprintf (buf, "%Lg %d", 1.75L, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "1.75 33") != 0)
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_long_double=yes],
Packit Service 51e54d
        [gl_cv_func_printf_long_double=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
           beos*)        gl_cv_func_printf_long_double="guessing no";;
Packit Service 51e54d
           mingw* | pw*) gl_cv_func_printf_long_double="guessing no";;
Packit Service 51e54d
           *)            gl_cv_func_printf_long_double="guessing yes";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports infinite and NaN
Packit Service 51e54d
dnl 'double' arguments and negative zero arguments in the %f, %e, %g
Packit Service 51e54d
dnl directives. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_infinite.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_INFINITE],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports infinite 'double' arguments],
Packit Service 51e54d
    [gl_cv_func_printf_infinite],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static int
Packit Service 51e54d
strisnan (const char *string, size_t start_index, size_t end_index)
Packit Service 51e54d
{
Packit Service 51e54d
  if (start_index < end_index)
Packit Service 51e54d
    {
Packit Service 51e54d
      if (string[start_index] == '-')
Packit Service 51e54d
        start_index++;
Packit Service 51e54d
      if (start_index + 3 <= end_index
Packit Service 51e54d
          && memcmp (string + start_index, "nan", 3) == 0)
Packit Service 51e54d
        {
Packit Service 51e54d
          start_index += 3;
Packit Service 51e54d
          if (start_index == end_index
Packit Service 51e54d
              || (string[start_index] == '(' && string[end_index - 1] == ')'))
Packit Service 51e54d
            return 1;
Packit Service 51e54d
        }
Packit Service 51e54d
    }
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}
Packit Service 51e54d
static int
Packit Service 51e54d
have_minus_zero ()
Packit Service 51e54d
{
Packit Service 51e54d
  static double plus_zero = 0.0;
Packit Service 51e54d
  double minus_zero = - plus_zero;
Packit Service 51e54d
  return memcmp (&plus_zero, &minus_zero, sizeof (double)) != 0;
Packit Service 51e54d
}
Packit Service 51e54d
static char buf[10000];
Packit Service 51e54d
static double zero = 0.0;
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
  if (sprintf (buf, "%f", 1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%f", -1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%f", zero / zero) < 0
Packit Service 51e54d
      || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
    result |= 2;
Packit Service 51e54d
  if (sprintf (buf, "%e", 1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  if (sprintf (buf, "%e", -1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  if (sprintf (buf, "%e", zero / zero) < 0
Packit Service 51e54d
      || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
    result |= 8;
Packit Service 51e54d
  if (sprintf (buf, "%g", 1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
Packit Service 51e54d
    result |= 16;
Packit Service 51e54d
  if (sprintf (buf, "%g", -1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
Packit Service 51e54d
    result |= 16;
Packit Service 51e54d
  if (sprintf (buf, "%g", zero / zero) < 0
Packit Service 51e54d
      || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
    result |= 32;
Packit Service 51e54d
  /* This test fails on HP-UX 10.20.  */
Packit Service 51e54d
  if (have_minus_zero ())
Packit Service 51e54d
    if (sprintf (buf, "%g", - zero) < 0
Packit Service 51e54d
        || strcmp (buf, "-0") != 0)
Packit Service 51e54d
    result |= 64;
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_infinite=yes],
Packit Service 51e54d
        [gl_cv_func_printf_infinite=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_printf_infinite="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 6.
Packit Service 51e54d
           freebsd[1-5]*)        gl_cv_func_printf_infinite="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_printf_infinite="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_printf_infinite="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_printf_infinite="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on HP-UX >= 11.
Packit Service 51e54d
           hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite="guessing no";;
Packit Service 51e54d
           hpux*)                gl_cv_func_printf_infinite="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on NetBSD >= 3.
Packit Service 51e54d
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
Packit Service 51e54d
                                 gl_cv_func_printf_infinite="guessing no";;
Packit Service 51e54d
           netbsd*)              gl_cv_func_printf_infinite="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on BeOS.
Packit Service 51e54d
           beos*)                gl_cv_func_printf_infinite="guessing yes";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_printf_infinite="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports infinite and NaN
Packit Service 51e54d
dnl 'long double' arguments in the %f, %e, %g directives. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_infinite_long_double.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_INFINITE_LONG_DOUBLE],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([gl_PRINTF_LONG_DOUBLE])
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([gl_BIGENDIAN])
Packit Service 51e54d
  AC_REQUIRE([gl_LONG_DOUBLE_VS_DOUBLE])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  dnl The user can set or unset the variable gl_printf_safe to indicate
Packit Service 51e54d
  dnl that he wishes a safe handling of non-IEEE-754 'long double' values.
Packit Service 51e54d
  if test -n "$gl_printf_safe"; then
Packit Service 51e54d
    AC_DEFINE([CHECK_PRINTF_SAFE], [1],
Packit Service 51e54d
      [Define if you wish *printf() functions that have a safe handling of
Packit Service 51e54d
       non-IEEE-754 'long double' values.])
Packit Service 51e54d
  fi
Packit Service 51e54d
  case "$gl_cv_func_printf_long_double" in
Packit Service 51e54d
    *yes)
Packit Service 51e54d
      AC_CACHE_CHECK([whether printf supports infinite 'long double' arguments],
Packit Service 51e54d
        [gl_cv_func_printf_infinite_long_double],
Packit Service 51e54d
        [
Packit Service 51e54d
          AC_RUN_IFELSE(
Packit Service 51e54d
            [AC_LANG_SOURCE([[
Packit Service 51e54d
]GL_NOCRASH[
Packit Service 51e54d
#include <float.h>
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static int
Packit Service 51e54d
strisnan (const char *string, size_t start_index, size_t end_index)
Packit Service 51e54d
{
Packit Service 51e54d
  if (start_index < end_index)
Packit Service 51e54d
    {
Packit Service 51e54d
      if (string[start_index] == '-')
Packit Service 51e54d
        start_index++;
Packit Service 51e54d
      if (start_index + 3 <= end_index
Packit Service 51e54d
          && memcmp (string + start_index, "nan", 3) == 0)
Packit Service 51e54d
        {
Packit Service 51e54d
          start_index += 3;
Packit Service 51e54d
          if (start_index == end_index
Packit Service 51e54d
              || (string[start_index] == '(' && string[end_index - 1] == ')'))
Packit Service 51e54d
            return 1;
Packit Service 51e54d
        }
Packit Service 51e54d
    }
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}
Packit Service 51e54d
static char buf[10000];
Packit Service 51e54d
static long double zeroL = 0.0L;
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
  nocrash_init();
Packit Service 51e54d
  if (sprintf (buf, "%Lf", 1.0L / zeroL) < 0
Packit Service 51e54d
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Lf", -1.0L / zeroL) < 0
Packit Service 51e54d
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Lf", zeroL / zeroL) < 0
Packit Service 51e54d
      || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Le", 1.0L / zeroL) < 0
Packit Service 51e54d
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Le", -1.0L / zeroL) < 0
Packit Service 51e54d
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Le", zeroL / zeroL) < 0
Packit Service 51e54d
      || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Lg", 1.0L / zeroL) < 0
Packit Service 51e54d
      || (strcmp (buf, "inf") != 0 && strcmp (buf, "infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Lg", -1.0L / zeroL) < 0
Packit Service 51e54d
      || (strcmp (buf, "-inf") != 0 && strcmp (buf, "-infinity") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%Lg", zeroL / zeroL) < 0
Packit Service 51e54d
      || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
#if CHECK_PRINTF_SAFE && ((defined __ia64 && LDBL_MANT_DIG == 64) || (defined __x86_64__ || defined __amd64__) || (defined __i386 || defined __i386__ || defined _I386 || defined _M_IX86 || defined _X86_)) && !HAVE_SAME_LONG_DOUBLE_AS_DOUBLE
Packit Service 51e54d
/* Representation of an 80-bit 'long double' as an initializer for a sequence
Packit Service 51e54d
   of 'unsigned int' words.  */
Packit Service 51e54d
# ifdef WORDS_BIGENDIAN
Packit Service 51e54d
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
Packit Service 51e54d
     { ((unsigned int) (exponent) << 16) | ((unsigned int) (manthi) >> 16), \
Packit Service 51e54d
       ((unsigned int) (manthi) << 16) | (unsigned int) (mantlo) >> 16),    \
Packit Service 51e54d
       (unsigned int) (mantlo) << 16                                        \
Packit Service 51e54d
     }
Packit Service 51e54d
# else
Packit Service 51e54d
#  define LDBL80_WORDS(exponent,manthi,mantlo) \
Packit Service 51e54d
     { mantlo, manthi, exponent }
Packit Service 51e54d
# endif
Packit Service 51e54d
  { /* Quiet NaN.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0xFFFF, 0xC3333333, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
  }
Packit Service 51e54d
  {
Packit Service 51e54d
    /* Signalling NaN.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0xFFFF, 0x83333333, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
  }
Packit Service 51e54d
  { /* Pseudo-NaN.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0xFFFF, 0x40000001, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 4;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 4;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 4;
Packit Service 51e54d
  }
Packit Service 51e54d
  { /* Pseudo-Infinity.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0xFFFF, 0x00000000, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 8;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 8;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 8;
Packit Service 51e54d
  }
Packit Service 51e54d
  { /* Pseudo-Zero.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0x4004, 0x00000000, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 16;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 16;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 16;
Packit Service 51e54d
  }
Packit Service 51e54d
  { /* Unnormalized number.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0x4000, 0x63333333, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 32;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 32;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 32;
Packit Service 51e54d
  }
Packit Service 51e54d
  { /* Pseudo-Denormal.  */
Packit Service 51e54d
    static union { unsigned int word[4]; long double value; } x =
Packit Service 51e54d
      { LDBL80_WORDS (0x0000, 0x83333333, 0x00000000) };
Packit Service 51e54d
    if (sprintf (buf, "%Lf", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 64;
Packit Service 51e54d
    if (sprintf (buf, "%Le", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 64;
Packit Service 51e54d
    if (sprintf (buf, "%Lg", x.value) < 0
Packit Service 51e54d
        || !strisnan (buf, 0, strlen (buf)))
Packit Service 51e54d
      result |= 64;
Packit Service 51e54d
  }
Packit Service 51e54d
#endif
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
            [gl_cv_func_printf_infinite_long_double=yes],
Packit Service 51e54d
            [gl_cv_func_printf_infinite_long_double=no],
Packit Service 51e54d
            [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
             case "$host_cpu" in
Packit Service 51e54d
                                     # Guess no on ia64, x86_64, i386.
Packit Service 51e54d
               ia64 | x86_64 | i*86) gl_cv_func_printf_infinite_long_double="guessing no";;
Packit Service 51e54d
               *)
Packit Service 51e54d
                 case "$host_os" in
Packit Service 51e54d
                                         # Guess yes on glibc systems.
Packit Service 51e54d
                   *-gnu*)               gl_cv_func_printf_infinite_long_double="guessing yes";;
Packit Service 51e54d
                                         # Guess yes on FreeBSD >= 6.
Packit Service 51e54d
                   freebsd[1-5]*)        gl_cv_func_printf_infinite_long_double="guessing no";;
Packit Service 51e54d
                   freebsd* | kfreebsd*) gl_cv_func_printf_infinite_long_double="guessing yes";;
Packit Service 51e54d
                                         # Guess yes on HP-UX >= 11.
Packit Service 51e54d
                   hpux[7-9]* | hpux10*) gl_cv_func_printf_infinite_long_double="guessing no";;
Packit Service 51e54d
                   hpux*)                gl_cv_func_printf_infinite_long_double="guessing yes";;
Packit Service 51e54d
                                         # If we don't know, assume the worst.
Packit Service 51e54d
                   *)                    gl_cv_func_printf_infinite_long_double="guessing no";;
Packit Service 51e54d
                 esac
Packit Service 51e54d
                 ;;
Packit Service 51e54d
             esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
            ])
Packit Service 51e54d
        ])
Packit Service 51e54d
      ;;
Packit Service 51e54d
    *)
Packit Service 51e54d
      gl_cv_func_printf_infinite_long_double="irrelevant"
Packit Service 51e54d
      ;;
Packit Service 51e54d
  esac
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports the 'a' and 'A'
Packit Service 51e54d
dnl conversion specifier for hexadecimal output of floating-point numbers.
Packit Service 51e54d
dnl (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_directive_a.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_DIRECTIVE_A],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the 'a' and 'A' directives],
Packit Service 51e54d
    [gl_cv_func_printf_directive_a],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
static double zero = 0.0;
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
  if (sprintf (buf, "%a %d", 3.1416015625, 33, 44, 55) < 0
Packit Service 51e54d
      || (strcmp (buf, "0x1.922p+1 33") != 0
Packit Service 51e54d
          && strcmp (buf, "0x3.244p+0 33") != 0
Packit Service 51e54d
          && strcmp (buf, "0x6.488p-1 33") != 0
Packit Service 51e54d
          && strcmp (buf, "0xc.91p-2 33") != 0))
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%A %d", -3.1416015625, 33, 44, 55) < 0
Packit Service 51e54d
      || (strcmp (buf, "-0X1.922P+1 33") != 0
Packit Service 51e54d
          && strcmp (buf, "-0X3.244P+0 33") != 0
Packit Service 51e54d
          && strcmp (buf, "-0X6.488P-1 33") != 0
Packit Service 51e54d
          && strcmp (buf, "-0XC.91P-2 33") != 0))
Packit Service 51e54d
    result |= 2;
Packit Service 51e54d
  /* This catches a FreeBSD 6.1 bug: it doesn't round.  */
Packit Service 51e54d
  if (sprintf (buf, "%.2a %d", 1.51, 33, 44, 55) < 0
Packit Service 51e54d
      || (strcmp (buf, "0x1.83p+0 33") != 0
Packit Service 51e54d
          && strcmp (buf, "0x3.05p-1 33") != 0
Packit Service 51e54d
          && strcmp (buf, "0x6.0ap-2 33") != 0
Packit Service 51e54d
          && strcmp (buf, "0xc.14p-3 33") != 0))
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  /* This catches a FreeBSD 6.1 bug.  See
Packit Service 51e54d
     <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html> */
Packit Service 51e54d
  if (sprintf (buf, "%010a %d", 1.0 / zero, 33, 44, 55) < 0
Packit Service 51e54d
      || buf[0] == '0')
Packit Service 51e54d
    result |= 8;
Packit Service 51e54d
  /* This catches a Mac OS X 10.3.9 (Darwin 7.9) bug.  */
Packit Service 51e54d
  if (sprintf (buf, "%.1a", 1.999) < 0
Packit Service 51e54d
      || (strcmp (buf, "0x1.0p+1") != 0
Packit Service 51e54d
          && strcmp (buf, "0x2.0p+0") != 0
Packit Service 51e54d
          && strcmp (buf, "0x4.0p-1") != 0
Packit Service 51e54d
          && strcmp (buf, "0x8.0p-2") != 0))
Packit Service 51e54d
    result |= 16;
Packit Service 51e54d
  /* This catches the same Mac OS X 10.3.9 (Darwin 7.9) bug and also a
Packit Service 51e54d
     glibc 2.4 bug <http://sourceware.org/bugzilla/show_bug.cgi?id=2908>.  */
Packit Service 51e54d
  if (sprintf (buf, "%.1La", 1.999L) < 0
Packit Service 51e54d
      || (strcmp (buf, "0x1.0p+1") != 0
Packit Service 51e54d
          && strcmp (buf, "0x2.0p+0") != 0
Packit Service 51e54d
          && strcmp (buf, "0x4.0p-1") != 0
Packit Service 51e54d
          && strcmp (buf, "0x8.0p-2") != 0))
Packit Service 51e54d
    result |= 32;
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_directive_a=yes],
Packit Service 51e54d
        [gl_cv_func_printf_directive_a=no],
Packit Service 51e54d
        [
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc >= 2.5 systems.
Packit Service 51e54d
           *-gnu*)
Packit Service 51e54d
             AC_EGREP_CPP([BZ2908], [
Packit Service 51e54d
               #include <features.h>
Packit Service 51e54d
               #ifdef __GNU_LIBRARY__
Packit Service 51e54d
                #if ((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 5) || (__GLIBC__ > 2)) && !defined __UCLIBC__
Packit Service 51e54d
                 BZ2908
Packit Service 51e54d
                #endif
Packit Service 51e54d
               #endif
Packit Service 51e54d
               ],
Packit Service 51e54d
               [gl_cv_func_printf_directive_a="guessing yes"],
Packit Service 51e54d
               [gl_cv_func_printf_directive_a="guessing no"])
Packit Service 51e54d
             ;;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_printf_directive_a="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports the %F format
Packit Service 51e54d
dnl directive. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_directive_f.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_DIRECTIVE_F],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the 'F' directive],
Packit Service 51e54d
    [gl_cv_func_printf_directive_f],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
static double zero = 0.0;
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
  if (sprintf (buf, "%F %d", 1234567.0, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "1234567.000000 33") != 0)
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%F", 1.0 / zero) < 0
Packit Service 51e54d
      || (strcmp (buf, "INF") != 0 && strcmp (buf, "INFINITY") != 0))
Packit Service 51e54d
    result |= 2;
Packit Service 51e54d
  /* This catches a Cygwin 1.5.x bug.  */
Packit Service 51e54d
  if (sprintf (buf, "%.F", 1234.0) < 0
Packit Service 51e54d
      || strcmp (buf, "1234") != 0)
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_directive_f=yes],
Packit Service 51e54d
        [gl_cv_func_printf_directive_f=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_printf_directive_f="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 6.
Packit Service 51e54d
           freebsd[1-5]*)        gl_cv_func_printf_directive_f="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_printf_directive_f="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_printf_directive_f="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_printf_directive_f="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Solaris >= 2.10.
Packit Service 51e54d
           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_printf_directive_f="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports the %n format
Packit Service 51e54d
dnl directive. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_directive_n.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_DIRECTIVE_N],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the 'n' directive],
Packit Service 51e54d
    [gl_cv_func_printf_directive_n],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <stdlib.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
#ifdef _MSC_VER
Packit Service 51e54d
/* See page about "Parameter Validation" on msdn.microsoft.com.  */
Packit Service 51e54d
static void cdecl
Packit Service 51e54d
invalid_parameter_handler (const wchar_t *expression,
Packit Service 51e54d
                           const wchar_t *function,
Packit Service 51e54d
                           const wchar_t *file, unsigned int line,
Packit Service 51e54d
                           uintptr_t dummy)
Packit Service 51e54d
{
Packit Service 51e54d
  exit (1);
Packit Service 51e54d
}
Packit Service 51e54d
#endif
Packit Service 51e54d
static char fmtstring[10];
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int count = -1;
Packit Service 51e54d
#ifdef _MSC_VER
Packit Service 51e54d
  _set_invalid_parameter_handler (invalid_parameter_handler);
Packit Service 51e54d
#endif
Packit Service 51e54d
  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
Packit Service 51e54d
     support %n in format strings in read-only memory but not in writable
Packit Service 51e54d
     memory.  */
Packit Service 51e54d
  strcpy (fmtstring, "%d %n");
Packit Service 51e54d
  if (sprintf (buf, fmtstring, 123, &count, 33, 44, 55) < 0
Packit Service 51e54d
      || strcmp (buf, "123 ") != 0
Packit Service 51e54d
      || count != 4)
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_directive_n=yes],
Packit Service 51e54d
        [gl_cv_func_printf_directive_n=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
           mingw*) gl_cv_func_printf_directive_n="guessing no";;
Packit Service 51e54d
           *)      gl_cv_func_printf_directive_n="guessing yes";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports the %ls format
Packit Service 51e54d
dnl directive and in particular, when a precision is specified, whether
Packit Service 51e54d
dnl the functions stop converting the wide string argument when the number
Packit Service 51e54d
dnl of bytes that have been produced by this conversion equals or exceeds
Packit Service 51e54d
dnl the precision.
Packit Service 51e54d
dnl Result is gl_cv_func_printf_directive_ls.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_DIRECTIVE_LS],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the 'ls' directive],
Packit Service 51e54d
    [gl_cv_func_printf_directive_ls],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
/* Tru64 with Desktop Toolkit C has a bug: <stdio.h> must be included before
Packit Service 51e54d
   <wchar.h>.
Packit Service 51e54d
   BSD/OS 4.0.1 has a bug: <stddef.h>, <stdio.h> and <time.h> must be
Packit Service 51e54d
   included before <wchar.h>.  */
Packit Service 51e54d
#include <stddef.h>
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <time.h>
Packit Service 51e54d
#include <wchar.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
  char buf[100];
Packit Service 51e54d
  /* Test whether %ls works at all.
Packit Service 51e54d
     This test fails on OpenBSD 4.0, IRIX 6.5, Solaris 2.6, Haiku, but not on
Packit Service 51e54d
     Cygwin 1.5.  */
Packit Service 51e54d
  {
Packit Service 51e54d
    static const wchar_t wstring[] = { 'a', 'b', 'c', 0 };
Packit Service 51e54d
    buf[0] = '\0';
Packit Service 51e54d
    if (sprintf (buf, "%ls", wstring) < 0
Packit Service 51e54d
        || strcmp (buf, "abc") != 0)
Packit Service 51e54d
      result |= 1;
Packit Service 51e54d
  }
Packit Service 51e54d
  /* This test fails on IRIX 6.5, Solaris 2.6, Cygwin 1.5, Haiku (with an
Packit Service 51e54d
     assertion failure inside libc), but not on OpenBSD 4.0.  */
Packit Service 51e54d
  {
Packit Service 51e54d
    static const wchar_t wstring[] = { 'a', 0 };
Packit Service 51e54d
    buf[0] = '\0';
Packit Service 51e54d
    if (sprintf (buf, "%ls", wstring) < 0
Packit Service 51e54d
        || strcmp (buf, "a") != 0)
Packit Service 51e54d
      result |= 2;
Packit Service 51e54d
  }
Packit Service 51e54d
  /* Test whether precisions in %ls are supported as specified in ISO C 99
Packit Service 51e54d
     section 7.19.6.1:
Packit Service 51e54d
       "If a precision is specified, no more than that many bytes are written
Packit Service 51e54d
        (including shift sequences, if any), and the array shall contain a
Packit Service 51e54d
        null wide character if, to equal the multibyte character sequence
Packit Service 51e54d
        length given by the precision, the function would need to access a
Packit Service 51e54d
        wide character one past the end of the array."
Packit Service 51e54d
     This test fails on Solaris 10.  */
Packit Service 51e54d
  {
Packit Service 51e54d
    static const wchar_t wstring[] = { 'a', 'b', (wchar_t) 0xfdfdfdfd, 0 };
Packit Service 51e54d
    buf[0] = '\0';
Packit Service 51e54d
    if (sprintf (buf, "%.2ls", wstring) < 0
Packit Service 51e54d
        || strcmp (buf, "ab") != 0)
Packit Service 51e54d
      result |= 8;
Packit Service 51e54d
  }
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_directive_ls=yes],
Packit Service 51e54d
        [gl_cv_func_printf_directive_ls=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
           openbsd*)        gl_cv_func_printf_directive_ls="guessing no";;
Packit Service 51e54d
           irix*)           gl_cv_func_printf_directive_ls="guessing no";;
Packit Service 51e54d
           solaris*)        gl_cv_func_printf_directive_ls="guessing no";;
Packit Service 51e54d
           cygwin*)         gl_cv_func_printf_directive_ls="guessing no";;
Packit Service 51e54d
           beos* | haiku*)  gl_cv_func_printf_directive_ls="guessing no";;
Packit Service 51e54d
           *)               gl_cv_func_printf_directive_ls="guessing yes";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports POSIX/XSI format
Packit Service 51e54d
dnl strings with positions. (POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_positions.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_POSITIONS],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports POSIX/XSI format strings with positions],
Packit Service 51e54d
    [gl_cv_func_printf_positions],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
/* The string "%2$d %1$d", with dollar characters protected from the shell's
Packit Service 51e54d
   dollar expansion (possibly an autoconf bug).  */
Packit Service 51e54d
static char format[] = { '%', '2', '$', 'd', ' ', '%', '1', '$', 'd', '\0' };
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  sprintf (buf, format, 33, 55);
Packit Service 51e54d
  return (strcmp (buf, "55 33") != 0);
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_positions=yes],
Packit Service 51e54d
        [gl_cv_func_printf_positions=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
           netbsd[1-3]* | netbsdelf[1-3]* | netbsdaout[1-3]* | netbsdcoff[1-3]*)
Packit Service 51e54d
                         gl_cv_func_printf_positions="guessing no";;
Packit Service 51e54d
           beos*)        gl_cv_func_printf_positions="guessing no";;
Packit Service 51e54d
           mingw* | pw*) gl_cv_func_printf_positions="guessing no";;
Packit Service 51e54d
           *)            gl_cv_func_printf_positions="guessing yes";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports POSIX/XSI format
Packit Service 51e54d
dnl strings with the ' flag for grouping of decimal digits. (POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_printf_flag_grouping.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_FLAG_GROUPING],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the grouping flag],
Packit Service 51e54d
    [gl_cv_func_printf_flag_grouping],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  if (sprintf (buf, "%'d %d", 1234567, 99) < 0
Packit Service 51e54d
      || buf[strlen (buf) - 1] != '9')
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_flag_grouping=yes],
Packit Service 51e54d
        [gl_cv_func_printf_flag_grouping=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
           cygwin*)      gl_cv_func_printf_flag_grouping="guessing no";;
Packit Service 51e54d
           netbsd*)      gl_cv_func_printf_flag_grouping="guessing no";;
Packit Service 51e54d
           mingw* | pw*) gl_cv_func_printf_flag_grouping="guessing no";;
Packit Service 51e54d
           *)            gl_cv_func_printf_flag_grouping="guessing yes";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports the - flag correctly.
Packit Service 51e54d
dnl (ISO C99.) See
Packit Service 51e54d
dnl <http://lists.gnu.org/archive/html/bug-coreutils/2008-02/msg00035.html>
Packit Service 51e54d
dnl Result is gl_cv_func_printf_flag_leftadjust.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_FLAG_LEFTADJUST],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the left-adjust flag correctly],
Packit Service 51e54d
    [gl_cv_func_printf_flag_leftadjust],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  /* Check that a '-' flag is not annihilated by a negative width.  */
Packit Service 51e54d
  if (sprintf (buf, "a%-*sc", -3, "b") < 0
Packit Service 51e54d
      || strcmp (buf, "ab  c") != 0)
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_flag_leftadjust=yes],
Packit Service 51e54d
        [gl_cv_func_printf_flag_leftadjust=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                    # Guess yes on HP-UX 11.
Packit Service 51e54d
           hpux11*) gl_cv_func_printf_flag_leftadjust="guessing yes";;
Packit Service 51e54d
                    # Guess no on HP-UX 10 and older.
Packit Service 51e54d
           hpux*)   gl_cv_func_printf_flag_leftadjust="guessing no";;
Packit Service 51e54d
                    # Guess yes otherwise.
Packit Service 51e54d
           *)       gl_cv_func_printf_flag_leftadjust="guessing yes";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports padding of non-finite
Packit Service 51e54d
dnl values with the 0 flag correctly. (ISO C99 + TC1 + TC2.) See
Packit Service 51e54d
dnl <http://lists.gnu.org/archive/html/bug-gnulib/2007-04/msg00107.html>
Packit Service 51e54d
dnl Result is gl_cv_func_printf_flag_zero.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_FLAG_ZERO],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports the zero flag correctly],
Packit Service 51e54d
    [gl_cv_func_printf_flag_zero],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
static double zero = 0.0;
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  if (sprintf (buf, "%010f", 1.0 / zero, 33, 44, 55) < 0
Packit Service 51e54d
      || (strcmp (buf, "       inf") != 0
Packit Service 51e54d
          && strcmp (buf, "  infinity") != 0))
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_flag_zero=yes],
Packit Service 51e54d
        [gl_cv_func_printf_flag_zero=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                   # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*) gl_cv_func_printf_flag_zero="guessing yes";;
Packit Service 51e54d
                   # Guess yes on BeOS.
Packit Service 51e54d
           beos*)  gl_cv_func_printf_flag_zero="guessing yes";;
Packit Service 51e54d
                   # If we don't know, assume the worst.
Packit Service 51e54d
           *)      gl_cv_func_printf_flag_zero="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions supports large precisions.
Packit Service 51e54d
dnl On mingw, precisions larger than 512 are treated like 512, in integer,
Packit Service 51e54d
dnl floating-point or pointer output. On Solaris 10/x86, precisions larger
Packit Service 51e54d
dnl than 510 in floating-point output crash the program. On Solaris 10/SPARC,
Packit Service 51e54d
dnl precisions larger than 510 in floating-point output yield wrong results.
Packit Service 51e54d
dnl On AIX 7.1, precisions larger than 998 in floating-point output yield
Packit Service 51e54d
dnl wrong results. On BeOS, precisions larger than 1044 crash the program.
Packit Service 51e54d
dnl Result is gl_cv_func_printf_precision.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_PRECISION],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf supports large precisions],
Packit Service 51e54d
    [gl_cv_func_printf_precision],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
static char buf[5000];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int result = 0;
Packit Service 51e54d
#ifdef __BEOS__
Packit Service 51e54d
  /* On BeOS, this would crash and show a dialog box.  Avoid the crash.  */
Packit Service 51e54d
  return 1;
Packit Service 51e54d
#endif
Packit Service 51e54d
  if (sprintf (buf, "%.4000d %d", 1, 33, 44) < 4000 + 3)
Packit Service 51e54d
    result |= 1;
Packit Service 51e54d
  if (sprintf (buf, "%.4000f %d", 1.0, 33, 44) < 4000 + 5)
Packit Service 51e54d
    result |= 2;
Packit Service 51e54d
  if (sprintf (buf, "%.511f %d", 1.0, 33, 44) < 511 + 5
Packit Service 51e54d
      || buf[0] != '1')
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  if (sprintf (buf, "%.999f %d", 1.0, 33, 44) < 999 + 5
Packit Service 51e54d
      || buf[0] != '1')
Packit Service 51e54d
    result |= 4;
Packit Service 51e54d
  return result;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_printf_precision=yes],
Packit Service 51e54d
        [gl_cv_func_printf_precision=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
           # Guess no only on Solaris, native Windows, and BeOS systems.
Packit Service 51e54d
           solaris*)     gl_cv_func_printf_precision="guessing no" ;;
Packit Service 51e54d
           mingw* | pw*) gl_cv_func_printf_precision="guessing no" ;;
Packit Service 51e54d
           beos*)        gl_cv_func_printf_precision="guessing no" ;;
Packit Service 51e54d
           *)            gl_cv_func_printf_precision="guessing yes" ;;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the *printf family of functions recovers gracefully in case
Packit Service 51e54d
dnl of an out-of-memory condition, or whether it crashes the entire program.
Packit Service 51e54d
dnl Result is gl_cv_func_printf_enomem.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_PRINTF_ENOMEM],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([gl_MULTIARCH])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether printf survives out-of-memory conditions],
Packit Service 51e54d
    [gl_cv_func_printf_enomem],
Packit Service 51e54d
    [
Packit Service 51e54d
      gl_cv_func_printf_enomem="guessing no"
Packit Service 51e54d
      if test "$cross_compiling" = no; then
Packit Service 51e54d
        if test $APPLE_UNIVERSAL_BUILD = 0; then
Packit Service 51e54d
          AC_LANG_CONFTEST([AC_LANG_SOURCE([
Packit Service 51e54d
]GL_NOCRASH[
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <sys/types.h>
Packit Service 51e54d
#include <sys/time.h>
Packit Service 51e54d
#include <sys/resource.h>
Packit Service 51e54d
#include <errno.h>
Packit Service 51e54d
int main()
Packit Service 51e54d
{
Packit Service 51e54d
  struct rlimit limit;
Packit Service 51e54d
  int ret;
Packit Service 51e54d
  nocrash_init ();
Packit Service 51e54d
  /* Some printf implementations allocate temporary space with malloc.  */
Packit Service 51e54d
  /* On BSD systems, malloc() is limited by RLIMIT_DATA.  */
Packit Service 51e54d
#ifdef RLIMIT_DATA
Packit Service 51e54d
  if (getrlimit (RLIMIT_DATA, &limit) < 0)
Packit Service 51e54d
    return 77;
Packit Service 51e54d
  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
Packit Service 51e54d
    limit.rlim_max = 5000000;
Packit Service 51e54d
  limit.rlim_cur = limit.rlim_max;
Packit Service 51e54d
  if (setrlimit (RLIMIT_DATA, &limit) < 0)
Packit Service 51e54d
    return 77;
Packit Service 51e54d
#endif
Packit Service 51e54d
  /* On Linux systems, malloc() is limited by RLIMIT_AS.  */
Packit Service 51e54d
#ifdef RLIMIT_AS
Packit Service 51e54d
  if (getrlimit (RLIMIT_AS, &limit) < 0)
Packit Service 51e54d
    return 77;
Packit Service 51e54d
  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
Packit Service 51e54d
    limit.rlim_max = 5000000;
Packit Service 51e54d
  limit.rlim_cur = limit.rlim_max;
Packit Service 51e54d
  if (setrlimit (RLIMIT_AS, &limit) < 0)
Packit Service 51e54d
    return 77;
Packit Service 51e54d
#endif
Packit Service 51e54d
  /* Some printf implementations allocate temporary space on the stack.  */
Packit Service 51e54d
#ifdef RLIMIT_STACK
Packit Service 51e54d
  if (getrlimit (RLIMIT_STACK, &limit) < 0)
Packit Service 51e54d
    return 77;
Packit Service 51e54d
  if (limit.rlim_max == RLIM_INFINITY || limit.rlim_max > 5000000)
Packit Service 51e54d
    limit.rlim_max = 5000000;
Packit Service 51e54d
  limit.rlim_cur = limit.rlim_max;
Packit Service 51e54d
  if (setrlimit (RLIMIT_STACK, &limit) < 0)
Packit Service 51e54d
    return 77;
Packit Service 51e54d
#endif
Packit Service 51e54d
  ret = printf ("%.5000000f", 1.0);
Packit Service 51e54d
  return !(ret == 5000002 || (ret < 0 && errno == ENOMEM));
Packit Service 51e54d
}
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
          ])])
Packit Service 51e54d
          if AC_TRY_EVAL([ac_link]) && test -s conftest$ac_exeext; then
Packit Service 51e54d
            (./conftest 2>&AS_MESSAGE_LOG_FD
Packit Service 51e54d
             result=$?
Packit Service 51e54d
             _AS_ECHO_LOG([\$? = $result])
Packit Service 51e54d
             if test $result != 0 && test $result != 77; then result=1; fi
Packit Service 51e54d
             exit $result
Packit Service 51e54d
            ) >/dev/null 2>/dev/null
Packit Service 51e54d
            case $? in
Packit Service 51e54d
              0) gl_cv_func_printf_enomem="yes" ;;
Packit Service 51e54d
              77) gl_cv_func_printf_enomem="guessing no" ;;
Packit Service 51e54d
              *) gl_cv_func_printf_enomem="no" ;;
Packit Service 51e54d
            esac
Packit Service 51e54d
          else
Packit Service 51e54d
            gl_cv_func_printf_enomem="guessing no"
Packit Service 51e54d
          fi
Packit Service 51e54d
          rm -fr conftest*
Packit Service 51e54d
        else
Packit Service 51e54d
          dnl A universal build on Apple Mac OS X platforms.
Packit Service 51e54d
          dnl The result would be 'no' in 32-bit mode and 'yes' in 64-bit mode.
Packit Service 51e54d
          dnl But we need a configuration result that is valid in both modes.
Packit Service 51e54d
          gl_cv_func_printf_enomem="guessing no"
Packit Service 51e54d
        fi
Packit Service 51e54d
      fi
Packit Service 51e54d
      if test "$gl_cv_func_printf_enomem" = "guessing no"; then
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
        case "$host_os" in
Packit Service 51e54d
                    # Guess yes on glibc systems.
Packit Service 51e54d
          *-gnu*)   gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # Guess yes on Solaris.
Packit Service 51e54d
          solaris*) gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # Guess yes on AIX.
Packit Service 51e54d
          aix*)     gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # Guess yes on HP-UX/hppa.
Packit Service 51e54d
          hpux*)    case "$host_cpu" in
Packit Service 51e54d
                      hppa*) gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                      *)     gl_cv_func_printf_enomem="guessing no";;
Packit Service 51e54d
                    esac
Packit Service 51e54d
                    ;;
Packit Service 51e54d
                    # Guess yes on IRIX.
Packit Service 51e54d
          irix*)    gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # Guess yes on OSF/1.
Packit Service 51e54d
          osf*)     gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # Guess yes on BeOS.
Packit Service 51e54d
          beos*)    gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # Guess yes on Haiku.
Packit Service 51e54d
          haiku*)   gl_cv_func_printf_enomem="guessing yes";;
Packit Service 51e54d
                    # If we don't know, assume the worst.
Packit Service 51e54d
          *)        gl_cv_func_printf_enomem="guessing no";;
Packit Service 51e54d
        esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
      fi
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the snprintf function exists. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is ac_cv_func_snprintf.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_SNPRINTF_PRESENCE],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_CHECK_FUNCS_ONCE([snprintf])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the string produced by the snprintf function is always NUL
Packit Service 51e54d
dnl terminated. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_snprintf_truncation_c99.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_SNPRINTF_TRUNCATION_C99],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_REQUIRE([gl_SNPRINTF_PRESENCE])
Packit Service 51e54d
  AC_CACHE_CHECK([whether snprintf truncates the result as in C99],
Packit Service 51e54d
    [gl_cv_func_snprintf_truncation_c99],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
#if HAVE_SNPRINTF
Packit Service 51e54d
# define my_snprintf snprintf
Packit Service 51e54d
#else
Packit Service 51e54d
# include <stdarg.h>
Packit Service 51e54d
static int my_snprintf (char *buf, int size, const char *format, ...)
Packit Service 51e54d
{
Packit Service 51e54d
  va_list args;
Packit Service 51e54d
  int ret;
Packit Service 51e54d
  va_start (args, format);
Packit Service 51e54d
  ret = vsnprintf (buf, size, format, args);
Packit Service 51e54d
  va_end (args);
Packit Service 51e54d
  return ret;
Packit Service 51e54d
}
Packit Service 51e54d
#endif
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  strcpy (buf, "ABCDEF");
Packit Service 51e54d
  my_snprintf (buf, 3, "%d %d", 4567, 89);
Packit Service 51e54d
  if (memcmp (buf, "45\0DEF", 6) != 0)
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_snprintf_truncation_c99=yes],
Packit Service 51e54d
        [gl_cv_func_snprintf_truncation_c99=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 5.
Packit Service 51e54d
           freebsd[1-4]*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on OpenBSD >= 3.9.
Packit Service 51e54d
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           openbsd*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Solaris >= 2.6.
Packit Service 51e54d
           solaris2.[0-5] | solaris2.[0-5].*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           solaris*)             gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on AIX >= 4.
Packit Service 51e54d
           aix[1-3]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           aix*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on HP-UX >= 11.
Packit Service 51e54d
           hpux[7-9]* | hpux10*) gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           hpux*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on IRIX >= 6.5.
Packit Service 51e54d
           irix6.5)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on OSF/1 >= 5.
Packit Service 51e54d
           osf[3-4]*)            gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           osf*)                 gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on NetBSD >= 3.
Packit Service 51e54d
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
           netbsd*)              gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on BeOS.
Packit Service 51e54d
           beos*)                gl_cv_func_snprintf_truncation_c99="guessing yes";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_snprintf_truncation_c99="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the return value of the snprintf function is the number
Packit Service 51e54d
dnl of bytes (excluding the terminating NUL) that would have been produced
Packit Service 51e54d
dnl if the buffer had been large enough. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl For example, this test program fails on IRIX 6.5:
Packit Service 51e54d
dnl     ---------------------------------------------------------------------
Packit Service 51e54d
dnl     #include <stdio.h>
Packit Service 51e54d
dnl     int main()
Packit Service 51e54d
dnl     {
Packit Service 51e54d
dnl       static char buf[8];
Packit Service 51e54d
dnl       int retval = snprintf (buf, 3, "%d", 12345);
Packit Service 51e54d
dnl       return retval >= 0 && retval < 3;
Packit Service 51e54d
dnl     }
Packit Service 51e54d
dnl     ---------------------------------------------------------------------
Packit Service 51e54d
dnl Result is gl_cv_func_snprintf_retval_c99.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN_ONCE([gl_SNPRINTF_RETVAL_C99],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_REQUIRE([gl_SNPRINTF_PRESENCE])
Packit Service 51e54d
  AC_CACHE_CHECK([whether snprintf returns a byte count as in C99],
Packit Service 51e54d
    [gl_cv_func_snprintf_retval_c99],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
#if HAVE_SNPRINTF
Packit Service 51e54d
# define my_snprintf snprintf
Packit Service 51e54d
#else
Packit Service 51e54d
# include <stdarg.h>
Packit Service 51e54d
static int my_snprintf (char *buf, int size, const char *format, ...)
Packit Service 51e54d
{
Packit Service 51e54d
  va_list args;
Packit Service 51e54d
  int ret;
Packit Service 51e54d
  va_start (args, format);
Packit Service 51e54d
  ret = vsnprintf (buf, size, format, args);
Packit Service 51e54d
  va_end (args);
Packit Service 51e54d
  return ret;
Packit Service 51e54d
}
Packit Service 51e54d
#endif
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  strcpy (buf, "ABCDEF");
Packit Service 51e54d
  if (my_snprintf (buf, 3, "%d %d", 4567, 89) != 7)
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  if (my_snprintf (buf, 0, "%d %d", 4567, 89) != 7)
Packit Service 51e54d
    return 2;
Packit Service 51e54d
  if (my_snprintf (NULL, 0, "%d %d", 4567, 89) != 7)
Packit Service 51e54d
    return 3;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_snprintf_retval_c99=yes],
Packit Service 51e54d
        [gl_cv_func_snprintf_retval_c99=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 5.
Packit Service 51e54d
           freebsd[1-4]*)        gl_cv_func_snprintf_retval_c99="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_snprintf_retval_c99="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on OpenBSD >= 3.9.
Packit Service 51e54d
           openbsd[1-2].* | openbsd3.[0-8] | openbsd3.[0-8].*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_retval_c99="guessing no";;
Packit Service 51e54d
           openbsd*)             gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Solaris >= 2.10.
Packit Service 51e54d
           solaris2.[1-9][0-9]*) gl_cv_func_printf_sizes_c99="guessing yes";;
Packit Service 51e54d
           solaris*)             gl_cv_func_printf_sizes_c99="guessing no";;
Packit Service 51e54d
                                 # Guess yes on AIX >= 4.
Packit Service 51e54d
           aix[1-3]*)            gl_cv_func_snprintf_retval_c99="guessing no";;
Packit Service 51e54d
           aix*)                 gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on NetBSD >= 3.
Packit Service 51e54d
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_retval_c99="guessing no";;
Packit Service 51e54d
           netbsd*)              gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on BeOS.
Packit Service 51e54d
           beos*)                gl_cv_func_snprintf_retval_c99="guessing yes";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_snprintf_retval_c99="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the snprintf function supports the %n format directive
Packit Service 51e54d
dnl also in truncated portions of the format string. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl Result is gl_cv_func_snprintf_directive_n.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_SNPRINTF_DIRECTIVE_N],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_REQUIRE([gl_SNPRINTF_PRESENCE])
Packit Service 51e54d
  AC_CACHE_CHECK([whether snprintf fully supports the 'n' directive],
Packit Service 51e54d
    [gl_cv_func_snprintf_directive_n],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#include <string.h>
Packit Service 51e54d
#if HAVE_SNPRINTF
Packit Service 51e54d
# define my_snprintf snprintf
Packit Service 51e54d
#else
Packit Service 51e54d
# include <stdarg.h>
Packit Service 51e54d
static int my_snprintf (char *buf, int size, const char *format, ...)
Packit Service 51e54d
{
Packit Service 51e54d
  va_list args;
Packit Service 51e54d
  int ret;
Packit Service 51e54d
  va_start (args, format);
Packit Service 51e54d
  ret = vsnprintf (buf, size, format, args);
Packit Service 51e54d
  va_end (args);
Packit Service 51e54d
  return ret;
Packit Service 51e54d
}
Packit Service 51e54d
#endif
Packit Service 51e54d
static char fmtstring[10];
Packit Service 51e54d
static char buf[100];
Packit Service 51e54d
int main ()
Packit Service 51e54d
{
Packit Service 51e54d
  int count = -1;
Packit Service 51e54d
  /* Copy the format string.  Some systems (glibc with _FORTIFY_SOURCE=2)
Packit Service 51e54d
     support %n in format strings in read-only memory but not in writable
Packit Service 51e54d
     memory.  */
Packit Service 51e54d
  strcpy (fmtstring, "%d %n");
Packit Service 51e54d
  my_snprintf (buf, 4, fmtstring, 12345, &count, 33, 44, 55);
Packit Service 51e54d
  if (count != 6)
Packit Service 51e54d
    return 1;
Packit Service 51e54d
  return 0;
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_snprintf_directive_n=yes],
Packit Service 51e54d
        [gl_cv_func_snprintf_directive_n=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 5.
Packit Service 51e54d
           freebsd[1-4]*)        gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Solaris >= 2.6.
Packit Service 51e54d
           solaris2.[0-5] | solaris2.[0-5].*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
           solaris*)             gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on AIX >= 4.
Packit Service 51e54d
           aix[1-3]*)            gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
           aix*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on IRIX >= 6.5.
Packit Service 51e54d
           irix6.5)              gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on OSF/1 >= 5.
Packit Service 51e54d
           osf[3-4]*)            gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
           osf*)                 gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on NetBSD >= 3.
Packit Service 51e54d
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
Packit Service 51e54d
                                 gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
           netbsd*)              gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on BeOS.
Packit Service 51e54d
           beos*)                gl_cv_func_snprintf_directive_n="guessing yes";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_snprintf_directive_n="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the snprintf function, when passed a size = 1, writes any
Packit Service 51e54d
dnl output without bounds in this case, behaving like sprintf. This is the
Packit Service 51e54d
dnl case on Linux libc5.
Packit Service 51e54d
dnl Result is gl_cv_func_snprintf_size1.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_SNPRINTF_SIZE1],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([gl_SNPRINTF_PRESENCE])
Packit Service 51e54d
  AC_CACHE_CHECK([whether snprintf respects a size of 1],
Packit Service 51e54d
    [gl_cv_func_snprintf_size1],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
#if HAVE_SNPRINTF
Packit Service 51e54d
# define my_snprintf snprintf
Packit Service 51e54d
#else
Packit Service 51e54d
# include <stdarg.h>
Packit Service 51e54d
static int my_snprintf (char *buf, int size, const char *format, ...)
Packit Service 51e54d
{
Packit Service 51e54d
  va_list args;
Packit Service 51e54d
  int ret;
Packit Service 51e54d
  va_start (args, format);
Packit Service 51e54d
  ret = vsnprintf (buf, size, format, args);
Packit Service 51e54d
  va_end (args);
Packit Service 51e54d
  return ret;
Packit Service 51e54d
}
Packit Service 51e54d
#endif
Packit Service 51e54d
int main()
Packit Service 51e54d
{
Packit Service 51e54d
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
Packit Service 51e54d
  my_snprintf (buf, 1, "%d", 12345);
Packit Service 51e54d
  return buf[1] != 'E';
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_snprintf_size1=yes],
Packit Service 51e54d
        [gl_cv_func_snprintf_size1=no],
Packit Service 51e54d
        [gl_cv_func_snprintf_size1="guessing yes"])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl Test whether the vsnprintf function, when passed a zero size, produces no
Packit Service 51e54d
dnl output. (ISO C99, POSIX:2001)
Packit Service 51e54d
dnl For example, snprintf nevertheless writes a NUL byte in this case
Packit Service 51e54d
dnl on OSF/1 5.1:
Packit Service 51e54d
dnl     ---------------------------------------------------------------------
Packit Service 51e54d
dnl     #include <stdio.h>
Packit Service 51e54d
dnl     int main()
Packit Service 51e54d
dnl     {
Packit Service 51e54d
dnl       static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
Packit Service 51e54d
dnl       snprintf (buf, 0, "%d", 12345);
Packit Service 51e54d
dnl       return buf[0] != 'D';
Packit Service 51e54d
dnl     }
Packit Service 51e54d
dnl     ---------------------------------------------------------------------
Packit Service 51e54d
dnl And vsnprintf writes any output without bounds in this case, behaving like
Packit Service 51e54d
dnl vsprintf, on HP-UX 11 and OSF/1 5.1:
Packit Service 51e54d
dnl     ---------------------------------------------------------------------
Packit Service 51e54d
dnl     #include <stdarg.h>
Packit Service 51e54d
dnl     #include <stdio.h>
Packit Service 51e54d
dnl     static int my_snprintf (char *buf, int size, const char *format, ...)
Packit Service 51e54d
dnl     {
Packit Service 51e54d
dnl       va_list args;
Packit Service 51e54d
dnl       int ret;
Packit Service 51e54d
dnl       va_start (args, format);
Packit Service 51e54d
dnl       ret = vsnprintf (buf, size, format, args);
Packit Service 51e54d
dnl       va_end (args);
Packit Service 51e54d
dnl       return ret;
Packit Service 51e54d
dnl     }
Packit Service 51e54d
dnl     int main()
Packit Service 51e54d
dnl     {
Packit Service 51e54d
dnl       static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
Packit Service 51e54d
dnl       my_snprintf (buf, 0, "%d", 12345);
Packit Service 51e54d
dnl       return buf[0] != 'D';
Packit Service 51e54d
dnl     }
Packit Service 51e54d
dnl     ---------------------------------------------------------------------
Packit Service 51e54d
dnl Result is gl_cv_func_vsnprintf_zerosize_c99.
Packit Service 51e54d
Packit Service 51e54d
AC_DEFUN([gl_VSNPRINTF_ZEROSIZE_C99],
Packit Service 51e54d
[
Packit Service 51e54d
  AC_REQUIRE([AC_PROG_CC])
Packit Service 51e54d
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service 51e54d
  AC_CACHE_CHECK([whether vsnprintf respects a zero size as in C99],
Packit Service 51e54d
    [gl_cv_func_vsnprintf_zerosize_c99],
Packit Service 51e54d
    [
Packit Service 51e54d
      AC_RUN_IFELSE(
Packit Service 51e54d
        [AC_LANG_SOURCE([[
Packit Service 51e54d
#include <stdarg.h>
Packit Service 51e54d
#include <stdio.h>
Packit Service 51e54d
static int my_snprintf (char *buf, int size, const char *format, ...)
Packit Service 51e54d
{
Packit Service 51e54d
  va_list args;
Packit Service 51e54d
  int ret;
Packit Service 51e54d
  va_start (args, format);
Packit Service 51e54d
  ret = vsnprintf (buf, size, format, args);
Packit Service 51e54d
  va_end (args);
Packit Service 51e54d
  return ret;
Packit Service 51e54d
}
Packit Service 51e54d
int main()
Packit Service 51e54d
{
Packit Service 51e54d
  static char buf[8] = { 'D', 'E', 'A', 'D', 'B', 'E', 'E', 'F' };
Packit Service 51e54d
  my_snprintf (buf, 0, "%d", 12345);
Packit Service 51e54d
  return buf[0] != 'D';
Packit Service 51e54d
}]])],
Packit Service 51e54d
        [gl_cv_func_vsnprintf_zerosize_c99=yes],
Packit Service 51e54d
        [gl_cv_func_vsnprintf_zerosize_c99=no],
Packit Service 51e54d
        [
Packit Service 51e54d
changequote(,)dnl
Packit Service 51e54d
         case "$host_os" in
Packit Service 51e54d
                                 # Guess yes on glibc systems.
Packit Service 51e54d
           *-gnu*)               gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on FreeBSD >= 5.
Packit Service 51e54d
           freebsd[1-4]*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
Packit Service 51e54d
           freebsd* | kfreebsd*) gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Mac OS X >= 10.3.
Packit Service 51e54d
           darwin[1-6].*)        gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
Packit Service 51e54d
           darwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Cygwin.
Packit Service 51e54d
           cygwin*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on Solaris >= 2.6.
Packit Service 51e54d
           solaris2.[0-5] | solaris2.[0-5].*)
Packit Service 51e54d
                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
Packit Service 51e54d
           solaris*)             gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on AIX >= 4.
Packit Service 51e54d
           aix[1-3]*)            gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
Packit Service 51e54d
           aix*)                 gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on IRIX >= 6.5.
Packit Service 51e54d
           irix6.5)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on NetBSD >= 3.
Packit Service 51e54d
           netbsd[1-2]* | netbsdelf[1-2]* | netbsdaout[1-2]* | netbsdcoff[1-2]*)
Packit Service 51e54d
                                 gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
Packit Service 51e54d
           netbsd*)              gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on BeOS.
Packit Service 51e54d
           beos*)                gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # Guess yes on mingw.
Packit Service 51e54d
           mingw* | pw*)         gl_cv_func_vsnprintf_zerosize_c99="guessing yes";;
Packit Service 51e54d
                                 # If we don't know, assume the worst.
Packit Service 51e54d
           *)                    gl_cv_func_vsnprintf_zerosize_c99="guessing no";;
Packit Service 51e54d
         esac
Packit Service 51e54d
changequote([,])dnl
Packit Service 51e54d
        ])
Packit Service 51e54d
    ])
Packit Service 51e54d
])
Packit Service 51e54d
Packit Service 51e54d
dnl The results of these tests on various platforms are:
Packit Service 51e54d
dnl
Packit Service 51e54d
dnl 1 = gl_PRINTF_SIZES_C99
Packit Service 51e54d
dnl 2 = gl_PRINTF_LONG_DOUBLE
Packit Service 51e54d
dnl 3 = gl_PRINTF_INFINITE
Packit Service 51e54d
dnl 4 = gl_PRINTF_INFINITE_LONG_DOUBLE
Packit Service 51e54d
dnl 5 = gl_PRINTF_DIRECTIVE_A
Packit Service 51e54d
dnl 6 = gl_PRINTF_DIRECTIVE_F
Packit Service 51e54d
dnl 7 = gl_PRINTF_DIRECTIVE_N
Packit Service 51e54d
dnl 8 = gl_PRINTF_DIRECTIVE_LS
Packit Service 51e54d
dnl 9 = gl_PRINTF_POSITIONS
Packit Service 51e54d
dnl 10 = gl_PRINTF_FLAG_GROUPING
Packit Service 51e54d
dnl 11 = gl_PRINTF_FLAG_LEFTADJUST
Packit Service 51e54d
dnl 12 = gl_PRINTF_FLAG_ZERO
Packit Service 51e54d
dnl 13 = gl_PRINTF_PRECISION
Packit Service 51e54d
dnl 14 = gl_PRINTF_ENOMEM
Packit Service 51e54d
dnl 15 = gl_SNPRINTF_PRESENCE
Packit Service 51e54d
dnl 16 = gl_SNPRINTF_TRUNCATION_C99
Packit Service 51e54d
dnl 17 = gl_SNPRINTF_RETVAL_C99
Packit Service 51e54d
dnl 18 = gl_SNPRINTF_DIRECTIVE_N
Packit Service 51e54d
dnl 19 = gl_SNPRINTF_SIZE1
Packit Service 51e54d
dnl 20 = gl_VSNPRINTF_ZEROSIZE_C99
Packit Service 51e54d
dnl
Packit Service 51e54d
dnl 1 = checking whether printf supports size specifiers as in C99...
Packit Service 51e54d
dnl 2 = checking whether printf supports 'long double' arguments...
Packit Service 51e54d
dnl 3 = checking whether printf supports infinite 'double' arguments...
Packit Service 51e54d
dnl 4 = checking whether printf supports infinite 'long double' arguments...
Packit Service 51e54d
dnl 5 = checking whether printf supports the 'a' and 'A' directives...
Packit Service 51e54d
dnl 6 = checking whether printf supports the 'F' directive...
Packit Service 51e54d
dnl 7 = checking whether printf supports the 'n' directive...
Packit Service 51e54d
dnl 8 = checking whether printf supports the 'ls' directive...
Packit Service 51e54d
dnl 9 = checking whether printf supports POSIX/XSI format strings with positions...
Packit Service 51e54d
dnl 10 = checking whether printf supports the grouping flag...
Packit Service 51e54d
dnl 11 = checking whether printf supports the left-adjust flag correctly...
Packit Service 51e54d
dnl 12 = checking whether printf supports the zero flag correctly...
Packit Service 51e54d
dnl 13 = checking whether printf supports large precisions...
Packit Service 51e54d
dnl 14 = checking whether printf survives out-of-memory conditions...
Packit Service 51e54d
dnl 15 = checking for snprintf...
Packit Service 51e54d
dnl 16 = checking whether snprintf truncates the result as in C99...
Packit Service 51e54d
dnl 17 = checking whether snprintf returns a byte count as in C99...
Packit Service 51e54d
dnl 18 = checking whether snprintf fully supports the 'n' directive...
Packit Service 51e54d
dnl 19 = checking whether snprintf respects a size of 1...
Packit Service 51e54d
dnl 20 = checking whether vsnprintf respects a zero size as in C99...
Packit Service 51e54d
dnl
Packit Service 51e54d
dnl . = yes, # = no.
Packit Service 51e54d
dnl
Packit Service 51e54d
dnl                                  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20
Packit Service 51e54d
dnl   glibc 2.5                      .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   glibc 2.3.6                    .  .  .  .  #  .  .  .  .  .  .  .  .  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   FreeBSD 5.4, 6.1               .  .  .  .  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   Mac OS X 10.5.8                .  .  .  #  #  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   Mac OS X 10.3.9                .  .  .  .  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   OpenBSD 3.9, 4.0               .  .  #  #  #  #  .  #  .  #  .  #  .  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   Cygwin 1.7.0 (2009)            .  .  .  #  .  .  .  ?  .  .  .  .  .  ?  .  .  .  .  .  .
Packit Service 51e54d
dnl   Cygwin 1.5.25 (2008)           .  .  .  #  #  .  .  #  .  .  .  .  .  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   Cygwin 1.5.19 (2006)           #  .  .  #  #  #  .  #  .  #  .  #  #  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   Solaris 11 2011-11             .  .  #  #  #  .  .  #  .  .  .  #  .  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   Solaris 10                     .  .  #  #  #  .  .  #  .  .  .  #  #  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   Solaris 2.6 ... 9              #  .  #  #  #  #  .  #  .  .  .  #  #  .  .  .  #  .  .  .
Packit Service 51e54d
dnl   Solaris 2.5.1                  #  .  #  #  #  #  .  #  .  .  .  #  .  .  #  #  #  #  #  #
Packit Service 51e54d
dnl   AIX 7.1                        .  .  #  #  #  .  .  .  .  .  .  #  #  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   AIX 5.2                        .  .  #  #  #  .  .  .  .  .  .  #  .  .  .  .  .  .  .  .
Packit Service 51e54d
dnl   AIX 4.3.2, 5.1                 #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  .
Packit Service 51e54d
dnl   HP-UX 11.31                    .  .  .  .  #  .  .  .  .  .  .  #  .  .  .  .  #  #  .  .
Packit Service 51e54d
dnl   HP-UX 11.{00,11,23}            #  .  .  .  #  #  .  .  .  .  .  #  .  .  .  .  #  #  .  #
Packit Service 51e54d
dnl   HP-UX 10.20                    #  .  #  .  #  #  .  ?  .  .  #  #  .  .  .  .  #  #  ?  #
Packit Service 51e54d
dnl   IRIX 6.5                       #  .  #  #  #  #  .  #  .  .  .  #  .  .  .  .  #  .  .  .
Packit Service 51e54d
dnl   OSF/1 5.1                      #  .  #  #  #  #  .  .  .  .  .  #  .  .  .  .  #  .  .  #
Packit Service 51e54d
dnl   OSF/1 4.0d                     #  .  #  #  #  #  .  .  .  .  .  #  .  .  #  #  #  #  #  #
Packit Service 51e54d
dnl   NetBSD 5.0                     .  .  .  #  #  .  .  .  .  .  .  #  .  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   NetBSD 4.0                     .  ?  ?  ?  ?  ?  .  ?  .  ?  ?  ?  ?  ?  .  .  .  ?  ?  ?
Packit Service 51e54d
dnl   NetBSD 3.0                     .  .  .  .  #  #  .  ?  #  #  ?  #  .  #  .  .  .  .  .  .
Packit Service 51e54d
dnl   Haiku                          .  .  .  #  #  #  .  #  .  .  .  .  .  ?  .  .  ?  .  .  .
Packit Service 51e54d
dnl   BeOS                           #  #  .  #  #  #  .  ?  #  .  ?  .  #  ?  .  .  ?  .  .  .
Packit Service 51e54d
dnl   old mingw / msvcrt             #  #  #  #  #  #  .  .  #  #  .  #  #  ?  .  #  #  #  .  .
Packit Service 51e54d
dnl   MSVC 9                         #  #  #  #  #  #  #  .  #  #  .  #  #  ?  #  #  #  #  .  .
Packit Service 51e54d
dnl   mingw 2009-2011                .  #  .  #  .  .  .  .  #  #  .  .  .  ?  .  .  .  .  .  .
Packit Service 51e54d
dnl   mingw-w64 2011                 #  #  #  #  #  #  .  .  #  #  .  #  #  ?  .  #  #  #  .  .