From a70747458a7f25710552880933d9816783005f13 Mon Sep 17 00:00:00 2001 From: Guiorgy Date: Sun, 29 Jun 2025 19:28:25 +0400 Subject: [PATCH 1/2] fixed floating number leading zeroes serialization --- jim2.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/jim2.h b/jim2.h index 59044d9..b42c588 100644 --- a/jim2.h +++ b/jim2.h @@ -151,14 +151,14 @@ void jim_bool(Jim *jim, int boolean) jim_element_end(jim); } -static void jim_integer_no_element(Jim *jim, long long int x) +static void jim_integer_no_element(Jim *jim, long long int x, int lzeros) { if (x < 0) { jim_write_cstr(jim, "-"); x = -x; } - if (x == 0) { + if (x == 0 && lzeros == 0) { jim_write_cstr(jim, "0"); } else { char buffer[64]; @@ -169,6 +169,11 @@ static void jim_integer_no_element(Jim *jim, long long int x) x /= 10; } + while (lzeros > 0) { + buffer[count++] = '0'; + --lzeros; + } + for (size_t i = 0; i < count / 2; ++i) { char t = buffer[i]; buffer[i] = buffer[count - i - 1]; @@ -182,7 +187,7 @@ static void jim_integer_no_element(Jim *jim, long long int x) void jim_integer(Jim *jim, long long int x) { jim_element_begin(jim); - jim_integer_no_element(jim, x); + jim_integer_no_element(jim, x, 0); jim_element_end(jim); } @@ -199,10 +204,12 @@ void jim_float(Jim *jim, double x, int precision) } else { jim_element_begin(jim); - jim_integer_no_element(jim, (long long int) x); + jim_integer_no_element(jim, (long long int) x, 0); x -= (double) (long long int) x; + int lzeros = 0; while (precision-- > 0) { x *= 10.0; + lzeros += -1 < x && x < 1; } jim_write_cstr(jim, "."); @@ -210,7 +217,7 @@ void jim_float(Jim *jim, double x, int precision) if (y < 0) { y = -y; } - jim_integer_no_element(jim, y); + jim_integer_no_element(jim, y, lzeros); jim_element_end(jim); } From 49d71f7a49fb310a6afc208c7d4d68f85dca0235 Mon Sep 17 00:00:00 2001 From: Guiorgy Date: Sun, 29 Jun 2025 19:53:31 +0400 Subject: [PATCH 2/2] trim trailing zeroes after the decimal point --- jim2.h | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/jim2.h b/jim2.h index b42c588..11dc7c0 100644 --- a/jim2.h +++ b/jim2.h @@ -151,14 +151,14 @@ void jim_bool(Jim *jim, int boolean) jim_element_end(jim); } -static void jim_integer_no_element(Jim *jim, long long int x, int lzeros) +static void jim_integer_no_element(Jim *jim, long long int x, int lzeros, int rtrim) { if (x < 0) { jim_write_cstr(jim, "-"); x = -x; } - if (x == 0 && lzeros == 0) { + if (x == 0) { jim_write_cstr(jim, "0"); } else { char buffer[64]; @@ -180,6 +180,13 @@ static void jim_integer_no_element(Jim *jim, long long int x, int lzeros) buffer[count - i - 1] = t; } + if (rtrim && count != 0) { + while (count != 1 && buffer[count - 1] == '0') { + buffer[count - 1] = '\0'; + --count; + } + } + jim_write(jim, buffer, count); } } @@ -187,7 +194,7 @@ static void jim_integer_no_element(Jim *jim, long long int x, int lzeros) void jim_integer(Jim *jim, long long int x) { jim_element_begin(jim); - jim_integer_no_element(jim, x, 0); + jim_integer_no_element(jim, x, 0, 0); jim_element_end(jim); } @@ -204,7 +211,7 @@ void jim_float(Jim *jim, double x, int precision) } else { jim_element_begin(jim); - jim_integer_no_element(jim, (long long int) x, 0); + jim_integer_no_element(jim, (long long int) x, 0, 0); x -= (double) (long long int) x; int lzeros = 0; while (precision-- > 0) { @@ -217,7 +224,7 @@ void jim_float(Jim *jim, double x, int precision) if (y < 0) { y = -y; } - jim_integer_no_element(jim, y, lzeros); + jim_integer_no_element(jim, y, lzeros, 1); jim_element_end(jim); }