py: Allow MPZ_DIG_SIZE to be optionally configured by a port.
diff --git a/py/mpz.h b/py/mpz.h
index 6bcbc07..71649aa 100644
--- a/py/mpz.h
+++ b/py/mpz.h
@@ -39,22 +39,37 @@
 // unsigned versions.
 //
 // MPZ_DIG_SIZE can be between 4 and 8*sizeof(mpz_dig_t), but it makes most
-// sense to have it as large as possible.  Below, the type is auto-detected
-// depending on the machine, but it (and MPZ_DIG_SIZE) can be freely changed so
-// long as the constraints mentioned above are met.
+// sense to have it as large as possible.  If MPZ_DIG_SIZE is not already
+// defined then it is auto-detected below, depending on the machine.  The types
+// are then set based on the value of MPZ_DIG_SIZE (although they can be freely
+// changed so long as the constraints mentioned above are met).
 
-#if defined(__x86_64__) || defined(_WIN64)
-// 64-bit machine, using 32-bit storage for digits
+#ifndef MPZ_DIG_SIZE
+  #if defined(__x86_64__) || defined(_WIN64)
+    // 64-bit machine, using 32-bit storage for digits
+    #define MPZ_DIG_SIZE (32)
+  #else
+    // default: 32-bit machine, using 16-bit storage for digits
+    #define MPZ_DIG_SIZE (16)
+  #endif
+#endif
+
+#if MPZ_DIG_SIZE > 16
 typedef uint32_t mpz_dig_t;
 typedef uint64_t mpz_dbl_dig_t;
 typedef int64_t mpz_dbl_dig_signed_t;
-#define MPZ_DIG_SIZE (32)
-#else
-// 32-bit machine, using 16-bit storage for digits
+#elif MPZ_DIG_SIZE > 8
 typedef uint16_t mpz_dig_t;
 typedef uint32_t mpz_dbl_dig_t;
 typedef int32_t mpz_dbl_dig_signed_t;
-#define MPZ_DIG_SIZE (16)
+#elif MPZ_DIG_SIZE > 4
+typedef uint8_t mpz_dig_t;
+typedef uint16_t mpz_dbl_dig_t;
+typedef int16_t mpz_dbl_dig_signed_t;
+#else
+typedef uint8_t mpz_dig_t;
+typedef uint8_t mpz_dbl_dig_t;
+typedef int8_t mpz_dbl_dig_signed_t;
 #endif
 
 #ifdef _WIN64