summaryrefslogtreecommitdiff
path: root/src/string/memmove.c
blob: c9ae1245033b76fb9f97b35779ec1f4c67a1b2e4 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <string.h>
#include "_assert.h"

/** move memory **/

void * memmove(void *s1, const void *s2, size_t n)
{
	ASSERT_NONNULL(s1);
	ASSERT_NONNULL(s2);

	if (s1 < s2) {
		return memcpy(s1, s2, n);
	}

	/* reverse memcpy() */
	while (n > 0) {
		((char*)s1)[n] = ((char*)s2)[n];
		n--;
	}
	/* last byte */
	((char*)s1)[n] = ((char*)s2)[n];

	/*
	RETURN_ALWAYS(ARGUMENT(s1));
	*/
	return s1;
}

/***
copies ARGUMENT(n) bytes of memory from the object at
ARGUMENT(s2) to the object at ARGUMENT(s1). If ARGUMENT(s1) and ARGUMENT(s2) overlap, the memory
is copied so that the ARGUMENT(n) bytes are safely written to ARGUMENT(s1).
***/

/*
STDC(1)
*/