diff src/number-mp.h @ 5736:3192994c49ca

Convert C (un)signed long long values to bignums properly. This patch also does the following: - Uses make_fixnum instead of make_integer when the argument is guaranteed to be in the fixnum range. - Introduces make_unsigned_integer so that we handle unsigned values with the high bit set correctly. - Introduces conversions between bignums and (un)signed long long values. - Uses mp_set_memory_functions with the BSD MP code, if it exists. - Eliminates some unnecessary consing in the Lisp + and * implementations. - Fixes a problem with check_valid_xbm_inline(). This function is called during intialization. It calls Ftimes. When using pdump, this is a problem, because (a) the bignum code is not initialized until *after* dumping, so we don't try to dump any bignums, and (b) multiplication of integers is done inside bignums so we handle fixnum overflow correctly. I decided that an XBM file with dimensions that don't fit into fixnums is probably not something we want to try to handle anyway, and did the arithmetic with C values instead of Lisp values. Doing that broke one test, which started getting a different error message from the one it expected, so I adjusted the test to match the new reality. - Fixes a few miscellaneous bugs in the BSD MP code. See <CAHCOHQk0u0=eD1fUMHTNWi2Yh=1WgiYyCXdMbsGzHBNhdqYz4w@mail.gmail.com> in xemacs-patches, as well as followup messages.
author Jerry James <james@xemacs.org>
date Mon, 17 Jun 2013 10:23:00 -0600
parents c9e5612f5424
children
line wrap: on
line diff
--- a/src/number-mp.h	Wed Apr 24 20:16:14 2013 -0400
+++ b/src/number-mp.h	Mon Jun 17 10:23:00 2013 -0600
@@ -40,6 +40,7 @@
 #ifdef MP_PREFIX
 #define MP_GCD   mp_gcd
 #define MP_ITOM  mp_itom
+#define MP_XTOM  mp_xtom
 #define MP_MADD  mp_madd
 #define MP_MCMP  mp_mcmp
 #define MP_MDIV  mp_mdiv
@@ -55,6 +56,7 @@
 #else
 #define MP_GCD   gcd
 #define MP_ITOM  itom
+#define MP_XTOM  xtom
 #define MP_MADD  madd
 #define MP_MCMP  mcmp
 #define MP_MDIV  mdiv
@@ -81,6 +83,7 @@
 extern MINT *bignum_zero, *intern_bignum;
 extern MINT *bignum_min_int, *bignum_max_int, *bignum_max_uint;
 extern MINT *bignum_min_long, *bignum_max_long, *bignum_max_ulong;
+extern MINT *bignum_min_llong, *bignum_max_llong, *bignum_max_ullong;
 extern short div_rem;
 
 /***** Bignum: basic functions *****/
@@ -102,6 +105,10 @@
 				     MP_MCMP (b, bignum_max_long) <= 0)
 #define bignum_fits_ulong_p(b)      (MP_MCMP (b, bignum_zero) >= 0 &&	\
 				     MP_MCMP (b, bignum_max_ulong) <= 0)
+#define bignum_fits_llong_p(b)      (MP_MCMP (b, bignum_min_llong) >= 0 && \
+				     MP_MCMP (b, bignum_max_llong) <= 0)
+#define bignum_fits_ullong_p(b)     (MP_MCMP (b, bignum_zero) >= 0 &&	\
+				     MP_MCMP (b, bignum_max_ullong) <= 0)
 
 /***** Bignum: conversions *****/
 extern char *bignum_to_string(bignum, int);
@@ -109,6 +116,8 @@
 extern unsigned int bignum_to_uint(bignum);
 extern long bignum_to_long(bignum);
 extern unsigned long bignum_to_ulong(bignum);
+extern long long bignum_to_llong(bignum);
+extern unsigned long long bignum_to_ullong(bignum);
 extern double bignum_to_double(bignum);
 
 /***** Bignum: converting assignments *****/
@@ -116,6 +125,8 @@
 extern int bignum_set_string(bignum, const char *, int);
 extern void bignum_set_long(bignum, long);
 extern void bignum_set_ulong(bignum, unsigned long);
+extern void bignum_set_llong(bignum, long long);
+extern void bignum_set_ullong(bignum, unsigned long long);
 extern void bignum_set_double(bignum, double);
 
 /***** Bignum: comparisons *****/
@@ -155,7 +166,7 @@
 extern void bignum_rshift(bignum, bignum, unsigned long);
 
 /***** Bignum: random numbers *****/
-extern void bignum_random_seed(unsigned long);
+#define bignum_random_seed(s)
 extern void bignum_random(bignum, bignum);
 
 #endif /* INCLUDED_number_mp_h_ */