Blame m4/iconv.m4

Packit Service c6b9b0
# iconv.m4 serial 19 (gettext-0.18.2)
Packit Service c6b9b0
dnl Copyright (C) 2000-2002, 2007-2014, 2016 Free Software Foundation, Inc.
Packit Service c6b9b0
dnl This file is free software; the Free Software Foundation
Packit Service c6b9b0
dnl gives unlimited permission to copy and/or distribute it,
Packit Service c6b9b0
dnl with or without modifications, as long as this notice is preserved.
Packit Service c6b9b0
Packit Service c6b9b0
dnl From Bruno Haible.
Packit Service c6b9b0
Packit Service c6b9b0
AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
Packit Service c6b9b0
[
Packit Service c6b9b0
  dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
Packit Service c6b9b0
  AC_REQUIRE([AC_LIB_PREPARE_PREFIX])
Packit Service c6b9b0
  AC_REQUIRE([AC_LIB_RPATH])
Packit Service c6b9b0
Packit Service c6b9b0
  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
Packit Service c6b9b0
  dnl accordingly.
Packit Service c6b9b0
  AC_LIB_LINKFLAGS_BODY([iconv])
Packit Service c6b9b0
])
Packit Service c6b9b0
Packit Service c6b9b0
AC_DEFUN([AM_ICONV_LINK],
Packit Service c6b9b0
[
Packit Service c6b9b0
  dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and
Packit Service c6b9b0
  dnl those with the standalone portable GNU libiconv installed).
Packit Service c6b9b0
  AC_REQUIRE([AC_CANONICAL_HOST]) dnl for cross-compiles
Packit Service c6b9b0
Packit Service c6b9b0
  dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV
Packit Service c6b9b0
  dnl accordingly.
Packit Service c6b9b0
  AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY])
Packit Service c6b9b0
Packit Service c6b9b0
  dnl Add $INCICONV to CPPFLAGS before performing the following checks,
Packit Service c6b9b0
  dnl because if the user has installed libiconv and not disabled its use
Packit Service c6b9b0
  dnl via --without-libiconv-prefix, he wants to use it. The first
Packit Service c6b9b0
  dnl AC_LINK_IFELSE will then fail, the second AC_LINK_IFELSE will succeed.
Packit Service c6b9b0
  am_save_CPPFLAGS="$CPPFLAGS"
Packit Service c6b9b0
  AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV])
Packit Service c6b9b0
Packit Service c6b9b0
  AC_CACHE_CHECK([for iconv], [am_cv_func_iconv], [
Packit Service c6b9b0
    am_cv_func_iconv="no, consider installing GNU libiconv"
Packit Service c6b9b0
    am_cv_lib_iconv=no
Packit Service c6b9b0
    AC_LINK_IFELSE(
Packit Service c6b9b0
      [AC_LANG_PROGRAM(
Packit Service c6b9b0
         [[
Packit Service c6b9b0
#include <stdlib.h>
Packit Service c6b9b0
#include <iconv.h>
Packit Service c6b9b0
         ]],
Packit Service c6b9b0
         [[iconv_t cd = iconv_open("","");
Packit Service c6b9b0
           iconv(cd,NULL,NULL,NULL,NULL);
Packit Service c6b9b0
           iconv_close(cd);]])],
Packit Service c6b9b0
      [am_cv_func_iconv=yes])
Packit Service c6b9b0
    if test "$am_cv_func_iconv" != yes; then
Packit Service c6b9b0
      am_save_LIBS="$LIBS"
Packit Service c6b9b0
      LIBS="$LIBS $LIBICONV"
Packit Service c6b9b0
      AC_LINK_IFELSE(
Packit Service c6b9b0
        [AC_LANG_PROGRAM(
Packit Service c6b9b0
           [[
Packit Service c6b9b0
#include <stdlib.h>
Packit Service c6b9b0
#include <iconv.h>
Packit Service c6b9b0
           ]],
Packit Service c6b9b0
           [[iconv_t cd = iconv_open("","");
Packit Service c6b9b0
             iconv(cd,NULL,NULL,NULL,NULL);
Packit Service c6b9b0
             iconv_close(cd);]])],
Packit Service c6b9b0
        [am_cv_lib_iconv=yes]
Packit Service c6b9b0
        [am_cv_func_iconv=yes])
Packit Service c6b9b0
      LIBS="$am_save_LIBS"
Packit Service c6b9b0
    fi
Packit Service c6b9b0
  ])
Packit Service c6b9b0
  if test "$am_cv_func_iconv" = yes; then
Packit Service c6b9b0
    AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
Packit Service c6b9b0
      dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
Packit Service c6b9b0
      dnl Solaris 10.
Packit Service c6b9b0
      am_save_LIBS="$LIBS"
Packit Service c6b9b0
      if test $am_cv_lib_iconv = yes; then
Packit Service c6b9b0
        LIBS="$LIBS $LIBICONV"
Packit Service c6b9b0
      fi
Packit Service c6b9b0
      am_cv_func_iconv_works=no
Packit Service c6b9b0
      for ac_iconv_const in '' 'const'; do
Packit Service c6b9b0
        AC_RUN_IFELSE(
Packit Service c6b9b0
          [AC_LANG_PROGRAM(
Packit Service c6b9b0
             [[
Packit Service c6b9b0
#include <iconv.h>
Packit Service c6b9b0
#include <string.h>
Packit Service c6b9b0
Packit Service c6b9b0
#ifndef ICONV_CONST
Packit Service c6b9b0
# define ICONV_CONST $ac_iconv_const
Packit Service c6b9b0
#endif
Packit Service c6b9b0
             ]],
Packit Service c6b9b0
             [[int result = 0;
Packit Service c6b9b0
  /* Test against AIX 5.1 bug: Failures are not distinguishable from successful
Packit Service c6b9b0
     returns.  */
Packit Service c6b9b0
  {
Packit Service c6b9b0
    iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
Packit Service c6b9b0
    if (cd_utf8_to_88591 != (iconv_t)(-1))
Packit Service c6b9b0
      {
Packit Service c6b9b0
        static ICONV_CONST char input[] = "\342\202\254"; /* EURO SIGN */
Packit Service c6b9b0
        char buf[10];
Packit Service c6b9b0
        ICONV_CONST char *inptr = input;
Packit Service c6b9b0
        size_t inbytesleft = strlen (input);
Packit Service c6b9b0
        char *outptr = buf;
Packit Service c6b9b0
        size_t outbytesleft = sizeof (buf);
Packit Service c6b9b0
        size_t res = iconv (cd_utf8_to_88591,
Packit Service c6b9b0
                            &inptr, &inbytesleft,
Packit Service c6b9b0
                            &outptr, &outbytesleft);
Packit Service c6b9b0
        if (res == 0)
Packit Service c6b9b0
          result |= 1;
Packit Service c6b9b0
        iconv_close (cd_utf8_to_88591);
Packit Service c6b9b0
      }
Packit Service c6b9b0
  }
Packit Service c6b9b0
  /* Test against Solaris 10 bug: Failures are not distinguishable from
Packit Service c6b9b0
     successful returns.  */
Packit Service c6b9b0
  {
Packit Service c6b9b0
    iconv_t cd_ascii_to_88591 = iconv_open ("ISO8859-1", "646");
Packit Service c6b9b0
    if (cd_ascii_to_88591 != (iconv_t)(-1))
Packit Service c6b9b0
      {
Packit Service c6b9b0
        static ICONV_CONST char input[] = "\263";
Packit Service c6b9b0
        char buf[10];
Packit Service c6b9b0
        ICONV_CONST char *inptr = input;
Packit Service c6b9b0
        size_t inbytesleft = strlen (input);
Packit Service c6b9b0
        char *outptr = buf;
Packit Service c6b9b0
        size_t outbytesleft = sizeof (buf);
Packit Service c6b9b0
        size_t res = iconv (cd_ascii_to_88591,
Packit Service c6b9b0
                            &inptr, &inbytesleft,
Packit Service c6b9b0
                            &outptr, &outbytesleft);
Packit Service c6b9b0
        if (res == 0)
Packit Service c6b9b0
          result |= 2;
Packit Service c6b9b0
        iconv_close (cd_ascii_to_88591);
Packit Service c6b9b0
      }
Packit Service c6b9b0
  }
Packit Service c6b9b0
  /* Test against AIX 6.1..7.1 bug: Buffer overrun.  */
Packit Service c6b9b0
  {
Packit Service c6b9b0
    iconv_t cd_88591_to_utf8 = iconv_open ("UTF-8", "ISO-8859-1");
Packit Service c6b9b0
    if (cd_88591_to_utf8 != (iconv_t)(-1))
Packit Service c6b9b0
      {
Packit Service c6b9b0
        static ICONV_CONST char input[] = "\304";
Packit Service c6b9b0
        static char buf[2] = { (char)0xDE, (char)0xAD };
Packit Service c6b9b0
        ICONV_CONST char *inptr = input;
Packit Service c6b9b0
        size_t inbytesleft = 1;
Packit Service c6b9b0
        char *outptr = buf;
Packit Service c6b9b0
        size_t outbytesleft = 1;
Packit Service c6b9b0
        size_t res = iconv (cd_88591_to_utf8,
Packit Service c6b9b0
                            &inptr, &inbytesleft,
Packit Service c6b9b0
                            &outptr, &outbytesleft);
Packit Service c6b9b0
        if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
Packit Service c6b9b0
          result |= 4;
Packit Service c6b9b0
        iconv_close (cd_88591_to_utf8);
Packit Service c6b9b0
      }
Packit Service c6b9b0
  }
Packit Service c6b9b0
#if 0 /* This bug could be worked around by the caller.  */
Packit Service c6b9b0
  /* Test against HP-UX 11.11 bug: Positive return value instead of 0.  */
Packit Service c6b9b0
  {
Packit Service c6b9b0
    iconv_t cd_88591_to_utf8 = iconv_open ("utf8", "iso88591");
Packit Service c6b9b0
    if (cd_88591_to_utf8 != (iconv_t)(-1))
Packit Service c6b9b0
      {
Packit Service c6b9b0
        static ICONV_CONST char input[] = "\304rger mit b\366sen B\374bchen ohne Augenma\337";
Packit Service c6b9b0
        char buf[50];
Packit Service c6b9b0
        ICONV_CONST char *inptr = input;
Packit Service c6b9b0
        size_t inbytesleft = strlen (input);
Packit Service c6b9b0
        char *outptr = buf;
Packit Service c6b9b0
        size_t outbytesleft = sizeof (buf);
Packit Service c6b9b0
        size_t res = iconv (cd_88591_to_utf8,
Packit Service c6b9b0
                            &inptr, &inbytesleft,
Packit Service c6b9b0
                            &outptr, &outbytesleft);
Packit Service c6b9b0
        if ((int)res > 0)
Packit Service c6b9b0
          result |= 8;
Packit Service c6b9b0
        iconv_close (cd_88591_to_utf8);
Packit Service c6b9b0
      }
Packit Service c6b9b0
  }
Packit Service c6b9b0
#endif
Packit Service c6b9b0
  /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
Packit Service c6b9b0
     provided.  */
Packit Service c6b9b0
  if (/* Try standardized names.  */
Packit Service c6b9b0
      iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1)
Packit Service c6b9b0
      /* Try IRIX, OSF/1 names.  */
Packit Service c6b9b0
      && iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1)
Packit Service c6b9b0
      /* Try AIX names.  */
Packit Service c6b9b0
      && iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1)
Packit Service c6b9b0
      /* Try HP-UX names.  */
Packit Service c6b9b0
      && iconv_open ("utf8", "eucJP") == (iconv_t)(-1))
Packit Service c6b9b0
    result |= 16;
Packit Service c6b9b0
  return result;
Packit Service c6b9b0
]])],
Packit Service c6b9b0
          [am_cv_func_iconv_works=yes], ,
Packit Service c6b9b0
          [case "$host_os" in
Packit Service c6b9b0
             aix* | hpux*) am_cv_func_iconv_works="guessing no" ;;
Packit Service c6b9b0
             *)            am_cv_func_iconv_works="guessing yes" ;;
Packit Service c6b9b0
           esac])
Packit Service c6b9b0
        test "$am_cv_func_iconv_works" = no || break
Packit Service c6b9b0
      done
Packit Service c6b9b0
      LIBS="$am_save_LIBS"
Packit Service c6b9b0
    ])
Packit Service c6b9b0
    case "$am_cv_func_iconv_works" in
Packit Service c6b9b0
      *no) am_func_iconv=no am_cv_lib_iconv=no ;;
Packit Service c6b9b0
      *)   am_func_iconv=yes ;;
Packit Service c6b9b0
    esac
Packit Service c6b9b0
  else
Packit Service c6b9b0
    am_func_iconv=no am_cv_lib_iconv=no
Packit Service c6b9b0
  fi
Packit Service c6b9b0
  if test "$am_func_iconv" = yes; then
Packit Service c6b9b0
    AC_DEFINE([HAVE_ICONV], [1],
Packit Service c6b9b0
      [Define if you have the iconv() function and it works.])
Packit Service c6b9b0
  fi
Packit Service c6b9b0
  if test "$am_cv_lib_iconv" = yes; then
Packit Service c6b9b0
    AC_MSG_CHECKING([how to link with libiconv])
Packit Service c6b9b0
    AC_MSG_RESULT([$LIBICONV])
Packit Service c6b9b0
  else
Packit Service c6b9b0
    dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV
Packit Service c6b9b0
    dnl either.
Packit Service c6b9b0
    CPPFLAGS="$am_save_CPPFLAGS"
Packit Service c6b9b0
    LIBICONV=
Packit Service c6b9b0
    LTLIBICONV=
Packit Service c6b9b0
  fi
Packit Service c6b9b0
  AC_SUBST([LIBICONV])
Packit Service c6b9b0
  AC_SUBST([LTLIBICONV])
Packit Service c6b9b0
])
Packit Service c6b9b0
Packit Service c6b9b0
dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to
Packit Service c6b9b0
dnl avoid warnings like
Packit Service c6b9b0
dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
Packit Service c6b9b0
dnl This is tricky because of the way 'aclocal' is implemented:
Packit Service c6b9b0
dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
Packit Service c6b9b0
dnl   Otherwise aclocal's initial scan pass would miss the macro definition.
Packit Service c6b9b0
dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
Packit Service c6b9b0
dnl   Otherwise aclocal would emit many "Use of uninitialized value $1"
Packit Service c6b9b0
dnl   warnings.
Packit Service c6b9b0
m4_define([gl_iconv_AC_DEFUN],
Packit Service c6b9b0
  m4_version_prereq([2.64],
Packit Service c6b9b0
    [[AC_DEFUN_ONCE(
Packit Service c6b9b0
        [$1], [$2])]],
Packit Service c6b9b0
    [m4_ifdef([gl_00GNULIB],
Packit Service c6b9b0
       [[AC_DEFUN_ONCE(
Packit Service c6b9b0
           [$1], [$2])]],
Packit Service c6b9b0
       [[AC_DEFUN(
Packit Service c6b9b0
           [$1], [$2])]])]))
Packit Service c6b9b0
gl_iconv_AC_DEFUN([AM_ICONV],
Packit Service c6b9b0
[
Packit Service c6b9b0
  AM_ICONV_LINK
Packit Service c6b9b0
  if test "$am_cv_func_iconv" = yes; then
Packit Service c6b9b0
    AC_MSG_CHECKING([for iconv declaration])
Packit Service c6b9b0
    AC_CACHE_VAL([am_cv_proto_iconv], [
Packit Service c6b9b0
      AC_COMPILE_IFELSE(
Packit Service c6b9b0
        [AC_LANG_PROGRAM(
Packit Service c6b9b0
           [[
Packit Service c6b9b0
#include <stdlib.h>
Packit Service c6b9b0
#include <iconv.h>
Packit Service c6b9b0
extern
Packit Service c6b9b0
#ifdef __cplusplus
Packit Service c6b9b0
"C"
Packit Service c6b9b0
#endif
Packit Service c6b9b0
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
Packit Service c6b9b0
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
Packit Service c6b9b0
#else
Packit Service c6b9b0
size_t iconv();
Packit Service c6b9b0
#endif
Packit Service c6b9b0
           ]],
Packit Service c6b9b0
           [[]])],
Packit Service c6b9b0
        [am_cv_proto_iconv_arg1=""],
Packit Service c6b9b0
        [am_cv_proto_iconv_arg1="const"])
Packit Service c6b9b0
      am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"])
Packit Service c6b9b0
    am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
Packit Service c6b9b0
    AC_MSG_RESULT([
Packit Service c6b9b0
         $am_cv_proto_iconv])
Packit Service c6b9b0
    AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
Packit Service c6b9b0
      [Define as const if the declaration of iconv() needs const.])
Packit Service c6b9b0
    dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
Packit Service c6b9b0
    m4_ifdef([gl_ICONV_H_DEFAULTS],
Packit Service c6b9b0
      [AC_REQUIRE([gl_ICONV_H_DEFAULTS])
Packit Service c6b9b0
       if test -n "$am_cv_proto_iconv_arg1"; then
Packit Service c6b9b0
         ICONV_CONST="const"
Packit Service c6b9b0
       fi
Packit Service c6b9b0
      ])
Packit Service c6b9b0
  fi
Packit Service c6b9b0
])