diff options
author | Roland McGrath <roland@gnu.org> | 2002-09-02 19:34:39 +0000 |
---|---|---|
committer | Roland McGrath <roland@gnu.org> | 2002-09-02 19:34:39 +0000 |
commit | 963102971df9fbcd967a46748efc854d269cee1f (patch) | |
tree | 352ea540316cec578b89ff90b8d9915536906870 /wcsmbs/wcsmbsload.h | |
parent | 1977e59058a8a5260770cade67676bd93f896fdf (diff) | |
download | glibc-963102971df9fbcd967a46748efc854d269cee1f.tar.gz glibc-963102971df9fbcd967a46748efc854d269cee1f.tar.xz glibc-963102971df9fbcd967a46748efc854d269cee1f.zip |
* locale/localeinfo.h (struct locale_data): Add private.ctype.
* wcsmbs/wcsmbsload.h (__wcsmbs_gconv_fcts, __wcsmbs_last_locale, __wcsmbs_to_wc, update_conversion_ptrs): Removed. (__wcsmbs_gconv_fcts_c, _nl_C_LC_CTYPE): New externs. (__wcsmbs_load_conv): Remove const from argument. (_nl_cleanup_ctype): New proto. (get_gconv_fcts): New function. * wcsmbs/wcsmbsload.c (__wcsmbs_last_locale): Removed. (__wcsmbs_to_wc): Rename back to... (to_wc): ... this. (__wcsmbs_gconv_fcts): Rename to... (__wcsmbs_gconv_fcts_c): ... this. Make const. Use to_wc. (lock): Removed. (__libc_setlocale_lock): New extern. (__wcsmbs_load_conv): Remove const from argument. Initialize new_category->private.ctype instead of a global variable. (__wcsmbs_clone_conv): Use get_gconv_fcts instead of update_function_ptrs. No locking is necessary. (_nl_cleanup_ctype): New function. * wcsmbs/btowc.c (__btowc): Use get_gconv_fcts instead of update_function_ptrs and a global __wcsmbs_gconv_fcts variable. * wcsmbs/mbrtowc.c (__mbrtowc): Likewise. * wcsmbs/mbsnrtowcs.c (__mbsnrtowcs): Likewise. * wcsmbs/wcrtomb.c (__wcrtomb): Likewise. * wcsmbs/wcsnrtombs.c (__wcsnrtombs): Likewise. * wcsmbs/wcsrtombs.c (__wcsrtombs): Likewise. * wcsmbs/wctob.c (wctob): Likewise. * stdlib/mblen.c (mblen): Likewise. * stdlib/mbtowc.c (mbtowc): Likewise. * stdlib/wctomb.c (wctomb): Likewise. * wcsmbs/mbsrtowcs.c (__mbsrtowcs): Likewise. Remove calls to wcsmbs_get_towc_func and wcsmbs_free_funcs. * wcsmbs/mbsrtowcs_l.c (wcsmbs_get_towc_func, wcsmbs_free_funcs): Removed.
Diffstat (limited to 'wcsmbs/wcsmbsload.h')
-rw-r--r-- | wcsmbs/wcsmbsload.h | 31 |
1 files changed, 16 insertions, 15 deletions
diff --git a/wcsmbs/wcsmbsload.h b/wcsmbs/wcsmbsload.h index b7594ce5e9..0cf5da4f88 100644 --- a/wcsmbs/wcsmbsload.h +++ b/wcsmbs/wcsmbsload.h @@ -35,15 +35,10 @@ struct gconv_fcts }; /* Set of currently active conversion functions. */ -extern struct gconv_fcts __wcsmbs_gconv_fcts attribute_hidden; - - -/* Last loaded locale for LC_CTYPE. */ -extern const struct locale_data *__wcsmbs_last_locale attribute_hidden; - +extern const struct gconv_fcts __wcsmbs_gconv_fcts_c attribute_hidden; /* Load conversion functions for the currently selected locale. */ -extern void __wcsmbs_load_conv (const struct locale_data *new_category) +extern void __wcsmbs_load_conv (struct locale_data *new_category) internal_function; /* Clone the current `__wcsmbs_load_conv' value. */ @@ -54,12 +49,12 @@ extern void __wcsmbs_clone_conv (struct gconv_fcts *copy) extern int __wcsmbs_named_conv (struct gconv_fcts *copy, const char *name) internal_function; - -#include <iconv/gconv_int.h> +/* Function used for the `private.cleanup' hook. */ +extern void _nl_cleanup_ctype (struct locale_data *) + internal_function attribute_hidden; -/* Variable for conversion from ASCII to wchar_t. */ -extern struct __gconv_step __wcsmbs_to_wc attribute_hidden; +#include <iconv/gconv_int.h> /* Load the function implementation if necessary. */ @@ -67,14 +62,20 @@ extern struct __gconv_step *__wcsmbs_getfct (const char *to, const char *from, size_t *nstepsp) attribute_hidden; +extern const struct locale_data _nl_C_LC_CTYPE attribute_hidden; /* Check whether the LC_CTYPE locale changed since the last call. Update the pointers appropriately. */ -static inline void -update_conversion_ptrs (void) +static inline const struct gconv_fcts * +get_gconv_fcts (struct locale_data *data) { - if (__wcsmbs_last_locale != _NL_CURRENT_DATA (LC_CTYPE)) - __wcsmbs_load_conv (_NL_CURRENT_DATA (LC_CTYPE)); + if (__builtin_expect (data->private.ctype == NULL, 0)) + { + if (__builtin_expect (data == &_nl_C_LC_CTYPE, 0)) + return &__wcsmbs_gconv_fcts_c; + __wcsmbs_load_conv (data); + } + return data->private.ctype; } #endif /* wcsmbsload.h */ |