klisp

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

commit 9f47db702daf8a966db4c81554e013062bcbdd48
parent 802ce6d81a34db455610b4dcd7e6868d21da6fcc
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Sat, 23 Apr 2011 10:35:19 -0300

Added klisp_State * argument to all functions that may perform allocation.

Diffstat:
Msrc/imath.c | 13+++++++------
Msrc/imrat.c | 7++++++-
Msrc/imrat.h | 91++++++++++++++++++++++++++++++++++++++++++++++++-------------------------------
3 files changed, 68 insertions(+), 43 deletions(-)

diff --git a/src/imath.c b/src/imath.c @@ -23,18 +23,19 @@ #include <assert.h> -#if DEBUG -#define STATIC /* public */ -#else -#define STATIC static -#endif - /* Andres Navarro: klisp includes */ #include "kobject.h" #include "kstate.h" #include "kmem.h" #include "kerror.h" + +#if DEBUG +#define STATIC /* public */ +#else +#define STATIC static +#endif + /* {{{ Constants */ const mp_result MP_OK = 0; /* no error, all is well */ diff --git a/src/imrat.c b/src/imrat.c @@ -17,6 +17,12 @@ #include <ctype.h> #include <assert.h> +/* Andres Navarro: klisp includes */ +#include "kobject.h" +#include "kstate.h" +#include "kmem.h" +#include "kerror.h" + /* {{{ Useful macros */ #define TEMP(K) (temp + (K)) @@ -125,7 +131,6 @@ void mp_rat_clear(mp_rat r) { mp_int_clear(MP_NUMER_P(r)); mp_int_clear(MP_DENOM_P(r)); - } /* }}} */ diff --git a/src/imrat.h b/src/imrat.h @@ -49,40 +49,57 @@ typedef enum { MP_ROUND_HALF_DOWN } mp_round_mode; -mp_result mp_rat_init(mp_rat r); -mp_rat mp_rat_alloc(void); -mp_result mp_rat_init_size(mp_rat r, mp_size n_prec, mp_size d_prec); -mp_result mp_rat_init_copy(mp_rat r, mp_rat old); -mp_result mp_rat_set_value(mp_rat r, int numer, int denom); -void mp_rat_clear(mp_rat r); -void mp_rat_free(mp_rat r); -mp_result mp_rat_numer(mp_rat r, mp_int z); /* z = num(r) */ -mp_result mp_rat_denom(mp_rat r, mp_int z); /* z = den(r) */ +mp_result mp_rat_init(klisp_State *K, mp_rat r); +mp_rat mp_rat_alloc(klisp_State *K); +mp_result mp_rat_init_size(klisp_State *K, mp_rat r, mp_size n_prec, + mp_size d_prec); +mp_result mp_rat_init_copy(klisp_State *K, mp_rat r, mp_rat old); +mp_result mp_rat_set_value(klisp_State *K, mp_rat r, int numer, int denom); +void mp_rat_clear(klisp_State *K, mp_rat r); +void mp_rat_free(klisp_State *K, mp_rat r); +mp_result mp_rat_numer(klisp_State *K, mp_rat r, mp_int z); /* z = num(r) */ +mp_result mp_rat_denom(klisp_State *K, mp_rat r, mp_int z); /* z = den(r) */ +/* NOTE: this doesn't use the allocator */ mp_sign mp_rat_sign(mp_rat r); -mp_result mp_rat_copy(mp_rat a, mp_rat c); /* c = a */ +mp_result mp_rat_copy(klisp_State *K, mp_rat a, mp_rat c); /* c = a */ +/* NOTE: this doesn't use the allocator */ void mp_rat_zero(mp_rat r); /* r = 0 */ -mp_result mp_rat_abs(mp_rat a, mp_rat c); /* c = |a| */ -mp_result mp_rat_neg(mp_rat a, mp_rat c); /* c = -a */ -mp_result mp_rat_recip(mp_rat a, mp_rat c); /* c = 1 / a */ -mp_result mp_rat_add(mp_rat a, mp_rat b, mp_rat c); /* c = a + b */ -mp_result mp_rat_sub(mp_rat a, mp_rat b, mp_rat c); /* c = a - b */ -mp_result mp_rat_mul(mp_rat a, mp_rat b, mp_rat c); /* c = a * b */ -mp_result mp_rat_div(mp_rat a, mp_rat b, mp_rat c); /* c = a / b */ - -mp_result mp_rat_add_int(mp_rat a, mp_int b, mp_rat c); /* c = a + b */ -mp_result mp_rat_sub_int(mp_rat a, mp_int b, mp_rat c); /* c = a - b */ -mp_result mp_rat_mul_int(mp_rat a, mp_int b, mp_rat c); /* c = a * b */ -mp_result mp_rat_div_int(mp_rat a, mp_int b, mp_rat c); /* c = a / b */ -mp_result mp_rat_expt(mp_rat a, mp_small b, mp_rat c); /* c = a ^ b */ - -int mp_rat_compare(mp_rat a, mp_rat b); /* a <=> b */ -int mp_rat_compare_unsigned(mp_rat a, mp_rat b); /* |a| <=> |b| */ -int mp_rat_compare_zero(mp_rat r); /* r <=> 0 */ -int mp_rat_compare_value(mp_rat r, mp_small n, mp_small d); /* r <=> n/d */ +mp_result mp_rat_abs(klisp_State *K, mp_rat a, mp_rat c); /* c = |a| */ +mp_result mp_rat_neg(klisp_State *K, mp_rat a, mp_rat c); /* c = -a */ +mp_result mp_rat_recip(klisp_State *K, mp_rat a, mp_rat c); /* c = 1 / a */ +/* c = a + b */ +mp_result mp_rat_add(klisp_State *K, mp_rat a, mp_rat b, mp_rat c); +/* c = a - b */ +mp_result mp_rat_sub(klisp_State *K, mp_rat a, mp_rat b, mp_rat c); +/* c = a * b */ +mp_result mp_rat_mul(klisp_State *K, mp_rat a, mp_rat b, mp_rat c); +/* c = a / b */ +mp_result mp_rat_div(klisp_State *K, mp_rat a, mp_rat b, mp_rat c); + +/* c = a + b */ +mp_result mp_rat_add_int(klisp_State *K, mp_rat a, mp_int b, mp_rat c); +/* c = a - b */ +mp_result mp_rat_sub_int(klisp_State *K, mp_rat a, mp_int b, mp_rat c); +/* c = a * b */ +mp_result mp_rat_mul_int(klisp_State *K, mp_rat a, mp_int b, mp_rat c); +/* c = a / b */ +mp_result mp_rat_div_int(klisp_State *K, mp_rat a, mp_int b, mp_rat c); +/* c = a ^ b */ +mp_result mp_rat_expt(klisp_State *K, mp_rat a, mp_small b, mp_rat c); + +/* NOTE: because we may need to do multiplications, some of + these take a klisp_State */ +int mp_rat_compare(klisp_State *K, mp_rat a, mp_rat b); /* a <=> b */ +/* |a| <=> |b| */ +int mp_rat_compare_unsigned(klisp_State *K, mp_rat a, mp_rat b); +int mp_rat_compare_zero(mp_rat r); /* r <=> 0 */ +int mp_rat_compare_value(klisp_State *K, mp_rat r, mp_small n, + mp_small d); /* r <=> n/d */ int mp_rat_is_integer(mp_rat r); /* Convert to integers, if representable (returns MP_RANGE if not). */ +/* NOTE: this doesn't use the allocator */ mp_result mp_rat_to_ints(mp_rat r, mp_small *num, mp_small *den); /* Convert to nul-terminated string with the specified radix, writing @@ -103,16 +120,18 @@ mp_result mp_rat_string_len(mp_rat r, mp_size radix); mp_result mp_rat_decimal_len(mp_rat r, mp_size radix, mp_size prec); /* Read zero-terminated string into r */ -mp_result mp_rat_read_string(mp_rat r, mp_size radix, const char *str); -mp_result mp_rat_read_cstring(mp_rat r, mp_size radix, const char *str, - char **end); -mp_result mp_rat_read_ustring(mp_rat r, mp_size radix, const char *str, - char **end); +mp_result mp_rat_read_string(klisp_State *K, mp_rat r, mp_size radix, + const char *str); +mp_result mp_rat_read_cstring(klisp_State *K, mp_rat r, mp_size radix, + const char *str, char **end); +mp_result mp_rat_read_ustring(klisp_State *K, mp_rat r, mp_size radix, + const char *str, char **end); /* Read zero-terminated string in decimal format into r */ -mp_result mp_rat_read_decimal(mp_rat r, mp_size radix, const char *str); -mp_result mp_rat_read_cdecimal(mp_rat r, mp_size radix, const char *str, - char **end); +mp_result mp_rat_read_decimal(klisp_State *K, mp_rat r, mp_size radix, + const char *str); +mp_result mp_rat_read_cdecimal(klisp_State *K, mp_rat r, mp_size radix, + const char *str, char **end); #ifdef __cplusplus }