aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog69
-rw-r--r--NEWS5
-rw-r--r--iconv/gconv_builtin.c9
-rw-r--r--iconv/gconv_builtin.h36
-rw-r--r--iconv/gconv_cache.c4
-rw-r--r--iconv/gconv_conf.c13
-rw-r--r--iconv/gconv_db.c7
-rw-r--r--iconv/gconv_int.h36
-rw-r--r--iconv/gconv_simple.c17
-rw-r--r--iconv/iconvconfig.c10
-rw-r--r--iconv/loop.c13
-rw-r--r--iconv/skeleton.c28
-rw-r--r--iconvdata/8bit-gap.c15
-rw-r--r--iconvdata/8bit-generic.c9
-rw-r--r--iconvdata/ansi_x3.110.c11
-rw-r--r--iconvdata/armscii-8.c11
-rw-r--r--iconvdata/big5.c9
-rw-r--r--iconvdata/big5hkscs.c9
-rw-r--r--iconvdata/cp1255.c9
-rw-r--r--iconvdata/cp1258.c16
-rw-r--r--iconvdata/euc-cn.c9
-rw-r--r--iconvdata/euc-jisx0213.c7
-rw-r--r--iconvdata/euc-jp.c7
-rw-r--r--iconvdata/euc-kr.c9
-rw-r--r--iconvdata/euc-tw.c7
-rw-r--r--iconvdata/gb18030.c7
-rw-r--r--iconvdata/gbbig5.c4
-rw-r--r--iconvdata/gbk.c9
-rw-r--r--iconvdata/ibm932.c59
-rw-r--r--iconvdata/ibm932.h8
-rw-r--r--iconvdata/ibm943.c60
-rw-r--r--iconvdata/ibm943.h8
-rw-r--r--iconvdata/isiri-3342.c7
-rw-r--r--iconvdata/iso8859-1.c4
-rw-r--r--iconvdata/iso_6937-2.c9
-rw-r--r--iconvdata/iso_6937.c9
-rw-r--r--iconvdata/johab.c7
-rw-r--r--iconvdata/shift_jisx0213.c14
-rw-r--r--iconvdata/sjis.c14
-rw-r--r--iconvdata/t.61.c9
-rw-r--r--iconvdata/tcvn5712-1.c14
-rw-r--r--iconvdata/uhc.c9
-rw-r--r--linuxthreads/ChangeLog6
-rw-r--r--wcsmbs/btowc.c69
-rw-r--r--wcsmbs/wcsmbsload.c5
45 files changed, 543 insertions, 163 deletions
diff --git a/ChangeLog b/ChangeLog
index 05a5faed05..bbdfda3972 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,72 @@
+2002-11-30 Bruno Haible <bruno@clisp.org>
+
+ * iconv/gconv.h (__gconv_btowc_fct): New typedef.
+ (struct __gconv_step): New field __btowc_fct.
+ * wcsmbs/btowc.c (__btowc): Use the __btowc_fct shortcut if possible.
+ * iconv/gconv_int.h (__BUILTIN_TRANSFORM): Renamed from
+ __BUILTIN_TRANS.
+ (__gconv_btwoc_ascii): New declaration.
+ * iconv/gconv_simple.c (BUILTIN_TRANSFORMATION): Add BtowcFct argument.
+ (__gconv_btwoc_ascii): New function.
+ * iconv/gconv_builtin.h: Add BtowcFct argument to all
+ BUILTIN_TRANSFORMATION invocations.
+ * iconv/gconv_conf.c (BUILTIN_TRANSFORMATION): Add BtowcFct argument.
+ * iconv/iconvconfig.c (BUILTIN_TRANSFORMATION): Likewise.
+ * iconv/gconv_builtin.c (map): New field btowc_fct.
+ (BUILTIN_TRANSFORMATION): Add BtowcFct argument. Use it to initialize
+ btowc_fct field.
+ (__gconv_get_builtin_trans): Initialize __btowc_fct field.
+ * iconv/gconv_cache.c (find_module): Initialize __btowc_fct field.
+ * iconv/gconv_db.c (gen_steps, increment_counter): Likewise.
+ * wcsmbs/wcsmbsload.c (to_wc, to_mb): Likewise.
+ * iconv/skeleton.c: Document STORE_REST and FROM_ONEBYTE.
+ (gconv_init): Initialize __btowc_fct field.
+ Undefine EXTRA_LOOP_ARGS and FROM_ONEBYTE at the end.
+ * iconv/loop.c: Document ONEBYTE_BODY.
+ (gconv_btowc, FROM_ONEBYTE): Define if ONEBYTE_BODY is defined.
+ Undefine ONEBYTE_BODY at the end.
+ * iconvdata/8bit-generic.c (ONEBYTE_BODY): New macro.
+ * iconvdata/8bit-gap.c (NONNUL): New macro.
+ (BODY for FROM_LOOP): Use it.
+ (ONEBYTE_BODY): New macro.
+ * iconvdata/isiri-3342.c (HAS_HOLES): Set to 1.
+ (NONNUL): New macro.
+ * iconvdata/ansi_x3.110.c (ONEBYTE_BODY): New macro.
+ * iconvdata/armscii-8.c (ONEBYTE_BODY): New macro.
+ * iconvdata/cp1255.c (ONEBYTE_BODY): New macro.
+ * iconvdata/cp1258.c (ONEBYTE_BODY): New macro.
+ * iconvdata/tcvn5712-1.c (ONEBYTE_BODY): New macro.
+ * iconvdata/big5.c (ONEBYTE_BODY): New macro.
+ * iconvdata/big5hkscs.c (ONEBYTE_BODY): New macro.
+ * iconvdata/euc-cn.c (ONEBYTE_BODY): New macro.
+ * iconvdata/euc-jp.c (ONEBYTE_BODY): New macro.
+ * iconvdata/euc-jisx0213.c (ONEBYTE_BODY): New macro.
+ * iconvdata/euc-kr.c (ONEBYTE_BODY): New macro.
+ * iconvdata/euc-tw.c (ONEBYTE_BODY): New macro.
+ * iconvdata/gbk.c (ONEBYTE_BODY): New macro.
+ * iconvdata/gb18030.c (ONEBYTE_BODY): New macro.
+ * iconvdata/ibm932.c: Include <stdbool.h>.
+ (TRUE, FALSE): Remove macros.
+ (BODY for FROM_LOOP): Remove unused variable rp1.
+ (ONEBYTE_BODY): New macro.
+ (BODY for TO_LOOP): Use bool.
+ * iconvdata/ibm932.h (__ibm932sb_to_ucs4_idx): Remove array.
+ * iconvdata/ibm943.c: Include <stdbool.h>.
+ (TRUE, FALSE): Remove macros.
+ (BODY for FROM_LOOP): Remove unused variable rp1.
+ (ONEBYTE_BODY): New macro.
+ (BODY for TO_LOOP): Use bool.
+ * iconvdata/ibm943.h (__ibm943sb_to_ucs4_idx): Remove array.
+ * iconvdata/iso8859-1.c (ONEBYTE_BODY): New macro.
+ * iconvdata/iso_6937-2.c (ONEBYTE_BODY): New macro.
+ * iconvdata/iso_6937.c (ONEBYTE_BODY): New macro.
+ * iconvdata/johab.c (ONEBYTE_BODY): New macro.
+ * iconvdata/sjis.c (ONEBYTE_BODY): New macro.
+ * iconvdata/shift_jisx0213.c (ONEBYTE_BODY): New macro.
+ * iconvdata/t.61.c (ONEBYTE_BODY): New macro.
+ * iconvdata/uhc.c (ONEBYTE_BODY): New macro.
+ * iconvdata/gbbig5.c: Tweak comment.
+
2002-12-02 Ulrich Drepper <drepper@redhat.com>
* po/fi.po: Update from translation team.
diff --git a/NEWS b/NEWS
index 249b69fb5d..f310b2c050 100644
--- a/NEWS
+++ b/NEWS
@@ -1,4 +1,4 @@
-GNU C Library NEWS -- history of user-visible changes. 2002-11-5
+GNU C Library NEWS -- history of user-visible changes. 2002-12-2
Copyright (C) 1992-2001, 2002 Free Software Foundation, Inc.
See the end for copying conditions.
@@ -17,6 +17,9 @@ Version 2.3.2
This normally expands to lib, but on some 64-bit platforms to lib64 instead.
* fexecve is implemented on Linux.
+
+* the btowc() function should work 2+ times faster due to specialized
+ callbacks in the iconv modules. Implemented by Bruno Haible.
Version 2.3
diff --git a/iconv/gconv_builtin.c b/iconv/gconv_builtin.c
index 45bd4e7e00..f653d6c7f3 100644
--- a/iconv/gconv_builtin.c
+++ b/iconv/gconv_builtin.c
@@ -1,5 +1,5 @@
/* Table for builtin transformation mapping.
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997-1999, 2000-2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -31,6 +31,7 @@ static struct builtin_map
{
const char *name;
__gconv_fct fct;
+ __gconv_btowc_fct btowc_fct;
int min_needed_from;
int max_needed_from;
@@ -39,11 +40,12 @@ static struct builtin_map
} map[] =
{
-#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, MinF, MaxF, \
- MinT, MaxT) \
+#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, BtowcFct, \
+ MinF, MaxF, MinT, MaxT) \
{ \
.name = Name, \
.fct = Fct, \
+ .btowc_fct = BtowcFct, \
\
.min_needed_from = MinF, \
.max_needed_from = MaxF, \
@@ -69,6 +71,7 @@ __gconv_get_builtin_trans (const char *name, struct __gconv_step *step)
assert (cnt < sizeof (map) / sizeof (map[0]));
step->__fct = map[cnt].fct;
+ step->__btowc_fct = map[cnt].btowc_fct;
step->__init_fct = NULL;
step->__end_fct = NULL;
step->__shlib_handle = NULL;
diff --git a/iconv/gconv_builtin.h b/iconv/gconv_builtin.h
index 1a9d8a80f1..bd34c256dc 100644
--- a/iconv/gconv_builtin.h
+++ b/iconv/gconv_builtin.h
@@ -1,5 +1,5 @@
/* Builtin transformations.
- Copyright (C) 1997, 1998, 1999, 2000, 2001 Free Software Foundation, Inc.
+ Copyright (C) 1997-1999, 2000-2002 Free Software Foundation, Inc.
This file is part of the GNU C Library.
Contributed by Ulrich Drepper <drepper@cygnus.com>, 1997.
@@ -30,14 +30,14 @@ BUILTIN_ALIAS ("OSF00010105//", "ISO-10646/UCS4/") /* level 2 */
BUILTIN_ALIAS ("OSF00010106//", "ISO-10646/UCS4/") /* level 3 */
BUILTIN_TRANSFORMATION ("INTERNAL", "ISO-10646/UCS4/", 1, "=INTERNAL->ucs4",
- __gconv_transform_internal_ucs4, 4, 4, 4, 4)
+ __gconv_transform_internal_ucs4, NULL, 4, 4, 4, 4)
BUILTIN_TRANSFORMATION ("ISO-10646/UCS4/", "INTERNAL", 1, "=ucs4->INTERNAL",
- __gconv_transform_ucs4_internal, 4, 4, 4, 4)
+ __gconv_transform_ucs4_internal, NULL, 4, 4, 4, 4)
BUILTIN_TRANSFORMATION ("INTERNAL", "UCS-4LE//", 1, "=INTERNAL->ucs4le",
- __gconv_transform_internal_ucs4le, 4, 4, 4, 4)
+ __gconv_transform_internal_ucs4le, NULL, 4, 4, 4, 4)
BUILTIN_TRANSFORMATION ("UCS-4LE//", "INTERNAL", 1, "=ucs4le->INTERNAL",
- __gconv_transform_ucs4le_internal, 4, 4, 4, 4)
+ __gconv_transform_ucs4le_internal, NULL, 4, 4, 4, 4)
BUILTIN_ALIAS ("WCHAR_T//", "INTERNAL")
@@ -48,10 +48,11 @@ BUILTIN_ALIAS ("OSF05010001//", "ISO-10646/UTF8/")
BUILTIN_ALIAS ("ISO-10646/UTF-8/", "ISO-10646/UTF8/")
BUILTIN_TRANSFORMATION ("INTERNAL", "ISO-10646/UTF8/", 1, "=INTERNAL->utf8",
- __gconv_transform_internal_utf8, 4, 4, 1, 6)
+ __gconv_transform_internal_utf8, NULL, 4, 4, 1, 6)
BUILTIN_TRANSFORMATION ("ISO-10646/UTF8/", "INTERNAL", 1, "=utf8->INTERNAL",
- __gconv_transform_utf8_internal, 1, 6, 4, 4)
+ __gconv_transform_utf8_internal, __gconv_btwoc_ascii,
+ 1, 6, 4, 4)
BUILTIN_ALIAS ("UCS2//", "ISO-10646/UCS2/")
BUILTIN_ALIAS ("UCS-2//", "ISO-10646/UCS2/")
@@ -60,10 +61,10 @@ BUILTIN_ALIAS ("OSF00010101//", "ISO-10646/UCS2/") /* level 2 */
BUILTIN_ALIAS ("OSF00010102//", "ISO-10646/UCS2/") /* level 3 */
BUILTIN_TRANSFORMATION ("ISO-10646/UCS2/", "INTERNAL", 1, "=ucs2->INTERNAL",
- __gconv_transform_ucs2_internal, 2, 2, 4, 4)
+ __gconv_transform_ucs2_internal, NULL, 2, 2, 4, 4)
BUILTIN_TRANSFORMATION ("INTERNAL", "ISO-10646/UCS2/", 1, "=INTERNAL->ucs2",
- __gconv_transform_internal_ucs2, 4, 4, 2, 2)
+ __gconv_transform_internal_ucs2, NULL, 4, 4, 2, 2)
BUILTIN_ALIAS ("ANSI_X3.4//", "ANSI_X3.4-1968//")
@@ -80,10 +81,11 @@ BUILTIN_ALIAS ("CSASCII//", "ANSI_X3.4-1968//")
BUILTIN_ALIAS ("OSF00010020//", "ANSI_X3.4-1968//")
BUILTIN_TRANSFORMATION ("ANSI_X3.4-1968//", "INTERNAL", 1, "=ascii->INTERNAL",
- __gconv_transform_ascii_internal, 4, 4, 1, 1)
+ __gconv_transform_ascii_internal, __gconv_btwoc_ascii,
+ 4, 4, 1, 1)
BUILTIN_TRANSFORMATION ("INTERNAL", "ANSI_X3.4-1968//", 1, "=INTERNAL->ascii",
- __gconv_transform_internal_ascii, 4, 4, 1, 1)
+ __gconv_transform_internal_ascii, NULL, 4, 4, 1, 1)
#if BYTE_ORDER == BIG_ENDIAN
@@ -94,11 +96,13 @@ BUILTIN_ALIAS ("UCS-2LE//", "UNICODELITTLE//")
BUILTIN_TRANSFORMATION ("UNICODELITTLE//", "INTERNAL", 1,
"=ucs2reverse->INTERNAL",
- __gconv_transform_ucs2reverse_internal, 2, 2, 4, 4)
+ __gconv_transform_ucs2reverse_internal, NULL,
+ 2, 2, 4, 4)
BUILTIN_TRANSFORMATION ("INTERNAL", "UNICODELITTLE//", 1,
"=INTERNAL->ucs2reverse",
- __gconv_transform_internal_ucs2reverse, 4, 4, 2, 2)
+ __gconv_transform_internal_ucs2reverse, NULL,
+ 4, 4, 2, 2)
#else
BUILTIN_ALIAS ("UNICODELITTLE//", "ISO-10646/UCS2/")
BUILTIN_ALIAS ("UCS-2LE//", "ISO-10646/UCS2/")
@@ -107,9 +111,11 @@ BUILTIN_ALIAS ("UCS-2BE//", "UNICODEBIG//")
BUILTIN_TRANSFORMATION ("UNICODEBIG//", "INTERNAL", 1,
"=ucs2reverse->INTERNAL",
- __gconv_transform_ucs2reverse_internal, 2, 2, 4, 4)
+ __gconv_transform_ucs2reverse_internal, NULL,
+ 2, 2, 4, 4)
BUILTIN_TRANSFORMATION ("INTERNAL", "UNICODEBIG//", 1,
"=INTERNAL->ucs2reverse",
- __gconv_transform_internal_ucs2reverse, 4, 4, 2, 2)
+ __gconv_transform_internal_ucs2reverse, NULL,
+ 4, 4, 2, 2)
#endif
diff --git a/iconv/gconv_cache.c b/iconv/gconv_cache.c
index 8f92cbaf67..882acc6fa4 100644
--- a/iconv/gconv_cache.c
+++ b/iconv/gconv_cache.c
@@ -201,7 +201,11 @@ find_module (const char *directory, const char *filename,
result->__init_fct = result->__shlib_handle->init_fct;
result->__end_fct = result->__shlib_handle->end_fct;
+ /* These settings can be overridden by the init function. */
+ result->__btowc_fct = NULL;
result->__data = NULL;
+
+ /* Call the init function. */
if (result->__init_fct != NULL)
status = DL_CALL_FCT (result->__init_fct, (result));
}
diff --git a/iconv/gconv_conf.c b/iconv/gconv_conf.c
index cd5055c303..1262e76618 100644
--- a/iconv/gconv_conf.c
+++ b/iconv/gconv_conf.c
@@ -61,8 +61,8 @@ static const char gconv_module_ext[] = MODULE_EXT;
/* We have a few builtin transformations. */
static struct gconv_module builtin_modules[] =
{
-#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, MinF, MaxF, \
- MinT, MaxT) \
+#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, BtowcFct, \
+ MinF, MaxF, MinT, MaxT) \
{ \
from_string: From, \
to_string: To, \
@@ -73,18 +73,21 @@ static struct gconv_module builtin_modules[] =
#define BUILTIN_ALIAS(From, To)
#include "gconv_builtin.h"
-};
#undef BUILTIN_TRANSFORMATION
#undef BUILTIN_ALIAS
+};
static const char *builtin_aliases[] =
{
-#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, MinF, MaxF, \
- MinT, MaxT)
+#define BUILTIN_TRANSFORMATION(From, To, Cost, Name, Fct, BtowcFct, \
+ MinF, MaxF, MinT, MaxT)
#define BUILTIN_ALIAS(From, To) From " " To,
#include "gconv_builtin.h"
+
+#undef BUILTIN_TRANSFORMATION
+#undef BUILTIN_ALIAS
};
#ifdef USE_IN_LIBIO
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index 70c33df16d..020b556d5e 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -268,6 +268,9 @@ gen_steps (struct derivation_step *best, const char *toset,
result[step_cnt].__init_fct = shlib_handle->init_fct;
result[step_cnt].__end_fct = shlib_handle->end_fct;
+ /* These settings can be overridden by the init function. */
+ result[step_cnt].__btowc_fct = NULL;
+
/* Call the init function. */
if (result[step_cnt].__init_fct != NULL)
{
@@ -353,8 +356,12 @@ increment_counter (struct __gconv_step *steps, size_t nsteps)
step->__fct = step->__shlib_handle->fct;
step->__init_fct = step->__shlib_handle->init_fct;
step->__end_fct = step->__shlib_handle->end_fct;
+
+ /* These settings can be overridden by the init function. */
+ step->__btowc_fct = NULL;
}
+ /* Call the init function. */
if (step->__init_fct != NULL)
DL_CALL_FCT (step->__init_fct, (step));
}
diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h
index 1ac878d900..dec29d9c14 100644
--- a/iconv/gconv_int.h
+++ b/iconv/gconv_int.h
@@ -264,7 +264,7 @@ extern int __gconv_transliterate (struct __gconv_step *step,
/* Builtin transformations. */
#ifdef _LIBC
-# define __BUILTIN_TRANS(Name) \
+# define __BUILTIN_TRANSFORM(Name) \
extern int Name (struct __gconv_step *step, \
struct __gconv_step_data *data, \
const unsigned char **inbuf, \
@@ -272,21 +272,25 @@ extern int __gconv_transliterate (struct __gconv_step *step,
unsigned char **outbufstart, size_t *irreversible, \
int do_flush, int consume_incomplete)
-__BUILTIN_TRANS (__gconv_transform_ascii_internal);
-__BUILTIN_TRANS (__gconv_transform_internal_ascii);
-__BUILTIN_TRANS (__gconv_transform_utf8_internal);
-__BUILTIN_TRANS (__gconv_transform_internal_utf8);
-__BUILTIN_TRANS (__gconv_transform_ucs2_internal);
-__BUILTIN_TRANS (__gconv_transform_internal_ucs2);
-__BUILTIN_TRANS (__gconv_transform_ucs2reverse_internal);
-__BUILTIN_TRANS (__gconv_transform_internal_ucs2reverse);
-__BUILTIN_TRANS (__gconv_transform_internal_ucs4);
-__BUILTIN_TRANS (__gconv_transform_ucs4_internal);
-__BUILTIN_TRANS (__gconv_transform_internal_ucs4le);
-__BUILTIN_TRANS (__gconv_transform_ucs4le_internal);
-__BUILTIN_TRANS (__gconv_transform_internal_utf16);
-__BUILTIN_TRANS (__gconv_transform_utf16_internal);
-# undef __BUITLIN_TRANS
+__BUILTIN_TRANSFORM (__gconv_transform_ascii_internal);
+__BUILTIN_TRANSFORM (__gconv_transform_internal_ascii);
+__BUILTIN_TRANSFORM (__gconv_transform_utf8_internal);
+__BUILTIN_TRANSFORM (__gconv_transform_internal_utf8);
+__BUILTIN_TRANSFORM (__gconv_transform_ucs2_internal);
+__BUILTIN_TRANSFORM (__