summaryrefslogtreecommitdiffstats
path: root/arith.c
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2012-10-01 17:35:10 -0700
committerKaz Kylheku <kaz@kylheku.com>2012-10-01 17:35:10 -0700
commit40bae281a56c9e305852905dcbd29125de388b25 (patch)
treee2f1675ca58161fb791e179acf31c744b64deb63 /arith.c
parentbaf80248032cdb8856d9e3217d48e9fd5e9e49c5 (diff)
downloadtxr-40bae281a56c9e305852905dcbd29125de388b25.tar.gz
txr-40bae281a56c9e305852905dcbd29125de388b25.tar.bz2
txr-40bae281a56c9e305852905dcbd29125de388b25.zip
* arith.c (bignum_from_long): New function.
* arith.h (bignum_from_long): Declared. * lib.c (int_str): Streamlined. Only use mp_read_radix in the case when wcstol fails, because now we have bignum_from_long to handle all values of long. Ensure that the bignum is normalized, in case it falls in the fixnum range (does not happen on our usual platforms).
Diffstat (limited to 'arith.c')
-rw-r--r--arith.c11
1 files changed, 11 insertions, 0 deletions
diff --git a/arith.c b/arith.c
index 8e245e71..b1ae1677 100644
--- a/arith.c
+++ b/arith.c
@@ -68,6 +68,17 @@ val bignum(cnum cn)
return n;
}
+val bignum_from_long(long l)
+{
+#if SIZEOF_LONG <= SIZEOF_PTR
+ return bignum(l);
+#else
+ val n = make_bignum();
+ mp_set_int(mp(n), l);
+ return n;
+#endif
+}
+
#if HAVE_DOUBLE_INTPTR_T
static val bignum_dbl_ipt(double_intptr_t di)