diff options
Diffstat (limited to 'usr.sbin/unbound/ldns/compat/memmove.c')
-rw-r--r-- | usr.sbin/unbound/ldns/compat/memmove.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/usr.sbin/unbound/ldns/compat/memmove.c b/usr.sbin/unbound/ldns/compat/memmove.c new file mode 100644 index 00000000000..e458092c33f --- /dev/null +++ b/usr.sbin/unbound/ldns/compat/memmove.c @@ -0,0 +1,43 @@ +/* + * memmove.c: memmove compat implementation. + * + * Copyright (c) 2001-2008, NLnet Labs. All rights reserved. + * + * See LICENSE for the license. +*/ + +#include <ldns/config.h> +#include <stdlib.h> + +void *memmove(void *dest, const void *src, size_t n); + +void *memmove(void *dest, const void *src, size_t n) +{ + uint8_t* from = (uint8_t*) src; + uint8_t* to = (uint8_t*) dest; + + if (from == to || n == 0) + return dest; + if (to > from && to-from < (int)n) { + /* to overlaps with from */ + /* <from......> */ + /* <to........> */ + /* copy in reverse, to avoid overwriting from */ + int i; + for(i=n-1; i>=0; i--) + to[i] = from[i]; + return dest; + } + if (from > to && from-to < (int)n) { + /* to overlaps with from */ + /* <from......> */ + /* <to........> */ + /* copy forwards, to avoid overwriting from */ + size_t i; + for(i=0; i<n; i++) + to[i] = from[i]; + return dest; + } + memcpy(dest, src, n); + return dest; +} |