andrei Wed Aug 9 20:19:06 2006 UTC Modified files: /php-src/ext/standard string.c /php-src unicode-progress.txt Log: Unicode support for str_shuffle(). http://cvs.php.net/viewvc.cgi/php-src/ext/standard/string.c?r1=1.571&r2=1.572&diff_format=u Index: php-src/ext/standard/string.c diff -u php-src/ext/standard/string.c:1.571 php-src/ext/standard/string.c:1.572 --- php-src/ext/standard/string.c:1.571 Wed Aug 9 20:03:21 2006 +++ php-src/ext/standard/string.c Wed Aug 9 20:19:06 2006 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: string.c,v 1.571 2006/08/09 20:03:21 andrei Exp $ */ +/* $Id: string.c,v 1.572 2006/08/09 20:19:06 andrei Exp $ */ /* Synced with php 3.0 revision 1.193 1999-06-16 [ssb] */ @@ -6821,46 +6821,55 @@ /* }}} */ -static void php_string_shuffle(char *str, long len TSRMLS_DC) +static void php_string_shuffle(zstr str, int len, zend_uchar str_type TSRMLS_DC) { - long n_elems, rnd_idx, n_left; + int rnd_idx, n_left; char temp; + UChar u_temp; /* The implementation is stolen from array_data_shuffle */ /* Thus the characteristics of the randomization are the same */ - n_elems = len; - if (n_elems <= 1) { + if (len <= 1) { return; } - n_left = n_elems; + n_left = len; while (--n_left) { rnd_idx = php_rand(TSRMLS_C); RAND_RANGE(rnd_idx, 0, n_left, PHP_RAND_MAX); - if (rnd_idx != n_left) { - temp = str[n_left]; - str[n_left] = str[rnd_idx]; - str[rnd_idx] = temp; + if (str_type == IS_UNICODE) { + if (rnd_idx != n_left) { + u_temp = str.u[n_left]; + str.u[n_left] = str.u[rnd_idx]; + str.u[rnd_idx] = u_temp; + } + } else { + if (rnd_idx != n_left) { + temp = str.s[n_left]; + str.s[n_left] = str.s[rnd_idx]; + str.s[rnd_idx] = temp; + } } } } -/* {{{ proto void str_shuffle(string str) +/* {{{ proto void str_shuffle(string str) U Shuffles string. One permutation of all possible is created */ PHP_FUNCTION(str_shuffle) { - zval **arg; + zstr str; + int str_len; + zend_uchar str_type; - if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &arg)) { - WRONG_PARAM_COUNT; + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "t", &str, &str_len, &str_type) == FAILURE) { + return; } - convert_to_string_ex(arg); - RETVAL_ZVAL(*arg, 1, 0); - if (Z_STRLEN_P(return_value) > 1) { - php_string_shuffle(Z_STRVAL_P(return_value), (long) Z_STRLEN_P(return_value) TSRMLS_CC); + RETVAL_ZSTRL(str, str_len, str_type, 1); + if (Z_UNILEN_P(return_value) > 1) { + php_string_shuffle(Z_UNIVAL_P(return_value), Z_UNILEN_P(return_value), Z_TYPE_P(return_value) TSRMLS_CC); } } /* }}} */ http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.40&r2=1.41&diff_format=u Index: php-src/unicode-progress.txt diff -u php-src/unicode-progress.txt:1.40 php-src/unicode-progress.txt:1.41 --- php-src/unicode-progress.txt:1.40 Wed Aug 9 20:03:22 2006 +++ php-src/unicode-progress.txt Wed Aug 9 20:19:06 2006 @@ -52,9 +52,6 @@ Params API, IS_UNICODE upgrade. Case-folding should be handled similar to stristr(). - str_shuffle() - Params API, IS_UNICODE support - str_split() IS_UNICODE support, split on codepoint level. @@ -194,6 +191,7 @@ str_pad() str_repeat() str_rot13() + str_shuffle() strcspn() strip_tags() stripcslashes()
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php