Index: include/iconv.h =================================================================== --- include/iconv.h (revision 258587) +++ include/iconv.h (working copy) @@ -51,9 +51,27 @@ typedef int __iconv_bool; struct __tag_iconv_t; typedef struct __tag_iconv_t *iconv_t; +/* + * Beware. There was an error in the initial published + * spec for iconv(). In 1997, it was documented as having a + * second argument of BOTH "const char **" and "char **" in + * two different locations. In 2004 the standard was corrected + * to have a consistent "char **". This is the same as glibc. + * libiconv is still using the old, out of date spec. + * + * Inconsistent (1997): + * http://pubs.opengroup.org/onlinepubs/7908799/xsh/iconv.html + * http://pubs.opengroup.org/onlinepubs/7908799/xsh/iconv.h.html + * + * Fixed (2004): + * http://pubs.opengroup.org/onlinepubs/000095399/functions/iconv.html + * + * Glibc's take on the matter ("There is no const. Period."): + * https://sourceware.org/bugzilla/show_bug.cgi?id=2962#c4 + */ __BEGIN_DECLS iconv_t iconv_open(const char *, const char *); -size_t iconv(iconv_t, const char ** __restrict, +size_t iconv(iconv_t, char ** __restrict, size_t * __restrict, char ** __restrict, size_t * __restrict); int iconv_close(iconv_t); @@ -62,7 +80,7 @@ int iconv_close(iconv_t); */ int __iconv_get_list(char ***, size_t *, __iconv_bool); void __iconv_free_list(char **, size_t); -size_t __iconv(iconv_t, const char **, size_t *, char **, +size_t __iconv(iconv_t, char **, size_t *, char **, size_t *, __uint32_t, size_t *); #define __ICONV_F_HIDE_INVALID 0x0001 Index: lib/libc/iconv/__iconv.c =================================================================== --- lib/libc/iconv/__iconv.c (revision 258587) +++ lib/libc/iconv/__iconv.c (working copy) @@ -31,7 +31,7 @@ #include "iconv-internal.h" size_t -__iconv(iconv_t a, const char **b, size_t *c, char **d, +__iconv(iconv_t a, char **b, size_t *c, char **d, size_t *e, __uint32_t f, size_t *g) { return __bsd___iconv(a, b, c, d, e, f, g); Index: lib/libc/iconv/bsd_iconv.c =================================================================== --- lib/libc/iconv/bsd_iconv.c (revision 258587) +++ lib/libc/iconv/bsd_iconv.c (working copy) @@ -119,7 +119,7 @@ __bsd_iconv_close(iconv_t handle) } size_t -__bsd_iconv(iconv_t handle, const char **in, size_t *szin, char **out, size_t *szout) +__bsd_iconv(iconv_t handle, char **in, size_t *szin, char **out, size_t *szout) { size_t ret; int err; @@ -140,7 +140,7 @@ size_t } size_t -__bsd___iconv(iconv_t handle, const char **in, size_t *szin, char **out, +__bsd___iconv(iconv_t handle, char **in, size_t *szin, char **out, size_t *szout, uint32_t flags, size_t *invalids) { size_t ret; Index: lib/libc/iconv/citrus_iconv.h =================================================================== --- lib/libc/iconv/citrus_iconv.h (revision 258587) +++ lib/libc/iconv/citrus_iconv.h (working copy) @@ -52,7 +52,7 @@ __END_DECLS */ static __inline int _citrus_iconv_convert(struct _citrus_iconv * __restrict cv, - const char * __restrict * __restrict in, size_t * __restrict inbytes, + char ** __restrict in, size_t * __restrict inbytes, char * __restrict * __restrict out, size_t * __restrict outbytes, uint32_t flags, size_t * __restrict nresults) { Index: lib/libc/iconv/citrus_iconv_local.h =================================================================== --- lib/libc/iconv/citrus_iconv_local.h (revision 258587) +++ lib/libc/iconv/citrus_iconv_local.h (working copy) @@ -46,7 +46,7 @@ static void _citrus_##_m_##_iconv_uninit_shared (struct _citrus_iconv_shared *); \ static int _citrus_##_m_##_iconv_convert \ (struct _citrus_iconv * __restrict, \ - const char * __restrict * __restrict, \ + char ** __restrict, \ size_t * __restrict, \ char * __restrict * __restrict, \ size_t * __restrict outbytes, \ @@ -75,7 +75,7 @@ typedef void (*_citrus_iconv_uninit_shared_t) (struct _citrus_iconv_shared *); typedef int (*_citrus_iconv_convert_t) (struct _citrus_iconv * __restrict, - const char *__restrict* __restrict, size_t * __restrict, + char ** __restrict, size_t * __restrict, char * __restrict * __restrict, size_t * __restrict, uint32_t, size_t * __restrict); typedef int (*_citrus_iconv_init_context_t)(struct _citrus_iconv *); Index: lib/libc/iconv/iconv-internal.h =================================================================== --- lib/libc/iconv/iconv-internal.h (revision 258587) +++ lib/libc/iconv/iconv-internal.h (working copy) @@ -29,11 +29,11 @@ /* * Interal prototypes for our back-end functions. */ -size_t __bsd___iconv(iconv_t, const char **, size_t *, char **, +size_t __bsd___iconv(iconv_t, char **, size_t *, char **, size_t *, __uint32_t, size_t *); void __bsd___iconv_free_list(char **, size_t); int __bsd___iconv_get_list(char ***, size_t *, __iconv_bool); -size_t __bsd_iconv(iconv_t, const char ** __restrict, +size_t __bsd_iconv(iconv_t, char ** __restrict, size_t * __restrict, char ** __restrict, size_t * __restrict); const char *__bsd_iconv_canonicalize(const char *); Index: lib/libc/iconv/iconv.c =================================================================== --- lib/libc/iconv/iconv.c (revision 258587) +++ lib/libc/iconv/iconv.c (working copy) @@ -31,7 +31,7 @@ #include "iconv-internal.h" size_t -iconv(iconv_t a, const char ** __restrict b, +iconv(iconv_t a, char ** __restrict b, size_t * __restrict c, char ** __restrict d, size_t * __restrict e) { Index: lib/libc/iconv/iconv_compat.c =================================================================== --- lib/libc/iconv/iconv_compat.c (revision 258587) +++ lib/libc/iconv/iconv_compat.c (working copy) @@ -37,7 +37,7 @@ #include "iconv-internal.h" size_t -__iconv_compat(iconv_t a, const char ** b, size_t * c, char ** d, +__iconv_compat(iconv_t a, char ** b, size_t * c, char ** d, size_t * e, __uint32_t f, size_t *g) { return __bsd___iconv(a, b, c, d, e, f, g); @@ -56,7 +56,7 @@ __iconv_get_list_compat(char ***a, size_t *b, __ic } size_t -iconv_compat(iconv_t a, const char ** __restrict b, +iconv_compat(iconv_t a, char ** __restrict b, size_t * __restrict c, char ** __restrict d, size_t * __restrict e) { Index: lib/libc/locale/cXXrtomb_iconv.h =================================================================== --- lib/libc/locale/cXXrtomb_iconv.h (revision 258587) +++ lib/libc/locale/cXXrtomb_iconv.h (working copy) @@ -57,7 +57,7 @@ cXXrtomb_l(char * __restrict s, charXX_t c, mbstat { _ConversionState *cs; struct _citrus_iconv *handle; - const char *src; + char *src; char *dst; size_t srcleft, dstleft, invlen; int err; Index: lib/libc/locale/mbrtocXX_iconv.h =================================================================== --- lib/libc/locale/mbrtocXX_iconv.h (revision 258587) +++ lib/libc/locale/mbrtocXX_iconv.h (working copy) @@ -99,7 +99,7 @@ mbrtocXX_l(charXX_t * __restrict pc, const char * /* Convert as few characters to the dst buffer as possible. */ for (i = 0; ; i++) { - const char *src; + char *src; char *dst; size_t srcleft, dstleft, invlen; int err; Index: lib/libiconv_modules/iconv_none/citrus_iconv_none.c =================================================================== --- lib/libiconv_modules/iconv_none/citrus_iconv_none.c (revision 258587) +++ lib/libiconv_modules/iconv_none/citrus_iconv_none.c (working copy) @@ -97,7 +97,7 @@ _citrus_iconv_none_iconv_uninit_context(struct _ci static int /*ARGSUSED*/ _citrus_iconv_none_iconv_convert(struct _citrus_iconv * __restrict ci __unused, - const char * __restrict * __restrict in, size_t * __restrict inbytes, + char ** __restrict in, size_t * __restrict inbytes, char * __restrict * __restrict out, size_t * __restrict outbytes, uint32_t flags __unused, size_t * __restrict invalids) { Index: lib/libiconv_modules/iconv_std/citrus_iconv_std.c =================================================================== --- lib/libiconv_modules/iconv_std/citrus_iconv_std.c (revision 258587) +++ lib/libiconv_modules/iconv_std/citrus_iconv_std.c (working copy) @@ -461,7 +461,7 @@ _citrus_iconv_std_iconv_uninit_context(struct _cit static int _citrus_iconv_std_iconv_convert(struct _citrus_iconv * __restrict cv, - const char * __restrict * __restrict in, size_t * __restrict inbytes, + char ** __restrict in, size_t * __restrict inbytes, char * __restrict * __restrict out, size_t * __restrict outbytes, uint32_t flags, size_t * __restrict invalids) { @@ -469,7 +469,7 @@ _citrus_iconv_std_iconv_convert(struct _citrus_ico struct _citrus_iconv_std_context *sc = cv->cv_closure; _csid_t csid; _index_t idx; - const char *tmpin; + char *tmpin; size_t inval, szrin, szrout; int ret, state = 0; @@ -518,7 +518,7 @@ _citrus_iconv_std_iconv_convert(struct _citrus_ico /* mb -> csid/index */ tmpin = *in; szrin = szrout = 0; - ret = mbtocsx(&sc->sc_src_encoding, &csid, &idx, &tmpin, + ret = mbtocsx(&sc->sc_src_encoding, &csid, &idx, (const char **)&tmpin, *inbytes, &szrin, cv->cv_shared->ci_hooks); if (ret) goto err;