guile-commits
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Guile-commits] 51/85: Reimplement scm_{to,from}_{int64,uint64}


From: Andy Wingo
Subject: [Guile-commits] 51/85: Reimplement scm_{to,from}_{int64,uint64}
Date: Thu, 13 Jan 2022 03:40:21 -0500 (EST)

wingo pushed a commit to branch main
in repository guile.

commit 1802ed17b367be95be5e9f562624ad518f35b1c3
Author: Andy Wingo <wingo@pobox.com>
AuthorDate: Thu Jan 6 21:12:50 2022 +0100

    Reimplement scm_{to,from}_{int64,uint64}
    
    * libguile/numbers.c (scm_to_int64, scm_from_int64, scm_to_uint64):
    (scm_from_uint64): Reimplement inline.
---
 libguile/numbers.c | 63 +++++++++++++++++++++++++++++++++++++++---------------
 1 file changed, 46 insertions(+), 17 deletions(-)

diff --git a/libguile/numbers.c b/libguile/numbers.c
index 22321ebb2..9ea860600 100644
--- a/libguile/numbers.c
+++ b/libguile/numbers.c
@@ -6996,7 +6996,7 @@ scm_to_uint32 (SCM arg)
 #if SCM_SIZEOF_LONG == 4
   if (SCM_I_INUMP (arg))
     {
-      if (SCM_I_INUM (arg) > 0)
+      if (SCM_I_INUM (arg) >= 0)
         return SCM_I_INUM (arg);
     }
   else if (SCM_BIGP (arg))
@@ -7027,6 +7027,51 @@ scm_from_uint32 (uint32_t arg)
 #endif
 }
 
+int64_t
+scm_to_int64 (SCM arg)
+{
+  if (SCM_I_INUMP (arg))
+    return SCM_I_INUM (arg);
+  else if (!SCM_BIGP (arg))
+    scm_wrong_type_arg_msg (NULL, 0, arg, "exact integer");
+  int64_t ret;
+  if (scm_integer_to_int64_z (scm_bignum (arg), &ret))
+    return ret;
+  range_error (arg, scm_integer_from_int64 (INT64_MIN),
+               scm_integer_from_int64 (INT64_MAX));
+}
+
+SCM
+scm_from_int64 (int64_t arg)
+{
+  return scm_integer_from_int64 (arg);
+}
+
+uint64_t
+scm_to_uint64 (SCM arg)
+{
+  if (SCM_I_INUMP (arg))
+    {
+      if (SCM_I_INUM (arg) >= 0)
+        return SCM_I_INUM (arg);
+    }
+  else if (SCM_BIGP (arg))
+    {
+      uint64_t ret;
+      if (scm_integer_to_uint64_z (scm_bignum (arg), &ret))
+        return ret;
+    }
+  else
+    scm_wrong_type_arg_msg (NULL, 0, arg, "exact integer");
+  range_error (arg, 0, scm_integer_from_uint64 (UINT64_MAX));
+}
+
+SCM
+scm_from_uint64 (uint64_t arg)
+{
+  return scm_integer_from_uint64 (arg);
+}
+
 #define TYPE                     scm_t_wchar
 #define TYPE_MIN                 (int32_t)-1
 #define TYPE_MAX                 (int32_t)0x10ffff
@@ -7035,22 +7080,6 @@ scm_from_uint32 (uint32_t arg)
 #define SCM_FROM_TYPE_PROTO(arg) scm_from_wchar (arg)
 #include "conv-integer.i.c"
 
-#define TYPE                     int64_t
-#define TYPE_MIN                 INT64_MIN
-#define TYPE_MAX                 INT64_MAX
-#define SIZEOF_TYPE              8
-#define SCM_TO_TYPE_PROTO(arg)   scm_to_int64 (arg)
-#define SCM_FROM_TYPE_PROTO(arg) scm_from_int64 (arg)
-#include "conv-integer.i.c"
-
-#define TYPE                     uint64_t
-#define TYPE_MIN                 0
-#define TYPE_MAX                 UINT64_MAX
-#define SIZEOF_TYPE              8
-#define SCM_TO_TYPE_PROTO(arg)   scm_to_uint64 (arg)
-#define SCM_FROM_TYPE_PROTO(arg) scm_from_uint64 (arg)
-#include "conv-uinteger.i.c"
-
 void
 scm_to_mpz (SCM val, mpz_t rop)
 {



reply via email to

[Prev in Thread] Current Thread [Next in Thread]