about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog11
-rw-r--r--iconv/gconv_charset.h3
-rw-r--r--iconv/gconv_db.c13
-rw-r--r--iconv/gconv_int.h6
-rw-r--r--locale/findlocale.c6
5 files changed, 32 insertions, 7 deletions
diff --git a/ChangeLog b/ChangeLog
index e98129ec8d..0fc053fae0 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,14 @@
+2001-07-27  Ulrich Drepper  <drepper@redhat.com>
+
+	* iconv/gconv_cache.c (__gconv_compare_alias_cache): New function.
+	* iconv/gconv_int.h: Add prototype for __gconv_compare_alias_cache.
+	* iconv/gconv_charset.h: Replace __gconv_lookup_alias prototype with
+	__gconv_compare_alias prototype.
+	* iconv/gconv_db.c (__gconv_lookup_alias): Removed.
+	(__gconv_compare_alias): New function.
+	* locale/findlocale.c (_nl_find_locale): Ise __gconv_compare_alias
+	instead of calling __gconv_lookup_alias twice and compare here.
+
 2001-07-26  Mark Kettenis  <kettenis@gnu.org>
 
 	* hurd/hurdsig.c (_hurd_internal_post_signal): Fix handling of
diff --git a/iconv/gconv_charset.h b/iconv/gconv_charset.h
index 1e2b76bdca..b0b28079c6 100644
--- a/iconv/gconv_charset.h
+++ b/iconv/gconv_charset.h
@@ -57,4 +57,5 @@ upstr (char *dst, const char *str)
 
 
 /* If NAME is an codeset alias expand it.  */
-extern const char *__gconv_lookup_alias (const char *name);
+extern int __gconv_compare_alias (const char *name1, const char *name2)
+     internal_function;
diff --git a/iconv/gconv_db.c b/iconv/gconv_db.c
index 47861d19ca..9bd27c5e69 100644
--- a/iconv/gconv_db.c
+++ b/iconv/gconv_db.c
@@ -632,13 +632,20 @@ do_lookup_alias (const char *name)
 }
 
 
-const char *
-__gconv_lookup_alias (const char *name)
+int
+internal_function
+__gconv_compare_alias (const char *name1, const char *name2)
 {
+  int result;
+
   /* Ensure that the configuration data is read.  */
   __libc_once (once, __gconv_read_conf);
 
-  return do_lookup_alias (name) ?: name;
+  if (__gconv_compare_alias_cache (name1, name2, &result) != 0)
+    result = strcmp (do_lookup_alias (name1) ?: name1,
+		     do_lookup_alias (name2) ?: name2);
+
+  return result;
 }
 
 
diff --git a/iconv/gconv_int.h b/iconv/gconv_int.h
index 13698d8ac4..3b5f195b04 100644
--- a/iconv/gconv_int.h
+++ b/iconv/gconv_int.h
@@ -188,6 +188,12 @@ extern int __gconv_lookup_cache (const char *toset, const char *fromset,
 				 int flags)
      internal_function;
 
+/* Compare the two name for whether they are after alias expansion the
+   same.  This function uses the cache and fails if none is
+   loaded.  */
+extern int __gconv_compare_alias_cache (const char *name1, const char *name2,
+					int *result) internal_function;
+
 /* Free data associated with a step's structure.  */
 extern void __gconv_release_step (struct __gconv_step *step)
      internal_function;
diff --git a/locale/findlocale.c b/locale/findlocale.c
index 27702586a3..59b99925bf 100644
--- a/locale/findlocale.c
+++ b/locale/findlocale.c
@@ -207,9 +207,9 @@ _nl_find_locale (const char *locale_path, size_t locale_path_len,
       ccodeset = (char *) alloca (strlen (codeset) + 3);
       strip (ccodeset, codeset);
 
-      if (strcmp (__gconv_lookup_alias (upstr (ccodeset, ccodeset)),
-		  __gconv_lookup_alias (upstr (clocale_codeset,
-					       clocale_codeset))) != 0)
+      if (__gconv_compare_alias (upstr (ccodeset, ccodeset),
+				 upstr (clocale_codeset,
+					clocale_codeset)) != 0)
 	/* The codesets are not identical, don't use the locale.  */
 	return NULL;
     }