diff --git a/Userland/Libraries/LibC/string.cpp b/Userland/Libraries/LibC/string.cpp index 88f57bb8f7..cb30931cba 100644 --- a/Userland/Libraries/LibC/string.cpp +++ b/Userland/Libraries/LibC/string.cpp @@ -151,6 +151,19 @@ void* memcpy(void* dest_ptr, void const* src_ptr, size_t n) #endif } +// https://pubs.opengroup.org/onlinepubs/9699919799/functions/memccpy.html +void* memccpy(void* dest_ptr, void const* src_ptr, int c, size_t n) +{ + u8* pd = static_cast(dest_ptr); + u8 const* ps = static_cast(src_ptr); + for (; n--; pd++, ps++) { + *pd = *ps; + if (*pd == static_cast(c)) + return pd + 1; + } + return nullptr; +} + // https://pubs.opengroup.org/onlinepubs/9699919799/functions/memset.html // For x86-64, an optimized ASM implementation is found in ./arch/x86_64/memset.S #if ARCH(X86_64) diff --git a/Userland/Libraries/LibC/string.h b/Userland/Libraries/LibC/string.h index 0d96455205..657aa41369 100644 --- a/Userland/Libraries/LibC/string.h +++ b/Userland/Libraries/LibC/string.h @@ -34,6 +34,7 @@ int strncmp(char const*, char const*, size_t); int memcmp(void const*, void const*, size_t); int timingsafe_memcmp(void const*, void const*, size_t); void* memcpy(void*, void const*, size_t); +void* memccpy(void*, void const*, int, size_t); void* memmove(void*, void const*, size_t); void* memchr(void const*, int c, size_t); void* memmem(void const* haystack, size_t, void const* needle, size_t);