diff --git a/printf.c b/printf.c index c28cf139..e4c83e57 100644 --- a/printf.c +++ b/printf.c @@ -151,6 +151,8 @@ static inline unsigned int _atoi(const char** str) // internal itoa format static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t maxlen, char* buf, size_t len, bool negative, unsigned int base, unsigned int prec, unsigned int width, unsigned int flags) { + const size_t start_idx = idx; + // pad leading zeros while (!(flags & FLAGS_LEFT) && (len < prec) && (len < PRINTF_NTOA_BUFFER_SIZE)) { buf[len++] = '0'; @@ -208,7 +210,7 @@ static size_t _ntoa_format(out_fct_type out, char* buffer, size_t idx, size_t ma // append pad spaces up to given width if (flags & FLAGS_LEFT) { - while (idx < width) { + while (idx - start_idx < width) { out(' ', buffer, idx++, maxlen); } } diff --git a/test/test_suite.cpp b/test/test_suite.cpp index 212fbd32..3ecac5fd 100644 --- a/test/test_suite.cpp +++ b/test/test_suite.cpp @@ -582,6 +582,18 @@ TEST_CASE("width -20", "[]" ) { test::sprintf(buffer, "%-20c", 'x'); REQUIRE(!strcmp(buffer, "x ")); + + test::sprintf(buffer, "|%5d| |%-2d| |%5d|", 9, 9, 9); + REQUIRE(!strcmp(buffer, "| 9| |9 | | 9|")); + + test::sprintf(buffer, "|%5d| |%-2d| |%5d|", 10, 10, 10); + REQUIRE(!strcmp(buffer, "| 10| |10| | 10|")); + + test::sprintf(buffer, "|%5d| |%-12d| |%5d|", 9, 9, 9); + REQUIRE(!strcmp(buffer, "| 9| |9 | | 9|")); + + test::sprintf(buffer, "|%5d| |%-12d| |%5d|", 10, 10, 10); + REQUIRE(!strcmp(buffer, "| 10| |10 | | 10|")); }