Return to sub.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / bcmath / libbcmath / src |
1.1 misho 1: /* sub.c: bcmath library file. */ 2: /* 3: Copyright (C) 1991, 1992, 1993, 1994, 1997 Free Software Foundation, Inc. 4: Copyright (C) 2000 Philip A. Nelson 5: 6: This library is free software; you can redistribute it and/or 7: modify it under the terms of the GNU Lesser General Public 8: License as published by the Free Software Foundation; either 9: version 2 of the License, or (at your option) any later version. 10: 11: This library is distributed in the hope that it will be useful, 12: but WITHOUT ANY WARRANTY; without even the implied warranty of 13: MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 14: Lesser General Public License for more details. (COPYING.LIB) 15: 16: You should have received a copy of the GNU Lesser General Public 17: License along with this library; if not, write to: 18: 19: The Free Software Foundation, Inc. 20: 59 Temple Place, Suite 330 21: Boston, MA 02111-1307 USA. 22: 23: You may contact the author by: 24: e-mail: philnelson@acm.org 25: us-mail: Philip A. Nelson 26: Computer Science Department, 9062 27: Western Washington University 28: Bellingham, WA 98226-9062 29: 30: *************************************************************************/ 31: 32: #include <config.h> 33: #include <stdio.h> 34: #include <assert.h> 35: #include <stdlib.h> 36: #include <ctype.h> 37: #include <stdarg.h> 38: #include "bcmath.h" 39: #include "private.h" 40: 41: 42: /* Here is the full subtract routine that takes care of negative numbers. 43: N2 is subtracted from N1 and the result placed in RESULT. SCALE_MIN 44: is the minimum scale for the result. */ 45: 46: void 47: bc_sub (n1, n2, result, scale_min) 48: bc_num n1, n2, *result; 49: int scale_min; 50: { 51: bc_num diff = NULL; 52: int cmp_res; 53: int res_scale; 54: 55: if (n1->n_sign != n2->n_sign) 56: { 57: diff = _bc_do_add (n1, n2, scale_min); 58: diff->n_sign = n1->n_sign; 59: } 60: else 61: { 62: /* subtraction must be done. */ 63: /* Compare magnitudes. */ 64: cmp_res = _bc_do_compare (n1, n2, FALSE, FALSE); 65: switch (cmp_res) 66: { 67: case -1: 68: /* n1 is less than n2, subtract n1 from n2. */ 69: diff = _bc_do_sub (n2, n1, scale_min); 70: diff->n_sign = (n2->n_sign == PLUS ? MINUS : PLUS); 71: break; 72: case 0: 73: /* They are equal! return zero! */ 74: res_scale = MAX (scale_min, MAX(n1->n_scale, n2->n_scale)); 75: diff = bc_new_num (1, res_scale); 76: memset (diff->n_value, 0, res_scale+1); 77: break; 78: case 1: 79: /* n2 is less than n1, subtract n2 from n1. */ 80: diff = _bc_do_sub (n1, n2, scale_min); 81: diff->n_sign = n1->n_sign; 82: break; 83: } 84: } 85: 86: /* Clean up and return. */ 87: bc_free_num (result); 88: *result = diff; 89: } 90: