一、FreeBDS
#include <string.h>
/*
* Find the first occurrence of the byte string s in byte string l.
*/
void *
memmem(const void *l, size_t l_len, const void *s, size_t s_len)
{
register char *cur, *last;
const char *cl = (const char *)l;
const char *cs = (const char *)s;
/* we need something to compare */
if (l_len == 0 || s_len == 0)
return NULL;
/* "s" must be smaller or equal to "l" */
if (l_len < s_len)
return NULL;
/* special case where s_len == 1 */
if (s_len == 1)
return memchr(l, (int)*cs, l_len);
/* the last position where its possible to find "s" in "l" */
last = (char *)cl + l_len - s_len;
for (cur = (char *)cl; cur <= last; cur++)
if (cur[0] == cs[0] && memcmp(cur, cs, s_len) == 0)
return cur;
return NULL;
}
二、其他实现
void *memmem(const void *start, unsigned int s_len, const void *find, unsigned int f_len)
{
char *p = (char *)start;
char *q = (char *)find;;
unsigned int len= 0;
if (s_len == 0 || f_len == 0)
return NULL;
if (s_len < f_len)
return NULL;
while((p - (char *)start + f_len) <= s_len)
{
while(*p++ == *q++)
{
len++;
if(len == f_len)
return(p - f_len);
};
q = (char *)find;
len = 0;
};
return NULL;
}