1 /*
  2  *  bignum_cmp.c
  3  *  BigMath
  4  *
  5  *  Created by Curtis Jones on 2007.08.05.
  6  *  Copyright 2007 __MyCompanyName__. All rights reserved.
  7  *
  8  */
  9 
 10 #include "bignum.h"
 11 
 12 /**
 13  * return zero if the two numbers are the same
 14  * returns greater than zero if the first number is greater than the second number
 15  * returns less than zero if the first number is less than the second number
 16  *
 17  */
 18 inline int
 19 bignum_cmp (bignum_t *num1, bignum_t *num2)
 20 {
 21   u_int64_t i = 0;
 22   u_int64_t num1_i=0, num2_i=0;
 23   u_int64_t num1_start = 0;
 24   u_int64_t num2_start = 0;
 25   int num1_found = FALSE;
 26   int num2_found = FALSE;
 27   
 28   if (num1 == NULL)
 29     return 0;
 30   
 31   if (num2 == NULL)
 32     return 0;
 33   
 34   if (num1->oofm == 0 && num2->oofm == 0)
 35     return 0;
 36   
 37   if (num1->sign == BIGNUM_NEGATIVE && num2->sign == BIGNUM_POSITIVE)
 38     return -1;
 39   else if (num2->sign == BIGNUM_NEGATIVE && num1->sign == BIGNUM_POSITIVE)
 40     return 1;
 41   
 42   for (i = 0; i < num1->oofm; ++i) {
 43     if (num1->numb[i] != 0) {
 44       num1_start = i;
 45       num1_found = TRUE;
 46     }
 47   }
 48   
 49   for (i = 0; i < num2->oofm; ++i) {
 50     if (num2->numb[i] != 0) {
 51       num2_start = i;
 52       num2_found = TRUE;
 53     }
 54   }
 55   
 56   if (num1_found == FALSE && num2_found == FALSE)
 57     return 0;
 58   else if (num1_found == FALSE)
 59     return -1;
 60   else if (num2_found == FALSE)
 61     return 1;
 62   
 63   if (num1_start != num2_start)
 64     return num1_start > num2_start ? 1 : -1;
 65   
 66   for (num1_i=num1_start, num2_i=num2_start; num1_i <= num1_start; --num1_i, --num2_i) {
 67     if (num1->numb[num1_i] > num2->numb[num2_i])
 68       return 1;
 69     else if (num1->numb[num1_i] < num2->numb[num2_i])
 70       return -1;
 71   }
 72   
 73   return 0;
 74 }
 75 
 76 /**
 77  * Returns 1 if num1 and num2 are equal; zero otherwise.
 78  *
 79  */
 80 inline int
 81 bignum_eq (bignum_t *num1, bignum_t *num2)
 82 {
 83   return bignum_cmp(num1, num2) == 0 ? TRUE : FALSE;
 84 }
 85 
 86 /**
 87  * Returns 1 if num1 is greater than num2; zero otherwise.
 88  *
 89  */
 90 inline int
 91 bignum_gt (bignum_t *num1, bignum_t *num2)
 92 {
 93   return bignum_cmp(num1, num2) > 0 ? TRUE : FALSE;
 94 }
 95 
 96 /**
 97  * Return 1 if num1 is less than num2; zero otherwise.
 98  *
 99  */
100 inline int
101 bignum_lt (bignum_t *num1, bignum_t *num2)
102 {
103   return bignum_cmp(num1, num2) < 0 ? TRUE : FALSE;
104 }
105 
106 /**
107  * Return 1 if num is equal to zero; zero otherwise.
108  *
109  */
110 inline int
111 bignum_iszero (bignum_t *num)
112 {
113   if (num->oofm == 0 || (num->oofm == 1 && num->numb[0] == 0))
114     return TRUE;
115   else
116     return FALSE;
117 }


syntax highlighted by Code2HTML, v. 0.9.1