Initial vendor import of ldns-1.6.4 into contrib.
[dragonfly.git] / contrib / ldns / compat / memmove.c
1 /*
2  *      memmove.c: memmove compat implementation.
3  *
4  *      Copyright (c) 2001-2008, NLnet Labs. All rights reserved.
5  *
6  * See LICENSE for the license.
7 */
8
9 #include <ldns/config.h>
10 #include <stdlib.h>
11
12 void *memmove(void *dest, const void *src, size_t n);
13
14 void *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 }