#! /bin/sh /usr/share/dpatch/dpatch-run
## Description: Fix wrong conversion from int on 64 bits computers
## Origin/Author: Jean-Christophe Filliâtre
## Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=573978
## 20_mlgmp_z.dpatch by Mehdi Dogguy <mehdi@debian.org>
##
## All lines beginning with `## DP:' are a description of the patch.
## DP: Fix wrong conversion from int on 64 bits computers.

@DPATCH@
Index: mlgmp/mlgmp_z.c
===================================================================
--- mlgmp.orig/mlgmp_z.c	2015-08-12 13:08:45.326850457 +0200
+++ mlgmp/mlgmp_z.c	2015-08-12 13:08:45.322850442 +0200
@@ -70,7 +70,7 @@
   CAMLparam1(ml_val);
   CAMLlocal1(r);
   r=alloc_mpz();
-  mpz_init_set_si(*mpz_val(r), Int_val(ml_val));
+  mpz_init_set_si(*mpz_val(r), Long_val(ml_val)); /* FIX */
   CAMLreturn(r);
 }
 
@@ -95,7 +95,7 @@
 value _mlgmp_z2_from_int(value r, value ml_val)
 {
   CAMLparam2(r, ml_val);
-  mpz_set_si(*mpz_val(r), Int_val(ml_val));
+  mpz_set_si(*mpz_val(r), Long_val(ml_val));
   CAMLreturn(Val_unit);
 }
 
@@ -158,14 +158,14 @@
   CAMLparam2(a, b);                                     \
   CAMLlocal1(r);                                        \
   r=alloc_init_mpz();				        \
-  mpz_##op(*mpz_val(r), *mpz_val(a), Int_val(b));	\
+  mpz_##op(*mpz_val(r), *mpz_val(a), Long_val(b));	\
   CAMLreturn(r);					\
 }                                                       \
                                                         \
 value _mlgmp_z2_##op(value r, value a, value b)		\
 {							\
   CAMLparam3(r, a, b);                                  \
-  mpz_##op(*mpz_val(r), *mpz_val(a), Int_val(b));	\
+  mpz_##op(*mpz_val(r), *mpz_val(a), Long_val(b));	\
   CAMLreturn(Val_unit);					\
 }
 
@@ -203,7 +203,7 @@
   CAMLparam3(a, b, modulus);
   CAMLlocal1(r);
   r=alloc_init_mpz();
-  mpz_powm_ui(*mpz_val(r), *mpz_val(a), Int_val(b), *mpz_val(modulus));
+  mpz_powm_ui(*mpz_val(r), *mpz_val(a), Long_val(b), *mpz_val(modulus));
   CAMLreturn(r);
 }
 
@@ -212,7 +212,7 @@
   CAMLparam2(a, b);
   CAMLlocal1(r);
   r=alloc_init_mpz();
-  mpz_ui_pow_ui(*mpz_val(r), Int_val(a), Int_val(b));
+  mpz_ui_pow_ui(*mpz_val(r), Long_val(a), Long_val(b));
   CAMLreturn(r);
 }
 
@@ -228,14 +228,14 @@
 value _mlgmp_z2_powm_ui(value r, value a, value b, value modulus)
 {
   CAMLparam4(r, a, b, modulus);
-  mpz_powm_ui(*mpz_val(r), *mpz_val(a), Int_val(b), *mpz_val(modulus));
+  mpz_powm_ui(*mpz_val(r), *mpz_val(a), Long_val(b), *mpz_val(modulus));
   CAMLreturn(Val_unit);
 }
 
 value _mlgmp_z2_ui_pow_ui(value r, value a, value b)
 {
   CAMLparam3(r, a, b);
-  mpz_ui_pow_ui(*mpz_val(r), Int_val(a), Int_val(b));
+  mpz_ui_pow_ui(*mpz_val(r), Long_val(a), Long_val(b));
   CAMLreturn(Val_unit);
 }
 
@@ -383,7 +383,7 @@
 {									\
   CAMLparam2(n, d);                                                     \
   CAMLlocal3(q, r, qr);							\
-  unsigned long int ui_d = Int_val(d);					\
+  unsigned long int ui_d = Long_val(d);					\
 									\
   if (! ui_d) division_by_zero();					\
 									\
@@ -402,7 +402,7 @@
 {									\
   CAMLparam2(n, d);                                                     \
   CAMLlocal1(q);       							\
-  unsigned long int ui_d = Int_val(d);					\
+  unsigned long int ui_d = Long_val(d);					\
 									\
  if (! ui_d) division_by_zero();					\
 									\
@@ -416,7 +416,7 @@
 value _mlgmp_z2_##kind##div_q_ui(value q, value n, value d)		\
 {									\
   CAMLparam3(q, n, d);                                                     \
-  unsigned long int ui_d = Int_val(d);					\
+  unsigned long int ui_d = Long_val(d);					\
 									\
  if (! ui_d) division_by_zero();					\
 									\
@@ -429,7 +429,7 @@
 {									\
   CAMLparam2(n, d);                                                     \
   CAMLlocal1(r);       							\
-  unsigned long int ui_d = Int_val(d);					\
+  unsigned long int ui_d = Long_val(d);					\
 									\
   if (! ui_d) division_by_zero();					\
 									\
@@ -443,7 +443,7 @@
 value _mlgmp_z2_##kind##div_r_ui(value r, value n, value d)		\
 {									\
   CAMLparam3(r, n, d);                                                  \
-  unsigned long int ui_d = Int_val(d);					\
+  unsigned long int ui_d = Long_val(d);					\
 									\
  if (! ui_d) division_by_zero();					\
 									\
@@ -455,7 +455,7 @@
 value _mlgmp_z_##kind##div_ui(value n, value d)				\
 {									\
   CAMLparam2(n, d);                                                     \
-  unsigned long int ui_d = Int_val(d);					\
+  unsigned long int ui_d = Long_val(d);					\
 									\
   if (! ui_d) division_by_zero();					\
 									\
@@ -499,7 +499,7 @@
 {						\
   CAMLparam2(n, d);				\
   CAMLlocal1(q);				\
-  unsigned int ld = Int_val(d);			\
+  unsigned int ld = Long_val(d);			\
 						\
   if (! ld)	                 		\
     division_by_zero();				\
@@ -514,7 +514,7 @@
 value _mlgmp_z2_##op(value q, value n, value d)	\
 {						\
   CAMLparam3(q, n, d);				\
-  unsigned int ld = Int_val(d);			\
+  unsigned int ld = Long_val(d);			\
 						\
   if (! ld)			                \
     division_by_zero();				\
@@ -591,7 +591,7 @@
 value _mlgmp_z_compare_si(value a, value b)
 {
   CAMLparam2(a, b);
-  CAMLreturn(Val_int(mpz_cmp_si(*mpz_val(a), Int_val(b))));
+  CAMLreturn(Val_int(mpz_cmp_si(*mpz_val(a), Long_val(b))));
 }
 
 /*** Number theory */
@@ -652,13 +652,13 @@
 value _mlgmp_z_kronecker_si(value a, value b)
 {
   CAMLparam2(a, b);
-  CAMLreturn(Val_int(mpz_kronecker_si(*mpz_val(a), Int_val(b))));
+  CAMLreturn(Val_int(mpz_kronecker_si(*mpz_val(a), Long_val(b))));
 }
 
 value _mlgmp_z_si_kronecker(value a, value b)
 {
   CAMLparam2(a, b);
-  CAMLreturn(Val_int(mpz_si_kronecker(Int_val(a), *mpz_val(b))));
+  CAMLreturn(Val_int(mpz_si_kronecker(Long_val(a), *mpz_val(b))));
 }
 
 value _mlgmp_z_remove(value a, value b)
@@ -680,7 +680,7 @@
   CAMLparam1(a);				\
   CAMLlocal1(r);				\
   r = alloc_init_mpz();				\
-  mpz_##op(*mpz_val(r), Int_val(a));		\
+  mpz_##op(*mpz_val(r), Long_val(a));		\
   CAMLreturn(r);				\
 }
 
@@ -693,7 +693,7 @@
   CAMLparam2(n, k);
   CAMLlocal1(r);
   r = alloc_init_mpz();
-  mpz_bin_uiui(*mpz_val(r), Int_val(n), Int_val(k));
+  mpz_bin_uiui(*mpz_val(r), Long_val(n), Long_val(k));
   CAMLreturn(r);
 }
 
@@ -718,7 +718,7 @@
 value _mlgmp_z_##op(value a, value b)				\
 {								\
   CAMLparam2(a, b);						\
-  CAMLreturn(Val_int(mpz_##op(*mpz_val(a), Int_val(b))));	\
+  CAMLreturn(Val_int(mpz_##op(*mpz_val(a), Long_val(b))));	\
 }
 
 z_int_binary_op_ui(scan0)
@@ -731,7 +731,7 @@
   CAMLparam2(state, n);						\
   CAMLlocal1(r);						\
   r = alloc_init_mpz();						\
-  mpz_##op(*mpz_val(r), *randstate_val(state), Int_val(n));	\
+  mpz_##op(*mpz_val(r), *randstate_val(state), Long_val(n));	\
   CAMLreturn(r);						\
 }
 
