diff --git a/libc/src/stdio/printf_core/converter.cpp b/libc/src/stdio/printf_core/converter.cpp index 74a36cbf7432f..39465e0ef7011 100644 --- a/libc/src/stdio/printf_core/converter.cpp +++ b/libc/src/stdio/printf_core/converter.cpp @@ -53,6 +53,9 @@ int convert(Writer *writer, const FormatSection &to_conv) { case 's': return convert_string(writer, to_conv); case 'd': + case 'b': + case 'B': + return convert_decimal_binary(writer, to_conv); case 'i': case 'u': case 'o': diff --git a/libc/src/stdio/printf_core/converter_atlas.h b/libc/src/stdio/printf_core/converter_atlas.h index 6471f3f2955b7..83f1837537b88 100644 --- a/libc/src/stdio/printf_core/converter_atlas.h +++ b/libc/src/stdio/printf_core/converter_atlas.h @@ -22,6 +22,9 @@ // defines convert_int #include "src/stdio/printf_core/int_converter.h" +// defines convert_decimal_binary +#include "src/stdio/printf_core/decimal_binary_converter.h" + #ifndef LIBC_COPT_PRINTF_DISABLE_FLOAT // defines convert_float_decimal // defines convert_float_dec_exp diff --git a/libc/src/stdio/printf_core/decimal_binary_converter.h b/libc/src/stdio/printf_core/decimal_binary_converter.h new file mode 100644 index 0000000000000..483c7653554b3 --- /dev/null +++ b/libc/src/stdio/printf_core/decimal_binary_converter.h @@ -0,0 +1,8 @@ +//===-- Decimal Binary Converter for printf -----------------------------*- C++ +//-*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// diff --git a/libc/src/stdio/printf_core/int_converter.h b/libc/src/stdio/printf_core/int_converter.h index 7744d801cbc18..f2ad34e896e9c 100644 --- a/libc/src/stdio/printf_core/int_converter.h +++ b/libc/src/stdio/printf_core/int_converter.h @@ -33,8 +33,9 @@ using HexFmt = IntegerToString; using HexFmtUppercase = IntegerToString; using OctFmt = IntegerToString; using DecFmt = IntegerToString; +using BinFmt = IntegerToString -LIBC_INLINE constexpr size_t num_buf_size() { + LIBC_INLINE constexpr size_t num_buf_size() { constexpr auto max = [](size_t a, size_t b) -> size_t { return (a < b) ? b : a; }; diff --git a/libc/src/stdio/printf_core/parser.h b/libc/src/stdio/printf_core/parser.h index ab491655275fb..7ff77c5a6bae2 100644 --- a/libc/src/stdio/printf_core/parser.h +++ b/libc/src/stdio/printf_core/parser.h @@ -154,6 +154,10 @@ template class Parser { WRITE_ARG_VAL_SIMPLEST(section.conv_val_raw, int, conv_index); break; case ('d'): + case ('b'): + case ('B'): + WRITE_ARG_VAL_SIMPLEST(section.conv_val_raw, char *, conv_index); + break; case ('i'): case ('o'): case ('x'): @@ -479,6 +483,10 @@ template class Parser { conv_size = type_desc_from_type(); break; case ('d'): + case ('b'): + case ('B'): + conv_size = type_desc_from_type(); + break; case ('i'): case ('o'): case ('x'):