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 Kanevoid *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 }