From d47d5b850bed398357e7f05d8fef508be1bb7f51 Mon Sep 17 00:00:00 2001 From: Corinna Vinschen Date: Wed, 28 Apr 2010 09:59:37 +0000 Subject: Extend locale support to maintain wide char values of native strings if __HAVE_LOCALE_INFO_EXTENDED__ is defined. * libc/include/langinfo.h (enum __nl_item): New type. Define all native values accessible through nl_langinfo. Define previously existing POSIX-compatible values as macros as well. * libc/include/stdlib.h (__mb_cur_max): Drop declaration. (__locale_mb_cur_max): Declare. (MB_CUR_MAX): Re-define calling __locale_mb_cur_max. * libc/locale/Makefile.am (ELIX_SOURCES): Add lctype.c. * libc/locale/Makefile.in: Regenerate. * libc/locale/lctype.c: New file to define and load LC_CTYPE category. * libc/locale/lctype.h: New file, matching header. * libc/locale/lmessages.c (_C_messages_locale): Add default values for wide char members. (__messages_load_locale): Add _C_messages_locale in call to __set_lc_messages_from_win. * libc/locale/lmessages.h (struct lc_messages_T): Add wide char members. * libc/locale/lmonetary.c (_C_monetary_locale): Add default values for wide char members. (__monetary_load_locale): Add _C_monetary_locale in call to __set_lc_monetary_from_win. * libc/locale/lmonetary.h (struct lc_monetary_T): Add wide char members. Add numerical values for international currency formatting per POSIX-1.2008, if __HAVE_LOCALE_INFO_EXTENDED__ is defined. * libc/locale/lnumeric.c (_C_numeric_locale): Add default values for wide char members. (__numeric_load_locale): Add _C_numeric_locale in call to __set_lc_numeric_from_win. * libc/locale/lnumeric.h (struct lc_numeric_T): Add wide char members. * libc/locale/locale.c (loadlocale): Return doing nothing if category locale didn't change. Convert category if chain to switch statement. Call __ctype_load_locale in LC_CTYPE case. (__locale_charset): Add (but disable for now) returning codeset from __get_current_ctype_locale. (__locale_mb_cur_max): Add (but disable for now) returning mb_cur_max from __get_current_ctype_locale. (__locale_msgcharset): Add returning codeset from __get_current_messages_locale. (_localeconv_r): Accommodate int_XXX values. * libc/locale/nl_langinfo.c (nl_ext): New array to define what is to be returned for non-POSIX values. (nl_Langinfo): Return correct codeset for each locale category. Return extended values if __HAVE_LOCALE_INFO_EXTENDED__ is defined. * libc/locale/timelocal.c (_C_time_locale): Add default values for wide char members. (__time_load_locale): Add _C_time_locale in call to __set_lc_time_from_win. * libc/locale/timelocal.h (struct lc_time_T): Add wide char members. * libc/stdio/vfwprintf.c (_VFWPRINTF_R): Use wide char decimal point and thousands_sep if __HAVE_LOCALE_INFO_EXTENDED__ is defined. * libc/time/strftime.c: Rework to accommodate availability of wide char strings in LC_TIME category if __HAVE_LOCALE_INFO_EXTENDED__ is defined. --- newlib/libc/stdio/vfwprintf.c | 11 +++++++++++ 1 file changed, 11 insertions(+) (limited to 'newlib/libc/stdio/vfwprintf.c') diff --git a/newlib/libc/stdio/vfwprintf.c b/newlib/libc/stdio/vfwprintf.c index d9b9d5679..7c58d123c 100644 --- a/newlib/libc/stdio/vfwprintf.c +++ b/newlib/libc/stdio/vfwprintf.c @@ -130,6 +130,9 @@ SEEALSO #include "local.h" #include "fvwrite.h" #include "vfieeefp.h" +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ +#include "../locale/lnumeric.h" +#endif /* Currently a test is made to see if long double processing is warranted. This could be changed in the future should the _ldtoa_r code be @@ -444,6 +447,9 @@ _DEFUN(_VFWPRINTF_R, (data, fp, fmt0, ap), #ifdef FLOATING_POINT #ifdef _MB_CAPABLE +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + decimal_point = *__get_current_numeric_locale ()->wdecimal_point; +#else { size_t nconv; @@ -454,6 +460,7 @@ _DEFUN(_VFWPRINTF_R, (data, fp, fmt0, ap), if (nconv == (size_t) -1 || nconv == (size_t) -2) decimal_point = L'.'; } +#endif #else decimal_point = (wchar_t) *_localeconv_r (data)->decimal_point; #endif @@ -626,6 +633,9 @@ reswitch: switch (ch) { #ifdef _WANT_IO_C99_FORMATS case L'\'': #ifdef _MB_CAPABLE +#ifdef __HAVE_LOCALE_INFO_EXTENDED__ + thousands_sep = *__get_current_numeric_locale ()->wthousands_sep; +#else { size_t nconv; @@ -636,6 +646,7 @@ reswitch: switch (ch) { if (nconv == (size_t) -1 || nconv == (size_t) -2) thousands_sep = L'\0'; } +#endif #else thousands_sep = (wchar_t) *_localeconv_r(data)->thousands_sep; #endif -- cgit v1.2.3