rolland Sat Oct 22 09:25:02 2005 EDT Modified files: /php-src/ext/standard string.c Log: - Unicode impl of strpbrk() http://cvs.php.net/diff.php/php-src/ext/standard/string.c?r1=1.500&r2=1.501&ty=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.500 php-src/ext/standard/string.c:1.501 --- php-src/ext/standard/string.c:1.500 Sat Oct 22 01:52:53 2005 +++ php-src/ext/standard/string.c Sat Oct 22 09:25:00 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.500 2005/10/22 05:52:53 rolland Exp $ */ +/* $Id: string.c,v 1.501 2005/10/22 13:25:00 rolland Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -6585,11 +6585,14 @@ Search a string for any of a set of characters */ PHP_FUNCTION(strpbrk) { - char *haystack, *char_list; - int haystack_len, char_list_len; - char *p; + void *haystack, *char_list; + int32_t haystack_len, char_list_len; + zend_uchar haystack_type, char_list_type; + void *p = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &haystack, &haystack_len, &char_list, &char_list_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "TT", + &haystack, &haystack_len, &haystack_type, + &char_list, &char_list_len, &char_list_type) == FAILURE) { RETURN_FALSE; } @@ -6598,8 +6601,36 @@ RETURN_FALSE; } - if ((p = strpbrk(haystack, char_list))) { - RETURN_STRINGL(p, (haystack + haystack_len - p), 1); + if (haystack_type == IS_UNICODE) { + int32_t i, j; + UChar32 ch1, ch2; + + for (i = 0 ; i < haystack_len ; ) { + U16_NEXT((UChar *)haystack, i, haystack_len, ch1); + for (j = 0 ; j < char_list_len ; ) { + U16_NEXT((UChar *)char_list, j, char_list_len, ch2); + if (ch1 == ch2) { + U16_BACK_1((UChar *)haystack, 0, i); + p = (UChar *)haystack + i; + break; + } + } + if (ch1 == ch2) { + break; + } + } + } else { + p = strpbrk((char *)haystack, (char *)char_list); + } + + if (p) { + if (haystack_type == IS_UNICODE) { + RETURN_UNICODEL((UChar *)p, ((UChar *)haystack + haystack_len - (UChar *)p), 1); + } else if (haystack_type == IS_BINARY) { + RETURN_BINARYL((char *)p, ((char *)haystack + haystack_len - (char *)p), 1); + } else { + RETURN_STRINGL((char *)p, ((char *)haystack + haystack_len - (char *)p), 1); + } } else { RETURN_FALSE; }
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php