diff --git a/ext/bcmath/config.m4 b/ext/bcmath/config.m4 index eab12133fa8..6938fba3f2d 100644 --- a/ext/bcmath/config.m4 +++ b/ext/bcmath/config.m4 @@ -6,7 +6,7 @@ PHP_ARG_ENABLE([bcmath], if test "$PHP_BCMATH" != "no"; then PHP_NEW_EXTENSION(bcmath, bcmath.c \ libbcmath/src/add.c libbcmath/src/div.c libbcmath/src/init.c libbcmath/src/neg.c libbcmath/src/raisemod.c libbcmath/src/sub.c \ -libbcmath/src/compare.c libbcmath/src/divmod.c libbcmath/src/int2num.c libbcmath/src/num2long.c libbcmath/src/output.c libbcmath/src/recmul.c \ +libbcmath/src/compare.c libbcmath/src/divmod.c libbcmath/src/int2num.c libbcmath/src/num2long.c libbcmath/src/recmul.c \ libbcmath/src/sqrt.c libbcmath/src/zero.c libbcmath/src/doaddsub.c libbcmath/src/floor_or_ceil.c libbcmath/src/nearzero.c libbcmath/src/num2str.c \ libbcmath/src/raise.c libbcmath/src/rmzero.c libbcmath/src/round.c libbcmath/src/str2num.c libbcmath/src/convert.c, $ext_shared,, -DZEND_ENABLE_STATIC_TSRMLS_CACHE=1) diff --git a/ext/bcmath/config.w32 b/ext/bcmath/config.w32 index 7f2c4bfda50..bf5fc719a10 100644 --- a/ext/bcmath/config.w32 +++ b/ext/bcmath/config.w32 @@ -6,7 +6,7 @@ if (PHP_BCMATH == "yes") { EXTENSION("bcmath", "bcmath.c", null, "/DZEND_ENABLE_STATIC_TSRMLS_CACHE=1"); ADD_SOURCES("ext/bcmath/libbcmath/src", "add.c div.c init.c neg.c \ raisemod.c sub.c compare.c divmod.c int2num.c \ - num2long.c output.c recmul.c sqrt.c zero.c doaddsub.c \ + num2long.c recmul.c sqrt.c zero.c doaddsub.c \ floor_or_ceil.c nearzero.c num2str.c raise.c rmzero.c str2num.c \ round.c convert.c", "bcmath"); diff --git a/ext/bcmath/libbcmath/src/add.c b/ext/bcmath/libbcmath/src/add.c index 23f922b7eb6..d98cb3efb85 100644 --- a/ext/bcmath/libbcmath/src/add.c +++ b/ext/bcmath/libbcmath/src/add.c @@ -49,7 +49,7 @@ bc_num bc_add(bc_num n1, bc_num n2, size_t scale_min) } else { /* subtraction must be done. */ /* Compare magnitudes. */ - switch (_bc_do_compare(n1, n2, false, false)) { + switch (_bc_do_compare(n1, n2, false)) { case -1: /* n1 is less than n2, subtract n1 from n2. */ sum = _bc_do_sub(n2, n1, scale_min); diff --git a/ext/bcmath/libbcmath/src/bcmath.h b/ext/bcmath/libbcmath/src/bcmath.h index 23c8e8a749e..dc1839512f0 100644 --- a/ext/bcmath/libbcmath/src/bcmath.h +++ b/ext/bcmath/libbcmath/src/bcmath.h @@ -166,8 +166,6 @@ void bc_raise_bc_exponent(bc_num base, bc_num exponent, bc_num *resul, size_t sc bool bc_sqrt(bc_num *num, size_t scale); -void bc_out_num(bc_num num, int o_base, void (* out_char)(char), bool leading_zero); - /* Prototypes needed for external utility routines. */ #define bc_new_num(length, scale) _bc_new_num_ex((length), (scale), 0) #define bc_free_num(num) _bc_free_num_ex((num), 0) diff --git a/ext/bcmath/libbcmath/src/compare.c b/ext/bcmath/libbcmath/src/compare.c index f8b36cb9c31..9604828e08c 100644 --- a/ext/bcmath/libbcmath/src/compare.c +++ b/ext/bcmath/libbcmath/src/compare.c @@ -39,7 +39,7 @@ than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just compare the magnitudes. */ -int _bc_do_compare(bc_num n1, bc_num n2, bool use_sign, bool ignore_last) +int _bc_do_compare(bc_num n1, bc_num n2, bool use_sign) { char *n1ptr, *n2ptr; @@ -85,9 +85,6 @@ int _bc_do_compare(bc_num n1, bc_num n2, bool use_sign, bool ignore_last) count--; } - if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) { - return (0); - } if (count != 0) { if (*n1ptr > *n2ptr) { /* Magnitude of n1 > n2. */ @@ -141,5 +138,5 @@ int _bc_do_compare(bc_num n1, bc_num n2, bool use_sign, bool ignore_last) /* This is the "user callable" routine to compare numbers N1 and N2. */ int bc_compare(bc_num n1, bc_num n2) { - return _bc_do_compare(n1, n2, true, false); + return _bc_do_compare(n1, n2, true); } diff --git a/ext/bcmath/libbcmath/src/output.c b/ext/bcmath/libbcmath/src/output.c deleted file mode 100644 index ee3e726c87c..00000000000 --- a/ext/bcmath/libbcmath/src/output.c +++ /dev/null @@ -1,188 +0,0 @@ -/* output.c: bcmath library file. */ -/* - Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. - Copyright (C) 2000 Philip A. Nelson - - This library is free software; you can redistribute it and/or - modify it under the terms of the GNU Lesser General Public - License as published by the Free Software Foundation; either - version 2 of the License, or (at your option) any later version. - - This library is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. (LICENSE) - - You should have received a copy of the GNU Lesser General Public - License along with this library; if not, write to: - - The Free Software Foundation, Inc. - 59 Temple Place, Suite 330 - Boston, MA 02111-1307 USA. - - You may contact the author by: - e-mail: philnelson@acm.org - us-mail: Philip A. Nelson - Computer Science Department, 9062 - Western Washington University - Bellingham, WA 98226-9062 - -*************************************************************************/ - -#include "bcmath.h" -#include -#include -#include "zend_alloc.h" - - -/* The following routines provide output for bcd numbers package - using the rules of POSIX bc for output. */ - -/* This structure is used for saving digits in the conversion process. */ -typedef struct stk_rec { - long digit; - struct stk_rec *next; -} stk_rec; - -/* The reference string for digits. */ -static const char ref_str[] = "0123456789ABCDEF"; - - -/* A special output routine for "multi-character digits." Exactly - SIZE characters must be output for the value VAL. If SPACE is - non-zero, we must output one space before the number. OUT_CHAR - is the actual routine for writing the characters. */ - -void bc_out_long(long val, size_t size, bool space, void (*out_char)(char)) -{ - char digits[40]; - size_t len, ix; - - if (space) (*out_char)(' '); - snprintf(digits, sizeof(digits), "%ld", val); - len = strlen(digits); - while (size > len) { - (*out_char)('0'); - size--; - } - for (ix = 0; ix < len; ix++) { - (*out_char)(digits[ix]); - } -} - -/* Output of a bcd number. NUM is written in base O_BASE using OUT_CHAR - as the routine to do the actual output of the characters. */ - -void bc_out_num(bc_num num, int o_base, void (*out_char)(char), bool leading_zero) -{ - char *nptr; - int index, fdigit; - bool pre_space; - stk_rec *digits, *temp; - bc_num int_part, base, cur_dig, t_num, max_o_digit; - - /* The negative sign if needed. */ - if (num->n_sign == MINUS) (*out_char)('-'); - - /* Output the number. */ - if (bc_is_zero(num)) { - (*out_char)('0'); - } else { - if (o_base == 10) { - /* The number is in base 10, do it the fast way. */ - nptr = num->n_value; - if (num->n_len > 1 || *nptr != 0) { - for (index = num->n_len; index > 0; index--) { - (*out_char)(BCD_CHAR(*nptr++)); - } - } else { - nptr++; - } - - if (leading_zero && bc_is_zero(num)) { - (*out_char)('0'); - } - - /* Now the fraction. */ - if (num->n_scale > 0) { - (*out_char)('.'); - for (index = 0; index < num->n_scale; index++) { - (*out_char)(BCD_CHAR(*nptr++)); - } - } - } else { - /* special case ... */ - if (leading_zero && bc_is_zero(num)) { - (*out_char)('0'); - } - - /* The number is some other base. */ - digits = NULL; - bc_init_num(&int_part); - bc_divide(num, BCG(_one_), &int_part, 0); - bc_init_num(&cur_dig); - bc_init_num(&base); - bc_num frac_part = bc_sub(num, int_part, 0); - /* Make the INT_PART and FRAC_PART positive. */ - int_part->n_sign = PLUS; - frac_part->n_sign = PLUS; - bc_int2num(&base, o_base); - bc_init_num(&max_o_digit); - bc_int2num(&max_o_digit, o_base - 1); - - /* Get the digits of the integer part and push them on a stack. */ - while (!bc_is_zero(int_part)) { - bc_modulo(int_part, base, &cur_dig, 0); - /* PHP Change: malloc() -> emalloc() */ - temp = (stk_rec *) emalloc(sizeof(stk_rec)); - temp->digit = bc_num2long(cur_dig); - temp->next = digits; - digits = temp; - bc_divide(int_part, base, &int_part, 0); - } - - /* Print the digits on the stack. */ - if (digits != NULL) { - /* Output the digits. */ - while (digits != NULL) { - temp = digits; - digits = digits->next; - if (o_base <= 16) { - (*out_char)(ref_str[(int) temp->digit]); - } else { - bc_out_long(temp->digit, max_o_digit->n_len, 1, out_char); - } - efree(temp); - } - } - - /* Get and print the digits of the fraction part. */ - if (num->n_scale > 0) { - (*out_char)('.'); - pre_space = false; - t_num = bc_copy_num(BCG(_one_)); - while (t_num->n_len <= num->n_scale) { - bc_multiply_ex(frac_part, base, &frac_part, num->n_scale); - fdigit = bc_num2long(frac_part); - bc_int2num(&int_part, fdigit); - bc_sub_ex(frac_part, int_part, &frac_part, 0); - if (o_base <= 16) { - (*out_char)(ref_str[fdigit]); - } else { - bc_out_long(fdigit, max_o_digit->n_len, pre_space, out_char); - pre_space = true; - } - bc_multiply_ex(t_num, base, &t_num, 0); - } - bc_free_num (&t_num); - } - - /* Clean up. */ - bc_free_num (&int_part); - bc_free_num (&frac_part); - bc_free_num (&base); - bc_free_num (&cur_dig); - bc_free_num (&max_o_digit); - } - } -} diff --git a/ext/bcmath/libbcmath/src/private.h b/ext/bcmath/libbcmath/src/private.h index 92db802eb45..481a6511283 100644 --- a/ext/bcmath/libbcmath/src/private.h +++ b/ext/bcmath/libbcmath/src/private.h @@ -35,7 +35,7 @@ #include /* routines */ -int _bc_do_compare (bc_num n1, bc_num n2, bool use_sign, bool ignore_last); +int _bc_do_compare (bc_num n1, bc_num n2, bool use_sign); bc_num _bc_do_add (bc_num n1, bc_num n2, size_t scale_min); bc_num _bc_do_sub (bc_num n1, bc_num n2, size_t scale_min); void _bc_rm_leading_zeros (bc_num num); diff --git a/ext/bcmath/libbcmath/src/sub.c b/ext/bcmath/libbcmath/src/sub.c index 185f9651dea..a977eac3926 100644 --- a/ext/bcmath/libbcmath/src/sub.c +++ b/ext/bcmath/libbcmath/src/sub.c @@ -49,7 +49,7 @@ bc_num bc_sub(bc_num n1, bc_num n2, size_t scale_min) } else { /* subtraction must be done. */ /* Compare magnitudes. */ - switch (_bc_do_compare(n1, n2, false, false)) { + switch (_bc_do_compare(n1, n2, false)) { case -1: /* n1 is less than n2, subtract n1 from n2. */ diff = _bc_do_sub(n2, n1, scale_min);