diff options
-rw-r--r-- | m4/gmp.m4 | 2 | ||||
-rw-r--r-- | src/factor.c | 24 |
2 files changed, 26 insertions, 0 deletions
@@ -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 |