git: 6da51e19e347 - main - strfmon: Trim the SPACE from international currency symbol

From: Konstantin Belousov <kib_at_FreeBSD.org>
Date: Tue, 25 Oct 2022 21:51:26 UTC
The branch main has been updated by kib:

URL: https://cgit.FreeBSD.org/src/commit/?id=6da51e19e347c13e133bcba68cc6100c16320a01

commit 6da51e19e347c13e133bcba68cc6100c16320a01
Author:     Jose Luis Duran <jlduran@gmail.com>
AuthorDate: 2022-10-21 16:13:27 +0000
Commit:     Konstantin Belousov <kib@FreeBSD.org>
CommitDate: 2022-10-25 21:40:17 +0000

    strfmon: Trim the SPACE from international currency symbol
    
    The international currency symbol (int_curr_symbol) has a mandatory
    SPACE character as the last character.
    
    Trim this space after reading it, otherwise this extra space will always
    be printed when displaying the int_curr_symbol.
    
    Fixes the output when the international currency format is selected
    (%i).
    
        Locale         Format    Before           After
        en_US.UTF-8    [%i]      [USD 123.45]     [USD123.45]
        fr_FR.UTF-8    [%i]      [123,45 EUR ]    [123,45 EUR]
    
    Note that the en_US.UTF-8 locale states that no space should be printed
    between the currency symbol and the value (sep_by_space = 0).
    
    Reviewed by:    kib
    PR:     267282
    Github PR:      #619
    MFC after:      1 week
---
 lib/libc/stdlib/strfmon.c            | 4 +++-
 lib/libc/tests/stdlib/strfmon_test.c | 4 ++--
 2 files changed, 5 insertions(+), 3 deletions(-)

diff --git a/lib/libc/stdlib/strfmon.c b/lib/libc/stdlib/strfmon.c
index 2526ab8fd8b1..a7a48317c97c 100644
--- a/lib/libc/stdlib/strfmon.c
+++ b/lib/libc/stdlib/strfmon.c
@@ -240,8 +240,10 @@ vstrfmon_l(char * __restrict s, size_t maxsize, locale_t loc,
 		if (flags & USE_INTL_CURRENCY) {
 			currency_symbol = strdup(lc->int_curr_symbol);
 			if (currency_symbol != NULL &&
-			    strlen(currency_symbol) > 3)
+			    strlen(currency_symbol) > 3) {
 				space_char = currency_symbol[3];
+				currency_symbol[3] = '\0';
+			}
 		} else
 			currency_symbol = strdup(lc->currency_symbol);
 
diff --git a/lib/libc/tests/stdlib/strfmon_test.c b/lib/libc/tests/stdlib/strfmon_test.c
index dc328e974bb8..b5b22f9a483d 100644
--- a/lib/libc/tests/stdlib/strfmon_test.c
+++ b/lib/libc/tests/stdlib/strfmon_test.c
@@ -195,8 +195,8 @@ ATF_TC_BODY(strfmon_international_currency_code, tc)
 		const char *locale;
 		const char *expected;
 	} tests[] = {
-	    { "en_US.UTF-8", "[USD 123.45]" }, /* XXX */
-	    { "de_DE.UTF-8", "[123,45 EUR ]" }, /* XXX */
+	    { "en_US.UTF-8", "[USD123.45]" },
+	    { "de_DE.UTF-8", "[123,45 EUR]" },
 	    { "C", "[123.45]" },
 	};
 	size_t i;