>From 8052c5bf1c5c6dc92b420ce2ed3c6595d9b31797 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?P=C3=A1draig=20Brady?= Date: Mon, 8 Oct 2012 11:38:41 +0100 Subject: [PATCH] build: support older GMP versions The new factor code introduced usage of mpz_inits() and mpz_clears(), which are only available since GMP >= 5, and will result in a compile error when missing. * m4/gmp.m4 (cu_GMP): Define HAVE_DECL_MPZ_INITS appropriately. * src/factor (mpz_inits): New function, defined where missing. (mpz_clears): Likewise. --- m4/gmp.m4 | 2 ++ src/factor.c | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+), 0 deletions(-) diff --git a/m4/gmp.m4 b/m4/gmp.m4 index e337e16..59a664f 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 ]]) }], [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 5bfbfdc..843542b 100644 --- a/src/factor.c +++ b/src/factor.c @@ -526,6 +526,29 @@ 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), mpz_ptr mpz, ...) +{ + va_list ap; + + va_start (ap, mpz); + + while (mpz != NULL) + { + mpz_single_init (mpz); + mpz = va_arg (ap, mpz_ptr); + } + + va_end (ap); +} +# endif + static void mp_factor (mpz_t, struct mp_factors *); static void -- 1.7.6.4