iconv fixes

This commit is contained in:
Evan Miller 2021-08-24 19:36:34 -04:00
parent 41d2a797ab
commit ddd1be91a8
2 changed files with 66 additions and 51 deletions

View File

@ -97,7 +97,10 @@ AC_ARG_ENABLE(iconv,
HAVE_ICONV_H=0 HAVE_ICONV_H=0
if test "$enable_iconv" = "yes"; then if test "$enable_iconv" = "yes"; then
AM_ICONV AM_ICONV
if test "$am_cv_func_iconv" = "yes"; then # Use the "working iconv" test instead of the "iconv" ($am_cv_func_iconv) test
# so that our HAVE_ICONV_H substitution variable has the same value as the HAVE_ICONV
# C macro
if test "$am_func_iconv" = "yes"; then
HAVE_ICONV_H=1 HAVE_ICONV_H=1
fi fi
fi fi

View File

@ -1,11 +1,18 @@
# iconv.m4 serial 19 (gettext-0.18.2) # iconv.m4 serial 24
dnl Copyright (C) 2000-2002, 2007-2014, 2016 Free Software Foundation, Inc. dnl Copyright (C) 2000-2002, 2007-2014, 2016-2021 Free Software Foundation,
dnl Inc.
dnl This file is free software; the Free Software Foundation dnl This file is free software; the Free Software Foundation
dnl gives unlimited permission to copy and/or distribute it, dnl gives unlimited permission to copy and/or distribute it,
dnl with or without modifications, as long as this notice is preserved. dnl with or without modifications, as long as this notice is preserved.
dnl From Bruno Haible. dnl From Bruno Haible.
AC_PREREQ([2.64])
dnl Note: AM_ICONV is documented in the GNU gettext manual
dnl <https://www.gnu.org/software/gettext/manual/html_node/AM_005fICONV.html>.
dnl Don't make changes that are incompatible with that documentation!
AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], AC_DEFUN([AM_ICONV_LINKFLAGS_BODY],
[ [
dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. dnl Prerequisites of AC_LIB_LINKFLAGS_BODY.
@ -85,8 +92,9 @@ AC_DEFUN([AM_ICONV_LINK],
#endif #endif
]], ]],
[[int result = 0; [[int result = 0;
/* Test against AIX 5.1 bug: Failures are not distinguishable from successful /* Test against AIX 5.1...7.2 bug: Failures are not distinguishable from
returns. */ successful returns. This is even documented in
<https://www.ibm.com/support/knowledgecenter/ssw_aix_72/i_bostechref/iconv.html> */
{ {
iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8"); iconv_t cd_utf8_to_88591 = iconv_open ("ISO8859-1", "UTF-8");
if (cd_utf8_to_88591 != (iconv_t)(-1)) if (cd_utf8_to_88591 != (iconv_t)(-1))
@ -167,15 +175,27 @@ AC_DEFUN([AM_ICONV_LINK],
#endif #endif
/* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is /* Test against HP-UX 11.11 bug: No converter from EUC-JP to UTF-8 is
provided. */ provided. */
if (/* Try standardized names. */ {
iconv_open ("UTF-8", "EUC-JP") == (iconv_t)(-1) /* Try standardized names. */
/* Try IRIX, OSF/1 names. */ iconv_t cd1 = iconv_open ("UTF-8", "EUC-JP");
&& iconv_open ("UTF-8", "eucJP") == (iconv_t)(-1) /* Try IRIX, OSF/1 names. */
/* Try AIX names. */ iconv_t cd2 = iconv_open ("UTF-8", "eucJP");
&& iconv_open ("UTF-8", "IBM-eucJP") == (iconv_t)(-1) /* Try AIX names. */
/* Try HP-UX names. */ iconv_t cd3 = iconv_open ("UTF-8", "IBM-eucJP");
&& iconv_open ("utf8", "eucJP") == (iconv_t)(-1)) /* Try HP-UX names. */
result |= 16; iconv_t cd4 = iconv_open ("utf8", "eucJP");
if (cd1 == (iconv_t)(-1) && cd2 == (iconv_t)(-1)
&& cd3 == (iconv_t)(-1) && cd4 == (iconv_t)(-1))
result |= 16;
if (cd1 != (iconv_t)(-1))
iconv_close (cd1);
if (cd2 != (iconv_t)(-1))
iconv_close (cd2);
if (cd3 != (iconv_t)(-1))
iconv_close (cd3);
if (cd4 != (iconv_t)(-1))
iconv_close (cd4);
}
return result; return result;
]])], ]])],
[am_cv_func_iconv_works=yes], , [am_cv_func_iconv_works=yes], ,
@ -212,8 +232,7 @@ AC_DEFUN([AM_ICONV_LINK],
AC_SUBST([LTLIBICONV]) AC_SUBST([LTLIBICONV])
]) ])
dnl Define AM_ICONV using AC_DEFUN_ONCE for Autoconf >= 2.64, in order to dnl Define AM_ICONV using AC_DEFUN_ONCE, in order to avoid warnings like
dnl avoid warnings like
dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required". dnl "warning: AC_REQUIRE: `AM_ICONV' was expanded before it was required".
dnl This is tricky because of the way 'aclocal' is implemented: dnl This is tricky because of the way 'aclocal' is implemented:
dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN. dnl - It requires defining an auxiliary macro whose name ends in AC_DEFUN.
@ -221,51 +240,44 @@ dnl Otherwise aclocal's initial scan pass would miss the macro definition.
dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions. dnl - It requires a line break inside the AC_DEFUN_ONCE and AC_DEFUN expansions.
dnl Otherwise aclocal would emit many "Use of uninitialized value $1" dnl Otherwise aclocal would emit many "Use of uninitialized value $1"
dnl warnings. dnl warnings.
m4_define([gl_iconv_AC_DEFUN], AC_DEFUN_ONCE([AM_ICONV],
m4_version_prereq([2.64],
[[AC_DEFUN_ONCE(
[$1], [$2])]],
[m4_ifdef([gl_00GNULIB],
[[AC_DEFUN_ONCE(
[$1], [$2])]],
[[AC_DEFUN(
[$1], [$2])]])]))
gl_iconv_AC_DEFUN([AM_ICONV],
[ [
AM_ICONV_LINK AM_ICONV_LINK
if test "$am_cv_func_iconv" = yes; then if test "$am_cv_func_iconv" = yes; then
AC_MSG_CHECKING([for iconv declaration]) AC_CACHE_CHECK([whether iconv is compatible with its POSIX signature],
AC_CACHE_VAL([am_cv_proto_iconv], [ [gl_cv_iconv_nonconst],
AC_COMPILE_IFELSE( [AC_COMPILE_IFELSE(
[AC_LANG_PROGRAM( [AC_LANG_PROGRAM(
[[ [[
#include <stdlib.h> #include <stdlib.h>
#include <iconv.h> #include <iconv.h>
extern extern
#ifdef __cplusplus #ifdef __cplusplus
"C" "C"
#endif #endif
#if defined(__STDC__) || defined(_MSC_VER) || defined(__cplusplus)
size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);
#else ]],
size_t iconv(); [[]])],
#endif [gl_cv_iconv_nonconst=yes],
]], [gl_cv_iconv_nonconst=no])
[[]])],
[am_cv_proto_iconv_arg1=""],
[am_cv_proto_iconv_arg1="const"])
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);"])
am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'`
AC_MSG_RESULT([
$am_cv_proto_iconv])
AC_DEFINE_UNQUOTED([ICONV_CONST], [$am_cv_proto_iconv_arg1],
[Define as const if the declaration of iconv() needs const.])
dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
m4_ifdef([gl_ICONV_H_DEFAULTS],
[AC_REQUIRE([gl_ICONV_H_DEFAULTS])
if test -n "$am_cv_proto_iconv_arg1"; then
ICONV_CONST="const"
fi
]) ])
else
dnl When compiling GNU libiconv on a system that does not have iconv yet,
dnl pick the POSIX compliant declaration without 'const'.
gl_cv_iconv_nonconst=yes
fi fi
if test $gl_cv_iconv_nonconst = yes; then
iconv_arg1=""
else
iconv_arg1="const"
fi
AC_DEFINE_UNQUOTED([ICONV_CONST], [$iconv_arg1],
[Define as const if the declaration of iconv() needs const.])
dnl Also substitute ICONV_CONST in the gnulib generated <iconv.h>.
m4_ifdef([gl_ICONV_H_DEFAULTS],
[AC_REQUIRE([gl_ICONV_H_DEFAULTS])
if test $gl_cv_iconv_nonconst != yes; then
ICONV_CONST="const"
fi
])
]) ])