diff options
author | Ulrich Drepper <drepper@redhat.com> | 2000-06-12 19:47:50 +0000 |
---|---|---|
committer | Ulrich Drepper <drepper@redhat.com> | 2000-06-12 19:47:50 +0000 |
commit | 55985355ade2a038b567dd9b58153a98384ae703 (patch) | |
tree | b6252e23490e6d10d55ae926e30e32173f504190 /iconvdata | |
parent | a5b97402f70a3cd43ffee9ccb71560457b4cd88c (diff) | |
download | glibc-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.c | 49 | ||||
-rw-r--r-- | iconvdata/8bit-generic.c | 28 | ||||
-rw-r--r-- | iconvdata/ansi_x3.110.c | 64 | ||||
-rw-r--r-- | iconvdata/big5.c | 25 | ||||
-rw-r--r-- | iconvdata/big5hkscs.c | 25 | ||||
-rw-r--r-- | iconvdata/euc-cn.c | 30 | ||||
-rw-r--r-- | iconvdata/euc-jp.c | 40 | ||||
-rw-r--r-- | iconvdata/euc-kr.c | 28 | ||||
-rw-r--r-- | iconvdata/euc-tw.c | 100 | ||||
-rw-r--r-- | iconvdata/gbgbk.c | 29 | ||||
-rw-r--r-- | iconvdata/gbk.c | 29 | ||||
-rw-r--r-- | iconvdata/iso-2022-cn.c | 58 | ||||
-rw-r--r-- | iconvdata/iso-2022-jp.c | 138 | ||||
-rw-r--r-- | iconvdata/iso-2022-kr.c | 36 | ||||
-rw-r--r-- | iconvdata/iso646.c | 21 | ||||
-rw-r--r-- | iconvdata/iso8859-1.c | 20 | ||||
-rw-r--r-- | iconvdata/iso_6937-2.c | 52 | ||||
-rw-r--r-- | iconvdata/iso_6937.c | 44 | ||||
-rw-r--r-- | iconvdata/johab.c | 59 | ||||
-rw-r--r-- | iconvdata/sjis.c | 44 | ||||
-rw-r--r-- | iconvdata/t.61.c | 45 | ||||
-rw-r--r-- | iconvdata/uhc.c | 57 | ||||
-rw-r--r-- | iconvdata/unicode.c | 26 | ||||
-rw-r--r-- | iconvdata/utf-16.c | 55 |
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> |