rolland Wed Oct 19 15:10:21 2005 EDT Modified files: /php-src/ext/standard string.c Log: - Unicode impl of str[c]spn() http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.497&r2=1.498&ty=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.497 php-src/ext/standard/string.c:1.498 --- php-src/ext/standard/string.c:1.497 Mon Oct 17 15:50:13 2005 +++ php-src/ext/standard/string.c Wed Oct 19 15:10:13 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.497 2005/10/17 19:50:13 rolland Exp $ */ +/* $Id: string.c,v 1.498 2005/10/19 19:10:13 rolland Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -209,14 +209,16 @@ static void php_spn_common_handler(INTERNAL_FUNCTION_PARAMETERS, int behavior) { - char *s11, *s22; - int len1, len2; - long start, len; + void *s1, *s2; + int32_t len1, len2; + zend_uchar type1, type2; + long start, len; /* For UNICODE, these are codepoint units */ start = 0; len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss|ll", &s11, &len1, - &s22, &len2, &start, &len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "TT|ll", + &s1, &len1, &type1, &s2, &len2, &type2, + &start, &len) == FAILURE) { return; } @@ -246,18 +248,40 @@ 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*/)); + if (type1 == IS_UNICODE) { + UChar *u_start, *u_end; + int32_t i = 0; + + U16_FWD_N((UChar*)s1, i, len1, start); + u_start = (UChar *)s1 + i; + U16_FWD_N((UChar *)s1, i, len1, len); + u_end = (UChar *)s1 + i; + + if (behavior == STR_STRSPN) { + RETURN_LONG(php_u_strspn(u_start /*str1_start*/, + (UChar *)s2 /*str2_start*/, + u_end /*str1_end*/, + (UChar *)s2 + len2 /*str2_end*/)); + } else if (behavior == STR_STRCSPN) { + RETURN_LONG(php_u_strcspn(u_start /*str1_start*/, + (UChar *)s2 /*str2_start*/, + u_end /*str1_end*/, + (UChar *)s2 + len2 /*str2_end*/)); + } + } else { + if (behavior == STR_STRSPN) { + RETURN_LONG(php_strspn((char *)s1 + start /*str1_start*/, + (char *)s2 /*str2_start*/, + (char *)s1 + start + len /*str1_end*/, + (char *)s2 + len2 /*str2_end*/)); + } else if (behavior == STR_STRCSPN) { + RETURN_LONG(php_strcspn((char *)s1 + start /*str1_start*/, + (char *)s2 /*str2_start*/, + (char *)s1 + start + len /*str1_end*/, + (char *)s2 + len2 /*str2_end*/)); + } } - + } /* {{{ proto int strspn(string str, string mask [, start [, len]]) @@ -1901,6 +1925,25 @@ } /* }}} */ +/* {{{ php_u_strspn + */ +PHPAPI int32_t php_u_strspn(UChar *s1, UChar *s2, UChar *s1_end, UChar *s2_end) +{ + int32_t len1 = s1_end - s1; + int32_t len2 = s2_end - s2; + int32_t i, codepts; + UChar32 ch; + + for (i = 0, codepts = 0 ; i < len1 ; codepts++) { + U16_NEXT(s1, i, len1, ch); + if (u_memchr32(s2, ch, len2) == NULL) { + break; + } + } + return codepts; +} +/* }}} */ + /* {{{ php_strspn */ PHPAPI size_t php_strspn(char *s1, char *s2, char *s1_end, char *s2_end) @@ -1919,6 +1962,25 @@ } /* }}} */ +/* {{{ php_u_strcspn + */ +PHPAPI int32_t php_u_strcspn(UChar *s1, UChar *s2, UChar *s1_end, UChar *s2_end) +{ + int32_t len1 = s1_end - s1; + int32_t len2 = s2_end - s2; + int32_t i, codepts; + UChar32 ch; + + for (i = 0, codepts = 0 ; i < len1 ; codepts++) { + U16_NEXT(s1, i, len1, ch); + if (u_memchr32(s2, ch, len2)) { + break; + } + } + return codepts; +} +/* }}} */ + /* {{{ php_strcspn */ PHPAPI size_t php_strcspn(char *s1, char *s2, char *s1_end, char *s2_end)
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php