diff --git a/libc/config/linux/aarch64/entrypoints.txt b/libc/config/linux/aarch64/entrypoints.txt --- a/libc/config/linux/aarch64/entrypoints.txt +++ b/libc/config/linux/aarch64/entrypoints.txt @@ -33,6 +33,7 @@ libc.src.string.bcmp libc.src.string.bcopy libc.src.string.bzero + libc.src.string.index libc.src.string.memccpy libc.src.string.memchr libc.src.string.memcmp @@ -41,6 +42,7 @@ libc.src.string.mempcpy libc.src.string.memrchr libc.src.string.memset + libc.src.string.rindex libc.src.string.stpcpy libc.src.string.stpncpy libc.src.string.strcasecmp diff --git a/libc/config/linux/arm/entrypoints.txt b/libc/config/linux/arm/entrypoints.txt --- a/libc/config/linux/arm/entrypoints.txt +++ b/libc/config/linux/arm/entrypoints.txt @@ -24,6 +24,7 @@ libc.src.string.bcmp libc.src.string.bcopy libc.src.string.bzero + libc.src.string.index libc.src.string.memccpy libc.src.string.memchr libc.src.string.memcmp @@ -32,6 +33,7 @@ libc.src.string.mempcpy libc.src.string.memrchr libc.src.string.memset + libc.src.string.rindex libc.src.string.stpcpy libc.src.string.stpncpy libc.src.string.strcasecmp diff --git a/libc/config/linux/riscv64/entrypoints.txt b/libc/config/linux/riscv64/entrypoints.txt --- a/libc/config/linux/riscv64/entrypoints.txt +++ b/libc/config/linux/riscv64/entrypoints.txt @@ -33,6 +33,7 @@ libc.src.string.bcmp libc.src.string.bcopy libc.src.string.bzero + libc.src.string.index libc.src.string.memccpy libc.src.string.memchr libc.src.string.memcmp @@ -41,6 +42,7 @@ libc.src.string.mempcpy libc.src.string.memrchr libc.src.string.memset + libc.src.string.rindex libc.src.string.stpcpy libc.src.string.stpncpy libc.src.string.strcasecmp diff --git a/libc/config/linux/x86_64/entrypoints.txt b/libc/config/linux/x86_64/entrypoints.txt --- a/libc/config/linux/x86_64/entrypoints.txt +++ b/libc/config/linux/x86_64/entrypoints.txt @@ -33,6 +33,7 @@ libc.src.string.bcmp libc.src.string.bcopy libc.src.string.bzero + libc.src.string.index libc.src.string.memccpy libc.src.string.memchr libc.src.string.memcmp @@ -41,6 +42,7 @@ libc.src.string.mempcpy libc.src.string.memrchr libc.src.string.memset + libc.src.string.rindex libc.src.string.stpcpy libc.src.string.stpncpy libc.src.string.strcasecmp diff --git a/libc/spec/bsd_ext.td b/libc/spec/bsd_ext.td --- a/libc/spec/bsd_ext.td +++ b/libc/spec/bsd_ext.td @@ -39,6 +39,16 @@ RetValSpec, [ArgSpec, ArgSpec, ArgSpec] >, + FunctionSpec< + "index", + RetValSpec, + [ArgSpec, ArgSpec] + >, + FunctionSpec< + "rindex", + RetValSpec, + [ArgSpec, ArgSpec] + >, ] >; diff --git a/libc/src/string/CMakeLists.txt b/libc/src/string/CMakeLists.txt --- a/libc/src/string/CMakeLists.txt +++ b/libc/src/string/CMakeLists.txt @@ -31,6 +31,16 @@ bcopy.h ) +add_entrypoint_object( + index + SRCS + index.cpp + HDRS + index.h + DEPENDS + .memory_utils.strchr_implementation +) + add_entrypoint_object( memccpy SRCS @@ -67,6 +77,16 @@ memrchr.h ) +add_entrypoint_object( + rindex + SRCS + rindex.cpp + HDRS + rindex.h + DEPENDS + .memory_utils.strchr_implementation +) + add_entrypoint_object( stpcpy SRCS diff --git a/libc/src/string/index.h b/libc/src/string/index.h new file mode 100644 --- /dev/null +++ b/libc/src/string/index.h @@ -0,0 +1,18 @@ +//===-- Implementation header for index -------------------------*- 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_STRING_INDEX_H +#define LLVM_LIBC_SRC_STRING_INDEX_H + +namespace __llvm_libc { + +char *index(const char *src, int c); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_STRING_INDEX_H diff --git a/libc/src/string/index.cpp b/libc/src/string/index.cpp new file mode 100644 --- /dev/null +++ b/libc/src/string/index.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of index -------------------------------------------===// +// +// 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/string/index.h" + +#include "src/__support/common.h" +#include "src/string/memory_utils/strchr_implementations.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(char *, index, (const char *src, int c)) { + return strchr_implementation(src, c); +} + +} // namespace __llvm_libc diff --git a/libc/src/string/rindex.h b/libc/src/string/rindex.h new file mode 100644 --- /dev/null +++ b/libc/src/string/rindex.h @@ -0,0 +1,18 @@ +//===-- Implementation header for rindex ------------------------*- 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_STRING_RINDEX_H +#define LLVM_LIBC_SRC_STRING_RINDEX_H + +namespace __llvm_libc { + +char *rindex(const char *src, int c); + +} // namespace __llvm_libc + +#endif // LLVM_LIBC_SRC_STRING_RINDEX_H diff --git a/libc/src/string/rindex.cpp b/libc/src/string/rindex.cpp new file mode 100644 --- /dev/null +++ b/libc/src/string/rindex.cpp @@ -0,0 +1,20 @@ +//===-- Implementation of rindex ------------------------------------------===// +// +// 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/string/rindex.h" + +#include "src/__support/common.h" +#include "src/string/memory_utils/strchr_implementations.h" + +namespace __llvm_libc { + +LLVM_LIBC_FUNCTION(char *, rindex, (const char *src, int c)) { + return strrchr_implementation(src, c); +} + +} // namespace __llvm_libc diff --git a/libc/test/src/string/CMakeLists.txt b/libc/test/src/string/CMakeLists.txt --- a/libc/test/src/string/CMakeLists.txt +++ b/libc/test/src/string/CMakeLists.txt @@ -14,6 +14,23 @@ LibcMemoryHelpers ) +add_header_library( + strchr_test_support + HDRS + StrchrTest.h +) + +add_libc_unittest( + index_test + SUITE + libc_string_unittests + SRCS + index_test.cpp + DEPENDS + libc.src.string.index + .strchr_test_support +) + add_libc_unittest( memccpy_test SUITE @@ -54,6 +71,17 @@ libc.src.string.memrchr ) +add_libc_unittest( + rindex_test + SUITE + libc_string_unittests + SRCS + rindex_test.cpp + DEPENDS + libc.src.string.rindex + .strchr_test_support +) + add_libc_unittest( stpcpy_test SUITE @@ -84,12 +112,6 @@ libc.src.string.strcat ) -add_header_library( - strchr_test_support - HDRS - StrchrTest.h -) - add_libc_unittest( strchr_test SUITE diff --git a/libc/test/src/string/index_test.cpp b/libc/test/src/string/index_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/src/string/index_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for index -----------------------------------------------===// +// +// 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 "StrchrTest.h" + +#include "src/string/index.h" +#include "test/UnitTest/Test.h" + +STRCHR_TEST(Index, __llvm_libc::index) diff --git a/libc/test/src/string/rindex_test.cpp b/libc/test/src/string/rindex_test.cpp new file mode 100644 --- /dev/null +++ b/libc/test/src/string/rindex_test.cpp @@ -0,0 +1,14 @@ +//===-- Unittests for rindex ----------------------------------------------===// +// +// 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 "StrchrTest.h" + +#include "src/string/rindex.h" +#include "test/UnitTest/Test.h" + +STRRCHR_TEST(Rindex, __llvm_libc::rindex)