Annotation of embedaddon/php/ext/bcmath/libbcmath/src/compare.c, revision 1.1
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:
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>