commit d3e64f1fc858dbd22132f8010034658d0e904789
parent 2fb4419de3975d0dfd4034b8dd1011c17c56cae7
Author: Andres Navarro <canavarro82@gmail.com>
Date: Sun, 10 Apr 2011 19:37:51 -0300
Added support for bigints in abs applicative.
Diffstat:
3 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/src/kgnumbers.c b/src/kgnumbers.c
@@ -689,9 +689,15 @@ void kabs(klisp_State *K, TValue *xparams, TValue ptree, TValue denv)
case K_TFIXINT: {
int32_t i = ivalue(n);
kapply_cc(K, i < 0? i2tv(-i) : n);
+ return;
+ }
+ case K_TBIGINT: {
+ kapply_cc(K, kbigint_abs(K, n));
+ return;
}
case K_TEINF:
kapply_cc(K, KEPINF);
+ return;
default:
/* shouldn't happen */
assert(0);
diff --git a/src/kinteger.c b/src/kinteger.c
@@ -178,6 +178,17 @@ bool kbigint_evenp(TValue tv_bigint)
return ((bigint->last->digit) & 1) == 0;
}
+TValue kbigint_abs(klisp_State *K, TValue tv_bigint)
+{
+ if (kbigint_positivep(tv_bigint)) {
+ return tv_bigint;
+ } else {
+ TValue res = kbigint_copy(K, tv_bigint);
+ kbigint_invert_sign(res);
+ return res;
+ }
+}
+
/* Mutate the bigint to have the opposite sign, used in read */
void kbigint_invert_sign(TValue tv_bigint)
{
diff --git a/src/kinteger.h b/src/kinteger.h
@@ -54,6 +54,9 @@ bool kbigint_positivep(TValue tv_bigint);
bool kbigint_oddp(TValue tv_bigint);
bool kbigint_evenp(TValue tv_bigint);
+/* needs the state to create a copy if negative */
+TValue kbigint_abs(klisp_State *K, TValue tv_bigint);
+
/* Mutate the bigint to have the opposite sign, used in read & write */
void kbigint_invert_sign(TValue tv_bigint);