Browse Source
memmem() is a nice GNU extension for searching a length limited string in another one. This compat version is based on the version found in glibc 2.2 (GPL 2); I only removed the optimization of checking the first char by hand, and generally tried to keep the code simple. We can add it back if memcmp shows up high in a profile, but for now I prefer to keep it (almost trivially) simple. Since I don't really know which platforms beside those with a glibc have their own memmem(), I used a heuristic: if NO_STRCASESTR is set, then NO_MEMMEM is set, too. Signed-off-by: Rene Scharfe <rene.scharfe@lsrfire.ath.cx> Signed-off-by: Junio C Hamano <gitster@pobox.com>maint


3 changed files with 46 additions and 0 deletions
@ -0,0 +1,29 @@
@@ -0,0 +1,29 @@
|
||||
#include "../git-compat-util.h" |
||||
|
||||
void *gitmemmem(const void *haystack, size_t haystack_len, |
||||
const void *needle, size_t needle_len) |
||||
{ |
||||
const char *begin = haystack; |
||||
const char *last_possible = begin + haystack_len - needle_len; |
||||
|
||||
/* |
||||
* The first occurrence of the empty string is deemed to occur at |
||||
* the beginning of the string. |
||||
*/ |
||||
if (needle_len == 0) |
||||
return (void *)begin; |
||||
|
||||
/* |
||||
* Sanity check, otherwise the loop might search through the whole |
||||
* memory. |
||||
*/ |
||||
if (haystack_len < needle_len) |
||||
return NULL; |
||||
|
||||
for (; begin <= last_possible; begin++) { |
||||
if (!memcmp(begin, needle, needle_len)) |
||||
return (void *)begin; |
||||
} |
||||
|
||||
return NULL; |
||||
} |
Loading…
Reference in new issue