From 7be688b58fb2e5fea5db003d9ea72c4d779e65c6 Mon Sep 17 00:00:00 2001 From: Ulrich Drepper Date: Mon, 9 Feb 2004 10:05:22 +0000 Subject: [PATCH] Update. * stdio-common/_i18n_number.h: Support printing localized decimal point and thousand separator. * wctype/wctrans.c: Add __wctrans alias. * include/wctype.h: Declare __wctrans. Based on a patch by Hamed Malek. --- ChangeLog | 6 ++++ include/wctype.h | 1 + localedata/ChangeLog | 5 ++++ localedata/locales/fa_IR | 12 +++++--- stdio-common/_i18n_number.h | 57 +++++++++++++++++++++++++++++++++---- wctype/wctrans.c | 5 ++-- 6 files changed, 74 insertions(+), 12 deletions(-) diff --git a/ChangeLog b/ChangeLog index 8ee5a384c48..25309fc375a 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2004-02-09 Ulrich Drepper + * stdio-common/_i18n_number.h: Support printing localized decimal + point and thousand separator. + * wctype/wctrans.c: Add __wctrans alias. + * include/wctype.h: Declare __wctrans. + Based on a patch by Hamed Malek. + * sysdeps/i386/fpu/fclrexcpt.c (__feclearexcept): Don't touch bits other than the status bits [BZ #10]. diff --git a/include/wctype.h b/include/wctype.h index f52f0a3f303..2acaabd5c49 100644 --- a/include/wctype.h +++ b/include/wctype.h @@ -49,6 +49,7 @@ extern int __iswspace (wint_t __wc); extern int __iswctype (wint_t __wc, wctype_t __desc); extern int __iswctype_internal (wint_t __wc, wctype_t __desc) attribute_hidden; extern wctype_t __wctype (__const char *__property); +extern wctrans_t __wctrans (const char *__property); extern wint_t __towctrans (wint_t __wc, wctrans_t __desc); extern __typeof (iswalnum_l) __iswalnum_l; diff --git a/localedata/ChangeLog b/localedata/ChangeLog index 1e1e16d4834..fdf57ad59ef 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,8 @@ +2004-02-09 Ulrich Drepper + + * locales/fa_IR: Add to_outpunct info and change decimal_point and + thousand_sep to ASCII value. + 2004-01-19 Ulrich Drepper * SUPPORTED: Add all kinds of UTF-8 locales. diff --git a/localedata/locales/fa_IR b/localedata/locales/fa_IR index 0d61daf4b76..e95f9807dee 100644 --- a/localedata/locales/fa_IR +++ b/localedata/locales/fa_IR @@ -50,6 +50,10 @@ LC_CTYPE copy "i18n" outdigit .. + +map to_outpunct; / + (,); / + (,) END LC_CTYPE LC_COLLATE @@ -71,7 +75,7 @@ collating-symbol collating-symbol % Alternate representations displayed the same -collating-symbol +collating-symbol collating-symbol collating-element from "" @@ -126,7 +130,7 @@ reorder-after IGNORE;IGNORE;IGNORE; % reorder-after - IGNORE;IGNORE;IGNORE; % + IGNORE;IGNORE;IGNORE; % IGNORE;IGNORE;IGNORE; % IGNORE;IGNORE;IGNORE; % IGNORE;IGNORE;IGNORE; % @@ -269,8 +273,8 @@ int_n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "" -thousands_sep "" +decimal_point "" +thousands_sep "" grouping 3 END LC_NUMERIC diff --git a/stdio-common/_i18n_number.h b/stdio-common/_i18n_number.h index 046657cc28c..0043b044707 100644 --- a/stdio-common/_i18n_number.h +++ b/stdio-common/_i18n_number.h @@ -1,4 +1,4 @@ -/* Copyright (C) 2000 Free Software Foundation, Inc. +/* Copyright (C) 2000, 2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 2000. @@ -17,18 +17,49 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include +#include + #include "../locale/outdigits.h" #include "../locale/outdigitswc.h" static CHAR_T * _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr) { - CHAR_T *src, *s; +#ifdef COMPILE_WPRINTF + wint_t wdecimal = L'\0'; + wint_t wthousands = L'\0'; +# define decimal NULL +# define thousands NULL +#else +# define wdecimal L'\0' +# define wthousands L'\0' + char decimal[MB_LEN_MAX]; + char thousands[MB_LEN_MAX]; +#endif + + /* "to_outpunct" is a map from ASCII decimal point and thousands-sep + to their equivalent in locale. This is defined for locales which + use extra decimal point and thousands-sep. */ + wctrans_t map = __wctrans ("to_outpunct"); + if (map != NULL) + { + mbstate_t state; + memset (&state, '\0', sizeof (state)); + + if (__wcrtomb (decimal, wdecimal, &state) == (size_t) -1) + memcpy (decimal, ".", 2); + + memset (&state, '\0', sizeof (state)); + + if (__wcrtomb (thousands, wthousands, &state) == (size_t) -1) + memcpy (thousands, ",", 2); + } /* Copy existing string so that nothing gets overwritten. */ - src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T)); - s = (CHAR_T *) __mempcpy (src, w, - (rear_ptr - w) * sizeof (CHAR_T)); + CHAR_T *src = (CHAR_T *) alloca ((rear_ptr - w) * sizeof (CHAR_T)); + CHAR_T *s = (CHAR_T *) __mempcpy (src, w, + (rear_ptr - w) * sizeof (CHAR_T)); w = rear_ptr; /* Process all characters in the string. */ @@ -41,8 +72,22 @@ _i18n_number_rewrite (CHAR_T *w, CHAR_T *rear_ptr) else *--w = (CHAR_T) outdigitwc_value (*s - '0'); } - else + else if (__builtin_expect (map == NULL, 1) || (*s != '.' && *s != ',')) *--w = *s; + else + { + if (sizeof (CHAR_T) == 1) + { + const char *outpunct = *s == '.' ? decimal : thousands; + size_t dlen = strlen (outpunct); + + w -= dlen; + while (dlen-- > 0) + w[dlen] = outpunct[dlen]; + } + else + *--w = *s == '.' ? (CHAR_T) wdecimal : (CHAR_T) wthousands; + } } return w; diff --git a/wctype/wctrans.c b/wctype/wctrans.c index 0f921efd0a1..ee9947a05da 100644 --- a/wctype/wctrans.c +++ b/wctype/wctrans.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1996,97,99,2000,02 Free Software Foundation, Inc. +/* Copyright (C) 1996-1997,1999,2000,2002,2004 Free Software Foundation, Inc. This file is part of the GNU C Library. Contributed by Ulrich Drepper , 1996. @@ -23,7 +23,7 @@ #include "../locale/localeinfo.h" wctrans_t -wctrans (const char *property) +__wctrans (const char *property) { const char *names; size_t cnt; @@ -46,3 +46,4 @@ wctrans (const char *property) i = _NL_CURRENT_WORD (LC_CTYPE, _NL_CTYPE_MAP_OFFSET) + cnt; return (wctrans_t) _NL_CURRENT_DATA (LC_CTYPE)->values[i].string; } +weak_alias (__wctrans, wctrans) -- 2.39.2