pollita Thu Feb 6 17:18:41 2003 EDT
Modified files:
/php4/ext/bcmath bcmath.c
Log:
bc_raise() can return a scale lower than that passed into it. While most other
bcmath calls won't, it's safest to do a quick check that we're only
reducing n_scale, not increasing it.
Index: php4/ext/bcmath/bcmath.c
diff -u php4/ext/bcmath/bcmath.c:1.50 php4/ext/bcmath/bcmath.c:1.51
--- php4/ext/bcmath/bcmath.c:1.50 Tue Feb 4 16:07:40 2003
+++ php4/ext/bcmath/bcmath.c Thu Feb 6 17:18:41 2003
@@ -16,7 +16,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: bcmath.c,v 1.50 2003/02/04 21:07:40 andi Exp $ */
+/* $Id: bcmath.c,v 1.51 2003/02/06 22:18:41 pollita Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -159,7 +159,8 @@
php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC);
php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC);
bc_add (first, second, &result, scale);
- result->n_scale = 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;
@@ -203,7 +204,8 @@
php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC);
php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC);
bc_sub (first, second, &result, scale);
- result->n_scale = 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;
@@ -247,7 +249,8 @@
php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC);
php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC);
bc_multiply (first, second, &result, scale TSRMLS_CC);
- result->n_scale = 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;
@@ -292,7 +295,8 @@
php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC);
switch (bc_divide (first, second, &result, scale TSRMLS_CC)) {
case 0: /* OK */
- result->n_scale = 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;
@@ -370,7 +374,8 @@
php_str2num(&second, right TSRMLS_CC);
php_str2num(&mod, modulous TSRMLS_CC);
bc_raisemod(first, second, mod, &result, scale TSRMLS_CC);
- result->n_scale = 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;
@@ -415,7 +420,8 @@
php_str2num(&first, Z_STRVAL_PP(left) TSRMLS_CC);
php_str2num(&second, Z_STRVAL_PP(right) TSRMLS_CC);
bc_raise (first, second, &result, scale TSRMLS_CC);
- result->n_scale = 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;
@@ -455,7 +461,8 @@
bc_init_num(&result TSRMLS_CC);
php_str2num(&result, Z_STRVAL_PP(left) TSRMLS_CC);
if (bc_sqrt (&result, scale TSRMLS_CC) != 0) {
- result->n_scale = 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;
--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php