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