From c7fbbfd600f929505181d938a2bcdfc6bd50aa07 Mon Sep 17 00:00:00 2001 From: Vedran Grudenic Date: Sun, 20 Jan 2019 23:14:51 +0100 Subject: patch for issue #40 (Digit missing from negative numbers in certain cases) --- printf.c | 14 +++++------ test/test_suite.cpp | 68 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 74 insertions(+), 8 deletions(-) diff --git a/printf.c b/printf.c index c9a1175..7df2290 100644 --- a/printf.c +++ b/printf.c @@ -178,6 +178,9 @@ static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t ma // pad leading zeros if (!(flags & FLAGS_LEFT)) { + if (width && (flags & FLAGS_ZEROPAD) && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } while ((len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { buf[len++] = '0'; } @@ -208,10 +211,6 @@ static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t ma } } - // handle sign - if (len && (len == width) && (negative || (flags & FLAGS_PLUS) || (flags & FLAGS_SPACE))) { - len--; - } if (len < PRINTF_NTOA_BUFFER_SIZE) { if (negative) { buf[len++] = '-'; @@ -395,15 +394,14 @@ static size_t _ftoa(out_fct_type out, char* buffer, size_t idx, size_t maxlen, d // pad leading zeros if (!(flags & FLAGS_LEFT) && (flags & FLAGS_ZEROPAD)) { + if (width && (negative || (flags & (FLAGS_PLUS | FLAGS_SPACE)))) { + width--; + } while ((len < width) && (len < PRINTF_FTOA_BUFFER_SIZE)) { buf[len++] = '0'; } } - // handle sign - if ((len == width) && (negative || (flags & FLAGS_PLUS) || (flags & FLAGS_SPACE))) { - len--; - } if (len < PRINTF_FTOA_BUFFER_SIZE) { if (negative) { buf[len++] = '-'; diff --git a/test/test_suite.cpp b/test/test_suite.cpp index 100b59f..66ba5f3 100644 --- a/test/test_suite.cpp +++ b/test/test_suite.cpp @@ -864,6 +864,74 @@ TEST_CASE("padding 20.5", "[]" ) { REQUIRE(!strcmp(buffer, " 00EDCB5433")); } +TEST_CASE("padding neg numbers", "[]" ) { + char buffer[100]; + + // space padding + + test::sprintf(buffer, "% 1d", -5); + REQUIRE(!strcmp(buffer, "-5")); + + test::sprintf(buffer, "% 2d", -5); + REQUIRE(!strcmp(buffer, "-5")); + + test::sprintf(buffer, "% 3d", -5); + REQUIRE(!strcmp(buffer, " -5")); + + test::sprintf(buffer, "% 4d", -5); + REQUIRE(!strcmp(buffer, " -5")); + + // zero padding + + test::sprintf(buffer, "%01d", -5); + REQUIRE(!strcmp(buffer, "-5")); + + test::sprintf(buffer, "%02d", -5); + REQUIRE(!strcmp(buffer, "-5")); + + test::sprintf(buffer, "%03d", -5); + REQUIRE(!strcmp(buffer, "-05")); + + test::sprintf(buffer, "%04d", -5); + REQUIRE(!strcmp(buffer, "-005")); +} + +TEST_CASE("float padding neg numbers", "[]" ) { + char buffer[100]; + + // space padding + + test::sprintf(buffer, "% 3.1f", -5.); + REQUIRE(!strcmp(buffer, "-5.0")); + + test::sprintf(buffer, "% 4.1f", -5.); + REQUIRE(!strcmp(buffer, "-5.0")); + + test::sprintf(buffer, "% 5.1f", -5.); + REQUIRE(!strcmp(buffer, " -5.0")); + + // zero padding + + test::sprintf(buffer, "%03.1f", -5.); + REQUIRE(!strcmp(buffer, "-5.0")); + + test::sprintf(buffer, "%04.1f", -5.); + REQUIRE(!strcmp(buffer, "-5.0")); + + test::sprintf(buffer, "%05.1f", -5.); + REQUIRE(!strcmp(buffer, "-05.0")); + + // zero padding no decimal point + + test::sprintf(buffer, "%01.0f", -5.); + REQUIRE(!strcmp(buffer, "-5")); + + test::sprintf(buffer, "%02.0f", -5.); + REQUIRE(!strcmp(buffer, "-5")); + + test::sprintf(buffer, "%03.0f", -5.); + REQUIRE(!strcmp(buffer, "-05")); +} TEST_CASE("length", "[]" ) { char buffer[100]; -- cgit v1.2.3