[libc] [llvm] [libc] Cleaned up wcsspn and wcscspn (PR #147408)
via llvm-commits
llvm-commits at lists.llvm.org
Mon Jul 7 14:48:40 PDT 2025
llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT-->
@llvm/pr-subscribers-libc
Author: None (sribee8)
<details>
<summary>Changes</summary>
created internal wcsspn to avoid duplicated code
---
Full diff: https://github.com/llvm/llvm-project/pull/147408.diff
5 Files Affected:
- (modified) libc/src/wchar/CMakeLists.txt (+12)
- (added) libc/src/wchar/wchar_utils.h (+33)
- (modified) libc/src/wchar/wcscspn.cpp (+14-12)
- (modified) libc/src/wchar/wcsspn.cpp (+15-13)
- (modified) utils/bazel/llvm-project-overlay/libc/BUILD.bazel (+13)
``````````diff
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",
],
)
``````````
</details>
https://github.com/llvm/llvm-project/pull/147408
More information about the llvm-commits
mailing list