]> git.eshelyaron.com Git - emacs.git/commitdiff
Provide new functions to create bignums
authorTom Tromey <tom@tromey.com>
Sat, 7 Jul 2018 20:53:23 +0000 (14:53 -0600)
committerTom Tromey <tom@tromey.com>
Fri, 13 Jul 2018 04:12:27 +0000 (22:12 -0600)
* src/alloc.c (make_bignum_str, make_number): New functions.
* src/lisp.h (make_bignum_str, make_number): Declare.

src/alloc.c
src/lisp.h

index 8ebf3e05d69ee23ebf8cf94ad46bbcf002565aac..b775948fd96656472c11a3944bc2b1b1a3c403df 100644 (file)
@@ -3779,6 +3779,51 @@ build_marker (struct buffer *buf, ptrdiff_t charpos, ptrdiff_t bytepos)
   return obj;
 }
 
+\f
+
+Lisp_Object
+make_bignum_str (const char *num, int base)
+{
+  Lisp_Object obj;
+  struct Lisp_Bignum *b;
+  int check;
+
+  obj = allocate_misc (Lisp_Misc_Bignum);
+  b = XBIGNUM (obj);
+  mpz_init (b->value);
+  check = mpz_set_str (b->value, num, base);
+  eassert (check == 0);
+  return obj;
+}
+
+/* Given an mpz_t, make a number.  This may return a bignum or a
+   fixnum depending on VALUE.  */
+
+Lisp_Object
+make_number (mpz_t value)
+{
+  Lisp_Object obj;
+  struct Lisp_Bignum *b;
+
+  if (mpz_fits_slong_p (value))
+    {
+      long l = mpz_get_si (value);
+      if (!FIXNUM_OVERFLOW_P (l))
+       {
+         XSETINT (obj, l);
+         return obj;
+       }
+    }
+
+  obj = allocate_misc (Lisp_Misc_Bignum);
+  b = XBIGNUM (obj);
+  /* We could mpz_init + mpz_swap here, to avoid a copy, but the
+     resulting API seemed possibly confusing.  */
+  mpz_init_set (b->value, value);
+
+  return obj;
+}
+
 \f
 /* Return a newly created vector or string with specified arguments as
    elements.  If all the arguments are characters that can fit
index 37e43b0c5a1d86a9b3db06221674b80afd582bd4..6a3db24949a9f60c7dc6f9607f8321060c0f22a9 100644 (file)
@@ -3643,6 +3643,9 @@ extern Lisp_Object list5 (Lisp_Object, Lisp_Object, Lisp_Object, Lisp_Object,
 enum constype {CONSTYPE_HEAP, CONSTYPE_PURE};
 extern Lisp_Object listn (enum constype, ptrdiff_t, Lisp_Object, ...);
 
+extern Lisp_Object make_bignum_str (const char *num, int base);
+extern Lisp_Object make_number (mpz_t value);
+
 /* Build a frequently used 2/3/4-integer lists.  */
 
 INLINE Lisp_Object