diff options
45 files changed, 161 insertions, 61 deletions
diff --git a/ChangeLog b/ChangeLog index 72e3748674..fd3bb20c20 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,36 @@ +2000-06-16 Ulrich Drepper <drepper@redhat.com> + + * iconv/gconv_int.h (norm_add_slashes): Optionally add given suffix. + * iconv/gconv_open.c: Remove error handling specification from `from' + character set name. + * intl/loadmsgcat.c (_nl_load_domain): Call norm_add_slashes with + new parameter to always enable transliteration. + * locale/localeinfo.h (LIMAGIC): Bump number because of incompatible + change. + (struct locale_data): Add new members use_translit and options. + * locale/findlocale.c (_nl_find_locale): Set use_translit flag is + character set name contained modifier TRANSLIT. + * locale/loadlocale.c (_nl_load_locale): Initialize new use_translit + and options fields. + (_nl_unload_locale): Free options string if necessary. + * wcsmbs/wcsmbsload.c (__wcsmbs_load_conv): Enable translation if + the locale names suggested this. + * locale/C-address.c: Add two new initialilzers to adjust data + structure for new format. + * locale/C-collate.c: Likewise. + * locale/C-ctype.c: Likewise. + * locale/C-identification.c: Likewise. + * locale/C-measurement.c: Likewise. + * locale/C-messages.c: Likewise. + * locale/C-monetary.c: Likewise. + * locale/C-name.c: Likewise. + * locale/C-numeric.c: Likewise. + * locale/C-paper.c: Likewise. + * locale/C-telephone.c: Likewise. + * locale/C-time.c: Likewise. + + * locale/setlocale.c: Add some more __builtin_expect. + 2000-06-15 Ulrich Drepper <drepper@redhat.com> * iconv/gconv.h (__gconv_fct): Change type of fifth parameter to diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h index 34dff7d522..5bdf7143e6 100644 --- a/iconv/gconv_int.h +++ b/iconv/gconv_int.h @@ -102,18 +102,19 @@ extern struct gconv_module *__gconv_modules_db; /* The gconv functions expects the name to be in upper case and complete, including the trailing slashes if necessary. */ -#define norm_add_slashes(str) \ +#define norm_add_slashes(str,suffix) \ ({ \ const char *cp = (str); \ char *result; \ char *tmp; \ size_t cnt = 0; \ + size_t suffix_len = suffix == NULL ? 0 : strlen (suffix); \ \ while (*cp != '\0') \ if (*cp++ == '/') \ ++cnt; \ \ - tmp = result = alloca (cp - (str) + 3); \ + tmp = result = alloca (cp - (str) + 3 + suffix_len); \ cp = (str); \ while (*cp != '\0') \ *tmp++ = _toupper (*cp++); \ @@ -121,7 +122,11 @@ extern struct gconv_module *__gconv_modules_db; { \ *tmp++ = '/'; \ if (cnt < 1) \ - *tmp++ = '/'; \ + { \ + *tmp++ = '/'; \ + if (suffix != NULL) \ + tmp = __mempcpy (tmp, suffix, suffix_len); \ + } \ } \ *tmp = '\0'; \ result; \ diff --git a/iconv/gconv_open.c b/iconv/gconv_open.c index 14f1d5e0f9..d2963fa8ee 100644 --- a/iconv/gconv_open.c +++ b/iconv/gconv_open.c @@ -37,6 +37,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, int res; int conv_flags = 0; const char *errhand; + const char *ignore; /* Find out whether any error handling method is specified. */ errhand = strchr (toset, '/'); @@ -44,7 +45,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, errhand = strchr (errhand + 1, '/'); if (__builtin_expect (errhand != NULL, 1)) { - if (errhand[1] == '\0') + if (*++errhand == '\0') errhand = NULL; else { @@ -56,7 +57,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, flags = __GCONV_IGNORE_ERRORS; - if (strcasecmp (errhand, "IGNORE") == 0) + if (__strcasecmp (errhand, "IGNORE") == 0) { /* Found it. This means we should ignore conversion errors. */ flags = __GCONV_IGNORE_ERRORS; @@ -65,6 +66,18 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, } } + /* For the source character set we ignore the error handler specification. + XXX Is this really always the best? */ + ignore = strchr (fromset, '/'); + if (ignore != NULL && (ignore = strchr (ignore + 1, '/')) != NULL + && *++ignore != '\0') + { + char *newfromset = (char *) alloca (ignore - fromset + 1); + + newfromset[ignore - fromset] = '\0'; + fromset = memcpy (newfromset, fromset, ignore - fromset); + } + res = __gconv_find_transform (toset, fromset, &steps, &nsteps, flags); if (res == __GCONV_OK) { @@ -78,7 +91,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, if (errhand != NULL) { /* Find the appropriate transliteration handling. */ - if (strcasecmp (errhand, "TRANSLIT") == 0) + if (__strcasecmp (errhand, "TRANSLIT") == 0) { /* It's the builtin transliteration handling. We only suport for it working on the internal encoding. */ @@ -89,7 +102,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, trans_fct = __gconv_transliterate; /* No context, init, or end function. */ } - else if (strcasecmp (errhand, "WORK AROUND A GCC BUG") == 0) + else if (__strcasecmp (errhand, "WORK AROUND A GCC BUG") == 0) { trans_init_fct = (__gconv_trans_init_fct) 1; } @@ -151,7 +164,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, /* Now see whether we can use the transliteration module for this step. */ for (n = 0; n < ncsnames; ++n) - if (strcasecmp (steps[cnt].__from_name, csnames[n]) == 0) + if (__strcasecmp (steps[cnt].__from_name, csnames[n]) == 0) { /* Match! Now try the initializer. */ if (trans_init_fct == NULL @@ -182,7 +195,7 @@ __gconv_open (const char *toset, const char *fromset, __gconv_t *handle, /* Now see whether we can use the transliteration module for this step. */ for (n = 0; n < ncsnames; ++n) - if (strcasecmp (steps[cnt].__from_name, csnames[n]) == 0) + if (__strcasecmp (steps[cnt].__from_name, csnames[n]) == 0) { /* Match! Now try the initializer. */ if (trans_init_fct == NULL diff --git a/iconvdata/8bit-gap.c b/iconvdata/8bit-gap.c index 6394065c56..a4a32d3eae 100644 --- a/iconvdata/8bit-gap.c +++ b/iconvdata/8bit-gap.c @@ -89,7 +89,7 @@ struct gap { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -112,7 +112,7 @@ struct gap { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -137,7 +137,7 @@ struct gap { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/8bit-generic.c b/iconvdata/8bit-generic.c index 1478c5be59..02d972e21c 100644 --- a/iconvdata/8bit-generic.c +++ b/iconvdata/8bit-generic.c @@ -72,7 +72,7 @@ { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/ansi_x3.110.c b/iconvdata/ansi_x3.110.c index f338055f39..6ec09c3c5c 100644 --- a/iconvdata/ansi_x3.110.c +++ b/iconvdata/ansi_x3.110.c @@ -501,7 +501,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -559,7 +559,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -587,7 +587,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/big5.c b/iconvdata/big5.c index 8cad304c7a..947a92a341 100644 --- a/iconvdata/big5.c +++ b/iconvdata/big5.c @@ -8589,7 +8589,7 @@ static const char from_ucs4_tab13[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/big5hkscs.c b/iconvdata/big5hkscs.c index 0859dd8f09..64923d42af 100644 --- a/iconvdata/big5hkscs.c +++ b/iconvdata/big5hkscs.c @@ -12746,7 +12746,7 @@ static const char from_ucs4_tab14[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/euc-cn.c b/iconvdata/euc-cn.c index 075970ce96..18e73fda6c 100644 --- a/iconvdata/euc-cn.c +++ b/iconvdata/euc-cn.c @@ -145,7 +145,7 @@ { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/euc-jp.c b/iconvdata/euc-jp.c index 771dc069e8..3e21d55f12 100644 --- a/iconvdata/euc-jp.c +++ b/iconvdata/euc-jp.c @@ -222,7 +222,7 @@ { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, \ - &inptr, inend, &outbuf, \ + &inptr, inend, &outptr, \ irreversible)); \ if (result != __GCONV_OK) \ break; \ diff --git a/iconvdata/euc-kr.c b/iconvdata/euc-kr.c index e953df5dc9..c32b9b3537 100644 --- a/iconvdata/euc-kr.c +++ b/iconvdata/euc-kr.c @@ -150,7 +150,7 @@ euckr_from_ucs4 (uint32_t ch, unsigned char *cp) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/euc-tw.c b/iconvdata/euc-tw.c index f3152478e2..b4cf21ba97 100644 --- a/iconvdata/euc-tw.c +++ b/iconvdata/euc-tw.c @@ -197,7 +197,7 @@ { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/gbgbk.c b/iconvdata/gbgbk.c index 15e72d9cfb..0afcd72311 100644 --- a/iconvdata/gbgbk.c +++ b/iconvdata/gbgbk.c @@ -106,7 +106,7 @@ { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/gbk.c b/iconvdata/gbk.c index 669e4a9c9f..4505b65c1a 100644 --- a/iconvdata/gbk.c +++ b/iconvdata/gbk.c @@ -13456,7 +13456,7 @@ static const char __gbk_from_ucs4_tab12[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/iso-2022-cn.c b/iconvdata/iso-2022-cn.c index 818f2a773c..f2170698dd 100644 --- a/iconvdata/iso-2022-cn.c +++ b/iconvdata/iso-2022-cn.c @@ -328,7 +328,7 @@ enum { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, \ - &inptr, inend, &outbuf, \ + &inptr, inend, &outptr, \ irreversible)); \ if (result != __GCONV_OK) \ break; \ diff --git a/iconvdata/iso-2022-jp.c b/iconvdata/iso-2022-jp.c index b66c9503b5..ab42bcc75c 100644 --- a/iconvdata/iso-2022-jp.c +++ b/iconvdata/iso-2022-jp.c @@ -707,7 +707,7 @@ gconv_end (struct __gconv_step *data) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, \ - &inptr, inend, &outbuf, \ + &inptr, inend, &outptr, \ irreversible)); \ if (result != __GCONV_OK) \ break; \ @@ -894,7 +894,7 @@ gconv_end (struct __gconv_step *data) result = DL_CALL_FCT \ (step_data->__trans.__trans_fct,\ (step, step_data, *inptrp, \ - &inptr, inend, &outbuf, \ + &inptr, inend, &outptr, \ irreversible)); \ if (result != __GCONV_OK) \ break; \ diff --git a/iconvdata/iso-2022-kr.c b/iconvdata/iso-2022-kr.c index d3cca52d05..52031ca177 100644 --- a/iconvdata/iso-2022-kr.c +++ b/iconvdata/iso-2022-kr.c @@ -259,7 +259,7 @@ enum { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/iso646.c b/iconvdata/iso646.c index df81ee2be6..66f89589cc 100644 --- a/iconvdata/iso646.c +++ b/iconvdata/iso646.c @@ -889,7 +889,7 @@ gconv_end (struct __gconv_step *data) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/iso8859-1.c b/iconvdata/iso8859-1.c index d69a201fed..a6134816db 100644 --- a/iconvdata/iso8859-1.c +++ b/iconvdata/iso8859-1.c @@ -53,7 +53,7 @@ { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/iso_6937-2.c b/iconvdata/iso_6937-2.c index 536d8965fa..cde210844d 100644 --- a/iconvdata/iso_6937-2.c +++ b/iconvdata/iso_6937-2.c @@ -569,7 +569,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -594,7 +594,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/iso_6937.c b/iconvdata/iso_6937.c index f812ce2c93..e767291adf 100644 --- a/iconvdata/iso_6937.c +++ b/iconvdata/iso_6937.c @@ -546,7 +546,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -571,7 +571,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/johab.c b/iconvdata/johab.c index ac3bf82b27..d2947dcd89 100644 --- a/iconvdata/johab.c +++ b/iconvdata/johab.c @@ -400,7 +400,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -445,7 +445,7 @@ johab_sym_hanja_to_ucs (uint_fast32_t idx, uint_fast32_t c1, uint_fast32_t c2) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/sjis.c b/iconvdata/sjis.c index 806579b283..aa51259355 100644 --- a/iconvdata/sjis.c +++ b/iconvdata/sjis.c @@ -4472,7 +4472,7 @@ static const char from_ucs4_extra[0x100][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -4500,7 +4500,7 @@ static const char from_ucs4_extra[0x100][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/t.61.c b/iconvdata/t.61.c index a7d42277c9..3c1a69e4ab 100644 --- a/iconvdata/t.61.c +++ b/iconvdata/t.61.c @@ -473,7 +473,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -510,7 +510,7 @@ static const char from_ucs4[][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/uhc.c b/iconvdata/uhc.c index 9c494ff705..5526e9b5ba 100644 --- a/iconvdata/uhc.c +++ b/iconvdata/uhc.c @@ -3225,7 +3225,7 @@ static const char uhc_hangul_from_ucs[11172][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -3265,7 +3265,7 @@ static const char uhc_hangul_from_ucs[11172][2] = { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/unicode.c b/iconvdata/unicode.c index e818c54c31..9caa95df0f 100644 --- a/iconvdata/unicode.c +++ b/iconvdata/unicode.c @@ -156,7 +156,7 @@ gconv_end (struct __gconv_step *data) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, inend, \ - &outbuf, irreversible)); \ + &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/iconvdata/utf-16.c b/iconvdata/utf-16.c index 44911feb42..fd7bba72bf 100644 --- a/iconvdata/utf-16.c +++ b/iconvdata/utf-16.c @@ -206,7 +206,7 @@ gconv_end (struct __gconv_step *data) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ @@ -249,7 +249,7 @@ gconv_end (struct __gconv_step *data) { \ result = DL_CALL_FCT (step_data->__trans.__trans_fct, \ (step, step_data, *inptrp, &inptr, \ - inend, &outbuf, irreversible)); \ + inend, &outptr, irreversible)); \ if (result != __GCONV_OK) \ break; \ } \ diff --git a/intl/loadmsgcat.c b/intl/loadmsgcat.c index 4009525fe8..398d7518d9 100644 --- a/intl/loadmsgcat.c +++ b/intl/loadmsgcat.c @@ -315,8 +315,9 @@ _nl_load_domain (domain_file) } # ifdef _LIBC - outcharset = norm_add_slashes (outcharset); - charset = norm_add_slashes (charset); + /* We always want to use transliteration. */ + outcharset = norm_add_slashes (outcharset, "TRANSLIT"); + charset = norm_add_slashes (charset, NULL); if (__gconv_open (outcharset, charset, &domain->conv, GCONV_AVOID_NOCONV) != __GCONV_OK) diff --git a/locale/C-address.c b/locale/C-address.c index 8b37639d89..75a51d276b 100644 --- a/locale/C-address.c +++ b/locale/C-address.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_ADDRESS = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 12, { { string: "%a%N%f%N%d%N%b%N%s %h %e %r%N%C-%z %T%N%c%N" }, diff --git a/locale/C-collate.c b/locale/C-collate.c index 0ad0efe271..f8d1430755 100644 --- a/locale/C-collate.c +++ b/locale/C-collate.c @@ -97,6 +97,8 @@ const struct locale_data _nl_C_LC_COLLATE = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 18, { { word: 0 }, diff --git a/locale/C-ctype.c b/locale/C-ctype.c index 8c85d6ec8b..4ab3f0171e 100644 --- a/locale/C-ctype.c +++ b/locale/C-ctype.c @@ -343,6 +343,8 @@ const struct locale_data _nl_C_LC_CTYPE = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 62, { { string: _nl_C_LC_CTYPE_class }, diff --git a/locale/C-identification.c b/locale/C-identification.c index 10d9ae9b8d..89ebf3149e 100644 --- a/locale/C-identification.c +++ b/locale/C-identification.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_IDENTIFICATION = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 15, { { string: "ISO/IEC 14652 i18n FDCC-set" }, diff --git a/locale/C-measurement.c b/locale/C-measurement.c index 37db30d939..92de2a9eb5 100644 --- a/locale/C-measurement.c +++ b/locale/C-measurement.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_MEASUREMENT = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 1, { { string: "\1" } diff --git a/locale/C-messages.c b/locale/C-messages.c index 0363020476..3f96bb0f2f 100644 --- a/locale/C-messages.c +++ b/locale/C-messages.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.ai.mit.edu>, 1995. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_MESSAGES = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 4, { { string: "^[yY]" }, diff --git a/locale/C-monetary.c b/locale/C-monetary.c index 96a1e52f25..39d061da55 100644 --- a/locale/C-monetary.c +++ b/locale/C-monetary.c @@ -33,6 +33,8 @@ const struct locale_data _nl_C_LC_MONETARY = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 45, { { string: "" }, diff --git a/locale/C-name.c b/locale/C-name.c index 4b31370a8c..fdce4cb3cc 100644 --- a/locale/C-name.c +++ b/locale/C-name.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_NAME = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 6, { { string: "%p%t%g%t%m%t%f" }, diff --git a/locale/C-numeric.c b/locale/C-numeric.c index fc2e104304..65fc2734ba 100644 --- a/locale/C-numeric.c +++ b/locale/C-numeric.c @@ -32,6 +32,8 @@ const struct locale_data _nl_C_LC_NUMERIC = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 5, { { string: "." }, diff --git a/locale/C-paper.c b/locale/C-paper.c index fa3e8557d7..19f847c22f 100644 --- a/locale/C-paper.c +++ b/locale/C-paper.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1998, 1999, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_PAPER = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 2, { { word: 297 }, diff --git a/locale/C-telephone.c b/locale/C-telephone.c index 9647ac0da4..adf407db2c 100644 --- a/locale/C-telephone.c +++ b/locale/C-telephone.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1998 Free Software Foundation, Inc. +/* Copyright (C) 1998, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@cygnus.com>, 1998. @@ -29,6 +29,8 @@ const struct locale_data _nl_C_LC_TELEPHONE = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 4, { { string: "+%c %a %l" }, diff --git a/locale/C-time.c b/locale/C-time.c index 9be32c06b3..18bd645ed0 100644 --- a/locale/C-time.c +++ b/locale/C-time.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. +/* Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper <drepper@gnu.org>, 1995. @@ -28,6 +28,8 @@ const struct locale_data _nl_C_LC_TIME = _nl_C_name, NULL, 0, 0, /* no file mapped */ UNDELETABLE, + 0, + NULL, 62, { { string: "Sun" }, diff --git a/locale/findlocale.c b/locale/findlocale.c index f0c911d29f..7567744432 100644 --- a/locale/findlocale.c +++ b/locale/findlocale.c @@ -181,6 +181,11 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len, } *name = (char *) ((struct locale_data *) locale_file->data)->name; + /* Determine whether the user wants transliteration or not. */ + if ((modifier != NULL && __strcasecmp (modifier, "TRANSLIT") == 0) + || (special != NULL && __strcasecmp (special, "TRANSLIT") == 0)) + ((struct locale_data *) locale_file->data)->use_translit = 1; + /* Increment the usage count. */ if (((struct locale_data *) locale_file->data)->usage_count < MAX_USAGE_COUNT) diff --git a/locale/loadlocale.c b/locale/loadlocale.c index cc454abae4..36ce5f4076 100644 --- a/locale/loadlocale.c +++ b/locale/loadlocale.c @@ -202,6 +202,8 @@ _nl_load_locale (struct loaded_l10nfile *file, int category) newdata->filesize = st.st_size; newdata->mmaped = mmaped; newdata->usage_count = 0; + newdata->use_translit = 0; + newdata->options = NULL; newdata->nstrings = filedata->nstrings; for (cnt = 0; cnt < newdata->nstrings; ++cnt) { @@ -232,5 +234,8 @@ _nl_unload_locale (struct locale_data *locale) #endif free ((void *) locale->filedata); + if (locale->options != NULL) + free (locale->options); + free (locale); } diff --git a/locale/localeinfo.h b/locale/localeinfo.h index ced96ac4a9..b5dfcd92d8 100644 --- a/locale/localeinfo.h +++ b/locale/localeinfo.h @@ -1,5 +1,5 @@ /* Declarations for internal libc locale interfaces - Copyright (C) 1995, 1996, 1997, 1998, 1999 Free Software Foundation, Inc. + Copyright (C) 1995, 96, 97, 98, 99, 2000 Free Software Foundation, Inc. This file is part of the GNU C Library. The GNU C Library is free software; you can redistribute it and/or @@ -33,7 +33,7 @@ #include <intl/loadinfo.h> /* For loaded_l10nfile definition. */ /* Magic number at the beginning of a locale data file for CATEGORY. */ -#define LIMAGIC(category) (0x980505 ^ (category)) +#define LIMAGIC(category) (0x20000616 ^ (category)) /* Two special weight constants for the collation data. */ #define IGNORE_CHAR 2 @@ -53,6 +53,11 @@ struct locale_data unsigned int usage_count; /* Counter for users. */ + int use_translit; /* Nonzero if the mb*towv*() and wc*tomb() + functions should use transliteration. */ + const char *options; /* Extra options from the locale name, + not used in the path to the locale data. */ + unsigned int nstrings; /* Number of strings below. */ union locale_data_value { diff --git a/locale/setlocale.c b/locale/setlocale.c index 0bf9eeef7b..03456fba71 100644 --- a/locale/setlocale.c +++ b/locale/setlocale.c @@ -220,7 +220,8 @@ setlocale (int category, const char *locale) char *composite; /* Sanity check for CATEGORY argument. */ - if (category < 0 || category >= __LC_LAST) + if (__builtin_expect (category, 0) < 0 + || __builtin_expect (category, 0) >= __LC_LAST) ERROR_RETURN; /* Does user want name of current locale? */ @@ -261,7 +262,7 @@ setlocale (int category, const char *locale) if (category != LC_ALL) newnames[category] = (char *) locale; - if (strchr (locale, ';') != NULL) + if (__builtin_expect (strchr (locale, ';') != NULL, 0)) { /* This is a composite name. Make a copy and split it up. */ char *np = strdupa (locale); diff --git a/wcsmbs/wcsmbsload.c b/wcsmbs/wcsmbsload.c index 55d19ff0cf..b152b3541c 100644 --- a/wcsmbs/wcsmbsload.c +++ b/wcsmbs/wcsmbsload.c @@ -146,7 +146,7 @@ __wcsmbs_load_conv (const struct locale_data *new_category) /* We should repeat the test since while we waited some other thread might have run this function. */ - if (__wcsmbs_last_locale != new_category) + if (__builtin_expect (__wcsmbs_last_locale != new_category, 1)) { if (new_category->name == _nl_C_name) /* Yes, pointer comparison. */ { @@ -161,6 +161,7 @@ __wcsmbs_load_conv (const struct locale_data *new_category) const char *complete_name; struct __gconv_step *new_towc; struct __gconv_step *new_tomb; + int use_translit; /* Free the old conversions. */ __gconv_close_transform (__wcsmbs_gconv_fcts.tomb, 1); @@ -169,10 +170,17 @@ __wcsmbs_load_conv (const struct locale_data *new_category) /* Get name of charset of the locale. */ charset_name = new_category->values[_NL_ITEM_INDEX(CODESET)].string; + /* Does the user want transliteration? */ + use_translit = new_category->use_translit; + /* Normalize the name and add the slashes necessary for a complete lookup. */ - complete_name = norm_add_slashes (charset_name); + complete_name = norm_add_slashes (charset_name, + use_translit ? "TRANSLIT" : NULL); + /* It is not necessary to use transliteration in this direction + since the internal character set is supposed to be able to + represent all others. */ new_towc = getfct ("INTERNAL", complete_name); if (new_towc != NULL) new_tomb = getfct (complete_name, "INTERNAL"); |