diff options
author | Jakob Kaivo <jkk@ung.org> | 2019-02-28 14:22:40 -0500 |
---|---|---|
committer | Jakob Kaivo <jkk@ung.org> | 2019-02-28 14:22:40 -0500 |
commit | bda4ede6fbf8b851a0e048011ea728015b19722d (patch) | |
tree | 9d7c524ba80c8ad5207b4c020801fdf3afc02d44 | |
parent | f777999710878dc9c5cdea3b297c0c1ccd934adc (diff) |
match memmove() implementation without malloc()
-rw-r--r-- | src/wchar/wmemmove.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/src/wchar/wmemmove.c b/src/wchar/wmemmove.c index 11fd35dc..75b58f87 100644 --- a/src/wchar/wmemmove.c +++ b/src/wchar/wmemmove.c @@ -1,12 +1,27 @@ #include <wchar.h> #include "stdlib.h" +#include "nonstd/assert.h" wchar_t * wmemmove(wchar_t * s1, const wchar_t * s2, size_t n) { - wchar_t *tmp = malloc(n * sizeof(wchar_t)); - wmemcpy(tmp, s2, n); - wmemcpy(s1, tmp, n); - free(tmp); + ASSERT_NONNULL(s1); + ASSERT_NONNULL(s2); + + if (s1 < s2) { + return wmemcpy(s1, s2, n); + } + + /* reverse memcpy() */ + while (n > 0) { + s1[n] = s2[n]; + n--; + } + /* last byte */ + s1[n] = s2[n]; + + /* + RETURN_ALWAYS(ARGUMENT(s1)); + */ return s1; } |