summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--libguile/numbers.c31
-rw-r--r--libguile/numbers.h11
2 files changed, 27 insertions, 15 deletions
diff --git a/libguile/numbers.c b/libguile/numbers.c
index 8b83f786a..dde66457f 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -2218,29 +2218,38 @@ iflo2str (SCM flt, char *str, int radix)
return i;
}
-/* convert a long to a string (unterminated). returns the number of
+/* convert a scm_t_intmax to a string (unterminated). returns the number of
characters in the result.
rad is output base
p is destination: worst case (base 2) is SCM_INTBUFLEN */
size_t
-scm_iint2str (long num, int rad, char *p)
+scm_iint2str (scm_t_intmax num, int rad, char *p)
+{
+ if (num < 0)
+ {
+ *p++ = '-';
+ return scm_iuint2str (-num, rad, p) + 1;
+ }
+ else
+ return scm_iuint2str (num, rad, p);
+}
+
+/* convert a scm_t_intmax to a string (unterminated). returns the number of
+ characters in the result.
+ rad is output base
+ p is destination: worst case (base 2) is SCM_INTBUFLEN */
+size_t
+scm_iuint2str (scm_t_uintmax num, int rad, char *p)
{
size_t j = 1;
size_t i;
- unsigned long n = (num < 0) ? -num : num;
+ scm_t_uintmax n = num;
for (n /= rad; n > 0; n /= rad)
j++;
i = j;
- if (num < 0)
- {
- *p++ = '-';
- j++;
- n = -num;
- }
- else
- n = num;
+ n = num;
while (i--)
{
int d = n % rad;
diff --git a/libguile/numbers.h b/libguile/numbers.h
index f663e9e85..87bac7a4a 100644
--- a/libguile/numbers.h
+++ b/libguile/numbers.h
@@ -111,10 +111,12 @@
#endif /* def FLT_MAX */
-/* SCM_INTBUFLEN is the maximum number of characters neccessary for the
- * printed or scm_string representation of an exact immediate.
+/* SCM_INTBUFLEN is the maximum number of characters neccessary for
+ * the printed or scm_string representation of an scm_t_intmax in
+ * radix 2. The buffer passed to scm_iint2str and scm_iuint2str must
+ * be of this size, for example.
*/
-#define SCM_INTBUFLEN (5 + SCM_LONG_BIT)
+#define SCM_INTBUFLEN (5 + SCM_CHAR_BIT*sizeof(scm_t_intmax))
@@ -208,7 +210,8 @@ SCM_API SCM scm_bit_extract (SCM n, SCM start, SCM end);
SCM_API SCM scm_logcount (SCM n);
SCM_API SCM scm_integer_length (SCM n);
-SCM_API size_t scm_iint2str (long num, int rad, char *p);
+SCM_API size_t scm_iint2str (scm_t_intmax num, int rad, char *p);
+SCM_API size_t scm_iuint2str (scm_t_uintmax num, int rad, char *p);
SCM_API SCM scm_number_to_string (SCM x, SCM radix);
SCM_API int scm_print_real (SCM sexp, SCM port, scm_print_state *pstate);
SCM_API int scm_print_complex (SCM sexp, SCM port, scm_print_state *pstate);