summaryrefslogtreecommitdiff
path: root/ext/bcmath/bcmath.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/bcmath/bcmath.c')
-rw-r--r--ext/bcmath/bcmath.c279
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;
}