Fix for bug #34407 - ucwords and title case
authorTjerk Meesters <datibbaw@php.net>
Wed, 2 Jul 2014 14:22:11 +0000 (22:22 +0800)
committerTjerk Meesters <datibbaw@php.net>
Sat, 12 Jul 2014 02:44:11 +0000 (10:44 +0800)
Added support for ranges like trim() has

ext/standard/basic_functions.c
ext/standard/string.c
ext/standard/tests/strings/ucwords_error.phpt
ext/standard/tests/strings/ucwords_variation5.phpt [new file with mode: 0644]

index 4d4354d4ad639e6454d2aac845a879380bb1a584..9a9df3094bec559376bacfbb9e6737c28f91dfda 100644 (file)
@@ -2309,8 +2309,9 @@ ZEND_BEGIN_ARG_INFO(arginfo_lcfirst, 0)
        ZEND_ARG_INFO(0, str)
 ZEND_END_ARG_INFO()
        
-ZEND_BEGIN_ARG_INFO(arginfo_ucwords, 0)
+ZEND_BEGIN_ARG_INFO_EX(arginfo_ucwords, 0, 0, 1)
        ZEND_ARG_INFO(0, str)
+       ZEND_ARG_INFO(0, delimiters)
 ZEND_END_ARG_INFO()
 
 ZEND_BEGIN_ARG_INFO_EX(arginfo_strtr, 0, 0, 2)
index 22b1957f1e0d6eed44104c633cda587892f2b6a0..7bc21598712267d90c4feaf5bba1ed012cb6237f 100644 (file)
@@ -2742,11 +2742,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;
-       int str_len;
+       int 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;
        }
 
@@ -2754,12 +2755,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_STRLEN_P(return_value) - 1; r < r_end; ) {
-               if (isspace((int) *(unsigned char *)r++)) {
+               if (mask[(unsigned char)*r++]) {
                        *r = toupper((unsigned char) *r);
                }
        }
index d79e569cc7bbe34457488147ab4cac0048aa329d..a01c688c4a543fdacbb212f97296b344bae6e013 100644 (file)
@@ -18,7 +18,7 @@ echo "\n-- Testing ucwords() function with more than expected no. of arguments -
 $str = 'string_val';
 $extra_arg = 10;
 
-var_dump( ucwords($str, $extra_arg) );
+var_dump( ucwords($str, $extra_arg, $extra_arg) );
 
 // check if there were any changes made to $str
 var_dump($str);
@@ -30,12 +30,12 @@ echo "Done\n";
 
 -- Testing ucwords() function with Zero arguments --
 
-Warning: ucwords() expects exactly 1 parameter, 0 given in %s on line %d
+Warning: ucwords() expects at least 1 parameter, 0 given in %s on line %d
 NULL
 
 -- Testing ucwords() function with more than expected no. of arguments --
 
-Warning: ucwords() expects exactly 1 parameter, 2 given in %s on line %d
+Warning: ucwords() expects at most 2 parameters, 3 given in %s on line %d
 NULL
 string(10) "string_val"
 Done
diff --git a/ext/standard/tests/strings/ucwords_variation5.phpt b/ext/standard/tests/strings/ucwords_variation5.phpt
new file mode 100644 (file)
index 0000000..985df47
--- /dev/null
@@ -0,0 +1,25 @@
+--TEST--
+Test ucwords() function : usage variations - custom delimiters
+--FILE--
+<?php
+/* Prototype  : string ucwords ( string $str )
+ * Description: Uppercase the first character of each word in a string
+ * Source code: ext/standard/string.c
+*/
+
+echo "*** Testing ucwords() : usage variations ***\n";
+
+var_dump(ucwords('testing-dashed-words', '-'));
+var_dump(ucwords('test(braced)words', '()'));
+var_dump(ucwords('testing empty delimiters', ''));
+var_dump(ucwords('testing ranges', 'a..e'));
+
+echo "Done\n";
+?>
+--EXPECTF--
+*** Testing ucwords() : usage variations ***
+string(%d) "Testing-Dashed-Words"
+string(%d) "Test(Braced)Words"
+string(%d) "Testing empty delimiters"
+string(%d) "TeSting raNgeS"
+Done