Update interfaces of functions. Insert appropriate error handling
authordrepper <drepper>
Mon, 12 Jun 2000 19:41:40 +0000 (19:41 +0000)
committerdrepper <drepper>
Mon, 12 Jun 2000 19:41:40 +0000 (19:41 +0000)
code to use transliteration steps.  Remove optimization for BODY with
NEED_LENGTH_TEST == 0.

24 files changed:
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

index 2d66f8b..23a63fd 100644 (file)
@@ -19,6 +19,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <dlfcn.h>
 #include <stdint.h>
 
 struct gap
@@ -67,6 +68,7 @@ struct gap
                                                                              \
     ++inptr;                                                                 \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -83,7 +85,15 @@ struct gap
     if (__builtin_expect (ch, 0) >= 0xffff)                                  \
       {                                                                              \
        /* This is an illegal character.  */                                  \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
@@ -98,14 +108,24 @@ struct gap
     if (__builtin_expect (ch < rp->start, 0))                                \
       {                                                                              \
        /* This is an illegal character.  */                                  \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
-       inptr += 4;                                                           \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
        continue;                                                             \
       }                                                                              \
                                                                              \
@@ -113,20 +133,31 @@ struct gap
     if (__builtin_expect (res, '\1') == '\0' && ch != 0)                     \
       {                                                                              \
        /* This is an illegal character.  */                                  \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
-       inptr += 4;                                                           \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
        continue;                                                             \
       }                                                                              \
                                                                              \
     *outptr++ = res;                                                         \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 97ca193..62160c6 100644 (file)
@@ -18,6 +18,8 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <dlfcn.h>
+
 #define FROM_LOOP              from_generic
 #define TO_LOOP                        to_generic
 #define DEFINE_INIT            1
@@ -50,6 +52,7 @@
     outptr += 4;                                                             \
     ++inptr;                                                                 \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
        || (__builtin_expect (from_ucs4[ch], '\1') == '\0' && ch != 0))       \
       {                                                                              \
        /* This is an illegal character.  */                                  \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
       }                                                                              \
     else                                                                     \
-      *outptr++ = from_ucs4[ch];                                             \
-                                                                             \
-    inptr += 4;                                                                      \
+      {                                                                              \
+       *outptr++ = from_ucs4[ch];                                            \
+       inptr += 4;                                                           \
+      }                                                                              \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 2dd082d..f403773 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 <gconv.h>
 #include <stdint.h>
 #include <string.h>
@@ -407,7 +408,7 @@ static const char from_ucs4[][2] =
           is also available.  */                                             \
        uint32_t ch2;                                                         \
                                                                              \
-       if (NEED_LENGTH_TEST && inptr + 1 >= inend)                           \
+       if (inptr + 1 >= inend)                                               \
          {                                                                   \
            /* The second character is not available.  */                     \
            result = __GCONV_INCOMPLETE_INPUT;                                \
@@ -458,6 +459,7 @@ static const char from_ucs4[][2] =
                                                                              \
     inptr += incr;                                                           \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -495,14 +497,25 @@ static const char from_ucs4[][2] =
            if (tmp[0] == '\0')                                               \
              {                                                               \
                /* Illegal characters.  */                                    \
-               if (! ignore_errors_p ())                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
                  {                                                           \
                    result = __GCONV_ILLEGAL_INPUT;                           \
                    break;                                                    \
                  }                                                           \
-                                                                             \
-               ++*irreversible;                                              \
-               inptr += 4;                                                   \
+               else                                                          \
+                 {                                                           \
+                   ++*irreversible;                                          \
+                   inptr += 4;                                               \
+                 }                                                           \
                continue;                                                     \
              }                                                               \
            tmp[1] = '\0';                                                    \
@@ -543,14 +556,25 @@ static const char from_ucs4[][2] =
        else                                                                  \
          {                                                                   \
            /* Illegal characters.  */                                        \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           ++*irreversible;                                                  \
-           inptr += 4;                                                       \
+           else                                                              \
+             {                                                               \
+               ++*irreversible;                                              \
+               inptr += 4;                                                   \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
       }                                                                              \
@@ -561,14 +585,25 @@ static const char from_ucs4[][2] =
        if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                \
          {                                                                   \
            /* Illegal characters.  */                                        \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           ++*irreversible;                                                  \
-           inptr += 4;                                                       \
+           else                                                              \
+             {                                                               \
+               ++*irreversible;                                              \
+               inptr += 4;                                                   \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
       }                                                                              \
@@ -577,7 +612,7 @@ static const char from_ucs4[][2] =
     /* Now test for a possible second byte and write this if possible.  */    \
     if (cp[1] != '\0')                                                       \
       {                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0))       \
+       if (__builtin_expect (outptr >= outend, 0))                           \
          {                                                                   \
            /* The result does not fit into the buffer.  */                   \
            --outptr;                                                         \
@@ -590,6 +625,7 @@ static const char from_ucs4[][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index a52f850..2e03937 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 <gconv.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -8438,7 +8439,7 @@ static const char from_ucs4_tab13[][2] =
        uint32_t ch2;                                                         \
        int idx;                                                              \
                                                                              \
-       if (NEED_LENGTH_TEST && inptr + 1 >= inend)                           \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  */                     \
            result = __GCONV_INCOMPLETE_INPUT;                                \
@@ -8493,6 +8494,7 @@ static const char from_ucs4_tab13[][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -8583,18 +8585,30 @@ static const char from_ucs4_tab13[][2] =
     if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                   \
       {                                                                              \
        /* Illegal character.  */                                             \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       {                                                                              \
        /* See whether there is enough room for the second byte we write.  */ \
-       if (NEED_LENGTH_TEST && __builtin_expect (cp[1], '\1') != '\0'        \
+       if (__builtin_expect (cp[1], '\1') != '\0'                            \
            && __builtin_expect (outptr + 1 >= outend, 0))                    \
          {                                                                   \
            /* We have not enough room.  */                                   \
@@ -8609,6 +8623,7 @@ static const char from_ucs4_tab13[][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 1ca22d6..b5fe966 100644 (file)
@@ -19,6 +19,7 @@
    write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
    Boston, MA 02111-1307, USA.  */
 
+#include <dlfcn.h>
 #include <gconv.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -12592,7 +12593,7 @@ static const char from_ucs4_tab14[][2] =
        uint32_t ch2;                                                         \
        int idx;                                                              \
                                                                              \
-       if (NEED_LENGTH_TEST && inptr + 1 >= inend)                           \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  */                     \
            result = __GCONV_INCOMPLETE_INPUT;                                \
@@ -12647,6 +12648,7 @@ static const char from_ucs4_tab14[][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -12740,18 +12742,30 @@ static const char from_ucs4_tab14[][2] =
     if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                   \
       {                                                                              \
        /* Illegal character.  */                                             \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       {                                                                              \
        /* See whether there is enough room for the second byte we write.  */ \
-       if (NEED_LENGTH_TEST && __builtin_expect (cp[1], '\1') != '\0'        \
+       if (__builtin_expect (cp[1], '\1') != '\0'                            \
            && __builtin_expect (outptr + 1 >= outend, 0))                    \
          {                                                                   \
            /* We have not enough room.  */                                   \
@@ -12766,6 +12780,7 @@ static const char from_ucs4_tab14[][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 2c2b36e..c7a02c2 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 <gb2312.h>
 #include <stdint.h>
 
@@ -64,7 +65,7 @@
             next character is also available.  */                            \
          const unsigned char *endp;                                          \
                                                                              \
-         if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))   \
+         if (__builtin_expect (inptr + 1 >= inend, 0))                       \
            {                                                                 \
              /* The second character is not available.  Store                \
                 the intermediate result.  */                                 \
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
       {                                                                              \
        size_t found;                                                         \
                                                                              \
-       found = ucs4_to_gb2312 (ch, outptr,                                   \
-                               (NEED_LENGTH_TEST                             \
-                                ? outend - outptr : MAX_NEEDED_OUTPUT));     \
-       if (!NEED_LENGTH_TEST || __builtin_expect (found, 1) != 0)            \
+       found = ucs4_to_gb2312 (ch, outptr, outend - outptr);                 \
+       if (__builtin_expect (found, 1) != 0)                                 \
          {                                                                   \
            if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR)          \
              {                                                               \
                /* Illegal character.  */                                     \
-               if (! ignore_errors_p ())                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
                  {                                                           \
                    result = __GCONV_ILLEGAL_INPUT;                           \
                    break;                                                    \
                  }                                                           \
-                                                                             \
-               inptr += 4;                                                   \
-               ++*irreversible;                                              \
+               else                                                          \
+                 {                                                           \
+                   inptr += 4;                                               \
+                   ++*irreversible;                                          \
+                 }                                                           \
                continue;                                                     \
              }                                                               \
                                                                              \
       }                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 93622e7..6cf89e3 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.h>
 #include <jis0201.h>
@@ -66,7 +67,7 @@
           character is also available.  */                                   \
        int ch2;                                                              \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store the              \
               intermediate result.  */                                       \
                /* This is code set 3: JIS X 0212-1990.  */                   \
                endp = inptr + 1;                                             \
                                                                              \
-               ch = jisx0212_to_ucs4 (&endp,                                 \
-                                      NEED_LENGTH_TEST ? inend - endp : 2,   \
-                                      0x80);                                 \
+               ch = jisx0212_to_ucs4 (&endp, inend - endp, 0x80);            \
              }                                                               \
            else                                                              \
              {                                                               \
                /* This is code set 1: JIS X 0208.  */                        \
                endp = inptr;                                                 \
                                                                              \
-               ch = jisx0208_to_ucs4 (&endp,                                 \
-                                      NEED_LENGTH_TEST ? inend - inptr : 2,  \
-                                      0x80);                                 \
+               ch = jisx0208_to_ucs4 (&endp, inend - inptr, 0x80);           \
              }                                                               \
                                                                              \
-           if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0)            \
+           if (__builtin_expect (ch, 1) == 0)                                \
              {                                                               \
                /* Not enough input available.  */                            \
                result = __GCONV_INCOMPLETE_INPUT;                            \
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
        size_t found;                                                         \
                                                                              \
        /* See whether we have room for at least two characters.  */          \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr + 1 >= outend, 0))   \
+       if (__builtin_expect (outptr + 1 >= outend, 0))                       \
          {                                                                   \
            result = __GCONV_FULL_OUTPUT;                                     \
            break;                                                            \
              {                                                               \
                /* No JIS 0208 character.  */                                 \
                found = ucs4_to_jisx0212 (ch, outptr + 1,                     \
-                                         (NEED_LENGTH_TEST                   \
-                                          ? outend - outptr - 1 : 2));       \
+                                         outend - outptr - 1);               \
                                                                              \
                if (__builtin_expect (found, 1) == 0)                         \
                  {                                                           \
                else                                                          \
                  {                                                           \
                    /* Illegal character.  */                                 \
-                   if (! ignore_errors_p ())                                 \
+                   if (step_data->__trans.__trans_fct != NULL)               \
+                     {                                                       \
+                       result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
+                                             (step, step_data, *inptrp,      \
+                                              &inptr, inend, *outptrp,       \
+                                              &outptr, outend,               \
+                                              irreversible));                \
+                       if (result != __GCONV_OK)                             \
+                         break;                                              \
+                     }                                                       \
+                   else if (! ignore_errors_p ())                            \
                      {                                                       \
                        result = __GCONV_ILLEGAL_INPUT;                       \
                        break;                                                \
                      }                                                       \
-                                                                             \
-                   inptr += 4;                                               \
-                   ++*irreversible;                                          \
+                   else                                                      \
+                     {                                                       \
+                       inptr += 4;                                           \
+                       ++*irreversible;                                      \
+                     }                                                       \
                    continue;                                                 \
                  }                                                           \
              }                                                               \
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index f067fbc..88794f2 100644 (file)
@@ -19,6 +19,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 <ksc5601.h>
 
@@ -98,9 +99,8 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
       {                                                                              \
        /* Two-byte character.  First test whether the next character         \
           is also available.  */                                             \
-       ch = ksc5601_to_ucs4 (&inptr,                                         \
-                             NEED_LENGTH_TEST ? inptr - inend : 2, 0x80);    \
-       if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0)                \
+       ch = ksc5601_to_ucs4 (&inptr, inptr - inend, 0x80);                   \
+       if (__builtin_expect (ch, 1) == 0)                                    \
          {                                                                   \
            /* The second character is not available.  */                     \
            result = __GCONV_INCOMPLETE_INPUT;                                \
@@ -125,6 +125,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -145,14 +146,24 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
     if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                   \
       {                                                                              \
        /* Illegal character.  */                                             \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       inptr += 4;                                                           \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           inptr += 4;                                                       \
+           ++*irreversible;                                                  \
+         }                                                                   \
        continue;                                                             \
       }                                                                              \
                                                                              \
@@ -160,7 +171,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
     /* Now test for a possible second byte and write this if possible.  */    \
     if (cp[1] != '\0')                                                       \
       {                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0))       \
+       if (__builtin_expect (outptr >= outend, 0))                           \
          {                                                                   \
            /* The result does not fit into the buffer.  */                   \
            --outptr;                                                         \
@@ -172,6 +183,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp)
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index a508c84..ee88d4e 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 <cns11643l1.h>
 #include <cns11643.h>
     else if ((ch <= 0xa0 || ch > 0xfe) && ch != 0x8e)                        \
       {                                                                              \
        /* This is illegal.  */                                               \
-       result = __GCONV_ILLEGAL_INPUT;                                       \
-       break;                                                                \
+       if (! ignore_errors_p ())                                             \
+         {                                                                   \
+           result = __GCONV_ILLEGAL_INPUT;                                   \
+           break;                                                            \
+         }                                                                   \
+                                                                             \
+       ++inptr;                                                              \
+       ++*irreversible;                                                      \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       {                                                                              \
@@ -57,7 +65,7 @@
           character is also available.  */                                   \
        uint32_t ch2;                                                         \
                                                                              \
-       if (NEED_LENGTH_TEST && inptr + (ch == 0x8e ? 3 : 1) >= inend)        \
+       if (inptr + (ch == 0x8e ? 3 : 1) >= inend)                            \
          {                                                                   \
            /* The second character is not available.  Store the              \
               intermediate result.  */                                       \
        /* All second bytes of a multibyte character must be >= 0xa1. */      \
        if (ch2 < 0xa1 || ch2 == 0xff)                                        \
          {                                                                   \
-           /* This is an illegal character.  */                              \
-           result = __GCONV_ILLEGAL_INPUT;                                   \
-           break;                                                            \
+           /* This is illegal.  */                                           \
+           if (! ignore_errors_p ())                                         \
+             {                                                               \
+               result = __GCONV_ILLEGAL_INPUT;                               \
+               break;                                                        \
+             }                                                               \
+                                                                             \
+           ++inptr;                                                          \
+           ++*irreversible;                                                  \
+           continue;                                                         \
          }                                                                   \
                                                                              \
        if (ch == 0x8e)                                                       \
            /* This is code set 2: CNS 11643, planes 1 to 16.  */             \
            const char *endp = inptr + 1;                                     \
                                                                              \
-           ch = cns11643_to_ucs4 (&endp,                                     \
-                                  NEED_LENGTH_TEST ? inend - inptr - 1 : 3,  \
-                                  0x80);                                     \
+           ch = cns11643_to_ucs4 (&endp, inend - inptr - 1, 0x80);           \
            /* Please note that we need not test for the missing input        \
               characters here anymore.  */                                   \
            if (ch == __UNKNOWN_10646_CHAR)                                   \
              {                                                               \
                /* Illegal input.  */                                         \
-               result = __GCONV_ILLEGAL_INPUT;                               \
-               break;                                                        \
+               if (! ignore_errors_p ())                                     \
+                 {                                                           \
+                   /* This is an illegal character.  */                      \
+                   result = __GCONV_ILLEGAL_INPUT;                           \
+                   break;                                                    \
+                 }                                                           \
+                                                                             \
+               ++inptr;                                                      \
+               ++*irreversible;                                              \
+               continue;                                                     \
              }                                                               \
                                                                              \
            inptr += 4;                                                       \
            /* This is code set 1: CNS 11643, plane 1.  */                    \
            const unsigned char *endp = inptr;                                \
                                                                              \
-           ch = cns11643l1_to_ucs4 (&endp,                                   \
-                                    NEED_LENGTH_TEST ? inend - inptr : 2,    \
-                                    0x80);                                   \
+           ch = cns11643l1_to_ucs4 (&endp, inend - inptr, 0x80);             \
            /* Please note that we need not test for the missing input        \
               characters here anymore.  */                                   \
            if (ch == __UNKNOWN_10646_CHAR)                                   \
              {                                                               \
                /* Illegal input.  */                                         \
-               result = __GCONV_ILLEGAL_INPUT;                               \
-               break;                                                        \
+               if (! ignore_errors_p ())                                     \
+                 {                                                           \
+                   /* This is an illegal character.  */                      \
+                   result = __GCONV_ILLEGAL_INPUT;                           \
+                   break;                                                    \
+                 }                                                           \
+                                                                             \
+               inptr += 2;                                                   \
+               ++*irreversible;                                              \
+               continue;                                                     \
              }                                                               \
                                                                              \
            inptr += 2;                                                       \
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
        /* Try the JIS character sets.  */                                    \
        size_t found;                                                         \
                                                                              \
-       found = ucs4_to_cns11643l1 (ch, outptr,                               \
-                                   NEED_LENGTH_TEST ? outend - outptr : 2);  \
-       if (NEED_LENGTH_TEST && found == 0)                                   \
+       found = ucs4_to_cns11643l1 (ch, outptr, outend - outptr);             \
+       if (__builtin_expect (found, 1) == 0)                                 \
          {                                                                   \
            /* We ran out of space.  */                                       \
            result = __GCONV_INCOMPLETE_INPUT;                                \
            break;                                                            \
          }                                                                   \
-       if (found != __UNKNOWN_10646_CHAR)                                    \
+       if (__builtin_expect (found, 1) != __UNKNOWN_10646_CHAR)              \
          {                                                                   \
            /* It's a CNS 11643, plane 1 character, adjust it for EUC-TW.  */ \
            *outptr++ += 0x80;                                                \
          {                                                                   \
            /* No CNS 11643, plane 1 character.  */                           \
                                                                              \
-           found = ucs4_to_cns11643 (ch, outptr + 1,                         \
-                                     (NEED_LENGTH_TEST                       \
-                                      ? outend - outptr - 1 : 3));           \
-           if (NEED_LENGTH_TEST && found == 0)                               \
+           found = ucs4_to_cns11643 (ch, outptr + 1, outend - outptr - 1);   \
+           if (__builtin_expect (found, 1) == 0)                             \
              {                                                               \
                /* We ran out of space.  */                                   \
                result = __GCONV_INCOMPLETE_INPUT;                            \
                break;                                                        \
              }                                                               \
-           if (found == __UNKNOWN_10646_CHAR)                                \
+           if (__builtin_expect (found, 0) == __UNKNOWN_10646_CHAR)          \
              {                                                               \
-               /* No legal input.  */                                        \
-               result = __GCONV_ILLEGAL_INPUT;                               \
-               break;                                                        \
+               /* Illegal character.  */                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
+                 {                                                           \
+                   result = __GCONV_ILLEGAL_INPUT;                           \
+                   break;                                                    \
+                 }                                                           \
+               else                                                          \
+                 {                                                           \
+                   inptr += 4;                                               \
+                   ++*irreversible;                                          \
+                 }                                                           \
+               continue;                                                     \
              }                                                               \
                                                                              \
            /* It's a CNS 11643 character, adjust it for EUC-TW.  */          \
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 0fbbfc8..c6f2e4e 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 <gconv.h>
 #include <stdint.h>
 
@@ -71,7 +72,7 @@
                UCS4 -> GB2312 -> GBK -> UCS4                                 \
                                                                              \
           might not produce identical text.  */                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store                  \
               the intermediate result.  */                                   \
@@ -79,7 +80,7 @@
            break;                                                            \
          }                                                                   \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outend - outptr < 2, 0))    \
+       if (__builtin_expect (outend - outptr < 2, 0))                        \
          {                                                                   \
            /* We ran out of space.  */                                       \
            result = __GCONV_FULL_OUTPUT;                                     \
                && __builtin_expect (ch, 0xa1a1) <= 0xa8c0))                  \
          {                                                                   \
            /* One of the characters we cannot map.  */                       \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 2;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 2;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
          }                                                                   \
        else                                                                  \
          {                                                                   \
          }                                                                   \
       }                                                                              \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
                                                                              \
     if (ch > 0x7f)                                                           \
       {                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store                  \
                 the intermediate result.  */                                 \
            break;                                                            \
          }                                                                   \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outend - outptr < 2, 0))    \
+       if (__builtin_expect (outend - outptr < 2, 0))                        \
          {                                                                   \
            /* We ran out of space.  */                                       \
            result = __GCONV_FULL_OUTPUT;                                     \
index 952f76a..f820591 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 <gconv.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -13109,7 +13110,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
 #define MIN_NEEDED_TO          4
 
 
-/* First define the conversion function from ISO 8859-1 to UCS4.  */
+/* First define the conversion function from GBK to UCS4.  */
 #define MIN_NEEDED_INPUT       MIN_NEEDED_FROM
 #define MAX_NEEDED_INPUT       MAX_NEEDED_FROM
 #define MIN_NEEDED_OUTPUT      MIN_NEEDED_TO
@@ -13142,7 +13143,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
          uint32_t ch2;                                                       \
          int idx;                                                            \
                                                                              \
-         if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))   \
+         if (__builtin_expect (inptr + 1 >= inend, 0))                       \
            {                                                                 \
              /* The second character is not available.  Store                \
                 the intermediate result.  */                                 \
@@ -13194,6 +13195,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -13450,17 +13452,29 @@ static const char __gbk_from_ucs4_tab12[][2] =
       if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                 \
        {                                                                     \
          /* Illegal character.  */                                           \
-         if (! ignore_errors_p ())                                           \
+         if (step_data->__trans.__trans_fct != NULL)                         \
+           {                                                                 \
+             result = DL_CALL_FCT (step_data->__trans.__trans_fct,           \
+                                   (step, step_data, *inptrp, &inptr, inend, \
+                                    *outptrp, &outptr, outend,               \
+                                    irreversible));                          \
+             if (result != __GCONV_OK)                                       \
+               break;                                                        \
+           }                                                                 \
+         else if (! ignore_errors_p ())                                      \
            {                                                                 \
              result = __GCONV_ILLEGAL_INPUT;                                 \
              break;                                                          \
            }                                                                 \
-                                                                             \
-         ++*irreversible;                                                    \
+         else                                                                \
+           {                                                                 \
+             inptr += 4;                                                     \
+             ++*irreversible;                                                \
+           }                                                                 \
+         continue;                                                           \
        }                                                                     \
       /* See whether there is enough room for the second byte we write.  */   \
-      else if (NEED_LENGTH_TEST && cp[1] != '\0'                             \
-              && __builtin_expect (outptr + 1 >= outend, 0))                 \
+      else if (cp[1] != '\0' && __builtin_expect (outptr + 1 >= outend, 0))   \
        {                                                                     \
          /* We have not enough room.  */                                     \
          result = __GCONV_FULL_OUTPUT;                                       \
@@ -13476,6 +13490,7 @@ static const char __gbk_from_ucs4_tab12[][2] =
                                                                              \
     inptr += 4;                                                               \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 38b138b..af7f92d 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 <gconv.h>
 #include <stdint.h>
 #include <string.h>
@@ -140,16 +141,15 @@ enum
             line; we can simply ignore them                                  \
           - the initial byte of the SS2 sequence.                            \
        */                                                                    \
-       if (NEED_LENGTH_TEST                                                  \
-           && (__builtin_expect (inptr + 1 > inend, 0)                       \
-               || (inptr[1] == '$'                                           \
-                   && (__builtin_expect (inptr + 2 > inend, 0)               \
-                       || (inptr[2] == ')'                                   \
-                           && __builtin_expect (inptr + 3 > inend, 0))       \
-                       || (inptr[2] == '*'                                   \
-                           && __builtin_expect (inptr + 3 > inend, 0))))     \
-               || (inptr[1] == SS2_1                                         \
-                   && __builtin_expect (inptr + 3 > inend, 0))))             \
+       if (__builtin_expect (inptr + 1 > inend, 0)                           \
+           || (inptr[1] == '$'                                               \
+               && (__builtin_expect (inptr + 2 > inend, 0)                   \
+                   || (inptr[2] == ')'                                       \
+                       && __builtin_expect (inptr + 3 > inend, 0))           \
+                   || (inptr[2] == '*'                                       \
+                       && __builtin_expect (inptr + 3 > inend, 0))))         \
+           || (inptr[1] == SS2_1                                             \
+               && __builtin_expect (inptr + 3 > inend, 0)))                  \
          {                                                                   \
            result = __GCONV_EMPTY_INPUT;                                     \
            break;                                                            \
@@ -216,16 +216,14 @@ enum
       {                                                                              \
        /* That's pretty easy, we have a dedicated functions for this.  */    \
        if (set == GB2312_set)                                                \
-         ch = gb2312_to_ucs4 (&inptr,                                        \
-                              NEED_LENGTH_TEST ? inend - inptr : 2, 0);      \
+         ch = gb2312_to_ucs4 (&inptr, inend - inptr, 0);                     \
        else                                                                  \
          {                                                                   \
            assert (set == CNS11643_1_set);                                   \
-           ch = cns11643l1_to_ucs4 (&inptr,                                  \
-                                    NEED_LENGTH_TEST ? inend - inptr : 2, 0);\
+           ch = cns11643l1_to_ucs4 (&inptr, inend - inptr, 0);               \
          }                                                                   \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0)                \
+       if (__builtin_expect (ch, 1) == 0)                                    \
          {                                                                   \
            result = __GCONV_EMPTY_INPUT;                                     \
            break;                                                            \
@@ -248,6 +246,7 @@ enum
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , int *setp
 #define INIT_PARAMS            int set = *setp & CURRENT_SEL_MASK; \
                                int ann = *setp & CURRENT_ANN_MASK
@@ -272,7 +271,7 @@ enum
          {                                                                   \
            *outptr++ = SI;                                                   \
            set = ASCII_set;                                                  \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr == outend, 0))   \
+           if (__builtin_expect (outptr == outend, 0))                       \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -325,14 +324,26 @@ enum
                else                                                          \
                  {                                                           \
                    /* Even this does not work.  Error.  */                   \
-                   if (! ignore_errors_p ())                                 \
+                   if (step_data->__trans.__trans_fct != NULL)               \
+                     {                                                       \
+                       result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
+                                             (step, step_data, *inptrp,      \
+                                              &inptr, inend, *outptrp,       \
+                                              &outptr, outend,               \
+                                              irreversible));                \
+                       if (result != __GCONV_OK)                             \
+                         break;                                              \
+                     }                                                       \
+                   else if (! ignore_errors_p ())                            \
                      {                                                       \
                        result = __GCONV_ILLEGAL_INPUT;                       \
                        break;                                                \
                      }                                                       \
-                                                                             \
-                   inptr += 4;                                               \
-                   ++*irreversible;                                          \
+                   else                                                      \
+                     {                                                       \
+                       inptr += 4;                                           \
+                       ++*irreversible;                                      \
+                     }                                                       \
                    continue;                                                 \
                  }                                                           \
              }                                                               \
@@ -348,8 +359,7 @@ enum
              {                                                               \
                const char *escseq;                                           \
                                                                              \
-               if (NEED_LENGTH_TEST                                          \
-                   && __builtin_expect (outptr + 4 > outend, 0))             \
+               if (__builtin_expect (outptr + 4 > outend, 0))                \
                  {                                                           \
                    result = __GCONV_FULL_OUTPUT;                             \
                    break;                                                    \
@@ -404,8 +414,7 @@ enum
                break;                                                        \
              }                                                               \
          }                                                                   \
-       else if (NEED_LENGTH_TEST                                             \
-                && __builtin_expect (outptr + 2 > outend, 0))                \
+       else if (__builtin_expect (outptr + 2 > outend, 0))                   \
          {                                                                   \
            result = __GCONV_FULL_OUTPUT;                                     \
            break;                                                            \
@@ -418,6 +427,7 @@ enum
     /* Now that we wrote the output increment the input pointer.  */         \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , int *setp
 #define INIT_PARAMS            int set = *setp & CURRENT_SEL_MASK; \
                                int ann = *setp & CURRENT_ANN_MASK
index 9b22ddd..c6a43d1 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 <gconv.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -444,26 +445,22 @@ gconv_end (struct __gconv_step *data)
             JIS X 0208.  Therefore I'm using the tables for JIS X            \
             0208-1990.  If somebody has problems with this please            \
             provide the appropriate tables.  */                              \
-         ch = jisx0208_to_ucs4 (&inptr,                                      \
-                                NEED_LENGTH_TEST ? inend - inptr : 2, 0);    \
+         ch = jisx0208_to_ucs4 (&inptr, inend - inptr, 0);                   \
        else if (set == JISX0212_set)                                         \
          /* Use the JIS X 0212 table.  */                                    \
-         ch = jisx0212_to_ucs4 (&inptr,                                      \
-                                NEED_LENGTH_TEST ? inend - inptr : 2, 0);    \
+         ch = jisx0212_to_ucs4 (&inptr, inend - inptr, 0);                   \
        else if (set == GB2312_set)                                           \
          /* Use the GB 2312 table.  */                                       \
-         ch = gb2312_to_ucs4 (&inptr,                                        \
-                              NEED_LENGTH_TEST ? inend - inptr : 2, 0);      \
+         ch = gb2312_to_ucs4 (&inptr, inend - inptr, 0);                     \
        else                                                                  \
          {                                                                   \
            assert (set == KSC5601_set);                                      \
                                                                              \
            /* Use the KSC 5601 table.  */                                    \
-           ch = ksc5601_to_ucs4 (&inptr,                                     \
-                                 NEED_LENGTH_TEST ? inend - inptr : 2, 0);   \
+           ch = ksc5601_to_ucs4 (&inptr, inend - inptr, 0);                  \
          }                                                                   \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0)                \
+       if (__builtin_expect (ch, 1) == 0)                                    \
          {                                                                   \
            result = __GCONV_EMPTY_INPUT;                                     \
            break;                                                            \
@@ -485,6 +482,7 @@ gconv_end (struct __gconv_step *data)
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , enum variant var, int *setp
 #define INIT_PARAMS            int set = *setp & CURRENT_SEL_MASK;           \
                                int set2 = *setp & CURRENT_ASSIGN_MASK
@@ -554,26 +552,19 @@ gconv_end (struct __gconv_step *data)
     else                                                                     \
       {                                                                              \
        if (set == JISX0208_1978_set || set == JISX0208_1983_set)             \
-         written = ucs4_to_jisx0208 (ch, outptr,                             \
-                                     (NEED_LENGTH_TEST                       \
-                                      ? outend - outptr : 2));               \
+         written = ucs4_to_jisx0208 (ch, outptr, outend - outptr);           \
        else if (set == JISX0212_set)                                         \
-         written = ucs4_to_jisx0212 (ch, outptr,                             \
-                                     (NEED_LENGTH_TEST                       \
-                                      ? outend - outptr : 2));               \
+         written = ucs4_to_jisx0212 (ch, outptr, outend - outptr);           \
        else if (set == GB2312_set)                                           \
-         written = ucs4_to_gb2312 (ch, outptr, (NEED_LENGTH_TEST             \
-                                                ? outend - outptr : 2));     \
+         written = ucs4_to_gb2312 (ch, outptr, outend - outptr);             \
        else                                                                  \
          {                                                                   \
            assert (set == KSC5601_set);                                      \
                                                                              \
-           written = ucs4_to_ksc5601 (ch, outptr,                            \
-                                      (NEED_LENGTH_TEST                      \
-                                       ? outend - outptr : 2));              \
+           written = ucs4_to_ksc5601 (ch, outptr, outend - outptr);          \
          }                                                                   \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0)           \
+       if (__builtin_expect (written, 1) == 0)                               \
          {                                                                   \
            result = __GCONV_FULL_OUTPUT;                                     \
            break;                                                            \
@@ -631,7 +622,7 @@ gconv_end (struct __gconv_step *data)
          {                                                                   \
            /* We must encode using ASCII.  First write out the               \
               escape sequence.  */                                           \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 3 > outend, 0))\
+           if (__builtin_expect (outptr + 3 > outend, 0))                    \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -642,7 +633,7 @@ gconv_end (struct __gconv_step *data)
            *outptr++ = 'B';                                                  \
            set = ASCII_set;                                                  \
                                                                              \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 1 > outend, 0))\
+           if (__builtin_expect (outptr + 1 > outend, 0))                    \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -666,8 +657,7 @@ gconv_end (struct __gconv_step *data)
            if (written != __UNKNOWN_10646_CHAR && buf[0] < 0x80)             \
              {                                                               \
                /* We use JIS X 0201.  */                                     \
-               if (NEED_LENGTH_TEST                                          \
-                   && __builtin_expect (outptr + 3 > outend, 0))             \
+               if (__builtin_expect (outptr + 3 > outend, 0))                \
                  {                                                           \
                    result = __GCONV_FULL_OUTPUT;                             \
                    break;                                                    \
@@ -678,8 +668,7 @@ gconv_end (struct __gconv_step *data)
                *outptr++ = 'J';                                              \
                set = JISX0201_Roman_set;                                     \
                                                                              \
-               if (NEED_LENGTH_TEST                                          \
-                   && __builtin_expect (outptr + 1 > outend, 0))             \
+               if (__builtin_expect (outptr + 1 > outend, 0))                \
                  {                                                           \
                    result = __GCONV_FULL_OUTPUT;                             \
                    break;                                                    \
@@ -692,8 +681,7 @@ gconv_end (struct __gconv_step *data)
                if (written != __UNKNOWN_10646_CHAR)                          \
                  {                                                           \
                    /* We use JIS X 0208.  */                                 \
-                   if (NEED_LENGTH_TEST                                      \
-                       && __builtin_expect (outptr + 3 > outend, 0))         \
+                   if (__builtin_expect (outptr + 3 > outend, 0))            \
                      {                                                       \
                        result = __GCONV_FULL_OUTPUT;                         \
                        break;                                                \
@@ -704,8 +692,7 @@ gconv_end (struct __gconv_step *data)
                    *outptr++ = 'B';                                          \
                    set = JISX0208_1983_set;                                  \
                                                                              \
-                   if (NEED_LENGTH_TEST                                      \
-                       && __builtin_expect (outptr + 2 > outend, 0))         \
+                   if (__builtin_expect (outptr + 2 > outend, 0))            \
                      {                                                       \
                        result = __GCONV_FULL_OUTPUT;                         \
                        break;                                                \
@@ -716,13 +703,27 @@ gconv_end (struct __gconv_step *data)
                else if (__builtin_expect (var, iso2022jp2) == iso2022jp)     \
                  {                                                           \
                    /* We have no other choice.  */                           \
-                   if (! ignore_errors_p ())                                 \
+                   if (step_data->__trans.__trans_fct != NULL)               \
+                     {                                                       \
+                       result = DL_CALL_FCT (step_data->__trans.__trans_fct, \
+                                             (step, step_data, *inptrp,      \
+                                              &inptr, inend, *outptrp,       \
+                                              &outptr, outend,               \
+                                              irreversible));                \
+                       if (result != __GCONV_OK)                             \
+                         break;                                              \
+                     }                                                       \
+                   else if (! ignore_errors_p ())                            \
                      {                                                       \
                        result = __GCONV_ILLEGAL_INPUT;                       \
                        break;                                                \
                      }                                                       \
-                                                                             \
-                   ++*irreversible;                                          \
+                   else                                                      \
+                     {                                                       \
+                       inptr += 4;                                           \
+                       ++*irreversible;                                      \
+                     }                                                       \
+                   continue;                                                 \
                  }                                                           \
                else                                                          \
                  {                                                           \
@@ -730,8 +731,7 @@ gconv_end (struct __gconv_step *data)
                    if (written != __UNKNOWN_10646_CHAR)                      \
                      {                                                       \
                        /* We use JIS X 0212.  */                             \
-                       if (NEED_LENGTH_TEST                                  \
-                           && __builtin_expect (outptr + 4 > outend, 0))     \
+                       if (__builtin_expect (outptr + 4 > outend, 0))        \
                          {                                                   \
                            result = __GCONV_FULL_OUTPUT;                     \
                            break;                                            \
@@ -742,8 +742,7 @@ gconv_end (struct __gconv_step *data)
                        *outptr++ = 'D';                                      \
                        set = JISX0212_set;                                   \
                                                                              \
-                       if (NEED_LENGTH_TEST                                  \
-                           && __builtin_expect (outptr + 2 > outend, 0))     \
+                       if (__builtin_expect (outptr + 2 > outend, 0))        \
                          {                                                   \
                            result = __GCONV_FULL_OUTPUT;                     \
                            break;                                            \
@@ -758,8 +757,7 @@ gconv_end (struct __gconv_step *data)
                            && buf[0] >= 0x80)                                \
                          {                                                   \
                            /* We use JIS X 0201.  */                         \
-                           if (NEED_LENGTH_TEST                              \
-                               && __builtin_expect (outptr + 3 > outend, 0)) \
+                           if (__builtin_expect (outptr + 3 > outend, 0))    \
                              {                                               \
                                result = __GCONV_FULL_OUTPUT;                 \
                                break;                                        \
@@ -770,8 +768,7 @@ gconv_end (struct __gconv_step *data)
                            *outptr++ = 'I';                                  \
                            set = JISX0201_Kana_set;                          \
                                                                              \
-                           if (NEED_LENGTH_TEST                              \
-                               && __builtin_expect (outptr + 1 > outend, 0)) \
+                           if (__builtin_expect (outptr + 1 > outend, 0))    \
                              {                                               \
                                result = __GCONV_FULL_OUTPUT;                 \
                                break;                                        \
@@ -781,8 +778,7 @@ gconv_end (struct __gconv_step *data)
                        else if (ch != 0xa5 && ch >= 0x80 && ch <= 0xff)      \
                          {                                                   \
                            /* ISO 8859-1 upper half.   */                    \
-                           if (NEED_LENGTH_TEST                              \
-                               && __builtin_expect (outptr + 3 > outend, 0)) \
+                           if (__builtin_expect (outptr + 3 > outend, 0))    \
                              {                                               \
                                result = __GCONV_FULL_OUTPUT;                 \
                                break;                                        \
@@ -793,8 +789,7 @@ gconv_end (struct __gconv_step *data)
                            *outptr++ = 'A';                                  \
                            set2 = ISO88591_set;                              \
                                                                              \
-                           if (NEED_LENGTH_TEST                              \
-                               && __builtin_expect (outptr + 3 > outend, 0)) \
+                           if (__builtin_expect (outptr + 3 > outend, 0))    \
                              {                                               \
                                result = __GCONV_FULL_OUTPUT;                 \
                                break;                                        \
@@ -809,9 +804,7 @@ gconv_end (struct __gconv_step *data)
                            if (written != __UNKNOWN_10646_CHAR)              \
                              {                                               \
                                /* We use GB 2312.  */                        \
-                               if (NEED_LENGTH_TEST                          \
-                                   && __builtin_expect (outptr + 3 > outend, \
-                                                        0))                  \
+                               if (__builtin_expect (outptr + 3 > outend, 0))\
                                  {                                           \
                                    result = __GCONV_FULL_OUTPUT;             \
                                    break;                                    \
@@ -822,9 +815,7 @@ gconv_end (struct __gconv_step *data)
                                *outptr++ = 'A';                              \
                                set = GB2312_set;                             \
                                                                              \
-                               if (NEED_LENGTH_TEST                          \
-                                   && __builtin_expect (outptr + 2 > outend, \
-                                                        0))                  \
+                               if (__builtin_expect (outptr + 2 > outend, 0))\
                                  {                                           \
                                    result = __GCONV_FULL_OUTPUT;             \
                                    break;                                    \
@@ -838,9 +829,8 @@ gconv_end (struct __gconv_step *data)
                                if (written != __UNKNOWN_10646_CHAR)          \
                                  {                                           \
                                    /* We use KSC 5601.  */                   \
-                                   if (NEED_LENGTH_TEST                      \
-                                       && __builtin_expect (outptr + 4       \
-                                                            > outend, 0))    \
+                                   if (__builtin_expect (outptr + 4 > outend,\
+                                                         0))                 \
                                      {                                       \
                                        result = __GCONV_FULL_OUTPUT;         \
                                        break;                                \
@@ -851,9 +841,8 @@ gconv_end (struct __gconv_step *data)
                                    *outptr++ = 'C';                          \
                                    set = KSC5601_set;                        \
                                                                              \
-                                   if (NEED_LENGTH_TEST                      \
-                                       && __builtin_expect (outptr + 2       \
-                                                            > outend, 0))    \
+                                   if (__builtin_expect (outptr + 2 > outend,\
+                                                         0))                 \
                                      {                                       \
                                        result = __GCONV_FULL_OUTPUT;         \
                                        break;                                \
@@ -877,9 +866,8 @@ gconv_end (struct __gconv_step *data)
                                    if (__builtin_expect (gch, 1) != 0)       \
                                      {                                       \
                                        /* We use ISO 8859-7 greek.  */       \
-                                       if (NEED_LENGTH_TEST                  \
-                                           && __builtin_expect (outptr + 3   \
-                                                                > outend, 0))\
+                                       if (__builtin_expect (outptr + 3      \
+                                                             > outend, 0))   \
                                          {                                   \
                                            result = __GCONV_FULL_OUTPUT;     \
                                            break;                            \
@@ -889,9 +877,8 @@ gconv_end (struct __gconv_step *data)
                                        *outptr++ = 'F';                      \
                                        set2 = ISO88597_set;                  \
                                                                              \
-                                       if (NEED_LENGTH_TEST                  \
-                                           && __builtin_expect (outptr + 3   \
-                                                                > outend, 0))\
+                                       if (__builtin_expect (outptr + 3      \
+                                                             > outend, 0))   \
                                          {                                   \
                                            result = __GCONV_FULL_OUTPUT;     \
                                            break;                            \
@@ -902,13 +889,29 @@ gconv_end (struct __gconv_step *data)
                                      }                                       \
                                    else                                      \
                                      {                                       \
-                                       if (! ignore_errors_p ())             \
+                                       if (step_data->__trans.__trans_fct    \
+                                           != NULL)                          \
+                                         {                                   \
+                                           result = DL_CALL_FCT              \
+                                             (step_data->__trans.__trans_fct,\
+                                              (step, step_data, *inptrp,     \
+                                               &inptr, inend, *outptrp,      \
+                                               &outptr, outend,              \
+                                               irreversible));               \
+                                           if (result != __GCONV_OK)         \
+                                             break;                          \
+                                         }                                   \
+                                       else if (! ignore_errors_p ())        \
                                          {                                   \
                                             result = __GCONV_ILLEGAL_INPUT;  \
                                             break;                           \
                                          }                                   \
-                                                                             \
-                                       ++*irreversible;                      \
+                                       else                                  \
+                                         {                                   \
+                                           ++*irreversible;                  \
+                                           inptr += 4;                       \
+                                         }                                   \
+                                       continue;                             \
                                      }                                       \
                                  }                                           \
                              }                                               \
@@ -922,6 +925,7 @@ gconv_end (struct __gconv_step *data)
     /* Now that we wrote the output increment the input pointer.  */         \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , enum variant var, int *setp
 #define INIT_PARAMS            int set = *setp & CURRENT_SEL_MASK;           \
                                int set2 = *setp & CURRENT_ASSIGN_MASK
index 99208c9..4601e22 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 <gconv.h>
 #include <stdint.h>
 #include <string.h>
@@ -141,10 +142,9 @@ enum
           switching is done using the SI and SO bytes.  But we have to       \
           recognize `Esc $ ) C' since this is a kind of flag for this        \
           encoding.  We simply ignore it.  */                                \
-       if ((NEED_LENGTH_TEST && __builtin_expect (inptr + 1 > inend, 0))     \
+       if (__builtin_expect (inptr + 1 > inend, 0)                           \
            || (inptr[1] == '$'                                               \
-               && ((NEED_LENGTH_TEST                                         \
-                    && __builtin_expect (inptr + 2 > inend, 0))              \
+               && (__builtin_expect (inptr + 2 > inend, 0)                   \
                    || (inptr[2] == ')'                                       \
                        && __builtin_expect (inptr + 3 > inend, 0)))))        \
                                                                              \
@@ -184,10 +184,9 @@ enum
        assert (set == KSC5601_set);                                          \
                                                                              \
        /* Use the KSC 5601 table.  */                                        \
-       ch = ksc5601_to_ucs4 (&inptr,                                         \
-                             NEED_LENGTH_TEST ? inend - inptr : 2, 0);       \
+       ch = ksc5601_to_ucs4 (&inptr, inend - inptr, 0);                      \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (ch, 1) == 0)                \
+       if (__builtin_expect (ch, 1) == 0)                                    \
          {                                                                   \
            result = __GCONV_EMPTY_INPUT;                                     \
            break;                                                            \
@@ -210,6 +209,7 @@ enum
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , int *setp
 #define INIT_PARAMS            int set = *setp
 #define UPDATE_PARAMS          *setp = set
@@ -236,7 +236,7 @@ enum
          {                                                                   \
            *outptr++ = SI;                                                   \
            set = ASCII_set;                                                  \
-           if (NEED_LENGTH_TEST && outptr == outend)                         \
+           if (__builtin_expect (outptr == outend, 0))                       \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -255,13 +255,26 @@ enum
        if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)            \
          {                                                                   \
            /* Illegal character.  */                                         \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               ++*irreversible;                                              \
+               inptr += 4;                                                   \
+             }                                                               \
+           continue;                                                         \
          }                                                                   \
        else                                                                  \
          {                                                                   \
@@ -274,7 +287,7 @@ enum
                set = KSC5601_set;                                            \
              }                                                               \
                                                                              \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))\
+           if (__builtin_expect (outptr + 2 > outend, 0))                    \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -288,6 +301,7 @@ enum
     /* Now that we wrote the output increment the input pointer.  */         \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , int *setp
 #define INIT_PARAMS            int set = *setp
 #define UPDATE_PARAMS          *setp = set
index cdc77fc..f39f1b4 100644 (file)
@@ -31,6 +31,7 @@
    allows one to easily provide a tuned implementation in case this
    proofs to be necessary.  */
 
+#include <dlfcn.h>
 #include <gconv.h>
 #include <stdint.h>
 #include <stdlib.h>
@@ -422,6 +423,7 @@ gconv_end (struct __gconv_step *data)
       }                                                                              \
     ++inptr;                                                                 \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , enum variant var
 #include <iconv/loop.c>
 
@@ -883,19 +885,32 @@ gconv_end (struct __gconv_step *data)
                                                                              \
     if (__builtin_expect (failure, __GCONV_OK) == __GCONV_ILLEGAL_INPUT)      \
       {                                                                              \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            /* Exit the loop with an error.  */                               \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       *outptr++ = (unsigned char) ch;                                        \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS       , enum variant var
 #include <iconv/loop.c>
 
index 7a5be60..fb1fabc 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>
 
 /* Definitions used in the body of the `gconv' function.  */
     if (__builtin_expect (ch, 0) > 0xff)                                     \
       {                                                                              \
        /* We have an illegal character.  */                                  \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           inptr += 4;                                                       \
+           ++*irreversible;                                                  \
+         }                                                                   \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       *outptr++ = (unsigned char) ch;                                        \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 6895879..4f5a868 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>
 
 /* Data taken from the WG15 tables.  */
@@ -405,7 +406,7 @@ static const char from_ucs4[][2] =
           is also available.  */                                             \
        int ch2;                                                              \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store the              \
               intermediate result.  */                                       \
@@ -474,6 +475,7 @@ static const char from_ucs4[][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -491,7 +493,6 @@ static const char from_ucs4[][2] =
     if (__builtin_expect (ch, 0)                                             \
        >= sizeof (from_ucs4) / sizeof (from_ucs4[0]))                        \
       {                                                                              \
-       int fail = 0;                                                         \
        switch (ch)                                                           \
          {                                                                   \
          case 0x2c7:                                                         \
@@ -562,36 +563,52 @@ static const char from_ucs4[][2] =
            cp = "\xd5";                                                      \
            break;                                                            \
          default:                                                            \
-           cp = NULL;                                                        \
-           fail = 1;                                                         \
-         }                                                                   \
-                                                                             \
-       if (__builtin_expect (fail, 0))                                       \
-         {                                                                   \
            /* Illegal characters.  */                                        \
-           if (! ignore_errors_p ())                                         \
+           cp = NULL;                                                        \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
       }                                                                              \
     else if (__builtin_expect (from_ucs4[ch][0], '\1') == '\0' && ch != 0)    \
       {                                                                              \
        /* Illegal characters.  */                                            \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
-       inptr += 4;                                                           \
+       else                                                                  \
+         {                                                                   \
+           inptr += 4;                                                       \
+           ++*irreversible;                                                  \
+         }                                                                   \
        continue;                                                             \
       }                                                                              \
     else                                                                     \
@@ -601,7 +618,7 @@ static const char from_ucs4[][2] =
     /* Now test for a possible second byte and write this if possible.  */    \
     if (cp[1] != '\0')                                                       \
       {                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0))       \
+       if (__builtin_expect (outptr >= outend, 0))                           \
          {                                                                   \
            /* The result does not fit into the buffer.  */                   \
            --outptr;                                                         \
@@ -613,6 +630,7 @@ static const char from_ucs4[][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index d27b923..b7ab084 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>
 
 /* Data taken from the WG15 tables.  */
@@ -397,7 +398,7 @@ static const char from_ucs4[][2] =
           is also available.  */                                             \
        int ch2;                                                              \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store the              \
               intermediate result.  */                                       \
@@ -466,6 +467,7 @@ static const char from_ucs4[][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -540,29 +542,50 @@ static const char from_ucs4[][2] =
        if (__builtin_expect (fail, 0))                                       \
          {                                                                   \
            /* Illegal characters.  */                                        \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
       }                                                                              \
     else if (__builtin_expect (from_ucs4[ch][0], '\1') == '\0' && ch != 0)    \
       {                                                                              \
        /* Illegal characters.  */                                            \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
-       inptr += 4;                                                           \
+       else                                                                  \
+         {                                                                   \
+           inptr += 4;                                                       \
+           ++*irreversible;                                                  \
+         }                                                                   \
        continue;                                                             \
       }                                                                              \
     else                                                                     \
@@ -572,7 +595,7 @@ static const char from_ucs4[][2] =
     /* Now test for a possible second byte and write this if possible.  */    \
     if (cp[1] != '\0')                                                       \
       {                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0))       \
+       if (__builtin_expect (outptr >= outend, 0))                           \
          {                                                                   \
            /* The result does not fit into the buffer.  */                   \
            --outptr;                                                         \
@@ -584,6 +607,7 @@ static const char from_ucs4[][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 50b9746..7253ff6 100644 (file)
@@ -19,6 +19,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 <ksc5601.h>
 
@@ -203,7 +204,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
            uint32_t ch2;                                                     \
            uint_fast32_t idx;                                                \
                                                                              \
-           if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0)) \
+           if (__builtin_expect (inptr + 1 >= inend, 0))                     \
              {                                                               \
                /* The second character is not available.  Store the          \
                   intermediate result.  */                                   \
@@ -319,6 +320,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -350,7 +352,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
       {                                                                              \
        if (ch >= 0xac00 && ch <= 0xd7a3)                                     \
          {                                                                   \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))\
+           if (__builtin_expect (outptr + 2 > outend, 0))                    \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -371,7 +373,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
          {                                                                   \
            ch = jamo_from_ucs_table[ch - 0x3131];                            \
                                                                              \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))\
+           if (__builtin_expect (outptr + 2 > outend, 0))                    \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
@@ -386,25 +388,34 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
            size_t written;                                                   \
            uint32_t temp;                                                    \
                                                                              \
-           written = ucs4_to_ksc5601_hanja (ch, outptr,                      \
-                                            (NEED_LENGTH_TEST                \
-                                             ? outend - outptr : 2));        \
-           if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0)       \
+           written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr);    \
+           if (__builtin_expect (written, 1) == 0)                           \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
              }                                                               \
            if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)        \
              {                                                               \
-               if (! ignore_errors_p ())                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
                  {                                                           \
                    /* This is an illegal character.  */                      \
                    result = __GCONV_ILLEGAL_INPUT;                           \
                    break;                                                    \
                  }                                                           \
-                                                                             \
-               inptr += 4;                                                   \
-               ++*irreversible;                                              \
+               else                                                          \
+                 {                                                           \
+                   inptr += 4;                                               \
+                   ++*irreversible;                                          \
+                 }                                                           \
                continue;                                                     \
              }                                                               \
                                                                              \
@@ -423,25 +434,34 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
          {                                                                   \
            size_t written;                                                   \
                                                                              \
-           written = ucs4_to_ksc5601_sym (ch, outptr,                        \
-                                          (NEED_LENGTH_TEST                  \
-                                           ? outend - outptr : 2));          \
-           if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0)       \
+           written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);      \
+           if (__builtin_expect (written, 1) == 0)                           \
              {                                                               \
                result = __GCONV_FULL_OUTPUT;                                 \
                break;                                                        \
              }                                                               \
            if (__builtin_expect (written, 1) == __UNKNOWN_10646_CHAR)        \
              {                                                               \
-               if (! ignore_errors_p ())                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
                  {                                                           \
                    /* This is an illegal character.  */                      \
                    result = __GCONV_ILLEGAL_INPUT;                           \
                    break;                                                    \
                  }                                                           \
-                                                                             \
-               inptr += 4;                                                   \
-               ++*irreversible;                                              \
+               else                                                          \
+                 {                                                           \
+                   inptr += 4;                                               \
+                   ++*irreversible;                                          \
+                 }                                                           \
                continue;                                                     \
              }                                                               \
                                                                              \
@@ -460,6 +480,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2)
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 0f38362..2641b24 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 <wchar.h>
 
@@ -4377,7 +4378,7 @@ static const char from_ucs4_extra[0x100][2] =
        uint32_t ch2;                                                         \
        uint_fast32_t idx;                                                    \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store                  \
               the intermediate result.  */                                   \
@@ -4441,6 +4442,7 @@ static const char from_ucs4_extra[0x100][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -4466,15 +4468,26 @@ static const char from_ucs4_extra[0x100][2] =
        else                                                                  \
          {                                                                   \
            /* Illegal character.  */                                         \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
       }                                                                              \
@@ -4484,14 +4497,26 @@ static const char from_ucs4_extra[0x100][2] =
     if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                   \
       {                                                                              \
        /* Illegal character.  */                                             \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            /* This is an illegal character.  */                              \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           inptr += 4;                                                       \
+           ++*irreversible;                                                  \
+         }                                                                   \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       {                                                                              \
@@ -4499,7 +4524,7 @@ static const char from_ucs4_extra[0x100][2] =
        /* Now test for a possible second byte and write this if possible.  */\
        if (cp[1] != '\0')                                                    \
          {                                                                   \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0))   \
+           if (__builtin_expect (outptr >= outend, 0))                       \
              {                                                               \
                /* The result does not fit into the buffer.  */               \
                result = __GCONV_FULL_OUTPUT;                                 \
@@ -4511,6 +4536,7 @@ static const char from_ucs4_extra[0x100][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 74fbf8a..991cce1 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 <gconv.h>
 #include <stdint.h>
 #include <string.h>
@@ -390,7 +391,7 @@ static const char from_ucs4[][2] =
           is also available.  */                                             \
        uint32_t ch2;                                                         \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  */                     \
            result = __GCONV_INCOMPLETE_INPUT;                                \
@@ -441,6 +442,7 @@ static const char from_ucs4[][2] =
       }                                                                              \
     inptr += increment;                                                              \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -467,15 +469,26 @@ static const char from_ucs4[][2] =
                 || __builtin_expect (ch, 0x2d8) == 0x02dc)                   \
          {                                                                   \
            /* Illegal characters.  */                                        \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
        else                                                                  \
@@ -494,15 +507,26 @@ static const char from_ucs4[][2] =
        if (__builtin_expect (cp[0], '\1') == '\0' && ch != 0)                \
          {                                                                   \
            /* Illegal.  */                                                   \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
       }                                                                              \
@@ -511,7 +535,7 @@ static const char from_ucs4[][2] =
     /* Now test for a possible second byte and write this if possible.  */    \
     if (cp[1] != '\0')                                                       \
       {                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr >= outend, 0))       \
+       if (__builtin_expect (outptr >= outend, 0))                           \
          {                                                                   \
            /* The result does not fit into the buffer.  */                   \
            --outptr;                                                         \
@@ -524,6 +548,7 @@ static const char from_ucs4[][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index d62f93b..232e5c8 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 <ksc5601.h>
 
@@ -3085,7 +3086,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
           is also available.  */                                             \
        uint32_t ch2;                                                         \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (inptr + 1 >= inend, 0))     \
+       if (__builtin_expect (inptr + 1 >= inend, 0))                         \
          {                                                                   \
            /* The second character is not available.  Store                  \
               the intermediate result.  */                                   \
@@ -3180,6 +3181,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
     put32 (outptr, ch);                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
@@ -3199,7 +3201,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
       {                                                                              \
        const char *s = uhc_hangul_from_ucs[ch - 0xac00];                     \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (outptr + 2 > outend, 0))    \
+       if (__builtin_expect (outptr + 2 > outend, 0))                        \
          {                                                                   \
            result = __GCONV_FULL_OUTPUT;                                     \
            break;                                                            \
@@ -3210,26 +3212,35 @@ static const char uhc_hangul_from_ucs[11172][2] =
       }                                                                              \
     else if ((ch >= 0x4e00 && ch <= 0x9fa5) || (ch >= 0xf900 && ch <= 0xfa0b))\
       {                                                                              \
-       size_t written = ucs4_to_ksc5601_hanja (ch, outptr,                   \
-                                               (NEED_LENGTH_TEST             \
-                                                ? outend - outptr : 2));     \
+       size_t written = ucs4_to_ksc5601_hanja (ch, outptr, outend - outptr); \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0)           \
+       if (__builtin_expect (written, 1) == 0)                               \
          {                                                                   \
            result = __GCONV_FULL_OUTPUT;                                     \
            break;                                                            \
          }                                                                   \
        if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)            \
          {                                                                   \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
                                                                              \
@@ -3242,26 +3253,35 @@ static const char uhc_hangul_from_ucs[11172][2] =
 */                                                                           \
     else                                                                     \
       {                                                                              \
-       size_t written = ucs4_to_ksc5601_sym (ch, outptr,                     \
-                                             (NEED_LENGTH_TEST               \
-                                              ? outend - outptr : 2));       \
+       size_t written = ucs4_to_ksc5601_sym (ch, outptr, outend - outptr);   \
                                                                              \
-       if (NEED_LENGTH_TEST && __builtin_expect (written, 1) == 0)           \
+       if (__builtin_expect (written, 1) == 0)                               \
          {                                                                   \
            result = __GCONV_FULL_OUTPUT;                                     \
            break;                                                            \
          }                                                                   \
        if (__builtin_expect (written, 0) == __UNKNOWN_10646_CHAR)            \
          {                                                                   \
-           if (! ignore_errors_p ())                                         \
+           if (step_data->__trans.__trans_fct != NULL)                       \
+             {                                                               \
+               result = DL_CALL_FCT (step_data->__trans.__trans_fct,         \
+                                     (step, step_data, *inptrp, &inptr,      \
+                                      inend, *outptrp, &outptr, outend,      \
+                                      irreversible));                        \
+               if (result != __GCONV_OK)                                     \
+                 break;                                                      \
+             }                                                               \
+           else if (! ignore_errors_p ())                                    \
              {                                                               \
                /* This is an illegal character.  */                          \
                result = __GCONV_ILLEGAL_INPUT;                               \
                break;                                                        \
              }                                                               \
-                                                                             \
-           inptr += 4;                                                       \
-           ++*irreversible;                                                  \
+           else                                                              \
+             {                                                               \
+               inptr += 4;                                                   \
+               ++*irreversible;                                              \
+             }                                                               \
            continue;                                                         \
          }                                                                   \
                                                                              \
@@ -3271,6 +3291,7 @@ static const char uhc_hangul_from_ucs[11172][2] =
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #include <iconv/loop.c>
 
 
index 5309fc2..438658e 100644 (file)
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <byteswap.h>
+#include <dlfcn.h>
 #include <gconv.h>
 #include <stddef.h>
 #include <stdint.h>
@@ -70,7 +71,7 @@
       outbuf += 2;                                                           \
     }                                                                        \
   swap = ((struct unicode_data *) step->__data)->swap;
-#define EXTRA_LOOP_ARGS                , data, swap
+#define EXTRA_LOOP_ARGS                , swap
 
 
 /* Direction of the transformation.  */
@@ -151,14 +152,26 @@ gconv_end (struct __gconv_step *data)
                                                                              \
     if (__builtin_expect (c, 0) >= 0x10000)                                  \
       {                                                                              \
-       if (! ignore_errors_p ())                                             \
+       if (step_data->__trans.__trans_fct != NULL)                           \
+         {                                                                   \
+           result = DL_CALL_FCT (step_data->__trans.__trans_fct,             \
+                                 (step, step_data, *inptrp, &inptr, inend,   \
+                                  *outptrp, &outptr, outend, irreversible)); \
+           if (result != __GCONV_OK)                                         \
+             break;                                                          \
+         }                                                                   \
+       else if (! ignore_errors_p ())                                        \
          {                                                                   \
            /* This is an illegal character.  */                              \
            result = __GCONV_ILLEGAL_INPUT;                                   \
            break;                                                            \
          }                                                                   \
-                                                                             \
-       ++*irreversible;                                                      \
+       else                                                                  \
+         {                                                                   \
+           ++*irreversible;                                                  \
+           inptr += 4;                                                       \
+         }                                                                   \
+       continue;                                                             \
       }                                                                              \
     else                                                                     \
       {                                                                              \
@@ -168,8 +181,9 @@ gconv_end (struct __gconv_step *data)
                                                                              \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS \
-       , struct __gconv_step_data *step_data, int swap
+       , int swap
 #include <iconv/loop.c>
 
 
@@ -190,7 +204,7 @@ gconv_end (struct __gconv_step *data)
     outptr += 4;                                                             \
   }
 #define EXTRA_LOOP_DECLS \
-       , struct __gconv_step_data *step_data, int swap
+       , int swap
 #include <iconv/loop.c>
 
 
index d24b55b..bbb546e 100644 (file)
@@ -19,6 +19,7 @@
    Boston, MA 02111-1307, USA.  */
 
 #include <byteswap.h>
+#include <dlfcn.h>
 #include <gconv.h>
 #include <stddef.h>
 #include <stdint.h>
@@ -72,7 +73,7 @@
       put16u (outbuf, BOM);                                                  \
       outbuf += 2;                                                           \
     }
-#define EXTRA_LOOP_ARGS                , var, data, swap
+#define EXTRA_LOOP_ARGS                , var, swap
 
 
 /* Direction of the transformation.  */
@@ -201,20 +202,31 @@ gconv_end (struct __gconv_step *data)
          {                                                                   \
            if (__builtin_expect (c, 0) >= 0x110000)                          \
              {                                                               \
-               if (! ignore_errors_p ())                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
                  {                                                           \
                    /* This is an illegal character.  */                      \
                    result = __GCONV_ILLEGAL_INPUT;                           \
                    break;                                                    \
                  }                                                           \
-                                                                             \
-               ++*irreversible;                                              \
-               inptr += 4;                                                   \
+               else                                                          \
+                 {                                                           \
+                   ++*irreversible;                                          \
+                   inptr += 4;                                               \
+                 }                                                           \
                continue;                                                     \
              }                                                               \
                                                                              \
            /* Generate a surrogate character.  */                            \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 4 > outend, 0))\
+           if (__builtin_expect (outptr + 4 > outend, 0))                    \
              {                                                               \
                /* Overflow in the output buffer.  */                         \
                result = __GCONV_FULL_OUTPUT;                                 \
@@ -234,20 +246,31 @@ gconv_end (struct __gconv_step *data)
          {                                                                   \
            if (__builtin_expect (c, 0) >= 0x110000)                          \
              {                                                               \
-               if (! ignore_errors_p ())                                     \
+               if (step_data->__trans.__trans_fct != NULL)                   \
+                 {                                                           \
+                   result = DL_CALL_FCT (step_data->__trans.__trans_fct,     \
+                                         (step, step_data, *inptrp, &inptr,  \
+                                          inend, *outptrp, &outptr, outend,  \
+                                          irreversible));                    \
+                   if (result != __GCONV_OK)                                 \
+                     break;                                                  \
+                 }                                                           \
+               else if (! ignore_errors_p ())                                \
                  {                                                           \
                    /* This is an illegal character.  */                      \
                    result = __GCONV_ILLEGAL_INPUT;                           \
                    break;                                                    \
                  }                                                           \
-                                                                             \
-               ++*irreversible;                                              \
-               inptr += 4;                                                   \
+               else                                                          \
+                 {                                                           \
+                   ++*irreversible;                                          \
+                   inptr += 4;                                               \
+                 }                                                           \
                continue;                                                     \
              }                                                               \
                                                                              \
            /* Generate a surrogate character.  */                            \
-           if (NEED_LENGTH_TEST && __builtin_expect (outptr + 4 > outend, 0))\
+           if (__builtin_expect (outptr + 4 > outend, 0))                    \
              {                                                               \
                /* Overflow in the output buffer.  */                         \
                result = __GCONV_FULL_OUTPUT;                                 \
@@ -264,8 +287,9 @@ gconv_end (struct __gconv_step *data)
     outptr += 2;                                                             \
     inptr += 4;                                                                      \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS \
-       , enum variant var, struct __gconv_step_data *step_data, int swap
+       , enum variant var, int swap
 #include <iconv/loop.c>
 
 
@@ -294,7 +318,7 @@ gconv_end (struct __gconv_step *data)
                                                                              \
            /* It's a surrogate character.  At least the first word says      \
               it is.  */                                                     \
-           if (NEED_LENGTH_TEST && __builtin_expect (inptr + 4 > inend, 0))  \
+           if (__builtin_expect (inptr + 4 > inend, 0))                      \
              {                                                               \
                /* We don't have enough input for another complete input      \
                   character.  */                                             \
@@ -337,7 +361,7 @@ gconv_end (struct __gconv_step *data)
                                                                              \
            /* It's a surrogate character.  At least the first word says      \
               it is.  */                                                     \
-           if (NEED_LENGTH_TEST && __builtin_expect (inptr + 4 > inend, 0))  \
+           if (__builtin_expect (inptr + 4 > inend, 0))                      \
              {                                                               \
                /* We don't have enough input for another complete input      \
                   character.  */                                             \
@@ -368,8 +392,9 @@ gconv_end (struct __gconv_step *data)
       }                                                                              \
     outptr += 4;                                                             \
   }
+#define LOOP_NEED_FLAGS
 #define EXTRA_LOOP_DECLS \
-       , enum variant var, struct __gconv_step_data *step_data, int swap
+       , enum variant var, int swap
 #include <iconv/loop.c>