summaryrefslogtreecommitdiff
path: root/lib/memmove.c
blob: e674c496d9014a14478fa3032f76940fc59740bc (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
38
39
40
41
42
43
44
45
46
47
48
49
/**
** @file	memmove.c
**
** @author	Numerous CSCI-452 classes
**
** @brief	C implementations of common library functions
*/

#ifndef MEMMOVE_SRC_INC
#define MEMMOVE_SRC_INC

#include <common.h>

#include <lib.h>

/**
** memmove(dst,src,len)
**
** Copy a block from one place to another. Deals with overlapping
** buffers.
**
** @param dst   Destination buffer
** @param src   Source buffer
** @param len   Buffer size (in bytes)
*/
void memmove(void *dst, const void *src, register uint32_t len)
{
	register uint8_t *dest = dst;
	register const uint8_t *source = src;

	/*
	** We could speed this up by unrolling it and copying
	** words at a time (instead of bytes).
	*/

	if (source < dest && (source + len) > dest) {
		source += len;
		dest += len;
		while (len-- > 0) {
			*--dest = *--source;
		}
	} else {
		while (len--) {
			*dest++ = *source++;
		}
	}
}

#endif