1 // equal().
2 
3 // General includes.
4 #include "base/cl_sysdep.h"
5 
6 // Specification.
7 #include "cln/integer.h"
8 
9 
10 // Implementation.
11 
12 #include "integer/cl_I.h"
13 #include "base/digitseq/cl_DS.h"
14 
15 namespace cln {
16 
equal(const cl_I & x,const cl_I & y)17 bool equal (const cl_I& x, const cl_I& y)
18 {
19 // Methode:
20 // x und y haben gleiches Vorzeichen ->
21 // x Fixnum ->
22 //    y Fixnum -> direkt vergleichen.
23 //    y Bignum -> verschieden.
24 // x Bignum ->
25 //    y Fixnum -> verschieden.
26 //    y Bignum ->
27 //       falls beide gleich lang, wortweise vergleichen, sonst verschieden.
28       if (fixnump(x))
29         // x Fixnum
30         if (fixnump(y))
31           // x Fixnum, y Fixnum
32           { // This assumes cl_value_shift + cl_value_len == cl_pointer_size.
33             return (cl_sint)x.word == (cl_sint)y.word;
34           }
35           else
36           // x Fixnum, y Bignum
37           return false;
38         else
39         // x Bignum
40         if (fixnump(y))
41           // x Bignum, y Fixnum
42           return false;
43           else
44           // x Bignum, y Bignum
45           if (x.pointer == y.pointer)
46             return true; // gleiche Pointer -> selbe Zahl
47             else
48             { var uintC xlen = TheBignum(x)->length;
49               var uintC ylen = TheBignum(y)->length;
50               if (xlen==ylen)
51                 // gleiche Länge -> digitweise vergleichen
52                 return compare_loop_msp(BN_MSDptr(x),BN_MSDptr(y),xlen) == 0;
53                 else
54                 return false;
55             }
56 }
57 
58 }  // namespace cln
59