summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog10
-rw-r--r--localedata/tests-mbwc/dat_strfmon.c54
-rw-r--r--localedata/tst-fmon.data18
-rw-r--r--stdlib/strfmon.c26
4 files changed, 39 insertions, 69 deletions
diff --git a/ChangeLog b/ChangeLog
index 1ff84dfe42..419075ff0c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2000-06-30 Ulrich Drepper <drepper@redhat.com>
+ * stdlib/strfmon.c: Move somewhat closer to the standard wrt to
+ handling the internation currency symbol. POSIX says that the
+ fourth character is used to separate the currency symbol from the
+ value. Therefore it does not have to be printed. But we cannot
+ remove the space if the currency symbol is printed before the
+ number since this is what many locales expect.
+ * localedata/tests-mbwc/dat_strfmon.c: Remove #ifdefs introduced to
+ work around DEM problem.
+ * localedata/tst-fmon.data: Change back entries with DEM.
+
* iconv/gconv_trans.c: Test with _NL_CTYPE_TRANSLIT_DEFAULT_MISSING_LEN
whether this information is available.
diff --git a/localedata/tests-mbwc/dat_strfmon.c b/localedata/tests-mbwc/dat_strfmon.c
index ada8c47b0a..1252ecfe4e 100644
--- a/localedata/tests-mbwc/dat_strfmon.c
+++ b/localedata/tests-mbwc/dat_strfmon.c
@@ -20,23 +20,13 @@ TST_STRFMON tst_strfmon_loc [] = {
{
{
/* #01 */
-#ifdef NO_WAIVER
/*inp*/ { 23, "%n %% %i", 123.00 },
/*exp*/ { 1,0,1,22, "123,00 DM % 123,00 DEM" },
-#else
- /*inp*/ { 24, "%n %% %i", 123.00 },
- /*exp*/ { 1,0,1,23, "123,00 DM % 123,00 DEM " },
-#endif
},
{
/* #02 */
-#ifdef NO_WAIVER
/*inp*/ { 23, "%n %% %i", 123.00 },
/*exp*/ { 1,0,1,22, "123,00 DM % 123,00 DEM" },
-#else
- /*inp*/ { 24, "%n %% %i", 123.00 },
- /*exp*/ { 1,0,1,23, "123,00 DM % 123,00 DEM " },
-#endif
},
{
/* #03 */
@@ -46,101 +36,57 @@ TST_STRFMON tst_strfmon_loc [] = {
{
/* #04 */
/*inp*/ { 30, "%n|%i", 1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,24, "1.234,56 DM|1.234,56 DEM" },
-#else
- /*exp*/ { 1,0,1,25, "1.234,56 DM|1.234,56 DEM " },
-#endif
},
{
/* #05 */
/*inp*/ { 32, "%n|%i", -1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,26, "-1.234,56 DM|-1.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,27, "-1.234,56 DM|-1.234,56 DEM "},
-#endif
},
{
/* #06 */
/*inp*/ { 32, "%12n|%12i", 1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,25, " 1.234,56 DM|1.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,26, " 1.234,56 DM|1.234,56 DEM "},
-#endif
},
{
/* #07 */
/*inp*/ { 32, "%12n|%12i", -1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,26, "-1.234,56 DM|-1.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,27, "-1.234,56 DM|-1.234,56 DEM "},
-#endif
},
{
/* #08 */
/*inp*/ { 32, "%#5n|%#5i", 1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,28, " 1.234,56 DM| 1.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,29, " 1.234,56 DM| 1.234,56 DEM "},
-#endif
},
{
/* #09 */
/*inp*/ { 32, "%#5n|%#5i", -1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,28, "- 1.234,56 DM|- 1.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,29, "- 1.234,56 DM|- 1.234,56 DEM "},
-#endif
},
{
/* #10 */
/*inp*/ { 32, "%=*#5n|%=*#5i", 1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,28, " *1.234,56 DM| *1.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,29, " *1.234,56 DM| *1.234,56 DEM "},
-#endif
},
{
/* #11 */
/*inp*/ { 32, "%=0#5n|%=0#5i", -1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,28, "-01.234,56 DM|-01.234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,29, "-01.234,56 DM|-01.234,56 DEM "},
-#endif
},
{
/* #12 */
/*inp*/ { 32, "%^#5n|%^#5i", -1234.561 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,26, "- 1234,56 DM|- 1234,56 DEM"},
-#else
- /*exp*/ { 1,0,1,27, "- 1234,56 DM|- 1234,56 DEM "},
-#endif
},
{
/* #13 */
/*inp*/ { 32, "%#5.0n|%#5.0i", 1234.444 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,22, " 1.234 DM| 1.234 DEM" },
-#else
- /*exp*/ { 1,0,1,23, " 1.234 DM| 1.234 DEM " },
-#endif
},
{
/* #14 */
/*inp*/ { 32, "%#5.0n|%#5.4i", -1234.555 },
-#ifdef NO_WAIVER
/*exp*/ { 1,0,1,27, "- 1.235 DM|- 1.234,5550 DEM"},
-#else
- /*exp*/ { 1,0,1,28, "- 1.235 DM|- 1.234,5550 DEM "},
-#endif
},
{
/* #15 */
diff --git a/localedata/tst-fmon.data b/localedata/tst-fmon.data
index c5b5813d18..db0e3f7abf 100644
--- a/localedata/tst-fmon.data
+++ b/localedata/tst-fmon.data
@@ -56,15 +56,15 @@ de_DE.ISO-8859-1 %+n -1234.56 -1.234,56 DM
de_DE.ISO-8859-1 %(n 1234.56 1.234,56 DM
de_DE.ISO-8859-1 %(n -1234.56 (1.234,56 DM)
de_DE.ISO-8859-1 %^n 1234.56 1234,56 DM
-de_DE.ISO-8859-1 %i 1.23 1,23 DEM
-de_DE.ISO-8859-1 %i -1.23 -1,23 DEM
-de_DE.ISO-8859-1 %i 1234.56 1.234,56 DEM
-de_DE.ISO-8859-1 %^i 1234.56 1234,56 DEM
-de_DE.ISO-8859-1 %+i 1234.56 1.234,56 DEM
-de_DE.ISO-8859-1 %+i -1234.56 -1.234,56 DEM
-de_DE.ISO-8859-1 %(i 1234.56 1.234,56 DEM
-de_DE.ISO-8859-1 %(i -1234.56 (1.234,56 DEM )
-de_DE.ISO-8859-1 %^i 1234.56 1234,56 DEM
+de_DE.ISO-8859-1 %i 1.23 1,23 DEM
+de_DE.ISO-8859-1 %i -1.23 -1,23 DEM
+de_DE.ISO-8859-1 %i 1234.56 1.234,56 DEM
+de_DE.ISO-8859-1 %^i 1234.56 1234,56 DEM
+de_DE.ISO-8859-1 %+i 1234.56 1.234,56 DEM
+de_DE.ISO-8859-1 %+i -1234.56 -1.234,56 DEM
+de_DE.ISO-8859-1 %(i 1234.56 1.234,56 DEM
+de_DE.ISO-8859-1 %(i -1234.56 (1.234,56 DEM)
+de_DE.ISO-8859-1 %^i 1234.56 1234,56 DEM
de_DE.ISO-8859-1 %#5n 123.45 123,45 DM
de_DE.ISO-8859-1 %#5n -123.45 - 123,45 DM
de_DE.ISO-8859-1 %#5n 3456.781 3.456,78 DM
diff --git a/stdlib/strfmon.c b/stdlib/strfmon.c
index 50b87dff82..28249c1f62 100644
--- a/stdlib/strfmon.c
+++ b/stdlib/strfmon.c
@@ -52,6 +52,14 @@
out_char (*_s++); \
} while (0)
+#define out_nstring(String, N) \
+ do { \
+ int _n = (N); \
+ const char *_s = (String); \
+ while (_n-- > 0) \
+ out_char (*_s++); \
+ } while (0)
+
#define to_digit(Ch) ((Ch) - '0')
@@ -136,9 +144,11 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
const char *other_sign_string;
int done;
const char *currency_symbol;
+ size_t currency_symbol_len;
int width;
char *startp;
const void *ptr;
+ char space_char;
/* Process all character which do not introduce a format
specification. */
@@ -294,6 +304,8 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
{
case 'i': /* Use international currency symbol. */
currency_symbol = _NL_CURRENT (LC_MONETARY, INT_CURR_SYMBOL);
+ currency_symbol_len = 3;
+ space_char = currency_symbol[3];
if (right_prec == -1)
{
if (*_NL_CURRENT (LC_MONETARY, INT_FRAC_DIGITS) == CHAR_MAX)
@@ -304,6 +316,8 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
break;
case 'n': /* Use national currency symbol. */
currency_symbol = _NL_CURRENT (LC_MONETARY, CURRENCY_SYMBOL);
+ currency_symbol_len = strlen (currency_symbol);
+ space_char = ' ';
if (right_prec == -1)
{
if (*_NL_CURRENT (LC_MONETARY, FRAC_DIGITS) == CHAR_MAX)
@@ -424,14 +438,14 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
preceding the value */
if (cs_precedes)
{
- left_bytes += strlen (currency_symbol);
+ left_bytes += currency_symbol_len;
if (sep_by_space != 0)
++left_bytes;
}
if (other_cs_precedes)
{
- other_left_bytes += strlen (currency_symbol);
+ other_left_bytes += currency_symbol_len;
if (other_sep_by_space != 0)
++other_left_bytes;
}
@@ -491,7 +505,7 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
if (sign_posn == 4)
{
if (sep_by_space == 2)
- out_char (' ');
+ out_char (space_char);
out_string (sign_string);
if (sep_by_space == 1)
/* POSIX.2 and SUS are not clear on this case, but C99
@@ -500,7 +514,7 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
}
else
if (sep_by_space == 1)
- out_char (' ');
+ out_char (space_char);
}
}
else
@@ -580,8 +594,8 @@ __strfmon_l (char *s, size_t maxsize, __locale_t loc, const char *format, ...)
|| (sign_posn == 2 && sep_by_space == 1)
|| (sign_posn == 1 && sep_by_space == 1)
|| (sign_posn == 0 && sep_by_space == 1))
- out_char (' ');
- out_string (currency_symbol);
+ out_char (space_char);
+ out_nstring (currency_symbol, currency_symbol_len);
if (sign_posn == 4)
{
if (sep_by_space == 2)