91c9961a52ecd92d1372dae98b07f54902e25f22
[ccan] / ccan / mem / mem.c
1 /* CC0 (Public domain) - see LICENSE file for details */
2
3 #include "config.h"
4
5 #include <string.h>
6 #include <ccan/mem/mem.h>
7
8 #if !HAVE_MEMMEM
9 void *memmem(const void *haystack, size_t haystacklen,
10              const void *needle, size_t needlelen)
11 {
12         const char *p;
13
14         if (needlelen > haystacklen)
15                 return NULL;
16
17         p = haystack;
18
19         for (p = haystack;
20              (p + needlelen) <= ((const char *)haystack + haystacklen);
21              p++)
22                 if (memcmp(p, needle, needlelen) == 0)
23                         return (void *)p;
24
25         return NULL;
26 }
27 #endif
28
29 #if !HAVE_MEMRCHR
30 void *memrchr(const void *s, int c, size_t n)
31 {
32         unsigned char *p = (unsigned char *)s;
33
34         while (n) {
35                 if (p[n-1] == c)
36                         return p + n - 1;
37                 n--;
38         }
39
40         return NULL;
41 }
42 #endif
43
44 void *mempbrkm(const void *data_, size_t len, const void *accept_, size_t accept_len)
45 {
46         const char *data = data_, *accept = accept_;
47         size_t i, j;
48
49         for (i = 0; i < len; i++)
50                 for (j = 0; j < accept_len; j++)
51                         if (accept[j] == data[i])
52                                 return (void *)&data[i];
53         return NULL;
54 }
55
56 void *memcchr(void const *data, int c, size_t data_len)
57 {
58         char const *p = data;
59         size_t i;
60
61         for (i = 0; i < data_len; i++)
62                 if (p[i] != c)
63                         return (void *)&p[i];
64
65         return NULL;
66 }