blob: 3e263695999318725c8c95746ca298a3541aa71d [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
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Travis E. Oliphantb803c512007-08-20 07:16:33 +000029 char *formats;
Guido van Rossum778983b1993-02-19 15:55:02 +000030};
31
32typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000033 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000034 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000035 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000036 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000037 PyObject *weakreflist; /* List of weak references */
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000038 int ob_exports; /* Number of exported buffers */
Guido van Rossum778983b1993-02-19 15:55:02 +000039} arrayobject;
40
Jeremy Hylton938ace62002-07-17 16:30:39 +000041static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000042
Martin v. Löwis99866332002-03-01 10:27:01 +000043#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
Christian Heimes90aa7642007-12-19 02:45:37 +000044#define array_CheckExact(op) (Py_TYPE(op) == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000045
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000047array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000048{
49 char *items;
50 size_t _new_size;
51
52 /* Bypass realloc() when a previous overallocation is large enough
53 to accommodate the newsize. If the newsize is 16 smaller than the
54 current size, then proceed with the realloc() to shrink the list.
55 */
56
57 if (self->allocated >= newsize &&
Christian Heimes90aa7642007-12-19 02:45:37 +000058 Py_SIZE(self) < newsize + 16 &&
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000059 self->ob_item != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +000060 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000061 return 0;
62 }
63
Travis E. Oliphantb99f7622007-08-18 11:21:56 +000064 if (self->ob_exports > 0) {
65 PyErr_SetString(PyExc_BufferError,
66 "cannot resize an array that is exporting data");
67 return -1;
68 }
69
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000070 /* This over-allocates proportional to the array size, making room
71 * for additional growth. The over-allocation is mild, but is
72 * enough to give linear-time amortized behavior over a long
73 * sequence of appends() in the presence of a poorly-performing
74 * system realloc().
75 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
76 * Note, the pattern starts out the same as for lists but then
77 * grows at a smaller rate so that larger arrays only overallocate
78 * by about 1/16th -- this is done because arrays are presumed to be more
79 * memory critical.
80 */
81
Christian Heimes90aa7642007-12-19 02:45:37 +000082 _new_size = (newsize >> 4) + (Py_SIZE(self) < 8 ? 3 : 7) + newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000083 items = self->ob_item;
84 /* XXX The following multiplication and division does not optimize away
85 like it does for lists since the size is not known at compile time */
86 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
87 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
88 else
89 items = NULL;
90 if (items == NULL) {
91 PyErr_NoMemory();
92 return -1;
93 }
94 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +000095 Py_SIZE(self) = newsize;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000096 self->allocated = _new_size;
97 return 0;
98}
99
Tim Petersbb307342000-09-10 05:22:54 +0000100/****************************************************************************
101Get and Set functions for each type.
102A Get function takes an arrayobject* and an integer index, returning the
103array value at that index wrapped in an appropriate PyObject*.
104A Set function takes an arrayobject, integer index, and PyObject*; sets
105the array value at that index to the raw C data extracted from the PyObject*,
106and returns 0 if successful, else nonzero on failure (PyObject* not of an
107appropriate type or value).
108Note that the basic Get and Set functions do NOT check that the index is
109in bounds; that's the responsibility of the caller.
110****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000111
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000112static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000113b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000114{
115 long x = ((char *)ap->ob_item)[i];
116 if (x >= 128)
117 x -= 256;
Christian Heimes217cfd12007-12-02 14:31:20 +0000118 return PyLong_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000119}
120
121static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
Fred Drake541dc3b2000-06-28 17:49:30 +0000124 short x;
125 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
126 must use the next size up that is signed ('h') and manually do
127 the overflow checking */
128 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000129 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000130 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000131 PyErr_SetString(PyExc_OverflowError,
132 "signed char is less than minimum");
133 return -1;
134 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000135 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000136 PyErr_SetString(PyExc_OverflowError,
137 "signed char is greater than maximum");
138 return -1;
139 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000140 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000141 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000142 return 0;
143}
144
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000145static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000146BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000147{
148 long x = ((unsigned char *)ap->ob_item)[i];
Christian Heimes217cfd12007-12-02 14:31:20 +0000149 return PyLong_FromLong(x);
Guido van Rossum549ab711997-01-03 19:09:47 +0000150}
151
Fred Drake541dc3b2000-06-28 17:49:30 +0000152static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000153BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000154{
155 unsigned char x;
156 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
157 if (!PyArg_Parse(v, "b;array item must be integer", &x))
158 return -1;
159 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000160 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000161 return 0;
162}
Guido van Rossum549ab711997-01-03 19:09:47 +0000163
Martin v. Löwis99866332002-03-01 10:27:01 +0000164static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000165u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000166{
167 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
168}
169
170static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000171u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000172{
173 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000174 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000175
176 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
177 return -1;
178 if (len != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000179 PyErr_SetString(PyExc_TypeError,
180 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000181 return -1;
182 }
183 if (i >= 0)
184 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
185 return 0;
186}
Martin v. Löwis99866332002-03-01 10:27:01 +0000187
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000188
Guido van Rossum549ab711997-01-03 19:09:47 +0000189static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000190h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000191{
Christian Heimes217cfd12007-12-02 14:31:20 +0000192 return PyLong_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000193}
194
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000195
Guido van Rossum778983b1993-02-19 15:55:02 +0000196static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000197h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000198{
199 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000200 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000201 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000202 return -1;
203 if (i >= 0)
204 ((short *)ap->ob_item)[i] = x;
205 return 0;
206}
207
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000208static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000209HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000210{
Christian Heimes217cfd12007-12-02 14:31:20 +0000211 return PyLong_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
Guido van Rossum549ab711997-01-03 19:09:47 +0000212}
213
Fred Drake541dc3b2000-06-28 17:49:30 +0000214static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000215HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000216{
217 int x;
218 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
219 must use the next size up and manually do the overflow checking */
220 if (!PyArg_Parse(v, "i;array item must be integer", &x))
221 return -1;
222 else if (x < 0) {
223 PyErr_SetString(PyExc_OverflowError,
224 "unsigned short is less than minimum");
225 return -1;
226 }
227 else if (x > USHRT_MAX) {
228 PyErr_SetString(PyExc_OverflowError,
229 "unsigned short is greater than maximum");
230 return -1;
231 }
232 if (i >= 0)
233 ((short *)ap->ob_item)[i] = (short)x;
234 return 0;
235}
Guido van Rossum549ab711997-01-03 19:09:47 +0000236
237static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000238i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000239{
Christian Heimes217cfd12007-12-02 14:31:20 +0000240 return PyLong_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000241}
242
243static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000244i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000245{
246 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000247 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000248 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000249 return -1;
250 if (i >= 0)
251 ((int *)ap->ob_item)[i] = x;
252 return 0;
253}
254
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000255static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000256II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000257{
258 return PyLong_FromUnsignedLong(
259 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
260}
261
262static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000263II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000264{
265 unsigned long x;
266 if (PyLong_Check(v)) {
267 x = PyLong_AsUnsignedLong(v);
268 if (x == (unsigned long) -1 && PyErr_Occurred())
269 return -1;
270 }
271 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000272 long y;
273 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000274 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000275 if (y < 0) {
276 PyErr_SetString(PyExc_OverflowError,
277 "unsigned int is less than minimum");
278 return -1;
279 }
280 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000281
Guido van Rossum549ab711997-01-03 19:09:47 +0000282 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000283 if (x > UINT_MAX) {
284 PyErr_SetString(PyExc_OverflowError,
285 "unsigned int is greater than maximum");
286 return -1;
287 }
288
Guido van Rossum549ab711997-01-03 19:09:47 +0000289 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000290 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 return 0;
292}
293
294static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000295l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000296{
Christian Heimes217cfd12007-12-02 14:31:20 +0000297 return PyLong_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000298}
299
300static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000301l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000302{
303 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000304 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000305 return -1;
306 if (i >= 0)
307 ((long *)ap->ob_item)[i] = x;
308 return 0;
309}
310
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000311static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000312LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000313{
314 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
315}
316
317static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000318LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000319{
320 unsigned long x;
321 if (PyLong_Check(v)) {
322 x = PyLong_AsUnsignedLong(v);
323 if (x == (unsigned long) -1 && PyErr_Occurred())
324 return -1;
325 }
326 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000327 long y;
328 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000329 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000330 if (y < 0) {
331 PyErr_SetString(PyExc_OverflowError,
332 "unsigned long is less than minimum");
333 return -1;
334 }
335 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000336
Guido van Rossum549ab711997-01-03 19:09:47 +0000337 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000338 if (x > ULONG_MAX) {
339 PyErr_SetString(PyExc_OverflowError,
340 "unsigned long is greater than maximum");
341 return -1;
342 }
Tim Petersbb307342000-09-10 05:22:54 +0000343
Guido van Rossum549ab711997-01-03 19:09:47 +0000344 if (i >= 0)
345 ((unsigned long *)ap->ob_item)[i] = x;
346 return 0;
347}
348
349static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000350f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000351{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000352 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000353}
354
355static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000356f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000357{
358 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000359 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000360 return -1;
361 if (i >= 0)
362 ((float *)ap->ob_item)[i] = x;
363 return 0;
364}
365
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000366static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000367d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000368{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000369 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000370}
371
372static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000373d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000374{
375 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000376 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000377 return -1;
378 if (i >= 0)
379 ((double *)ap->ob_item)[i] = x;
380 return 0;
381}
382
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000383
Guido van Rossum778983b1993-02-19 15:55:02 +0000384/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000385static struct arraydescr descriptors[] = {
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +0000386 {'b', 1, b_getitem, b_setitem, "b"},
387 {'B', 1, BB_getitem, BB_setitem, "B"},
Travis E. Oliphantddacf962007-10-13 21:03:27 +0000388 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem, "u"},
Travis E. Oliphantb803c512007-08-20 07:16:33 +0000389 {'h', sizeof(short), h_getitem, h_setitem, "h"},
390 {'H', sizeof(short), HH_getitem, HH_setitem, "H"},
391 {'i', sizeof(int), i_getitem, i_setitem, "i"},
392 {'I', sizeof(int), II_getitem, II_setitem, "I"},
393 {'l', sizeof(long), l_getitem, l_setitem, "l"},
394 {'L', sizeof(long), LL_getitem, LL_setitem, "L"},
395 {'f', sizeof(float), f_getitem, f_setitem, "f"},
396 {'d', sizeof(double), d_getitem, d_setitem, "d"},
397 {'\0', 0, 0, 0, 0} /* Sentinel */
Guido van Rossum778983b1993-02-19 15:55:02 +0000398};
Tim Petersbb307342000-09-10 05:22:54 +0000399
400/****************************************************************************
401Implementations of array object methods.
402****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000403
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000404static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000405newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000406{
Guido van Rossum778983b1993-02-19 15:55:02 +0000407 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000408 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000409
Guido van Rossum778983b1993-02-19 15:55:02 +0000410 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000411 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000412 return NULL;
413 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000414
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 nbytes = size * descr->itemsize;
416 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000417 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000418 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000419 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000420 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000422 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000424 op->ob_descr = descr;
425 op->allocated = size;
426 op->weakreflist = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000427 Py_SIZE(op) = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 if (size <= 0) {
429 op->ob_item = NULL;
430 }
431 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000432 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 if (op->ob_item == NULL) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000434 Py_DECREF(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000435 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 }
437 }
Travis E. Oliphantb99f7622007-08-18 11:21:56 +0000438 op->ob_exports = 0;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000440}
441
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000442static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000443getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000444{
445 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000446 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 ap = (arrayobject *)op;
Christian Heimes90aa7642007-12-19 02:45:37 +0000448 assert(i>=0 && i<Py_SIZE(ap));
Guido van Rossum778983b1993-02-19 15:55:02 +0000449 return (*ap->ob_descr->getitem)(ap, i);
450}
451
452static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
Guido van Rossum778983b1993-02-19 15:55:02 +0000455 char *items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000456 Py_ssize_t n = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000458 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return -1;
460 }
461 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
462 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000463
464 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000466 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000467 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000468 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000469 if (where < 0)
470 where = 0;
471 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000472 if (where > n)
473 where = n;
474 /* appends don't need to call memmove() */
475 if (where != n)
476 memmove(items + (where+1)*self->ob_descr->itemsize,
477 items + where*self->ob_descr->itemsize,
478 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000479 return (*self->ob_descr->setitem)(self, where, v);
480}
481
Guido van Rossum778983b1993-02-19 15:55:02 +0000482/* Methods */
483
484static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000485array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000486{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000487 if (op->weakreflist != NULL)
488 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000490 PyMem_DEL(op->ob_item);
Christian Heimes90aa7642007-12-19 02:45:37 +0000491 Py_TYPE(op)->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000492}
493
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000494static PyObject *
495array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000497 arrayobject *va, *wa;
498 PyObject *vi = NULL;
499 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000500 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000501 PyObject *res;
502
Martin v. Löwis99866332002-03-01 10:27:01 +0000503 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504 Py_INCREF(Py_NotImplemented);
505 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000506 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507
508 va = (arrayobject *)v;
509 wa = (arrayobject *)w;
510
Christian Heimes90aa7642007-12-19 02:45:37 +0000511 if (Py_SIZE(va) != Py_SIZE(wa) && (op == Py_EQ || op == Py_NE)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000512 /* Shortcut: if the lengths differ, the arrays differ */
513 if (op == Py_EQ)
514 res = Py_False;
515 else
516 res = Py_True;
517 Py_INCREF(res);
518 return res;
519 }
520
521 /* Search for the first index where items are different */
522 k = 1;
Christian Heimes90aa7642007-12-19 02:45:37 +0000523 for (i = 0; i < Py_SIZE(va) && i < Py_SIZE(wa); i++) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000524 vi = getarrayitem(v, i);
525 wi = getarrayitem(w, i);
526 if (vi == NULL || wi == NULL) {
527 Py_XDECREF(vi);
528 Py_XDECREF(wi);
529 return NULL;
530 }
531 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
532 if (k == 0)
533 break; /* Keeping vi and wi alive! */
534 Py_DECREF(vi);
535 Py_DECREF(wi);
536 if (k < 0)
537 return NULL;
538 }
539
540 if (k) {
541 /* No more items to compare -- compare sizes */
Christian Heimes90aa7642007-12-19 02:45:37 +0000542 Py_ssize_t vs = Py_SIZE(va);
543 Py_ssize_t ws = Py_SIZE(wa);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000544 int cmp;
545 switch (op) {
546 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000547 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000548 case Py_EQ: cmp = vs == ws; break;
549 case Py_NE: cmp = vs != ws; break;
550 case Py_GT: cmp = vs > ws; break;
551 case Py_GE: cmp = vs >= ws; break;
552 default: return NULL; /* cannot happen */
553 }
554 if (cmp)
555 res = Py_True;
556 else
557 res = Py_False;
558 Py_INCREF(res);
559 return res;
560 }
561
562 /* We have an item that differs. First, shortcuts for EQ/NE */
563 if (op == Py_EQ) {
564 Py_INCREF(Py_False);
565 res = Py_False;
566 }
567 else if (op == Py_NE) {
568 Py_INCREF(Py_True);
569 res = Py_True;
570 }
571 else {
572 /* Compare the final item again using the proper operator */
573 res = PyObject_RichCompare(vi, wi, op);
574 }
575 Py_DECREF(vi);
576 Py_DECREF(wi);
577 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000578}
579
Martin v. Löwis18e16552006-02-15 17:27:45 +0000580static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000581array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000582{
Christian Heimes90aa7642007-12-19 02:45:37 +0000583 return Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000584}
585
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000586static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000587array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000588{
Christian Heimes90aa7642007-12-19 02:45:37 +0000589 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000590 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000591 return NULL;
592 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000593 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
599 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000600 if (ilow < 0)
601 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000602 else if (ilow > Py_SIZE(a))
603 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604 if (ihigh < 0)
605 ihigh = 0;
606 if (ihigh < ilow)
607 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000608 else if (ihigh > Py_SIZE(a))
609 ihigh = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +0000610 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000611 if (np == NULL)
612 return NULL;
613 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
614 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000615 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000616}
617
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000618static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000619array_copy(arrayobject *a, PyObject *unused)
620{
Christian Heimes90aa7642007-12-19 02:45:37 +0000621 return array_slice(a, 0, Py_SIZE(a));
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000622}
623
624PyDoc_STRVAR(copy_doc,
625"copy(array)\n\
626\n\
627 Return a copy of the array.");
628
629static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000630array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000631{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000632 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000633 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000634 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000635 PyErr_Format(PyExc_TypeError,
636 "can only append array (not \"%.200s\") to array",
Christian Heimes90aa7642007-12-19 02:45:37 +0000637 Py_TYPE(bb)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000638 return NULL;
639 }
640#define b ((arrayobject *)bb)
641 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000642 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 return NULL;
644 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000645 size = Py_SIZE(a) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000646 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000647 if (np == NULL) {
648 return NULL;
649 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000650 memcpy(np->ob_item, a->ob_item, Py_SIZE(a)*a->ob_descr->itemsize);
651 memcpy(np->ob_item + Py_SIZE(a)*a->ob_descr->itemsize,
652 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000653 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000654#undef b
655}
656
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000657static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000658array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000659{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000660 Py_ssize_t i;
661 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000662 arrayobject *np;
663 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000664 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000665 if (n < 0)
666 n = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000667 size = Py_SIZE(a) * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000668 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000669 if (np == NULL)
670 return NULL;
671 p = np->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000672 nbytes = Py_SIZE(a) * a->ob_descr->itemsize;
Guido van Rossum778983b1993-02-19 15:55:02 +0000673 for (i = 0; i < n; i++) {
674 memcpy(p, a->ob_item, nbytes);
675 p += nbytes;
676 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000677 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000678}
679
680static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000681array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000682{
683 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000684 Py_ssize_t n; /* Size of replacement array */
685 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000686#define b ((arrayobject *)v)
687 if (v == NULL)
688 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000689 else if (array_Check(v)) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000690 n = Py_SIZE(b);
Guido van Rossum778983b1993-02-19 15:55:02 +0000691 if (a == b) {
692 /* Special case "a[i:j] = a" -- copy b first */
693 int ret;
694 v = array_slice(b, 0, n);
Thomas Wouters00ee7ba2006-08-21 19:07:27 +0000695 if (!v)
696 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000697 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000698 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000699 return ret;
700 }
701 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000702 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000703 return -1;
704 }
705 }
706 else {
Fred Drake137507e2000-06-01 02:02:46 +0000707 PyErr_Format(PyExc_TypeError,
708 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +0000709 Py_TYPE(v)->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000710 return -1;
711 }
712 if (ilow < 0)
713 ilow = 0;
Christian Heimes90aa7642007-12-19 02:45:37 +0000714 else if (ilow > Py_SIZE(a))
715 ilow = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000716 if (ihigh < 0)
717 ihigh = 0;
718 if (ihigh < ilow)
719 ihigh = ilow;
Christian Heimes90aa7642007-12-19 02:45:37 +0000720 else if (ihigh > Py_SIZE(a))
721 ihigh = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000722 item = a->ob_item;
723 d = n - (ihigh-ilow);
724 if (d < 0) { /* Delete -d items */
725 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
726 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000727 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
728 Py_SIZE(a) += d;
729 PyMem_RESIZE(item, char, Py_SIZE(a)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000730 /* Can't fail */
731 a->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000732 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000733 }
734 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000735 PyMem_RESIZE(item, char,
Christian Heimes90aa7642007-12-19 02:45:37 +0000736 (Py_SIZE(a) + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000737 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000738 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000739 return -1;
740 }
741 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
742 item + ihigh*a->ob_descr->itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +0000743 (Py_SIZE(a)-ihigh)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000744 a->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000745 Py_SIZE(a) += d;
746 a->allocated = Py_SIZE(a);
Guido van Rossum778983b1993-02-19 15:55:02 +0000747 }
748 if (n > 0)
749 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
750 n*b->ob_descr->itemsize);
751 return 0;
752#undef b
753}
754
755static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000756array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000757{
Christian Heimes90aa7642007-12-19 02:45:37 +0000758 if (i < 0 || i >= Py_SIZE(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000759 PyErr_SetString(PyExc_IndexError,
760 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000761 return -1;
762 }
763 if (v == NULL)
764 return array_ass_slice(a, i, i+1, v);
765 return (*a->ob_descr->setitem)(a, i, v);
766}
767
768static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000769setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000770{
Martin v. Löwis99866332002-03-01 10:27:01 +0000771 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000772 return array_ass_item((arrayobject *)a, i, v);
773}
774
Martin v. Löwis99866332002-03-01 10:27:01 +0000775static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000776array_iter_extend(arrayobject *self, PyObject *bb)
777{
778 PyObject *it, *v;
779
780 it = PyObject_GetIter(bb);
781 if (it == NULL)
782 return -1;
783
784 while ((v = PyIter_Next(it)) != NULL) {
Christian Heimes90aa7642007-12-19 02:45:37 +0000785 if (ins1(self, (int) Py_SIZE(self), v) != 0) {
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000786 Py_DECREF(v);
787 Py_DECREF(it);
788 return -1;
789 }
790 Py_DECREF(v);
791 }
792 Py_DECREF(it);
793 if (PyErr_Occurred())
794 return -1;
795 return 0;
796}
797
798static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000799array_do_extend(arrayobject *self, PyObject *bb)
800{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000801 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000802
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000803 if (!array_Check(bb))
804 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000805#define b ((arrayobject *)bb)
806 if (self->ob_descr != b->ob_descr) {
807 PyErr_SetString(PyExc_TypeError,
808 "can only extend with array of same kind");
809 return -1;
810 }
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000811 if ((Py_SIZE(self) > PY_SSIZE_T_MAX - Py_SIZE(b)) ||
812 ((Py_SIZE(self) + Py_SIZE(b)) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
813 PyErr_NoMemory();
814 return -1;
815 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000816 size = Py_SIZE(self) + Py_SIZE(b);
Martin v. Löwis99866332002-03-01 10:27:01 +0000817 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
818 if (self->ob_item == NULL) {
Amaury Forgeot d'Arc35c86582008-06-17 21:11:29 +0000819 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000820 return -1;
821 }
Christian Heimes90aa7642007-12-19 02:45:37 +0000822 memcpy(self->ob_item + Py_SIZE(self)*self->ob_descr->itemsize,
823 b->ob_item, Py_SIZE(b)*b->ob_descr->itemsize);
824 Py_SIZE(self) = size;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000825 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000826
827 return 0;
828#undef b
829}
830
831static PyObject *
832array_inplace_concat(arrayobject *self, PyObject *bb)
833{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000834 if (!array_Check(bb)) {
835 PyErr_Format(PyExc_TypeError,
836 "can only extend array with array (not \"%.200s\")",
Christian Heimes90aa7642007-12-19 02:45:37 +0000837 Py_TYPE(bb)->tp_name);
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000838 return NULL;
839 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000840 if (array_do_extend(self, bb) == -1)
841 return NULL;
842 Py_INCREF(self);
843 return (PyObject *)self;
844}
845
846static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000847array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000848{
849 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000850 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000851
Christian Heimes90aa7642007-12-19 02:45:37 +0000852 if (Py_SIZE(self) > 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000853 if (n < 0)
854 n = 0;
855 items = self->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +0000856 size = Py_SIZE(self) * self->ob_descr->itemsize;
Martin v. Löwis99866332002-03-01 10:27:01 +0000857 if (n == 0) {
858 PyMem_FREE(items);
859 self->ob_item = NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000860 Py_SIZE(self) = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000861 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000862 }
863 else {
864 PyMem_Resize(items, char, n * size);
865 if (items == NULL)
866 return PyErr_NoMemory();
867 p = items;
868 for (i = 1; i < n; i++) {
869 p += size;
870 memcpy(p, items, size);
871 }
872 self->ob_item = items;
Christian Heimes90aa7642007-12-19 02:45:37 +0000873 Py_SIZE(self) *= n;
874 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +0000875 }
876 }
877 Py_INCREF(self);
878 return (PyObject *)self;
879}
880
881
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000883ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000884{
885 if (ins1(self, where, v) != 0)
886 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000887 Py_INCREF(Py_None);
888 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000889}
890
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000891static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000892array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000893{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000894 Py_ssize_t count = 0;
895 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000896
Christian Heimes90aa7642007-12-19 02:45:37 +0000897 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000898 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000899 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000900 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000901 if (cmp > 0)
902 count++;
903 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000904 return NULL;
905 }
Christian Heimes217cfd12007-12-02 14:31:20 +0000906 return PyLong_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000907}
908
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000909PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000910"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000912Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913
914static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000915array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000917 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918
Christian Heimes90aa7642007-12-19 02:45:37 +0000919 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000921 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
922 Py_DECREF(selfi);
923 if (cmp > 0) {
Christian Heimes217cfd12007-12-02 14:31:20 +0000924 return PyLong_FromLong((long)i);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000926 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927 return NULL;
928 }
929 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
930 return NULL;
931}
932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000933PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000934"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000935\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000937
Raymond Hettinger625812f2003-01-07 01:58:52 +0000938static int
939array_contains(arrayobject *self, PyObject *v)
940{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000941 Py_ssize_t i;
942 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000943
Christian Heimes90aa7642007-12-19 02:45:37 +0000944 for (i = 0, cmp = 0 ; cmp == 0 && i < Py_SIZE(self); i++) {
Raymond Hettinger625812f2003-01-07 01:58:52 +0000945 PyObject *selfi = getarrayitem((PyObject *)self, i);
946 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
947 Py_DECREF(selfi);
948 }
949 return cmp;
950}
951
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000952static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000953array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000954{
955 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000956
Christian Heimes90aa7642007-12-19 02:45:37 +0000957 for (i = 0; i < Py_SIZE(self); i++) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000958 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000959 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
960 Py_DECREF(selfi);
961 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000962 if (array_ass_slice(self, i, i+1,
963 (PyObject *)NULL) != 0)
964 return NULL;
965 Py_INCREF(Py_None);
966 return Py_None;
967 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000968 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969 return NULL;
970 }
971 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
972 return NULL;
973}
974
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000975PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000976"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000977\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000978Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979
980static PyObject *
981array_pop(arrayobject *self, PyObject *args)
982{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000983 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000985 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000986 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +0000987 if (Py_SIZE(self) == 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988 /* Special-case most common failure cause */
989 PyErr_SetString(PyExc_IndexError, "pop from empty array");
990 return NULL;
991 }
992 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +0000993 i += Py_SIZE(self);
994 if (i < 0 || i >= Py_SIZE(self)) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000995 PyErr_SetString(PyExc_IndexError, "pop index out of range");
996 return NULL;
997 }
998 v = getarrayitem((PyObject *)self,i);
999 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1000 Py_DECREF(v);
1001 return NULL;
1002 }
1003 return v;
1004}
1005
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001006PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001007"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001008\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001009Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010
1011static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001012array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001013{
Martin v. Löwis99866332002-03-01 10:27:01 +00001014 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001015 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001016 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001017 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001018}
1019
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001020PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001021"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001022\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001023 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001024
1025static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001026array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001027{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001028 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001029 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001030 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 return NULL;
1032 return ins(self, i, v);
1033}
1034
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001035PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001036"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001037\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001038Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001039
1040
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001041static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001042array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001043{
Tim Peters077a11d2000-09-16 22:31:29 +00001044 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001045 retval = PyTuple_New(2);
1046 if (!retval)
1047 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001048
1049 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
Christian Heimes90aa7642007-12-19 02:45:37 +00001050 PyTuple_SET_ITEM(retval, 1, PyLong_FromLong((long)(Py_SIZE(self))));
Fred Drake541dc3b2000-06-28 17:49:30 +00001051
1052 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001053}
1054
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001055PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001056"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001057\n\
1058Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001059the length in items of the buffer used to hold array's contents\n\
1060The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001061the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001062
1063
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001064static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001065array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001066{
Christian Heimes90aa7642007-12-19 02:45:37 +00001067 return ins(self, (int) Py_SIZE(self), v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001068}
1069
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001070PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001071"append(x)\n\
1072\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001073Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001074
1075
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001076static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001077array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001078{
1079 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001080 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001081
Guido van Rossum778983b1993-02-19 15:55:02 +00001082 switch (self->ob_descr->itemsize) {
1083 case 1:
1084 break;
1085 case 2:
Christian Heimes90aa7642007-12-19 02:45:37 +00001086 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 2) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001087 char p0 = p[0];
1088 p[0] = p[1];
1089 p[1] = p0;
1090 }
1091 break;
1092 case 4:
Christian Heimes90aa7642007-12-19 02:45:37 +00001093 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 4) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001094 char p0 = p[0];
1095 char p1 = p[1];
1096 p[0] = p[3];
1097 p[1] = p[2];
1098 p[2] = p1;
1099 p[3] = p0;
1100 }
1101 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001102 case 8:
Christian Heimes90aa7642007-12-19 02:45:37 +00001103 for (p = self->ob_item, i = Py_SIZE(self); --i >= 0; p += 8) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001104 char p0 = p[0];
1105 char p1 = p[1];
1106 char p2 = p[2];
1107 char p3 = p[3];
1108 p[0] = p[7];
1109 p[1] = p[6];
1110 p[2] = p[5];
1111 p[3] = p[4];
1112 p[4] = p3;
1113 p[5] = p2;
1114 p[6] = p1;
1115 p[7] = p0;
1116 }
1117 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001118 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001119 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 "don't know how to byteswap this array type");
1121 return NULL;
1122 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001123 Py_INCREF(Py_None);
1124 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001125}
1126
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001127PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001128"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001129\n\
Fred Drakebf272981999-12-03 17:15:30 +00001130Byteswap 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 +000011314, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001132
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001133static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001134array_reduce(arrayobject *array)
1135{
1136 PyObject *dict, *result;
1137
1138 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1139 if (dict == NULL) {
1140 PyErr_Clear();
1141 dict = Py_None;
1142 Py_INCREF(dict);
1143 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001144 if (Py_SIZE(array) > 0) {
Martin v. Löwis10a60b32007-07-18 02:28:27 +00001145 result = Py_BuildValue("O(cy#)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001146 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001147 array->ob_descr->typecode,
1148 array->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001149 Py_SIZE(array) * array->ob_descr->itemsize,
Guido van Rossumd8faa362007-04-27 19:54:29 +00001150 dict);
1151 } else {
1152 result = Py_BuildValue("O(c)O",
Christian Heimes90aa7642007-12-19 02:45:37 +00001153 Py_TYPE(array),
Guido van Rossumd8faa362007-04-27 19:54:29 +00001154 array->ob_descr->typecode,
1155 dict);
1156 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001157 Py_DECREF(dict);
1158 return result;
1159}
1160
1161PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1162
1163static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001164array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001165{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001166 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001167 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001168 /* little buffer to hold items while swapping */
1169 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001170 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001171
Christian Heimes90aa7642007-12-19 02:45:37 +00001172 if (Py_SIZE(self) > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001173 for (p = self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001174 q = self->ob_item + (Py_SIZE(self) - 1)*itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001175 p < q;
1176 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001177 /* memory areas guaranteed disjoint, so memcpy
1178 * is safe (& memmove may be slower).
1179 */
1180 memcpy(tmp, p, itemsize);
1181 memcpy(p, q, itemsize);
1182 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001183 }
1184 }
Tim Petersbb307342000-09-10 05:22:54 +00001185
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001186 Py_INCREF(Py_None);
1187 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001188}
Guido van Rossume77a7571993-11-03 15:01:26 +00001189
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001190PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001191"reverse()\n\
1192\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001193Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001194
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001195
1196/* Forward */
1197static PyObject *array_fromstring(arrayobject *self, PyObject *args);
1198
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001200array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001201{
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001202 PyObject *f, *b, *res;
1203 Py_ssize_t itemsize = self->ob_descr->itemsize;
1204 Py_ssize_t n, nbytes;
1205
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001206 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001207 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001208
1209 nbytes = n * itemsize;
1210 if (nbytes < 0 || nbytes/itemsize != n) {
1211 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001212 return NULL;
1213 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001214
1215 b = PyObject_CallMethod(f, "read", "n", nbytes);
1216 if (b == NULL)
1217 return NULL;
1218
Christian Heimes72b710a2008-05-26 13:28:38 +00001219 if (!PyBytes_Check(b)) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001220 PyErr_SetString(PyExc_TypeError,
1221 "read() didn't return bytes");
1222 Py_DECREF(b);
1223 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001224 }
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001225
Christian Heimes72b710a2008-05-26 13:28:38 +00001226 if (PyBytes_GET_SIZE(b) != nbytes) {
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001227 PyErr_SetString(PyExc_EOFError,
1228 "read() didn't return enough bytes");
1229 Py_DECREF(b);
1230 return NULL;
1231 }
1232
1233 args = Py_BuildValue("(O)", b);
1234 Py_DECREF(b);
1235 if (args == NULL)
1236 return NULL;
1237
1238 res = array_fromstring(self, args);
1239 Py_DECREF(args);
1240
1241 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +00001242}
1243
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001245"fromfile(f, n)\n\
1246\n\
1247Read n objects from the file object f and append them to the end of the\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001248array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001249
1250
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001251static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001252array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001253{
Christian Heimes90aa7642007-12-19 02:45:37 +00001254 Py_ssize_t nbytes = Py_SIZE(self) * self->ob_descr->itemsize;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001255 /* Write 64K blocks at a time */
1256 /* XXX Make the block size settable */
1257 int BLOCKSIZE = 64*1024;
1258 Py_ssize_t nblocks = (nbytes + BLOCKSIZE - 1) / BLOCKSIZE;
1259 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001260
Christian Heimes90aa7642007-12-19 02:45:37 +00001261 if (Py_SIZE(self) == 0)
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001262 goto done;
1263
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001264 for (i = 0; i < nblocks; i++) {
1265 char* ptr = self->ob_item + i*BLOCKSIZE;
1266 Py_ssize_t size = BLOCKSIZE;
1267 PyObject *bytes, *res;
1268 if (i*BLOCKSIZE + size > nbytes)
1269 size = nbytes - i*BLOCKSIZE;
Christian Heimes72b710a2008-05-26 13:28:38 +00001270 bytes = PyBytes_FromStringAndSize(ptr, size);
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001271 if (bytes == NULL)
Guido van Rossum778983b1993-02-19 15:55:02 +00001272 return NULL;
Guido van Rossum2c94aa52007-05-24 19:02:32 +00001273 res = PyObject_CallMethod(f, "write", "O", bytes);
1274 Py_DECREF(bytes);
1275 if (res == NULL)
1276 return NULL;
Martin v. Löwisa291c8f2007-08-11 14:25:27 +00001277 Py_DECREF(res); /* drop write result */
Guido van Rossumb5ddcfd2007-04-11 17:08:28 +00001278 }
1279
1280 done:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001281 Py_INCREF(Py_None);
1282 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001283}
1284
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001285PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001286"tofile(f)\n\
1287\n\
Georg Brandlf25ef502008-02-01 11:30:18 +00001288Write all items (as machine values) to the file object f.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001289
1290
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001291static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001292array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001293{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001294 Py_ssize_t n;
1295 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001296
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001297 if (!PyList_Check(list)) {
1298 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001299 return NULL;
1300 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001301 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001302 if (n > 0) {
1303 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001304 Py_ssize_t i;
Christian Heimes90aa7642007-12-19 02:45:37 +00001305 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001306 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001307 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001308 return NULL;
1309 }
1310 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001311 Py_SIZE(self) += n;
1312 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001313 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001314 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001315 if ((*self->ob_descr->setitem)(self,
Christian Heimes90aa7642007-12-19 02:45:37 +00001316 Py_SIZE(self) - n + i, v) != 0) {
1317 Py_SIZE(self) -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001318 PyMem_RESIZE(item, char,
Christian Heimes90aa7642007-12-19 02:45:37 +00001319 Py_SIZE(self) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001320 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001321 self->allocated = Py_SIZE(self);
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 return NULL;
1323 }
1324 }
1325 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001326 Py_INCREF(Py_None);
1327 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001328}
1329
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001330PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001331"fromlist(list)\n\
1332\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001333Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001334
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001336array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001337{
Christian Heimes90aa7642007-12-19 02:45:37 +00001338 PyObject *list = PyList_New(Py_SIZE(self));
Martin v. Löwis18e16552006-02-15 17:27:45 +00001339 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001340
Guido van Rossum778983b1993-02-19 15:55:02 +00001341 if (list == NULL)
1342 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00001343 for (i = 0; i < Py_SIZE(self); i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001344 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001345 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001346 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001347 return NULL;
1348 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 }
1351 return list;
1352}
1353
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001354PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001355"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001356\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001357Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001358
1359
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001361array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001362{
1363 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001364 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001365 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001366 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001367 return NULL;
1368 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001369 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001370 "string length not a multiple of item size");
1371 return NULL;
1372 }
1373 n = n / itemsize;
1374 if (n > 0) {
1375 char *item = self->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001376 PyMem_RESIZE(item, char, (Py_SIZE(self) + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001377 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001378 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001379 return NULL;
1380 }
1381 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001382 Py_SIZE(self) += n;
1383 self->allocated = Py_SIZE(self);
1384 memcpy(item + (Py_SIZE(self) - n) * itemsize,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001385 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001387 Py_INCREF(Py_None);
1388 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001389}
1390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001391PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001392"fromstring(string)\n\
1393\n\
1394Appends items from the string, interpreting it as an array of machine\n\
Walter Dörwald93b30b52007-06-22 12:21:53 +00001395values, as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001396
1397
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001398static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001399array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001400{
Christian Heimes72b710a2008-05-26 13:28:38 +00001401 return PyBytes_FromStringAndSize(self->ob_item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001402 Py_SIZE(self) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001403}
1404
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001405PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001406"tostring() -> string\n\
1407\n\
1408Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001409representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001410
Martin v. Löwis99866332002-03-01 10:27:01 +00001411
1412
Martin v. Löwis99866332002-03-01 10:27:01 +00001413static PyObject *
1414array_fromunicode(arrayobject *self, PyObject *args)
1415{
1416 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001417 Py_ssize_t n;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001418 char typecode;
Martin v. Löwis99866332002-03-01 10:27:01 +00001419
1420 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1421 return NULL;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001422 typecode = self->ob_descr->typecode;
1423 if ((typecode != 'u')) {
1424 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001425 "fromunicode() may only be called on "
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001426 "unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001427 return NULL;
1428 }
1429 if (n > 0) {
1430 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001431 PyMem_RESIZE(item, Py_UNICODE, Py_SIZE(self) + n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001432 if (item == NULL) {
1433 PyErr_NoMemory();
1434 return NULL;
1435 }
1436 self->ob_item = (char *) item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001437 Py_SIZE(self) += n;
1438 self->allocated = Py_SIZE(self);
1439 memcpy(item + Py_SIZE(self) - n,
Martin v. Löwis99866332002-03-01 10:27:01 +00001440 ustr, n * sizeof(Py_UNICODE));
1441 }
1442
1443 Py_INCREF(Py_None);
1444 return Py_None;
1445}
1446
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001447PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001448"fromunicode(ustr)\n\
1449\n\
1450Extends this array with data from the unicode string ustr.\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001451The array must be a unicode type array; otherwise a ValueError\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001452is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001453append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001454
1455
1456static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001457array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001458{
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001459 char typecode;
1460 typecode = self->ob_descr->typecode;
1461 if ((typecode != 'u')) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001462 PyErr_SetString(PyExc_ValueError,
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001463 "tounicode() may only be called on unicode type arrays");
Martin v. Löwis99866332002-03-01 10:27:01 +00001464 return NULL;
1465 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001466 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, Py_SIZE(self));
Martin v. Löwis99866332002-03-01 10:27:01 +00001467}
1468
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001469PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001470"tounicode() -> unicode\n\
1471\n\
1472Convert the array to a unicode string. The array must be\n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001473a unicode type array; otherwise a ValueError is raised. Use\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001474array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001475an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001476
Martin v. Löwis99866332002-03-01 10:27:01 +00001477
1478
1479static PyObject *
1480array_get_typecode(arrayobject *a, void *closure)
1481{
1482 char tc = a->ob_descr->typecode;
Walter Dörwald93b30b52007-06-22 12:21:53 +00001483 return PyUnicode_FromStringAndSize(&tc, 1);
Martin v. Löwis99866332002-03-01 10:27:01 +00001484}
1485
1486static PyObject *
1487array_get_itemsize(arrayobject *a, void *closure)
1488{
Christian Heimes217cfd12007-12-02 14:31:20 +00001489 return PyLong_FromLong((long)a->ob_descr->itemsize);
Martin v. Löwis99866332002-03-01 10:27:01 +00001490}
1491
1492static PyGetSetDef array_getsets [] = {
1493 {"typecode", (getter) array_get_typecode, NULL,
1494 "the typecode character used to create the array"},
1495 {"itemsize", (getter) array_get_itemsize, NULL,
1496 "the size, in bytes, of one array item"},
1497 {NULL}
1498};
1499
Martin v. Löwis59683e82008-06-13 07:50:45 +00001500static PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001501 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001502 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001503 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001504 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001505 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001506 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001507 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1508 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001509 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001510 count_doc},
Thomas Wouters89f507f2006-12-13 04:49:30 +00001511 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001512 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001513 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001514 extend_doc},
1515 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1516 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001517 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001518 fromlist_doc},
1519 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1520 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001521 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1522 fromunicode_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001523 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001524 index_doc},
1525 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1526 insert_doc},
1527 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1528 pop_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001529 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1530 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001531 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001532 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001533 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001534 reverse_doc},
1535/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1536 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001537 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001538 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001539 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001540 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001541 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001542 tostring_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001543 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001544 tounicode_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001545 {NULL, NULL} /* sentinel */
1546};
1547
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001548static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001549array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001550{
Walter Dörwaldc2f6a582007-05-20 12:49:47 +00001551 char typecode;
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001552 PyObject *s, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001553 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001554
Christian Heimes90aa7642007-12-19 02:45:37 +00001555 len = Py_SIZE(a);
Martin v. Löwis99866332002-03-01 10:27:01 +00001556 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001557 if (len == 0) {
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001558 return PyUnicode_FromFormat("array('%c')", typecode);
Guido van Rossum778983b1993-02-19 15:55:02 +00001559 }
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001560 if ((typecode == 'u'))
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001561 v = array_tounicode(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001562 else
1563 v = array_tolist(a, NULL);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001564
Walter Dörwald7569dfe2007-05-19 21:49:49 +00001565 s = PyUnicode_FromFormat("array('%c', %R)", typecode, v);
1566 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001567 return s;
1568}
1569
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001570static PyObject*
1571array_subscr(arrayobject* self, PyObject* item)
1572{
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001573 if (PyIndex_Check(item)) {
1574 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001575 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001576 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001577 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001578 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001579 i += Py_SIZE(self);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001580 return array_item(self, i);
1581 }
1582 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001583 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001584 PyObject* result;
1585 arrayobject* ar;
1586 int itemsize = self->ob_descr->itemsize;
1587
Christian Heimes90aa7642007-12-19 02:45:37 +00001588 if (PySlice_GetIndicesEx((PySliceObject*)item, Py_SIZE(self),
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001589 &start, &stop, &step, &slicelength) < 0) {
1590 return NULL;
1591 }
1592
1593 if (slicelength <= 0) {
1594 return newarrayobject(&Arraytype, 0, self->ob_descr);
1595 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001596 else if (step == 1) {
1597 PyObject *result = newarrayobject(&Arraytype,
1598 slicelength, self->ob_descr);
1599 if (result == NULL)
1600 return NULL;
1601 memcpy(((arrayobject *)result)->ob_item,
1602 self->ob_item + start * itemsize,
1603 slicelength * itemsize);
1604 return result;
1605 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001606 else {
1607 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1608 if (!result) return NULL;
1609
1610 ar = (arrayobject*)result;
1611
1612 for (cur = start, i = 0; i < slicelength;
1613 cur += step, i++) {
1614 memcpy(ar->ob_item + i*itemsize,
1615 self->ob_item + cur*itemsize,
1616 itemsize);
1617 }
1618
1619 return result;
1620 }
1621 }
1622 else {
1623 PyErr_SetString(PyExc_TypeError,
Thomas Woutersed03b412007-08-28 21:37:11 +00001624 "array indices must be integers");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001625 return NULL;
1626 }
1627}
1628
1629static int
1630array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1631{
Thomas Woutersed03b412007-08-28 21:37:11 +00001632 Py_ssize_t start, stop, step, slicelength, needed;
1633 arrayobject* other;
1634 int itemsize;
1635
Thomas Wouters00ee7ba2006-08-21 19:07:27 +00001636 if (PyIndex_Check(item)) {
1637 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Thomas Woutersed03b412007-08-28 21:37:11 +00001638
1639 if (i == -1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001640 return -1;
1641 if (i < 0)
Christian Heimes90aa7642007-12-19 02:45:37 +00001642 i += Py_SIZE(self);
1643 if (i < 0 || i >= Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001644 PyErr_SetString(PyExc_IndexError,
1645 "array assignment index out of range");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001646 return -1;
1647 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001648 if (value == NULL) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001649 /* Fall through to slice assignment */
1650 start = i;
1651 stop = i + 1;
1652 step = 1;
1653 slicelength = 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001654 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001655 else
1656 return (*self->ob_descr->setitem)(self, i, value);
1657 }
1658 else if (PySlice_Check(item)) {
1659 if (PySlice_GetIndicesEx((PySliceObject *)item,
Christian Heimes90aa7642007-12-19 02:45:37 +00001660 Py_SIZE(self), &start, &stop,
Thomas Woutersed03b412007-08-28 21:37:11 +00001661 &step, &slicelength) < 0) {
1662 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001663 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001664 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001665 else {
Thomas Woutersed03b412007-08-28 21:37:11 +00001666 PyErr_SetString(PyExc_TypeError,
1667 "array indices must be integer");
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001668 return -1;
1669 }
Thomas Woutersed03b412007-08-28 21:37:11 +00001670 if (value == NULL) {
1671 other = NULL;
1672 needed = 0;
1673 }
1674 else if (array_Check(value)) {
1675 other = (arrayobject *)value;
Christian Heimes90aa7642007-12-19 02:45:37 +00001676 needed = Py_SIZE(other);
Thomas Woutersed03b412007-08-28 21:37:11 +00001677 if (self == other) {
1678 /* Special case "self[i:j] = self" -- copy self first */
1679 int ret;
1680 value = array_slice(other, 0, needed);
1681 if (value == NULL)
1682 return -1;
1683 ret = array_ass_subscr(self, item, value);
1684 Py_DECREF(value);
1685 return ret;
1686 }
1687 if (other->ob_descr != self->ob_descr) {
1688 PyErr_BadArgument();
1689 return -1;
1690 }
1691 }
1692 else {
1693 PyErr_Format(PyExc_TypeError,
1694 "can only assign array (not \"%.200s\") to array slice",
Christian Heimes90aa7642007-12-19 02:45:37 +00001695 Py_TYPE(value)->tp_name);
Thomas Woutersed03b412007-08-28 21:37:11 +00001696 return -1;
1697 }
1698 itemsize = self->ob_descr->itemsize;
1699 /* for 'a[2:1] = ...', the insertion point is 'start', not 'stop' */
1700 if ((step > 0 && stop < start) ||
1701 (step < 0 && stop > start))
1702 stop = start;
1703 if (step == 1) {
1704 if (slicelength > needed) {
1705 memmove(self->ob_item + (start + needed) * itemsize,
1706 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001707 (Py_SIZE(self) - stop) * itemsize);
1708 if (array_resize(self, Py_SIZE(self) +
Thomas Woutersed03b412007-08-28 21:37:11 +00001709 needed - slicelength) < 0)
1710 return -1;
1711 }
1712 else if (slicelength < needed) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001713 if (array_resize(self, Py_SIZE(self) +
Thomas Woutersed03b412007-08-28 21:37:11 +00001714 needed - slicelength) < 0)
1715 return -1;
1716 memmove(self->ob_item + (start + needed) * itemsize,
1717 self->ob_item + stop * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001718 (Py_SIZE(self) - start - needed) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001719 }
1720 if (needed > 0)
1721 memcpy(self->ob_item + start * itemsize,
1722 other->ob_item, needed * itemsize);
1723 return 0;
1724 }
1725 else if (needed == 0) {
1726 /* Delete slice */
1727 Py_ssize_t cur, i;
1728
1729 if (step < 0) {
1730 stop = start + 1;
1731 start = stop + step * (slicelength - 1) - 1;
1732 step = -step;
1733 }
1734 for (cur = start, i = 0; i < slicelength;
1735 cur += step, i++) {
1736 Py_ssize_t lim = step - 1;
1737
Christian Heimes90aa7642007-12-19 02:45:37 +00001738 if (cur + step >= Py_SIZE(self))
1739 lim = Py_SIZE(self) - cur - 1;
Thomas Woutersed03b412007-08-28 21:37:11 +00001740 memmove(self->ob_item + (cur - i) * itemsize,
1741 self->ob_item + (cur + 1) * itemsize,
1742 lim * itemsize);
1743 }
1744 cur = start + slicelength * step;
Christian Heimes90aa7642007-12-19 02:45:37 +00001745 if (cur < Py_SIZE(self)) {
Thomas Woutersed03b412007-08-28 21:37:11 +00001746 memmove(self->ob_item + (cur-slicelength) * itemsize,
1747 self->ob_item + cur * itemsize,
Christian Heimes90aa7642007-12-19 02:45:37 +00001748 (Py_SIZE(self) - cur) * itemsize);
Thomas Woutersed03b412007-08-28 21:37:11 +00001749 }
Christian Heimes90aa7642007-12-19 02:45:37 +00001750 if (array_resize(self, Py_SIZE(self) - slicelength) < 0)
Thomas Woutersed03b412007-08-28 21:37:11 +00001751 return -1;
1752 return 0;
1753 }
1754 else {
1755 Py_ssize_t cur, i;
1756
1757 if (needed != slicelength) {
1758 PyErr_Format(PyExc_ValueError,
1759 "attempt to assign array of size %zd "
1760 "to extended slice of size %zd",
1761 needed, slicelength);
1762 return -1;
1763 }
1764 for (cur = start, i = 0; i < slicelength;
1765 cur += step, i++) {
1766 memcpy(self->ob_item + cur * itemsize,
1767 other->ob_item + i * itemsize,
1768 itemsize);
1769 }
1770 return 0;
1771 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001772}
1773
1774static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001775 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001776 (binaryfunc)array_subscr,
1777 (objobjargproc)array_ass_subscr
1778};
1779
Guido van Rossumd8faa362007-04-27 19:54:29 +00001780static const void *emptybuf = "";
1781
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001782
1783static int
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001784array_buffer_getbuf(arrayobject *self, Py_buffer *view, int flags)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001785{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001786 if (view==NULL) goto finish;
1787
1788 view->buf = (void *)self->ob_item;
1789 if (view->buf == NULL)
1790 view->buf = (void *)emptybuf;
Christian Heimes90aa7642007-12-19 02:45:37 +00001791 view->len = (Py_SIZE(self)) * self->ob_descr->itemsize;
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001792 view->readonly = 0;
1793 view->ndim = 1;
1794 view->itemsize = self->ob_descr->itemsize;
1795 view->suboffsets = NULL;
1796 view->shape = NULL;
1797 if ((flags & PyBUF_ND)==PyBUF_ND) {
Christian Heimes90aa7642007-12-19 02:45:37 +00001798 view->shape = &((Py_SIZE(self)));
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001799 }
1800 view->strides = NULL;
1801 if ((flags & PyBUF_STRIDES)==PyBUF_STRIDES)
1802 view->strides = &(view->itemsize);
1803 view->format = NULL;
1804 view->internal = NULL;
1805 if ((flags & PyBUF_FORMAT) == PyBUF_FORMAT) {
Travis E. Oliphantb803c512007-08-20 07:16:33 +00001806 view->format = self->ob_descr->formats;
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001807#ifdef Py_UNICODE_WIDE
1808 if (self->ob_descr->typecode == 'u') {
Guido van Rossum7c4c6c52007-10-14 20:46:15 +00001809 view->format = "w";
Travis E. Oliphantddacf962007-10-13 21:03:27 +00001810 }
1811#endif
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001812 }
1813
1814 finish:
1815 self->ob_exports++;
1816 return 0;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001817}
1818
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001819static void
Travis E. Oliphant8ae62b62007-09-23 02:00:13 +00001820array_buffer_relbuf(arrayobject *self, Py_buffer *view)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001821{
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001822 self->ob_exports--;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001823}
1824
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001825static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001827 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001828 (ssizeargfunc)array_repeat, /*sq_repeat*/
1829 (ssizeargfunc)array_item, /*sq_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001830 0, /*sq_slice*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001831 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
Thomas Woutersd2cf20e2007-08-30 22:57:53 +00001832 0, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001833 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001834 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001835 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001836};
1837
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001838static PyBufferProcs array_as_buffer = {
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001839 (getbufferproc)array_buffer_getbuf,
1840 (releasebufferproc)array_buffer_relbuf
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001841};
1842
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001843static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001844array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001845{
Guido van Rossum8934fc22007-06-30 23:44:36 +00001846 int c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001847 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001848 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001849
Thomas Woutersb2137042007-02-01 18:02:27 +00001850 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001851 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001852
Walter Dörwaldd0941302007-07-01 21:58:22 +00001853 if (!PyArg_ParseTuple(args, "C|O:array", &c, &initial))
Martin v. Löwis99866332002-03-01 10:27:01 +00001854 return NULL;
1855
1856 if (!(initial == NULL || PyList_Check(initial)
Christian Heimes9c4756e2008-05-26 13:22:05 +00001857 || PyByteArray_Check(initial)
Christian Heimes72b710a2008-05-26 13:28:38 +00001858 || PyBytes_Check(initial)
Neal Norwitz3fcbea52007-08-26 04:51:28 +00001859 || PyTuple_Check(initial)
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001860 || ((c=='u') && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001861 it = PyObject_GetIter(initial);
1862 if (it == NULL)
1863 return NULL;
1864 /* We set initial to NULL so that the subsequent code
1865 will create an empty array of the appropriate type
1866 and afterwards we can use array_iter_extend to populate
1867 the array.
1868 */
1869 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001870 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001871 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1872 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001873 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001874 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001875
1876 if (initial == NULL || !(PyList_Check(initial)
1877 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001878 len = 0;
1879 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001880 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001881
1882 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001883 if (a == NULL)
1884 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001885
Guido van Rossum778983b1993-02-19 15:55:02 +00001886 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001887 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001888 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001889 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001890 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001891 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001892 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001893 return NULL;
1894 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001895 if (setarrayitem(a, i, v) != 0) {
1896 Py_DECREF(v);
1897 Py_DECREF(a);
1898 return NULL;
1899 }
1900 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001901 }
Guido van Rossum98297ee2007-11-06 21:34:58 +00001902 }
Christian Heimes9c4756e2008-05-26 13:22:05 +00001903 else if (initial != NULL && (PyByteArray_Check(initial) ||
Christian Heimes72b710a2008-05-26 13:28:38 +00001904 PyBytes_Check(initial))) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001905 PyObject *t_initial, *v;
1906 t_initial = PyTuple_Pack(1, initial);
1907 if (t_initial == NULL) {
1908 Py_DECREF(a);
1909 return NULL;
1910 }
1911 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001912 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001913 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001914 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001915 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001916 return NULL;
1917 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001918 Py_DECREF(v);
Guido van Rossum98297ee2007-11-06 21:34:58 +00001919 }
1920 else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001921 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001922 if (n > 0) {
1923 arrayobject *self = (arrayobject *)a;
1924 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001925 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001926 if (item == NULL) {
1927 PyErr_NoMemory();
1928 Py_DECREF(a);
1929 return NULL;
1930 }
1931 self->ob_item = item;
Christian Heimes90aa7642007-12-19 02:45:37 +00001932 Py_SIZE(self) = n / sizeof(Py_UNICODE);
Martin v. Löwis99866332002-03-01 10:27:01 +00001933 memcpy(item, PyUnicode_AS_DATA(initial), n);
Christian Heimes90aa7642007-12-19 02:45:37 +00001934 self->allocated = Py_SIZE(self);
Martin v. Löwis99866332002-03-01 10:27:01 +00001935 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001936 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001937 if (it != NULL) {
1938 if (array_iter_extend((arrayobject *)a, it) == -1) {
1939 Py_DECREF(it);
1940 Py_DECREF(a);
1941 return NULL;
1942 }
1943 Py_DECREF(it);
1944 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001945 return a;
1946 }
1947 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001948 PyErr_SetString(PyExc_ValueError,
Guido van Rossum31f72d72007-06-18 18:44:28 +00001949 "bad typecode (must be b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001950 return NULL;
1951}
1952
Guido van Rossum778983b1993-02-19 15:55:02 +00001953
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001954PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001955"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001956an array of basic values: characters, integers, floating point\n\
1957numbers. Arrays are sequence types and behave very much like lists,\n\
1958except that the type of objects stored in them is constrained. The\n\
1959type is specified at object creation time by using a type code, which\n\
1960is a single character. The following type codes are defined:\n\
1961\n\
1962 Type code C Type Minimum size in bytes \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001963 'b' signed integer 1 \n\
1964 'B' unsigned integer 1 \n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001965 'u' Unicode character 2 (see note) \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001966 'h' signed integer 2 \n\
1967 'H' unsigned integer 2 \n\
1968 'i' signed integer 2 \n\
1969 'I' unsigned integer 2 \n\
Travis E. Oliphantb99f7622007-08-18 11:21:56 +00001970 'w' unicode character 4 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001971 'l' signed integer 4 \n\
1972 'L' unsigned integer 4 \n\
1973 'f' floating point 4 \n\
1974 'd' floating point 8 \n\
1975\n\
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00001976NOTE: The 'u' typecode corresponds to Python's unicode character. On \n\
1977narrow builds this is 2-bytes on wide builds this is 4-bytes.\n\
1978\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001979The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001980\n\
1981array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001982");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001984PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001985"array(typecode [, initializer]) -> array\n\
1986\n\
1987Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001988initialized from the optional initializer value, which must be a list,\n\
1989string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001990\n\
1991Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001992the type of objects stored in them is constrained.\n\
1993\n\
1994Methods:\n\
1995\n\
1996append() -- append a new item to the end of the array\n\
1997buffer_info() -- return information giving the current memory info\n\
1998byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001999count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00002000extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002001fromfile() -- read items from a file object\n\
2002fromlist() -- append items from the list\n\
2003fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002004index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002005insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002006pop() -- remove and return item (default last)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002007remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002008reverse() -- reverse the order of the items in the array\n\
2009tofile() -- write all items to a file object\n\
2010tolist() -- return the array converted to an ordinary list\n\
2011tostring() -- return the array converted to a string\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002012\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002013Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002014\n\
2015typecode -- the typecode character used to create the array\n\
2016itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002017");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002018
Raymond Hettinger625812f2003-01-07 01:58:52 +00002019static PyObject *array_iter(arrayobject *ao);
2020
Tim Peters0c322792002-07-17 16:49:03 +00002021static PyTypeObject Arraytype = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002022 PyVarObject_HEAD_INIT(NULL, 0)
Guido van Rossum14648392001-12-08 18:02:58 +00002023 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002024 sizeof(arrayobject),
2025 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002026 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002027 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002028 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002029 0, /* tp_setattr */
2030 0, /* tp_compare */
2031 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00002032 0, /* tp_as_number*/
2033 &array_as_sequence, /* tp_as_sequence*/
2034 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002035 0, /* tp_hash */
2036 0, /* tp_call */
2037 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002038 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002039 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002040 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00002041 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002042 arraytype_doc, /* tp_doc */
2043 0, /* tp_traverse */
2044 0, /* tp_clear */
2045 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002046 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002047 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002048 0, /* tp_iternext */
2049 array_methods, /* tp_methods */
2050 0, /* tp_members */
2051 array_getsets, /* tp_getset */
2052 0, /* tp_base */
2053 0, /* tp_dict */
2054 0, /* tp_descr_get */
2055 0, /* tp_descr_set */
2056 0, /* tp_dictoffset */
2057 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002058 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002059 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002060 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002061};
2062
Raymond Hettinger625812f2003-01-07 01:58:52 +00002063
2064/*********************** Array Iterator **************************/
2065
2066typedef struct {
2067 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002068 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002069 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002070 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002071} arrayiterobject;
2072
2073static PyTypeObject PyArrayIter_Type;
2074
2075#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2076
2077static PyObject *
2078array_iter(arrayobject *ao)
2079{
2080 arrayiterobject *it;
2081
2082 if (!array_Check(ao)) {
2083 PyErr_BadInternalCall();
2084 return NULL;
2085 }
2086
2087 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2088 if (it == NULL)
2089 return NULL;
2090
2091 Py_INCREF(ao);
2092 it->ao = ao;
2093 it->index = 0;
2094 it->getitem = ao->ob_descr->getitem;
2095 PyObject_GC_Track(it);
2096 return (PyObject *)it;
2097}
2098
2099static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002100arrayiter_next(arrayiterobject *it)
2101{
2102 assert(PyArrayIter_Check(it));
Christian Heimes90aa7642007-12-19 02:45:37 +00002103 if (it->index < Py_SIZE(it->ao))
Raymond Hettinger625812f2003-01-07 01:58:52 +00002104 return (*it->getitem)(it->ao, it->index++);
2105 return NULL;
2106}
2107
2108static void
2109arrayiter_dealloc(arrayiterobject *it)
2110{
2111 PyObject_GC_UnTrack(it);
2112 Py_XDECREF(it->ao);
2113 PyObject_GC_Del(it);
2114}
2115
2116static int
2117arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2118{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002119 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002120 return 0;
2121}
2122
2123static PyTypeObject PyArrayIter_Type = {
Martin v. Löwis9f2e3462007-07-21 17:22:18 +00002124 PyVarObject_HEAD_INIT(NULL, 0)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002125 "arrayiterator", /* tp_name */
2126 sizeof(arrayiterobject), /* tp_basicsize */
2127 0, /* tp_itemsize */
2128 /* methods */
2129 (destructor)arrayiter_dealloc, /* tp_dealloc */
2130 0, /* tp_print */
2131 0, /* tp_getattr */
2132 0, /* tp_setattr */
2133 0, /* tp_compare */
2134 0, /* tp_repr */
2135 0, /* tp_as_number */
2136 0, /* tp_as_sequence */
2137 0, /* tp_as_mapping */
2138 0, /* tp_hash */
2139 0, /* tp_call */
2140 0, /* tp_str */
2141 PyObject_GenericGetAttr, /* tp_getattro */
2142 0, /* tp_setattro */
2143 0, /* tp_as_buffer */
2144 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2145 0, /* tp_doc */
2146 (traverseproc)arrayiter_traverse, /* tp_traverse */
2147 0, /* tp_clear */
2148 0, /* tp_richcompare */
2149 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002150 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002151 (iternextfunc)arrayiter_next, /* tp_iternext */
2152 0, /* tp_methods */
2153};
2154
2155
2156/*********************** Install Module **************************/
2157
Martin v. Löwis99866332002-03-01 10:27:01 +00002158/* No functions in array module. */
2159static PyMethodDef a_methods[] = {
2160 {NULL, NULL, 0, NULL} /* Sentinel */
2161};
2162
Martin v. Löwis1a214512008-06-11 05:26:20 +00002163static struct PyModuleDef arraymodule = {
2164 PyModuleDef_HEAD_INIT,
2165 "array",
2166 module_doc,
2167 -1,
2168 a_methods,
2169 NULL,
2170 NULL,
2171 NULL,
2172 NULL
2173};
2174
Martin v. Löwis99866332002-03-01 10:27:01 +00002175
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002176PyMODINIT_FUNC
Martin v. Löwis1a214512008-06-11 05:26:20 +00002177PyInit_array(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002178{
Fred Drakef4e34842002-04-01 03:45:06 +00002179 PyObject *m;
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002180 PyObject *typecodes;
2181 Py_ssize_t size = 0;
2182 register Py_UNICODE *p;
2183 struct arraydescr *descr;
Fred Drake0d40ba42000-02-04 20:33:49 +00002184
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002185 if (PyType_Ready(&Arraytype) < 0)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002186 return NULL;
Christian Heimes90aa7642007-12-19 02:45:37 +00002187 Py_TYPE(&PyArrayIter_Type) = &PyType_Type;
Martin v. Löwis1a214512008-06-11 05:26:20 +00002188 m = PyModule_Create(&arraymodule);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002189 if (m == NULL)
Martin v. Löwis1a214512008-06-11 05:26:20 +00002190 return NULL;
Fred Drakef4e34842002-04-01 03:45:06 +00002191
2192 Py_INCREF((PyObject *)&Arraytype);
2193 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2194 Py_INCREF((PyObject *)&Arraytype);
2195 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Travis E. Oliphantd5c0add2007-10-12 22:05:15 +00002196
2197 for (descr=descriptors; descr->typecode != '\0'; descr++) {
2198 size++;
2199 }
2200
2201 typecodes = PyUnicode_FromStringAndSize(NULL, size);
2202 p = PyUnicode_AS_UNICODE(typecodes);
2203 for (descr = descriptors; descr->typecode != '\0'; descr++) {
2204 *p++ = (char)descr->typecode;
2205 }
2206
2207 PyModule_AddObject(m, "typecodes", (PyObject *)typecodes);
2208
Martin v. Löwis1a214512008-06-11 05:26:20 +00002209 if (PyErr_Occurred()) {
2210 Py_DECREF(m);
2211 m = NULL;
2212 }
2213 return m;
Guido van Rossum778983b1993-02-19 15:55:02 +00002214}