44 lines
948 B
C
44 lines
948 B
C
|
/*
|
||
|
* memmove.c: memmove compat implementation.
|
||
|
*
|
||
|
* Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
|
||
|
*
|
||
|
* See LICENSE for the license.
|
||
|
*/
|
||
|
|
||
|
#include <config.h>
|
||
|
#include <stdlib.h>
|
||
|
|
||
|
void *memmove(void *dest, const void *src, size_t n);
|
||
|
|
||
|
void *memmove(void *dest, const void *src, size_t n)
|
||
|
{
|
||
|
uint8_t* from = (uint8_t*) src;
|
||
|
uint8_t* to = (uint8_t*) dest;
|
||
|
|
||
|
if (from == to || n == 0)
|
||
|
return dest;
|
||
|
if (to > from && to-from < (int)n) {
|
||
|
/* to overlaps with from */
|
||
|
/* <from......> */
|
||
|
/* <to........> */
|
||
|
/* copy in reverse, to avoid overwriting from */
|
||
|
int i;
|
||
|
for(i=n-1; i>=0; i--)
|
||
|
to[i] = from[i];
|
||
|
return dest;
|
||
|
}
|
||
|
if (from > to && from-to < (int)n) {
|
||
|
/* to overlaps with from */
|
||
|
/* <from......> */
|
||
|
/* <to........> */
|
||
|
/* copy forwards, to avoid overwriting from */
|
||
|
size_t i;
|
||
|
for(i=0; i<n; i++)
|
||
|
to[i] = from[i];
|
||
|
return dest;
|
||
|
}
|
||
|
memcpy(dest, src, n);
|
||
|
return dest;
|
||
|
}
|