Annotation of embedaddon/php/ext/bcmath/libbcmath/src/compare.c, revision 1.1.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>