16 #include <my_global.h>
26 void *my_memmem(
const void *haystack,
size_t haystacklen,
27 const void *needle,
size_t needlelen)
29 const unsigned char *
cursor;
30 const unsigned char *last_possible_needle_location =
31 (
unsigned char *)haystack + haystacklen - needlelen;
34 if (needlelen > haystacklen)
return(NULL);
35 if (needle == NULL)
return(NULL);
36 if (haystack == NULL)
return(NULL);
37 if (needlelen == 0)
return(NULL);
38 if (haystacklen == 0)
return(NULL);
40 for (cursor = haystack; cursor <= last_possible_needle_location; cursor++) {
41 if (memcmp(needle, cursor, needlelen) == 0) {
53 int main(
int argc,
char *argv[]) {
54 char haystack[10], needle[3];
56 memmove(haystack,
"0123456789", 10);
58 memmove(needle,
"no", 2);
59 assert(my_memmem(haystack, 10, needle, 2) == NULL);
61 memmove(needle,
"345", 3);
62 assert(my_memmem(haystack, 10, needle, 3) != NULL);
64 memmove(needle,
"789", 3);
65 assert(my_memmem(haystack, 10, needle, 3) != NULL);
66 assert(my_memmem(haystack, 9, needle, 3) == NULL);
68 memmove(needle,
"012", 3);
69 assert(my_memmem(haystack, 10, needle, 3) != NULL);
70 assert(my_memmem(NULL, 10, needle, 3) == NULL);
72 assert(my_memmem(NULL, 10, needle, 3) == NULL);
73 assert(my_memmem(haystack, 0, needle, 3) == NULL);
74 assert(my_memmem(haystack, 10, NULL, 3) == NULL);
75 assert(my_memmem(haystack, 10, needle, 0) == NULL);
77 assert(my_memmem(haystack, 1, needle, 3) == NULL);