Richard Fish <rfish@users.sourceforge.net>:
Fix the .binary() method of mpz objects for 64-bit systems.

[Also removed a lot of trailing whitespace elsewhere in the file. --FLD]

This closes SF patch #103547.
diff --git a/Modules/mpzmodule.c b/Modules/mpzmodule.c
index 890f7bb..d4a7370 100644
--- a/Modules/mpzmodule.c
+++ b/Modules/mpzmodule.c
@@ -417,7 +417,7 @@
 	putc('\n', stderr);
 #endif /* def MPZ_TEST_DIV */
 	return (PyObject *)z;
-	
+
 } /* mpz_divide() */
 
 static PyObject *
@@ -428,7 +428,7 @@
 #endif /* def MPZ_SPARE_MALLOC */	
 	mpzobject *z;
 
-	
+
 	if ((
 #ifdef MPZ_SPARE_MALLOC	     
 	     cmpres =
@@ -486,7 +486,7 @@
 	putc('\n', stderr);
 #endif /* def MPZ_TEST_DIV */
 	return (PyObject *)z;
-	
+
 } /* mpz_remainder() */
 
 static PyObject *
@@ -543,7 +543,7 @@
 
 	(void)PyTuple_SetItem(z, 0, (PyObject *)x);
 	(void)PyTuple_SetItem(z, 1, (PyObject *)y);
-	
+
 	return z;
 } /* mpz_div_and_mod() */
 
@@ -570,7 +570,7 @@
 		Py_INCREF(mpz_value_one);
 		return (PyObject *)mpz_value_one;
 	}
-		
+
 	if (cmpres < 0) {
 		PyErr_SetString(PyExc_ValueError,
 				"mpz.pow to negative exponent");
@@ -631,9 +631,9 @@
 
 	if ((z = newmpzobject()) == NULL)
 		return NULL;
-	
+
 	mpz_pow_ui(&z->mpz, &a->mpz, mpz_get_ui(&b->mpz));
-	
+
 	return (PyObject *)z;
 } /* mpz_power() */
 
@@ -643,7 +643,7 @@
 {
 	mpzobject *z;
 
-	
+
 #ifdef MPZ_SPARE_MALLOC
 	if (mpz_cmp_ui(&v->mpz, (unsigned long int)0) == 0) {
 		/* -0 == 0 */
@@ -673,7 +673,7 @@
 {
 	mpzobject *z;
 
-	
+
 	if (mpz_cmp_ui(&v->mpz, (unsigned long int)0) >= 0) {
 		Py_INCREF(v);
 		return (PyObject *)v;
@@ -791,7 +791,7 @@
 mpz_xor(MP_INT *res, const MP_INT *op1, const MP_INT *op2)
 {
 	MP_INT tmpmpz;
-	
+
 	mpz_init(&tmpmpz);
 
 	mpz_and(res, op1, op2);
@@ -854,7 +854,7 @@
 
 		if (!PyArg_Parse(objp, "l", &lval))
 			return NULL;
-		
+
 		if (lval == (long)0) {
 			Py_INCREF(mpz_value_zero);
 			mpzp = mpz_value_zero;
@@ -871,14 +871,14 @@
 		MP_INT mplongdigit;
 		int i;
 		unsigned char isnegative;
-		
+
 
 		if ((mpzp = newmpzobject()) == NULL)
 			return NULL;
 
 		mpz_set_si(&mpzp->mpz, 0L);
 		mpz_init(&mplongdigit);
-		
+
 		/* how we're gonna handle this? */
 		if ((isnegative =
 		     ((i = ((PyLongObject *)objp)->ob_size) < 0) ))
@@ -909,7 +909,7 @@
 
 		mpz_set_si(&mpzp->mpz, 0L);
 		mpz_init(&mplongdigit);
-		
+
 		/* let's do it the same way as with the long conversion:
 		   without thinking how it can be faster (-: :-) */
 
@@ -973,7 +973,7 @@
 	mpzobject *z;
 	int tstres;
 
-	
+
 	if (!PyArg_Parse(args, "(OOO)", &base, &exp, &mod))
 		return NULL;
 
@@ -1007,7 +1007,7 @@
 	else {
 		mpz_powm(&z->mpz, &mpzbase->mpz, &mpzexp->mpz, &mpzmod->mpz);
 	}
-		
+	
 	Py_DECREF(mpzbase);
 	Py_DECREF(mpzexp);
 	Py_DECREF(mpzmod);
@@ -1023,7 +1023,7 @@
 	mpzobject *mpzop1 = NULL, *mpzop2 = NULL;
 	mpzobject *z;
 
-	
+
 	if (!PyArg_Parse(args, "(OO)", &op1, &op2))
 		return NULL;
 
@@ -1052,7 +1052,7 @@
 	mpzobject *mpzop1 = NULL, *mpzop2 = NULL;
 	mpzobject *g = NULL, *s = NULL, *t = NULL;
 
-	
+
 	if (!PyArg_Parse(args, "(OO)", &op1, &op2))
 		return NULL;
 
@@ -1091,7 +1091,7 @@
 	mpzobject *mpzop = NULL;
 	mpzobject *z;
 
-	
+
 	if (!PyArg_Parse(args, "O", &op))
 		return NULL;
 
@@ -1116,7 +1116,7 @@
 	mpzobject *mpzop = NULL;
 	mpzobject *root = NULL, *rem = NULL;
 
-	
+
 	if (!PyArg_Parse(args, "O", &op))
 		return NULL;
 
@@ -1189,7 +1189,7 @@
 		}
 		else
 			mpz_mod(res, &s0, mod);
-		
+
 #else /* def MPZ_MDIV_BUG */
 		mpz_mmod(res, &s0, mod);
 #endif /* def MPZ_MDIV_BUG else */
@@ -1212,7 +1212,7 @@
 	mpzobject *mpznum, *mpzden = NULL, *mpzmod = NULL;
 	mpzobject *z = NULL;
 
-	
+
 	if (!PyArg_Parse(args, "(OOO)", &num, &den, &mod))
 		return NULL;
 
@@ -1225,7 +1225,7 @@
 		Py_XDECREF(mpzmod);
 		return NULL;
 	}
-	
+
 	mpz_divm(&z->mpz, &mpznum->mpz, &mpzden->mpz, &mpzmod->mpz);
 
 	Py_DECREF(mpznum);
@@ -1340,19 +1340,19 @@
 	while (ldcount > 0 && longobjp->ob_digit[ldcount-1] == 0)
 		ldcount--;
 	longobjp->ob_size = ldcount;
-	
+
 
 	if (isnegative)
 		longobjp->ob_size = -longobjp->ob_size;
 
 	return (PyObject *)longobjp;
-	
+
 } /* mpz_long() */
 
 
 /* I would have avoided pow() anyways, so ... */
 static const double multiplier = 256.0 * 256.0 * 256.0 * 256.0;
-	
+
 #ifdef MPZ_CONVERSIONS_AS_METHODS
 static PyObject *
 mpz_float(mpzobject *self, PyObject *args)
@@ -1373,7 +1373,7 @@
 #endif /* def MPZ_CONVERSIONS_AS_METHODS */
 
 	i = (int)mpz_size(&self->mpz);
-	
+
 	/* determine sign, and copy abs(self) to scratch var */
 	if ((isnegative = (mpz_cmp_ui(&self->mpz, (unsigned long int)0) < 0)))
 	{
@@ -1404,7 +1404,7 @@
 		x = -x;
 
 	return PyFloat_FromDouble(x);
-	
+
 } /* mpz_float() */
 
 #ifdef MPZ_CONVERSIONS_AS_METHODS
@@ -1419,10 +1419,10 @@
 	if (!PyArg_NoArgs(args))
 		return NULL;
 #endif /* def MPZ_CONVERSIONS_AS_METHODS */
-	
+
 	return mpz_format((PyObject *)self, 16, (unsigned char)1);
 } /* mpz_hex() */
-	
+
 #ifdef MPZ_CONVERSIONS_AS_METHODS
 static PyObject *
 mpz_oct(mpzobject *self, PyObject *args)
@@ -1438,7 +1438,7 @@
 	
 	return mpz_format((PyObject *)self, 8, (unsigned char)1);
 } /* mpz_oct() */
-	
+
 static PyObject *
 mpz_binary(mpzobject *self, PyObject *args)
 {
@@ -1447,7 +1447,7 @@
 	char *cp;
 	MP_INT mp;
 	unsigned long ldigit;
-	
+
 	if (!PyArg_NoArgs(args))
 		return NULL;
 
@@ -1477,6 +1477,12 @@
 		*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
 		*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
 		*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
+		if (sizeof(ldigit) == 8 && BITS_PER_MP_LIMB == 64) {
+			*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
+			*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
+			*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
+			*cp++ = (unsigned char)((ldigit >>= 8) & 0xFF);
+		}
 	}
 
 	while (strobjp->ob_size && !*--cp)
@@ -1484,7 +1490,7 @@
 
 	return (PyObject *)strobjp;
 } /* mpz_binary() */
-	
+
 
 static PyMethodDef mpz_methods[] = {
 #ifdef MPZ_CONVERSIONS_AS_METHODS