diff options
Diffstat (limited to 'ext/bcmath/bcmath.c')
-rw-r--r-- | ext/bcmath/bcmath.c | 279 |
1 files changed, 134 insertions, 145 deletions
diff --git a/ext/bcmath/bcmath.c b/ext/bcmath/bcmath.c index 02177e48a7..31f6537614 100644 --- a/ext/bcmath/bcmath.c +++ b/ext/bcmath/bcmath.c @@ -1,6 +1,6 @@ /* +----------------------------------------------------------------------+ - | PHP Version 5 | + | PHP Version 7 | +----------------------------------------------------------------------+ | Copyright (c) 1997-2015 The PHP Group | +----------------------------------------------------------------------+ @@ -127,6 +127,9 @@ zend_module_entry bcmath_module_entry = { }; #ifdef COMPILE_DL_BCMATH +#ifdef ZTS +ZEND_TSRMLS_CACHE_DEFINE; +#endif ZEND_GET_MODULE(bcmath) #endif @@ -140,8 +143,11 @@ PHP_INI_END() */ static PHP_GINIT_FUNCTION(bcmath) { +#if defined(COMPILE_DL_BCMATH) && defined(ZTS) + ZEND_TSRMLS_CACHE_UPDATE; +#endif bcmath_globals->bc_precision = 0; - bc_init_numbers(TSRMLS_C); + bc_init_numbers(); } /* }}} */ @@ -188,16 +194,16 @@ PHP_MINFO_FUNCTION(bcmath) /* {{{ php_str2num Convert to bc_num detecting scale */ -static void php_str2num(bc_num *num, char *str TSRMLS_DC) +static void php_str2num(bc_num *num, char *str) { char *p; if (!(p = strchr(str, '.'))) { - bc_str2num(num, str, 0 TSRMLS_CC); + bc_str2num(num, str, 0); return; } - bc_str2num(num, str, strlen(p+1) TSRMLS_CC); + bc_str2num(num, str, strlen(p+1)); } /* }}} */ @@ -206,33 +212,31 @@ static void php_str2num(bc_num *num, char *str TSRMLS_DC) PHP_FUNCTION(bcadd) { char *left, *right; - long scale_param = 0; + zend_long scale_param = 0; bc_num first, second, result; - int left_len, right_len; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + size_t left_len, right_len; + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { return; } - + if (argc == 3) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) (scale_param < 0 ? 0 : scale_param); } - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - php_str2num(&first, left TSRMLS_CC); - php_str2num(&second, right TSRMLS_CC); + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&result); + php_str2num(&first, left); + php_str2num(&second, right); bc_add (first, second, &result, scale); - + if (result->n_scale > scale) { result->n_scale = scale; } - - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + + RETVAL_STR(bc_num2str(result)); bc_free_num(&first); bc_free_num(&second); bc_free_num(&result); @@ -245,33 +249,31 @@ PHP_FUNCTION(bcadd) PHP_FUNCTION(bcsub) { char *left, *right; - int left_len, right_len; - long scale_param = 0; + size_t left_len, right_len; + zend_long scale_param = 0; bc_num first, second, result; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { return; } - + if (argc == 3) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) ((int)scale_param < 0 ? 0 : scale_param); } - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - php_str2num(&first, left TSRMLS_CC); - php_str2num(&second, right TSRMLS_CC); + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&result); + php_str2num(&first, left); + php_str2num(&second, right); bc_sub (first, second, &result, scale); if (result->n_scale > scale) { result->n_scale = scale; } - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); bc_free_num(&first); bc_free_num(&second); bc_free_num(&result); @@ -284,33 +286,31 @@ PHP_FUNCTION(bcsub) PHP_FUNCTION(bcmul) { char *left, *right; - int left_len, right_len; - long scale_param = 0; + size_t left_len, right_len; + zend_long scale_param = 0; bc_num first, second, result; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { return; } - + if (argc == 3) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) ((int)scale_param < 0 ? 0 : scale_param); } - - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - php_str2num(&first, left TSRMLS_CC); - php_str2num(&second, right TSRMLS_CC); - bc_multiply (first, second, &result, scale TSRMLS_CC); + + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&result); + php_str2num(&first, left); + php_str2num(&second, right); + bc_multiply (first, second, &result, scale); if (result->n_scale > scale) { result->n_scale = scale; } - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); bc_free_num(&first); bc_free_num(&second); bc_free_num(&result); @@ -323,36 +323,34 @@ PHP_FUNCTION(bcmul) PHP_FUNCTION(bcdiv) { char *left, *right; - int left_len, right_len; - long scale_param = 0; + size_t left_len, right_len; + zend_long scale_param = 0; bc_num first, second, result; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { return; } - + if (argc == 3) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) ((int)scale_param < 0 ? 0 : scale_param); } - - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - php_str2num(&first, left TSRMLS_CC); - php_str2num(&second, right TSRMLS_CC); - - switch (bc_divide(first, second, &result, scale TSRMLS_CC)) { + + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&result); + php_str2num(&first, left); + php_str2num(&second, right); + + switch (bc_divide(first, second, &result, scale)) { case 0: /* OK */ if (result->n_scale > scale) { result->n_scale = scale; } - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); break; case -1: /* division by zero */ - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Division by zero"); + php_error_docref(NULL, E_WARNING, "Division by zero"); break; } @@ -368,30 +366,28 @@ PHP_FUNCTION(bcdiv) PHP_FUNCTION(bcmod) { char *left, *right; - int left_len, right_len; + size_t left_len, right_len; bc_num first, second, result; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "ss", &left, &left_len, &right, &right_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "ss", &left, &left_len, &right, &right_len) == FAILURE) { return; } - - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - bc_str2num(&first, left, 0 TSRMLS_CC); - bc_str2num(&second, right, 0 TSRMLS_CC); - - switch (bc_modulo(first, second, &result, 0 TSRMLS_CC)) { + + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&result); + bc_str2num(&first, left, 0); + bc_str2num(&second, right, 0); + + switch (bc_modulo(first, second, &result, 0)) { case 0: - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); break; case -1: - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Division by zero"); + php_error_docref(NULL, E_WARNING, "Division by zero"); break; } - + bc_free_num(&first); bc_free_num(&second); bc_free_num(&result); @@ -404,36 +400,34 @@ PHP_FUNCTION(bcmod) PHP_FUNCTION(bcpowmod) { char *left, *right, *modulous; - int left_len, right_len, modulous_len; + size_t left_len, right_len, modulous_len; bc_num first, second, mod, result; - long scale = BCG(bc_precision); + zend_long scale = BCG(bc_precision); int scale_int; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "sss|l", &left, &left_len, &right, &right_len, &modulous, &modulous_len, &scale) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|l", &left, &left_len, &right, &right_len, &modulous, &modulous_len, &scale) == FAILURE) { return; } - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&mod TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - php_str2num(&first, left TSRMLS_CC); - php_str2num(&second, right TSRMLS_CC); - php_str2num(&mod, modulous TSRMLS_CC); + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&mod); + bc_init_num(&result); + php_str2num(&first, left); + php_str2num(&second, right); + php_str2num(&mod, modulous); - scale_int = (int) ((int)scale < 0) ? 0 : scale; + scale_int = (int) ((int)scale < 0 ? 0 : scale); - if (bc_raisemod(first, second, mod, &result, scale_int TSRMLS_CC) != -1) { + if (bc_raisemod(first, second, mod, &result, scale_int) != -1) { if (result->n_scale > scale) { - result->n_scale = scale; + result->n_scale = (int)scale; } - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); } else { RETVAL_FALSE; } - + bc_free_num(&first); bc_free_num(&second); bc_free_num(&mod); @@ -447,33 +441,31 @@ PHP_FUNCTION(bcpowmod) PHP_FUNCTION(bcpow) { char *left, *right; - int left_len, right_len; - long scale_param = 0; + size_t left_len, right_len; + zend_long scale_param = 0; bc_num first, second, result; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { return; } - + if (argc == 3) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) ((int)scale_param < 0 ? 0 : scale_param); } - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); - bc_init_num(&result TSRMLS_CC); - php_str2num(&first, left TSRMLS_CC); - php_str2num(&second, right TSRMLS_CC); - bc_raise (first, second, &result, scale TSRMLS_CC); + bc_init_num(&first); + bc_init_num(&second); + bc_init_num(&result); + php_str2num(&first, left); + php_str2num(&second, right); + bc_raise (first, second, &result, scale); if (result->n_scale > scale) { result->n_scale = scale; } - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); bc_free_num(&first); bc_free_num(&second); bc_free_num(&result); @@ -486,31 +478,29 @@ PHP_FUNCTION(bcpow) PHP_FUNCTION(bcsqrt) { char *left; - int left_len; - long scale_param = 0; + size_t left_len; + zend_long scale_param = 0; bc_num result; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "s|l", &left, &left_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "s|l", &left, &left_len, &scale_param) == FAILURE) { return; } - + if (argc == 2) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) ((int)scale_param < 0 ? 0 : scale_param); } - bc_init_num(&result TSRMLS_CC); - php_str2num(&result, left TSRMLS_CC); - - if (bc_sqrt (&result, scale TSRMLS_CC) != 0) { + bc_init_num(&result); + php_str2num(&result, left); + + if (bc_sqrt (&result, scale) != 0) { if (result->n_scale > scale) { result->n_scale = scale; } - Z_STRVAL_P(return_value) = bc_num2str(result); - Z_STRLEN_P(return_value) = strlen(Z_STRVAL_P(return_value)); - Z_TYPE_P(return_value) = IS_STRING; + RETVAL_STR(bc_num2str(result)); } else { - php_error_docref(NULL TSRMLS_CC, E_WARNING, "Square root of negative number"); + php_error_docref(NULL, E_WARNING, "Square root of negative number"); } bc_free_num(&result); @@ -523,26 +513,25 @@ PHP_FUNCTION(bcsqrt) PHP_FUNCTION(bccomp) { char *left, *right; - int left_len, right_len; - long scale_param = 0; + size_t left_len, right_len; + zend_long scale_param = 0; bc_num first, second; - int scale = BCG(bc_precision), argc = ZEND_NUM_ARGS(); + int scale = (int)BCG(bc_precision), argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc TSRMLS_CC, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { + if (zend_parse_parameters(argc, "ss|l", &left, &left_len, &right, &right_len, &scale_param) == FAILURE) { return; } - + if (argc == 3) { - scale = (int) ((int)scale_param < 0) ? 0 : scale_param; + scale = (int) ((int)scale_param < 0 ? 0 : scale_param); } - bc_init_num(&first TSRMLS_CC); - bc_init_num(&second TSRMLS_CC); + bc_init_num(&first); + bc_init_num(&second); - bc_str2num(&first, left, scale TSRMLS_CC); - bc_str2num(&second, right, scale TSRMLS_CC); - Z_LVAL_P(return_value) = bc_compare(first, second); - Z_TYPE_P(return_value) = IS_LONG; + bc_str2num(&first, left, scale); + bc_str2num(&second, right, scale); + RETVAL_LONG(bc_compare(first, second)); bc_free_num(&first); bc_free_num(&second); @@ -554,9 +543,9 @@ PHP_FUNCTION(bccomp) Sets default scale parameter for all bc math functions */ PHP_FUNCTION(bcscale) { - long new_scale; - - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "l", &new_scale) == FAILURE) { + zend_long new_scale; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l", &new_scale) == FAILURE) { return; } |