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