diff options
author | Lorry Tar Creator <lorry-tar-importer@baserock.org> | 2013-03-14 05:42:27 +0000 |
---|---|---|
committer | <> | 2013-04-03 16:25:08 +0000 |
commit | c4dd7a1a684490673e25aaf4fabec5df138854c4 (patch) | |
tree | 4d57c44caae4480efff02b90b9be86f44bf25409 /ext/bcmath/libbcmath/src/divmod.c | |
download | php2-master.tar.gz |
Imported from /home/lorry/working-area/delta_php2/php-5.4.13.tar.bz2.HEADphp-5.4.13master
Diffstat (limited to 'ext/bcmath/libbcmath/src/divmod.c')
-rw-r--r-- | ext/bcmath/libbcmath/src/divmod.c | 87 |
1 files changed, 87 insertions, 0 deletions
diff --git a/ext/bcmath/libbcmath/src/divmod.c b/ext/bcmath/libbcmath/src/divmod.c new file mode 100644 index 0000000..2949bd1 --- /dev/null +++ b/ext/bcmath/libbcmath/src/divmod.c @@ -0,0 +1,87 @@ +/* divmod.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. (COPYING.LIB) + + 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 <config.h> +#include <stdio.h> +#include <assert.h> +#include <stdlib.h> +#include <ctype.h> +#include <stdarg.h> +#include "bcmath.h" +#include "private.h" + + +/* Division *and* modulo for numbers. This computes both NUM1 / NUM2 and + NUM1 % NUM2 and puts the results in QUOT and REM, except that if QUOT + is NULL then that store will be omitted. + */ + +int +bc_divmod (bc_num num1, bc_num num2, bc_num *quot, bc_num *rem, int scale TSRMLS_DC) +{ + bc_num quotient = NULL; + bc_num temp; + int rscale; + + /* Check for correct numbers. */ + if (bc_is_zero (num2 TSRMLS_CC)) return -1; + + /* Calculate final scale. */ + rscale = MAX (num1->n_scale, num2->n_scale+scale); + bc_init_num(&temp TSRMLS_CC); + + /* Calculate it. */ + bc_divide (num1, num2, &temp, scale TSRMLS_CC); + if (quot) + quotient = bc_copy_num (temp); + bc_multiply (temp, num2, &temp, rscale TSRMLS_CC); + bc_sub (num1, temp, rem, rscale); + bc_free_num (&temp); + + if (quot) + { + bc_free_num (quot); + *quot = quotient; + } + + return 0; /* Everything is OK. */ +} + + +/* Modulo for numbers. This computes NUM1 % NUM2 and puts the + result in RESULT. */ + +int +bc_modulo (bc_num num1, bc_num num2, bc_num *result, int scale TSRMLS_DC) +{ + return bc_divmod (num1, num2, NULL, result, scale TSRMLS_CC); +} + |