summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--m4/gmp.m42
-rw-r--r--src/factor.c24
2 files changed, 26 insertions, 0 deletions
diff --git a/m4/gmp.m4 b/m4/gmp.m4
index e337e161f..59a664f74 100644
--- a/m4/gmp.m4
+++ b/m4/gmp.m4
@@ -30,6 +30,8 @@ AC_DEFUN([cu_GMP],
LIB_GMP=$ac_cv_search___gmpz_init
AC_DEFINE([HAVE_GMP], [1],
[Define if you have GNU libgmp (or replacement)])
+ # This only available in GMP >= 5
+ AC_CHECK_DECLS([mpz_inits], [], [], [[#include <gmp.h>]])
}],
[AC_MSG_WARN([libgmp development library was not found or not usable.])
AC_MSG_WARN([AC_PACKAGE_NAME will be built without GMP support.])])
diff --git a/src/factor.c b/src/factor.c
index 5bfbfdcd4..d5f248a6a 100644
--- a/src/factor.c
+++ b/src/factor.c
@@ -89,6 +89,9 @@
#include <stdio.h>
#if HAVE_GMP
# include <gmp.h>
+# if !HAVE_DECL_MPZ_INITS
+# include <stdarg.h>
+# endif
#endif
#include <assert.h>
@@ -526,6 +529,27 @@ factor_insert_large (struct factors *factors,
}
#if HAVE_GMP
+
+# if !HAVE_DECL_MPZ_INITS
+
+# define mpz_inits(...) mpz_va_init (mpz_init, __VA_ARGS__)
+# define mpz_clears(...) mpz_va_init (mpz_clear, __VA_ARGS__)
+
+static void
+mpz_va_init (void (*mpz_single_init)(mpz_t), ...)
+{
+ va_list ap;
+
+ va_start (ap, mpz_single_init);
+
+ mpz_t *mpz;
+ while ((mpz = va_arg (ap, mpz_t *)))
+ mpz_single_init (*mpz);
+
+ va_end (ap);
+}
+# endif
+
static void mp_factor (mpz_t, struct mp_factors *);
static void