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

created internal wcsspn to avoid duplicated code

---------

Co-authored-by: Sriya Pratipati <sriyap@google.com>
This commit is contained in:
sribee8 2025-07-22 21:23:19 +00:00 committed by GitHub
parent 15715f4089
commit 45d0750dac
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 82 additions and 26 deletions

View File

@ -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
@ -255,6 +265,8 @@ add_entrypoint_object(
DEPENDS
libc.hdr.wchar_macros
libc.hdr.types.size_t
libc.src.wchar.wchar_utils
libc.src.__support.macros.null_check
)
add_entrypoint_object(
@ -266,6 +278,8 @@ add_entrypoint_object(
DEPENDS
libc.hdr.wchar_macros
libc.hdr.types.size_t
libc.src.wchar.wchar_utils
libc.src.__support.macros.null_check
)
add_entrypoint_object(

View File

@ -0,0 +1,45 @@
//===-- 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 {
// returns true if the character exists in the string
LIBC_INLINE static bool wcschr(wchar_t c, const wchar_t *str) {
for (int n = 0; str[n]; ++n) {
if (str[n] == c)
return true;
}
return false;
}
// bool should be true for wcscspn for complimentary span
// should be false for wcsspn since we want it to span
LIBC_INLINE static size_t wcsspn(const wchar_t *s1, const wchar_t *s2,
bool not_match_set) {
size_t i = 0;
for (; s1[i]; ++i) {
bool in_set = wcschr(s1[i], s2);
if (in_set == not_match_set)
return i;
}
return i;
}
} // namespace internal
} // namespace LIBC_NAMESPACE_DECL
#endif // LLVM_LIBC_SRC_WCHAR_WCHAR_UTILS_H

View File

@ -12,23 +12,15 @@
#include "hdr/types/wchar_t.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/__support/macros/null_check.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;
}
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;
LIBC_CRASH_ON_NULLPTR(s1);
LIBC_CRASH_ON_NULLPTR(s2);
return internal::wcsspn(s1, s2, /*not_match_set=*/true);
}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -12,23 +12,15 @@
#include "hdr/types/wchar_t.h"
#include "src/__support/common.h"
#include "src/__support/macros/config.h"
#include "src/__support/macros/null_check.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 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;
LIBC_CRASH_ON_NULLPTR(s1);
LIBC_CRASH_ON_NULLPTR(s2);
return internal::wcsspn(s1, s2, /*not_match_set=*/false);
}
} // namespace LIBC_NAMESPACE_DECL

View File

@ -6083,6 +6083,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"],
@ -6180,6 +6191,7 @@ libc_function(
":__support_macros_config",
":types_size_t",
":types_wchar_t",
":wchar_utils",
],
)
@ -6291,6 +6303,7 @@ libc_function(
":__support_macros_config",
":types_size_t",
":types_wchar_t",
":wchar_utils",
],
)