summaryrefslogtreecommitdiff
path: root/ext
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2005-11-29 16:14:19 +0000
committerIlia Alshanetsky <iliaa@php.net>2005-11-29 16:14:19 +0000
commit0242b892d2afdcd30ee22f3dcf13ec4cfa5b03e0 (patch)
tree17d61fc12b459c82099bb454cbf7321787059fef /ext
parentd61e8d63fd432f71ebf0edefcfeac34654456a0f (diff)
downloadphp-git-0242b892d2afdcd30ee22f3dcf13ec4cfa5b03e0.tar.gz
Fixed bug #35427 (str_word_count() handles '-' incorrectly).
Diffstat (limited to 'ext')
-rw-r--r--ext/standard/string.c31
-rw-r--r--ext/standard/tests/strings/str_word_count.phpt30
2 files changed, 46 insertions, 15 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 9ab31ba57f..d7913c49ce 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -4735,33 +4735,38 @@ PHP_FUNCTION(str_word_count)
if (type == 1 || type == 2) {
array_init(return_value);
}
-
+
+ /* first character cannot be ' or -, unless explicitly allowed by the user */
+ if ((*p == '\'' && (!char_list || !ch['\''])) || (*p == '-' && (!char_list || !ch['-']))) {
+ p++;
+ }
+ /* last character cannot be -, unless explicitly allowed by the user */
+ if (*(e - 1) == '-' && (!char_list || !ch['-'])) {
+ e--;
+ }
+
while (p < e) {
- if (isalpha(*p) || (char_list && ch[(unsigned char)*p])) {
- s = ++p - 1;
- while (isalpha(*p) || *p == '\'' || (*p == '-' && isalpha(*(p+1))) || (char_list && ch[(unsigned char)*p])) {
- p++;
- }
-
+ s = p;
+ while (p < e && (isalpha(*p) || (char_list && ch[(unsigned char)*p]) || *p == '\'' || *p == '-')) {
+ p++;
+ }
+ if (p > s) {
switch (type)
{
case 1:
buf = estrndup(s, (p-s));
- add_next_index_stringl(return_value, buf, (p-s), 1);
- efree(buf);
+ add_next_index_stringl(return_value, buf, (p-s), 0);
break;
case 2:
buf = estrndup(s, (p-s));
- add_index_stringl(return_value, (s - str), buf, p-s, 1);
- efree(buf);
+ add_index_stringl(return_value, (s - str), buf, p-s, 0);
break;
default:
word_count++;
break;
}
- } else {
- p++;
}
+ p++;
}
if (!type) {
diff --git a/ext/standard/tests/strings/str_word_count.phpt b/ext/standard/tests/strings/str_word_count.phpt
index 0c6c5ae566..9d41fc147b 100644
--- a/ext/standard/tests/strings/str_word_count.phpt
+++ b/ext/standard/tests/strings/str_word_count.phpt
@@ -36,7 +36,11 @@ var_dump(str_word_count($str2, 2, "014"));
var_dump(str_word_count($str2, 2, array()));
var_dump(str_word_count($str2, 2, new stdClass));
var_dump(str_word_count($str2, 2, ""));
-
+var_dump(str_word_count("foo'0 bar-0var", 2, "0"));
+var_dump(str_word_count("'foo'", 2));
+var_dump(str_word_count("'foo'", 2, "'"));
+var_dump(str_word_count("-foo-", 2));
+var_dump(str_word_count("-foo-", 2, "-"));
?>
--EXPECTF--
array(6) {
@@ -225,4 +229,26 @@ array(7) {
string(3) "bar"
[15]=>
string(3) "foo"
-} \ No newline at end of file
+}
+array(2) {
+ [0]=>
+ string(5) "foo'0"
+ [6]=>
+ string(8) "bar-0var"
+}
+array(1) {
+ [1]=>
+ string(4) "foo'"
+}
+array(1) {
+ [0]=>
+ string(5) "'foo'"
+}
+array(1) {
+ [1]=>
+ string(3) "foo"
+}
+array(1) {
+ [0]=>
+ string(5) "-foo-"
+}