summaryrefslogtreecommitdiff
path: root/lib/striconveh.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/striconveh.c')
-rw-r--r--lib/striconveh.c29
1 files changed, 17 insertions, 12 deletions
diff --git a/lib/striconveh.c b/lib/striconveh.c
index 01b4e327..db83a1dd 100644
--- a/lib/striconveh.c
+++ b/lib/striconveh.c
@@ -1,5 +1,5 @@
/* Character set conversion with error handling.
- Copyright (C) 2001-2022 Free Software Foundation, Inc.
+ Copyright (C) 2001-2024 Free Software Foundation, Inc.
Written by Bruno Haible and Simon Josefsson.
This file is free software: you can redistribute it and/or modify
@@ -81,7 +81,8 @@ iconveh_open (const char *to_codeset, const char *from_codeset, iconveh_t *cdp)
if (STRCASEEQ (to_codeset, "UTF-8", 'U','T','F','-','8',0,0,0,0)
# if (((__GLIBC__ == 2 && __GLIBC_MINOR__ >= 2) || __GLIBC__ > 2) \
&& !defined __UCLIBC__) \
- || _LIBICONV_VERSION >= 0x0105
+ || _LIBICONV_VERSION >= 0x0105 \
+ || defined ICONV_SET_TRANSLITERATE
|| c_strcasecmp (to_codeset, "UTF-8//TRANSLIT") == 0
# endif
)
@@ -138,11 +139,12 @@ iconveh_close (const iconveh_t *cd)
/* iconv_carefully is like iconv, except that it stops as soon as it encounters
a conversion error, and it returns in *INCREMENTED a boolean telling whether
it has incremented the input pointers past the error location. */
-# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+# if !(defined _LIBICONV_VERSION && !(_LIBICONV_VERSION == 0x10b && defined __APPLE__)) \
+ && !(defined __GLIBC__ && !defined __UCLIBC__)
/* Irix iconv() inserts a NUL byte if it cannot convert.
NetBSD iconv() inserts a question mark if it cannot convert.
- Only GNU libiconv and GNU libc are known to prefer to fail rather
- than doing a lossy conversion. */
+ Only GNU libiconv (excluding the bastard Apple iconv) and GNU libc are
+ known to prefer to fail rather than doing a lossy conversion. */
static size_t
iconv_carefully (iconv_t cd,
const char **inbuf, size_t *inbytesleft,
@@ -246,11 +248,12 @@ iconv_carefully_1 (iconv_t cd,
*inbuf = inptr;
*inbytesleft = inptr_end - inptr;
-# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+# if !(defined _LIBICONV_VERSION && !(_LIBICONV_VERSION == 0x10b && defined __APPLE__)) \
+ && !(defined __GLIBC__ && !defined __UCLIBC__)
/* Irix iconv() inserts a NUL byte if it cannot convert.
NetBSD iconv() inserts a question mark if it cannot convert.
- Only GNU libiconv and GNU libc are known to prefer to fail rather
- than doing a lossy conversion. */
+ Only GNU libiconv (excluding the bastard Apple iconv) and GNU libc are
+ known to prefer to fail rather than doing a lossy conversion. */
if (res != (size_t)(-1) && res > 0)
{
/* iconv() has already incremented INPTR. We cannot go back to a
@@ -810,7 +813,7 @@ mem_cd_iconveh_internal (const char *src, size_t srclen,
if (handler == iconveh_escape_sequence)
{
- static char hex[16] = "0123456789ABCDEF";
+ static char const hex[16] = "0123456789ABCDEF";
scratchlen = 0;
scratchbuf[scratchlen++] = '\\';
if (uc < 0x10000)
@@ -947,13 +950,15 @@ mem_cd_iconveh_internal (const char *src, size_t srclen,
}
length = out2ptr - result;
}
-# if !defined _LIBICONV_VERSION && !(defined __GLIBC__ && !defined __UCLIBC__)
+# if !(defined _LIBICONV_VERSION && !(_LIBICONV_VERSION == 0x10b && defined __APPLE__)) \
+ && !(defined __GLIBC__ && !defined __UCLIBC__)
/* IRIX iconv() inserts a NUL byte if it cannot convert.
FreeBSD iconv(), NetBSD iconv(), and Solaris 11
iconv() insert a '?' if they cannot convert.
musl libc iconv() inserts a '*' if it cannot convert.
- Only GNU libiconv and GNU libc are known to prefer
- to fail rather than doing a lossy conversion. */
+ Only GNU libiconv (excluding the bastard Apple iconv)
+ and GNU libc are known to prefer to fail rather than
+ doing a lossy conversion. */
if (res != (size_t)(-1) && res > 0)
{
errno = EILSEQ;