From: Sascha Schumann Date: Sat, 21 Jul 2001 03:26:31 +0000 (+0000) Subject: Drop memchr() in php_memnstr in favor of manual scanning. This reduces X-Git-Tag: PRE_TSRM_MERGE_PATCH~48 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=09ce807bf1f97c13faa735b2712251902f42b18e;p=php Drop memchr() in php_memnstr in favor of manual scanning. This reduces the complexity of the function and is about 20% faster on Linux/x86. --- diff --git a/ext/standard/php_string.h b/ext/standard/php_string.h index 7e0ea30dcb..7143ccf3be 100644 --- a/ext/standard/php_string.h +++ b/ext/standard/php_string.h @@ -123,12 +123,18 @@ static inline char * php_memnstr(char *haystack, char *needle, int needle_len, char *end) { char *p = haystack; - char *s = NULL; - - for(; p <= end - needle_len && - (s = (char*)memchr(p, *needle, end - p - needle_len + 1)); p = s + 1) { - if(memcmp(s, needle, needle_len) == 0) - return s; + char first = *needle; + + /* let end point to the last character where needle may start */ + end -= needle_len; + + while (p <= end) { + while (*p != first) + if (++p > end) + return NULL; + if (memcmp(p, needle, needle_len) == 0) + return p; + p++; } return NULL; }