summaryrefslogtreecommitdiff
path: root/numeric.c
diff options
context:
space:
mode:
Diffstat (limited to 'numeric.c')
-rw-r--r--numeric.c96
1 files changed, 61 insertions, 35 deletions
diff --git a/numeric.c b/numeric.c
index f5e843e32c..1bf00927b7 100644
--- a/numeric.c
+++ b/numeric.c
@@ -134,7 +134,7 @@ num_chr(num)
VALUE num;
{
char c;
- INT i = NUM2INT(num);
+ long i = NUM2LONG(num);
if (i < 0 || 0xff < i)
Fail("%d out of char range", i);
@@ -276,7 +276,7 @@ static VALUE
flo_div(x, y)
VALUE x, y;
{
- INT f_y;
+ long f_y;
double d;
switch (TYPE(y)) {
@@ -563,7 +563,7 @@ flo_to_i(num)
VALUE num;
{
double f = RFLOAT(num)->value;
- INT val;
+ long val;
if (!FIXABLE(f)) {
return dbl2big(f);
@@ -612,8 +612,8 @@ fail_to_integer(val)
rb_class2name(CLASS_OF(val)));
}
-INT
-num2int(val)
+long
+num2long(val)
VALUE val;
{
if (NIL_P(val)) {
@@ -625,16 +625,16 @@ num2int(val)
return FIX2INT(val);
case T_FLOAT:
- if (RFLOAT(val)->value <= (double)INT_MAX
- && RFLOAT(val)->value >= (double)INT_MIN) {
- return (int)(RFLOAT(val)->value);
+ if (RFLOAT(val)->value <= (double)LONG_MAX
+ && RFLOAT(val)->value >= (double)LONG_MIN) {
+ return (long)(RFLOAT(val)->value);
}
else {
TypeError("float %g out of rang of integer", RFLOAT(val)->value);
}
case T_BIGNUM:
- return big2int(val);
+ return big2long(val);
case T_STRING:
TypeError("no implicit conversion from string");
@@ -645,29 +645,55 @@ num2int(val)
if (!obj_is_kind_of(val, cInteger)) {
TypeError("`to_i' need to return integer");
}
- return NUM2INT(val);
+ return NUM2LONG(val);
}
}
-UINT
-num2uint(val)
+unsigned long
+num2ulong(val)
VALUE val;
{
if (TYPE(val) == T_BIGNUM) {
- return big2uint(val);
+ return big2ulong(val);
+ }
+ return (unsigned long)num2long(val);
+}
+
+#if SIZEOF_INT < SIZEOF_LONG
+int
+num2int(val)
+ VALUE val;
+{
+ long num = num2int(val);
+
+ if (num < INT_MIN || INT_MAX < num) {
+ ArgError("integer %d too big to convert to `int'.", num);
+ }
+ return (int)num;
+}
+
+int
+fix2int(val)
+ VALUE val;
+{
+ long num = FIXNUM_P(val)?FIX2LONG(val):num2long(val);
+
+ if (num < INT_MIN || INT_MAX < num) {
+ ArgError("integer %d too big to convert to `int'.", num);
}
- return (UINT)num2int(val);
+ return (int)num;
}
+#endif
VALUE
num2fix(val)
VALUE val;
{
- INT v;
+ long v;
if (FIXNUM_P(val)) return val;
- v = num2int(val);
+ v = num2long(val);
if (!FIXABLE(v))
Fail("integer %d out of range of fixnum", v);
return INT2FIX(v);
@@ -725,7 +751,7 @@ fix_plus(x, y)
switch (TYPE(y)) {
case T_FIXNUM:
{
- INT a, b, c;
+ long a, b, c;
VALUE r;
a = FIX2INT(x);
@@ -752,7 +778,7 @@ fix_minus(x, y)
switch (TYPE(y)) {
case T_FIXNUM:
{
- INT a, b, c;
+ long a, b, c;
VALUE r;
a = FIX2INT(x);
@@ -779,7 +805,7 @@ fix_mul(x, y)
switch (TYPE(y)) {
case T_FIXNUM:
{
- INT a, b, c;
+ long a, b, c;
VALUE r;
a = FIX2INT(x);
@@ -805,7 +831,7 @@ static VALUE
fix_div(x, y)
VALUE x, y;
{
- INT i;
+ long i;
if (TYPE(y) == T_FIXNUM) {
i = FIX2INT(y);
@@ -820,7 +846,7 @@ static VALUE
fix_modulo(x, y, modulo)
VALUE x, y;
{
- INT i;
+ long i;
if (TYPE(y) == T_FIXNUM) {
i = FIX2INT(y);
@@ -855,7 +881,7 @@ fix_pow(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
- INT a, b;
+ long a, b;
b = FIX2INT(y);
if (b == 0) return INT2FIX(1);
@@ -888,7 +914,7 @@ fix_cmp(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
- INT a = FIX2INT(x), b = FIX2INT(y);
+ long a = FIX2INT(x), b = FIX2INT(y);
if (a == b) return INT2FIX(0);
if (a > b) return INT2FIX(1);
@@ -904,7 +930,7 @@ fix_gt(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
- INT a = FIX2INT(x), b = FIX2INT(y);
+ long a = FIX2INT(x), b = FIX2INT(y);
if (a > b) return TRUE;
return FALSE;
@@ -919,7 +945,7 @@ fix_ge(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
- INT a = FIX2INT(x), b = FIX2INT(y);
+ long a = FIX2INT(x), b = FIX2INT(y);
if (a >= b) return TRUE;
return FALSE;
@@ -934,7 +960,7 @@ fix_lt(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
- INT a = FIX2INT(x), b = FIX2INT(y);
+ long a = FIX2INT(x), b = FIX2INT(y);
if (a < b) return TRUE;
return FALSE;
@@ -949,7 +975,7 @@ fix_le(x, y)
VALUE x, y;
{
if (FIXNUM_P(y)) {
- INT a = FIX2INT(x), b = FIX2INT(y);
+ long a = FIX2INT(x), b = FIX2INT(y);
if (a <= b) return TRUE;
return FALSE;
@@ -1031,7 +1057,7 @@ fix_rshift(x, y)
long i, val;
i = NUM2INT(y);
- if (i < sizeof(INT) * 8) {
+ if (i < sizeof(long) * 8) {
val = RSHIFT(FIX2INT(x), i);
return INT2FIX(val);
}
@@ -1082,7 +1108,7 @@ static VALUE
fix_abs(fix)
VALUE fix;
{
- INT i = FIX2INT(fix);
+ long i = FIX2INT(fix);
if (i < 0) i = -i;
@@ -1102,7 +1128,7 @@ static VALUE
fix_succ(fix)
VALUE fix;
{
- INT i = FIX2INT(fix) + 1;
+ long i = FIX2INT(fix) + 1;
return int2inum(i);
}
@@ -1111,7 +1137,7 @@ static VALUE
fix_size(fix)
VALUE fix;
{
- return INT2FIX(sizeof(INT));
+ return INT2FIX(sizeof(long));
}
VALUE
@@ -1185,7 +1211,7 @@ VALUE
fix_upto(from, to)
VALUE from, to;
{
- INT i, end;
+ long i, end;
if (!FIXNUM_P(to)) return num_upto(from, to);
end = FIX2INT(to);
@@ -1200,7 +1226,7 @@ static VALUE
fix_downto(from, to)
VALUE from, to;
{
- INT i, end;
+ long i, end;
if (!FIXNUM_P(to)) return num_downto(from, to);
end = FIX2INT(to);
@@ -1215,7 +1241,7 @@ static VALUE
fix_step(from, to, step)
VALUE from, to, step;
{
- INT i, end, diff;
+ long i, end, diff;
if (!FIXNUM_P(to) || !FIXNUM_P(step))
return num_step(from, to, step);
@@ -1243,7 +1269,7 @@ static VALUE
fix_dotimes(num)
VALUE num;
{
- INT i, end;
+ long i, end;
end = FIX2INT(num);
for (i=0; i<end; i++) {