diff options
author | Zeev Suraski <zeev@php.net> | 2000-11-22 20:20:02 +0000 |
---|---|---|
committer | Zeev Suraski <zeev@php.net> | 2000-11-22 20:20:02 +0000 |
commit | c476bce2f1493f46b7bdd1932255a43ae2c7fe44 (patch) | |
tree | 551268ab8c74fe5042ca6a7dfe85458786bf1431 /ext/bcmath/libbcmath/src/divmod.c | |
parent | be6ab204158c836b10e1f586059462807288e2e3 (diff) | |
download | php-git-c476bce2f1493f46b7bdd1932255a43ae2c7fe44.tar.gz |
At long last, import the bcmath library, by Phil Nelson
Diffstat (limited to 'ext/bcmath/libbcmath/src/divmod.c')
-rw-r--r-- | ext/bcmath/libbcmath/src/divmod.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/ext/bcmath/libbcmath/src/divmod.c b/ext/bcmath/libbcmath/src/divmod.c new file mode 100644 index 0000000000..e62817d00b --- /dev/null +++ b/ext/bcmath/libbcmath/src/divmod.c @@ -0,0 +1,91 @@ +/* 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 (num1, num2, quot, rem, scale) + bc_num num1, num2, *quot, *rem; + int scale; +{ + bc_num quotient = NULL; + bc_num temp; + int rscale; + + /* Check for correct numbers. */ + if (bc_is_zero (num2)) return -1; + + /* Calculate final scale. */ + rscale = MAX (num1->n_scale, num2->n_scale+scale); + bc_init_num(&temp); + + /* Calculate it. */ + bc_divide (num1, num2, &temp, scale); + if (quot) + quotient = bc_copy_num (temp); + bc_multiply (temp, num2, &temp, rscale); + 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 (num1, num2, result, scale) + bc_num num1, num2, *result; + int scale; +{ + return bc_divmod (num1, num2, NULL, result, scale); +} + |