diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | include/wctype.h | 1 | ||||
-rw-r--r-- | localedata/ChangeLog | 5 | ||||
-rw-r--r-- | localedata/locales/fa_IR | 12 | ||||
-rw-r--r-- | stdio-common/_i18n_number.h | 57 | ||||
-rw-r--r-- | wctype/wctrans.c | 5 |
6 files changed, 74 insertions, 12 deletions
diff --git a/ChangeLog b/ChangeLog index 8ee5a384c4..25309fc375 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2004-02-09 Ulrich Drepper <drepper@redhat.com> + * 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 f52f0a3f30..2acaabd5c4 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 1e1e16d483..fdf57ad59e 100644 --- a/localedata/ChangeLog +++ b/localedata/ChangeLog @@ -1,3 +1,8 @@ +2004-02-09 Ulrich Drepper <drepper@redhat.com> + + * locales/fa_IR: Add to_outpunct info and change decimal_point and + thousand_sep to ASCII value. + 2004-01-19 Ulrich Drepper <drepper@redhat.com> * SUPPORTED: Add all kinds of UTF-8 locales. diff --git a/localedata/locales/fa_IR b/localedata/locales/fa_IR index 0d61daf4b7..e95f9807de 100644 --- a/localedata/locales/fa_IR +++ b/localedata/locales/fa_IR @@ -50,6 +50,10 @@ LC_CTYPE copy "i18n" outdigit <U06F0>..<U06F9> + +map to_outpunct; / + (<U002E>,<U066B>); / + (<U002C>,<U066C>) END LC_CTYPE LC_COLLATE @@ -71,7 +75,7 @@ collating-symbol <alefmadda> collating-symbol <yeh> % Alternate representations displayed the same -collating-symbol <ALT1> +collating-symbol <ALT1> collating-symbol <ALT2> collating-element <Alef-Madda> from "<U0627><U0653>" @@ -126,7 +130,7 @@ reorder-after <U066D> <UFE72> IGNORE;IGNORE;IGNORE;<UFE72> %<dammatan_is> reorder-after <UFE7F> -<U0653> IGNORE;IGNORE;IGNORE;<U0653> %<madda_no> +<U0653> IGNORE;IGNORE;IGNORE;<U0653> %<madda_no> <U0654> IGNORE;IGNORE;IGNORE;<U0654> %<hamzaabove_no> <U0655> IGNORE;IGNORE;IGNORE;<U0655> %<hamzabelow_no> <U0670> IGNORE;IGNORE;IGNORE;<U0670> %<supalef_no> @@ -269,8 +273,8 @@ int_n_sign_posn 1 END LC_MONETARY LC_NUMERIC -decimal_point "<U066B>" -thousands_sep "<U066C>" +decimal_point "<U002E>" +thousands_sep "<U002C>" grouping 3 END LC_NUMERIC diff --git a/stdio-common/_i18n_number.h b/stdio-common/_i18n_number.h index 046657cc28..0043b04470 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 <drepper@gnu.org>, 2000. @@ -17,18 +17,49 @@ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. */ +#include <wchar.h> +#include <wctype.h> + #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 0f921efd0a..ee9947a05d 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 <drepper@gnu.org>, 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) |