about summary refs log tree commit diff
path: root/wctype/wctrans.c
diff options
context:
space:
mode:
Diffstat (limited to 'wctype/wctrans.c')
-rw-r--r--wctype/wctrans.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/wctype/wctrans.c b/wctype/wctrans.c
index 771fb842ef..3dd72231cd 100644
--- a/wctype/wctrans.c
+++ b/wctype/wctrans.c
@@ -32,7 +32,6 @@ wctrans (const char *property)
 {
   const char *names;
   size_t cnt;
-  int32_t *result;
 
   names = _NL_CURRENT (LC_CTYPE, _NL_CTYPE_MAP_NAMES);
   cnt = 0;
@@ -48,13 +47,21 @@ wctrans (const char *property)
   if (names[0] == '\0')
     return 0;
 
-  if (cnt == 0)
-    return (wctrans_t) __ctype32_toupper;
-  else if (cnt == 1)
-    return (wctrans_t) __ctype32_tolower;
-
-  /* We have to search the table.  */
-  result = (int32_t *) _NL_CURRENT (LC_CTYPE, _NL_NUM_LC_CTYPE + cnt - 2);
+  if (_NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_HASH_SIZE) != 0)
+    {
+      /* Old locale format.  */
+      if (cnt == 0)
+	return (wctrans_t) __ctype32_toupper;
+      else if (cnt == 1)
+	return (wctrans_t) __ctype32_tolower;
 
-  return (wctrans_t) result;
+      /* We have to search the table.  */
+      return (wctrans_t) (const int32_t *) _NL_CURRENT (LC_CTYPE, _NL_NUM_LC_CTYPE + cnt - 2);
+    }
+  else
+    {
+      /* New locale format.  */
+      size_t i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET) + cnt;
+      return (wctrans_t) _nl_current_LC_CTYPE->values[i].string;
+    }
 }