about summary refs log tree commit diff
path: root/wctype/towctrans_l.c
diff options
context:
space:
mode:
Diffstat (limited to 'wctype/towctrans_l.c')
-rw-r--r--wctype/towctrans_l.c29
1 files changed, 22 insertions, 7 deletions
diff --git a/wctype/towctrans_l.c b/wctype/towctrans_l.c
index 09596b9685..e3624441ca 100644
--- a/wctype/towctrans_l.c
+++ b/wctype/towctrans_l.c
@@ -1,5 +1,5 @@
 /* Map wide character using given mapping and locale.
-   Copyright (C) 1996, 1997 Free Software Foundation, Inc.
+   Copyright (C) 1996, 1997, 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
@@ -22,16 +22,31 @@
 /* Define the lookup function.  */
 #define USE_IN_EXTENDED_LOCALE_MODEL	1
 #include "cname-lookup.h"
+#include "wchar-lookup.h"
 
 wint_t
 __towctrans_l (wint_t wc, wctrans_t desc, __locale_t locale)
 {
-  size_t idx;
-
-  idx = cname_lookup (wc, locale);
-  if (idx == ~((size_t) 0))
-    /* Character is not known.  Default action is to simply return it.  */
+  /* If the user passes in an invalid DESC valid (the one returned from
+     `__wctrans_l' in case of an error) simply return the value.  */
+  if (desc == (wctrans_t) 0)
     return wc;
 
-  return (wint_t) desc[idx];
+  if (locale->__locales[LC_CTYPE]->values[_NL_ITEM_INDEX (_NL_CTYPE_HASH_SIZE)].word != 0)
+    {
+      /* Old locale format.  */
+      size_t idx;
+
+      idx = cname_lookup (wc, locale);
+      if (idx == ~((size_t) 0))
+	/* Character is not known.  Default action is to simply return it.  */
+	return wc;
+
+      return (wint_t) desc[idx];
+    }
+  else
+    {
+      /* New locale format.  */
+      return wctrans_table_lookup ((const char *) desc, wc);
+    }
 }