ff8258499c
adopted upstream, greatly reducing the diff.
44 lines
947 B
C
44 lines
947 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;
|
|
}
|