andrei          Fri Jul 14 22:15:54 2006 UTC

  Modified files:              
    /php-src    unicode-progress.txt 
    /php-src/ext/standard       array.c 
  Log:
  - Simplify array_combine() and adjust for params API
  - Adjust array_count_values() and array_rand() for params API and mark
    with U
  
  
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.22&r2=1.23&diff_format=u
Index: php-src/unicode-progress.txt
diff -u php-src/unicode-progress.txt:1.22 php-src/unicode-progress.txt:1.23
--- php-src/unicode-progress.txt:1.22   Fri Jul 14 21:16:30 2006
+++ php-src/unicode-progress.txt        Fri Jul 14 22:15:54 2006
@@ -10,12 +10,6 @@
     Need to fix string_compare_function() to compare Unicode strings
     directly in code point order
 
-    array_combine()
-        Handle IS_UNICODE/IS_STRING keys via add_u_assoc_zval()
-
-    array_count_values()
-        Params API, minor Unicode updates, test
-
     array_diff(), array_udiff()
     array_diff_assoc(), array_diff_uassoc(), array_udiff_assoc(), 
array_udiff_uassoc()
     array_diff_key(), array_diff_ukey()
@@ -40,9 +34,6 @@
     array_pad()
         Params API, test
 
-    array_rand()
-        Params API, test
-
     array_reduce()
         Params API, FCI cache, test
 
@@ -76,6 +67,8 @@
   -------
     array_change_key_case()
     array_chunk() 
+    array_combine()
+    array_count_values()
     array_fill()
     array_flip()
     array_key_exists()
@@ -84,6 +77,7 @@
     array_merge_recursive()
     array_product()
     array_push(), array_pop(), array_shift(), array_unshift()
+    array_rand()
     array_search()
     array_slice()
     array_splice()
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.360&r2=1.361&diff_format=u
Index: php-src/ext/standard/array.c
diff -u php-src/ext/standard/array.c:1.360 php-src/ext/standard/array.c:1.361
--- php-src/ext/standard/array.c:1.360  Fri Jul 14 21:16:30 2006
+++ php-src/ext/standard/array.c        Fri Jul 14 22:15:54 2006
@@ -21,7 +21,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: array.c,v 1.360 2006/07/14 21:16:30 andrei Exp $ */
+/* $Id: array.c,v 1.361 2006/07/14 22:15:54 andrei Exp $ */
 
 #include "php.h"
 #include "php_ini.h"
@@ -2549,23 +2549,17 @@
 /* }}} */
 
 
-/* {{{ proto array array_count_values(array input)
+/* {{{ proto array array_count_values(array input) U
    Return the value as key and the frequency of that value in input as value */
 PHP_FUNCTION(array_count_values)
 {
-       zval    **input,                /* Input array */
-               **entry,                /* An entry in the input array */
-               **tmp;
+       zval    *input,                 /* Input array */
+                       **entry,                /* An entry in the input array 
*/
+                       **tmp;
        HashTable *myht;
        HashPosition pos;
        
-       /* Get arguments and do error-checking */
-       if (ZEND_NUM_ARGS() != 1 || zend_get_parameters_ex(1, &input) == 
FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
-       
-       if (Z_TYPE_PP(input) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "The argument 
should be an array");
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a", &input) == 
FAILURE) {
                return;
        }
        
@@ -2573,7 +2567,7 @@
        array_init(return_value);
 
        /* Go through input array and add values to the return array */ 
-       myht = Z_ARRVAL_PP(input);
+       myht = Z_ARRVAL_P(input);
        zend_hash_internal_pointer_reset_ex(myht, &pos);
        while (zend_hash_get_current_data_ex(myht, (void **)&entry, &pos) == 
SUCCESS) {
                if (Z_TYPE_PP(entry) == IS_LONG) {
@@ -3933,52 +3927,43 @@
 /* }}} */
 
 
-/* {{{ proto mixed array_rand(array input [, int num_req])
+/* {{{ proto mixed array_rand(array input [, int num_req]) U
    Return key/keys for random entry/entries in the array */
 PHP_FUNCTION(array_rand)
 {
-       zval **input, **num_req;
-       long randval;
-       int num_req_val, num_avail, key_type;
+       zval *input;
+       long randval, num_req = 1;
+       int num_avail, key_type;
        zstr string_key;
        uint string_key_len;
        ulong num_key;
        HashPosition pos;
 
-       if (ZEND_NUM_ARGS() < 1 || ZEND_NUM_ARGS() > 2 ||
-               zend_get_parameters_ex(ZEND_NUM_ARGS(), &input, &num_req) == 
FAILURE) {
-               WRONG_PARAM_COUNT;
-       }
-
-       if (Z_TYPE_PP(input) != IS_ARRAY) {
-               php_error_docref(NULL TSRMLS_CC, E_WARNING, "First argument has 
to be an array");
+       if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|l", &input, 
&num_req) == FAILURE) {
                return;
        }
 
-       num_avail = zend_hash_num_elements(Z_ARRVAL_PP(input));
+       num_avail = zend_hash_num_elements(Z_ARRVAL_P(input));
 
        if (ZEND_NUM_ARGS() > 1) {
-               convert_to_long_ex(num_req);
-               num_req_val = Z_LVAL_PP(num_req);
-               if (num_req_val <= 0 || num_req_val > num_avail) {
+               if (num_req <= 0 || num_req > num_avail) {
                        php_error_docref(NULL TSRMLS_CC, E_WARNING, "Second 
argument has to be between 1 and the number of elements in the array");
                        return;
                }
-       } else
-               num_req_val = 1;
+       }
 
        /* Make the return value an array only if we need to pass back more 
than one result. */
-       if (num_req_val > 1) {
+       if (num_req > 1) {
                array_init(return_value);
        }
 
        /* We can't use zend_hash_index_find() because the array may have 
string keys or gaps. */
-       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(input), &pos);
-       while (num_req_val && (key_type = 
zend_hash_get_current_key_ex(Z_ARRVAL_PP(input), &string_key, &string_key_len, 
&num_key, 0, &pos)) != HASH_KEY_NON_EXISTANT) {
+       zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &pos);
+       while (num_req && (key_type = 
zend_hash_get_current_key_ex(Z_ARRVAL_P(input), &string_key, &string_key_len, 
&num_key, 0, &pos)) != HASH_KEY_NON_EXISTANT) {
 
                randval = php_rand(TSRMLS_C);
 
-               if ((double)(randval/(PHP_RAND_MAX+1.0)) < 
(double)num_req_val/(double)num_avail) {
+               if ((double)(randval/(PHP_RAND_MAX+1.0)) < 
(double)num_req/(double)num_avail) {
                        /* If we are returning a single result, just do it. */
                        if (Z_TYPE_P(return_value) != IS_ARRAY) {
                                if (key_type == HASH_KEY_IS_STRING) {
@@ -3997,13 +3982,13 @@
                                else
                                        add_next_index_long(return_value, 
num_key);
                        }
-                       num_req_val--;
+                       num_req--;
                }
                num_avail--;
-               zend_hash_move_forward_ex(Z_ARRVAL_PP(input), &pos);
+               zend_hash_move_forward_ex(Z_ARRVAL_P(input), &pos);
        }
 
-       if (num_req_val == num_avail) {
+       if (num_req == num_avail) {
                array_data_shuffle(return_value TSRMLS_CC);
        }
 }
@@ -4577,24 +4562,28 @@
 }
 /* }}} */
 
-/* {{{ proto array array_combine(array keys, array values)
-   Creates an array by using the elements of the first parameter as keys and 
the elements of the second as correspoding keys */
+/* {{{ proto array array_combine(array keys, array values) U
+   Creates an array by using the elements of the first parameter as keys and 
the elements of the second as the correspoding values */
 PHP_FUNCTION(array_combine)
 {
        zval *values, *keys;
        HashPosition pos_values, pos_keys;
        zval **entry_keys, **entry_values;
+       int num_keys, num_values;
        
        if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "aa", &keys, 
&values) == FAILURE) {
                return;
        }
 
-       if (zend_hash_num_elements(Z_ARRVAL_P(keys)) != 
zend_hash_num_elements(Z_ARRVAL_P(values))) {
+       num_keys = zend_hash_num_elements(Z_ARRVAL_P(keys));
+       num_values = zend_hash_num_elements(Z_ARRVAL_P(values));
+
+       if (num_keys != num_values) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Both parameters 
should have equal number of elements");
                RETURN_FALSE;
        }
 
-       if (!zend_hash_num_elements(Z_ARRVAL_P(keys))) {
+       if (!num_keys) {
                php_error_docref(NULL TSRMLS_CC, E_WARNING, "Both parameters 
should have at least 1 element");
                RETURN_FALSE;
        }
@@ -4605,24 +4594,30 @@
        zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(values), &pos_values);
        while (zend_hash_get_current_data_ex(Z_ARRVAL_P(keys), (void 
**)&entry_keys, &pos_keys) == SUCCESS &&
                 zend_hash_get_current_data_ex(Z_ARRVAL_P(values), (void 
**)&entry_values, &pos_values) == SUCCESS) {
-               if (Z_TYPE_PP(entry_keys) == IS_STRING) {
-                       zval_add_ref(entry_values);
-                       add_assoc_zval(return_value, Z_STRVAL_PP(entry_keys), 
*entry_values);
-               } else if (Z_TYPE_PP(entry_keys) == IS_LONG) {
+
+               if (Z_TYPE_PP(entry_keys) == IS_LONG) {
                        zval_add_ref(entry_values);
                        add_index_zval(return_value, Z_LVAL_PP(entry_keys), 
*entry_values);
                } else {
-                       zval key;
+                       zval key, *key_ptr = *entry_keys;
+
+                       if (Z_TYPE_PP(entry_keys) != IS_STRING &&
+                               Z_TYPE_PP(entry_keys) != IS_UNICODE) {
 
-                       key = **entry_keys;
-                       zval_copy_ctor(&key);
-                       convert_to_string(&key);
+                               key = **entry_keys;
+                               zval_copy_ctor(&key);
+                               convert_to_text(&key);
+                               key_ptr = &key;
+                       }
 
                        zval_add_ref(entry_values);
-                       add_assoc_zval(return_value, Z_STRVAL(key), 
*entry_values);
+                       add_u_assoc_zval(return_value, Z_TYPE_P(key_ptr), 
Z_UNIVAL_P(key_ptr), *entry_values);
 
-                       zval_dtor(&key);
+                       if (key_ptr != *entry_keys) {
+                               zval_dtor(&key);
+                       }
                }
+
                zend_hash_move_forward_ex(Z_ARRVAL_P(keys), &pos_keys);
                zend_hash_move_forward_ex(Z_ARRVAL_P(values), &pos_values);
        }

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to