Back to index

php5  5.3.10
Functions
compare.c File Reference
#include <config.h>
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdarg.h>
#include "bcmath.h"
#include "private.h"

Go to the source code of this file.

Functions

int _bc_do_compare (bc_num n1, bc_num n2, int use_sign, int ignore_last)
int bc_compare (bc_num n1, bc_num n2)

Function Documentation

int _bc_do_compare ( bc_num  n1,
bc_num  n2,
int  use_sign,
int  ignore_last 
)

Definition at line 47 of file compare.c.

{
  char *n1ptr, *n2ptr;
  int  count;

  /* First, compare signs. */
  if (use_sign && n1->n_sign != n2->n_sign)
    {
      if (n1->n_sign == PLUS)
       return (1);   /* Positive N1 > Negative N2 */
      else
       return (-1);  /* Negative N1 < Positive N1 */
    }

  /* Now compare the magnitude. */
  if (n1->n_len != n2->n_len)
    {
      if (n1->n_len > n2->n_len)
       {
         /* Magnitude of n1 > n2. */
         if (!use_sign || n1->n_sign == PLUS)
           return (1);
         else
           return (-1);
       }
      else
       {
         /* Magnitude of n1 < n2. */
         if (!use_sign || n1->n_sign == PLUS)
           return (-1);
         else
           return (1);
       }
    }

  /* If we get here, they have the same number of integer digits.
     check the integer part and the equal length part of the fraction. */
  count = n1->n_len + MIN (n1->n_scale, n2->n_scale);
  n1ptr = n1->n_value;
  n2ptr = n2->n_value;

  while ((count > 0) && (*n1ptr == *n2ptr))
    {
      n1ptr++;
      n2ptr++;
      count--;
    }
  if (ignore_last && count == 1 && n1->n_scale == n2->n_scale)
    return (0);
  if (count != 0)
    {
      if (*n1ptr > *n2ptr)
       {
         /* Magnitude of n1 > n2. */
         if (!use_sign || n1->n_sign == PLUS)
           return (1);
         else
           return (-1);
       }
      else
       {
         /* Magnitude of n1 < n2. */
         if (!use_sign || n1->n_sign == PLUS)
           return (-1);
         else
           return (1);
       }
    }

  /* They are equal up to the last part of the equal part of the fraction. */
  if (n1->n_scale != n2->n_scale)
    {
      if (n1->n_scale > n2->n_scale)
       {
         for (count = n1->n_scale-n2->n_scale; count>0; count--)
           if (*n1ptr++ != 0)
             {
              /* Magnitude of n1 > n2. */
              if (!use_sign || n1->n_sign == PLUS)
                return (1);
              else
                return (-1);
             }
       }
      else
       {
         for (count = n2->n_scale-n1->n_scale; count>0; count--)
           if (*n2ptr++ != 0)
             {
              /* Magnitude of n1 < n2. */
              if (!use_sign || n1->n_sign == PLUS)
                return (-1);
              else
                return (1);
             }
       }
    }

  /* They must be equal! */
  return (0);
}

Here is the caller graph for this function:

int bc_compare ( bc_num  n1,
bc_num  n2 
)

Definition at line 156 of file compare.c.

{
  return _bc_do_compare (n1, n2, TRUE, FALSE);
}

Here is the call graph for this function:

Here is the caller graph for this function: