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

Reply via email to