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