diff options
Diffstat (limited to 'Libraries/LibC/strings.cpp')
-rw-r--r-- | Libraries/LibC/strings.cpp | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/Libraries/LibC/strings.cpp b/Libraries/LibC/strings.cpp new file mode 100644 index 0000000000..8f248e1438 --- /dev/null +++ b/Libraries/LibC/strings.cpp @@ -0,0 +1,35 @@ +#include <assert.h> +#include <ctype.h> +#include <strings.h> + +extern "C" { + +static char foldcase(char ch) +{ + if (isalpha(ch)) + return tolower(ch); + return ch; +} + +int strcasecmp(const char* s1, const char* s2) +{ + for (; foldcase(*s1) == foldcase(*s2); ++s1, ++s2) { + if (*s1 == 0) + return 0; + } + return foldcase(*(const unsigned char*)s1) < foldcase(*(const unsigned char*)s2) ? -1 : 1; +} + +int strncasecmp(const char* s1, const char* s2, size_t n) +{ + if (!n) + return 0; + do { + if (foldcase(*s1) != foldcase(*s2++)) + return foldcase(*(const unsigned char*)s1) - foldcase(*(const unsigned char*)--s2); + if (*s1++ == 0) + break; + } while (--n); + return 0; +} +} |