diff options
Diffstat (limited to 'contrib/syslinux-4.02/com32/lib/memmem.c')
-rw-r--r-- | contrib/syslinux-4.02/com32/lib/memmem.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/contrib/syslinux-4.02/com32/lib/memmem.c b/contrib/syslinux-4.02/com32/lib/memmem.c new file mode 100644 index 0000000..8558a80 --- /dev/null +++ b/contrib/syslinux-4.02/com32/lib/memmem.c @@ -0,0 +1,44 @@ +/* + * memmem.c + * + * Find a byte string inside a longer byte string + * + * This uses the "Not So Naive" algorithm, a very simple but + * usually effective algorithm, see: + * + * http://www-igm.univ-mlv.fr/~lecroq/string/ + */ + +#include <string.h> + +void *memmem(const void *haystack, size_t n, const void *needle, size_t m) +{ + const unsigned char *y = (const unsigned char *)haystack; + const unsigned char *x = (const unsigned char *)needle; + + size_t j, k, l; + + if (m > n) + return NULL; + + if (x[0] == x[1]) { + k = 2; + l = 1; + } else { + k = 1; + l = 2; + } + + j = 0; + while (j <= n - m) { + if (x[1] != y[j + 1]) { + j += k; + } else { + if (!memcmp(x + 2, y + j + 2, m - 2) && x[0] == y[j]) + return (void *)&y[j]; + j += l; + } + } + + return NULL; +} |