diff options
Diffstat (limited to 'wctype/towctrans_l.c')
-rw-r--r-- | wctype/towctrans_l.c | 29 |
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); + } } |