[libc] [llvm] [libc] Cleaned up wcsspn and wcscspn (PR #147408)

via llvm-commits llvm-commits at lists.llvm.org
Mon Jul 7 14:48:09 PDT 2025


https://github.com/sribee8 created https://github.com/llvm/llvm-project/pull/147408

created internal wcsspn to avoid duplicated code


>From ab07c55cc0a3800cb6e4a05e793c6072ade41ee6 Mon Sep 17 00:00:00 2001
From: Sriya Pratipati <sriyap at google.com>
Date: Mon, 7 Jul 2025 21:45:33 +0000
Subject: [PATCH] [libc] Cleaned up wcsspn and wcscspn

---
 libc/src/wchar/CMakeLists.txt                 | 12 +++++++
 libc/src/wchar/wchar_utils.h                  | 33 +++++++++++++++++++
 libc/src/wchar/wcscspn.cpp                    | 26 ++++++++-------
 libc/src/wchar/wcsspn.cpp                     | 28 ++++++++--------
 .../llvm-project-overlay/libc/BUILD.bazel     | 13 ++++++++
 5 files changed, 87 insertions(+), 25 deletions(-)
 create mode 100644 libc/src/wchar/wchar_utils.h

diff --git a/libc/src/wchar/CMakeLists.txt b/libc/src/wchar/CMakeLists.txt
index f2f4b1d38f0f3..85d582d9ccc76 100644
--- a/libc/src/wchar/CMakeLists.txt
+++ b/libc/src/wchar/CMakeLists.txt
@@ -1,3 +1,13 @@
+add_header_library(
+  wchar_utils
+  HDRS
+    wchar_utils.h
+  DEPENDS
+    libc.hdr.types.size_t
+    libc.hdr.types.wchar_t
+    libc.src.__support.common
+)
+
 add_entrypoint_object(
   wcslen
   SRCS
@@ -211,6 +221,7 @@ add_entrypoint_object(
   DEPENDS
     libc.hdr.wchar_macros
     libc.hdr.types.size_t
+    libc.src.wchar.wchar_utils
 )
 
 add_entrypoint_object(
@@ -222,6 +233,7 @@ add_entrypoint_object(
   DEPENDS
     libc.hdr.wchar_macros
     libc.hdr.types.size_t
+    libc.src.wchar.wchar_utils
 )
 
 add_entrypoint_object(
diff --git a/libc/src/wchar/wchar_utils.h b/libc/src/wchar/wchar_utils.h
new file mode 100644
index 0000000000000..2fc3ac34469e7
--- /dev/null
+++ b/libc/src/wchar/wchar_utils.h
@@ -0,0 +1,33 @@
+//===-- wchar utils ---------------------------------------------*- 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
+//
+//===----------------------------------------------------------------------===//
+
+#ifndef LLVM_LIBC_SRC_WCHAR_WCHAR_UTILS_H
+#define LLVM_LIBC_SRC_WCHAR_WCHAR_UTILS_H
+
+#include "hdr/types/size_t.h"
+#include "hdr/types/wchar_t.h"
+#include "src/__support/common.h"
+#include "src/__support/macros/attributes.h" // LIBC_INLINE
+
+namespace LIBC_NAMESPACE_DECL {
+namespace internal {
+
+template <typename Check>
+LIBC_INLINE size_t inline_wcsspn(const wchar_t *s1, Check check) {
+  size_t i = 0;
+  for (; s1[i]; ++i) {
+    if (!check(s1[i]))
+      return i;
+  }
+  return i;
+}
+
+} // namespace internal
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif //  LLVM_LIBC_SRC_WCHAR_WCHAR_UTILS_H
diff --git a/libc/src/wchar/wcscspn.cpp b/libc/src/wchar/wcscspn.cpp
index 8869d84cdfdee..afd3eb20e51ef 100644
--- a/libc/src/wchar/wcscspn.cpp
+++ b/libc/src/wchar/wcscspn.cpp
@@ -12,23 +12,25 @@
 #include "hdr/types/wchar_t.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
+#include "wchar_utils.h"
 
 namespace LIBC_NAMESPACE_DECL {
 
-bool check(wchar_t c, const wchar_t *s2) {
-  for (int n = 0; s2[n]; ++n) {
-    if (s2[n] == c)
-      return false;
+struct CheckCSpan {
+  const wchar_t *str;
+  CheckCSpan(const wchar_t *w) { str = w; }
+  bool operator()(wchar_t c) {
+    for (int n = 0; str[n]; ++n) {
+      if (str[n] == c)
+        return false;
+    }
+    return true;
   }
-  return true;
-}
+};
+
 LLVM_LIBC_FUNCTION(size_t, wcscspn, (const wchar_t *s1, const wchar_t *s2)) {
-  size_t i = 0;
-  for (; s1[i]; ++i) {
-    if (!check(s1[i], s2))
-      return i;
-  }
-  return i;
+  CheckCSpan check(s2);
+  return internal::inline_wcsspn(s1, check);
 }
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/wchar/wcsspn.cpp b/libc/src/wchar/wcsspn.cpp
index 23de381a2d954..f3c4be99f7e50 100644
--- a/libc/src/wchar/wcsspn.cpp
+++ b/libc/src/wchar/wcsspn.cpp
@@ -12,23 +12,25 @@
 #include "hdr/types/wchar_t.h"
 #include "src/__support/common.h"
 #include "src/__support/macros/config.h"
+#include "wchar_utils.h"
+
+struct CheckSpan {
+  const wchar_t *str;
+  CheckSpan(const wchar_t *w) { str = w; }
+  bool operator()(wchar_t c) {
+    for (int n = 0; str[n]; ++n) {
+      if (str[n] == c)
+        return true;
+    }
+    return false;
+  }
+};
 
 namespace LIBC_NAMESPACE_DECL {
 
-bool check(wchar_t c, const wchar_t *s2) {
-  for (int n = 0; s2[n]; ++n) {
-    if (s2[n] == c)
-      return true;
-  }
-  return false;
-}
 LLVM_LIBC_FUNCTION(size_t, wcsspn, (const wchar_t *s1, const wchar_t *s2)) {
-  size_t i = 0;
-  for (; s1[i]; ++i) {
-    if (!check(s1[i], s2))
-      return i;
-  }
-  return i;
+  CheckSpan check(s2);
+  return internal::inline_wcsspn(s1, check);
 }
 
 } // namespace LIBC_NAMESPACE_DECL
diff --git a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
index d3fc6912cd4e4..675263778b530 100644
--- a/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
+++ b/utils/bazel/llvm-project-overlay/libc/BUILD.bazel
@@ -5729,6 +5729,17 @@ libc_function(
 
 ############################## wchar targets ###############################
 
+libc_support_library(
+    name = "wchar_utils",
+    hdrs = ["src/wchar/wchar_utils.h"],
+    deps = [
+        ":__support_common",
+        ":__support_macros_attributes",
+        ":types_size_t",
+        ":types_wchar_t",
+    ],
+)
+
 libc_function(
     name = "btowc",
     srcs = ["src/wchar/btowc.cpp"],
@@ -5826,6 +5837,7 @@ libc_function(
         ":__support_macros_config",
         ":types_size_t",
         ":types_wchar_t",
+        ":wchar_utils",
     ],
 )
 
@@ -5911,6 +5923,7 @@ libc_function(
         ":__support_macros_config",
         ":types_size_t",
         ":types_wchar_t",
+        ":wchar_utils",
     ],
 )
 



More information about the llvm-commits mailing list