Merge branch 'PHP-7.2'

* PHP-7.2:
  Scale support for bcmod()
This commit is contained in:
Sara Golemon 2017-11-06 17:27:22 -05:00
commit 24fd49fbab
3 changed files with 21 additions and 8 deletions

View file

@ -60,9 +60,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_bcdiv, 0, 0, 2)
ZEND_ARG_INFO(0, scale) ZEND_ARG_INFO(0, scale)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(arginfo_bcmod, 0) ZEND_BEGIN_ARG_INFO_EX(arginfo_bcmod, 0, 0, 2)
ZEND_ARG_INFO(0, left_operand) ZEND_ARG_INFO(0, left_operand)
ZEND_ARG_INFO(0, right_operand) ZEND_ARG_INFO(0, right_operand)
ZEND_ARG_INFO(0, scale)
ZEND_END_ARG_INFO() ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO_EX(arginfo_bcpowmod, 0, 0, 3) ZEND_BEGIN_ARG_INFO_EX(arginfo_bcpowmod, 0, 0, 3)
@ -354,26 +355,38 @@ PHP_FUNCTION(bcdiv)
} }
/* }}} */ /* }}} */
/* {{{ proto string bcmod(string left_operand, string right_operand) /* {{{ proto string bcmod(string left_operand, string right_operand [, int scale])
Returns the modulus of the two arbitrary precision operands */ Returns the modulus of the two arbitrary precision operands */
PHP_FUNCTION(bcmod) PHP_FUNCTION(bcmod)
{ {
zend_string *left, *right; zend_string *left, *right;
zend_long scale_param = 0;
bc_num first, second, result; bc_num first, second, result;
int scale = (int)BCG(bc_precision);
ZEND_PARSE_PARAMETERS_START(2, 2) ZEND_PARSE_PARAMETERS_START(2, 3)
Z_PARAM_STR(left) Z_PARAM_STR(left)
Z_PARAM_STR(right) Z_PARAM_STR(right)
Z_PARAM_OPTIONAL
Z_PARAM_LONG(scale_param)
ZEND_PARSE_PARAMETERS_END(); ZEND_PARSE_PARAMETERS_END();
if (ZEND_NUM_ARGS() == 3) {
scale = (int) ((int)scale_param < 0 ? 0 : scale_param);
}
bc_init_num(&first); bc_init_num(&first);
bc_init_num(&second); bc_init_num(&second);
bc_init_num(&result); bc_init_num(&result);
php_str2num(&first, ZSTR_VAL(left)); php_str2num(&first, ZSTR_VAL(left));
php_str2num(&second, ZSTR_VAL(right)); php_str2num(&second, ZSTR_VAL(right));
switch (bc_modulo(first, second, &result, 0)) { switch (bc_modulo(first, second, &result, scale)) {
case 0: case 0:
if (result->n_scale > scale) {
result = split_bc_num(result);
result->n_scale = scale;
}
RETVAL_STR(bc_num2str(result)); RETVAL_STR(bc_num2str(result));
break; break;
case -1: case -1:

View file

@ -9,7 +9,7 @@ bcmath.scale=0
echo bcmod("11", "2"),"\n"; echo bcmod("11", "2"),"\n";
echo bcmod("-1", "5"),"\n"; echo bcmod("-1", "5"),"\n";
echo bcmod("8728932001983192837219398127471", "1928372132132819737213"),"\n"; echo bcmod("8728932001983192837219398127471", "1928372132132819737213"),"\n";
echo bcmod("3.5", "4"),"\n"; echo bcmod("3.5", "4", 1),"\n";
echo bcmod("1071", "357.5"),"\n"; echo bcmod("1071", "357.5"),"\n";
?> ?>
--EXPECT-- --EXPECT--
@ -17,4 +17,4 @@ echo bcmod("1071", "357.5"),"\n";
-1 -1
1459434331351930289678 1459434331351930289678
3.5 3.5
356.0 356

View file

@ -7,7 +7,7 @@ antoni@solucionsinternet.com
<?php if(!extension_loaded("bcmath")) print "skip"; ?> <?php if(!extension_loaded("bcmath")) print "skip"; ?>
--FILE-- --FILE--
<?php <?php
echo bcmod('1', '2', '3'); echo bcmod('1', '2', '3', '4');
?> ?>
--EXPECTF-- --EXPECTF--
Warning: bcmod() expects exactly 2 parameters, 3 given in %s.php on line %d Warning: bcmod() expects at most 3 parameters, 4 given in %s.php on line %d