]>
Commit | Line | Data |
---|---|---|
89c4ed63 A |
1 | /* |
2 | * memmove.c: memmove compat implementation. | |
3 | * | |
4 | * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. | |
5 | * | |
6 | * See LICENSE for the license. | |
7 | */ | |
8 | ||
9 | #include <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 | } |