xref: /onnv-gate/usr/src/common/util/memmove.c (revision 12391:e5884cf20c37)
1  /*
2   * CDDL HEADER START
3   *
4   * The contents of this file are subject to the terms of the
5   * Common Development and Distribution License (the "License").
6   * You may not use this file except in compliance with the License.
7   *
8   * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9   * or http://www.opensolaris.org/os/licensing.
10   * See the License for the specific language governing permissions
11   * and limitations under the License.
12   *
13   * When distributing Covered Code, include this CDDL HEADER in each
14   * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15   * If applicable, add the following below this CDDL HEADER, with the
16   * fields enclosed by brackets "[]" replaced with your own identifying
17   * information: Portions Copyright [yyyy] [name of copyright owner]
18   *
19   * CDDL HEADER END
20   */
21  
22  /*
23   * Copyright (c) 1988, 2010, Oracle and/or its affiliates. All rights reserved.
24   */
25  
26  /*	Copyright (c) 1988 AT&T	*/
27  /*	  All Rights Reserved  	*/
28  
29  #if !defined(_KMDB) && !defined(_KERNEL)
30  
31  #include "lint.h"
32  
33  #endif /* !_KMDB && !_KERNEL */
34  
35  /*
36   * The SunStudio compiler may generate calls to _memmove; So we
37   * need to make sure that the correct symbol exists for these calls.
38   */
39  #pragma weak _memmove = memmove
40  
41  #include <sys/types.h>
42  
43  #if defined(_KERNEL)
44  #include <sys/systm.h>
45  #else
46  #include <string.h>
47  #include <memory.h>
48  #endif
49  
50  /*
51   * Copy s0 to s, always copy n bytes.
52   * Return s
53   * Copying between objects that overlap will take place correctly
54   */
55  void *
memmove(void * s,const void * s0,size_t n)56  memmove(void *s, const void *s0, size_t n)
57  {
58  	if (n != 0) {
59  		char *s1 = s;
60  		const char *s2 = s0;
61  
62  		if (s1 <= s2) {
63  			do {
64  				*s1++ = *s2++;
65  			} while (--n != 0);
66  		} else {
67  			s2 += n;
68  			s1 += n;
69  			do {
70  				*--s1 = *--s2;
71  			} while (--n != 0);
72  		}
73  	}
74  	return (s);
75  }
76