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