/ libft / src / ft_basics / ft_memmove.c
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  }