summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFelipe Pena <felipe@php.net>2008-08-10 17:49:30 +0000
committerFelipe Pena <felipe@php.net>2008-08-10 17:49:30 +0000
commitf168ea0fb3de524eb239fb2b8272f67939d1e7ce (patch)
tree7ad9bfb09651c4e8de3bdf0a535b495c1c23c5ed
parentbb8085acc4256225bb0fde23c5f25b0938366c90 (diff)
downloadphp-git-f168ea0fb3de524eb239fb2b8272f67939d1e7ce.tar.gz
- New parameter parsing API (for min() and max())
-rw-r--r--ext/standard/array.c89
-rw-r--r--ext/standard/tests/array/max.phpt8
-rw-r--r--ext/standard/tests/array/max_error.phpt9
-rw-r--r--ext/standard/tests/array/min.phpt8
-rw-r--r--ext/standard/tests/array/min_error.phpt9
5 files changed, 62 insertions, 61 deletions
diff --git a/ext/standard/array.c b/ext/standard/array.c
index fe0da87644..4c390d4c6a 100644
--- a/ext/standard/array.c
+++ b/ext/standard/array.c
@@ -946,47 +946,48 @@ PHP_FUNCTION(key)
Return the lowest value in an array or a series of arguments */
PHP_FUNCTION(min)
{
- int argc=ZEND_NUM_ARGS();
- zval **result;
+ int argc;
+ zval ***args = NULL;
- if (argc<=0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "At least one value should be passed");
- RETURN_NULL();
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argc) == FAILURE) {
+ return;
}
+
php_set_compare_func(PHP_SORT_REGULAR TSRMLS_CC);
+
+ /* mixed min ( array $values ) */
if (argc == 1) {
- zval **arr;
-
- if (zend_get_parameters_ex(1, &arr) == FAILURE || Z_TYPE_PP(arr) != IS_ARRAY) {
- WRONG_PARAM_COUNT;
- }
- if (zend_hash_minmax(Z_ARRVAL_PP(arr), php_array_data_compare, 0, (void **) &result TSRMLS_CC) == SUCCESS) {
- RETVAL_ZVAL(*result, 1, 0);
+ zval **result;
+
+ if (Z_TYPE_PP(args[0]) != IS_ARRAY) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "When only one parameter is given, it must be an array");
+ RETVAL_NULL();
} else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array must contain at least one element");
- RETURN_FALSE;
+ if (zend_hash_minmax(Z_ARRVAL_PP(args[0]), php_array_data_compare, 0, (void **) &result TSRMLS_CC) == SUCCESS) {
+ RETVAL_ZVAL(*result, 1, 0);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array must contain at least one element");
+ RETVAL_FALSE;
+ }
}
} else {
- zval ***args = (zval ***) safe_emalloc(sizeof(zval **), ZEND_NUM_ARGS(), 0);
+ /* mixed min ( mixed $value1 , mixed $value2 [, mixed $value3... ] ) */
zval **min, result;
int i;
- if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args)==FAILURE) {
- efree(args);
- WRONG_PARAM_COUNT;
- }
-
min = args[0];
- for (i=1; i<ZEND_NUM_ARGS(); i++) {
+ for (i = 1; i < argc; i++) {
is_smaller_function(&result, *args[i], *min TSRMLS_CC);
if (Z_LVAL(result) == 1) {
min = args[i];
}
}
- RETVAL_ZVAL(*min, 1, 0);
+ RETVAL_ZVAL(*min, 1, 0);
+ }
+ if (args) {
efree(args);
}
}
@@ -996,39 +997,38 @@ PHP_FUNCTION(min)
Return the highest value in an array or a series of arguments */
PHP_FUNCTION(max)
{
- int argc=ZEND_NUM_ARGS();
- zval **result;
-
- if (argc<=0) {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "At least one value should be passed");
- RETURN_NULL();
+ zval ***args = NULL;
+ int argc;
+
+ if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "+", &args, &argc) == FAILURE) {
+ return;
}
+
php_set_compare_func(PHP_SORT_REGULAR TSRMLS_CC);
+
+ /* mixed max ( array $values ) */
if (argc == 1) {
- zval **arr;
+ zval **result;
- if (zend_get_parameters_ex(1, &arr) == FAILURE || Z_TYPE_PP(arr) != IS_ARRAY) {
- WRONG_PARAM_COUNT;
- }
- if (zend_hash_minmax(Z_ARRVAL_PP(arr), php_array_data_compare, 1, (void **) &result TSRMLS_CC) == SUCCESS) {
- RETVAL_ZVAL(*result, 1, 0);
+ if (Z_TYPE_PP(args[0]) != IS_ARRAY) {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "When only one parameter is given, it must be an array");
+ RETVAL_NULL();
} else {
- php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array must contain at least one element");
- RETURN_FALSE;
+ if (zend_hash_minmax(Z_ARRVAL_PP(args[0]), php_array_data_compare, 1, (void **) &result TSRMLS_CC) == SUCCESS) {
+ RETVAL_ZVAL(*result, 1, 0);
+ } else {
+ php_error_docref(NULL TSRMLS_CC, E_WARNING, "Array must contain at least one element");
+ RETVAL_FALSE;
+ }
}
} else {
- zval ***args = (zval ***) safe_emalloc(sizeof(zval **), ZEND_NUM_ARGS(), 0);
+ /* mixed max ( mixed $value1 , mixed $value2 [, mixed $value3... ] ) */
zval **max, result;
int i;
- if (zend_get_parameters_array_ex(ZEND_NUM_ARGS(), args) == FAILURE) {
- efree(args);
- WRONG_PARAM_COUNT;
- }
-
max = args[0];
- for (i=1; i<ZEND_NUM_ARGS(); i++) {
+ for (i = 1; i < argc; i++) {
is_smaller_or_equal_function(&result, *args[i], *max TSRMLS_CC);
if (Z_LVAL(result) == 0) {
max = args[i];
@@ -1036,6 +1036,9 @@ PHP_FUNCTION(max)
}
RETVAL_ZVAL(*max, 1, 0);
+ }
+
+ if (args) {
efree(args);
}
}
diff --git a/ext/standard/tests/array/max.phpt b/ext/standard/tests/array/max.phpt
index a9e69c3903..b4db527604 100644
--- a/ext/standard/tests/array/max.phpt
+++ b/ext/standard/tests/array/max.phpt
@@ -20,16 +20,16 @@ var_dump(max(0, true, false, true));
echo "Done\n";
?>
--EXPECTF--
-Warning: max(): At least one value should be passed in %s on line %d
+Warning: max() expects at least 1 parameter, 0 given in %s on line 3
NULL
-Warning: Wrong parameter count for max() in %s on line %d
+Warning: max(): When only one parameter is given, it must be an array in %s on line 4
NULL
-Warning: max(): Array must contain at least one element in %s on line %d
+Warning: max(): Array must contain at least one element in %s on line 5
bool(false)
-Warning: Wrong parameter count for max() in %s on line %d
+Warning: max(): When only one parameter is given, it must be an array in %s on line 6
NULL
int(2)
float(2.11)
diff --git a/ext/standard/tests/array/max_error.phpt b/ext/standard/tests/array/max_error.phpt
index cbc36f4946..b20a3c08f6 100644
--- a/ext/standard/tests/array/max_error.phpt
+++ b/ext/standard/tests/array/max_error.phpt
@@ -17,17 +17,16 @@ var_dump(max(new stdclass));
?>
--EXPECTF--
-
*** Testing Error Conditions ***
-Warning: max(): At least one %s on line %d
+Warning: max() expects at least 1 parameter, 0 given in %s on line 10
NULL
-Warning: Wrong parameter count for max() in %s on line %d
+Warning: max(): When only one parameter is given, it must be an array in %s on line 11
NULL
-Warning: max(): Array must contain at least one element in %s on line %d
+Warning: max(): Array must contain at least one element in %s on line 12
bool(false)
-Warning: Wrong parameter count for max() in %s on line %d
+Warning: max(): When only one parameter is given, it must be an array in %s on line 13
NULL
diff --git a/ext/standard/tests/array/min.phpt b/ext/standard/tests/array/min.phpt
index a35d284258..764242df21 100644
--- a/ext/standard/tests/array/min.phpt
+++ b/ext/standard/tests/array/min.phpt
@@ -20,16 +20,16 @@ var_dump(min(0, true, false, true));
echo "Done\n";
?>
--EXPECTF--
-Warning: min(): At least one value should be passed in %s on line %d
+Warning: min() expects at least 1 parameter, 0 given in %s on line 3
NULL
-Warning: Wrong parameter count for min() in %s on line %d
+Warning: min(): When only one parameter is given, it must be an array in %s on line 4
NULL
-Warning: min(): Array must contain at least one element in %s on line %d
+Warning: min(): Array must contain at least one element in %s on line 5
bool(false)
-Warning: Wrong parameter count for min() in %s on line %d
+Warning: min(): When only one parameter is given, it must be an array in %s on line 6
NULL
int(1)
float(2.09)
diff --git a/ext/standard/tests/array/min_error.phpt b/ext/standard/tests/array/min_error.phpt
index f39516c686..dc472bc258 100644
--- a/ext/standard/tests/array/min_error.phpt
+++ b/ext/standard/tests/array/min_error.phpt
@@ -17,17 +17,16 @@ var_dump(min(new stdclass));
?>
--EXPECTF--
-
*** Testing Error Conditions ***
-Warning: min(): At least one %s on line %d
+Warning: min() expects at least 1 parameter, 0 given in %s on line 10
NULL
-Warning: Wrong parameter count for min() in %s on line %d
+Warning: min(): When only one parameter is given, it must be an array in %s on line 11
NULL
-Warning: min(): Array must contain at least one element in %s on line %d
+Warning: min(): Array must contain at least one element in %s on line 12
bool(false)
-Warning: Wrong parameter count for min() in %s on line %d
+Warning: min(): When only one parameter is given, it must be an array in %s on line 13
NULL