andrei Fri Jul 14 21:16:30 2006 UTC
Modified files:
/php-src unicode-progress.txt
/php-src/ext/standard array.c
Log:
Adjust array_key_exists(), array_slice(), and array_splice() for params
API and mark them with U.
http://cvs.php.net/viewvc.cgi/php-src/unicode-progress.txt?r1=1.21&r2=1.22&diff_format=u
Index: php-src/unicode-progress.txt
diff -u php-src/unicode-progress.txt:1.21 php-src/unicode-progress.txt:1.22
--- php-src/unicode-progress.txt:1.21 Fri Jul 14 20:07:57 2006
+++ php-src/unicode-progress.txt Fri Jul 14 21:16:30 2006
@@ -31,9 +31,6 @@
Should work with minor cleanups provided that underlying comparison
functions are fixed, FCI cache, test
- array_key_exists()
- Params API, test
-
array_map()
Params API, FCI cache, test
@@ -52,12 +49,6 @@
array_reverse()
Params API, test
- array_splice()
- Params API, test
-
- array_slice()
- Params API, test
-
array_unique()
Params API, test
@@ -87,12 +78,15 @@
array_chunk()
array_fill()
array_flip()
+ array_key_exists()
array_keys()
array_merge()
array_merge_recursive()
array_product()
array_push(), array_pop(), array_shift(), array_unshift()
array_search()
+ array_slice()
+ array_splice()
array_sum()
array_values()
compact()
http://cvs.php.net/viewvc.cgi/php-src/ext/standard/array.c?r1=1.359&r2=1.360&diff_format=u
Index: php-src/ext/standard/array.c
diff -u php-src/ext/standard/array.c:1.359 php-src/ext/standard/array.c:1.360
--- php-src/ext/standard/array.c:1.359 Fri Jul 14 20:07:57 2006
+++ php-src/ext/standard/array.c Fri Jul 14 21:16:30 2006
@@ -21,7 +21,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: array.c,v 1.359 2006/07/14 20:07:57 andrei Exp $ */
+/* $Id: array.c,v 1.360 2006/07/14 21:16:30 andrei Exp $ */
#include "php.h"
#include "php_ini.h"
@@ -2196,59 +2196,37 @@
/* }}} */
-/* {{{ proto array array_splice(array input, int offset [, int length [, array
replacement]])
+/* {{{ proto array array_splice(array input, int offset [, int length [, array
replacement]]) U
Removes the elements designated by offset and length and replace them with
supplied array */
PHP_FUNCTION(array_splice)
{
- zval ***args, /* Function arguments
array */
- *array, /* Input array */
- ***repl = NULL; /* Replacement elements
*/
- HashTable *new_hash = NULL; /* Output array's hash
*/
- Bucket *p; /* Bucket used for
traversing hash */
- int argc, /* Number of function
arguments */
- i,
+ zval *array, /* Input array */
+ *repl_array, /* Replacement array */
+ ***repl = NULL; /* Replacement elements
*/
+ HashTable *new_hash = NULL; /* Output array's hash */
+ Bucket *p; /* Bucket used
for traversing hash */
+ long i,
offset,
length,
repl_num = 0; /* Number of
replacement elements */
- /* Get the argument count and check it */
- argc = ZEND_NUM_ARGS();
- if (argc < 2 || argc > 4) {
- WRONG_PARAM_COUNT;
- }
-
- /* Allocate arguments array and get the arguments, checking for errors.
*/
- args = (zval ***)safe_emalloc(argc, sizeof(zval **), 0);
- if (zend_get_parameters_array_ex(argc, args) == FAILURE) {
- efree(args);
- WRONG_PARAM_COUNT;
- }
-
- /* Get first argument and check that it's an array */
- array = *args[0];
- if (Z_TYPE_P(array) != IS_ARRAY) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "The first argument
should be an array");
- efree(args);
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "al|lz/", &array,
+ &offset, &length,
&repl_array) == FAILURE) {
return;
}
- /* Get the next two arguments. If length is omitted, it's assumed to
be until the end of the array */
- convert_to_long_ex(args[1]);
- offset = Z_LVAL_PP(args[1]);
- if (argc > 2) {
- convert_to_long_ex(args[2]);
- length = Z_LVAL_PP(args[2]);
- } else
+ if (ZEND_NUM_ARGS() < 3) {
length = zend_hash_num_elements(Z_ARRVAL_P(array));
+ }
- if (argc == 4) {
+ if (ZEND_NUM_ARGS() == 4) {
/* Make sure the last argument, if passed, is an array */
- convert_to_array_ex(args[3]);
+ convert_to_array(repl_array);
/* Create the array of replacement elements */
- repl_num = zend_hash_num_elements(Z_ARRVAL_PP(args[3]));
+ repl_num = zend_hash_num_elements(Z_ARRVAL_P(repl_array));
repl = (zval ***)safe_emalloc(repl_num, sizeof(zval **), 0);
- for (p=Z_ARRVAL_PP(args[3])->pListHead, i=0; p; p=p->pListNext,
i++) {
+ for (p = Z_ARRVAL_P(repl_array)->pListHead, i = 0; p; p =
p->pListNext, i++) {
repl[i] = ((zval **)p->pData);
}
}
@@ -2258,9 +2236,9 @@
/* Perform splice */
new_hash = php_splice(Z_ARRVAL_P(array), offset, length,
- repl, repl_num,
-
&Z_ARRVAL_P(return_value));
-
+ repl, repl_num,
+ &Z_ARRVAL_P(return_value));
+
/* Replace input array's hashtable with the new one */
zend_hash_destroy(Z_ARRVAL_P(array));
if (Z_ARRVAL_P(array) == &EG(symbol_table)) {
@@ -2270,99 +2248,75 @@
FREE_HASHTABLE(new_hash);
/* Clean up */
- if (argc == 4)
+ if (ZEND_NUM_ARGS() == 4)
efree(repl);
- efree(args);
}
/* }}} */
-/* {{{ proto array array_slice(array input, int offset [, int length [, bool
preserve_keys]])
+/* {{{ proto array array_slice(array input, int offset [, int length [, bool
preserve_keys]]) U
Returns elements specified by offset and length */
PHP_FUNCTION(array_slice)
{
- zval **input, /* Input array */
- **offset, /* Offset to get elements from */
- **length, /* How many elements to get */
- **entry, /* An array entry */
- **z_preserve_keys; /* Whether to preserve keys while copying
to the new array or not */
- int offset_val, /* Value of the offset argument */
- length_val, /* Value of the length argument */
- num_in, /* Number of elements in the input
array */
- pos, /* Current position in the array */
- argc; /* Number of function arguments */
-
+ zval *input, /* Input array */
+ **entry; /* An array entry */
+ long offset, /* Offset to get elements from */
+ length; /* How many elements to get */
+ zend_bool preserve_keys = 0; /* Whether to preserve keys while copying
to the new array or not */
+ int num_in, /* Number of elements in the
input array */
+ pos; /* Current position in the
array */
zstr string_key;
- uint string_key_len;
+ int string_key_len;
ulong num_key;
HashPosition hpos;
- zend_bool preserve_keys = 0;
- /* Get the arguments and do error-checking */
- argc = ZEND_NUM_ARGS();
- if (argc < 2 || argc > 4 || zend_get_parameters_ex(argc, &input,
&offset, &length, &z_preserve_keys)) {
- WRONG_PARAM_COUNT;
- }
-
- if (Z_TYPE_PP(input) != IS_ARRAY) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "The first argument
should be an array");
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "al|lb", &input,
+ &offset, &length,
&preserve_keys) == FAILURE) {
return;
}
- /* Make sure offset and length are integers and assume
- we want all entries from offset to the end if length
- is not passed */
- convert_to_long_ex(offset);
- offset_val = Z_LVAL_PP(offset);
- if (argc >= 3) {
- convert_to_long_ex(length);
- length_val = Z_LVAL_PP(length);
- } else {
- length_val = zend_hash_num_elements(Z_ARRVAL_PP(input));
+ /* Get number of entries in the input hash */
+ num_in = zend_hash_num_elements(Z_ARRVAL_P(input));
+
+ /* We want all entries from offset to the end if length is not passed */
+ if (ZEND_NUM_ARGS() < 3) {
+ length = num_in;
}
- if (ZEND_NUM_ARGS() > 3) {
- convert_to_boolean_ex(z_preserve_keys);
- preserve_keys = Z_BVAL_PP(z_preserve_keys);
- }
-
/* Initialize returned array */
array_init(return_value);
- /* Get number of entries in the input hash */
- num_in = zend_hash_num_elements(Z_ARRVAL_PP(input));
-
/* Clamp the offset.. */
- if (offset_val > num_in)
+ if (offset > num_in)
return;
- else if (offset_val < 0 && (offset_val=num_in+offset_val) < 0)
- offset_val = 0;
+ else if (offset < 0 && (offset=num_in+offset) < 0)
+ offset = 0;
/* ..and the length */
- if (length_val < 0) {
- length_val = num_in-offset_val+length_val;
- } else if (((unsigned) offset_val + (unsigned) length_val) > num_in) {
- length_val = num_in-offset_val;
+ if (length < 0) {
+ length = num_in-offset+length;
+ } else if (((unsigned) offset + (unsigned) length) > num_in) {
+ length = num_in-offset;
}
- if (length_val == 0)
+ if (length == 0)
return;
/* Start at the beginning and go until we hit offset */
pos = 0;
- zend_hash_internal_pointer_reset_ex(Z_ARRVAL_PP(input), &hpos);
- while (pos < offset_val &&
zend_hash_get_current_data_ex(Z_ARRVAL_PP(input), (void **)&entry, &hpos) ==
SUCCESS) {
+ zend_hash_internal_pointer_reset_ex(Z_ARRVAL_P(input), &hpos);
+ while (pos < offset && zend_hash_get_current_data_ex(Z_ARRVAL_P(input),
(void **)&entry, &hpos) == SUCCESS) {
pos++;
- zend_hash_move_forward_ex(Z_ARRVAL_PP(input), &hpos);
+ zend_hash_move_forward_ex(Z_ARRVAL_P(input), &hpos);
}
/* Copy elements from input array to the one that's returned */
- while (pos < offset_val+length_val &&
zend_hash_get_current_data_ex(Z_ARRVAL_PP(input), (void **)&entry, &hpos) ==
SUCCESS) {
+ while (pos < offset+length &&
zend_hash_get_current_data_ex(Z_ARRVAL_P(input), (void **)&entry, &hpos) ==
SUCCESS) {
zend_uchar utype;
- (*entry)->refcount++;
+ zval_add_ref(entry);
- switch (zend_hash_get_current_key_ex(Z_ARRVAL_PP(input),
&string_key, &string_key_len, &num_key, 0, &hpos)) {
+ switch (zend_hash_get_current_key_ex(Z_ARRVAL_P(input),
&string_key, &string_key_len, &num_key, 0, &hpos)) {
case HASH_KEY_IS_STRING:
utype = IS_STRING;
goto ukey;
@@ -2370,7 +2324,7 @@
utype = IS_UNICODE;
ukey:
zend_u_hash_update(Z_ARRVAL_P(return_value),
utype, string_key, string_key_len,
- entry,
sizeof(zval *), NULL);
+ entry,
sizeof(zval *), NULL);
break;
case HASH_KEY_IS_LONG:
@@ -2383,7 +2337,7 @@
break;
}
pos++;
- zend_hash_move_forward_ex(Z_ARRVAL_PP(input), &hpos);
+ zend_hash_move_forward_ex(Z_ARRVAL_P(input), &hpos);
}
}
/* }}} */
@@ -4503,37 +4457,36 @@
/* }}} */
-/* {{{ proto bool array_key_exists(mixed key, array search)
+/* {{{ proto bool array_key_exists(mixed key, array search) U
Checks if the given key or index exists in the array */
PHP_FUNCTION(array_key_exists)
{
- zval **key, /* key to check for */
- **array; /* array to check in */
+ zval *key, /* key to check for */
+ *array; /* array to check in */
- if (ZEND_NUM_ARGS() != 2 ||
- zend_get_parameters_ex(ZEND_NUM_ARGS(), &key, &array) ==
FAILURE) {
- WRONG_PARAM_COUNT;
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "zz", &key,
&array) == FAILURE) {
+ return;
}
- if (Z_TYPE_PP(array) != IS_ARRAY && Z_TYPE_PP(array) != IS_OBJECT) {
+ if (Z_TYPE_P(array) != IS_ARRAY && Z_TYPE_P(array) != IS_OBJECT) {
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The second
argument should be either an array or an object");
RETURN_FALSE;
}
- switch (Z_TYPE_PP(key)) {
+ switch (Z_TYPE_P(key)) {
case IS_STRING:
case IS_UNICODE:
- if (zend_u_symtable_exists(HASH_OF(*array),
Z_TYPE_PP(key), Z_UNIVAL_PP(key), Z_UNILEN_PP(key)+1)) {
+ if (zend_u_symtable_exists(HASH_OF(array),
Z_TYPE_P(key), Z_UNIVAL_P(key), Z_UNILEN_P(key)+1)) {
RETURN_TRUE;
}
RETURN_FALSE;
case IS_LONG:
- if (zend_hash_index_exists(HASH_OF(*array),
Z_LVAL_PP(key))) {
+ if (zend_hash_index_exists(HASH_OF(array),
Z_LVAL_P(key))) {
RETURN_TRUE;
}
RETURN_FALSE;
case IS_NULL:
- if (zend_hash_exists(HASH_OF(*array), "", 1)) {
+ if (zend_hash_exists(HASH_OF(array), "", 1)) {
RETURN_TRUE;
}
RETURN_FALSE;
@@ -4542,7 +4495,6 @@
php_error_docref(NULL TSRMLS_CC, E_WARNING, "The first
argument should be either a string or an integer");
RETURN_FALSE;
}
-
}
/* }}} */
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php