blob: 03447cb9e382b4d4914e5f761baf7d90fae49518 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Roger E. Masse2919eaa1996-12-09 20:10:36 +00006#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00007
Guido van Rossum0c709541994-08-19 12:01:32 +00008#ifdef STDC_HEADERS
9#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000010#else /* !STDC_HEADERS */
11#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000013#endif /* DONT_HAVE_SYS_TYPES_H */
14#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000015
16struct arrayobject; /* Forward */
17
Tim Petersbb307342000-09-10 05:22:54 +000018/* All possible arraydescr values are defined in the vector "descriptors"
19 * below. That's defined later because the appropriate get and set
20 * functions aren't visible yet.
21 */
Guido van Rossum778983b1993-02-19 15:55:02 +000022struct arraydescr {
23 int typecode;
24 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000025 PyObject * (*getitem)(struct arrayobject *, int);
26 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000027};
28
29typedef struct arrayobject {
Martin v. Löwis99866332002-03-01 10:27:01 +000030 PyObject_HEAD
31 int ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +000032 char *ob_item;
33 struct arraydescr *ob_descr;
34} arrayobject;
35
Jeremy Hylton938ace62002-07-17 16:30:39 +000036static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000037
Martin v. Löwis99866332002-03-01 10:27:01 +000038#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
39#define array_CheckExact(op) ((op)->ob_type == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000040
Tim Petersbb307342000-09-10 05:22:54 +000041/****************************************************************************
42Get and Set functions for each type.
43A Get function takes an arrayobject* and an integer index, returning the
44array value at that index wrapped in an appropriate PyObject*.
45A Set function takes an arrayobject, integer index, and PyObject*; sets
46the array value at that index to the raw C data extracted from the PyObject*,
47and returns 0 if successful, else nonzero on failure (PyObject* not of an
48appropriate type or value).
49Note that the basic Get and Set functions do NOT check that the index is
50in bounds; that's the responsibility of the caller.
51****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +000052
Roger E. Masse2919eaa1996-12-09 20:10:36 +000053static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000054c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000055{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000056 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000057}
58
59static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000060c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000061{
62 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000063 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000064 return -1;
65 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +000066 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +000067 return 0;
68}
69
Roger E. Masse2919eaa1996-12-09 20:10:36 +000070static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000071b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000072{
73 long x = ((char *)ap->ob_item)[i];
74 if (x >= 128)
75 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000076 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000077}
78
79static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000080b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000081{
Fred Drake541dc3b2000-06-28 17:49:30 +000082 short x;
83 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
84 must use the next size up that is signed ('h') and manually do
85 the overflow checking */
86 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000087 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +000088 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +000089 PyErr_SetString(PyExc_OverflowError,
90 "signed char is less than minimum");
91 return -1;
92 }
Guido van Rossum9f754e02000-07-01 00:38:19 +000093 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +000094 PyErr_SetString(PyExc_OverflowError,
95 "signed char is greater than maximum");
96 return -1;
97 }
Guido van Rossum778983b1993-02-19 15:55:02 +000098 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +000099 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000100 return 0;
101}
102
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000103static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000104BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000105{
106 long x = ((unsigned char *)ap->ob_item)[i];
107 return PyInt_FromLong(x);
108}
109
Fred Drake541dc3b2000-06-28 17:49:30 +0000110static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000111BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000112{
113 unsigned char x;
114 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
115 if (!PyArg_Parse(v, "b;array item must be integer", &x))
116 return -1;
117 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000118 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000119 return 0;
120}
Guido van Rossum549ab711997-01-03 19:09:47 +0000121
Martin v. Löwis99866332002-03-01 10:27:01 +0000122#ifdef Py_USING_UNICODE
123static PyObject *
124u_getitem(arrayobject *ap, int i)
125{
126 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
127}
128
129static int
130u_setitem(arrayobject *ap, int i, PyObject *v)
131{
132 Py_UNICODE *p;
133 int len;
134
135 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
136 return -1;
137 if (len != 1) {
138 PyErr_SetString(PyExc_TypeError, "array item must be unicode character");
139 return -1;
140 }
141 if (i >= 0)
142 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
143 return 0;
144}
145#endif
146
Guido van Rossum549ab711997-01-03 19:09:47 +0000147static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000148h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000149{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000150 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000151}
152
153static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000154h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000155{
156 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000157 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000158 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000159 return -1;
160 if (i >= 0)
161 ((short *)ap->ob_item)[i] = x;
162 return 0;
163}
164
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000165static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000166HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000167{
168 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
169}
170
Fred Drake541dc3b2000-06-28 17:49:30 +0000171static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000172HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000173{
174 int x;
175 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
176 must use the next size up and manually do the overflow checking */
177 if (!PyArg_Parse(v, "i;array item must be integer", &x))
178 return -1;
179 else if (x < 0) {
180 PyErr_SetString(PyExc_OverflowError,
181 "unsigned short is less than minimum");
182 return -1;
183 }
184 else if (x > USHRT_MAX) {
185 PyErr_SetString(PyExc_OverflowError,
186 "unsigned short is greater than maximum");
187 return -1;
188 }
189 if (i >= 0)
190 ((short *)ap->ob_item)[i] = (short)x;
191 return 0;
192}
Guido van Rossum549ab711997-01-03 19:09:47 +0000193
194static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000195i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000196{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000197 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000198}
199
200static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000201i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000202{
203 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000204 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000205 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000206 return -1;
207 if (i >= 0)
208 ((int *)ap->ob_item)[i] = x;
209 return 0;
210}
211
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000212static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000213II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000214{
215 return PyLong_FromUnsignedLong(
216 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
217}
218
219static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000220II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000221{
222 unsigned long x;
223 if (PyLong_Check(v)) {
224 x = PyLong_AsUnsignedLong(v);
225 if (x == (unsigned long) -1 && PyErr_Occurred())
226 return -1;
227 }
228 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000229 long y;
230 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000231 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000232 if (y < 0) {
233 PyErr_SetString(PyExc_OverflowError,
234 "unsigned int is less than minimum");
235 return -1;
236 }
237 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000238
Guido van Rossum549ab711997-01-03 19:09:47 +0000239 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000240 if (x > UINT_MAX) {
241 PyErr_SetString(PyExc_OverflowError,
242 "unsigned int is greater than maximum");
243 return -1;
244 }
245
Guido van Rossum549ab711997-01-03 19:09:47 +0000246 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000247 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000248 return 0;
249}
250
251static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000252l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000253{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000254 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000255}
256
257static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000258l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000259{
260 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000261 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000262 return -1;
263 if (i >= 0)
264 ((long *)ap->ob_item)[i] = x;
265 return 0;
266}
267
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000268static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000269LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000270{
271 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
272}
273
274static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000275LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000276{
277 unsigned long x;
278 if (PyLong_Check(v)) {
279 x = PyLong_AsUnsignedLong(v);
280 if (x == (unsigned long) -1 && PyErr_Occurred())
281 return -1;
282 }
283 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000284 long y;
285 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000286 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000287 if (y < 0) {
288 PyErr_SetString(PyExc_OverflowError,
289 "unsigned long is less than minimum");
290 return -1;
291 }
292 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000293
Guido van Rossum549ab711997-01-03 19:09:47 +0000294 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000295 if (x > ULONG_MAX) {
296 PyErr_SetString(PyExc_OverflowError,
297 "unsigned long is greater than maximum");
298 return -1;
299 }
Tim Petersbb307342000-09-10 05:22:54 +0000300
Guido van Rossum549ab711997-01-03 19:09:47 +0000301 if (i >= 0)
302 ((unsigned long *)ap->ob_item)[i] = x;
303 return 0;
304}
305
306static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000307f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000308{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000309 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000310}
311
312static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000313f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000314{
315 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000316 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000317 return -1;
318 if (i >= 0)
319 ((float *)ap->ob_item)[i] = x;
320 return 0;
321}
322
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000323static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000324d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000325{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000326 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000327}
328
329static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000330d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000331{
332 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000333 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000334 return -1;
335 if (i >= 0)
336 ((double *)ap->ob_item)[i] = x;
337 return 0;
338}
339
340/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000341static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000342 {'c', sizeof(char), c_getitem, c_setitem},
343 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000344 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000345#ifdef Py_USING_UNICODE
346 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
347#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000348 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000349 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000350 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000351 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000352 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000353 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000354 {'f', sizeof(float), f_getitem, f_setitem},
355 {'d', sizeof(double), d_getitem, d_setitem},
356 {'\0', 0, 0, 0} /* Sentinel */
357};
Tim Petersbb307342000-09-10 05:22:54 +0000358
359/****************************************************************************
360Implementations of array object methods.
361****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000362
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000363static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +0000364newarrayobject(PyTypeObject *type, int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000365{
Guido van Rossum778983b1993-02-19 15:55:02 +0000366 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000367 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000368
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000370 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000371 return NULL;
372 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000373
Guido van Rossum778983b1993-02-19 15:55:02 +0000374 nbytes = size * descr->itemsize;
375 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000376 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000377 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000378 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000379 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000380 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000381 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000382 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000383 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000384 if (size <= 0) {
385 op->ob_item = NULL;
386 }
387 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000388 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000389 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000390 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000391 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000392 }
393 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000395 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000396}
397
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000398static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000399getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000400{
401 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000402 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000403 ap = (arrayobject *)op;
404 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000405 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 return NULL;
407 }
408 return (*ap->ob_descr->getitem)(ap, i);
409}
410
411static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000412ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000413{
Guido van Rossum778983b1993-02-19 15:55:02 +0000414 char *items;
415 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000416 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 return -1;
418 }
419 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
420 return -1;
421 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000422 PyMem_RESIZE(items, char,
423 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000424 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000425 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 return -1;
427 }
428 if (where < 0)
429 where = 0;
430 if (where > self->ob_size)
431 where = self->ob_size;
432 memmove(items + (where+1)*self->ob_descr->itemsize,
433 items + where*self->ob_descr->itemsize,
434 (self->ob_size-where)*self->ob_descr->itemsize);
435 self->ob_item = items;
436 self->ob_size++;
437 return (*self->ob_descr->setitem)(self, where, v);
438}
439
Guido van Rossum778983b1993-02-19 15:55:02 +0000440/* Methods */
441
442static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000443array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000444{
Guido van Rossum778983b1993-02-19 15:55:02 +0000445 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000447 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000448}
449
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000450static PyObject *
451array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000452{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000453 arrayobject *va, *wa;
454 PyObject *vi = NULL;
455 PyObject *wi = NULL;
456 int i, k;
457 PyObject *res;
458
Martin v. Löwis99866332002-03-01 10:27:01 +0000459 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000460 Py_INCREF(Py_NotImplemented);
461 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000462 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000463
464 va = (arrayobject *)v;
465 wa = (arrayobject *)w;
466
467 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
468 /* Shortcut: if the lengths differ, the arrays differ */
469 if (op == Py_EQ)
470 res = Py_False;
471 else
472 res = Py_True;
473 Py_INCREF(res);
474 return res;
475 }
476
477 /* Search for the first index where items are different */
478 k = 1;
479 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
480 vi = getarrayitem(v, i);
481 wi = getarrayitem(w, i);
482 if (vi == NULL || wi == NULL) {
483 Py_XDECREF(vi);
484 Py_XDECREF(wi);
485 return NULL;
486 }
487 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
488 if (k == 0)
489 break; /* Keeping vi and wi alive! */
490 Py_DECREF(vi);
491 Py_DECREF(wi);
492 if (k < 0)
493 return NULL;
494 }
495
496 if (k) {
497 /* No more items to compare -- compare sizes */
498 int vs = va->ob_size;
499 int ws = wa->ob_size;
500 int cmp;
501 switch (op) {
502 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000503 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504 case Py_EQ: cmp = vs == ws; break;
505 case Py_NE: cmp = vs != ws; break;
506 case Py_GT: cmp = vs > ws; break;
507 case Py_GE: cmp = vs >= ws; break;
508 default: return NULL; /* cannot happen */
509 }
510 if (cmp)
511 res = Py_True;
512 else
513 res = Py_False;
514 Py_INCREF(res);
515 return res;
516 }
517
518 /* We have an item that differs. First, shortcuts for EQ/NE */
519 if (op == Py_EQ) {
520 Py_INCREF(Py_False);
521 res = Py_False;
522 }
523 else if (op == Py_NE) {
524 Py_INCREF(Py_True);
525 res = Py_True;
526 }
527 else {
528 /* Compare the final item again using the proper operator */
529 res = PyObject_RichCompare(vi, wi, op);
530 }
531 Py_DECREF(vi);
532 Py_DECREF(wi);
533 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000534}
535
536static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000537array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000538{
539 return a->ob_size;
540}
541
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000542static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000543array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000544{
545 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000546 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000547 return NULL;
548 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000549 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000550}
551
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000552static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000553array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000554{
555 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000556 if (ilow < 0)
557 ilow = 0;
558 else if (ilow > a->ob_size)
559 ilow = a->ob_size;
560 if (ihigh < 0)
561 ihigh = 0;
562 if (ihigh < ilow)
563 ihigh = ilow;
564 else if (ihigh > a->ob_size)
565 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000566 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000567 if (np == NULL)
568 return NULL;
569 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
570 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000571 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000572}
573
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000574static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000575array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000576{
577 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000578 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000579 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000580 PyErr_Format(PyExc_TypeError,
581 "can only append array (not \"%.200s\") to array",
582 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000583 return NULL;
584 }
585#define b ((arrayobject *)bb)
586 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000587 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000588 return NULL;
589 }
590 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000591 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000592 if (np == NULL) {
593 return NULL;
594 }
595 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
596 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000597 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000598 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000599#undef b
600}
601
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000602static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000603array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000604{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000605 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000606 int size;
607 arrayobject *np;
608 char *p;
609 int nbytes;
610 if (n < 0)
611 n = 0;
612 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000613 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 if (np == NULL)
615 return NULL;
616 p = np->ob_item;
617 nbytes = a->ob_size * a->ob_descr->itemsize;
618 for (i = 0; i < n; i++) {
619 memcpy(p, a->ob_item, nbytes);
620 p += nbytes;
621 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000622 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000623}
624
625static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000626array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000627{
628 char *item;
629 int n; /* Size of replacement array */
630 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000631#define b ((arrayobject *)v)
632 if (v == NULL)
633 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000634 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000635 n = b->ob_size;
636 if (a == b) {
637 /* Special case "a[i:j] = a" -- copy b first */
638 int ret;
639 v = array_slice(b, 0, n);
640 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000641 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000642 return ret;
643 }
644 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000645 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000646 return -1;
647 }
648 }
649 else {
Fred Drake137507e2000-06-01 02:02:46 +0000650 PyErr_Format(PyExc_TypeError,
651 "can only assign array (not \"%.200s\") to array slice",
652 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return -1;
654 }
655 if (ilow < 0)
656 ilow = 0;
657 else if (ilow > a->ob_size)
658 ilow = a->ob_size;
659 if (ihigh < 0)
660 ihigh = 0;
661 if (ihigh < ilow)
662 ihigh = ilow;
663 else if (ihigh > a->ob_size)
664 ihigh = a->ob_size;
665 item = a->ob_item;
666 d = n - (ihigh-ilow);
667 if (d < 0) { /* Delete -d items */
668 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
669 item + ihigh*a->ob_descr->itemsize,
670 (a->ob_size-ihigh)*a->ob_descr->itemsize);
671 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000672 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000673 /* Can't fail */
674 a->ob_item = item;
675 }
676 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000677 PyMem_RESIZE(item, char,
678 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000679 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000680 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000681 return -1;
682 }
683 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
684 item + ihigh*a->ob_descr->itemsize,
685 (a->ob_size-ihigh)*a->ob_descr->itemsize);
686 a->ob_item = item;
687 a->ob_size += d;
688 }
689 if (n > 0)
690 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
691 n*b->ob_descr->itemsize);
692 return 0;
693#undef b
694}
695
696static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000697array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000698{
699 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000700 PyErr_SetString(PyExc_IndexError,
701 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000702 return -1;
703 }
704 if (v == NULL)
705 return array_ass_slice(a, i, i+1, v);
706 return (*a->ob_descr->setitem)(a, i, v);
707}
708
709static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000710setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000711{
Martin v. Löwis99866332002-03-01 10:27:01 +0000712 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 return array_ass_item((arrayobject *)a, i, v);
714}
715
Martin v. Löwis99866332002-03-01 10:27:01 +0000716static int
717array_do_extend(arrayobject *self, PyObject *bb)
718{
719 int size;
720
721 if (!array_Check(bb)) {
722 PyErr_Format(PyExc_TypeError,
723 "can only extend array with array (not \"%.200s\")",
724 bb->ob_type->tp_name);
725 return -1;
726 }
727#define b ((arrayobject *)bb)
728 if (self->ob_descr != b->ob_descr) {
729 PyErr_SetString(PyExc_TypeError,
730 "can only extend with array of same kind");
731 return -1;
732 }
733 size = self->ob_size + b->ob_size;
734 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
735 if (self->ob_item == NULL) {
736 PyObject_Del(self);
737 PyErr_NoMemory();
738 return -1;
739 }
740 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
741 b->ob_item, b->ob_size*b->ob_descr->itemsize);
742 self->ob_size = size;
743
744 return 0;
745#undef b
746}
747
748static PyObject *
749array_inplace_concat(arrayobject *self, PyObject *bb)
750{
751 if (array_do_extend(self, bb) == -1)
752 return NULL;
753 Py_INCREF(self);
754 return (PyObject *)self;
755}
756
757static PyObject *
758array_inplace_repeat(arrayobject *self, int n)
759{
760 char *items, *p;
761 int size, i;
762
763 if (self->ob_size > 0) {
764 if (n < 0)
765 n = 0;
766 items = self->ob_item;
767 size = self->ob_size * self->ob_descr->itemsize;
768 if (n == 0) {
769 PyMem_FREE(items);
770 self->ob_item = NULL;
771 self->ob_size = 0;
772 }
773 else {
774 PyMem_Resize(items, char, n * size);
775 if (items == NULL)
776 return PyErr_NoMemory();
777 p = items;
778 for (i = 1; i < n; i++) {
779 p += size;
780 memcpy(p, items, size);
781 }
782 self->ob_item = items;
783 self->ob_size *= n;
784 }
785 }
786 Py_INCREF(self);
787 return (PyObject *)self;
788}
789
790
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000791static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000792ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000793{
794 if (ins1(self, where, v) != 0)
795 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000796 Py_INCREF(Py_None);
797 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000798}
799
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000800static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000801array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000802{
803 int count = 0;
804 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000805
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000806 for (i = 0; i < self->ob_size; i++) {
807 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000808 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000809 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000810 if (cmp > 0)
811 count++;
812 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000813 return NULL;
814 }
815 return PyInt_FromLong((long)count);
816}
817
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000818PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000819"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000820\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000821Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000822
823static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000824array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000825{
826 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000827
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000828 for (i = 0; i < self->ob_size; i++) {
829 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000830 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
831 Py_DECREF(selfi);
832 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000833 return PyInt_FromLong((long)i);
834 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000835 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000836 return NULL;
837 }
838 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
839 return NULL;
840}
841
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000842PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000843"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000844\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000845Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000846
847static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000848array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000849{
850 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000851
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000852 for (i = 0; i < self->ob_size; i++) {
853 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000854 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
855 Py_DECREF(selfi);
856 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000857 if (array_ass_slice(self, i, i+1,
858 (PyObject *)NULL) != 0)
859 return NULL;
860 Py_INCREF(Py_None);
861 return Py_None;
862 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000863 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000864 return NULL;
865 }
866 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
867 return NULL;
868}
869
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000870PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000871"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000872\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000873Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000874
875static PyObject *
876array_pop(arrayobject *self, PyObject *args)
877{
878 int i = -1;
879 PyObject *v;
880 if (!PyArg_ParseTuple(args, "|i:pop", &i))
881 return NULL;
882 if (self->ob_size == 0) {
883 /* Special-case most common failure cause */
884 PyErr_SetString(PyExc_IndexError, "pop from empty array");
885 return NULL;
886 }
887 if (i < 0)
888 i += self->ob_size;
889 if (i < 0 || i >= self->ob_size) {
890 PyErr_SetString(PyExc_IndexError, "pop index out of range");
891 return NULL;
892 }
893 v = getarrayitem((PyObject *)self,i);
894 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
895 Py_DECREF(v);
896 return NULL;
897 }
898 return v;
899}
900
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000901PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000902"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000903\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000904Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000905
906static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000907array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000908{
Martin v. Löwis99866332002-03-01 10:27:01 +0000909 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000910 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +0000911 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000912 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913}
914
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000915PyDoc_STRVAR(extend_doc,
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916"extend(array)\n\
917\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000918 Append array items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919
920static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000921array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000922{
923 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000924 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000925 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000926 return NULL;
927 return ins(self, i, v);
928}
929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000930PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000931"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000932\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000933Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000934
935
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000936static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000937array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000938{
Tim Peters077a11d2000-09-16 22:31:29 +0000939 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +0000940 retval = PyTuple_New(2);
941 if (!retval)
942 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +0000943
944 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
945 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
946
947 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000948}
949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000950PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000951"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000952\n\
953Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +0000954the length in items of the buffer used to hold array's contents\n\
955The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000956the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000957
958
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000959static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000960array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000961{
Guido van Rossum778983b1993-02-19 15:55:02 +0000962 return ins(self, (int) self->ob_size, v);
963}
964
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000965PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000966"append(x)\n\
967\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000968Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000969
970
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000971static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000972array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +0000973{
974 char *p;
975 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000976
Guido van Rossum778983b1993-02-19 15:55:02 +0000977 switch (self->ob_descr->itemsize) {
978 case 1:
979 break;
980 case 2:
981 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
982 char p0 = p[0];
983 p[0] = p[1];
984 p[1] = p0;
985 }
986 break;
987 case 4:
988 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
989 char p0 = p[0];
990 char p1 = p[1];
991 p[0] = p[3];
992 p[1] = p[2];
993 p[2] = p1;
994 p[3] = p0;
995 }
996 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000997 case 8:
998 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
999 char p0 = p[0];
1000 char p1 = p[1];
1001 char p2 = p[2];
1002 char p3 = p[3];
1003 p[0] = p[7];
1004 p[1] = p[6];
1005 p[2] = p[5];
1006 p[3] = p[4];
1007 p[4] = p3;
1008 p[5] = p2;
1009 p[6] = p1;
1010 p[7] = p0;
1011 }
1012 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001013 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001014 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001015 "don't know how to byteswap this array type");
1016 return NULL;
1017 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001018 Py_INCREF(Py_None);
1019 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001020}
1021
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001022PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001023"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001024\n\
Fred Drakebf272981999-12-03 17:15:30 +00001025Byteswap all items of the array. If the items in the array are not 1, 2,\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +000010264, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001027
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001028static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001029array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001030{
Guido van Rossume77a7571993-11-03 15:01:26 +00001031 register int itemsize = self->ob_descr->itemsize;
1032 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001033 /* little buffer to hold items while swapping */
1034 char tmp[256]; /* 8 is probably enough -- but why skimp */
1035 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001036
Guido van Rossum778983b1993-02-19 15:55:02 +00001037 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001038 for (p = self->ob_item,
1039 q = self->ob_item + (self->ob_size - 1)*itemsize;
1040 p < q;
1041 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001042 /* memory areas guaranteed disjoint, so memcpy
1043 * is safe (& memmove may be slower).
1044 */
1045 memcpy(tmp, p, itemsize);
1046 memcpy(p, q, itemsize);
1047 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001048 }
1049 }
Tim Petersbb307342000-09-10 05:22:54 +00001050
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001051 Py_INCREF(Py_None);
1052 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001053}
Guido van Rossume77a7571993-11-03 15:01:26 +00001054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001055PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001056"reverse()\n\
1057\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001058Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001059
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001060static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001061array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001062{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001063 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001064 int n;
1065 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001066 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001067 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001068 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001069 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001070 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001071 return NULL;
1072 }
1073 if (n > 0) {
1074 char *item = self->ob_item;
1075 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001076 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001077 int newlength;
1078 size_t newbytes;
1079 /* Be careful here about overflow */
1080 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001081 (newbytes = newlength * itemsize) / itemsize !=
1082 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001083 goto nomem;
1084 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001085 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001086 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001087 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001088 return NULL;
1089 }
1090 self->ob_item = item;
1091 self->ob_size += n;
1092 nread = fread(item + (self->ob_size - n) * itemsize,
1093 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001094 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001095 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001096 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001097 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001098 PyErr_SetString(PyExc_EOFError,
1099 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001100 return NULL;
1101 }
1102 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001103 Py_INCREF(Py_None);
1104 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001105}
1106
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001107PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001108"fromfile(f, n)\n\
1109\n\
1110Read n objects from the file object f and append them to the end of the\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001111array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001112
1113
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001114static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001115array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001116{
Guido van Rossum778983b1993-02-19 15:55:02 +00001117 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001118
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001119 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001121 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001122 return NULL;
1123 }
1124 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001125 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1126 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001128 clearerr(fp);
1129 return NULL;
1130 }
1131 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001132 Py_INCREF(Py_None);
1133 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001134}
1135
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001136PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001137"tofile(f)\n\
1138\n\
1139Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001140write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001141
1142
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001143static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001144array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001145{
1146 int n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001147 int itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001148
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149 if (!PyList_Check(list)) {
1150 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001151 return NULL;
1152 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001153 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001154 if (n > 0) {
1155 char *item = self->ob_item;
1156 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001158 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001159 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001160 return NULL;
1161 }
1162 self->ob_item = item;
1163 self->ob_size += n;
1164 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001165 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001166 if ((*self->ob_descr->setitem)(self,
1167 self->ob_size - n + i, v) != 0) {
1168 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001169 PyMem_RESIZE(item, char,
1170 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001171 self->ob_item = item;
1172 return NULL;
1173 }
1174 }
1175 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001176 Py_INCREF(Py_None);
1177 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001178}
1179
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001180PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001181"fromlist(list)\n\
1182\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001183Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001184
1185
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001186static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001187array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001188{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001189 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001190 int i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001191
Guido van Rossum778983b1993-02-19 15:55:02 +00001192 if (list == NULL)
1193 return NULL;
1194 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001196 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001197 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001198 return NULL;
1199 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001200 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 }
1202 return list;
1203}
1204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001205PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001206"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001207\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001208Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001209
1210
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001211static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001212array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001213{
1214 char *str;
1215 int n;
1216 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001217 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001218 return NULL;
1219 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001220 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001221 "string length not a multiple of item size");
1222 return NULL;
1223 }
1224 n = n / itemsize;
1225 if (n > 0) {
1226 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001227 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001228 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001229 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 return NULL;
1231 }
1232 self->ob_item = item;
1233 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001234 memcpy(item + (self->ob_size - n) * itemsize,
1235 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001236 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001237 Py_INCREF(Py_None);
1238 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001239}
1240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001242"fromstring(string)\n\
1243\n\
1244Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001245values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001246
1247
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001248static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001249array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001250{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001251 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001252 self->ob_size * self->ob_descr->itemsize);
1253}
1254
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001255PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001256"tostring() -> string\n\
1257\n\
1258Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001259representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001260
Martin v. Löwis99866332002-03-01 10:27:01 +00001261
1262
1263#ifdef Py_USING_UNICODE
1264static PyObject *
1265array_fromunicode(arrayobject *self, PyObject *args)
1266{
1267 Py_UNICODE *ustr;
1268 int n;
1269
1270 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1271 return NULL;
1272 if (self->ob_descr->typecode != 'u') {
1273 PyErr_SetString(PyExc_ValueError,
1274 "fromunicode() may only be called on "
1275 "type 'u' arrays");
1276 return NULL;
1277 }
1278 if (n > 0) {
1279 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1280 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1281 if (item == NULL) {
1282 PyErr_NoMemory();
1283 return NULL;
1284 }
1285 self->ob_item = (char *) item;
1286 self->ob_size += n;
1287 memcpy(item + self->ob_size - n,
1288 ustr, n * sizeof(Py_UNICODE));
1289 }
1290
1291 Py_INCREF(Py_None);
1292 return Py_None;
1293}
1294
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001295PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001296"fromunicode(ustr)\n\
1297\n\
1298Extends this array with data from the unicode string ustr.\n\
1299The array must be a type 'u' array; otherwise a ValueError\n\
1300is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001301append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001302
1303
1304static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001305array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001306{
Martin v. Löwis99866332002-03-01 10:27:01 +00001307 if (self->ob_descr->typecode != 'u') {
1308 PyErr_SetString(PyExc_ValueError,
1309 "tounicode() may only be called on type 'u' arrays");
1310 return NULL;
1311 }
1312 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1313}
1314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001315PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001316"tounicode() -> unicode\n\
1317\n\
1318Convert the array to a unicode string. The array must be\n\
1319a type 'u' array; otherwise a ValueError is raised. Use\n\
1320array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001321an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001322
1323#endif /* Py_USING_UNICODE */
1324
1325
1326static PyObject *
1327array_get_typecode(arrayobject *a, void *closure)
1328{
1329 char tc = a->ob_descr->typecode;
1330 return PyString_FromStringAndSize(&tc, 1);
1331}
1332
1333static PyObject *
1334array_get_itemsize(arrayobject *a, void *closure)
1335{
1336 return PyInt_FromLong((long)a->ob_descr->itemsize);
1337}
1338
1339static PyGetSetDef array_getsets [] = {
1340 {"typecode", (getter) array_get_typecode, NULL,
1341 "the typecode character used to create the array"},
1342 {"itemsize", (getter) array_get_itemsize, NULL,
1343 "the size, in bytes, of one array item"},
1344 {NULL}
1345};
1346
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001347PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001348 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001349 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001350 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001351 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001352 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001353 byteswap_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001354 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001355 count_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001356 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001357 extend_doc},
1358 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1359 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001360 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001361 fromlist_doc},
1362 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1363 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001364#ifdef Py_USING_UNICODE
1365 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1366 fromunicode_doc},
1367#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001368 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001369 index_doc},
1370 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1371 insert_doc},
1372 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1373 pop_doc},
1374 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1375 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001376 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001377 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001378 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001379 reverse_doc},
1380/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1381 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001382 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001383 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001384 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001385 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001386 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001387 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001388#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001389 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001390 tounicode_doc},
1391#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001392 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001393 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001394 {NULL, NULL} /* sentinel */
1395};
1396
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001397static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001398array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001399{
Martin v. Löwis99866332002-03-01 10:27:01 +00001400 char buf[256], typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001401 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 int i, len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001403
Guido van Rossum778983b1993-02-19 15:55:02 +00001404 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001405 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001407 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001408 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001409 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001410
1411 if (typecode == 'c' || typecode == 'u') {
Martin v. Löwis99866332002-03-01 10:27:01 +00001412 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001413 s = PyString_FromString(buf);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001414#ifdef Py_USING_UNICODE
Martin v. Löwis99866332002-03-01 10:27:01 +00001415 if (typecode == 'c')
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001416#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001417 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001418#ifdef Py_USING_UNICODE
Martin v. Löwis99866332002-03-01 10:27:01 +00001419 else
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001420 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001421#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001422 t = PyObject_Repr(v);
1423 Py_XDECREF(v);
1424 PyString_ConcatAndDel(&s, t);
1425 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001426 return s;
1427 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001428 PyOS_snprintf(buf, sizeof(buf), "array('%c', [", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001429 s = PyString_FromString(buf);
1430 comma = PyString_FromString(", ");
1431 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001432 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001433 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001434 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001435 t = PyObject_Repr(v);
1436 Py_XDECREF(v);
1437 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001438 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001439 Py_XDECREF(comma);
1440 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001441 return s;
1442}
1443
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001444static PyObject*
1445array_subscr(arrayobject* self, PyObject* item)
1446{
1447 if (PyInt_Check(item)) {
1448 long i = PyInt_AS_LONG(item);
1449 if (i < 0)
1450 i += self->ob_size;
1451 return array_item(self, i);
1452 }
1453 else if (PyLong_Check(item)) {
1454 long i = PyLong_AsLong(item);
1455 if (i == -1 && PyErr_Occurred())
1456 return NULL;
1457 if (i < 0)
1458 i += self->ob_size;
1459 return array_item(self, i);
1460 }
1461 else if (PySlice_Check(item)) {
1462 int start, stop, step, slicelength, cur, i;
1463 PyObject* result;
1464 arrayobject* ar;
1465 int itemsize = self->ob_descr->itemsize;
1466
1467 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1468 &start, &stop, &step, &slicelength) < 0) {
1469 return NULL;
1470 }
1471
1472 if (slicelength <= 0) {
1473 return newarrayobject(&Arraytype, 0, self->ob_descr);
1474 }
1475 else {
1476 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1477 if (!result) return NULL;
1478
1479 ar = (arrayobject*)result;
1480
1481 for (cur = start, i = 0; i < slicelength;
1482 cur += step, i++) {
1483 memcpy(ar->ob_item + i*itemsize,
1484 self->ob_item + cur*itemsize,
1485 itemsize);
1486 }
1487
1488 return result;
1489 }
1490 }
1491 else {
1492 PyErr_SetString(PyExc_TypeError,
1493 "list indices must be integers");
1494 return NULL;
1495 }
1496}
1497
1498static int
1499array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1500{
1501 if (PyInt_Check(item)) {
1502 long i = PyInt_AS_LONG(item);
1503 if (i < 0)
1504 i += self->ob_size;
1505 return array_ass_item(self, i, value);
1506 }
1507 else if (PyLong_Check(item)) {
1508 long i = PyLong_AsLong(item);
1509 if (i == -1 && PyErr_Occurred())
1510 return -1;
1511 if (i < 0)
1512 i += self->ob_size;
1513 return array_ass_item(self, i, value);
1514 }
1515 else if (PySlice_Check(item)) {
1516 int start, stop, step, slicelength;
1517 int itemsize = self->ob_descr->itemsize;
1518
1519 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1520 &start, &stop, &step, &slicelength) < 0) {
1521 return -1;
1522 }
1523
1524 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1525 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1526 return array_ass_slice(self, start, stop, value);
1527
1528 if (value == NULL) {
1529 /* delete slice */
Michael W. Hudson56796f62002-07-29 14:35:04 +00001530 int cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001531
1532 if (slicelength <= 0)
1533 return 0;
1534
1535 if (step < 0) {
1536 stop = start + 1;
1537 start = stop + step*(slicelength - 1) - 1;
1538 step = -step;
1539 }
1540
Michael W. Hudson56796f62002-07-29 14:35:04 +00001541 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001542 cur += step, i++) {
1543 memmove(self->ob_item + (cur - i)*itemsize,
1544 self->ob_item + (cur + 1)*itemsize,
1545 (step - 1) * itemsize);
1546 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001547 extra = self->ob_size - (cur + 1);
1548 if (extra > 0) {
1549 memmove(self->ob_item + (cur - i)*itemsize,
1550 self->ob_item + (cur + 1)*itemsize,
1551 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001552 }
1553
1554 self->ob_size -= slicelength;
1555 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
1556
1557
1558 return 0;
1559 }
1560 else {
1561 /* assign slice */
1562 int cur, i;
1563 arrayobject* av;
1564
1565 if (!array_Check(value)) {
1566 PyErr_Format(PyExc_TypeError,
1567 "must assign array (not \"%.200s\") to slice",
1568 value->ob_type->tp_name);
1569 return -1;
1570 }
1571
1572 av = (arrayobject*)value;
1573
1574 if (av->ob_size != slicelength) {
1575 PyErr_Format(PyExc_ValueError,
1576 "attempt to assign array of size %d to extended slice of size %d",
1577 av->ob_size, slicelength);
1578 return -1;
1579 }
1580
1581 if (!slicelength)
1582 return 0;
1583
1584 /* protect against a[::-1] = a */
1585 if (self == av) {
1586 value = array_slice(av, 0, av->ob_size);
1587 av = (arrayobject*)value;
1588 }
1589 else {
1590 Py_INCREF(value);
1591 }
1592
1593 for (cur = start, i = 0; i < slicelength;
1594 cur += step, i++) {
1595 memcpy(self->ob_item + cur*itemsize,
1596 av->ob_item + i*itemsize,
1597 itemsize);
1598 }
1599
1600 Py_DECREF(value);
1601
1602 return 0;
1603 }
1604 }
1605 else {
1606 PyErr_SetString(PyExc_TypeError,
1607 "list indices must be integers");
1608 return -1;
1609 }
1610}
1611
1612static PyMappingMethods array_as_mapping = {
1613 (inquiry)array_length,
1614 (binaryfunc)array_subscr,
1615 (objobjargproc)array_ass_subscr
1616};
1617
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001618static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001619array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001620{
1621 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001622 PyErr_SetString(PyExc_SystemError,
1623 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001624 return -1;
1625 }
1626 *ptr = (void *)self->ob_item;
1627 return self->ob_size*self->ob_descr->itemsize;
1628}
1629
1630static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001631array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001632{
1633 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001634 PyErr_SetString(PyExc_SystemError,
1635 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001636 return -1;
1637 }
1638 *ptr = (void *)self->ob_item;
1639 return self->ob_size*self->ob_descr->itemsize;
1640}
1641
1642static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001643array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001644{
1645 if ( lenp )
1646 *lenp = self->ob_size*self->ob_descr->itemsize;
1647 return 1;
1648}
1649
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001650static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001651 (inquiry)array_length, /*sq_length*/
1652 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001653 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001654 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001655 (intintargfunc)array_slice, /*sq_slice*/
1656 (intobjargproc)array_ass_item, /*sq_ass_item*/
1657 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001658 NULL, /*sq_contains*/
1659 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
1660 (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001661};
1662
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001663static PyBufferProcs array_as_buffer = {
1664 (getreadbufferproc)array_buffer_getreadbuf,
1665 (getwritebufferproc)array_buffer_getwritebuf,
1666 (getsegcountproc)array_buffer_getsegcount,
1667};
1668
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001669static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001670array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001671{
1672 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001673 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001674 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00001675
1676 if (kwds != NULL) {
1677 int i = PyObject_Length(kwds);
1678 if (i < 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001679 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001680 else if (i > 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001681 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001682 "array.array constructor takes "
1683 "no keyword arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +00001684 return NULL;
1685 }
1686 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001687
1688 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1689 return NULL;
1690
1691 if (!(initial == NULL || PyList_Check(initial)
1692 || PyString_Check(initial)
1693 || (c == 'u' && PyUnicode_Check(initial)))) {
1694 PyErr_SetString(PyExc_TypeError,
1695 "array initializer must be list or string");
1696 return NULL;
1697 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001698 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1699 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001700 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001701 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001702 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001703 len = 0;
1704 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001705 len = PyList_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001706
1707 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001708 if (a == NULL)
1709 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001710
Guido van Rossum778983b1993-02-19 15:55:02 +00001711 if (len > 0) {
1712 int i;
1713 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001714 PyObject *v =
Martin v. Löwis99866332002-03-01 10:27:01 +00001715 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001716 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001717 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001718 return NULL;
1719 }
1720 }
1721 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001722 if (initial != NULL && PyString_Check(initial)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001723 PyObject *t_initial = Py_BuildValue("(O)",
1724 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001725 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001726 array_fromstring((arrayobject *)a,
1727 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001728 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001729 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001730 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001731 return NULL;
1732 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001733 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001734#ifdef Py_USING_UNICODE
1735 } else if (initial != NULL && PyUnicode_Check(initial)) {
1736 int n = PyUnicode_GET_DATA_SIZE(initial);
1737 if (n > 0) {
1738 arrayobject *self = (arrayobject *)a;
1739 char *item = self->ob_item;
1740 item = PyMem_Realloc(item, n);
1741 if (item == NULL) {
1742 PyErr_NoMemory();
1743 Py_DECREF(a);
1744 return NULL;
1745 }
1746 self->ob_item = item;
1747 self->ob_size = n / sizeof(Py_UNICODE);
1748 memcpy(item, PyUnicode_AS_DATA(initial), n);
1749 }
1750#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001751 }
1752 return a;
1753 }
1754 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001755 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001756 "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001757 return NULL;
1758}
1759
Guido van Rossum778983b1993-02-19 15:55:02 +00001760
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001761PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001762"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001763an array of basic values: characters, integers, floating point\n\
1764numbers. Arrays are sequence types and behave very much like lists,\n\
1765except that the type of objects stored in them is constrained. The\n\
1766type is specified at object creation time by using a type code, which\n\
1767is a single character. The following type codes are defined:\n\
1768\n\
1769 Type code C Type Minimum size in bytes \n\
1770 'c' character 1 \n\
1771 'b' signed integer 1 \n\
1772 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001773 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001774 'h' signed integer 2 \n\
1775 'H' unsigned integer 2 \n\
1776 'i' signed integer 2 \n\
1777 'I' unsigned integer 2 \n\
1778 'l' signed integer 4 \n\
1779 'L' unsigned integer 4 \n\
1780 'f' floating point 4 \n\
1781 'd' floating point 8 \n\
1782\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001783The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001784\n\
1785array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001786");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001787
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001788PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001789"array(typecode [, initializer]) -> array\n\
1790\n\
1791Return a new array whose items are restricted by typecode, and\n\
1792initialized from the optional initializer value, which must be a list\n\
1793or a string.\n\
1794\n\
1795Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001796the type of objects stored in them is constrained.\n\
1797\n\
1798Methods:\n\
1799\n\
1800append() -- append a new item to the end of the array\n\
1801buffer_info() -- return information giving the current memory info\n\
1802byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001803count() -- return number of occurences of an object\n\
1804extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001805fromfile() -- read items from a file object\n\
1806fromlist() -- append items from the list\n\
1807fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001808index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001809insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001810pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001811read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001812remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001813reverse() -- reverse the order of the items in the array\n\
1814tofile() -- write all items to a file object\n\
1815tolist() -- return the array converted to an ordinary list\n\
1816tostring() -- return the array converted to a string\n\
1817write() -- DEPRECATED, use tofile()\n\
1818\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001819Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001820\n\
1821typecode -- the typecode character used to create the array\n\
1822itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001823");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001824
Tim Peters0c322792002-07-17 16:49:03 +00001825static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001826 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001827 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001828 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001829 sizeof(arrayobject),
1830 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001831 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001832 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001833 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001834 0, /* tp_setattr */
1835 0, /* tp_compare */
1836 (reprfunc)array_repr, /* tp_repr */
1837 0, /* tp_as _number*/
1838 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001839 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001840 0, /* tp_hash */
1841 0, /* tp_call */
1842 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001843 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001844 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001845 &array_as_buffer, /* tp_as_buffer*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001846 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001847 arraytype_doc, /* tp_doc */
1848 0, /* tp_traverse */
1849 0, /* tp_clear */
1850 array_richcompare, /* tp_richcompare */
Martin v. Löwis99866332002-03-01 10:27:01 +00001851 0, /* tp_weaklistoffset */
1852 0, /* tp_iter */
1853 0, /* tp_iternext */
1854 array_methods, /* tp_methods */
1855 0, /* tp_members */
1856 array_getsets, /* tp_getset */
1857 0, /* tp_base */
1858 0, /* tp_dict */
1859 0, /* tp_descr_get */
1860 0, /* tp_descr_set */
1861 0, /* tp_dictoffset */
1862 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001863 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00001864 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001865 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001866};
1867
Martin v. Löwis99866332002-03-01 10:27:01 +00001868/* No functions in array module. */
1869static PyMethodDef a_methods[] = {
1870 {NULL, NULL, 0, NULL} /* Sentinel */
1871};
1872
1873
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001874PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001875initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001876{
Fred Drakef4e34842002-04-01 03:45:06 +00001877 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00001878
Martin v. Löwis99866332002-03-01 10:27:01 +00001879 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001880 m = Py_InitModule3("array", a_methods, module_doc);
Fred Drakef4e34842002-04-01 03:45:06 +00001881
1882 Py_INCREF((PyObject *)&Arraytype);
1883 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
1884 Py_INCREF((PyObject *)&Arraytype);
1885 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001886 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001887}