about summary refs log tree commit diff
path: root/wcsmbs/wcsmbsload.h
diff options
context:
space:
mode:
authorRoland McGrath <roland@gnu.org>2002-09-02 19:34:39 +0000
committerRoland McGrath <roland@gnu.org>2002-09-02 19:34:39 +0000
commit963102971df9fbcd967a46748efc854d269cee1f (patch)
tree352ea540316cec578b89ff90b8d9915536906870 /wcsmbs/wcsmbsload.h
parent1977e59058a8a5260770cade67676bd93f896fdf (diff)
downloadglibc-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.h31
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 */