1/*
2 *	memmove.c: memmove compat implementation.
3 *
4 *	Copyright (c) 2001-2006, NLnet Labs. All rights reserved.
5 *
6 * See LICENSE for the license.
7*/
8
9#include <config.h>
10#include <stdlib.h>
11
12void *memmove(void *dest, const void *src, size_t n);
13
14void *memmove(void *dest, const void *src, size_t n)
15{
16	uint8_t* from = (uint8_t*) src;
17	uint8_t* to = (uint8_t*) dest;
18
19	if (from == to || n == 0)
20		return dest;
21	if (to > from && to-from < (int)n) {
22		/* to overlaps with from */
23		/*  <from......>         */
24		/*         <to........>  */
25		/* copy in reverse, to avoid overwriting from */
26		int i;
27		for(i=n-1; i>=0; i--)
28			to[i] = from[i];
29		return dest;
30	}
31	if (from > to && from-to < (int)n) {
32		/* to overlaps with from */
33		/*        <from......>   */
34		/*  <to........>         */
35		/* copy forwards, to avoid overwriting from */
36		size_t i;
37		for(i=0; i<n; i++)
38			to[i] = from[i];
39		return dest;
40	}
41	memcpy(dest, src, n);
42	return dest;
43}
44