1
0
mirror of https://github.com/php/php-src.git synced 2026-03-24 00:02:20 +01:00

Remove some dead code from BCMath (#14130)

* Remove unused output.c code

* Remove unused ignore_last parameter from _bc_do_compare()
This commit is contained in:
Niels Dossche
2024-05-04 16:00:54 +02:00
committed by GitHub
parent b8abd2693e
commit a728e541e9
8 changed files with 7 additions and 200 deletions

View File

@@ -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)

View File

@@ -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");

View File

@@ -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);

View File

@@ -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)

View File

@@ -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);
}

View File

@@ -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 <stdbool.h>
#include <string.h>
#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);
}
}
}

View File

@@ -35,7 +35,7 @@
#include <stddef.h>
/* 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);

View File

@@ -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);