diff options
-rw-r--r-- | libguile/numbers.c | 31 | ||||
-rw-r--r-- | libguile/numbers.h | 11 |
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); |