From 8b831c12307af16ed0d64320f370b8350ee34b60 Mon Sep 17 00:00:00 2001 From: Eyal Rozenberg Date: Mon, 28 Feb 2022 16:40:46 +0200 Subject: [PATCH] Fixes #121: Now properly accounting for a 2-character prefix for `%#b`, like for `%#x`, when a precision is field width is specified and we are matching it exactly. Also, added some test suite checks for this bug. --- src/printf/printf.c | 6 +++--- test/test_suite_main_testcases.hpp | 6 +++++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/src/printf/printf.c b/src/printf/printf.c index abf2cbf7..0f38b292 100644 --- a/src/printf/printf.c +++ b/src/printf/printf.c @@ -485,10 +485,10 @@ static void print_integer_finalization(output_gadget_t* output, char* buf, print // Let's take back some padding digits to fit in what will eventually // be the format-specific prefix if (unpadded_len < len) { - len--; + len--; // This should suffice for BASE_OCTAL } - if (len && (base == BASE_HEX) && (unpadded_len < len)) { - len--; + if (len && (base == BASE_HEX || base == BASE_BINARY) && (unpadded_len < len)) { + len--; // ... and an extra one for 0x or 0b } } if ((base == BASE_HEX) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_INTEGER_BUFFER_SIZE)) { diff --git a/test/test_suite_main_testcases.hpp b/test/test_suite_main_testcases.hpp index cbeadc54..bf9479c7 100644 --- a/test/test_suite_main_testcases.hpp +++ b/test/test_suite_main_testcases.hpp @@ -190,7 +190,11 @@ PRINTF_TEST_CASE(sharp_flag) PRINTF_TEST_CASE(sharp_flag__non_standard_format) { char buffer[base_buffer_size]; - PRINTING_CHECK("0b110", ==, sprintf_, buffer, "%#b", 6); + PRINTING_CHECK("0b110", ==, sprintf_, buffer, "%#b", 6); + PRINTING_CHECK("0b11111111", ==, sprintf_, buffer, "%#010b", 0xff); + PRINTING_CHECK("0b011111111", ==, sprintf_, buffer, "%#011b", 0xff); + PRINTING_CHECK("077", ==, sprintf_, buffer, "%#03o", 077); + PRINTING_CHECK("0077", ==, sprintf_, buffer, "%#04o", 077); } #endif