Feature #671 ยป 0085-iconv.m4-Update-to-serial-28.patch
m4/iconv.m4 | ||
---|---|---|
# iconv.m4
|
||
# serial 27
|
||
# serial 28
|
||
dnl Copyright (C) 2000-2002, 2007-2014, 2016-2024 Free Software Foundation,
|
||
dnl Inc.
|
||
dnl This file is free software; the Free Software Foundation
|
||
... | ... | |
if test "$am_cv_func_iconv" = yes; then
|
||
AC_CACHE_CHECK([for working iconv], [am_cv_func_iconv_works], [
|
||
dnl This tests against bugs in AIX 5.1, AIX 6.1..7.1, HP-UX 11.11,
|
||
dnl Solaris 10.
|
||
dnl Solaris 10, macOS 14.4.
|
||
gl_saved_LIBS="$LIBS"
|
||
if test $am_cv_lib_iconv = yes; then
|
||
LIBS="$LIBS $LIBICONV"
|
||
... | ... | |
iconv_close (cd_utf8_to_88591);
|
||
}
|
||
}
|
||
/* Test against macOS 14.4 bug: Failures are not distinguishable from
|
||
successful returns.
|
||
POSIX:2018 says: "The iconv() function shall ... return the number of
|
||
non-identical conversions performed."
|
||
But here, the conversion always does transliteration (the suffixes
|
||
"//TRANSLIT" and "//IGNORE" have no effect, nor does iconvctl()) and
|
||
does not report when it does a non-identical conversion. */
|
||
{
|
||
iconv_t cd_utf8_to_88591 = iconv_open ("ISO-8859-1", "UTF-8");
|
||
if (cd_utf8_to_88591 != (iconv_t)(-1))
|
||
{
|
||
static ICONV_CONST char input[] = "\305\202"; /* LATIN SMALL LETTER L WITH STROKE */
|
||
char buf[10];
|
||
ICONV_CONST char *inptr = input;
|
||
size_t inbytesleft = strlen (input);
|
||
char *outptr = buf;
|
||
size_t outbytesleft = sizeof (buf);
|
||
size_t res = iconv (cd_utf8_to_88591,
|
||
&inptr, &inbytesleft,
|
||
&outptr, &outbytesleft);
|
||
/* Here:
|
||
With glibc, GNU libiconv (including macOS up to 13): res == (size_t)-1, errno == EILSEQ.
|
||
With musl libc, NetBSD 10, Solaris 11: res == 1.
|
||
With macOS 14.4: res == 0, output is "l". */
|
||
if (res == 0)
|
||
result |= 2;
|
||
iconv_close (cd_utf8_to_88591);
|
||
}
|
||
}
|
||
/* Test against Solaris 10 bug: Failures are not distinguishable from
|
||
successful returns. */
|
||
{
|
||
... | ... | |
&inptr, &inbytesleft,
|
||
&outptr, &outbytesleft);
|
||
if (res == 0)
|
||
result |= 2;
|
||
result |= 4;
|
||
iconv_close (cd_ascii_to_88591);
|
||
}
|
||
}
|
||
... | ... | |
&inptr, &inbytesleft,
|
||
&outptr, &outbytesleft);
|
||
if (res != (size_t)(-1) || outptr - buf > 1 || buf[1] != (char)0xAD)
|
||
result |= 4;
|
||
result |= 8;
|
||
iconv_close (cd_88591_to_utf8);
|
||
}
|
||
}
|
||
... | ... | |
&inptr, &inbytesleft,
|
||
&outptr, &outbytesleft);
|
||
if ((int)res > 0)
|
||
result |= 8;
|
||
result |= 16;
|
||
iconv_close (cd_88591_to_utf8);
|
||
}
|
||
}
|
||
... | ... | |
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;
|
||
result |= 32;
|
||
if (cd1 != (iconv_t)(-1))
|
||
iconv_close (cd1);
|
||
if (cd2 != (iconv_t)(-1))
|