1 /* CC0 (Public domain) - see LICENSE file for details */
7 #include <ccan/mem/mem.h>
10 void *memmem(const void *haystack, size_t haystacklen,
11 const void *needle, size_t needlelen)
15 if (needlelen > haystacklen)
21 (p + needlelen) <= ((const char *)haystack + haystacklen);
23 if (memcmp(p, needle, needlelen) == 0)
31 void *memrchr(const void *s, int c, size_t n)
33 unsigned char *p = (unsigned char *)s;
45 void *mempbrkm(const void *data_, size_t len, const void *accept_, size_t accept_len)
47 const char *data = data_, *accept = accept_;
50 for (i = 0; i < len; i++)
51 for (j = 0; j < accept_len; j++)
52 if (accept[j] == data[i])
53 return (void *)&data[i];
57 void *memcchr(void const *data, int c, size_t data_len)
62 for (i = 0; i < data_len; i++)
69 #define MEMSWAP_TMP_SIZE 256
71 void memswap(void *a, void *b, size_t n)
75 char tmp[MEMSWAP_TMP_SIZE];
77 assert(!memoverlaps(a, n, b, n));
80 size_t m = n > MEMSWAP_TMP_SIZE ? MEMSWAP_TMP_SIZE : n;
92 bool memeqzero(const void *data, size_t length)
94 const unsigned char *p = data;
97 /* Check first 16 bytes manually */
98 for (len = 0; len < 16; len++) {
107 /* Now we know that's zero, memcmp with self. */
108 return memcmp(data, p, length) == 0;
111 void memtaint(void *data, size_t len)
113 /* Using 16 bytes is a bit quicker than 4 */
114 const unsigned tainter[]
115 = { 0xdeadbeef, 0xdeadbeef, 0xdeadbeef, 0xdeadbeef };
118 while (len >= sizeof(tainter)) {
119 memcpy(p, tainter, sizeof(tainter));
120 p += sizeof(tainter);
121 len -= sizeof(tainter);
123 memcpy(p, tainter, len);
125 #if HAVE_VALGRIND_MEMCHECK_H
126 VALGRIND_MAKE_MEM_UNDEFINED(data, len);