Commit:    0ea83ff8478d867ebf1603a43cd5d3432022cee7
Author:    Moriyoshi Koizumi <m...@mozo.jp>         Sun, 10 Feb 2013 15:04:23 
+0900
Parents:   92a7924c1a97563cb73d37c369fdea4794203397
Branches:  PHP-5.4

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=0ea83ff8478d867ebf1603a43cd5d3432022cee7

Log:
mb_split() can now handle empty matches like preg_split() does.

Changed paths:
  M  NEWS
  M  ext/mbstring/php_mbregex.c
  A  ext/mbstring/tests/mb_split_empty_match.phpt
  M  ext/mbstring/tests/mb_split_variation1.phpt


Diff:
diff --git a/NEWS b/NEWS
index 2aff180..e3b5075 100644
--- a/NEWS
+++ b/NEWS
@@ -5,6 +5,9 @@ PHP                                                             
           NEWS
 - CLI server:
   . Fixed bug #64128 (buit-in web server is broken on ppc64). (Remi)
 
+- Mbstring:
+  . mb_split() can now handle empty matches like preg_split() does. (Moriyoshi)
+
 ?? ??? 2012, PHP 5.4.12
 
 - Core:
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index a572bd4..145ee0c 100644
--- a/ext/mbstring/php_mbregex.c
+++ b/ext/mbstring/php_mbregex.c
@@ -1055,7 +1055,7 @@ PHP_FUNCTION(mb_split)
        php_mb_regex_t *re;
        OnigRegion *regs = NULL;
        char *string;
-       OnigUChar *pos;
+       OnigUChar *pos, *chunk_pos;
        int string_len;
 
        int n, err;
@@ -1065,8 +1065,8 @@ PHP_FUNCTION(mb_split)
                RETURN_FALSE;
        } 
 
-       if (count == 0) {
-               count = 1;
+       if (count > 0) {
+               count--;
        }
 
        /* create regex pattern buffer */
@@ -1076,31 +1076,30 @@ PHP_FUNCTION(mb_split)
 
        array_init(return_value);
 
-       pos = (OnigUChar *)string;
+       chunk_pos = pos = (OnigUChar *)string;
        err = 0;
        regs = onig_region_new();
        /* churn through str, generating array entries as we go */
-       while ((--count != 0) &&
-                  (err = onig_search(re, (OnigUChar *)string, (OnigUChar 
*)(string + string_len), pos, (OnigUChar *)(string + string_len), regs, 0)) >= 
0) {
-               if (regs->beg[0] == regs->end[0]) {
-                       php_error_docref(NULL TSRMLS_CC, E_WARNING, "Empty 
regular expression");
+       while (count != 0 && (pos - (OnigUChar *)string) < string_len) {
+               int beg, end;
+               err = onig_search(re, (OnigUChar *)string, (OnigUChar *)(string 
+ string_len), pos, (OnigUChar *)(string + string_len), regs, 0);
+               if (err < 0) {
                        break;
                }
-
+               beg = regs->beg[0], end = regs->end[0];
                /* add it to the array */
-               if (regs->beg[0] < string_len && regs->beg[0] >= (pos - 
(OnigUChar *)string)) {
-                       add_next_index_stringl(return_value, (char *)pos, 
((OnigUChar *)(string + regs->beg[0]) - pos), 1);
+               if ((pos - (OnigUChar *)string) < end) {
+                       if (beg < string_len && beg >= (chunk_pos - (OnigUChar 
*)string)) {
+                               add_next_index_stringl(return_value, (char 
*)chunk_pos, ((OnigUChar *)(string + beg) - chunk_pos), 1);
+                               --count;
+                       } else {
+                               err = -2;
+                               break;
+                       }
+                       /* point at our new starting point */
+                       chunk_pos = pos = (OnigUChar *)string + end;
                } else {
-                       err = -2;
-                       break;
-               }
-               /* point at our new starting point */
-               n = regs->end[0];
-               if ((pos - (OnigUChar *)string) < n) {
-                       pos = (OnigUChar *)string + n;
-               }
-               if (count < 0) {
-                       count = 0;
+                       pos++;
                }
                onig_region_free(regs, 0);
        }
@@ -1117,9 +1116,9 @@ PHP_FUNCTION(mb_split)
        }
 
        /* otherwise we just have one last element to add to the array */
-       n = ((OnigUChar *)(string + string_len) - pos);
+       n = ((OnigUChar *)(string + string_len) - chunk_pos);
        if (n > 0) {
-               add_next_index_stringl(return_value, (char *)pos, n, 1);
+               add_next_index_stringl(return_value, (char *)chunk_pos, n, 1);
        } else {
                add_next_index_stringl(return_value, "", 0, 1);
        }
diff --git a/ext/mbstring/tests/mb_split_empty_match.phpt 
b/ext/mbstring/tests/mb_split_empty_match.phpt
new file mode 100644
index 0000000..df3a22c
--- /dev/null
+++ b/ext/mbstring/tests/mb_split_empty_match.phpt
@@ -0,0 +1,23 @@
+--TEST--
+mb_split() empty match
+--
+--SKIPIF--
+<?php
+extension_loaded('mbstring') or die('skip');
+function_exists('mb_split') or die("skip mb_split() is not available in this 
build");
+?>
+--FILE--
+<?php
+mb_regex_set_options('m');
+var_dump(mb_split('^', "a\nb\nc"));
+--EXPECT--
+array(3) {
+  [0]=>
+  string(2) "a
+"
+  [1]=>
+  string(2) "b
+"
+  [2]=>
+  string(1) "c"
+}
diff --git a/ext/mbstring/tests/mb_split_variation1.phpt 
b/ext/mbstring/tests/mb_split_variation1.phpt
index be3230e..b508049 100644
--- a/ext/mbstring/tests/mb_split_variation1.phpt
+++ b/ext/mbstring/tests/mb_split_variation1.phpt
@@ -156,16 +156,12 @@ array(1) {
 }
 
 -- Iteration 10 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
 }
 
 -- Iteration 11 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
@@ -178,8 +174,6 @@ array(1) {
 }
 
 -- Iteration 13 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
@@ -192,24 +186,18 @@ array(1) {
 }
 
 -- Iteration 15 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
 }
 
 -- Iteration 16 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
 }
 
 -- Iteration 17 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
@@ -240,16 +228,12 @@ array(1) {
 }
 
 -- Iteration 22 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
 }
 
 -- Iteration 23 --
-
-Warning: mb_split(): Empty regular expression in %s on line %d
 array(1) {
   [0]=>
   string(13) "a b c d e f g"
@@ -259,4 +243,4 @@ array(1) {
 
 Warning: mb_split() expects parameter 1 to be string, resource given in %s on 
line %d
 bool(false)
-Done
\ No newline at end of file
+Done


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to