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