diff options
author | Ludovic Courtès <ludo@gnu.org> | 2013-03-28 22:16:07 +0100 |
---|---|---|
committer | Ludovic Courtès <ludo@gnu.org> | 2013-03-28 22:19:12 +0100 |
commit | 07b390d5827da2f46f57e4650167920fb792ebc9 (patch) | |
tree | 65465c23cc30d0ee1aa67c24a6bdcbade77c84fa | |
parent | 06589f5c229c3ce4dd2cb627c90ef4372dd0a571 (diff) | |
download | guile-07b390d5827da2f46f57e4650167920fb792ebc9.tar.gz |
Allow compilation with GMP < 5.0.0.
* libguile/numbers.c (VARARG_MPZ_ITERATOR)[!HAVE_DECL_MPZ_INITS]: New
macro.
(mpz_inits, mpz_clears)[!HAVE_DECL_MPZ_INITS]: New functions.
* configure.ac: Check for the declaration of `mpz_inits'.
-rw-r--r-- | configure.ac | 8 | ||||
-rw-r--r-- | libguile/numbers.c | 31 |
2 files changed, 38 insertions, 1 deletions
diff --git a/configure.ac b/configure.ac index bcfc1a65e..41a55771e 100644 --- a/configure.ac +++ b/configure.ac @@ -872,6 +872,14 @@ if test "x$HAVE_LIBGMP" != "xyes"; then AC_MSG_ERROR([GNU MP 4.1 or greater not found, see README]) fi +dnl `mpz_inits' and `mpz_clears' appeared in GMP 5.0.0. +save_CPPFLAGS="$CPPFLAGS" +if test "x$LIBGMP_PREFIX" != "x"; then + CPPFLAGS="-I$LIBGMP_PREFIX $CPPFLAGS" +fi +AC_CHECK_DECLS([mpz_inits], [], [], [[#include <gmp.h>]]) +CPPFLAGS="$save_CPPFLAGS" + dnl GNU libunistring is checked for by Gnulib's `libunistring' module. if test "x$LTLIBUNISTRING" = "x"; then AC_MSG_ERROR([GNU libunistring is required, please install it.]) diff --git a/libguile/numbers.c b/libguile/numbers.c index a7c092803..1f4b9a84d 100644 --- a/libguile/numbers.c +++ b/libguile/numbers.c @@ -1,4 +1,6 @@ -/* Copyright (C) 1995,1996,1997,1998,1999,2000,2001,2002,2003,2004,2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012 Free Software Foundation, Inc. +/* Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, + * 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, + * 2013 Free Software Foundation, Inc. * * Portions Copyright 1990, 1991, 1992, 1993 by AT&T Bell Laboratories * and Bellcore. See scm_divide. @@ -56,6 +58,8 @@ #include <complex.h> #endif +#include <stdarg.h> + #include "libguile/_scm.h" #include "libguile/feature.h" #include "libguile/ports.h" @@ -96,6 +100,31 @@ typedef scm_t_signed_bits scm_t_inum; #define DOUBLE_IS_POSITIVE_INFINITY(x) (isinf(x) && ((x) > 0)) #define DOUBLE_IS_NEGATIVE_INFINITY(x) (isinf(x) && ((x) < 0)) + +#if ! HAVE_DECL_MPZ_INITS + +/* GMP < 5.0.0 lacks `mpz_inits' and `mpz_clears'. Provide them. */ + +#define VARARG_MPZ_ITERATOR(func) \ + static void \ + func ## s (mpz_t x, ...) \ + { \ + va_list ap; \ + \ + va_start (ap, x); \ + while (x != NULL) \ + { \ + func (x); \ + x = va_arg (ap, mpz_ptr); \ + } \ + va_end (ap); \ + } + +VARARG_MPZ_ITERATOR (mpz_init) +VARARG_MPZ_ITERATOR (mpz_clear) + +#endif + /* |