Return to compare.c CVS log | Up to [ELWIX - Embedded LightWeight unIX -] / embedaddon / php / ext / bcmath / libbcmath / src |
1.1 misho 1: /* compare.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: /* Compare two bc numbers. Return value is 0 if equal, -1 if N1 is less 43: than N2 and +1 if N1 is greater than N2. If USE_SIGN is false, just 44: compare the magnitudes. */ 45: 46: int 47: _bc_do_compare (n1, n2, use_sign, ignore_last) 48: bc_num n1, n2; 49: int use_sign; 50: int ignore_last; 51: { 52: char *n1ptr, *n2ptr; 53: int count; 54: 55: /* First, compare signs. */ 56: if (use_sign && n1->n_sign != n2->n_sign) 57: { 58: if (n1->n_sign == PLUS) 59: return (1); /* Positive N1 > Negative N2 */ 60: else 61: return (-1); /* Negative N1 < Positive N1 */ 62: } 63: 64: /* Now compare the magnitude. */ 65: if (n1->n_len != n2->n_len) 66: { 67: if (n1->n_len > n2->n_len) 68: { 69: /* Magnitude of n1 > n2. */ 70: if (!use_sign || n1->n_sign == PLUS) 71: return (1); 72: else 73: return (-1); 74: } 75: else 76: { 77: /* Magnitude of n1 < n2. */ 78: if (!use_sign || n1->n_sign == PLUS) 79: return (-1); 80: else 81: return (1); 82: } 83: } 84: 85: /* If we get here, they have the same number of integer digits. 86: check the integer part and the equal length part of the fraction. */ 87: count = n1->n_len + MIN (n1->n_scale, n2->n_scale); 88: n1ptr = n1->n_value; 89: n2ptr = n2->n_value; 90: 91: while ((count > 0) && (*n1ptr == *n2ptr)) 92: { 93: n1ptr++; 94: n2ptr++; 95: count--; 96: } 97: if (ignore_last && count == 1 && n1->n_scale == n2->n_scale) 98: return (0); 99: if (count != 0) 100: { 101: if (*n1ptr > *n2ptr) 102: { 103: /* Magnitude of n1 > n2. */ 104: if (!use_sign || n1->n_sign == PLUS) 105: return (1); 106: else 107: return (-1); 108: } 109: else 110: { 111: /* Magnitude of n1 < n2. */ 112: if (!use_sign || n1->n_sign == PLUS) 113: return (-1); 114: else 115: return (1); 116: } 117: } 118: 119: /* They are equal up to the last part of the equal part of the fraction. */ 120: if (n1->n_scale != n2->n_scale) 121: { 122: if (n1->n_scale > n2->n_scale) 123: { 124: for (count = n1->n_scale-n2->n_scale; count>0; count--) 125: if (*n1ptr++ != 0) 126: { 127: /* Magnitude of n1 > n2. */ 128: if (!use_sign || n1->n_sign == PLUS) 129: return (1); 130: else 131: return (-1); 132: } 133: } 134: else 135: { 136: for (count = n2->n_scale-n1->n_scale; count>0; count--) 137: if (*n2ptr++ != 0) 138: { 139: /* Magnitude of n1 < n2. */ 140: if (!use_sign || n1->n_sign == PLUS) 141: return (-1); 142: else 143: return (1); 144: } 145: } 146: } 147: 148: /* They must be equal! */ 149: return (0); 150: } 151: 152: 153: /* This is the "user callable" routine to compare numbers N1 and N2. */ 154: 155: int 156: bc_compare (n1, n2) 157: bc_num n1, n2; 158: { 159: return _bc_do_compare (n1, n2, TRUE, FALSE); 160: } 161: