ft_memmove.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* ft_memmove.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: ll-hotel <ll-hotel@student.42lyon.fr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2023/11/07 18:10:41 by ll-hotel #+# #+# */ 9 /* Updated: 2024/04/24 17:36:21 by ll-hotel ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "ft_basics.h" 14 15 static void *ft_memcpy_from_right(void *dest, const void *src, unsigned long n) 16 { 17 unsigned char *d; 18 unsigned char *s; 19 20 d = (unsigned char *)dest + n - 1; 21 s = (unsigned char *)src + n - 1; 22 if (n & 1) 23 *(d--) = *(s--); 24 if (n & 2) 25 *((unsigned short *)d) = *((unsigned short *)s); 26 d -= n & 2; 27 s -= n & 2; 28 if (n & 4) 29 *((unsigned int *)d) = *((unsigned int *)s); 30 d -= n & 4; 31 s -= n & 4; 32 n >>= 3; 33 while (n--) 34 { 35 *((unsigned long *)d) = *((unsigned long *)s); 36 d -= 8; 37 s -= 8; 38 } 39 return (dest); 40 } 41 42 void *ft_memmove(void *dest, const void *src, unsigned long n) 43 { 44 if (!dest && !src) 45 return (0); 46 if (src < dest && dest < (src + n)) 47 ft_memcpy_from_right(dest, src, n); 48 else 49 ft_memcpy(dest, src, n); 50 return (dest); 51 }