Add new formats B, H, I, L for unsigned data types (analogous to the
recent changes in the struct module).
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 7ac481b..5862f6c 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -121,6 +121,17 @@
 }
 
 static PyObject *
+B_getitem(ap, i)
+	arrayobject *ap;
+	int i;
+{
+	long x = ((unsigned char *)ap->ob_item)[i];
+	return PyInt_FromLong(x);
+}
+
+#define B_setitem b_setitem
+
+static PyObject *
 h_getitem(ap, i)
 	arrayobject *ap;
 	int i;
@@ -143,6 +154,16 @@
 }
 
 static PyObject *
+H_getitem(ap, i)
+	arrayobject *ap;
+	int i;
+{
+	return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
+}
+
+#define H_setitem h_setitem
+
+static PyObject *
 i_getitem(ap, i)
 	arrayobject *ap;
 	int i;
@@ -165,6 +186,36 @@
 }
 
 static PyObject *
+I_getitem(ap, i)
+	arrayobject *ap;
+	int i;
+{
+	return PyLong_FromUnsignedLong(
+		(unsigned long) ((unsigned int *)ap->ob_item)[i]);
+}
+
+static int
+I_setitem(ap, i, v)
+	arrayobject *ap;
+	int i;
+	PyObject *v;
+{
+	unsigned long x;
+	if (PyLong_Check(v)) {
+		x = PyLong_AsUnsignedLong(v);
+		if (x == (unsigned long) -1 && PyErr_Occurred())
+			return -1;
+	}
+	else {
+		if (!PyArg_Parse(v, "l;array item must be integer", &x))
+			return -1;
+	}
+	if (i >= 0)
+		((unsigned int *)ap->ob_item)[i] = x;
+	return 0;
+}
+
+static PyObject *
 l_getitem(ap, i)
 	arrayobject *ap;
 	int i;
@@ -187,6 +238,35 @@
 }
 
 static PyObject *
+L_getitem(ap, i)
+	arrayobject *ap;
+	int i;
+{
+	return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
+}
+
+static int
+L_setitem(ap, i, v)
+	arrayobject *ap;
+	int i;
+	PyObject *v;
+{
+	unsigned long x;
+	if (PyLong_Check(v)) {
+		x = PyLong_AsUnsignedLong(v);
+		if (x == (unsigned long) -1 && PyErr_Occurred())
+			return -1;
+	}
+	else {
+		if (!PyArg_Parse(v, "l;array item must be integer", &x))
+			return -1;
+	}
+	if (i >= 0)
+		((unsigned long *)ap->ob_item)[i] = x;
+	return 0;
+}
+
+static PyObject *
 f_getitem(ap, i)
 	arrayobject *ap;
 	int i;
@@ -234,9 +314,13 @@
 static struct arraydescr descriptors[] = {
 	{'c', sizeof(char), c_getitem, c_setitem},
 	{'b', sizeof(char), b_getitem, b_setitem},
+	{'B', sizeof(char), B_getitem, B_setitem},
 	{'h', sizeof(short), h_getitem, h_setitem},
+	{'H', sizeof(short), H_getitem, H_setitem},
 	{'i', sizeof(int), i_getitem, i_setitem},
+	{'I', sizeof(int), I_getitem, I_setitem},
 	{'l', sizeof(long), l_getitem, l_setitem},
+	{'L', sizeof(long), L_getitem, L_setitem},
 	{'f', sizeof(float), f_getitem, f_setitem},
 	{'d', sizeof(double), d_getitem, d_setitem},
 	{'\0', 0, 0, 0} /* Sentinel */
@@ -1166,7 +1250,7 @@
 		}
 	}
 	PyErr_SetString(PyExc_ValueError,
-			"bad typecode (must be c, b, h, l, f or d)");
+		"bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
 	return NULL;
 }