diff --git a/AK/String.cpp b/AK/String.cpp index 9ddc833dcdc..a085f75b48d 100644 --- a/AK/String.cpp +++ b/AK/String.cpp @@ -7,6 +7,13 @@ extern "C" char* strstr(const char* haystack, const char* needle); #endif +static inline char to_lowercase(char c) +{ + if (c >= 'A' && c <= 'Z') + return c | 0x20; + return c; +} + namespace AK { bool String::operator==(const String& other) const @@ -322,5 +329,17 @@ bool String::contains(const String& needle) const return strstr(characters(), needle.characters()); } +bool String::equals_ignoring_case(const StringView& other) const +{ + if (other.m_impl == impl()) + return true; + if (length() != other.length()) + return false; + for (size_t i = 0; i < length(); ++i) { + if (::to_lowercase(characters()[i]) != ::to_lowercase(other.characters_without_null_termination()[i])) + return false; + } + return true; } +} diff --git a/AK/String.h b/AK/String.h index 87842d923d2..0d8f7dc8369 100755 --- a/AK/String.h +++ b/AK/String.h @@ -110,6 +110,8 @@ public: return m_impl->to_uppercase(); } + bool equals_ignoring_case(const StringView&) const; + bool contains(const String&) const; Vector split_limit(char separator, size_t limit) const;