]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
Add new formats B, H, I, L for unsigned data types (analogous to the
authorGuido van Rossum <guido@python.org>
Fri, 3 Jan 1997 19:09:47 +0000 (19:09 +0000)
committerGuido van Rossum <guido@python.org>
Fri, 3 Jan 1997 19:09:47 +0000 (19:09 +0000)
recent changes in the struct module).

Modules/arraymodule.c

index 7ac481b402f87f7f8ecd46c1c7bb55be775c9afd..5862f6c2466d5c0a88f7175a9a0a3fed6d0ea46a 100644 (file)
@@ -120,6 +120,17 @@ b_setitem(ap, i, v)
        return 0;
 }
 
+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;
@@ -142,6 +153,16 @@ h_setitem(ap, i, v)
        return 0;
 }
 
+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;
@@ -164,6 +185,36 @@ i_setitem(ap, i, v)
        return 0;
 }
 
+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;
@@ -186,6 +237,35 @@ l_setitem(ap, i, v)
        return 0;
 }
 
+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;
@@ -234,9 +314,13 @@ d_setitem(ap, i, v)
 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 @@ a_array(self, args)
                }
        }
        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;
 }