title: How can I search for substring in a buffer that contains null?
body: <p>Using C, I need to find a substring inside a buffer that may contain nulls.</p>
  
  <pre><code>haystack = "Some text\0\0\0\0 that has embedded nulls".
  needle   = "has embedded"r 
  </code></pre>
  
  <p>I need to return the start of the substring, or null, similat to strstr():</p>
  
  <pre><code>request_segment_end = mystrstr(request_segment_start, boundary);
  </code></pre>
  
  <p>Are there any existing implementations that you know of?</p>
  
  <p><strong>Update</strong></p>
  
  <p>I found implementations of memove on google's codesearch, which I've copied here verbatim, untested,</p>
  
  <pre><code> /*
   * 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 &lt;string.h&gt;
  
  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 &gt; n || !m || !n)
                  return NULL;
  
          if (1 != m) {
                  if (x[0] == x[1]) {
                          k = 2;
                          l = 1;
                  } else {
                          k = 1;
                          l = 2;
                  }
  
                  j = 0;
                  while (j &lt;= n - m) {
                          if (x[1] != y[j + 1]) {
                                  j += k;
                          } else {
                                  if (!memcmp(x + 2, y + j + 2, m - 2)
                                      &amp;&amp; x[0] == y[j])
                                          return (void *)&amp;y[j];
                                  j += l;
                          }
                  }
          } else
                  do {
                          if (*y == *x)
                                  return (void *)y;
                          y++;
                  } while (--n);
  
          return NULL;
  }
  </code></pre>