summaryrefslogtreecommitdiff
path: root/stdlib/strfmon.c
diff options
context:
space:
mode:
Diffstat (limited to 'stdlib/strfmon.c')
-rw-r--r--stdlib/strfmon.c26
1 files changed, 20 insertions, 6 deletions
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)