mboeren Mon Apr 9 04:53:39 2001 EDT
Modified files:
/php4/ext/dbx dbx.c
Log:
Added optional 'comparison_type' parameter to compare functions, to force
either text or number comparison. (Mc)
Index: php4/ext/dbx/dbx.c
diff -u php4/ext/dbx/dbx.c:1.7 php4/ext/dbx/dbx.c:1.8
--- php4/ext/dbx/dbx.c:1.7 Mon Apr 2 01:51:35 2001
+++ php4/ext/dbx/dbx.c Mon Apr 9 04:53:39 2001
@@ -536,14 +536,18 @@
*/
ZEND_FUNCTION(dbx_cmp_asc)
{
- int number_of_arguments=3;
+ int min_number_of_arguments=3;
+ int max_number_of_arguments=4;
+ int number_of_arguments=-1;
+ int comparison_type=0;
double dtemp;
long ltemp;
- zval ** arguments[3];
+ zval ** arguments[4];
zval ** zv_a;
zval ** zv_b;
int result=0;
- if (ZEND_NUM_ARGS() !=number_of_arguments ||
zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
+ number_of_arguments=ZEND_NUM_ARGS();
+ if (number_of_arguments<min_number_of_arguments ||
+number_of_arguments>max_number_of_arguments ||
+zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
WRONG_PARAM_COUNT;
}
@@ -553,6 +557,11 @@
RETURN_LONG(0);
}
convert_to_string_ex(arguments[2]); /*/ field name /*/
+ comparison_type = 0; // default, text
+ if (number_of_arguments>3) {
+ convert_to_string_ex(arguments[3]); /*/ comparison type /*/
+ if (!strcmp((*arguments[3])->value.str.val, "number")) comparison_type=1;
+ }
if (zend_hash_find((*arguments[0])->value.ht, (*arguments[2])->value.str.val,
(*arguments[2])->value.str.len+1, (void **) &zv_a)==FAILURE
|| zend_hash_find((*arguments[1])->value.ht, (*arguments[2])->value.str.val,
(*arguments[2])->value.str.len+1, (void **) &zv_b)==FAILURE) {
@@ -560,24 +569,19 @@
RETURN_LONG(0);
}
- if ((*zv_a)->type != (*zv_b)->type) {
- convert_to_string_ex(zv_a);
- convert_to_string_ex(zv_b);
- }
- switch ((*zv_a)->type) {
- case IS_LONG:
- case IS_BOOL:
- ltemp = (*zv_a)->value.lval - (*zv_b)->value.lval;
+ switch (comparison_type) {
+ case 0:
+ convert_to_string_ex(zv_a);
+ convert_to_string_ex(zv_b);
+ ltemp = strcmp((*zv_a)->value.str.val, (*zv_b)->value.str.val);
result = (ltemp==0?0: (ltemp>0?1:-1));
break;
- case IS_DOUBLE:
+ case 1:
+ convert_to_double_ex(zv_a);
+ convert_to_double_ex(zv_b);
dtemp = ((*zv_a)->value.dval - (*zv_b)->value.dval);
result = (dtemp==0?0: (dtemp>0?1:-1));
break;
- case IS_STRING:
- ltemp = strcmp((*zv_a)->value.str.val, (*zv_b)->value.str.val);
- result = (ltemp==0?0: (ltemp>0?1:-1));
- break;
default:
result=0;
break;
@@ -591,14 +595,18 @@
*/
ZEND_FUNCTION(dbx_cmp_desc)
{
- int number_of_arguments=3;
+ int min_number_of_arguments=3;
+ int max_number_of_arguments=4;
+ int number_of_arguments=-1;
+ int comparison_type=0;
double dtemp;
long ltemp;
- zval ** arguments[3];
+ zval ** arguments[4];
zval ** zv_a;
zval ** zv_b;
int result=0;
- if (ZEND_NUM_ARGS() !=number_of_arguments ||
zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
+ number_of_arguments=ZEND_NUM_ARGS();
+ if (number_of_arguments<min_number_of_arguments ||
+number_of_arguments>max_number_of_arguments ||
+zend_get_parameters_array_ex(number_of_arguments, arguments) == FAILURE) {
WRONG_PARAM_COUNT;
}
@@ -608,6 +616,11 @@
RETURN_LONG(0);
}
convert_to_string_ex(arguments[2]); /*/ field name /*/
+ comparison_type = 0; // default, text
+ if (number_of_arguments>3) {
+ convert_to_string_ex(arguments[3]); /*/ comparison type /*/
+ if (!strcmp((*arguments[3])->value.str.val, "number")) comparison_type=1;
+ }
if (zend_hash_find((*arguments[0])->value.ht, (*arguments[2])->value.str.val,
(*arguments[2])->value.str.len+1, (void **) &zv_a)==FAILURE
|| zend_hash_find((*arguments[1])->value.ht, (*arguments[2])->value.str.val,
(*arguments[2])->value.str.len+1, (void **) &zv_b)==FAILURE) {
@@ -615,23 +628,18 @@
RETURN_LONG(0);
}
- if ((*zv_a)->type != (*zv_b)->type) {
- convert_to_string_ex(zv_a);
- convert_to_string_ex(zv_b);
- }
- switch ((*zv_a)->type) {
- case IS_LONG:
- case IS_BOOL:
- ltemp = (*zv_b)->value.lval - (*zv_a)->value.lval;
+ switch (comparison_type) {
+ case 0:
+ convert_to_string_ex(zv_a);
+ convert_to_string_ex(zv_b);
+ ltemp = strcmp((*zv_b)->value.str.val, (*zv_a)->value.str.val);
result = (ltemp==0?0: (ltemp>0?1:-1));
break;
- case IS_DOUBLE:
+ case 1:
+ convert_to_double_ex(zv_a);
+ convert_to_double_ex(zv_b);
dtemp = ((*zv_b)->value.dval - (*zv_a)->value.dval);
result = (dtemp==0?0: (dtemp>0?1:-1));
- break;
- case IS_STRING:
- ltemp = strcmp((*zv_b)->value.str.val, (*zv_a)->value.str.val);
- result = (ltemp==0?0: (ltemp>0?1:-1));
break;
default:
result=0;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]