From 2898ec916cff65f7c1199dfb5705a2eaefae3928 Mon Sep 17 00:00:00 2001 From: Romain Goyet Date: Sun, 30 Jul 2017 22:11:05 +0200 Subject: [PATCH] [liba] Add memmove to string.h Change-Id: I99b412dc7404e2711dbf7753f0d619694dee3d19 --- liba/Makefile | 1 + liba/include/string.h | 1 + liba/src/memmove.c | 21 +++++++++++++++++++++ 3 files changed, 23 insertions(+) create mode 100644 liba/src/memmove.c diff --git a/liba/Makefile b/liba/Makefile index 1e01c0def..761b90772 100644 --- a/liba/Makefile +++ b/liba/Makefile @@ -12,6 +12,7 @@ objs += $(addprefix liba/src/, \ isinff.o \ malloc.o \ memcpy.o \ + memmove.o \ memset.o \ strcmp.o \ strlcpy.o \ diff --git a/liba/include/string.h b/liba/include/string.h index 6c00070c0..bc3852626 100644 --- a/liba/include/string.h +++ b/liba/include/string.h @@ -7,6 +7,7 @@ LIBA_BEGIN_DECLS void * memcpy(void * dst, const void * src, size_t n); +void * memmove(void * dst, const void * src, size_t n); void * memset(void * b, int c, size_t len); size_t strlen(const char * s); int strcmp(const char *s1, const char *s2); diff --git a/liba/src/memmove.c b/liba/src/memmove.c new file mode 100644 index 000000000..cfb5a7c01 --- /dev/null +++ b/liba/src/memmove.c @@ -0,0 +1,21 @@ +#include + +void * memmove(void * dst, const void * src, size_t n) { + char * destination = (char *)dst; + char * source = (char *)src; + + if (source < destination && destination < source + n) { + /* Copy backwards to avoid overwrites */ + source += n; + destination += n; + while (n--) { + *--destination = *--source; + } + } else { + while (n--) { + *destination++ = *source++; + } + } + + return dst; +}