1 # Vergleich von Integers
2 
3 # I_I_comp(x,y) vergleicht zwei Integers x und y.
4 # Ergebnis: 0 falls x=y, +1 falls x>y, -1 falls x<y.
I_I_comp(object x,object y)5   global signean I_I_comp (object x, object y)
6   {
7     # Methode:
8     # x und y haben verschiedenes Vorzeichen ->
9     #    x < 0 -> x < y
10     #    x >= 0 -> x > y
11     # x und y haben gleiches Vorzeichen ->
12     # x Fixnum ->
13     #    y Fixnum -> direkt vergleichen.
14     #    y Bignum ->
15     #       y > 0 -> x < y
16     #       y < 0 -> x > y
17     # x Bignum ->
18     #    y Fixnum ->
19     #       x < 0 -> x < y
20     #       x > 0 -> x > y
21     #    y Bignum ->
22     #       falls beide gleich lang -> wortweise vergleichen
23     #       x kürzer als y -> bei x,y > 0 : x < y, bei x,y < 0 : x > y
24     #       y kürzer als x -> bei x,y > 0 : x > y, bei x,y > 0 : x < y
25     var uintC xlen;
26     var uintC ylen;
27     if (!(R_minusp(x)))
28       # x>=0
29       if (!(R_minusp(y)))
30         # x>=0, y>=0
31         if (I_fixnump(x))
32           # x Fixnum >=0, y>=0
33           if (I_fixnump(y)) {
34             # x Fixnum >=0, y Fixnum >=0
35             if (as_oint(x) == as_oint(y))
36               return signean_null;
37             else if (as_oint(x) > as_oint(y))
38               return signean_plus;
39             else
40               return signean_minus;
41           } else
42             # x Fixnum >=0, y Bignum >0
43             return signean_minus; # x<y
44         else
45           # x Bignum >0, y>=0
46           if (I_fixnump(y))
47             # x Bignum >0, y Fixnum >=0
48             return signean_plus; # x>y
49           else
50             # x und y Bignums >0
51             if (eq(x,y))
52               return signean_null; # gleiche Pointer -> selbe Zahl
53             else {
54               xlen = Bignum_length(x);
55               ylen = Bignum_length(y);
56               if (xlen==ylen)
57                samelength:
58                 # gleiche Länge -> digitweise vergleichen
59                 return compare_loop_up(&TheBignum(x)->data[0],&TheBignum(y)->data[0],xlen);
60               else
61                 return (xlen > ylen ? signean_plus : signean_minus);
62             }
63       else
64         # x>=0, y<0
65         return signean_plus; # x>y
66     else
67       # x<0
68       if (!(R_minusp(y)))
69         # x<0, y>=0
70         return signean_minus; # x<y
71       else
72         # x<0, y<0
73         if (I_fixnump(x))
74           # x Fixnum <0, y<0
75           if (I_fixnump(y)) {
76             # x Fixnum <0, y Fixnum <0
77             if (as_oint(x) == as_oint(y))
78               return signean_null;
79             else if (as_oint(x) > as_oint(y))
80               return signean_plus;
81             else
82               return signean_minus;
83           } else
84             # x Fixnum <0, y Bignum <0
85             return signean_plus; # x>y
86         else
87           # x Bignum <0, y<0
88           if (I_fixnump(y))
89             # x Bignum <0, y Fixnum <0
90             return signean_minus; # x<y
91           else
92             # x und y Bignums <0
93             if (eq(x,y))
94               return signean_null; # gleiche Pointer -> selbe Zahl
95             else {
96               xlen = Bignum_length(x);
97               ylen = Bignum_length(y);
98               if (xlen==ylen)
99                 # gleiche Länge -> wortweise vergleichen
100                 goto samelength; # wie oben
101               else
102                 return (xlen > ylen ? signean_minus : signean_plus);
103             }
104   }
105 
106