summaryrefslogtreecommitdiff
path: root/bignum.c
diff options
context:
space:
mode:
Diffstat (limited to 'bignum.c')
-rw-r--r--bignum.c18
1 files changed, 11 insertions, 7 deletions
diff --git a/bignum.c b/bignum.c
index 17d9c839c5..8a6e54a9da 100644
--- a/bignum.c
+++ b/bignum.c
@@ -24,13 +24,13 @@ VALUE cBignum;
#define BIGLO(x) ((x) & (BIGRAD-1))
static VALUE
-bignew_1(class, len, sign)
- VALUE class;
+bignew_1(klass, len, sign)
+ VALUE klass;
UINT len;
char sign;
{
NEWOBJ(big, struct RBignum);
- OBJSETUP(big, cBignum, T_BIGNUM);
+ OBJSETUP(big, klass, T_BIGNUM);
big->sign = sign;
big->len = len;
BDIGITS(big) = ALLOC_N(USHORT, len);
@@ -195,12 +195,16 @@ str2inum(str, base)
base = 10;
}
}
- len = strlen(str);
if (base == 8) {
- len = 3*len*sizeof(char);
+ while (str[0] == '0') str++;
+ len = 3*strlen(str)*sizeof(char);
}
else { /* base == 10 or 16 */
- len = 4*len*sizeof(char);
+ if (base == 16 && str[0] == '0' && (str[1] == 'x'||str[1] == 'X')) {
+ str += 2;
+ }
+ while (str[0] == '0') str++;
+ len = 4*strlen(str)*sizeof(char);
}
if (len <= (sizeof(VALUE)*CHAR_BIT)) {
@@ -1177,7 +1181,7 @@ big_abs(x)
x = big_clone(x);
RBIGNUM(x)->sign = 1;
}
- return (VALUE)x;
+ return x;
}
/* !!!warnig!!!!