summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJakob Kaivo <jkk@ung.org>2019-02-28 14:22:40 -0500
committerJakob Kaivo <jkk@ung.org>2019-02-28 14:22:40 -0500
commitbda4ede6fbf8b851a0e048011ea728015b19722d (patch)
tree9d7c524ba80c8ad5207b4c020801fdf3afc02d44
parentf777999710878dc9c5cdea3b297c0c1ccd934adc (diff)
match memmove() implementation without malloc()
-rw-r--r--src/wchar/wmemmove.c23
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;
}