]> granicus.if.org Git - php/commitdiff
Drop memchr() in php_memnstr in favor of manual scanning. This reduces
authorSascha Schumann <sas@php.net>
Sat, 21 Jul 2001 03:26:31 +0000 (03:26 +0000)
committerSascha Schumann <sas@php.net>
Sat, 21 Jul 2001 03:26:31 +0000 (03:26 +0000)
the complexity of the function and is about 20% faster on Linux/x86.

ext/standard/php_string.h

index 7e0ea30dcb13252d0acc203e2039a47a84631658..7143ccf3be84a910b6ba745bc485564a8f624cb0 100644 (file)
@@ -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;
 }