-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathft_memmove.c
62 lines (57 loc) · 1.69 KB
/
ft_memmove.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* ft_memmove.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: abaudot <[email protected]> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/01/05 15:07:31 by abaudot #+# #+# */
/* Updated: 2021/01/05 15:07:38 by abaudot ### ########.fr */
/* */
/* ************************************************************************** */
#include "libft.h"
static inline void wordcopy(t_op *dstp, t_op *srcp, size_t len)
{
t_op a0;
t_op a1;
if (len & 1)
{
*srcp -= OPSIZ;
*dstp -= OPSIZ;
((t_op *)*dstp)[0] = ((t_op *)*srcp)[0];
if (len == 1)
return ;
--len;
}
while (len)
{
*srcp -= 16;
*dstp -= 16;
a1 = ((t_op *)*srcp)[1];
a0 = ((t_op *)*srcp)[0];
((t_op *)*dstp)[1] = a1;
((t_op *)*dstp)[0] = a0;
len -= 2;
}
}
void *ft_memmove(void *dest, const void *src, size_t n)
{
t_op dstp;
t_op srcp;
if (dest == src)
return ((void *)src);
if ((size_t)(dest - src) >= n)
return ((dest = ft_memcpy(dest, src, n)));
dstp = (t_op)dest;
srcp = (t_op)src;
srcp += n;
dstp += n;
if (n >= OPSIZ)
{
wordcopy(&dstp, &srcp, n >> 3);
n &= 7;
}
while (n--)
*(unsigned char *)(--dstp) = *(unsigned char *)(--srcp);
return (dest);
}