blob: 704b745ad677994e0beec6632e0c53beca45a7c3 [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 */
13#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000015#endif /* DONT_HAVE_SYS_TYPES_H */
16#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 *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Martin v. Löwis99866332002-03-01 10:27:01 +000032 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +000033 Py_ssize_t ob_size;
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 */
Guido van Rossum778983b1993-02-19 15:55:02 +000038} arrayobject;
39
Jeremy Hylton938ace62002-07-17 16:30:39 +000040static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000041
Martin v. Löwis99866332002-03-01 10:27:01 +000042#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
43#define array_CheckExact(op) ((op)->ob_type == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000044
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000045static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000046array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000047{
48 char *items;
49 size_t _new_size;
50
51 /* Bypass realloc() when a previous overallocation is large enough
52 to accommodate the newsize. If the newsize is 16 smaller than the
53 current size, then proceed with the realloc() to shrink the list.
54 */
55
56 if (self->allocated >= newsize &&
57 self->ob_size < newsize + 16 &&
58 self->ob_item != NULL) {
59 self->ob_size = newsize;
60 return 0;
61 }
62
63 /* This over-allocates proportional to the array size, making room
64 * for additional growth. The over-allocation is mild, but is
65 * enough to give linear-time amortized behavior over a long
66 * sequence of appends() in the presence of a poorly-performing
67 * system realloc().
68 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
69 * Note, the pattern starts out the same as for lists but then
70 * grows at a smaller rate so that larger arrays only overallocate
71 * by about 1/16th -- this is done because arrays are presumed to be more
72 * memory critical.
73 */
74
75 _new_size = (newsize >> 4) + (self->ob_size < 8 ? 3 : 7) + newsize;
76 items = self->ob_item;
77 /* XXX The following multiplication and division does not optimize away
78 like it does for lists since the size is not known at compile time */
79 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
80 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
81 else
82 items = NULL;
83 if (items == NULL) {
84 PyErr_NoMemory();
85 return -1;
86 }
87 self->ob_item = items;
88 self->ob_size = newsize;
89 self->allocated = _new_size;
90 return 0;
91}
92
Tim Petersbb307342000-09-10 05:22:54 +000093/****************************************************************************
94Get and Set functions for each type.
95A Get function takes an arrayobject* and an integer index, returning the
96array value at that index wrapped in an appropriate PyObject*.
97A Set function takes an arrayobject, integer index, and PyObject*; sets
98the array value at that index to the raw C data extracted from the PyObject*,
99and returns 0 if successful, else nonzero on failure (PyObject* not of an
100appropriate type or value).
101Note that the basic Get and Set functions do NOT check that the index is
102in bounds; that's the responsibility of the caller.
103****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000104
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000105static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000106c_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000107{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000108 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000109}
110
111static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000112c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000113{
114 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000115 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000116 return -1;
117 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000118 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000119 return 0;
120}
121
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000122static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000123b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000124{
125 long x = ((char *)ap->ob_item)[i];
126 if (x >= 128)
127 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000128 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000129}
130
131static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000132b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000133{
Fred Drake541dc3b2000-06-28 17:49:30 +0000134 short x;
135 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
136 must use the next size up that is signed ('h') and manually do
137 the overflow checking */
138 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000139 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000140 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000141 PyErr_SetString(PyExc_OverflowError,
142 "signed char is less than minimum");
143 return -1;
144 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000145 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000146 PyErr_SetString(PyExc_OverflowError,
147 "signed char is greater than maximum");
148 return -1;
149 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000150 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000151 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000152 return 0;
153}
154
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000155static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000156BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000157{
158 long x = ((unsigned char *)ap->ob_item)[i];
159 return PyInt_FromLong(x);
160}
161
Fred Drake541dc3b2000-06-28 17:49:30 +0000162static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000163BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000164{
165 unsigned char x;
166 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
167 if (!PyArg_Parse(v, "b;array item must be integer", &x))
168 return -1;
169 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000170 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000171 return 0;
172}
Guido van Rossum549ab711997-01-03 19:09:47 +0000173
Martin v. Löwis99866332002-03-01 10:27:01 +0000174#ifdef Py_USING_UNICODE
175static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000176u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000177{
178 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
179}
180
181static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000182u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000183{
184 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000185 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000186
187 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
188 return -1;
189 if (len != 1) {
190 PyErr_SetString(PyExc_TypeError, "array item must be unicode character");
191 return -1;
192 }
193 if (i >= 0)
194 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
195 return 0;
196}
197#endif
198
Guido van Rossum549ab711997-01-03 19:09:47 +0000199static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000200h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000202 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000203}
204
205static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000206h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000207{
208 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000209 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000210 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000211 return -1;
212 if (i >= 0)
213 ((short *)ap->ob_item)[i] = x;
214 return 0;
215}
216
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000218HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000219{
220 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
221}
222
Fred Drake541dc3b2000-06-28 17:49:30 +0000223static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000224HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000225{
226 int x;
227 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
228 must use the next size up and manually do the overflow checking */
229 if (!PyArg_Parse(v, "i;array item must be integer", &x))
230 return -1;
231 else if (x < 0) {
232 PyErr_SetString(PyExc_OverflowError,
233 "unsigned short is less than minimum");
234 return -1;
235 }
236 else if (x > USHRT_MAX) {
237 PyErr_SetString(PyExc_OverflowError,
238 "unsigned short is greater than maximum");
239 return -1;
240 }
241 if (i >= 0)
242 ((short *)ap->ob_item)[i] = (short)x;
243 return 0;
244}
Guido van Rossum549ab711997-01-03 19:09:47 +0000245
246static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000247i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000248{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000249 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000250}
251
252static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000253i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000254{
255 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000256 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000257 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000258 return -1;
259 if (i >= 0)
260 ((int *)ap->ob_item)[i] = x;
261 return 0;
262}
263
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000264static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000265II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000266{
267 return PyLong_FromUnsignedLong(
268 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
269}
270
271static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000272II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000273{
274 unsigned long x;
275 if (PyLong_Check(v)) {
276 x = PyLong_AsUnsignedLong(v);
277 if (x == (unsigned long) -1 && PyErr_Occurred())
278 return -1;
279 }
280 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000281 long y;
282 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000284 if (y < 0) {
285 PyErr_SetString(PyExc_OverflowError,
286 "unsigned int is less than minimum");
287 return -1;
288 }
289 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000290
Guido van Rossum549ab711997-01-03 19:09:47 +0000291 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000292 if (x > UINT_MAX) {
293 PyErr_SetString(PyExc_OverflowError,
294 "unsigned int is greater than maximum");
295 return -1;
296 }
297
Guido van Rossum549ab711997-01-03 19:09:47 +0000298 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000299 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000300 return 0;
301}
302
303static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000304l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000305{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000307}
308
309static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000310l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000311{
312 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000313 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000314 return -1;
315 if (i >= 0)
316 ((long *)ap->ob_item)[i] = x;
317 return 0;
318}
319
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000320static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000321LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000322{
323 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
324}
325
326static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000327LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000328{
329 unsigned long x;
330 if (PyLong_Check(v)) {
331 x = PyLong_AsUnsignedLong(v);
332 if (x == (unsigned long) -1 && PyErr_Occurred())
333 return -1;
334 }
335 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000336 long y;
337 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000338 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000339 if (y < 0) {
340 PyErr_SetString(PyExc_OverflowError,
341 "unsigned long is less than minimum");
342 return -1;
343 }
344 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000345
Guido van Rossum549ab711997-01-03 19:09:47 +0000346 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000347 if (x > ULONG_MAX) {
348 PyErr_SetString(PyExc_OverflowError,
349 "unsigned long is greater than maximum");
350 return -1;
351 }
Tim Petersbb307342000-09-10 05:22:54 +0000352
Guido van Rossum549ab711997-01-03 19:09:47 +0000353 if (i >= 0)
354 ((unsigned long *)ap->ob_item)[i] = x;
355 return 0;
356}
357
358static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000359f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000360{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000361 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000362}
363
364static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000365f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000366{
367 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000368 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 return -1;
370 if (i >= 0)
371 ((float *)ap->ob_item)[i] = x;
372 return 0;
373}
374
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000376d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000378 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000379}
380
381static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000382d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000383{
384 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 return -1;
387 if (i >= 0)
388 ((double *)ap->ob_item)[i] = x;
389 return 0;
390}
391
392/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000393static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 {'c', sizeof(char), c_getitem, c_setitem},
395 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000396 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000397#ifdef Py_USING_UNICODE
398 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
399#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000402 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000403 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000405 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 {'f', sizeof(float), f_getitem, f_setitem},
407 {'d', sizeof(double), d_getitem, d_setitem},
408 {'\0', 0, 0, 0} /* Sentinel */
409};
Tim Petersbb307342000-09-10 05:22:54 +0000410
411/****************************************************************************
412Implementations of array object methods.
413****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000414
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000415static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000416newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000417{
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000420
Guido van Rossum778983b1993-02-19 15:55:02 +0000421 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000422 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 return NULL;
424 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000425
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 nbytes = size * descr->itemsize;
427 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000428 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000431 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000433 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000435 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 if (size <= 0) {
437 op->ob_item = NULL;
438 }
439 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000440 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000441 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000442 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 }
445 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000446 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000447 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000448 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
455 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000456 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000458 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return (*ap->ob_descr->getitem)(ap, i);
460}
461
462static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 char *items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000466 Py_ssize_t n = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000473
474 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000479 if (where < 0)
480 where = 0;
481 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 if (where > n)
483 where = n;
484 /* appends don't need to call memmove() */
485 if (where != n)
486 memmove(items + (where+1)*self->ob_descr->itemsize,
487 items + where*self->ob_descr->itemsize,
488 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossum778983b1993-02-19 15:55:02 +0000492/* Methods */
493
494static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000495array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000497 if (op->weakreflist != NULL)
498 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000499 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000501 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000502}
503
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504static PyObject *
505array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000506{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 arrayobject *va, *wa;
508 PyObject *vi = NULL;
509 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 PyObject *res;
512
Martin v. Löwis99866332002-03-01 10:27:01 +0000513 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000514 Py_INCREF(Py_NotImplemented);
515 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000517
518 va = (arrayobject *)v;
519 wa = (arrayobject *)w;
520
521 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
522 /* Shortcut: if the lengths differ, the arrays differ */
523 if (op == Py_EQ)
524 res = Py_False;
525 else
526 res = Py_True;
527 Py_INCREF(res);
528 return res;
529 }
530
531 /* Search for the first index where items are different */
532 k = 1;
533 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
534 vi = getarrayitem(v, i);
535 wi = getarrayitem(w, i);
536 if (vi == NULL || wi == NULL) {
537 Py_XDECREF(vi);
538 Py_XDECREF(wi);
539 return NULL;
540 }
541 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542 if (k == 0)
543 break; /* Keeping vi and wi alive! */
544 Py_DECREF(vi);
545 Py_DECREF(wi);
546 if (k < 0)
547 return NULL;
548 }
549
550 if (k) {
551 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t vs = va->ob_size;
553 Py_ssize_t ws = wa->ob_size;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 int cmp;
555 switch (op) {
556 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000557 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 case Py_EQ: cmp = vs == ws; break;
559 case Py_NE: cmp = vs != ws; break;
560 case Py_GT: cmp = vs > ws; break;
561 case Py_GE: cmp = vs >= ws; break;
562 default: return NULL; /* cannot happen */
563 }
564 if (cmp)
565 res = Py_True;
566 else
567 res = Py_False;
568 Py_INCREF(res);
569 return res;
570 }
571
572 /* We have an item that differs. First, shortcuts for EQ/NE */
573 if (op == Py_EQ) {
574 Py_INCREF(Py_False);
575 res = Py_False;
576 }
577 else if (op == Py_NE) {
578 Py_INCREF(Py_True);
579 res = Py_True;
580 }
581 else {
582 /* Compare the final item again using the proper operator */
583 res = PyObject_RichCompare(vi, wi, op);
584 }
585 Py_DECREF(vi);
586 Py_DECREF(wi);
587 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
Martin v. Löwis18e16552006-02-15 17:27:45 +0000590static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
593 return a->ob_size;
594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
599 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return NULL;
602 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604}
605
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000606static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000607array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000608{
609 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 if (ilow < 0)
611 ilow = 0;
612 else if (ilow > a->ob_size)
613 ilow = a->ob_size;
614 if (ihigh < 0)
615 ihigh = 0;
616 if (ihigh < ilow)
617 ihigh = ilow;
618 else if (ihigh > a->ob_size)
619 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000620 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 if (np == NULL)
622 return NULL;
623 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000629array_copy(arrayobject *a, PyObject *unused)
630{
631 return array_slice(a, 0, a->ob_size);
632}
633
634PyDoc_STRVAR(copy_doc,
635"copy(array)\n\
636\n\
637 Return a copy of the array.");
638
639static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000640array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000641{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000644 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000645 PyErr_Format(PyExc_TypeError,
646 "can only append array (not \"%.200s\") to array",
647 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return NULL;
649 }
650#define b ((arrayobject *)bb)
651 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return NULL;
654 }
655 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000656 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000657 if (np == NULL) {
658 return NULL;
659 }
660 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
661 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000662 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000663 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000664#undef b
665}
666
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000668array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000669{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000670 Py_ssize_t i;
671 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000672 arrayobject *np;
673 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 if (n < 0)
676 n = 0;
677 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000678 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000679 if (np == NULL)
680 return NULL;
681 p = np->ob_item;
682 nbytes = a->ob_size * a->ob_descr->itemsize;
683 for (i = 0; i < n; i++) {
684 memcpy(p, a->ob_item, nbytes);
685 p += nbytes;
686 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000687 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000688}
689
690static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000691array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000692{
693 char *item;
694 int n; /* Size of replacement array */
695 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000696#define b ((arrayobject *)v)
697 if (v == NULL)
698 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000699 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000700 n = b->ob_size;
701 if (a == b) {
702 /* Special case "a[i:j] = a" -- copy b first */
703 int ret;
704 v = array_slice(b, 0, n);
705 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000706 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000707 return ret;
708 }
709 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000710 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000711 return -1;
712 }
713 }
714 else {
Fred Drake137507e2000-06-01 02:02:46 +0000715 PyErr_Format(PyExc_TypeError,
716 "can only assign array (not \"%.200s\") to array slice",
717 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000718 return -1;
719 }
720 if (ilow < 0)
721 ilow = 0;
722 else if (ilow > a->ob_size)
723 ilow = a->ob_size;
724 if (ihigh < 0)
725 ihigh = 0;
726 if (ihigh < ilow)
727 ihigh = ilow;
728 else if (ihigh > a->ob_size)
729 ihigh = a->ob_size;
730 item = a->ob_item;
731 d = n - (ihigh-ilow);
732 if (d < 0) { /* Delete -d items */
733 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
734 item + ihigh*a->ob_descr->itemsize,
735 (a->ob_size-ihigh)*a->ob_descr->itemsize);
736 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000737 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000738 /* Can't fail */
739 a->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000740 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000741 }
742 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000743 PyMem_RESIZE(item, char,
744 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000745 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000746 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000747 return -1;
748 }
749 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
750 item + ihigh*a->ob_descr->itemsize,
751 (a->ob_size-ihigh)*a->ob_descr->itemsize);
752 a->ob_item = item;
753 a->ob_size += d;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000754 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000755 }
756 if (n > 0)
757 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
758 n*b->ob_descr->itemsize);
759 return 0;
760#undef b
761}
762
763static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000764array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000765{
766 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000767 PyErr_SetString(PyExc_IndexError,
768 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000769 return -1;
770 }
771 if (v == NULL)
772 return array_ass_slice(a, i, i+1, v);
773 return (*a->ob_descr->setitem)(a, i, v);
774}
775
776static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000777setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000778{
Martin v. Löwis99866332002-03-01 10:27:01 +0000779 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000780 return array_ass_item((arrayobject *)a, i, v);
781}
782
Martin v. Löwis99866332002-03-01 10:27:01 +0000783static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000784array_iter_extend(arrayobject *self, PyObject *bb)
785{
786 PyObject *it, *v;
787
788 it = PyObject_GetIter(bb);
789 if (it == NULL)
790 return -1;
791
792 while ((v = PyIter_Next(it)) != NULL) {
793 if (ins1(self, (int) self->ob_size, v) != 0) {
794 Py_DECREF(v);
795 Py_DECREF(it);
796 return -1;
797 }
798 Py_DECREF(v);
799 }
800 Py_DECREF(it);
801 if (PyErr_Occurred())
802 return -1;
803 return 0;
804}
805
806static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000807array_do_extend(arrayobject *self, PyObject *bb)
808{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000809 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000810
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000811 if (!array_Check(bb))
812 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000813#define b ((arrayobject *)bb)
814 if (self->ob_descr != b->ob_descr) {
815 PyErr_SetString(PyExc_TypeError,
816 "can only extend with array of same kind");
817 return -1;
818 }
819 size = self->ob_size + b->ob_size;
820 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
821 if (self->ob_item == NULL) {
822 PyObject_Del(self);
823 PyErr_NoMemory();
824 return -1;
825 }
826 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
827 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000828 self->ob_size = size;
829 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000830
831 return 0;
832#undef b
833}
834
835static PyObject *
836array_inplace_concat(arrayobject *self, PyObject *bb)
837{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000838 if (!array_Check(bb)) {
839 PyErr_Format(PyExc_TypeError,
840 "can only extend array with array (not \"%.200s\")",
841 bb->ob_type->tp_name);
842 return NULL;
843 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000844 if (array_do_extend(self, bb) == -1)
845 return NULL;
846 Py_INCREF(self);
847 return (PyObject *)self;
848}
849
850static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000851array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000852{
853 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000854 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000855
856 if (self->ob_size > 0) {
857 if (n < 0)
858 n = 0;
859 items = self->ob_item;
860 size = self->ob_size * self->ob_descr->itemsize;
861 if (n == 0) {
862 PyMem_FREE(items);
863 self->ob_item = NULL;
864 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000865 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000866 }
867 else {
868 PyMem_Resize(items, char, n * size);
869 if (items == NULL)
870 return PyErr_NoMemory();
871 p = items;
872 for (i = 1; i < n; i++) {
873 p += size;
874 memcpy(p, items, size);
875 }
876 self->ob_item = items;
877 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000878 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000879 }
880 }
881 Py_INCREF(self);
882 return (PyObject *)self;
883}
884
885
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000886static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000887ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000888{
889 if (ins1(self, where, v) != 0)
890 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000891 Py_INCREF(Py_None);
892 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000893}
894
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000895static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000896array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000897{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000898 Py_ssize_t count = 0;
899 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000900
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000901 for (i = 0; i < self->ob_size; i++) {
902 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000903 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000904 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000905 if (cmp > 0)
906 count++;
907 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000908 return NULL;
909 }
Martin v. Löwis18e16552006-02-15 17:27:45 +0000910 if (i < LONG_MAX)
911 return PyInt_FromLong((long)count);
912 else
913 return PyLong_FromLong(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914}
915
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000916PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000917"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000919Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920
921static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000922array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000924 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926 for (i = 0; i < self->ob_size; i++) {
927 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000928 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
929 Py_DECREF(selfi);
930 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931 return PyInt_FromLong((long)i);
932 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000933 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000934 return NULL;
935 }
936 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
937 return NULL;
938}
939
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000940PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000941"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000942\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000943Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000944
Raymond Hettinger625812f2003-01-07 01:58:52 +0000945static int
946array_contains(arrayobject *self, PyObject *v)
947{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000948 Py_ssize_t i;
949 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000950
951 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
952 PyObject *selfi = getarrayitem((PyObject *)self, i);
953 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
954 Py_DECREF(selfi);
955 }
956 return cmp;
957}
958
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000960array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961{
962 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000963
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000964 for (i = 0; i < self->ob_size; i++) {
965 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000966 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
967 Py_DECREF(selfi);
968 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969 if (array_ass_slice(self, i, i+1,
970 (PyObject *)NULL) != 0)
971 return NULL;
972 Py_INCREF(Py_None);
973 return Py_None;
974 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000975 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000976 return NULL;
977 }
978 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
979 return NULL;
980}
981
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000982PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000983"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000985Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000986
987static PyObject *
988array_pop(arrayobject *self, PyObject *args)
989{
990 int i = -1;
991 PyObject *v;
992 if (!PyArg_ParseTuple(args, "|i:pop", &i))
993 return NULL;
994 if (self->ob_size == 0) {
995 /* Special-case most common failure cause */
996 PyErr_SetString(PyExc_IndexError, "pop from empty array");
997 return NULL;
998 }
999 if (i < 0)
1000 i += self->ob_size;
1001 if (i < 0 || i >= self->ob_size) {
1002 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1003 return NULL;
1004 }
1005 v = getarrayitem((PyObject *)self,i);
1006 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1007 Py_DECREF(v);
1008 return NULL;
1009 }
1010 return v;
1011}
1012
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001013PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001014"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001015\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001016Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001017
1018static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001019array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001020{
Martin v. Löwis99866332002-03-01 10:27:01 +00001021 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001022 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001023 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001024 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001025}
1026
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001027PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001028"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001029\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001030 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001031
1032static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001033array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001034{
1035 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001037 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001038 return NULL;
1039 return ins(self, i, v);
1040}
1041
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001042PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001043"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001044\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001045Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001046
1047
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001048static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001049array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001050{
Tim Peters077a11d2000-09-16 22:31:29 +00001051 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001052 retval = PyTuple_New(2);
1053 if (!retval)
1054 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001055
1056 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1057 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1058
1059 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001060}
1061
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001062PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001063"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001064\n\
1065Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001066the length in items of the buffer used to hold array's contents\n\
1067The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001068the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001069
1070
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001071static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001072array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001073{
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 return ins(self, (int) self->ob_size, v);
1075}
1076
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001077PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001078"append(x)\n\
1079\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001080Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001081
1082
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001083static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001084array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001085{
1086 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001087 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001088
Guido van Rossum778983b1993-02-19 15:55:02 +00001089 switch (self->ob_descr->itemsize) {
1090 case 1:
1091 break;
1092 case 2:
1093 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1094 char p0 = p[0];
1095 p[0] = p[1];
1096 p[1] = p0;
1097 }
1098 break;
1099 case 4:
1100 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1101 char p0 = p[0];
1102 char p1 = p[1];
1103 p[0] = p[3];
1104 p[1] = p[2];
1105 p[2] = p1;
1106 p[3] = p0;
1107 }
1108 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001109 case 8:
1110 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1111 char p0 = p[0];
1112 char p1 = p[1];
1113 char p2 = p[2];
1114 char p3 = p[3];
1115 p[0] = p[7];
1116 p[1] = p[6];
1117 p[2] = p[5];
1118 p[3] = p[4];
1119 p[4] = p3;
1120 p[5] = p2;
1121 p[6] = p1;
1122 p[7] = p0;
1123 }
1124 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001125 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001126 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001127 "don't know how to byteswap this array type");
1128 return NULL;
1129 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001130 Py_INCREF(Py_None);
1131 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001132}
1133
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001134PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001135"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001136\n\
Fred Drakebf272981999-12-03 17:15:30 +00001137Byteswap 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 +000011384, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001139
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001140static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001141array_reduce(arrayobject *array)
1142{
1143 PyObject *dict, *result;
1144
1145 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1146 if (dict == NULL) {
1147 PyErr_Clear();
1148 dict = Py_None;
1149 Py_INCREF(dict);
1150 }
1151 result = Py_BuildValue("O(cs#)O",
1152 array->ob_type,
1153 array->ob_descr->typecode,
1154 array->ob_item,
1155 array->ob_size * array->ob_descr->itemsize,
1156 dict);
1157 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 */
1170 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001171
Guido van Rossum778983b1993-02-19 15:55:02 +00001172 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001173 for (p = self->ob_item,
1174 q = self->ob_item + (self->ob_size - 1)*itemsize;
1175 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
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001196array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001197{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001198 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001199 int n;
1200 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001201 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001202 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001203 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001204 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001205 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001206 return NULL;
1207 }
1208 if (n > 0) {
1209 char *item = self->ob_item;
1210 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001211 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001212 int newlength;
1213 size_t newbytes;
1214 /* Be careful here about overflow */
1215 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001216 (newbytes = newlength * itemsize) / itemsize !=
1217 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001218 goto nomem;
1219 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001220 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001221 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001222 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001223 return NULL;
1224 }
1225 self->ob_item = item;
1226 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001227 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001228 nread = fread(item + (self->ob_size - n) * itemsize,
1229 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001230 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001231 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001232 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001233 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001234 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001235 PyErr_SetString(PyExc_EOFError,
1236 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001237 return NULL;
1238 }
1239 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001240 Py_INCREF(Py_None);
1241 return Py_None;
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\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001248array. Also called as read.");
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{
Guido van Rossum778983b1993-02-19 15:55:02 +00001254 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001255
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001256 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001257 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001258 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 return NULL;
1260 }
1261 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001262 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1263 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 clearerr(fp);
1266 return NULL;
1267 }
1268 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001269 Py_INCREF(Py_None);
1270 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001271}
1272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001273PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001274"tofile(f)\n\
1275\n\
1276Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001277write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001278
1279
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001280static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001281array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001282{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001283 Py_ssize_t n;
1284 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001285
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001286 if (!PyList_Check(list)) {
1287 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001288 return NULL;
1289 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001290 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 if (n > 0) {
1292 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001293 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001294 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001295 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001296 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 return NULL;
1298 }
1299 self->ob_item = item;
1300 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001301 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001302 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001303 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001304 if ((*self->ob_descr->setitem)(self,
1305 self->ob_size - n + i, v) != 0) {
1306 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001307 PyMem_RESIZE(item, char,
1308 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001309 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001310 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001311 return NULL;
1312 }
1313 }
1314 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001315 Py_INCREF(Py_None);
1316 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001317}
1318
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001319PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001320"fromlist(list)\n\
1321\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001322Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001323
1324
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001326array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001327{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001328 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001329 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001330
Guido van Rossum778983b1993-02-19 15:55:02 +00001331 if (list == NULL)
1332 return NULL;
1333 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001334 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001336 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001337 return NULL;
1338 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001339 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001340 }
1341 return list;
1342}
1343
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001344PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001345"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001346\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001347Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001348
1349
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001350static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001351array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001352{
1353 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001354 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001355 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001356 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001357 return NULL;
1358 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001359 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001360 "string length not a multiple of item size");
1361 return NULL;
1362 }
1363 n = n / itemsize;
1364 if (n > 0) {
1365 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001366 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001367 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001368 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001369 return NULL;
1370 }
1371 self->ob_item = item;
1372 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001373 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001374 memcpy(item + (self->ob_size - n) * itemsize,
1375 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001376 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001377 Py_INCREF(Py_None);
1378 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001379}
1380
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001382"fromstring(string)\n\
1383\n\
1384Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001385values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001386
1387
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001388static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001389array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001390{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001391 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001392 self->ob_size * self->ob_descr->itemsize);
1393}
1394
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001396"tostring() -> string\n\
1397\n\
1398Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001399representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001400
Martin v. Löwis99866332002-03-01 10:27:01 +00001401
1402
1403#ifdef Py_USING_UNICODE
1404static PyObject *
1405array_fromunicode(arrayobject *self, PyObject *args)
1406{
1407 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001408 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001409
1410 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1411 return NULL;
1412 if (self->ob_descr->typecode != 'u') {
1413 PyErr_SetString(PyExc_ValueError,
1414 "fromunicode() may only be called on "
1415 "type 'u' arrays");
1416 return NULL;
1417 }
1418 if (n > 0) {
1419 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1420 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1421 if (item == NULL) {
1422 PyErr_NoMemory();
1423 return NULL;
1424 }
1425 self->ob_item = (char *) item;
1426 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001427 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001428 memcpy(item + self->ob_size - n,
1429 ustr, n * sizeof(Py_UNICODE));
1430 }
1431
1432 Py_INCREF(Py_None);
1433 return Py_None;
1434}
1435
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001436PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001437"fromunicode(ustr)\n\
1438\n\
1439Extends this array with data from the unicode string ustr.\n\
1440The array must be a type 'u' array; otherwise a ValueError\n\
1441is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001442append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001443
1444
1445static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001446array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001447{
Martin v. Löwis99866332002-03-01 10:27:01 +00001448 if (self->ob_descr->typecode != 'u') {
1449 PyErr_SetString(PyExc_ValueError,
1450 "tounicode() may only be called on type 'u' arrays");
1451 return NULL;
1452 }
1453 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1454}
1455
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001456PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001457"tounicode() -> unicode\n\
1458\n\
1459Convert the array to a unicode string. The array must be\n\
1460a type 'u' array; otherwise a ValueError is raised. Use\n\
1461array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001462an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001463
1464#endif /* Py_USING_UNICODE */
1465
1466
1467static PyObject *
1468array_get_typecode(arrayobject *a, void *closure)
1469{
1470 char tc = a->ob_descr->typecode;
1471 return PyString_FromStringAndSize(&tc, 1);
1472}
1473
1474static PyObject *
1475array_get_itemsize(arrayobject *a, void *closure)
1476{
1477 return PyInt_FromLong((long)a->ob_descr->itemsize);
1478}
1479
1480static PyGetSetDef array_getsets [] = {
1481 {"typecode", (getter) array_get_typecode, NULL,
1482 "the typecode character used to create the array"},
1483 {"itemsize", (getter) array_get_itemsize, NULL,
1484 "the size, in bytes, of one array item"},
1485 {NULL}
1486};
1487
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001488PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001489 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001490 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001491 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001492 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001493 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001494 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001495 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1496 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001497 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001498 count_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001499 {"__deepcopy__",(PyCFunction)array_copy, METH_NOARGS,
1500 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001501 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001502 extend_doc},
1503 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1504 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001505 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001506 fromlist_doc},
1507 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1508 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001509#ifdef Py_USING_UNICODE
1510 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1511 fromunicode_doc},
1512#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001513 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001514 index_doc},
1515 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1516 insert_doc},
1517 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1518 pop_doc},
1519 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1520 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001521 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1522 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001523 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001524 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001525 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001526 reverse_doc},
1527/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1528 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001529 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001530 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001531 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001532 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001533 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001534 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001535#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001536 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001537 tounicode_doc},
1538#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001539 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001540 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001541 {NULL, NULL} /* sentinel */
1542};
1543
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001544static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001545array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001546{
Martin v. Löwis99866332002-03-01 10:27:01 +00001547 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001548 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001549 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001550
Guido van Rossum778983b1993-02-19 15:55:02 +00001551 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001552 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001553 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001554 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001555 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001556 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001557
1558 if (typecode == 'c')
1559 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001560#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001561 else if (typecode == 'u')
1562 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001563#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001564 else
1565 v = array_tolist(a, NULL);
1566 t = PyObject_Repr(v);
1567 Py_XDECREF(v);
1568
1569 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001570 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001571 PyString_ConcatAndDel(&s, t);
1572 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001573 return s;
1574}
1575
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001576static PyObject*
1577array_subscr(arrayobject* self, PyObject* item)
1578{
1579 if (PyInt_Check(item)) {
1580 long i = PyInt_AS_LONG(item);
1581 if (i < 0)
1582 i += self->ob_size;
1583 return array_item(self, i);
1584 }
1585 else if (PyLong_Check(item)) {
1586 long i = PyLong_AsLong(item);
1587 if (i == -1 && PyErr_Occurred())
1588 return NULL;
1589 if (i < 0)
1590 i += self->ob_size;
1591 return array_item(self, i);
1592 }
1593 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001594 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001595 PyObject* result;
1596 arrayobject* ar;
1597 int itemsize = self->ob_descr->itemsize;
1598
1599 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1600 &start, &stop, &step, &slicelength) < 0) {
1601 return NULL;
1602 }
1603
1604 if (slicelength <= 0) {
1605 return newarrayobject(&Arraytype, 0, self->ob_descr);
1606 }
1607 else {
1608 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1609 if (!result) return NULL;
1610
1611 ar = (arrayobject*)result;
1612
1613 for (cur = start, i = 0; i < slicelength;
1614 cur += step, i++) {
1615 memcpy(ar->ob_item + i*itemsize,
1616 self->ob_item + cur*itemsize,
1617 itemsize);
1618 }
1619
1620 return result;
1621 }
1622 }
1623 else {
1624 PyErr_SetString(PyExc_TypeError,
1625 "list indices must be integers");
1626 return NULL;
1627 }
1628}
1629
1630static int
1631array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1632{
1633 if (PyInt_Check(item)) {
1634 long i = PyInt_AS_LONG(item);
1635 if (i < 0)
1636 i += self->ob_size;
1637 return array_ass_item(self, i, value);
1638 }
1639 else if (PyLong_Check(item)) {
1640 long i = PyLong_AsLong(item);
1641 if (i == -1 && PyErr_Occurred())
1642 return -1;
1643 if (i < 0)
1644 i += self->ob_size;
1645 return array_ass_item(self, i, value);
1646 }
1647 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001648 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001649 int itemsize = self->ob_descr->itemsize;
1650
1651 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1652 &start, &stop, &step, &slicelength) < 0) {
1653 return -1;
1654 }
1655
1656 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1657 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1658 return array_ass_slice(self, start, stop, value);
1659
1660 if (value == NULL) {
1661 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001662 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001663
1664 if (slicelength <= 0)
1665 return 0;
1666
1667 if (step < 0) {
1668 stop = start + 1;
1669 start = stop + step*(slicelength - 1) - 1;
1670 step = -step;
1671 }
1672
Michael W. Hudson56796f62002-07-29 14:35:04 +00001673 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001674 cur += step, i++) {
1675 memmove(self->ob_item + (cur - i)*itemsize,
1676 self->ob_item + (cur + 1)*itemsize,
1677 (step - 1) * itemsize);
1678 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001679 extra = self->ob_size - (cur + 1);
1680 if (extra > 0) {
1681 memmove(self->ob_item + (cur - i)*itemsize,
1682 self->ob_item + (cur + 1)*itemsize,
1683 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001684 }
1685
1686 self->ob_size -= slicelength;
1687 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001688 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001689
1690 return 0;
1691 }
1692 else {
1693 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001694 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001695 arrayobject* av;
1696
1697 if (!array_Check(value)) {
1698 PyErr_Format(PyExc_TypeError,
1699 "must assign array (not \"%.200s\") to slice",
1700 value->ob_type->tp_name);
1701 return -1;
1702 }
1703
1704 av = (arrayobject*)value;
1705
1706 if (av->ob_size != slicelength) {
1707 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001708 "attempt to assign array of size %ld to extended slice of size %ld",
1709 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001710 return -1;
1711 }
1712
1713 if (!slicelength)
1714 return 0;
1715
1716 /* protect against a[::-1] = a */
1717 if (self == av) {
1718 value = array_slice(av, 0, av->ob_size);
1719 av = (arrayobject*)value;
1720 }
1721 else {
1722 Py_INCREF(value);
1723 }
1724
1725 for (cur = start, i = 0; i < slicelength;
1726 cur += step, i++) {
1727 memcpy(self->ob_item + cur*itemsize,
1728 av->ob_item + i*itemsize,
1729 itemsize);
1730 }
1731
1732 Py_DECREF(value);
1733
1734 return 0;
1735 }
1736 }
1737 else {
1738 PyErr_SetString(PyExc_TypeError,
1739 "list indices must be integers");
1740 return -1;
1741 }
1742}
1743
1744static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001745 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001746 (binaryfunc)array_subscr,
1747 (objobjargproc)array_ass_subscr
1748};
1749
Martin v. Löwis18e16552006-02-15 17:27:45 +00001750static Py_ssize_t
1751array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001752{
1753 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001754 PyErr_SetString(PyExc_SystemError,
1755 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001756 return -1;
1757 }
1758 *ptr = (void *)self->ob_item;
1759 return self->ob_size*self->ob_descr->itemsize;
1760}
1761
Martin v. Löwis18e16552006-02-15 17:27:45 +00001762static Py_ssize_t
1763array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001764{
1765 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001766 PyErr_SetString(PyExc_SystemError,
1767 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001768 return -1;
1769 }
1770 *ptr = (void *)self->ob_item;
1771 return self->ob_size*self->ob_descr->itemsize;
1772}
1773
Martin v. Löwis18e16552006-02-15 17:27:45 +00001774static Py_ssize_t
1775array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001776{
1777 if ( lenp )
1778 *lenp = self->ob_size*self->ob_descr->itemsize;
1779 return 1;
1780}
1781
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001782static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001783 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001784 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001785 (ssizeargfunc)array_repeat, /*sq_repeat*/
1786 (ssizeargfunc)array_item, /*sq_item*/
1787 (ssizessizeargfunc)array_slice, /*sq_slice*/
1788 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1789 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001790 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001791 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001792 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001793};
1794
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001795static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001796 (readbufferproc)array_buffer_getreadbuf,
1797 (writebufferproc)array_buffer_getwritebuf,
1798 (segcountproc)array_buffer_getsegcount,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001799};
1800
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001801static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001802array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001803{
1804 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001805 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001806 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001807
1808 if (!_PyArg_NoKeywords("array.array()", kwds))
1809 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001810
1811 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1812 return NULL;
1813
1814 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001815 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001816 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001817 it = PyObject_GetIter(initial);
1818 if (it == NULL)
1819 return NULL;
1820 /* We set initial to NULL so that the subsequent code
1821 will create an empty array of the appropriate type
1822 and afterwards we can use array_iter_extend to populate
1823 the array.
1824 */
1825 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001826 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001827 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1828 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001829 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001830 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001831
1832 if (initial == NULL || !(PyList_Check(initial)
1833 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001834 len = 0;
1835 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001836 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001837
1838 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001839 if (a == NULL)
1840 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001841
Guido van Rossum778983b1993-02-19 15:55:02 +00001842 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001843 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001844 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001845 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001846 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001847 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001848 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001849 return NULL;
1850 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001851 if (setarrayitem(a, i, v) != 0) {
1852 Py_DECREF(v);
1853 Py_DECREF(a);
1854 return NULL;
1855 }
1856 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001857 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001858 } else if (initial != NULL && PyString_Check(initial)) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001859 PyObject *t_initial = PyTuple_Pack(1,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001860 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001861 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001862 array_fromstring((arrayobject *)a,
1863 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001864 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001865 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001866 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001867 return NULL;
1868 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001869 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001870#ifdef Py_USING_UNICODE
1871 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001872 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001873 if (n > 0) {
1874 arrayobject *self = (arrayobject *)a;
1875 char *item = self->ob_item;
1876 item = PyMem_Realloc(item, n);
1877 if (item == NULL) {
1878 PyErr_NoMemory();
1879 Py_DECREF(a);
1880 return NULL;
1881 }
1882 self->ob_item = item;
1883 self->ob_size = n / sizeof(Py_UNICODE);
1884 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001885 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001886 }
1887#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001888 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001889 if (it != NULL) {
1890 if (array_iter_extend((arrayobject *)a, it) == -1) {
1891 Py_DECREF(it);
1892 Py_DECREF(a);
1893 return NULL;
1894 }
1895 Py_DECREF(it);
1896 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001897 return a;
1898 }
1899 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001900 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001901 "bad typecode (must be c, b, B, u, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001902 return NULL;
1903}
1904
Guido van Rossum778983b1993-02-19 15:55:02 +00001905
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001906PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001907"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001908an array of basic values: characters, integers, floating point\n\
1909numbers. Arrays are sequence types and behave very much like lists,\n\
1910except that the type of objects stored in them is constrained. The\n\
1911type is specified at object creation time by using a type code, which\n\
1912is a single character. The following type codes are defined:\n\
1913\n\
1914 Type code C Type Minimum size in bytes \n\
1915 'c' character 1 \n\
1916 'b' signed integer 1 \n\
1917 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001918 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001919 'h' signed integer 2 \n\
1920 'H' unsigned integer 2 \n\
1921 'i' signed integer 2 \n\
1922 'I' unsigned integer 2 \n\
1923 'l' signed integer 4 \n\
1924 'L' unsigned integer 4 \n\
1925 'f' floating point 4 \n\
1926 'd' floating point 8 \n\
1927\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001928The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001929\n\
1930array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001931");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001933PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001934"array(typecode [, initializer]) -> array\n\
1935\n\
1936Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001937initialized from the optional initializer value, which must be a list,\n\
1938string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001939\n\
1940Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001941the type of objects stored in them is constrained.\n\
1942\n\
1943Methods:\n\
1944\n\
1945append() -- append a new item to the end of the array\n\
1946buffer_info() -- return information giving the current memory info\n\
1947byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001948count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001949extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001950fromfile() -- read items from a file object\n\
1951fromlist() -- append items from the list\n\
1952fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001953index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001954insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001955pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001956read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001957remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001958reverse() -- reverse the order of the items in the array\n\
1959tofile() -- write all items to a file object\n\
1960tolist() -- return the array converted to an ordinary list\n\
1961tostring() -- return the array converted to a string\n\
1962write() -- DEPRECATED, use tofile()\n\
1963\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001964Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001965\n\
1966typecode -- the typecode character used to create the array\n\
1967itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001968");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001969
Raymond Hettinger625812f2003-01-07 01:58:52 +00001970static PyObject *array_iter(arrayobject *ao);
1971
Tim Peters0c322792002-07-17 16:49:03 +00001972static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001973 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001974 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001975 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001976 sizeof(arrayobject),
1977 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001978 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001979 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001980 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001981 0, /* tp_setattr */
1982 0, /* tp_compare */
1983 (reprfunc)array_repr, /* tp_repr */
1984 0, /* tp_as _number*/
1985 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001986 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001987 0, /* tp_hash */
1988 0, /* tp_call */
1989 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001990 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001991 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001992 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001993 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001994 arraytype_doc, /* tp_doc */
1995 0, /* tp_traverse */
1996 0, /* tp_clear */
1997 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001998 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00001999 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002000 0, /* tp_iternext */
2001 array_methods, /* tp_methods */
2002 0, /* tp_members */
2003 array_getsets, /* tp_getset */
2004 0, /* tp_base */
2005 0, /* tp_dict */
2006 0, /* tp_descr_get */
2007 0, /* tp_descr_set */
2008 0, /* tp_dictoffset */
2009 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002010 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002011 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002012 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002013};
2014
Raymond Hettinger625812f2003-01-07 01:58:52 +00002015
2016/*********************** Array Iterator **************************/
2017
2018typedef struct {
2019 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002020 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002021 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002022 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002023} arrayiterobject;
2024
2025static PyTypeObject PyArrayIter_Type;
2026
2027#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2028
2029static PyObject *
2030array_iter(arrayobject *ao)
2031{
2032 arrayiterobject *it;
2033
2034 if (!array_Check(ao)) {
2035 PyErr_BadInternalCall();
2036 return NULL;
2037 }
2038
2039 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2040 if (it == NULL)
2041 return NULL;
2042
2043 Py_INCREF(ao);
2044 it->ao = ao;
2045 it->index = 0;
2046 it->getitem = ao->ob_descr->getitem;
2047 PyObject_GC_Track(it);
2048 return (PyObject *)it;
2049}
2050
2051static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002052arrayiter_next(arrayiterobject *it)
2053{
2054 assert(PyArrayIter_Check(it));
2055 if (it->index < it->ao->ob_size)
2056 return (*it->getitem)(it->ao, it->index++);
2057 return NULL;
2058}
2059
2060static void
2061arrayiter_dealloc(arrayiterobject *it)
2062{
2063 PyObject_GC_UnTrack(it);
2064 Py_XDECREF(it->ao);
2065 PyObject_GC_Del(it);
2066}
2067
2068static int
2069arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2070{
2071 if (it->ao != NULL)
2072 return visit((PyObject *)(it->ao), arg);
2073 return 0;
2074}
2075
2076static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002077 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002078 0, /* ob_size */
2079 "arrayiterator", /* tp_name */
2080 sizeof(arrayiterobject), /* tp_basicsize */
2081 0, /* tp_itemsize */
2082 /* methods */
2083 (destructor)arrayiter_dealloc, /* tp_dealloc */
2084 0, /* tp_print */
2085 0, /* tp_getattr */
2086 0, /* tp_setattr */
2087 0, /* tp_compare */
2088 0, /* tp_repr */
2089 0, /* tp_as_number */
2090 0, /* tp_as_sequence */
2091 0, /* tp_as_mapping */
2092 0, /* tp_hash */
2093 0, /* tp_call */
2094 0, /* tp_str */
2095 PyObject_GenericGetAttr, /* tp_getattro */
2096 0, /* tp_setattro */
2097 0, /* tp_as_buffer */
2098 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2099 0, /* tp_doc */
2100 (traverseproc)arrayiter_traverse, /* tp_traverse */
2101 0, /* tp_clear */
2102 0, /* tp_richcompare */
2103 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002104 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002105 (iternextfunc)arrayiter_next, /* tp_iternext */
2106 0, /* tp_methods */
2107};
2108
2109
2110/*********************** Install Module **************************/
2111
Martin v. Löwis99866332002-03-01 10:27:01 +00002112/* No functions in array module. */
2113static PyMethodDef a_methods[] = {
2114 {NULL, NULL, 0, NULL} /* Sentinel */
2115};
2116
2117
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002118PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002119initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002120{
Fred Drakef4e34842002-04-01 03:45:06 +00002121 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002122
Martin v. Löwis99866332002-03-01 10:27:01 +00002123 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002124 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002125 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002126 if (m == NULL)
2127 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002128
2129 Py_INCREF((PyObject *)&Arraytype);
2130 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2131 Py_INCREF((PyObject *)&Arraytype);
2132 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002133 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002134}