diff --git a/libc/Makefile b/libc/Makefile index 97da9536c..45fbf117c 100644 --- a/libc/Makefile +++ b/libc/Makefile @@ -40,6 +40,8 @@ string/memcmp.o \ string/memcpy.o \ string/memmove.o \ string/memset.o \ +string/strcmp.o \ +string/strncmp.o \ string/strcpy.o \ string/strlen.o \ string/strncpy.o \ diff --git a/libc/include/string.h b/libc/include/string.h index 1675097d6..491a36a31 100644 --- a/libc/include/string.h +++ b/libc/include/string.h @@ -11,6 +11,9 @@ void* memmove(void*, const void*, size_t); void* memset(void*, int, size_t); size_t strlen(const char*); +int strcmp(const char*, const char*); +int strncmp(const char*, const char*, size_t); + char* strcpy(char* __restrict, const char* __restrict); char* strncpy(char* __restrict, const char* __restrict, size_t); diff --git a/libc/string/strcmp.cpp b/libc/string/strcmp.cpp new file mode 100644 index 000000000..343d83691 --- /dev/null +++ b/libc/string/strcmp.cpp @@ -0,0 +1,11 @@ +#include + +int strcmp(const char* s1, const char* s2) +{ + const unsigned char* u1 = (unsigned char*)s1; + const unsigned char* u2 = (unsigned char*)s2; + for (; *u1 && *u2; u1++, u2++) + if (*u1 != *u2) + break; + return *u1 - *u2; +} diff --git a/libc/string/strncmp.cpp b/libc/string/strncmp.cpp new file mode 100644 index 000000000..b4cf3b797 --- /dev/null +++ b/libc/string/strncmp.cpp @@ -0,0 +1,11 @@ +#include + +int strncmp(const char* s1, const char* s2, size_t n) +{ + const unsigned char* u1 = (unsigned char*)s1; + const unsigned char* u2 = (unsigned char*)s2; + for (; --n && *u1 && *u2; u1++, u2++) + if (*u1 != *u2) + break; + return *u1 - *u2; +}