[libc-commits] [libc] [libc] Add support for C23 binary notation in `sprintf` (PR #80820)

Rajveer Singh Bharadwaj via libc-commits libc-commits at lists.llvm.org
Tue Feb 6 02:29:20 PST 2024


https://github.com/Rajveer100 updated https://github.com/llvm/llvm-project/pull/80820

>From 2449a307d23f435141b8aa19a876f321a4ccda27 Mon Sep 17 00:00:00 2001
From: Rajveer <rajveer.developer at icloud.com>
Date: Tue, 6 Feb 2024 15:54:02 +0530
Subject: [PATCH] [libc] Add support for C23 binary notation in `sprintf`

Resolves Issue #80727
---
 libc/src/stdio/printf_core/converter.cpp              | 3 +++
 libc/src/stdio/printf_core/converter_atlas.h          | 3 +++
 libc/src/stdio/printf_core/decimal_binary_converter.h | 8 ++++++++
 libc/src/stdio/printf_core/int_converter.h            | 3 ++-
 libc/src/stdio/printf_core/parser.h                   | 8 ++++++++
 5 files changed, 24 insertions(+), 1 deletion(-)
 create mode 100644 libc/src/stdio/printf_core/decimal_binary_converter.h

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<uintmax_t, radix::Hex>;
 using HexFmtUppercase = IntegerToString<uintmax_t, radix::Hex::Uppercase>;
 using OctFmt = IntegerToString<uintmax_t, radix::Oct>;
 using DecFmt = IntegerToString<uintmax_t>;
+using BinFmt = IntegerToString<Bin>
 
-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 <typename ArgProvider> 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 <typename ArgProvider> class Parser {
           conv_size = type_desc_from_type<int>();
           break;
         case ('d'):
+        case ('b'):
+        case ('B'):
+          conv_size = type_desc_from_type<void *>();
+          break;
         case ('i'):
         case ('o'):
         case ('x'):



More information about the libc-commits mailing list