summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Userland/Libraries/LibC/string.cpp19
-rw-r--r--Userland/Libraries/LibC/string.h1
2 files changed, 20 insertions, 0 deletions
diff --git a/Userland/Libraries/LibC/string.cpp b/Userland/Libraries/LibC/string.cpp
index 6f4f8d620f..a9412428aa 100644
--- a/Userland/Libraries/LibC/string.cpp
+++ b/Userland/Libraries/LibC/string.cpp
@@ -359,6 +359,25 @@ char* strstr(char const* haystack, char const* needle)
return const_cast<char*>(haystack);
}
+// https://linux.die.net/man/3/strcasestr
+char* strcasestr(char const* haystack, char const* needle)
+{
+ char nch;
+ char hch;
+
+ if ((nch = *needle++) != 0) {
+ size_t len = strlen(needle);
+ do {
+ do {
+ if ((hch = *haystack++) == 0)
+ return nullptr;
+ } while (toupper(hch) != toupper(nch));
+ } while (strncasecmp(haystack, needle, len) != 0);
+ --haystack;
+ }
+ return const_cast<char*>(haystack);
+}
+
// https://pubs.opengroup.org/onlinepubs/9699919799/functions/strpbrk.html
char* strpbrk(char const* s, char const* accept)
{
diff --git a/Userland/Libraries/LibC/string.h b/Userland/Libraries/LibC/string.h
index c3681c89ca..ba9787d4a8 100644
--- a/Userland/Libraries/LibC/string.h
+++ b/Userland/Libraries/LibC/string.h
@@ -43,6 +43,7 @@ __attribute__((warn_unused_result)) size_t strlcpy(char* dest, char const* src,
char* strchr(char const*, int c);
char* strchrnul(char const*, int c);
char* strstr(char const* haystack, char const* needle);
+char* strcasestr(char const* haystack, char const* needle);
char* strrchr(char const*, int c);
char* index(char const* str, int ch);