(SCM_T_INTBUFLEN): Increased to cover
authorMarius Vollmer <mvo@zagadka.de>
Fri, 22 Oct 2004 13:50:39 +0000 (13:50 +0000)
committerMarius Vollmer <mvo@zagadka.de>
Fri, 22 Oct 2004 13:50:39 +0000 (13:50 +0000)
scm_t_intmax values.
(scm_uint2str): New, for scm_t_uintmax.
(scm_iint2str): Argument type changed to scm_t_intmax,
reimplemented in terms of scm_uint2str.

libguile/numbers.c
libguile/numbers.h

index 8b83f78..dde6645 100644 (file)
@@ -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;
index f663e9e..87bac7a 100644 (file)
 #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))
 
 \f
 
@@ -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);