Implementation of strstr in glibc

What is the implementation of strstr in glibc?

Implementation of `STRSTR` in glibc (string/strstr.c):

``````/* Return the first occurrence of NEEDLE in HAYSTACK.  Return HAYSTACK
if NEEDLE is empty, otherwise NULL if NEEDLE is not found in
HAYSTACK.  */
char *
STRSTR (const char *haystack_start, const char *needle_start)
{
const char *haystack = haystack_start;
const char *needle = needle_start;
size_t needle_len; /* Length of NEEDLE.  */
size_t haystack_len; /* Known minimum length of HAYSTACK.  */
bool ok = true; /* True if NEEDLE is prefix of HAYSTACK.  */

/* Determine length of NEEDLE, and in the process, make sure
HAYSTACK is at least as long (no point processing all of a long
NEEDLE if HAYSTACK is too short).  */
while (*haystack && *needle)
ok &= *haystack++ == *needle++;
if (*needle)
return NULL;
if (ok)
return (char *) haystack_start;

/* Reduce the size of haystack using strchr, since it has a smaller
linear coefficient than the Two-Way algorithm.  */
needle_len = needle - needle_start;
haystack = strchr (haystack_start + 1, *needle_start);
if (!haystack || __builtin_expect (needle_len == 1, 0))
return (char *) haystack;
needle -= needle_len;
haystack_len = (haystack > haystack_start + needle_len ? 1
: needle_len + haystack_start - haystack);

/* Perform the search.  Abstract memory is considered to be an array
of 'unsigned char' values, not an array of 'char' values.  See
ISO C 99 section 6.2.6.1.  */
if (needle_len < LONG_NEEDLE_THRESHOLD)
return two_way_short_needle ((const unsigned char *) haystack,
haystack_len,
(const unsigned char *) needle, needle_len);
return two_way_long_needle ((const unsigned char *) haystack, haystack_len,
(const unsigned char *) needle, needle_len);
}
``````

The implementation of `two_way_short_needle` and `two_way_long_needle` can be found in string/str-two-way.h.

Please share if you like this post:

Eric Ma

Eric is a systems guy. Eric is interested in building high-performance and scalable distributed systems and related technologies. The views or opinions expressed here are solely Eric's own and do not necessarily represent those of any third parties.