mirror of
https://github.com/php/php-src.git
synced 2026-03-24 00:02:20 +01:00
Optimize strcspn (#12594)
This commit is contained in:
@@ -48,6 +48,8 @@ PHP 8.4 UPGRADE NOTES
|
||||
. round() now validates the value of the $mode parameter and throws a ValueError
|
||||
for invalid modes. Previously invalid modes would have been interpreted as
|
||||
PHP_ROUND_HALF_UP.
|
||||
. strcspn() with empty $characters now returns the length of the string instead
|
||||
of incorrectly stopping at the first NUL character. See GH-12592.
|
||||
|
||||
- XML:
|
||||
. The xml_set_*_handler() functions now declare and check for an effective
|
||||
|
||||
@@ -1596,8 +1596,7 @@ PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len)
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ php_strspn */
|
||||
PHPAPI size_t php_strspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
|
||||
static size_t php_strspn_strcspn_common(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end, bool must_match)
|
||||
{
|
||||
/* Fast path for short strings.
|
||||
* The table lookup cannot be faster in this case because we not only have to compare, but also build the table.
|
||||
@@ -1605,7 +1604,7 @@ PHPAPI size_t php_strspn(const char *haystack, const char *characters, const cha
|
||||
* Empirically tested that the table lookup approach is only beneficial if characters is longer than 1 character. */
|
||||
if (characters_end - characters == 1) {
|
||||
const char *ptr = haystack;
|
||||
while (ptr < haystack_end && *ptr == *characters) {
|
||||
while (ptr < haystack_end && (*ptr == *characters) == must_match) {
|
||||
ptr++;
|
||||
}
|
||||
return ptr - haystack;
|
||||
@@ -1626,30 +1625,24 @@ PHPAPI size_t php_strspn(const char *haystack, const char *characters, const cha
|
||||
}
|
||||
|
||||
const char *ptr = haystack;
|
||||
while (ptr < haystack_end && table[(unsigned char) *ptr]) {
|
||||
while (ptr < haystack_end && table[(unsigned char) *ptr] == must_match) {
|
||||
ptr++;
|
||||
}
|
||||
|
||||
return ptr - haystack;
|
||||
}
|
||||
|
||||
/* {{{ php_strspn */
|
||||
PHPAPI size_t php_strspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
|
||||
{
|
||||
return php_strspn_strcspn_common(haystack, characters, haystack_end, characters_end, true);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
/* {{{ php_strcspn */
|
||||
PHPAPI size_t php_strcspn(const char *s1, const char *s2, const char *s1_end, const char *s2_end)
|
||||
PHPAPI size_t php_strcspn(const char *haystack, const char *characters, const char *haystack_end, const char *characters_end)
|
||||
{
|
||||
const char *p, *spanp;
|
||||
char c = *s1;
|
||||
|
||||
for (p = s1;;) {
|
||||
spanp = s2;
|
||||
do {
|
||||
if (*spanp == c || p == s1_end) {
|
||||
return p - s1;
|
||||
}
|
||||
} while (spanp++ < (s2_end - 1));
|
||||
c = *++p;
|
||||
}
|
||||
/* NOTREACHED */
|
||||
return php_strspn_strcspn_common(haystack, characters, haystack_end, characters_end, false);
|
||||
}
|
||||
/* }}} */
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ echo "Done\n";
|
||||
?>
|
||||
--EXPECT--
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(1)
|
||||
Done
|
||||
|
||||
@@ -156,8 +156,8 @@ int(21)
|
||||
int(16)
|
||||
|
||||
-- Itearation 9 --
|
||||
int(5)
|
||||
int(5)
|
||||
int(12)
|
||||
int(12)
|
||||
int(2)
|
||||
int(2)
|
||||
int(12)
|
||||
@@ -180,8 +180,8 @@ int(16)
|
||||
int(5)
|
||||
|
||||
-- Itearation 11 --
|
||||
int(0)
|
||||
int(0)
|
||||
int(2)
|
||||
int(2)
|
||||
int(2)
|
||||
int(2)
|
||||
int(2)
|
||||
@@ -192,8 +192,8 @@ int(2)
|
||||
int(2)
|
||||
|
||||
-- Itearation 12 --
|
||||
int(0)
|
||||
int(0)
|
||||
int(13)
|
||||
int(13)
|
||||
int(3)
|
||||
int(3)
|
||||
int(13)
|
||||
@@ -204,8 +204,8 @@ int(13)
|
||||
int(13)
|
||||
|
||||
-- Itearation 13 --
|
||||
int(0)
|
||||
int(0)
|
||||
int(14)
|
||||
int(14)
|
||||
int(3)
|
||||
int(3)
|
||||
int(14)
|
||||
@@ -216,8 +216,8 @@ int(14)
|
||||
int(6)
|
||||
|
||||
-- Itearation 14 --
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(11)
|
||||
int(2)
|
||||
int(2)
|
||||
int(11)
|
||||
@@ -228,8 +228,8 @@ int(11)
|
||||
int(11)
|
||||
|
||||
-- Itearation 15 --
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(11)
|
||||
int(2)
|
||||
int(2)
|
||||
int(11)
|
||||
@@ -240,8 +240,8 @@ int(11)
|
||||
int(11)
|
||||
|
||||
-- Itearation 16 --
|
||||
int(5)
|
||||
int(5)
|
||||
int(14)
|
||||
int(14)
|
||||
int(2)
|
||||
int(2)
|
||||
int(14)
|
||||
|
||||
@@ -650,20 +650,20 @@ int(0)
|
||||
int(16)
|
||||
|
||||
-- Iteration 9 --
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(12)
|
||||
int(11)
|
||||
int(10)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(12)
|
||||
int(12)
|
||||
int(11)
|
||||
int(10)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(12)
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
@@ -794,20 +794,20 @@ int(0)
|
||||
int(5)
|
||||
|
||||
-- Iteration 11 --
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(2)
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(2)
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
@@ -866,20 +866,20 @@ int(0)
|
||||
int(2)
|
||||
|
||||
-- Iteration 12 --
|
||||
int(0)
|
||||
int(5)
|
||||
int(4)
|
||||
int(0)
|
||||
int(13)
|
||||
int(12)
|
||||
int(11)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(5)
|
||||
int(4)
|
||||
int(0)
|
||||
int(13)
|
||||
int(13)
|
||||
int(12)
|
||||
int(11)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(13)
|
||||
int(3)
|
||||
int(2)
|
||||
int(1)
|
||||
@@ -938,20 +938,20 @@ int(0)
|
||||
int(13)
|
||||
|
||||
-- Iteration 13 --
|
||||
int(0)
|
||||
int(14)
|
||||
int(13)
|
||||
int(12)
|
||||
int(11)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(14)
|
||||
int(14)
|
||||
int(13)
|
||||
int(12)
|
||||
int(11)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(14)
|
||||
int(3)
|
||||
int(2)
|
||||
int(1)
|
||||
@@ -1010,20 +1010,20 @@ int(0)
|
||||
int(6)
|
||||
|
||||
-- Iteration 14 --
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(11)
|
||||
int(10)
|
||||
int(9)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(11)
|
||||
int(11)
|
||||
int(10)
|
||||
int(9)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(11)
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
@@ -1082,20 +1082,20 @@ int(0)
|
||||
int(11)
|
||||
|
||||
-- Iteration 15 --
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(11)
|
||||
int(10)
|
||||
int(9)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(11)
|
||||
int(11)
|
||||
int(10)
|
||||
int(9)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(11)
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
@@ -1154,20 +1154,20 @@ int(0)
|
||||
int(11)
|
||||
|
||||
-- Iteration 16 --
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(14)
|
||||
int(13)
|
||||
int(12)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(5)
|
||||
int(4)
|
||||
int(3)
|
||||
int(14)
|
||||
int(14)
|
||||
int(13)
|
||||
int(12)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(5)
|
||||
int(14)
|
||||
int(2)
|
||||
int(1)
|
||||
int(0)
|
||||
|
||||
@@ -1387,20 +1387,20 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(3)
|
||||
int(3)
|
||||
int(9)
|
||||
int(10)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -1417,26 +1417,26 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(3)
|
||||
int(3)
|
||||
int(9)
|
||||
int(10)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -1453,8 +1453,8 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -1603,9 +1603,16 @@ int(0)
|
||||
|
||||
-- Iteration 8 --
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
@@ -1614,7 +1621,10 @@ int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
@@ -1623,11 +1633,22 @@ int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
@@ -1636,7 +1657,10 @@ int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
@@ -1645,34 +1669,10 @@ int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(1)
|
||||
int(2)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -1821,40 +1821,28 @@ int(0)
|
||||
|
||||
-- Iteration 9 --
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
@@ -1865,24 +1853,32 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(1)
|
||||
int(0)
|
||||
int(1)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
@@ -1891,6 +1887,10 @@ int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -2041,20 +2041,20 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(9)
|
||||
int(10)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(3)
|
||||
int(3)
|
||||
int(8)
|
||||
int(9)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -2071,26 +2071,26 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(9)
|
||||
int(10)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(3)
|
||||
int(3)
|
||||
int(8)
|
||||
int(9)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -2107,8 +2107,8 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -2259,20 +2259,20 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(3)
|
||||
int(3)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -2289,26 +2289,26 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(4)
|
||||
int(4)
|
||||
int(11)
|
||||
int(12)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(3)
|
||||
int(3)
|
||||
int(10)
|
||||
int(11)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
@@ -2325,8 +2325,8 @@ int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
int(2)
|
||||
int(5)
|
||||
int(5)
|
||||
int(12)
|
||||
int(13)
|
||||
int(0)
|
||||
int(0)
|
||||
int(1)
|
||||
|
||||
@@ -145,8 +145,8 @@ int(26)
|
||||
int(26)
|
||||
|
||||
-- Iteration 6 --
|
||||
int(5)
|
||||
int(5)
|
||||
int(25)
|
||||
int(25)
|
||||
int(2)
|
||||
int(2)
|
||||
int(25)
|
||||
@@ -157,8 +157,8 @@ int(25)
|
||||
int(25)
|
||||
|
||||
-- Iteration 7 --
|
||||
int(5)
|
||||
int(5)
|
||||
int(27)
|
||||
int(27)
|
||||
int(2)
|
||||
int(2)
|
||||
int(27)
|
||||
|
||||
Reference in New Issue
Block a user