summaryrefslogtreecommitdiff
path: root/ext/standard/string.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/standard/string.c')
-rw-r--r--ext/standard/string.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/ext/standard/string.c b/ext/standard/string.c
index c47b144119..60ab8e44a8 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -2737,11 +2737,12 @@ PHP_FUNCTION(lcfirst)
Uppercase the first character of every word in a string */
PHP_FUNCTION(ucwords)
{
- char *str;
+ char *str, *delims = " \t\r\n\f\v";
register char *r, *r_end;
- php_size_t str_len;
+ php_size_t str_len, delims_len = 6;
+ char mask[256];
- if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S", &str, &str_len) == FAILURE) {
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "S|S", &str, &str_len, &delims, &delims_len) == FAILURE) {
return;
}
@@ -2749,12 +2750,14 @@ PHP_FUNCTION(ucwords)
RETURN_EMPTY_STRING();
}
+ php_charmask((unsigned char *)delims, delims_len, mask TSRMLS_CC);
+
ZVAL_STRINGL(return_value, str, str_len, 1);
r = Z_STRVAL_P(return_value);
*r = toupper((unsigned char) *r);
for (r_end = r + Z_STRSIZE_P(return_value) - 1; r < r_end; ) {
- if (isspace((int) *(unsigned char *)r++)) {
+ if (mask[(unsigned char)*r++]) {
*r = toupper((unsigned char) *r);
}
}
@@ -3099,6 +3102,10 @@ static void php_strtr_array(zval *return_value, char *str, php_size_t slen, Hash
php_size_t patterns_len;
zend_llist *allocs;
+ if (zend_hash_num_elements(pats) == 0) {
+ RETURN_STRINGL(str, slen, 1);
+ }
+
S(&text) = str;
L(&text) = slen;