summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog52
-rw-r--r--iconv/gconv.c6
-rw-r--r--iconv/gconv.h6
-rw-r--r--iconv/gconv_int.h21
-rw-r--r--iconv/gconv_open.c2
-rw-r--r--iconv/gconv_simple.c6
-rw-r--r--iconv/gconv_trans.c122
-rw-r--r--iconv/skeleton.c26
-rw-r--r--iconvdata/8bit-gap.c6
-rw-r--r--iconvdata/8bit-generic.c2
-rw-r--r--iconvdata/ansi_x3.110.c9
-rw-r--r--iconvdata/big5.c2
-rw-r--r--iconvdata/big5hkscs.c2
-rw-r--r--iconvdata/euc-cn.c3
-rw-r--r--iconvdata/euc-jp.c3
-rw-r--r--iconvdata/euc-kr.c2
-rw-r--r--iconvdata/euc-tw.c3
-rw-r--r--iconvdata/gbgbk.c3
-rw-r--r--iconvdata/gbk.c3
-rw-r--r--iconvdata/iso-2022-cn.c3
-rw-r--r--iconvdata/iso-2022-jp.c6
-rw-r--r--iconvdata/iso-2022-kr.c3
-rw-r--r--iconvdata/iso646.c2
-rw-r--r--iconvdata/iso8859-1.c2
-rw-r--r--iconvdata/iso_6937-2.c5
-rw-r--r--iconvdata/iso_6937.c5
-rw-r--r--iconvdata/johab.c6
-rw-r--r--iconvdata/sjis.c5
-rw-r--r--iconvdata/t.61.c6
-rw-r--r--iconvdata/uhc.c6
-rw-r--r--iconvdata/unicode.c2
-rw-r--r--iconvdata/utf-16.c6
-rw-r--r--libio/iofwide.c8
-rw-r--r--wcsmbs/btowc.c2
-rw-r--r--wcsmbs/mbrtowc.c2
-rw-r--r--wcsmbs/mbsnrtowcs.c4
-rw-r--r--wcsmbs/mbsrtowcs.c4
-rw-r--r--wcsmbs/wcrtomb.c5
-rw-r--r--wcsmbs/wcsnrtombs.c4
-rw-r--r--wcsmbs/wcsrtombs.c4
-rw-r--r--wcsmbs/wctob.c2
41 files changed, 254 insertions, 117 deletions
diff --git a/ChangeLog b/ChangeLog
index 8369e52637..72e3748674 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,55 @@
+2000-06-15 Ulrich Drepper <drepper@redhat.com>
+
+ * iconv/gconv.h (__gconv_fct): Change type of fifth parameter to
+ unsigned char **.
+ (__gconv_init_fct): Remove two parameters.
+ * iconv/gconv_int.h (__gconv_transliterate): Renamed from
+ gconv_transliterate. Remove two parameters.
+ Change prototypes of builtin functions according to __gconv_fct change.
+ * iconv/skeleton.c: Change type of fifth parameter. make sure it is
+ != NULL only during error handling. Stop in this case after the
+ conversion.
+ * iconv/gconv_trans.c: Replace with real implementation for
+ __gconv_transliterate.
+ * iconv/gconv_open.c: Adjust for renaming of __gconv_transliterate.
+ * iconv/gconv.c: Change calls to downstream functions once again.
+ Use NULL for the fifth parameter instead of pointer to output buffer.
+ * libio/iofwide.c: Likewise.
+ * wcsmbs/btowc.c: Likewise.
+ * wcsmbs/mbrtowc.c: Likewise.
+ * wcsmbs/mbsnrtowcs.c: Likewise.
+ * wcsmbs/mbsrtowcs.c: Likewise.
+ * wcsmbs/wcrtomb.c: Likewise.
+ * wcsmbs/wcsnrtombs.c: Likewise.
+ * wcsmbs/wcsrtombs.c: Likewise.
+ * wcsmbs/wctob.c: Likewise.
+ * iconv/gconv_simple.c: Remove two parameters from error handling
+ function call.
+ * iconvdata/8bit-gap.c: Likewise.
+ * iconvdata/8bit-generic.c: Likewise.
+ * iconvdata/ansi_x3.110.c: Likewise.
+ * iconvdata/big5.c: Likewise.
+ * iconvdata/big5hkscs.c: Likewise.
+ * iconvdata/euc-cn.c: Likewise.
+ * iconvdata/euc-jp.c: Likewise.
+ * iconvdata/euc-kr.c: Likewise.
+ * iconvdata/euc-tw.c: Likewise.
+ * iconvdata/gbgbk.c: Likewise.
+ * iconvdata/gbk.c: Likewise.
+ * iconvdata/iso-2022-cn.c: Likewise.
+ * iconvdata/iso-2022-jp.c: Likewise.
+ * iconvdata/iso-2022-kr.c: Likewise.
+ * iconvdata/iso646.c: Likewise.
+ * iconvdata/iso8859-1.c: Likewise.
+ * iconvdata/iso_6937-2.c: Likewise.
+ * iconvdata/iso_6937.c: Likewise.
+ * iconvdata/johab.c: Likewise.
+ * iconvdata/sjis.c: Likewise.
+ * iconvdata/t.61.c: Likewise.
+ * iconvdata/uhc.c: Likewise.
+ * iconvdata/unicode.c: Likewise.
+ * iconvdata/utf-16.c: Likewise.
+
2000-06-15 Greg McGary <greg@mcgary.org>
* sysdeps/unix/make-syscalls.sh: Strip leading whitespace from lhs
diff --git a/iconv/gconv.c b/iconv/gconv.c
index 19f95622a2..0b7b917b6a 100644
--- a/iconv/gconv.c
+++ b/iconv/gconv.c
@@ -46,8 +46,8 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
if (inbuf == NULL || *inbuf == NULL)
/* We just flush. */
result = DL_CALL_FCT (cd->__steps->__fct,
- (cd->__steps, cd->__data, NULL, NULL,
- cd->__data[0].__outbuf, irreversible, 1, 0));
+ (cd->__steps, cd->__data, NULL, NULL, NULL,
+ irreversible, 1, 0));
else
{
const unsigned char *last_start;
@@ -59,7 +59,7 @@ __gconv (__gconv_t cd, const unsigned char **inbuf,
last_start = *inbuf;
result = DL_CALL_FCT (cd->__steps->__fct,
(cd->__steps, cd->__data, inbuf, inbufend,
- cd->__data[0].__outbuf, irreversible, 0, 0));
+ NULL, irreversible, 0, 0));
}
while (result == __GCONV_EMPTY_INPUT && last_start != *inbuf
&& *inbuf + cd->__steps->__min_needed_from <= inbufend);
diff --git a/iconv/gconv.h b/iconv/gconv.h
index 2bba133d0c..0164b62c8b 100644
--- a/iconv/gconv.h
+++ b/iconv/gconv.h
@@ -68,7 +68,7 @@ struct __gconv_trans_data;
/* Type of a conversion function. */
typedef int (*__gconv_fct) (struct __gconv_step *, struct __gconv_step_data *,
__const unsigned char **, __const unsigned char *,
- unsigned char *, size_t *, int, int);
+ unsigned char **, size_t *, int, int);
/* Constructor and destructor for local data for conversion step. */
typedef int (*__gconv_init_fct) (struct __gconv_step *);
@@ -80,8 +80,8 @@ typedef int (*__gconv_trans_fct) (struct __gconv_step *step,
struct __gconv_step_data *step_data,
__const unsigned char *,
__const unsigned char **,
- __const unsigned char *, unsigned char *,
- unsigned char **, unsigned char *, size_t *);
+ __const unsigned char *, unsigned char **,
+ size_t *);
/* Function to call to provide transliteration module with context. */
typedef int (*__gconv_trans_context_fct) (struct __gconv_trans_data *data,
diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h
index 87287d7b26..34dff7d522 100644
--- a/iconv/gconv_int.h
+++ b/iconv/gconv_int.h
@@ -181,15 +181,13 @@ extern void __gconv_get_builtin_trans (const char *name,
internal_function;
/* Transliteration using the locale's data. */
-extern int gconv_transliterate (struct __gconv_step *step,
- struct __gconv_step_data *step_data,
- __const unsigned char *inbufstart,
- __const unsigned char **inbufp,
- __const unsigned char *inbufend,
- unsigned char *outbufstart,
- unsigned char **outbufp,
- unsigned char *outbufend,
- size_t *irreversible);
+extern int __gconv_transliterate (struct __gconv_step *step,
+ struct __gconv_step_data *step_data,
+ __const unsigned char *inbufstart,
+ __const unsigned char **inbufp,
+ __const unsigned char *inbufend,
+ unsigned char **outbufstart,
+ size_t *irreversible);
/* Builtin transformations. */
@@ -198,8 +196,9 @@ extern int gconv_transliterate (struct __gconv_step *step,
extern int Name (struct __gconv_step *step, \
struct __gconv_step_data *data, \
const unsigned char **inbuf, \
- const unsigned char *inbufend, unsigned char *outbufstart, \
- size_t *irreversible, int do_flush, int consume_incomplete)
+ const unsigned char *inbufend, \
+ unsigned char **outbufstart, size_t *irreversible, \
+ int do_flush, int consume_incomplete)
__BUILTIN_TRANS (__gconv_transform_ascii_internal);
__BUILTIN_TRANS (__gconv_transform_internal_ascii);
diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c
index 984ca9dc5d..14f1d5e0f9 100644
--- a/iconv/gconv_open.c
+++ b/iconv/gconv_open.c
@@ -86,7 +86,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle,
csnames = internal_trans_names;
ncsnames = 1;
- trans_fct = gconv_transliterate;
+ trans_fct = __gconv_transliterate;
/* No context, init, or end function. */
}
else if (strcasecmp (errhand, "WORK AROUND A GCC BUG") == 0)
diff --git a/iconv/gconv_simple.c b/iconv/gconv_simple.c
index 5033f3ef83..390574582f 100644
--- a/iconv/gconv_simple.c
+++ b/iconv/gconv_simple.c
@@ -801,7 +801,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outptr, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -1190,7 +1190,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outptr, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -1257,7 +1257,7 @@ ucs4le_internal_loop_single (struct __gconv_step *step,
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outptr, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconv/gconv_trans.c b/iconv/gconv_trans.c
index 56c3ff6be6..829ff5f981 100644
--- a/iconv/gconv_trans.c
+++ b/iconv/gconv_trans.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
#include "gconv_int.h"
@@ -25,26 +26,121 @@
int
-gconv_transliterate (struct __gconv_step *step,
- struct __gconv_step_data *step_data,
- const unsigned char *inbufstart,
- const unsigned char **inbufp,
- const unsigned char *inbufend,
- unsigned char *outbufstart,
- unsigned char **outbufp, unsigned char *outbufend,
- size_t *irreversible)
+__gconv_transliterate (struct __gconv_step *step,
+ struct __gconv_step_data *step_data,
+ const unsigned char *inbufstart,
+ const unsigned char **inbufp,
+ const unsigned char *inbufend,
+ unsigned char **outbufstart, size_t *irreversible)
{
/* Find out about the locale's transliteration. */
- uint_fast32_t size = _NL_CURRENT_WORD (LC_CTYPE,
- _NL_CTYPE_TRANSLIT_HASH_SIZE);
- uint_fast32_t layers = _NL_CURRENT_WORD (LC_CTYPE,
- _NL_CTYPE_TRANSLIT_HASH_LAYERS);
+ uint_fast32_t size;
+ uint_fast32_t layers;
+ uint32_t *from_idx;
+ uint32_t *from_tbl;
+ uint32_t *to_idx;
+ uint32_t *to_tbl;
+ uint32_t *winbuf;
+ uint32_t *winbufend;
+ uint_fast32_t low;
+ uint_fast32_t high;
/* If there is no transliteration information in the locale don't do
anything and return the error. */
+ size = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_TRANSLIT_HASH_SIZE);
if (size == 0)
return __GCONV_ILLEGAL_INPUT;
- /* XXX For now we don't do anything. */
+ /* Get the rest of the values. */
+ layers = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_TRANSLIT_HASH_LAYERS);
+ from_idx = (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TRANSLIT_FROM_IDX);
+ from_tbl = (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TRANSLIT_FROM_TBL);
+ to_idx = (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TRANSLIT_TO_IDX);
+ to_tbl = (uint32_t *) _NL_CURRENT (LC_CTYPE, _NL_CTYPE_TRANSLIT_TO_TBL);
+
+ /* The input buffer. There are actually 4-byte values. */
+ winbuf = (uint32_t *) *inbufp;
+ winbufend = (uint32_t *) inbufend;
+
+ /* Test whether there is enough input. */
+ if (winbuf + 1 > winbufend)
+ return (winbuf == winbufend
+ ? __GCONV_EMPTY_INPUT : __GCONV_INCOMPLETE_INPUT);
+
+ /* The array starting at FROM_IDX contains indeces to the string table
+ in FROM_TBL. The indeces are sorted wrt to the strings. I.e., we
+ are doing binary search. */
+ low = 0;
+ high = size;
+ while (low < high)
+ {
+ uint_fast32_t med = (low + high) / 2;
+ uint32_t idx;
+ int cnt;
+
+ /* Compare the string at this index with the string at the current
+ position in the input buffer. */
+ idx = from_idx[med];
+ cnt = 0;
+ do
+ {
+ if (from_tbl[idx + cnt] != winbuf[cnt])
+ /* Does not match. */
+ break;
+ ++cnt;
+ }
+ while (from_tbl[idx + cnt] != L'\0' && winbuf + cnt < winbufend);
+
+ if (cnt > 0 && from_tbl[idx + cnt] == L'\0')
+ {
+ /* Found a matching input sequence. Now try to convert the
+ possible replacements. */
+ uint32_t idx2 = to_idx[med];
+
+ do
+ {
+ /* Determine length of replacement. */
+ uint_fast32_t len = 0;
+ int res;
+ const unsigned char *toinptr;
+
+ while (to_tbl[idx2 + len] != L'\0')
+ ++len;
+
+ /* Try this input text. */
+ toinptr = (const unsigned char *) &to_tbl[idx2];
+ res = DL_CALL_FCT (step->__fct,
+ (step, step_data, &toinptr,
+ (const unsigned char *) &to_tbl[idx2 + len],
+ (unsigned char **) outbufstart,
+ irreversible, 0, 0));
+ if (res != __GCONV_ILLEGAL_INPUT)
+ {
+ /* If the conversion succeeds we have to increment the
+ input buffer. */
+ if (res == __GCONV_EMPTY_INPUT)
+ {
+ *inbufp += cnt * sizeof (uint32_t);
+ ++*irreversible;
+ }
+
+ return res;
+ }
+
+ /* Next replacement. */
+ idx2 += len + 1;
+ }
+ while (to_tbl[idx2] != L'\0');
+
+ /* Nothing found, continue searching. */
+ }
+
+ if (winbuf + cnt >= winbufend || from_tbl[idx + cnt] < winbuf[cnt])
+ low = idx;
+ else
+ high = idx;
+ }
+
+ /* Haven't found a match. */
return __GCONV_ILLEGAL_INPUT;
}
diff --git a/iconv/skeleton.c b/iconv/skeleton.c
index d64d7599b4..8dbebb81ac 100644
--- a/iconv/skeleton.c
+++ b/iconv/skeleton.c
@@ -271,7 +271,7 @@ gconv_init (struct __gconv_step *step)
int
FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
const unsigned char **inptrp, const unsigned char *inend,
- unsigned char *outbufstart, size_t *irreversible, int do_flush,
+ unsigned char **outbufstart, size_t *irreversible, int do_flush,
int consume_incomplete)
{
struct __gconv_step *next_step = step + 1;
@@ -288,6 +288,9 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
{
status = __GCONV_OK;
+ /* This should never happen during error handling. */
+ assert (outbufstart == NULL);
+
#ifdef EMIT_SHIFT_TO_INIT
/* Emit the escape sequence to reset the state. */
EMIT_SHIFT_TO_INIT;
@@ -296,14 +299,15 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
successfully emitted the escape sequence. */
if (status == __GCONV_OK && ! (data->__flags & __GCONV_IS_LAST))
status = DL_CALL_FCT (fct, (next_step, next_data, NULL, NULL,
- next_data->__outbuf, irreversible, 1,
+ NULL, irreversible, 1,
consume_incomplete));
}
else
{
/* We preserve the initial values of the pointer variables. */
const unsigned char *inptr = *inptrp;
- unsigned char *outbuf = outbufstart;
+ unsigned char *outbuf = (__builtin_expect (outbufstart == NULL, 1)
+ ? data->__outbuf : *outbufstart);
unsigned char *outend = data->__outbufend;
unsigned char *outstart;
/* This variable is used to count the number of characters we
@@ -331,7 +335,10 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
|| (MAX_NEEDED_TO > 1 && !FROM_DIRECTION))
&& consume_incomplete && (data->__statep->__count & 7) != 0)
{
- /* Yep, we have some bytes left over. Process them now. */
+ /* Yep, we have some bytes left over. Process them now.
+ But this must not happen while we are called from an
+ error handler. */
+ assert (outbufstart == NULL);
# if MAX_NEEDED_FROM > 1
if (MAX_NEEDED_TO == 1 || FROM_DIRECTION)
@@ -412,6 +419,14 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
}
#endif
+ /* If we were called as part of an error handling module we
+ don't do anything else here. */
+ if (__builtin_expect (outbufstart != NULL, 0))
+ {
+ *outbufstart = outbuf;
+ return status;
+ }
+
/* Give the transliteration module the chance to store the
original text and the result in case it needs a context. */
if (data->__trans.__trans_context_fct != NULL)
@@ -443,8 +458,7 @@ FUNCTION_NAME (struct __gconv_step *step, struct __gconv_step_data *data,
int result;
result = DL_CALL_FCT (fct, (next_step, next_data, &outerr,
- outbuf, next_data->__outbuf,
- irreversible, 0,
+ outbuf, NULL, irreversible, 0,
consume_incomplete));
if (result != __GCONV_EMPTY_INPUT)
diff --git a/iconvdata/8bit-gap.c b/iconvdata/8bit-gap.c
index 23a63fd9e4..6394065c56 100644
--- a/iconvdata/8bit-gap.c
+++ b/iconvdata/8bit-gap.c
@@ -89,7 +89,7 @@ struct gap
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -112,7 +112,7 @@ struct gap
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -137,7 +137,7 @@ struct gap
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/8bit-generic.c b/iconvdata/8bit-generic.c
index 62160c6efa..1478c5be59 100644
--- a/iconvdata/8bit-generic.c
+++ b/iconvdata/8bit-generic.c
@@ -72,7 +72,7 @@
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/ansi_x3.110.c b/iconvdata/ansi_x3.110.c
index f403773d9d..f338055f39 100644
--- a/iconvdata/ansi_x3.110.c
+++ b/iconvdata/ansi_x3.110.c
@@ -501,8 +501,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -560,8 +559,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -589,8 +587,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/big5.c b/iconvdata/big5.c
index 2e039376d0..8cad304c7a 100644
--- a/iconvdata/big5.c
+++ b/iconvdata/big5.c
@@ -8589,7 +8589,7 @@ static const char from_ucs4_tab13[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/big5hkscs.c b/iconvdata/big5hkscs.c
index b5fe9663e5..0859dd8f09 100644
--- a/iconvdata/big5hkscs.c
+++ b/iconvdata/big5hkscs.c
@@ -12746,7 +12746,7 @@ static const char from_ucs4_tab14[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/euc-cn.c b/iconvdata/euc-cn.c
index c7a02c2cd4..075970ce96 100644
--- a/iconvdata/euc-cn.c
+++ b/iconvdata/euc-cn.c
@@ -145,8 +145,7 @@
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/euc-jp.c b/iconvdata/euc-jp.c
index 6cf89e3aa6..771dc069e8 100644
--- a/iconvdata/euc-jp.c
+++ b/iconvdata/euc-jp.c
@@ -222,8 +222,7 @@
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, \
- &inptr, inend, *outptrp, \
- &outptr, outend, \
+ &inptr, inend, &outbuf, \
irreversible)); \
if (result != __GCONV_OK) \
break; \
diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c
index 88794f2f02..e953df5dc9 100644
--- a/iconvdata/euc-kr.c
+++ b/iconvdata/euc-kr.c
@@ -150,7 +150,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/euc-tw.c b/iconvdata/euc-tw.c
index ee88d4e2a7..f3152478e2 100644
--- a/iconvdata/euc-tw.c
+++ b/iconvdata/euc-tw.c
@@ -197,8 +197,7 @@
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/gbgbk.c b/iconvdata/gbgbk.c
index c6f2e4e0c2..15e72d9cfb 100644
--- a/iconvdata/gbgbk.c
+++ b/iconvdata/gbgbk.c
@@ -106,8 +106,7 @@
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c
index f82059195e..669e4a9c9f 100644
--- a/iconvdata/gbk.c
+++ b/iconvdata/gbk.c
@@ -13456,8 +13456,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, \
- irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/iso-2022-cn.c b/iconvdata/iso-2022-cn.c
index af7f92d3ac..818f2a773c 100644
--- a/iconvdata/iso-2022-cn.c
+++ b/iconvdata/iso-2022-cn.c
@@ -328,8 +328,7 @@ enum
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, \
- &inptr, inend, *outptrp, \
- &outptr, outend, \
+ &inptr, inend, &outbuf, \
irreversible)); \
if (result != __GCONV_OK) \
break; \
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index c6a43d121d..b66c9503b5 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -707,8 +707,7 @@ gconv_end (struct __gconv_step *data)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, \
- &inptr, inend, *outptrp, \
- &outptr, outend, \
+ &inptr, inend, &outbuf, \
irreversible)); \
if (result != __GCONV_OK) \
break; \
@@ -895,8 +894,7 @@ gconv_end (struct __gconv_step *data)
result = DL_CALL_FCT \
(step_data->__trans.__trans_fct,\
(step, step_data, *inptrp, \
- &inptr, inend, *outptrp, \
- &outptr, outend, \
+ &inptr, inend, &outbuf, \
irreversible)); \
if (result != __GCONV_OK) \
break; \
diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c
index 4601e22e68..d3cca52d05 100644
--- a/iconvdata/iso-2022-kr.c
+++ b/iconvdata/iso-2022-kr.c
@@ -259,8 +259,7 @@ enum
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index f39f1b4d6d..df81ee2be6 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -889,7 +889,7 @@ gconv_end (struct __gconv_step *data)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/iso8859-1.c b/iconvdata/iso8859-1.c
index fb1fabc4f6..d69a201fed 100644
--- a/iconvdata/iso8859-1.c
+++ b/iconvdata/iso8859-1.c
@@ -53,7 +53,7 @@
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/iso_6937-2.c b/iconvdata/iso_6937-2.c
index 4f5a8689b8..536d8965fa 100644
--- a/iconvdata/iso_6937-2.c
+++ b/iconvdata/iso_6937-2.c
@@ -569,8 +569,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -595,7 +594,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/iso_6937.c b/iconvdata/iso_6937.c
index b7ab0841eb..f812ce2c93 100644
--- a/iconvdata/iso_6937.c
+++ b/iconvdata/iso_6937.c
@@ -546,8 +546,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -572,7 +571,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/johab.c b/iconvdata/johab.c
index 7253ff6cb8..ac3bf82b27 100644
--- a/iconvdata/johab.c
+++ b/iconvdata/johab.c
@@ -400,8 +400,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -446,8 +445,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/sjis.c b/iconvdata/sjis.c
index 2641b24743..806579b283 100644
--- a/iconvdata/sjis.c
+++ b/iconvdata/sjis.c
@@ -4472,8 +4472,7 @@ static const char from_ucs4_extra[0x100][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -4501,7 +4500,7 @@ static const char from_ucs4_extra[0x100][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c
index 991cce1626..a7d42277c9 100644
--- a/iconvdata/t.61.c
+++ b/iconvdata/t.61.c
@@ -473,8 +473,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -511,8 +510,7 @@ static const char from_ucs4[][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c
index 232e5c8416..9c494ff705 100644
--- a/iconvdata/uhc.c
+++ b/iconvdata/uhc.c
@@ -3225,8 +3225,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -3266,8 +3265,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/unicode.c b/iconvdata/unicode.c
index 438658edb9..e818c54c31 100644
--- a/iconvdata/unicode.c
+++ b/iconvdata/unicode.c
@@ -156,7 +156,7 @@ gconv_end (struct __gconv_step *data)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, inend, \
- *outptrp, &outptr, outend, irreversible)); \
+ &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c
index bbb546ef9a..44911feb42 100644
--- a/iconvdata/utf-16.c
+++ b/iconvdata/utf-16.c
@@ -206,8 +206,7 @@ gconv_end (struct __gconv_step *data)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
@@ -250,8 +249,7 @@ gconv_end (struct __gconv_step *data)
{ \
result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
(step, step_data, *inptrp, &inptr, \
- inend, *outptrp, &outptr, outend, \
- irreversible)); \
+ inend, &outbuf, irreversible)); \
if (result != __GCONV_OK) \
break; \
} \
diff --git a/libio/iofwide.c b/libio/iofwide.c
index bb26dddc85..8ad2129062 100644
--- a/libio/iofwide.c
+++ b/libio/iofwide.c
@@ -181,7 +181,7 @@ do_out (struct _IO_codecvt *codecvt, __mbstate_t *statep,
status = DL_CALL_FCT (gs->__fct,
(gs, codecvt->__cd_out.__cd.__data, &from_start_copy,
- (const unsigned char *) from_end, to_start,
+ (const unsigned char *) from_end, NULL,
&dummy, 0, 0));
*from_stop = (wchar_t *) from_start_copy;
@@ -229,7 +229,7 @@ do_unshift (struct _IO_codecvt *codecvt, __mbstate_t *statep,
status = DL_CALL_FCT (gs->__fct,
(gs, codecvt->__cd_out.__cd.__data, NULL, NULL,
- to_start, &dummy, 1, 0));
+ NULL, &dummy, 1, 0));
*to_stop = codecvt->__cd_out.__cd.__data[0].__outbuf;
@@ -277,7 +277,7 @@ do_in (struct _IO_codecvt *codecvt, __mbstate_t *statep,
status = DL_CALL_FCT (gs->__fct,
(gs, codecvt->__cd_in.__cd.__data, &from_start_copy,
- from_end, (char *) to_start, &dummy, 0, 0));
+ from_end, NULL, &dummy, 0, 0));
*from_stop = from_start_copy;
*to_stop = (wchar_t *) codecvt->__cd_in.__cd.__data[0].__outbuf;
@@ -354,7 +354,7 @@ do_length (struct _IO_codecvt *codecvt, __mbstate_t *statep,
status = DL_CALL_FCT (gs->__fct,
(gs, codecvt->__cd_in.__cd.__data, &cp, from_end,
- (char *) to_buf, &dummy, 0, 0));
+ NULL, &dummy, 0, 0));
result = cp - (const unsigned char *) from_start;
#else
diff --git a/wcsmbs/btowc.c b/wcsmbs/btowc.c
index a6841032f2..cf0ec0825c 100644
--- a/wcsmbs/btowc.c
+++ b/wcsmbs/btowc.c
@@ -62,7 +62,7 @@ __btowc (c)
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.towc->__fct,
(__wcsmbs_gconv_fcts.towc, &data, &inptr, inptr + 1,
- data.__outbuf, &dummy, 0, 1));
+ NULL, &dummy, 0, 1));
/* The conversion failed. */
if (status != __GCONV_OK && status != __GCONV_FULL_OUTPUT
&& status != __GCONV_EMPTY_INPUT)
diff --git a/wcsmbs/mbrtowc.c b/wcsmbs/mbrtowc.c
index b67b3f7d34..6f5417980b 100644
--- a/wcsmbs/mbrtowc.c
+++ b/wcsmbs/mbrtowc.c
@@ -73,7 +73,7 @@ __mbrtowc (wchar_t *pwc, const char *s, size_t n, mbstate_t *ps)
inbuf = (const unsigned char *) s;
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.towc->__fct,
(__wcsmbs_gconv_fcts.towc, &data, &inbuf, inbuf + n,
- data.__outbuf, &dummy, 0, 1));
+ NULL, &dummy, 0, 1));
/* There must not be any problems with the conversion but illegal input
characters. The output buffer must be large enough, otherwise the
diff --git a/wcsmbs/mbsnrtowcs.c b/wcsmbs/mbsnrtowcs.c
index 51d9cd09f2..0410232187 100644
--- a/wcsmbs/mbsnrtowcs.c
+++ b/wcsmbs/mbsnrtowcs.c
@@ -82,7 +82,7 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
data.__outbuf = (unsigned char *) buf;
status = DL_CALL_FCT (towc->__fct,
- (towc, &data, &inbuf, srcend, data.__outbuf,
+ (towc, &data, &inbuf, srcend, NULL,
&dummy, 0, 1));
result += (wchar_t *) data.__outbuf - buf;
@@ -104,7 +104,7 @@ __mbsnrtowcs (dst, src, nmc, len, ps)
status = DL_CALL_FCT (towc->__fct,
(towc, &data, (const unsigned char **) src, srcend,
- data.__outbuf, &dummy, 0, 1));
+ NULL, &dummy, 0, 1));
result = (wchar_t *) data.__outbuf - dst;
diff --git a/wcsmbs/mbsrtowcs.c b/wcsmbs/mbsrtowcs.c
index 77e631ea46..73a24a7608 100644
--- a/wcsmbs/mbsrtowcs.c
+++ b/wcsmbs/mbsrtowcs.c
@@ -79,7 +79,7 @@ __mbsrtowcs (dst, src, len, ps)
data.__outbuf = (char *) buf;
status = DL_CALL_FCT (towc->__fct,
- (towc, &data, &inbuf, srcend, data.__outbuf,
+ (towc, &data, &inbuf, srcend, NULL,
&non_reversible, 0, 1));
result += (wchar_t *) data.__outbuf - buf;
@@ -110,7 +110,7 @@ __mbsrtowcs (dst, src, len, ps)
status = DL_CALL_FCT (towc->__fct,
(towc, &data, (const unsigned char **) src, srcend,
- data.__outbuf, &non_reversible, 0, 1));
+ NULL, &non_reversible, 0, 1));
result = (wchar_t *) data.__outbuf - dst;
diff --git a/wcsmbs/wcrtomb.c b/wcsmbs/wcrtomb.c
index 375a000072..f7100d4fc7 100644
--- a/wcsmbs/wcrtomb.c
+++ b/wcsmbs/wcrtomb.c
@@ -75,7 +75,7 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
{
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.tomb->__fct,
(__wcsmbs_gconv_fcts.tomb, &data, NULL, NULL,
- data.__outbuf, &dummy, 1, 1));
+ NULL, &dummy, 1, 1));
if (status == __GCONV_OK || status == __GCONV_EMPTY_INPUT)
*data.__outbuf++ = '\0';
@@ -87,8 +87,7 @@ __wcrtomb (char *s, wchar_t wc, mbstate_t *ps)
status = DL_CALL_FCT (__wcsmbs_gconv_fcts.tomb->__fct,
(__wcsmbs_gconv_fcts.tomb, &data, &inbuf,
- inbuf + sizeof (wchar_t), data.__outbuf, &dummy,
- 0, 1));
+ inbuf + sizeof (wchar_t), NULL, &dummy, 0, 1));
}
/* There must not be any problems with the conversion but illegal input
diff --git a/wcsmbs/wcsnrtombs.c b/wcsmbs/wcsnrtombs.c
index ec87d85a99..f7b4363779 100644
--- a/wcsmbs/wcsnrtombs.c
+++ b/wcsmbs/wcsnrtombs.c
@@ -83,7 +83,7 @@ __wcsnrtombs (dst, src, nwc, len, ps)
status = DL_CALL_FCT (tomb->__fct,
(tomb, &data, (const unsigned char **) &inbuf,
- (const unsigned char *) srcend, data.__outbuf,
+ (const unsigned char *) srcend, NULL,
&dummy, 0, 1));
/* Count the number of bytes. */
@@ -108,7 +108,7 @@ __wcsnrtombs (dst, src, nwc, len, ps)
status = DL_CALL_FCT (tomb->__fct,
(tomb, &data, (const unsigned char **) src,
- (const unsigned char *) srcend, data.__outbuf,
+ (const unsigned char *) srcend, NULL,
&dummy, 0, 1));
/* Count the number of bytes. */
diff --git a/wcsmbs/wcsrtombs.c b/wcsmbs/wcsrtombs.c
index b2e4c18ccc..3c731aaa54 100644
--- a/wcsmbs/wcsrtombs.c
+++ b/wcsmbs/wcsrtombs.c
@@ -80,7 +80,7 @@ __wcsrtombs (dst, src, len, ps)
status = DL_CALL_FCT (tomb->__fct,
(tomb, &data, (const unsigned char **) &inbuf,
- (const unsigned char *) srcend, data.__outbuf,
+ (const unsigned char *) srcend, NULL,
&dummy, 0, 1));
/* Count the number of bytes. */
@@ -109,7 +109,7 @@ __wcsrtombs (dst, src, len, ps)
status = DL_CALL_FCT (tomb->__fct,
(tomb, &data, (const unsigned char **) src,
- (const unsigned char *) srcend, data.__outbuf,
+ (const unsigned char *) srcend, NULL,
&dummy, 0, 1));
/* Count the number of bytes. */
diff --git a/wcsmbs/wctob.c b/wcsmbs/wctob.c
index 800a37e2f8..cee739c251 100644
--- a/wcsmbs/wctob.c
+++ b/wcsmbs/wctob.c
@@ -58,7 +58,7 @@ wctob (c)
(__wcsmbs_gconv_fcts.tomb, &data,
(const unsigned char **) &inptr,
(const unsigned char *) &inbuf[1],
- data.__outbuf, &dummy, 0, 1));
+ NULL, &dummy, 0, 1));
/* The conversion failed or the output is too long. */
if ((status != __GCONV_OK && status != __GCONV_FULL_OUTPUT