MINOR: tools: function my_memmem() to lookup binary contents

This function simply looks for a memory block inside another one.

Signed-off-by: Baptiste Assmann <bedis9@gmail.com>
This commit is contained in:
Baptiste Assmann 2013-10-06 23:24:13 +02:00 committed by Willy Tarreau
parent 126d40691a
commit bb77c8e26d
2 changed files with 31 additions and 0 deletions

View File

@ -519,6 +519,12 @@ int parse_binary(const char *source, char **binstr, int *binstrlen, char **err);
/* copies at most <n> characters from <src> and always terminates with '\0' */
char *my_strndup(const char *src, int n);
/*
* search needle in haystack
* returns the pointer if found, returns NULL otherwise
*/
const void *my_memmem(const void *, size_t, const void *, size_t);
/* This function returns the first unused key greater than or equal to <key> in
* ID tree <root>. Zero is returned if no place is found.
*/

View File

@ -1415,6 +1415,31 @@ char *my_strndup(const char *src, int n)
return ret;
}
/*
* search needle in haystack
* returns the pointer if found, returns NULL otherwise
*/
const void *my_memmem(const void *haystack, size_t haystacklen, const void *needle, size_t needlelen)
{
const void *c = NULL;
unsigned char f;
if ((haystack == NULL) || (needle == NULL) || (haystacklen < needlelen))
return NULL;
f = *(char *)needle;
c = haystack;
while ((c = memchr(c, f, haystacklen - (c - haystack))) != NULL) {
if ((haystacklen - (c - haystack)) < needlelen)
return NULL;
if (memcmp(c, needle, needlelen) == 0)
return c;
++c;
}
return NULL;
}
/* This function returns the first unused key greater than or equal to <key> in
* ID tree <root>. Zero is returned if no place is found.
*/