From 0f35f48c25608732bb74275ae9da6ed09964298b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zo=C3=ABy=20Noort?= Date: Sat, 31 May 2025 19:37:00 +0200 Subject: [PATCH] feat: added memchr, memcmp, memmv and realloc --- srcs/ft_memchr.c | 35 +++++++++++++++++++++++++++++++++++ srcs/ft_memcmp.c | 28 ++++++++++++++++++++++++++++ srcs/ft_memmv.c | 44 ++++++++++++++++++++++++++++++++++++++++++++ srcs/ft_realloc.c | 22 ++++++++++++++++++++++ 4 files changed, 129 insertions(+) create mode 100644 srcs/ft_memchr.c create mode 100644 srcs/ft_memcmp.c create mode 100644 srcs/ft_memmv.c create mode 100644 srcs/ft_realloc.c diff --git a/srcs/ft_memchr.c b/srcs/ft_memchr.c new file mode 100644 index 0000000..21baf6c --- /dev/null +++ b/srcs/ft_memchr.c @@ -0,0 +1,35 @@ +#include +#include + +void *ft_memchr(const void *s, int c, size_t n) +{ + const unsigned char *p = s; + unsigned char uc = (unsigned char)c; + + while (n && ((uintptr_t)p % sizeof(size_t))) { + if (*p == uc) + return ((void *)p); + ++p; + --n; + } + size_t mask = 0; + for (size_t i = 0; i < sizeof(size_t); ++i) + mask |= (size_t)uc << (i * 8); + + while (n >= sizeof(size_t)) { + size_t word = *(const size_t *)p; + size_t cmp = word ^ mask; + for (size_t i = 0; i < sizeof(size_t); ++i) { + if (((cmp >> (i * 8)) & 0xFF) == 0) + return ((void *)(p + i)); + } + p += sizeof(size_t); + n -= sizeof(size_t); + } + while (n--) { + if (*p == uc) + return ((void *)p); + ++p; + } + return (NULL); +} diff --git a/srcs/ft_memcmp.c b/srcs/ft_memcmp.c new file mode 100644 index 0000000..ab3a0f0 --- /dev/null +++ b/srcs/ft_memcmp.c @@ -0,0 +1,28 @@ +#include +#include + +int ft_memcmp(const void *s1, const void *s2, size_t n) +{ + const unsigned char *p1 = s1, *p2 = s2; + + while (n >= sizeof(size_t)) { + size_t w1 = *(const size_t *)p1; + size_t w2 = *(const size_t *)p2; + if (w1 != w2) { + for (size_t i = 0; i < sizeof(size_t); ++i) { + if (p1[i] != p2[i]) + return (p1[i] - p2[i]); + } + } + p1 += sizeof(size_t); + p2 += sizeof(size_t); + n -= sizeof(size_t); + } + while (n--) { + if (*p1 != *p2) + return (*p1 - *p2); + ++p1; + ++p2; + } + return (0); +} diff --git a/srcs/ft_memmv.c b/srcs/ft_memmv.c new file mode 100644 index 0000000..abd2ccf --- /dev/null +++ b/srcs/ft_memmv.c @@ -0,0 +1,44 @@ +#include +#include + +void *ft_memmove(void *dst, const void *src, size_t n) +{ + unsigned char *d = dst; + const unsigned char *s = src; + + if (d == s || n == 0) + return dst; + + if (d < s) { + while (((uintptr_t)d % sizeof(size_t)) && n) { + *d++ = *s++; + n--; + } + while (n >= sizeof(size_t)) { + *(size_t *)d = *(const size_t *)s; + d += sizeof(size_t); + s += sizeof(size_t); + n -= sizeof(size_t); + } + while (n--) { + *d++ = *s++; + } + } else { + d += n; + s += n; + while (n && ((uintptr_t)d % sizeof(size_t))) { + *(--d) = *(--s); + n--; + } + while (n >= sizeof(size_t)) { + d -= sizeof(size_t); + s -= sizeof(size_t); + *(size_t *)d = *(const size_t *)s; + n -= sizeof(size_t); + } + while (n--) { + *(--d) = *(--s); + } + } + return (dst); +} diff --git a/srcs/ft_realloc.c b/srcs/ft_realloc.c new file mode 100644 index 0000000..bdd5cf9 --- /dev/null +++ b/srcs/ft_realloc.c @@ -0,0 +1,22 @@ +#include "libft.h" +#include +#include + +void *ft_realloc(void *ptr, size_t old_size, size_t new_size) +{ + if (new_size == 0) { + free(ptr); + return (NULL); + } + if (!ptr) + return (malloc(new_size)); + + void *new_ptr = malloc(new_size); + if (!new_ptr) + return (NULL); + + size_t copy_size = old_size < new_size ? old_size : new_size; + ft_memcpy(new_ptr, ptr, copy_size); + free(ptr); + return (new_ptr); +}