summaryrefslogtreecommitdiff
path: root/iconvdata
diff options
context:
space:
mode:
authorUlrich Drepper <drepper@redhat.com>2000-06-12 19:47:50 +0000
committerUlrich Drepper <drepper@redhat.com>2000-06-12 19:47:50 +0000
commit55985355ade2a038b567dd9b58153a98384ae703 (patch)
treeb6252e23490e6d10d55ae926e30e32173f504190 /iconvdata
parenta5b97402f70a3cd43ffee9ccb71560457b4cd88c (diff)
downloadglibc-55985355ade2a038b567dd9b58153a98384ae703.tar.gz
Update.
2000-06-12 Ulrich Drepper <drepper@redhat.com> * Rules (%.out): Define GCONV_PATH in the environment. * assert/Depend: New file. * iconvdata/Depend: New file. * intl/Depend: New file. * timezone/Makefile (build-testdata): Add GCONV_PATH to environment. * intl/tst-gettext.sh: Likewise. * iconv/Makefile (routines): Add gconv_trans. * iconv/gconv_trans.c: New file. * iconv/gconv.h (struct __gconv_trans_data): New type. (__gconv_fct): New parameter with starting position in output buffer. (__gconv_trans_fct, __gconv_trans_context_fct, __gconv_trans_query_fct, __gconv_trans_init_fct, __gconv_trans_end_fct): New types. (struct __gconv_step): Add new member __trans. * iconv/gconv_int.h: Pretty print prototypes. (gconv_transliterate): New prototype. (__BUILTIN_TRANS): Update for new conversion function interface. * iconv/gconv.c (__gconv): Pass new parameter to conversion function. * iconv/gconv_open.c (__gconv_open): Recognize error handling suffix in names, find appropriate function, and install in the conversion steps it can be used. * iconv/skeleton.c: Add additional parameter for beginning of output buffer. Change calls of downstream functions. * iconv/loop.c: Change loop function interface completely. Pass in step and step_data structure. Remove optimization for BODY with NEED_LENGTH_TEST == 0. * iconv/gconv_simple.c: Update interfaces of functions. Insert appropriate error handling code to use transliteration steps. Remove optimization for BODY with NEED_LENGTH_TEST == 0. * iconvdata/8bit-gap.c: Likewise. * iconvdata/8bit-generic.c: Likewise. * iconvdata/ansi_x3.110.c: Likewise. * iconvdata/big5.c: Likewise. * iconvdata/big5hkscs.c: Likewise. * iconvdata/euc-cn.c: Likewise. * iconvdata/euc-jp.c: Likewise. * iconvdata/euc-kr.c: Likewise. * iconvdata/euc-tw.c: Likewise. * iconvdata/gbgbk.c: Likewise. * iconvdata/gbk.c: Likewise. * iconvdata/iso-2022-cn.c: Likewise. * iconvdata/iso-2022-jp.c: Likewise. * iconvdata/iso-2022-kr.c: Likewise. * iconvdata/iso646.c: Likewise. * iconvdata/iso8859-1.c: Likewise. * iconvdata/iso_6937-2.c: Likewise. * iconvdata/iso_6937.c: Likewise. * iconvdata/johab.c: Likewise. * iconvdata/sjis.c: Likewise. * iconvdata/t.61.c: Likewise. * iconvdata/uhc.c: Likewise. * iconvdata/unicode.c: Likewise. * iconvdata/utf-16.c: Likewise. * libio/iofwide.c: Adjust to new interface of gconv functions. Use DL_CALL_FCT. * wcsmbs/btowc.c: Likewise. * wcsmbs/mbrtowc.c: Likewise. * wcsmbs/mbsnrtowcs.c: Likewise. * wcsmbs/mbsrtowcs.c: Likewise. * wcsmbs/wcrtomb.c: Likewise. * wcsmbs/wcsnrtombs.c: Likewise. * wcsmbs/wcsrtombs.c: Likewise. * wcsmbs/wctob.c: Likewise.
Diffstat (limited to 'iconvdata')
-rw-r--r--iconvdata/8bit-gap.c49
-rw-r--r--iconvdata/8bit-generic.c28
-rw-r--r--iconvdata/ansi_x3.110.c64
-rw-r--r--iconvdata/big5.c25
-rw-r--r--iconvdata/big5hkscs.c25
-rw-r--r--iconvdata/euc-cn.c30
-rw-r--r--iconvdata/euc-jp.c40
-rw-r--r--iconvdata/euc-kr.c28
-rw-r--r--iconvdata/euc-tw.c100
-rw-r--r--iconvdata/gbgbk.c29
-rw-r--r--iconvdata/gbk.c29
-rw-r--r--iconvdata/iso-2022-cn.c58
-rw-r--r--iconvdata/iso-2022-jp.c138
-rw-r--r--iconvdata/iso-2022-kr.c36
-rw-r--r--iconvdata/iso646.c21
-rw-r--r--iconvdata/iso8859-1.c20
-rw-r--r--iconvdata/iso_6937-2.c52
-rw-r--r--iconvdata/iso_6937.c44
-rw-r--r--iconvdata/johab.c59
-rw-r--r--iconvdata/sjis.c44
-rw-r--r--iconvdata/t.61.c45
-rw-r--r--iconvdata/uhc.c57
-rw-r--r--iconvdata/unicode.c26
-rw-r--r--iconvdata/utf-16.c55
24 files changed, 776 insertions, 326 deletions
diff --git a/iconvdata/8bit-gap.c b/iconvdata/8bit-gap.c
index 2d66f8b666..23a63fd9e4 100644
--- a/iconvdata/8bit-gap.c
+++ b/iconvdata/8bit-gap.c
@@ -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>
diff --git a/iconvdata/8bit-generic.c b/iconvdata/8bit-generic.c
index 97ca193194..62160c6efa 100644
--- a/iconvdata/8bit-generic.c
+++ b/iconvdata/8bit-generic.c
@@ -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>
@@ -65,19 +68,32 @@
|| (__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>
diff --git a/iconvdata/ansi_x3.110.c b/iconvdata/ansi_x3.110.c
index 2dd082d3b9..f403773d9d 100644
--- a/iconvdata/ansi_x3.110.c
+++ b/iconvdata/ansi_x3.110.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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>
diff --git a/iconvdata/big5.c b/iconvdata/big5.c
index a52f850f73..2e039376d0 100644
--- a/iconvdata/big5.c
+++ b/iconvdata/big5.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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>
diff --git a/iconvdata/big5hkscs.c b/iconvdata/big5hkscs.c
index 1ca22d65a6..b5fe9663e5 100644
--- a/iconvdata/big5hkscs.c
+++ b/iconvdata/big5hkscs.c
@@ -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>
diff --git a/iconvdata/euc-cn.c b/iconvdata/euc-cn.c
index 2c2b36e433..c7a02c2cd4 100644
--- a/iconvdata/euc-cn.c
+++ b/iconvdata/euc-cn.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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. */ \
@@ -114,6 +115,7 @@
put32 (outptr, ch); \
outptr += 4; \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
@@ -133,22 +135,31 @@
{ \
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; \
} \
\
@@ -165,6 +176,7 @@
} \
inptr += 4; \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
diff --git a/iconvdata/euc-jp.c b/iconvdata/euc-jp.c
index 93622e778e..6cf89e3aa6 100644
--- a/iconvdata/euc-jp.c
+++ b/iconvdata/euc-jp.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
#include <gconv.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. */ \
@@ -106,21 +107,17 @@
/* 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; \
@@ -147,6 +144,7 @@
put32 (outptr, ch); \
outptr += 4; \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
@@ -174,7 +172,7 @@
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; \
@@ -202,8 +200,7 @@
{ \
/* 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) \
{ \
@@ -221,14 +218,26 @@
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; \
} \
} \
@@ -237,6 +246,7 @@
\
inptr += 4; \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c
index f067fbc548..88794f2f02 100644
--- a/iconvdata/euc-kr.c
+++ b/iconvdata/euc-kr.c
@@ -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>
diff --git a/iconvdata/euc-tw.c b/iconvdata/euc-tw.c
index a508c848ef..ee88d4e2a7 100644
--- a/iconvdata/euc-tw.c
+++ b/iconvdata/euc-tw.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
#include <cns11643l1.h>
#include <cns11643.h>
@@ -48,8 +49,15 @@
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. */ \
@@ -70,9 +78,16 @@
/* 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) \
@@ -80,16 +95,22 @@
/* 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; \
@@ -99,16 +120,22 @@
/* 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; \
@@ -118,6 +145,7 @@
put32 (outptr, ch); \
outptr += 4; \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
@@ -138,15 +166,14 @@
/* 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; \
@@ -156,20 +183,36 @@
{ \
/* 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. */ \
@@ -182,6 +225,7 @@
\
inptr += 4; \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
diff --git a/iconvdata/gbgbk.c b/iconvdata/gbgbk.c
index 0fbbfc81e4..c6f2e4e0c2 100644
--- a/iconvdata/gbgbk.c
+++ b/iconvdata/gbgbk.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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; \
@@ -101,14 +102,25 @@
&& __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 \
{ \
@@ -118,6 +130,7 @@
} \
} \
}
+#define LOOP_NEED_FLAGS
#include <iconv/loop.c>
@@ -136,7 +149,7 @@
\
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. */ \
@@ -144,7 +157,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; \
diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c
index 952f76ab73..f82059195e 100644
--- a/iconvdata/gbk.c
+++ b/iconvdata/gbk.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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>
diff --git a/iconvdata/iso-2022-cn.c b/iconvdata/iso-2022-cn.c
index 38b138b928..af7f92d3ac 100644
--- a/iconvdata/iso-2022-cn.c
+++ b/iconvdata/iso-2022-cn.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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
diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c
index 9b22ddd6b3..c6a43d121d 100644
--- a/iconvdata/iso-2022-jp.c
+++ b/iconvdata/iso-2022-jp.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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
diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c
index 99208c9522..4601e22e68 100644
--- a/iconvdata/iso-2022-kr.c
+++ b/iconvdata/iso-2022-kr.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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
diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c
index cdc77fc651..f39f1b4d6d 100644
--- a/iconvdata/iso646.c
+++ b/iconvdata/iso646.c
@@ -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>
diff --git a/iconvdata/iso8859-1.c b/iconvdata/iso8859-1.c
index 7a5be60373..fb1fabc4f6 100644
--- a/iconvdata/iso8859-1.c
+++ b/iconvdata/iso8859-1.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
/* Definitions used in the body of the `gconv' function. */
@@ -48,18 +49,31 @@
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>
diff --git a/iconvdata/iso_6937-2.c b/iconvdata/iso_6937-2.c
index 6895879744..4f5a8689b8 100644
--- a/iconvdata/iso_6937-2.c
+++ b/iconvdata/iso_6937-2.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
/* 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>
diff --git a/iconvdata/iso_6937.c b/iconvdata/iso_6937.c
index d27b923689..b7ab0841eb 100644
--- a/iconvdata/iso_6937.c
+++ b/iconvdata/iso_6937.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
/* 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>
diff --git a/iconvdata/johab.c b/iconvdata/johab.c
index 50b974686b..7253ff6cb8 100644
--- a/iconvdata/johab.c
+++ b/iconvdata/johab.c
@@ -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>
diff --git a/iconvdata/sjis.c b/iconvdata/sjis.c
index 0f38362fb3..2641b24743 100644
--- a/iconvdata/sjis.c
+++ b/iconvdata/sjis.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
#include <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>
diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c
index 74fbf8aca7..991cce1626 100644
--- a/iconvdata/t.61.c
+++ b/iconvdata/t.61.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <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>
diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c
index d62f93bf29..232e5c8416 100644
--- a/iconvdata/uhc.c
+++ b/iconvdata/uhc.c
@@ -18,6 +18,7 @@
write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330,
Boston, MA 02111-1307, USA. */
+#include <dlfcn.h>
#include <stdint.h>
#include <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>
diff --git a/iconvdata/unicode.c b/iconvdata/unicode.c
index 5309fc267f..438658edb9 100644
--- a/iconvdata/unicode.c
+++ b/iconvdata/unicode.c
@@ -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>
diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c
index d24b55b2bc..bbb546ef9a 100644
--- a/iconvdata/utf-16.c
+++ b/iconvdata/utf-16.c
@@ -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>