1 /******************************************************************************
2  * Copyright (c) 2004, 2008 IBM Corporation
3  * All rights reserved.
4  * This program and the accompanying materials
5  * are made available under the terms of the BSD License
6  * which accompanies this distribution, and is available at
7  * http://www.opensource.org/licenses/bsd-license.php
8  *
9  * Contributors:
10  *     IBM Corporation - initial implementation
11  *****************************************************************************/
12 
13 #include "string.h"
14 
15 
16 void *
memmove(void * dest,const void * src,size_t n)17 memmove(void *dest, const void *src, size_t n)
18 {
19 	char *cdest;
20 	const char *csrc;
21 	int i;
22 
23 	/* Do the buffers overlap in a bad way? */
24 	if (src < dest && src + n >= dest) {
25 		/* Copy from end to start */
26 		cdest = dest + n - 1;
27 		csrc = src + n - 1;
28 		for (i = 0; i < n; i++) {
29 			*cdest-- = *csrc--;
30 		}
31 	}
32 	else {
33 		/* Normal copy is possible */
34 		cdest = dest;
35 		csrc = src;
36 		for (i = 0; i < n; i++) {
37 			*cdest++ = *csrc++;
38 		}
39 	}
40 
41 	return dest;
42 }
43