[libc-commits] [libc] 7c2599a - [libc][wctype] Implement public iswdigit (#181635)
via libc-commits
libc-commits at lists.llvm.org
Mon Mar 9 01:41:20 PDT 2026
Author: Marcell Leleszi
Date: 2026-03-09T09:41:15+01:00
New Revision: 7c2599a491c26c3191c06e4902aea3db97eac0ce
URL: https://github.com/llvm/llvm-project/commit/7c2599a491c26c3191c06e4902aea3db97eac0ce
DIFF: https://github.com/llvm/llvm-project/commit/7c2599a491c26c3191c06e4902aea3db97eac0ce.diff
LOG: [libc][wctype] Implement public iswdigit (#181635)
https://github.com/llvm/llvm-project/issues/175003
Create public function and entrypoints for iswdigit and add UTF8 test to
iswalpha test. On CI there is no UTF8 build currently, so that test case
will only run locally, but
[wctype_utils_test.cpp](https://github.com/llvm/llvm-project/blob/main/libc/test/src/__support/wctype_utils_test.cpp)
is written in a way that both ASCII and UTF8 tests run regardless of the
build config.
Added:
libc/src/wctype/iswdigit.cpp
libc/src/wctype/iswdigit.h
libc/test/src/wctype/iswdigit_test.cpp
Modified:
libc/config/baremetal/arm/entrypoints.txt
libc/config/baremetal/riscv/entrypoints.txt
libc/config/darwin/aarch64/entrypoints.txt
libc/config/linux/aarch64/entrypoints.txt
libc/config/linux/arm/entrypoints.txt
libc/config/linux/riscv/entrypoints.txt
libc/config/linux/x86_64/entrypoints.txt
libc/src/wctype/CMakeLists.txt
libc/test/src/wctype/CMakeLists.txt
libc/test/src/wctype/iswalpha_test.cpp
Removed:
################################################################################
diff --git a/libc/config/baremetal/arm/entrypoints.txt b/libc/config/baremetal/arm/entrypoints.txt
index 7bc92e84b7fa4..955dc643586e9 100644
--- a/libc/config/baremetal/arm/entrypoints.txt
+++ b/libc/config/baremetal/arm/entrypoints.txt
@@ -299,6 +299,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# internal entrypoints
libc.startup.baremetal.init
diff --git a/libc/config/baremetal/riscv/entrypoints.txt b/libc/config/baremetal/riscv/entrypoints.txt
index 29be47dfbfd53..472792e48fa01 100644
--- a/libc/config/baremetal/riscv/entrypoints.txt
+++ b/libc/config/baremetal/riscv/entrypoints.txt
@@ -296,6 +296,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# internal entrypoints
libc.startup.baremetal.init
diff --git a/libc/config/darwin/aarch64/entrypoints.txt b/libc/config/darwin/aarch64/entrypoints.txt
index b4a1ee70764cb..051ab45f450fa 100644
--- a/libc/config/darwin/aarch64/entrypoints.txt
+++ b/libc/config/darwin/aarch64/entrypoints.txt
@@ -102,6 +102,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
)
if(LLVM_LIBC_FULL_BUILD)
diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt
index 960958b7cf90a..bdca0baf478c7 100644
--- a/libc/config/linux/aarch64/entrypoints.txt
+++ b/libc/config/linux/aarch64/entrypoints.txt
@@ -369,6 +369,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# sys/uio.h entrypoints
libc.src.sys.uio.writev
diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt
index e76bf81670ce5..3d3e77d826b06 100644
--- a/libc/config/linux/arm/entrypoints.txt
+++ b/libc/config/linux/arm/entrypoints.txt
@@ -194,6 +194,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
)
if(LLVM_LIBC_FULL_BUILD)
diff --git a/libc/config/linux/riscv/entrypoints.txt b/libc/config/linux/riscv/entrypoints.txt
index a69d1a1b0a642..13343dea76fe3 100644
--- a/libc/config/linux/riscv/entrypoints.txt
+++ b/libc/config/linux/riscv/entrypoints.txt
@@ -373,6 +373,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# sys/uio.h entrypoints
libc.src.sys.uio.writev
diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt
index 4103ee0331a23..24df7e63e3ebf 100644
--- a/libc/config/linux/x86_64/entrypoints.txt
+++ b/libc/config/linux/x86_64/entrypoints.txt
@@ -418,6 +418,7 @@ set(TARGET_LIBC_ENTRYPOINTS
# wctype.h entrypoints
libc.src.wctype.iswalpha
+ libc.src.wctype.iswdigit
# sys/uio.h entrypoints
libc.src.sys.uio.writev
diff --git a/libc/src/wctype/CMakeLists.txt b/libc/src/wctype/CMakeLists.txt
index 3ac5eaef8ed8b..dc6282fac883f 100644
--- a/libc/src/wctype/CMakeLists.txt
+++ b/libc/src/wctype/CMakeLists.txt
@@ -7,3 +7,13 @@ add_entrypoint_object(
DEPENDS
libc.src.__support.wctype_utils
)
+
+add_entrypoint_object(
+ iswdigit
+ SRCS
+ iswdigit.cpp
+ HDRS
+ iswdigit.h
+ DEPENDS
+ libc.src.__support.wctype_utils
+)
diff --git a/libc/src/wctype/iswdigit.cpp b/libc/src/wctype/iswdigit.cpp
new file mode 100644
index 0000000000000..f2e1eb3b9d4d5
--- /dev/null
+++ b/libc/src/wctype/iswdigit.cpp
@@ -0,0 +1,21 @@
+//===-- Implementation of iswdigit ----------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/wctype/iswdigit.h"
+#include "src/__support/common.h"
+#include "src/__support/wctype_utils.h"
+
+#include "hdr/types/wint_t.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+LLVM_LIBC_FUNCTION(int, iswdigit, (wint_t c)) {
+ return internal::isdigit(static_cast<wchar_t>(c));
+}
+
+} // namespace LIBC_NAMESPACE_DECL
diff --git a/libc/src/wctype/iswdigit.h b/libc/src/wctype/iswdigit.h
new file mode 100644
index 0000000000000..58f1d44173cb5
--- /dev/null
+++ b/libc/src/wctype/iswdigit.h
@@ -0,0 +1,21 @@
+//===-- Implementation header for iswdigit ----------------------*- 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_WCTYPE_ISWDIGIT_H
+#define LLVM_LIBC_SRC_WCTYPE_ISWDIGIT_H
+
+#include "hdr/types/wint_t.h"
+#include "src/__support/common.h"
+
+namespace LIBC_NAMESPACE_DECL {
+
+int iswdigit(wint_t c);
+
+} // namespace LIBC_NAMESPACE_DECL
+
+#endif // LLVM_LIBC_SRC_WCTYPE_ISWDIGIT_H
diff --git a/libc/test/src/wctype/CMakeLists.txt b/libc/test/src/wctype/CMakeLists.txt
index 5459cdb4a9b71..5d46b1a61bbef 100644
--- a/libc/test/src/wctype/CMakeLists.txt
+++ b/libc/test/src/wctype/CMakeLists.txt
@@ -8,4 +8,16 @@ add_libc_test(
iswalpha_test.cpp
DEPENDS
libc.src.wctype.iswalpha
+ libc.src.__support.wctype_utils
+)
+
+add_libc_test(
+ iswdigit_test
+ SUITE
+ libc_wctype_unittests
+ SRCS
+ iswdigit_test.cpp
+ DEPENDS
+ libc.src.wctype.iswdigit
+ libc.src.__support.wctype_utils
)
diff --git a/libc/test/src/wctype/iswalpha_test.cpp b/libc/test/src/wctype/iswalpha_test.cpp
index a82c0057c1807..261e6fe53790a 100644
--- a/libc/test/src/wctype/iswalpha_test.cpp
+++ b/libc/test/src/wctype/iswalpha_test.cpp
@@ -7,10 +7,14 @@
//===----------------------------------------------------------------------===//
#include "src/__support/CPP/span.h"
+#include "src/__support/wctype_utils.h"
#include "src/wctype/iswalpha.h"
#include "test/UnitTest/Test.h"
+// Simple tests, already properly tested in
+// libc/test/src/__support/wctype_utils_test.cpp and
+// libc/test/src/__support/wctype/wctype_classification_utils_test.cpp
TEST(LlvmLibciswalpha, SimpleTest) {
EXPECT_NE(LIBC_NAMESPACE::iswalpha('a'), 0);
EXPECT_NE(LIBC_NAMESPACE::iswalpha('B'), 0);
@@ -20,37 +24,10 @@ TEST(LlvmLibciswalpha, SimpleTest) {
EXPECT_EQ(LIBC_NAMESPACE::iswalpha('?'), 0);
EXPECT_EQ(LIBC_NAMESPACE::iswalpha('\0'), 0);
EXPECT_EQ(LIBC_NAMESPACE::iswalpha(-1), 0);
-}
-
-// TODO: once iswalpha supports more than just ascii-range characters add a
-// proper test.
-
-// namespace {
-
-// // TODO: Merge the wctype tests using this framework.
-// constexpr char WALPHA_ARRAY[] = {
-// 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm',
-// 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z',
-// 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M',
-// 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z',
-// };
-// bool in_span(int ch, LIBC_NAMESPACE::cpp::span<const char> arr) {
-// for (size_t i = 0; i < arr.size(); ++i)
-// if (static_cast<int>(arr[i]) == ch)
-// return true;
-// return false;
-// }
-
-// } // namespace
-
-// TEST(LlvmLibciswalpha, DefaultLocale) {
-// // Loops through all characters, verifying that letters return
-// // true and everything else returns false.
-// for (int ch = -255; ch < 255; ++ch) {
-// if (in_span(ch, WALPHA_ARRAY))
-// EXPECT_TRUE(LIBC_NAMESPACE::iswalpha(ch));
-// else
-// EXPECT_FALSE(LIBC_NAMESPACE::iswalpha(ch));
-// }
-// }
+#if LIBC_CONF_WCTYPE_MODE == LIBC_WCTYPE_MODE_UTF8
+ EXPECT_NE(LIBC_NAMESPACE::iswalpha(L'á'), 0);
+#else
+ EXPECT_EQ(LIBC_NAMESPACE::iswalpha(L'á'), 0);
+#endif
+}
diff --git a/libc/test/src/wctype/iswdigit_test.cpp b/libc/test/src/wctype/iswdigit_test.cpp
new file mode 100644
index 0000000000000..d529f527e3591
--- /dev/null
+++ b/libc/test/src/wctype/iswdigit_test.cpp
@@ -0,0 +1,23 @@
+//===-- Unittests for iswdigit --------------------------------------------===//
+//
+// 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
+//
+//===----------------------------------------------------------------------===//
+
+#include "src/__support/CPP/span.h"
+#include "src/wctype/iswdigit.h"
+
+#include "test/UnitTest/Test.h"
+
+// Simple tests, already properly tested in
+// libc/test/src/__support/wctype_utils_test.cpp
+TEST(LlvmLibciswdigit, SimpleTest) {
+ EXPECT_NE(LIBC_NAMESPACE::iswdigit(L'1'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::iswdigit(L'2'), 0);
+ EXPECT_NE(LIBC_NAMESPACE::iswdigit(L'0'), 0);
+
+ EXPECT_EQ(LIBC_NAMESPACE::iswdigit(L'a'), 0);
+ EXPECT_EQ(LIBC_NAMESPACE::iswdigit(L'é'), 0);
+}
More information about the libc-commits
mailing list