Skip to content

Commit 8b831c1

Browse files
committed
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.
1 parent 6da9ea4 commit 8b831c1

File tree

2 files changed

+8
-4
lines changed

2 files changed

+8
-4
lines changed

src/printf/printf.c

+3-3
Original file line numberDiff line numberDiff line change
@@ -485,10 +485,10 @@ static void print_integer_finalization(output_gadget_t* output, char* buf, print
485485
// Let's take back some padding digits to fit in what will eventually
486486
// be the format-specific prefix
487487
if (unpadded_len < len) {
488-
len--;
488+
len--; // This should suffice for BASE_OCTAL
489489
}
490-
if (len && (base == BASE_HEX) && (unpadded_len < len)) {
491-
len--;
490+
if (len && (base == BASE_HEX || base == BASE_BINARY) && (unpadded_len < len)) {
491+
len--; // ... and an extra one for 0x or 0b
492492
}
493493
}
494494
if ((base == BASE_HEX) && !(flags & FLAGS_UPPERCASE) && (len < PRINTF_INTEGER_BUFFER_SIZE)) {

test/test_suite_main_testcases.hpp

+5-1
Original file line numberDiff line numberDiff line change
@@ -190,7 +190,11 @@ PRINTF_TEST_CASE(sharp_flag)
190190
PRINTF_TEST_CASE(sharp_flag__non_standard_format)
191191
{
192192
char buffer[base_buffer_size];
193-
PRINTING_CHECK("0b110", ==, sprintf_, buffer, "%#b", 6);
193+
PRINTING_CHECK("0b110", ==, sprintf_, buffer, "%#b", 6);
194+
PRINTING_CHECK("0b11111111", ==, sprintf_, buffer, "%#010b", 0xff);
195+
PRINTING_CHECK("0b011111111", ==, sprintf_, buffer, "%#011b", 0xff);
196+
PRINTING_CHECK("077", ==, sprintf_, buffer, "%#03o", 077);
197+
PRINTING_CHECK("0077", ==, sprintf_, buffer, "%#04o", 077);
194198
}
195199

196200
#endif

0 commit comments

Comments
 (0)