From 2e6e30a92f5a36f84cf068f2b3c31ced7d7a9865 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Tue, 5 Jul 2022 16:27:09 +0200 Subject: [PATCH] json: actually use numeric C locale we just allocated This fixes formatting of JSON real values, and uses C locale for them. It's kinda interesting that this wasn't noticed before: the C locale object we allocated was not used, hence doing the dance had zero effect. This makes "test-varlink" pass again on systems with non-C locale. (My guess: noone noticed this because "long double" was used before by the JSON code and that had no locale supporting printer or so?) (cherry picked from commit 93258c7d72fae23c9f8103c98dd0e79a24838e26) --- src/shared/json.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/src/shared/json.c b/src/shared/json.c index bcc109abc2..13bc44a9ed 100644 --- a/src/shared/json.c +++ b/src/shared/json.c @@ -1545,7 +1545,7 @@ static int json_format(FILE *f, JsonVariant *v, JsonFormatFlags flags, const cha switch (json_variant_type(v)) { case JSON_VARIANT_REAL: { - locale_t loc; + locale_t loc, old_loc; loc = newlocale(LC_NUMERIC_MASK, "C", (locale_t) 0); if (loc == (locale_t) 0) @@ -1554,7 +1554,9 @@ static int json_format(FILE *f, JsonVariant *v, JsonFormatFlags flags, const cha if (flags & JSON_FORMAT_COLOR) fputs(ansi_highlight_blue(), f); + old_loc = uselocale(loc); fprintf(f, "%.*e", DECIMAL_DIG, json_variant_real(v)); + uselocale(old_loc); if (flags & JSON_FORMAT_COLOR) fputs(ANSI_NORMAL, f);