diff options
-rw-r--r-- | Userland/Libraries/LibC/string.cpp | 19 | ||||
-rw-r--r-- | Userland/Libraries/LibC/string.h | 1 |
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); |