klisp

an open source interpreter for the Kernel Programming Language.
git clone http://git.hanabi.in/repos/klisp.git
Log | Files | Refs | README

commit b8a3e2ab88cfe9d161718fcb789fc59dac9049ec
parent 20a2e94b95f262300a08b55f5eb7f389baaaaa9c
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Sat, 23 Apr 2011 13:29:31 -0300

Added interface for creating bigrats.

Diffstat:
Msrc/kinteger.c | 2+-
Msrc/krational.c | 38++++++++++++++++++++++++++++++++++++++
Msrc/krational.h | 6+++---
3 files changed, 42 insertions(+), 4 deletions(-)

diff --git a/src/kinteger.c b/src/kinteger.c @@ -32,7 +32,7 @@ inline TValue kbigint_try_fixint(klisp_State *K, TValue n) } } -/* for now used only for reading */ +/* It is used for reading and for creating temps and res in all operations */ /* NOTE: is uint to allow INT32_MIN as positive argument in read */ TValue kbigint_new(klisp_State *K, bool sign, uint32_t digit) { diff --git a/src/krational.c b/src/krational.c @@ -41,4 +41,42 @@ inline TValue kbigrat_try_integer(klisp_State *K, TValue n) return copy; } +/* used for res & temps in operations */ +/* NOTE: This is to be called only with already reduced values */ +TValue kbigrat_new(klisp_State *K, bool sign, uint32_t num, + uint32_t den) +{ + Bigrat *new_bigrat = klispM_new(K, Bigrat); + + /* header + gc_fields */ + klispC_link(K, (GCObject *) new_bigrat, K_TBIGRAT, 0); + + /* bigrat specific fields */ + /* If later changed to alloc obj: + GC: root bigint & put dummy value to work if garbage collections + happens while allocating array */ + new_bigrat->num.single = num; + new_bigrat->num.digits = &(new_bigrat->num.single); + new_bigrat->num.alloc = 1; + new_bigrat->num.used = 1; + new_bigrat->num.sign = sign? MP_NEG : MP_ZPOS; + + new_bigrat->den.single = den; + new_bigrat->den.digits = &(new_bigrat->den.single); + new_bigrat->den.alloc = 1; + new_bigrat->den.used = 1; + new_bigrat->den.sign = MP_ZPOS; + + return gc2bigrat(new_bigrat); +} + +/* assumes src is rooted */ +TValue kbigrat_copy(klisp_State *K, TValue src) +{ + TValue copy = kbigrat_new(K, false, 0, 1); + /* arguments are in reverse order with respect to mp_rat_copy */ + UNUSED(mp_int_init_copy(K, tv2bigrat(copy), tv2bigrat(src))); + return copy; +} +/* Interface for kgnumbers */ diff --git a/src/krational.h b/src/krational.h @@ -18,9 +18,9 @@ /* TEMP: for now we only implement bigrats (memory allocated) */ -/* TODO: how to alloc?? */ -/* TEMP: we'll see about these */ -/* for now used only for reading */ +/* TEMP: we'll see about reading & writing... */ + +/* used in reading and for res & temps in operations */ TValue kbigrat_new(klisp_State *K, bool sign, uint32_t num, uint32_t den);