]> granicus.if.org Git - php/commitdiff
Support gmp_remroot() on GMP 4.1
authorNikita Popov <nikic@php.net>
Mon, 2 Dec 2013 19:10:08 +0000 (20:10 +0100)
committerNikita Popov <nikic@php.net>
Mon, 2 Dec 2013 19:11:06 +0000 (20:11 +0100)
ext/gmp/gmp.c

index f243b3155c1174b1bb0b27e6a8f81f44ee6431ae..8835f0524680987c92fc66a276d0df71e883638d 100644 (file)
@@ -204,9 +204,12 @@ typedef struct _gmp_temp {
 #define GMP_ROUND_PLUSINF   1
 #define GMP_ROUND_MINUSINF  2
 
+#define GMP_42_OR_NEWER \
+       ((__GNU_MP_VERSION >= 5) || (__GNU_MP_VERSION >= 4 && __GNU_MP_VERSION_MINOR >= 2))
+
 /* The maximum base for input and output conversions is 62 from GMP 4.2
  * onwards. */
-#if (__GNU_MP_VERSION >= 5) || (__GNU_MP_VERSION >= 4 && __GNU_MP_VERSION_MINOR >= 2)
+#if GMP_42_OR_NEWER
 #      define MAX_BASE 62
 #else
 #      define MAX_BASE 36
@@ -1455,7 +1458,15 @@ ZEND_FUNCTION(gmp_rootrem)
        add_index_zval(return_value, 0, gmp_create(&gmpnum_result1 TSRMLS_CC));
        add_index_zval(return_value, 1, gmp_create(&gmpnum_result2 TSRMLS_CC));
 
+#if GMP_42_OR_NEWER
        mpz_rootrem(gmpnum_result1, gmpnum_result2, gmpnum_a, (unsigned long) nth);
+#else
+       mpz_root(gmpnum_result1, gmpnum_a, (unsigned long) nth);
+       mpz_pow_ui(gmpnum_result2, gmpnum_result1, (unsigned long) nth);
+       mpz_sub(gmpnum_result2, gmpnum_a, gmpnum_result2);
+       mpz_abs(gmpnum_result2, gmpnum_result2);
+#endif
+       
        FREE_GMP_TEMP(temp_a);
 }
 /* }}} */