• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2013-2014, ARM Limited and Contributors. All rights reserved.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  */
6 
7 #include <stddef.h> /* size_t */
8 
9 /*
10  * Fill @count bytes of memory pointed to by @dst with @val
11  */
memset(void * dst,int val,size_t count)12 void *memset(void *dst, int val, size_t count)
13 {
14 	char *ptr = dst;
15 
16 	while (count--)
17 		*ptr++ = val;
18 
19 	return dst;
20 }
21 
22 /*
23  * Compare @len bytes of @s1 and @s2
24  */
memcmp(const void * s1,const void * s2,size_t len)25 int memcmp(const void *s1, const void *s2, size_t len)
26 {
27 	const unsigned char *s = s1;
28 	const unsigned char *d = s2;
29 	unsigned char sc;
30 	unsigned char dc;
31 
32 	while (len--) {
33 		sc = *s++;
34 		dc = *d++;
35 		if (sc - dc)
36 			return (sc - dc);
37 	}
38 
39 	return 0;
40 }
41 
42 /*
43  * Copy @len bytes from @src to @dst
44  */
memcpy(void * dst,const void * src,size_t len)45 void *memcpy(void *dst, const void *src, size_t len)
46 {
47 	const char *s = src;
48 	char *d = dst;
49 
50 	while (len--)
51 		*d++ = *s++;
52 
53 	return dst;
54 }
55 
56 /*
57  * Move @len bytes from @src to @dst
58  */
memmove(void * dst,const void * src,size_t len)59 void *memmove(void *dst, const void *src, size_t len)
60 {
61 	/*
62 	 * The following test makes use of unsigned arithmetic overflow to
63 	 * more efficiently test the condition !(src <= dst && dst < str+len).
64 	 * It also avoids the situation where the more explicit test would give
65 	 * incorrect results were the calculation str+len to overflow (though
66 	 * that issue is probably moot as such usage is probably undefined
67 	 * behaviour and a bug anyway.
68 	 */
69 	if ((size_t)dst - (size_t)src >= len) {
70 		/* destination not in source data, so can safely use memcpy */
71 		return memcpy(dst, src, len);
72 	} else {
73 		/* copy backwards... */
74 		const char *end = dst;
75 		const char *s = (const char *)src + len;
76 		char *d = (char *)dst + len;
77 		while (d != end)
78 			*--d = *--s;
79 	}
80 	return dst;
81 }
82 
83 /*
84  * Scan @len bytes of @src for value @c
85  */
memchr(const void * src,int c,size_t len)86 void *memchr(const void *src, int c, size_t len)
87 {
88 	const char *s = src;
89 
90 	while (len--) {
91 		if (*s == c)
92 			return (void *) s;
93 		s++;
94 	}
95 
96 	return NULL;
97 }
98