| /* |
| * Copyright (C) 2002 Manuel Novoa III |
| * Copyright (C) 2000-2005 Erik Andersen <andersen@uclibc.org> |
| * |
| * Licensed under the LGPL v2.1, see the file COPYING.LIB in this tarball. |
| */ |
| |
| #include "_string.h" |
| |
| #ifdef __USE_GNU |
| void *memmem(const void *haystack, size_t haystacklen, |
| const void *needle, size_t needlelen) |
| { |
| register const char *ph; |
| register const char *pn; |
| const char *plast; |
| size_t n; |
| |
| if (needlelen == 0) { |
| return (void *) haystack; |
| } |
| |
| if (haystacklen >= needlelen) { |
| ph = (const char *) haystack; |
| pn = (const char *) needle; |
| plast = ph + (haystacklen - needlelen); |
| |
| do { |
| n = 0; |
| while (ph[n] == pn[n]) { |
| if (++n == needlelen) { |
| return (void *) ph; |
| } |
| } |
| } while (++ph <= plast); |
| } |
| |
| return NULL; |
| } |
| #endif |