X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?p=elogind.git;a=blobdiff_plain;f=klibc%2Fklibc%2Fmemmem.c;h=8b5faa0014e8ad1323dd79bba2b3c45226ffe59f;hp=0f59938ffb1f6bba5d2a774f65577f20976ace19;hb=accff726856a0b3258a413d823a534f4f437e6b2;hpb=a41a0e28c2ba0abf99b5e7ea17645ae0e4f05758 diff --git a/klibc/klibc/memmem.c b/klibc/klibc/memmem.c index 0f59938ff..8b5faa001 100644 --- a/klibc/klibc/memmem.c +++ b/klibc/klibc/memmem.c @@ -13,32 +13,40 @@ 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; + const unsigned char *y = (const unsigned char *)haystack; + const unsigned char *x = (const unsigned char *)needle; - size_t j, k, l; + size_t j, k, l; - if ( m > n ) - return NULL; + if (m > n || !m || !n) + return NULL; - if ( x[0] == x[1] ) { - k = 2; - l = 1; - } else { - k = 1; - l = 2; - } + if (1 != m) { + 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; - } - } + 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; + } + } + } else + do { + if (*y == *x) + return (void *)y; + y++; + } while (--n); - return NULL; + return NULL; }