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;