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