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