commit c2befd746ede5e81fd8764a5f335ec1b9d2be1c7
parent dafc7af18fb444be19f5a649196fa4e957f267e7
Author: Andres Navarro <canavarro82@gmail.com>
Date:   Sat, 23 Apr 2011 14:39:56 -0300
Changed code in write to print strings. It now uses imath directly.
Diffstat:
3 files changed, 23 insertions(+), 25 deletions(-)
diff --git a/src/kinteger.c b/src/kinteger.c
@@ -111,6 +111,16 @@ int32_t kbigint_print_size(TValue tv_bigint, int32_t base)
     return mp_int_string_len(tv2bigint(tv_bigint), base);
 }
 
+/* this is used by write */
+void  kbigint_print_string(klisp_State *K, TValue tv_bigint, int32_t base, 
+			   char *buf, int32_t limit)
+{
+    mp_result res = mp_int_to_string(K, tv2bigint(tv_bigint), base, buf, 
+				     limit);
+    /* only possible error is truncation */
+    klisp_assert(res == MP_OK);
+}
+
 /* Interface for kgnumbers */
 bool kbigint_eqp(TValue tv_bigint1, TValue tv_bigint2)
 {
diff --git a/src/kinteger.h b/src/kinteger.h
@@ -75,6 +75,10 @@ void kbigint_invert_sign(klisp_State *K, TValue tv_bigint);
    print the number */
 int32_t kbigint_print_size(TValue tv_bigint, int32_t base);
 
+/* this is used by write */
+void  kbigint_print_string(klisp_State *K, TValue tv_bigint, int32_t base, 
+			   char *buf, int32_t limit);
+
 /* Interface for kgnumbers */
 bool kbigint_eqp(TValue bigint1, TValue bigint2);
 
diff --git a/src/kwrite.c b/src/kwrite.c
@@ -12,6 +12,7 @@
 #include "kwrite.h"
 #include "kobject.h"
 #include "kinteger.h"
+#include "krational.h"
 #include "kpair.h"
 #include "kstring.h"
 #include "ksymbol.h"
@@ -52,40 +53,23 @@ void kwrite_error(klisp_State *K, char *msg)
 }
 
 /* TODO: check for return codes and throw error if necessary */
-
+#define KDEFAULT_NUMBER_RADIX 10
 void kw_print_bigint(klisp_State *K, TValue bigint)
 {
-    int32_t size = kbigint_print_size(bigint, 10) + 
-	((kbigint_negativep(bigint))? 1 : 0);
-	
+    int32_t radix = KDEFAULT_NUMBER_RADIX;
+    int32_t size = kbigint_print_size(bigint, radix); 
     krooted_tvs_push(K, bigint);
+    /* here we are using 1 byte extra, because size already includes
+       1 for the terminator, but better be safe than sorry */
     TValue buf_str = kstring_new_s(K, size);
     krooted_tvs_push(K, buf_str);
 
-    /* write backwards so we can use printf later */
-    char *buf = kstring_buf(buf_str) + size - 1;
-
-    TValue copy = kbigint_copy(K, bigint);
-    krooted_vars_push(K, ©);
-
-    /* must work with positive bigint to get the digits */
-    if (kbigint_negativep(bigint))
-	kbigint_invert_sign(K, copy);
-
-    while(kbigint_has_digits(K, copy)) {
-	int32_t digit = kbigint_remove_digit(K, copy, 10);
-	/* write backwards so we can use printf later */
-	/* XXX: use to_digit function */
-	*buf-- = '0' + digit;
-    }
-    if (kbigint_negativep(bigint))
-	*buf-- = '-';
-
-    kw_printf(K, "%s", buf+1);
+    char *buf = kstring_buf(buf_str);
+    kbigint_print_string(K, bigint, radix, buf, size);
+    kw_printf(K, "%s", buf);
 
     krooted_tvs_pop(K);
     krooted_tvs_pop(K);
-    krooted_vars_pop(K);
 }
 
 /*