From 6655b5afee698b4de80d0b81b48a0ed510c5ed52 Mon Sep 17 00:00:00 2001 From: hniksic Date: Sun, 26 Jun 2005 19:07:31 -0700 Subject: [PATCH] [svn] Force the use of separators in C locale. --- src/ChangeLog | 5 +++++ src/utils.c | 38 +++++++++++++++++++++++++------------- 2 files changed, 30 insertions(+), 13 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index 38596986..ab85f4c3 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,8 @@ +2005-06-27 Hrvoje Niksic + + * utils.c (get_grouping_data): Force the use of separators in C + locale. + 2005-06-27 Hrvoje Niksic * main.c (i18n_initialize): Set all locale categories. diff --git a/src/utils.c b/src/utils.c index 96d4767c..54e2644a 100644 --- a/src/utils.c +++ b/src/utils.c @@ -1164,6 +1164,15 @@ free_keys_and_values (struct hash_table *ht) } +/* Get grouping data, the separator and grouping info, by calling + localeconv(). The information is cached after the first call to + the function. + + In locales that don't set a thousand separator (such as the "C" + locale), this forces it to be ",". Wget 1.10 is only using + thousand separators in one place, so this shouldn't be a problem in + practice. */ + static void get_grouping_data (const char **sep, const char **grouping) { @@ -1172,20 +1181,23 @@ get_grouping_data (const char **sep, const char **grouping) static bool initialized; if (!initialized) { -#ifdef LC_NUMERIC /* Get the grouping info from the locale. */ - struct lconv *lconv; - const char *oldlocale = setlocale (LC_NUMERIC, ""); - lconv = localeconv (); - cached_sep = xstrdup (lconv->thousands_sep); - cached_grouping = xstrdup (lconv->grouping); - /* Restore the locale to previous settings. */ - setlocale (LC_NUMERIC, oldlocale); - if (!cached_sep) -#endif - /* Force separator for locales that specify no separators - ("C", "hr", and probably many more.) */ - cached_sep = ",", cached_grouping = "\x03"; + struct lconv *lconv = localeconv (); + cached_sep = lconv->thousands_sep; + cached_grouping = lconv->grouping; + if (!*cached_sep) + { + /* Many locales (such as "C" or "hr_HR") don't specify + grouping, which we still want to use it for legibility. + In those locales set the sep char to ',', unless that + character is used for decimal point, in which case set it + to " ". */ + if (*lconv->decimal_point != ',') + cached_sep = ","; + else + cached_sep = " "; + cached_grouping = "\x03"; + } initialized = true; } *sep = cached_sep;