iliaa Tue Jun 15 21:54:00 2004 EDT Modified files: (Branch: PHP_4_3) /php-src/ext/standard string.c Log: New & improved strspn() & strcspn(), ~30% in most cases. # In part based on patch by Alexander Valyalkin http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.333.2.40&r2=1.333.2.41&ty=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.333.2.40 php-src/ext/standard/string.c:1.333.2.41 --- php-src/ext/standard/string.c:1.333.2.40 Mon Jun 14 22:02:45 2004 +++ php-src/ext/standard/string.c Tue Jun 15 21:53:59 2004 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.333.2.40 2004/06/15 02:02:45 iliaa Exp $ */ +/* $Id: string.c,v 1.333.2.41 2004/06/16 01:53:59 iliaa Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -203,10 +203,10 @@ { char *s11, *s22; int len1, len2; - long start, len; - - start = 0; - len = 0; + long start = 0, len = 0; + unsigned char match[256] = {0}; + char *rs, *s, *e; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|ll", &s11, &len1, &s22, &len2, &start, &len) == FAILURE) { return; @@ -238,18 +238,17 @@ len = len1 - start; } - if (behavior == STR_STRSPN) { - RETURN_LONG(php_strspn(s11 + start /*str1_start*/, - s22 /*str2_start*/, - s11 + start + len /*str1_end*/, - s22 + len2 /*str2_end*/)); - } else if (behavior == STR_STRCSPN) { - RETURN_LONG(php_strcspn(s11 + start /*str1_start*/, - s22 /*str2_start*/, - s11 + start + len /*str1_end*/, - s22 + len2 /*str2_end*/)); + s = s22; + e = s22 + len2; + while (s < e) { + match[(int)(unsigned char)*s++] = 1; } - + + rs = s = s11 + start; + e = s11 + start + len; + while (s <= e && match[(int)(unsigned char)*s++] != behavior); + + RETURN_LONG((s - rs) < 1 ? 0 : s - rs - 1); } /* {{{ proto int strspn(string str, string mask [, start [, len]]) @@ -1289,42 +1288,6 @@ php_strtolower(s, s_len); php_strtolower(t, t_len); return php_memnstr(s, t, t_len, s + s_len); -} -/* }}} */ - -/* {{{ php_strspn - */ -PHPAPI size_t php_strspn(char *s1, char *s2, char *s1_end, char *s2_end) -{ - register const char *p = s1, *spanp; - register char c = *p; - -cont: - for (spanp = s2; p != s1_end && spanp != s2_end;) - if (*spanp++ == c) { - c = *(++p); - goto cont; - } - return (p - s1); -} -/* }}} */ - -/* {{{ php_strcspn - */ -PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end) -{ - register const char *p, *spanp; - register char c = *s1; - - for (p = s1;;) { - spanp = s2; - do { - if (*spanp == c || p == s1_end) - return p - s1; - } while (spanp++ < s2_end); - c = *++p; - } - /* NOTREACHED */ } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php