189,23 → 189,40 |
return dst; |
} |
|
/** Move memory block with possible overlapping. */ |
void *memmove(void *dst, const void *src, size_t n) |
{ |
int i, j; |
uint8_t *dp, *sp; |
|
if (src > dst) |
/* Nothing to do? */ |
if (src == dst) |
return dst; |
|
/* Non-overlapping? */ |
if (dst >= src + n || src >= dst + n) { |
return memcpy(dst, src, n); |
} |
|
for (j = (n % sizeof(unsigned long)) - 1; j >= 0; j--) |
((unsigned char *) ((unsigned long *) dst))[j] = |
((unsigned char *) ((unsigned long *) src))[j]; |
/* Which direction? */ |
if (src > dst) { |
/* Forwards. */ |
sp = src; |
dp = dst; |
|
for (i = n / sizeof(unsigned long) - 1; i >=0 ; i--) |
((unsigned long *) dst)[i] = ((unsigned long *) src)[i]; |
while (n-- != 0) |
*dp++ = *sp++; |
} else { |
/* Backwards. */ |
sp = src + (n - 1); |
dp = dst + (n - 1); |
|
return (char *) dst; |
while (n-- != 0) |
*dp-- = *sp--; |
} |
|
return dst; |
} |
|
/** Compare two memory areas. |
* |
* @param s1 Pointer to the first area to compare. |