xref: /DragonOS/kernel/src/libs/glib.c (revision ce5850adbf74ec6c6717bbb5b1749f1fbff4ca0d)
1 #include <common/glib.h>
2 #include <common/string.h>
3 
4 
5 /**
6  * @brief 将数据从src搬运到dst,并能正确处理地址重叠的问题
7  *
8  * @param dst 目标地址指针
9  * @param src 源地址指针
10  * @param size 大小
11  * @return void* 指向目标地址的指针
12  */
13 void *memmove(void *dst, const void *src, uint64_t size)
14 {
15     const char *_src = src;
16 	char *_dst = dst;
17 
18 	if (!size)
19 		return dst;
20 
21 	// 当源地址大于目标地址时,使用memcpy来完成
22 	if (dst <= src)
23 		return memcpy(dst, src, size);
24 
25 	// 当源地址小于目标地址时,为防止重叠覆盖,因此从后往前拷贝
26 	_src += size;
27 	_dst += size;
28 
29 	// 逐字节拷贝
30 	while (size--)
31 		*--_dst = *--_src;
32 
33 	return dst;
34 }