Update.
authorUlrich Drepper <drepper@redhat.com>
Fri, 16 Jun 2000 00:39:38 +0000 (00:39 +0000)
committerUlrich Drepper <drepper@redhat.com>
Fri, 16 Jun 2000 00:39:38 +0000 (00:39 +0000)
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.

41 files changed:
ChangeLog
iconv/gconv.c
iconv/gconv.h
iconv/gconv_int.h
iconv/gconv_open.c
iconv/gconv_simple.c
iconv/gconv_trans.c
iconv/skeleton.c
iconvdata/8bit-gap.c
iconvdata/8bit-generic.c
iconvdata/ansi_x3.110.c
iconvdata/big5.c
iconvdata/big5hkscs.c
iconvdata/euc-cn.c
iconvdata/euc-jp.c
iconvdata/euc-kr.c
iconvdata/euc-tw.c
iconvdata/gbgbk.c
iconvdata/gbk.c
iconvdata/iso-2022-cn.c
iconvdata/iso-2022-jp.c
iconvdata/iso-2022-kr.c
iconvdata/iso646.c
iconvdata/iso8859-1.c
iconvdata/iso_6937-2.c
iconvdata/iso_6937.c
iconvdata/johab.c
iconvdata/sjis.c
iconvdata/t.61.c
iconvdata/uhc.c
iconvdata/unicode.c
iconvdata/utf-16.c
libio/iofwide.c
wcsmbs/btowc.c
wcsmbs/mbrtowc.c
wcsmbs/mbsnrtowcs.c
wcsmbs/mbsrtowcs.c
wcsmbs/wcrtomb.c
wcsmbs/wcsnrtombs.c
wcsmbs/wcsrtombs.c
wcsmbs/wctob.c

index 8369e52..72e3748 100644 (file)
--- 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
index 19f9562..0b7b917 100644 (file)
@@ -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);
index 2bba133..0164b62 100644 (file)
@@ -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,
index 87287d7..34dff7d 100644 (file)
@@ -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);
index 984ca9d..14f1d5e 100644 (file)
@@ -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)
index 5033f3e..3905745 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index 56c3ff6..829ff5f 100644 (file)
@@ -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"
 
 
 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;
 }
index d64d759..8dbebb8 100644 (file)
@@ -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)
index 23a63fd..6394065 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index 62160c6..1478c5b 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index f403773..f338055 100644 (file)
@@ -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;                                                      \
              }                                                               \
index 2e03937..8cad304 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index b5fe966..0859dd8 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index c7a02c2..075970c 100644 (file)
                  {                                                           \
                    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;                                                  \
                  }                                                           \
index 6cf89e3..771dc06 100644 (file)
                      {                                                       \
                        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;                                              \
index 88794f2..e953df5 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index ee88d4e..f315247 100644 (file)
                  {                                                           \
                    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;                                                  \
                  }                                                           \
index c6f2e4e..15e72d9 100644 (file)
              {                                                               \
                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;                                                      \
              }                                                               \
index f820591..669e4a9 100644 (file)
@@ -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;                                                        \
            }                                                                 \
index af7f92d..818f2a7 100644 (file)
@@ -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;                                              \
index c6a43d1..b66c950 100644 (file)
@@ -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;                          \
index 4601e22..d3cca52 100644 (file)
@@ -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;                                                      \
              }                                                               \
index f39f1b4..df81ee2 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index fb1fabc..d69a201 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index 4f5a868..536d896 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index b7ab084..f812ce2 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index 7253ff6..ac3bf82 100644 (file)
@@ -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;                                                  \
                  }                                                           \
index 2641b24..806579b 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index 991cce1..a7d4227 100644 (file)
@@ -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;                                                      \
              }                                                               \
index 232e5c8..9c494ff 100644 (file)
@@ -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;                                                      \
              }                                                               \
index 438658e..e818c54 100644 (file)
@@ -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;                                                          \
          }                                                                   \
index bbb546e..44911fe 100644 (file)
@@ -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;                                                  \
                  }                                                           \
index bb26ddd..8ad2129 100644 (file)
@@ -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
index a684103..cf0ec08 100644 (file)
@@ -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)
index b67b3f7..6f54179 100644 (file)
@@ -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
index 51d9cd0..0410232 100644 (file)
@@ -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;
 
index 77e631e..73a24a7 100644 (file)
@@ -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;
 
index 375a000..f7100d4 100644 (file)
@@ -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
index ec87d85..f7b4363 100644 (file)
@@ -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.  */
index b2e4c18..3c731aa 100644 (file)
@@ -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.  */
index 800a37e..cee739c 100644 (file)
@@ -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