summaryrefslogtreecommitdiff
path: root/ext/mbstring
diff options
context:
space:
mode:
authorOndřej Surý <ondrej@sury.org>2013-02-25 16:29:09 +0100
committerOndřej Surý <ondrej@sury.org>2013-02-25 16:29:09 +0100
commit7ad1f708d5748e36de4b51088b377907e5ea01e7 (patch)
tree3f8a4c034747c921baf3b4118e2cc6ccc875fe43 /ext/mbstring
parent54098cf044025ec5965b8ea9c84750f9631d85b6 (diff)
downloadphp-7ad1f708d5748e36de4b51088b377907e5ea01e7.tar.gz
Imported Upstream version 5.5.0~alpha5upstream/5.5.0_alpha5
Diffstat (limited to 'ext/mbstring')
-rw-r--r--ext/mbstring/php_mbregex.c45
-rw-r--r--ext/mbstring/tests/empty_pattern.phpt2
-rw-r--r--ext/mbstring/tests/mb_split_empty_match.phpt23
-rw-r--r--ext/mbstring/tests/mb_split_variation1.phpt18
4 files changed, 46 insertions, 42 deletions
diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c
index a572bd41d..145ee0c13 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/empty_pattern.phpt b/ext/mbstring/tests/empty_pattern.phpt
index e395604f8..10b03309b 100644
--- a/ext/mbstring/tests/empty_pattern.phpt
+++ b/ext/mbstring/tests/empty_pattern.phpt
@@ -13,6 +13,4 @@ mb_ereg_search_regs();
--EXPECTF--
Warning: mb_ereg_search_init(): Empty pattern in %s on line %d
-Warning: mb_split(): Empty regular expression in %s on line %d
-
Warning: mb_ereg_search_regs(): No regex given in %s on line %d
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 000000000..df3a22ce5
--- /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 be3230e96..b50804996 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