@@ -1596,16 +1596,15 @@ PHPAPI char *php_stristr(char *s, char *t, size_t s_len, size_t t_len)
15961596}
15971597/* }}} */
15981598
1599- /* {{{ php_strspn */
1600- PHPAPI size_t php_strspn (const char * haystack , const char * characters , const char * haystack_end , const char * characters_end )
1599+ static size_t php_strspn_strcspn_common (const char * haystack , const char * characters , const char * haystack_end , const char * characters_end , bool must_match )
16011600{
16021601 /* Fast path for short strings.
16031602 * The table lookup cannot be faster in this case because we not only have to compare, but also build the table.
16041603 * We only compare in this case.
16051604 * Empirically tested that the table lookup approach is only beneficial if characters is longer than 1 character. */
16061605 if (characters_end - characters == 1 ) {
16071606 const char * ptr = haystack ;
1608- while (ptr < haystack_end && * ptr == * characters ) {
1607+ while (ptr < haystack_end && ( * ptr == * characters ) == must_match ) {
16091608 ptr ++ ;
16101609 }
16111610 return ptr - haystack ;
@@ -1626,30 +1625,24 @@ PHPAPI size_t php_strspn(const char *haystack, const char *characters, const cha
16261625 }
16271626
16281627 const char * ptr = haystack ;
1629- while (ptr < haystack_end && table [(unsigned char ) * ptr ]) {
1628+ while (ptr < haystack_end && table [(unsigned char ) * ptr ] == must_match ) {
16301629 ptr ++ ;
16311630 }
16321631
16331632 return ptr - haystack ;
16341633}
1634+
1635+ /* {{{ php_strspn */
1636+ PHPAPI size_t php_strspn (const char * haystack , const char * characters , const char * haystack_end , const char * characters_end )
1637+ {
1638+ return php_strspn_strcspn_common (haystack , characters , haystack_end , characters_end , true);
1639+ }
16351640/* }}} */
16361641
16371642/* {{{ php_strcspn */
1638- PHPAPI size_t php_strcspn (const char * s1 , const char * s2 , const char * s1_end , const char * s2_end )
1643+ PHPAPI size_t php_strcspn (const char * haystack , const char * characters , const char * haystack_end , const char * characters_end )
16391644{
1640- const char * p , * spanp ;
1641- char c = * s1 ;
1642-
1643- for (p = s1 ;;) {
1644- spanp = s2 ;
1645- do {
1646- if (* spanp == c || p == s1_end ) {
1647- return p - s1 ;
1648- }
1649- } while (spanp ++ < (s2_end - 1 ));
1650- c = * ++ p ;
1651- }
1652- /* NOTREACHED */
1645+ return php_strspn_strcspn_common (haystack , characters , haystack_end , characters_end , false);
16531646}
16541647/* }}} */
16551648
0 commit comments