home *** CD-ROM | disk | FTP | other *** search
/ Amiga ISO Collection / AmigaUtilCD2.iso / Programming / Misc / CLISP-1.LHA / CLISP960530-sr.lha / src / intcomp.d < prev    next >
Encoding:
Text File  |  1996-04-15  |  3.5 KB  |  104 lines

  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.
  5.   global signean I_I_comp (object x, object y);
  6.   global signean I_I_comp(x,y)
  7.     var reg3 object x;
  8.     var reg4 object y;
  9.     { # Methode:
  10.       # x und y haben verschiedenes Vorzeichen ->
  11.       #    x < 0 -> x < y
  12.       #    x >= 0 -> x > y
  13.       # x und y haben gleiches Vorzeichen ->
  14.       # x Fixnum ->
  15.       #    y Fixnum -> direkt vergleichen.
  16.       #    y Bignum ->
  17.       #       y > 0 -> x < y
  18.       #       y < 0 -> x > y
  19.       # x Bignum ->
  20.       #    y Fixnum ->
  21.       #       x < 0 -> x < y
  22.       #       x > 0 -> x > y
  23.       #    y Bignum ->
  24.       #       falls beide gleich lang -> wortweise vergleichen
  25.       #       x kürzer als y -> bei x,y > 0 : x < y, bei x,y < 0 : x > y
  26.       #       y kürzer als x -> bei x,y > 0 : x > y, bei x,y > 0 : x < y
  27.       var reg2 uintC xlen;
  28.       var reg2 uintC ylen;
  29.       if (!(R_minusp(x)))
  30.         # x>=0
  31.         if (!(R_minusp(y)))
  32.           # x>=0, y>=0
  33.           if (I_fixnump(x))
  34.             # x Fixnum >=0, y>=0
  35.             if (I_fixnump(y))
  36.               { # x Fixnum >=0, y Fixnum >=0
  37.                 if (as_oint(x) == as_oint(y)) return signean_null;
  38.                 else if (as_oint(x) > as_oint(y)) return signean_plus;
  39.                 else return signean_minus;
  40.               }
  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 = TheBignum(x)->length;
  55.                   ylen = TheBignum(y)->length;
  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)) return signean_null;
  78.                 else if (as_oint(x) > as_oint(y)) return signean_plus;
  79.                 else return signean_minus;
  80.               }
  81.               else
  82.               # x Fixnum <0, y Bignum <0
  83.               return signean_plus; # x>y
  84.             else
  85.             # x Bignum <0, y<0
  86.             if (I_fixnump(y))
  87.               # x Bignum <0, y Fixnum <0
  88.               return signean_minus; # x<y
  89.               else
  90.               # x und y Bignums <0
  91.               if (eq(x,y))
  92.                 return signean_null; # gleiche Pointer -> selbe Zahl
  93.                 else
  94.                 { xlen = TheBignum(x)->length;
  95.                   ylen = TheBignum(y)->length;
  96.                   if (xlen==ylen)
  97.                     # gleiche Länge -> wortweise vergleichen
  98.                     goto samelength; # wie oben
  99.                     else
  100.                     return (xlen > ylen ? signean_minus : signean_plus);
  101.                 }
  102.     }
  103.  
  104.