diff options
author | Dag-Erling Smørgrav <des@FreeBSD.org> | 2012-07-04 14:24:26 +0000 |
---|---|---|
committer | Dag-Erling Smørgrav <des@FreeBSD.org> | 2012-07-04 14:24:26 +0000 |
commit | afb79913ce00d885b8b43f7478e1e054edadb567 (patch) | |
tree | b9037afac70edd3c6342318cedbbadc648b799ca /compat/memmove.c | |
download | src-test2-afb79913ce00d885b8b43f7478e1e054edadb567.tar.gz src-test2-afb79913ce00d885b8b43f7478e1e054edadb567.zip |
Notes
Diffstat (limited to 'compat/memmove.c')
-rw-r--r-- | compat/memmove.c | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/compat/memmove.c b/compat/memmove.c new file mode 100644 index 000000000000..0035bbf7533d --- /dev/null +++ b/compat/memmove.c @@ -0,0 +1,43 @@ +/* + * memmove.c: memmove compat implementation. + * + * Copyright (c) 2001-2006, NLnet Labs. All rights reserved. + * + * See LICENSE for the license. +*/ + +#include <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; +} |