diff options
author | hpa <hpa> | 2004-11-10 22:31:50 +0000 |
---|---|---|
committer | hpa <hpa> | 2004-11-10 22:31:50 +0000 |
commit | 17f967640cef484f83d755c9dd016a946711236f (patch) | |
tree | 00bf0c0f2926cd6a9761eb372b55d090305aca44 /com32/lib/memmem.c | |
parent | c67a2ac96611fa6aeb9ff3602c5e0c8265f1cc9d (diff) | |
download | syslinux-17f967640cef484f83d755c9dd016a946711236f.tar.gz |
Very first cut at a klibc-derived C library for com32
Diffstat (limited to 'com32/lib/memmem.c')
-rw-r--r-- | com32/lib/memmem.c | 44 |
1 files changed, 44 insertions, 0 deletions
diff --git a/com32/lib/memmem.c b/com32/lib/memmem.c new file mode 100644 index 00000000..0f59938f --- /dev/null +++ b/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; +} |