mirror of
https://github.com/intel/llvm.git
synced 2026-02-02 18:18:09 +08:00
[libc] Implement strcasestr
Differential Revision: https://reviews.llvm.org/D142518
This commit is contained in:
@@ -32,6 +32,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -32,6 +32,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -31,6 +31,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -41,6 +41,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -32,6 +32,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -41,6 +41,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -32,6 +32,7 @@ set(TARGET_LIBC_ENTRYPOINTS
|
||||
libc.src.string.stpcpy
|
||||
libc.src.string.stpncpy
|
||||
libc.src.string.strcasecmp
|
||||
libc.src.string.strcasestr
|
||||
libc.src.string.strcat
|
||||
libc.src.string.strchr
|
||||
libc.src.string.strcmp
|
||||
|
||||
@@ -68,6 +68,11 @@ def GnuExtensions : StandardSpec<"GNUExtensions"> {
|
||||
RetValSpec<CharPtr>,
|
||||
[ArgSpec<IntType>, ArgSpec<CharPtr>, ArgSpec<SizeTType>]
|
||||
>,
|
||||
FunctionSpec<
|
||||
"strcasestr",
|
||||
RetValSpec<CharPtr>,
|
||||
[ArgSpec<ConstCharPtr>, ArgSpec<ConstCharPtr>]
|
||||
>,
|
||||
]
|
||||
>;
|
||||
|
||||
|
||||
@@ -127,6 +127,17 @@ add_entrypoint_object(
|
||||
libc.src.__support.ctype_utils
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
strcasestr
|
||||
SRCS
|
||||
strcasestr.cpp
|
||||
HDRS
|
||||
strcasestr.h
|
||||
DEPENDS
|
||||
.memory_utils.strstr_implementation
|
||||
libc.src.__support.ctype_utils
|
||||
)
|
||||
|
||||
add_entrypoint_object(
|
||||
strcoll
|
||||
SRCS
|
||||
|
||||
28
libc/src/string/strcasestr.cpp
Normal file
28
libc/src/string/strcasestr.cpp
Normal file
@@ -0,0 +1,28 @@
|
||||
//===-- Implementation of strcasestr --------------------------------------===//
|
||||
//
|
||||
// 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/strcasestr.h"
|
||||
|
||||
#include "src/__support/common.h"
|
||||
#include "src/__support/ctype_utils.h"
|
||||
#include "src/string/memory_utils/strstr_implementations.h"
|
||||
|
||||
namespace __llvm_libc {
|
||||
|
||||
// TODO: This is a simple brute force implementation. This can be
|
||||
// improved upon using well known string matching algorithms.
|
||||
LLVM_LIBC_FUNCTION(char *, strcasestr,
|
||||
(const char *haystack, const char *needle)) {
|
||||
auto case_cmp = [](char a, char b) {
|
||||
return __llvm_libc::internal::tolower(a) -
|
||||
__llvm_libc::internal::tolower(b);
|
||||
};
|
||||
return strstr_implementation(haystack, needle, case_cmp);
|
||||
}
|
||||
|
||||
} // namespace __llvm_libc
|
||||
18
libc/src/string/strcasestr.h
Normal file
18
libc/src/string/strcasestr.h
Normal file
@@ -0,0 +1,18 @@
|
||||
//===-- Implementation header for strcasestr --------------------*- 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_STRCASECMP_H
|
||||
#define LLVM_LIBC_SRC_STRING_STRCASECMP_H
|
||||
|
||||
namespace __llvm_libc {
|
||||
|
||||
char *strcasestr(const char *needle, const char *haystack);
|
||||
|
||||
} // namespace __llvm_libc
|
||||
|
||||
#endif // LLVM_LIBC_SRC_STRING_STRCASECMP_H
|
||||
@@ -114,6 +114,16 @@ add_libc_unittest(
|
||||
libc.src.string.strcasecmp
|
||||
)
|
||||
|
||||
add_libc_unittest(
|
||||
strcasestr_test
|
||||
SUITE
|
||||
libc_string_unittests
|
||||
SRCS
|
||||
strcasestr_test.cpp
|
||||
DEPENDS
|
||||
libc.src.string.strcasestr
|
||||
)
|
||||
|
||||
add_libc_unittest(
|
||||
strcoll_test
|
||||
SUITE
|
||||
|
||||
24
libc/test/src/string/strcasestr_test.cpp
Normal file
24
libc/test/src/string/strcasestr_test.cpp
Normal file
@@ -0,0 +1,24 @@
|
||||
//===-- Unittests for strcasestr ------------------------------------------===//
|
||||
//
|
||||
// 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/strcasestr.h"
|
||||
#include "utils/UnitTest/Test.h"
|
||||
|
||||
TEST(LlvmLibcStrCaseStrTest, NeedleNotInHaystack) {
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("abcd", "e"), nullptr);
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("ABCD", "e"), nullptr);
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("abcd", "E"), nullptr);
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("ABCD", "E"), nullptr);
|
||||
}
|
||||
|
||||
TEST(LlvmLibcStrCaseStrTest, NeedleInMiddle) {
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("abcdefghi", "def"), "defghi");
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("ABCDEFGHI", "def"), "DEFGHI");
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("abcdefghi", "DEF"), "defghi");
|
||||
EXPECT_STREQ(__llvm_libc::strcasestr("ABCDEFGHI", "DEF"), "DEFGHI");
|
||||
}
|
||||
Reference in New Issue
Block a user