blob: e44b8e1f8ab439108d3ef58c7c03bb68ece8f3b6 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Thomas Wouters0e3f5912006-08-11 14:57:12 +000015#endif /* HAVE_SYS_TYPES_H */
Guido van Rossum7f1de831999-08-27 20:33:52 +000016#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Georg Brandl1b672672006-02-17 08:56:33 +000032 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000033 char *ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +000034 Py_ssize_t allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000035 struct arraydescr *ob_descr;
Raymond Hettingercb87bc82004-05-31 00:35:52 +000036 PyObject *weakreflist; /* List of weak references */
Guido van Rossum778983b1993-02-19 15:55:02 +000037} arrayobject;
38
Jeremy Hylton938ace62002-07-17 16:30:39 +000039static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000040
Martin v. Löwis99866332002-03-01 10:27:01 +000041#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
42#define array_CheckExact(op) ((op)->ob_type == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000043
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000044static int
Martin v. Löwis18e16552006-02-15 17:27:45 +000045array_resize(arrayobject *self, Py_ssize_t newsize)
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000046{
47 char *items;
48 size_t _new_size;
49
50 /* Bypass realloc() when a previous overallocation is large enough
51 to accommodate the newsize. If the newsize is 16 smaller than the
52 current size, then proceed with the realloc() to shrink the list.
53 */
54
55 if (self->allocated >= newsize &&
56 self->ob_size < newsize + 16 &&
57 self->ob_item != NULL) {
58 self->ob_size = newsize;
59 return 0;
60 }
61
62 /* This over-allocates proportional to the array size, making room
63 * for additional growth. The over-allocation is mild, but is
64 * enough to give linear-time amortized behavior over a long
65 * sequence of appends() in the presence of a poorly-performing
66 * system realloc().
67 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
68 * Note, the pattern starts out the same as for lists but then
69 * grows at a smaller rate so that larger arrays only overallocate
70 * by about 1/16th -- this is done because arrays are presumed to be more
71 * memory critical.
72 */
73
74 _new_size = (newsize >> 4) + (self->ob_size < 8 ? 3 : 7) + newsize;
75 items = self->ob_item;
76 /* XXX The following multiplication and division does not optimize away
77 like it does for lists since the size is not known at compile time */
78 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
79 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
80 else
81 items = NULL;
82 if (items == NULL) {
83 PyErr_NoMemory();
84 return -1;
85 }
86 self->ob_item = items;
87 self->ob_size = newsize;
88 self->allocated = _new_size;
89 return 0;
90}
91
Tim Petersbb307342000-09-10 05:22:54 +000092/****************************************************************************
93Get and Set functions for each type.
94A Get function takes an arrayobject* and an integer index, returning the
95array value at that index wrapped in an appropriate PyObject*.
96A Set function takes an arrayobject, integer index, and PyObject*; sets
97the array value at that index to the raw C data extracted from the PyObject*,
98and returns 0 if successful, else nonzero on failure (PyObject* not of an
99appropriate type or value).
100Note that the basic Get and Set functions do NOT check that the index is
101in bounds; that's the responsibility of the caller.
102****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000103
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000104static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000105c_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000106{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000107 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000108}
109
110static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000111c_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000112{
113 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000114 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000115 return -1;
116 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000117 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000118 return 0;
119}
120
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000121static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000122b_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000123{
124 long x = ((char *)ap->ob_item)[i];
125 if (x >= 128)
126 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000127 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000128}
129
130static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000131b_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000132{
Fred Drake541dc3b2000-06-28 17:49:30 +0000133 short x;
134 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
135 must use the next size up that is signed ('h') and manually do
136 the overflow checking */
137 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000138 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000139 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000140 PyErr_SetString(PyExc_OverflowError,
141 "signed char is less than minimum");
142 return -1;
143 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000144 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000145 PyErr_SetString(PyExc_OverflowError,
146 "signed char is greater than maximum");
147 return -1;
148 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000149 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000150 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000151 return 0;
152}
153
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000154static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000155BB_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000156{
157 long x = ((unsigned char *)ap->ob_item)[i];
158 return PyInt_FromLong(x);
159}
160
Fred Drake541dc3b2000-06-28 17:49:30 +0000161static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000162BB_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000163{
164 unsigned char x;
165 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
166 if (!PyArg_Parse(v, "b;array item must be integer", &x))
167 return -1;
168 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000169 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000170 return 0;
171}
Guido van Rossum549ab711997-01-03 19:09:47 +0000172
Martin v. Löwis99866332002-03-01 10:27:01 +0000173#ifdef Py_USING_UNICODE
174static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000175u_getitem(arrayobject *ap, Py_ssize_t i)
Martin v. Löwis99866332002-03-01 10:27:01 +0000176{
177 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
178}
179
180static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000181u_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Martin v. Löwis99866332002-03-01 10:27:01 +0000182{
183 Py_UNICODE *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000184 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +0000185
186 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
187 return -1;
188 if (len != 1) {
Thomas Wouters49fd7fa2006-04-21 10:40:58 +0000189 PyErr_SetString(PyExc_TypeError,
190 "array item must be unicode character");
Martin v. Löwis99866332002-03-01 10:27:01 +0000191 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
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000691array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000692{
693 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000694 Py_ssize_t n; /* Size of replacement array */
695 Py_ssize_t 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öwisad0a4622006-02-16 14:30:23 +0000910 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911}
912
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000913PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000914"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000915\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000916Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000917
918static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000919array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000921 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923 for (i = 0; i < self->ob_size; i++) {
924 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000925 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
926 Py_DECREF(selfi);
927 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000928 return PyInt_FromLong((long)i);
929 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000930 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931 return NULL;
932 }
933 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
934 return NULL;
935}
936
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000937PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000938"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000939\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000940Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000941
Raymond Hettinger625812f2003-01-07 01:58:52 +0000942static int
943array_contains(arrayobject *self, PyObject *v)
944{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000945 Py_ssize_t i;
946 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000947
948 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
949 PyObject *selfi = getarrayitem((PyObject *)self, i);
950 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
951 Py_DECREF(selfi);
952 }
953 return cmp;
954}
955
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000956static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000957array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000958{
959 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000960
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961 for (i = 0; i < self->ob_size; i++) {
962 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000963 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
964 Py_DECREF(selfi);
965 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000966 if (array_ass_slice(self, i, i+1,
967 (PyObject *)NULL) != 0)
968 return NULL;
969 Py_INCREF(Py_None);
970 return Py_None;
971 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000972 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000973 return NULL;
974 }
975 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
976 return NULL;
977}
978
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000979PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000980"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000982Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000983
984static PyObject *
985array_pop(arrayobject *self, PyObject *args)
986{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000987 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000989 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000990 return NULL;
991 if (self->ob_size == 0) {
992 /* Special-case most common failure cause */
993 PyErr_SetString(PyExc_IndexError, "pop from empty array");
994 return NULL;
995 }
996 if (i < 0)
997 i += self->ob_size;
998 if (i < 0 || i >= self->ob_size) {
999 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1000 return NULL;
1001 }
1002 v = getarrayitem((PyObject *)self,i);
1003 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1004 Py_DECREF(v);
1005 return NULL;
1006 }
1007 return v;
1008}
1009
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001010PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001011"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001013Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001014
1015static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001016array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001017{
Martin v. Löwis99866332002-03-01 10:27:01 +00001018 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001020 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001022}
1023
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001024PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001025"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001026\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001027 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001028
1029static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001030array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001031{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001032 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001033 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001034 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 return NULL;
1036 return ins(self, i, v);
1037}
1038
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001039PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001040"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001041\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001042Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001043
1044
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001045static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001046array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001047{
Tim Peters077a11d2000-09-16 22:31:29 +00001048 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001049 retval = PyTuple_New(2);
1050 if (!retval)
1051 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001052
1053 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1054 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1055
1056 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001057}
1058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001059PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001060"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001061\n\
1062Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001063the length in items of the buffer used to hold array's contents\n\
1064The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001065the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001066
1067
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001068static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001069array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001070{
Guido van Rossum778983b1993-02-19 15:55:02 +00001071 return ins(self, (int) self->ob_size, v);
1072}
1073
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001074PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001075"append(x)\n\
1076\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001077Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001078
1079
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001080static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001081array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001082{
1083 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001084 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001085
Guido van Rossum778983b1993-02-19 15:55:02 +00001086 switch (self->ob_descr->itemsize) {
1087 case 1:
1088 break;
1089 case 2:
1090 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1091 char p0 = p[0];
1092 p[0] = p[1];
1093 p[1] = p0;
1094 }
1095 break;
1096 case 4:
1097 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1098 char p0 = p[0];
1099 char p1 = p[1];
1100 p[0] = p[3];
1101 p[1] = p[2];
1102 p[2] = p1;
1103 p[3] = p0;
1104 }
1105 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001106 case 8:
1107 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1108 char p0 = p[0];
1109 char p1 = p[1];
1110 char p2 = p[2];
1111 char p3 = p[3];
1112 p[0] = p[7];
1113 p[1] = p[6];
1114 p[2] = p[5];
1115 p[3] = p[4];
1116 p[4] = p3;
1117 p[5] = p2;
1118 p[6] = p1;
1119 p[7] = p0;
1120 }
1121 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001122 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001123 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001124 "don't know how to byteswap this array type");
1125 return NULL;
1126 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127 Py_INCREF(Py_None);
1128 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001129}
1130
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001131PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001132"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001133\n\
Fred Drakebf272981999-12-03 17:15:30 +00001134Byteswap 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 +000011354, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001136
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001137static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001138array_reduce(arrayobject *array)
1139{
1140 PyObject *dict, *result;
1141
1142 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1143 if (dict == NULL) {
1144 PyErr_Clear();
1145 dict = Py_None;
1146 Py_INCREF(dict);
1147 }
1148 result = Py_BuildValue("O(cs#)O",
1149 array->ob_type,
1150 array->ob_descr->typecode,
1151 array->ob_item,
1152 array->ob_size * array->ob_descr->itemsize,
1153 dict);
1154 Py_DECREF(dict);
1155 return result;
1156}
1157
1158PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1159
1160static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001161array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001162{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001163 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001164 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001165 /* little buffer to hold items while swapping */
1166 char tmp[256]; /* 8 is probably enough -- but why skimp */
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001167 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001168
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001170 for (p = self->ob_item,
1171 q = self->ob_item + (self->ob_size - 1)*itemsize;
1172 p < q;
1173 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001174 /* memory areas guaranteed disjoint, so memcpy
1175 * is safe (& memmove may be slower).
1176 */
1177 memcpy(tmp, p, itemsize);
1178 memcpy(p, q, itemsize);
1179 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001180 }
1181 }
Tim Petersbb307342000-09-10 05:22:54 +00001182
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001183 Py_INCREF(Py_None);
1184 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001185}
Guido van Rossume77a7571993-11-03 15:01:26 +00001186
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001187PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001188"reverse()\n\
1189\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001190Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001191
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001192static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001193array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001194{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001196 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001197 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001198 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001199 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001200 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001202 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001203 return NULL;
1204 }
1205 if (n > 0) {
1206 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001207 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001208 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001209 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001210 size_t newbytes;
1211 /* Be careful here about overflow */
1212 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001213 (newbytes = newlength * itemsize) / itemsize !=
1214 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001215 goto nomem;
1216 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001217 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001218 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001219 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001220 return NULL;
1221 }
1222 self->ob_item = item;
1223 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001224 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001225 nread = fread(item + (self->ob_size - n) * itemsize,
1226 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001227 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001228 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001229 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001231 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001232 PyErr_SetString(PyExc_EOFError,
1233 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001234 return NULL;
1235 }
1236 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001237 Py_INCREF(Py_None);
1238 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001239}
1240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001242"fromfile(f, n)\n\
1243\n\
1244Read 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 +00001245array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001246
1247
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001248static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001249array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001250{
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001252
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001254 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001255 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001256 return NULL;
1257 }
1258 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001259 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1260 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001262 clearerr(fp);
1263 return NULL;
1264 }
1265 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001266 Py_INCREF(Py_None);
1267 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001268}
1269
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001270PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001271"tofile(f)\n\
1272\n\
1273Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001274write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001275
1276
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001277static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001278array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001279{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001280 Py_ssize_t n;
1281 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001282
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001283 if (!PyList_Check(list)) {
1284 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001285 return NULL;
1286 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001287 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001288 if (n > 0) {
1289 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001290 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001291 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001292 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001294 return NULL;
1295 }
1296 self->ob_item = item;
1297 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001298 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001299 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001300 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001301 if ((*self->ob_descr->setitem)(self,
1302 self->ob_size - n + i, v) != 0) {
1303 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001304 PyMem_RESIZE(item, char,
1305 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001306 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001307 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001308 return NULL;
1309 }
1310 }
1311 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 Py_INCREF(Py_None);
1313 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001314}
1315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001316PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001317"fromlist(list)\n\
1318\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001319Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001320
1321
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001322static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001323array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001324{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001326 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001327
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 if (list == NULL)
1329 return NULL;
1330 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001331 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001332 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001334 return NULL;
1335 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001336 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001337 }
1338 return list;
1339}
1340
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001341PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001342"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001343\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001344Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001345
1346
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001348array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001349{
1350 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001351 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001352 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001353 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001354 return NULL;
1355 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001356 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001357 "string length not a multiple of item size");
1358 return NULL;
1359 }
1360 n = n / itemsize;
1361 if (n > 0) {
1362 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001363 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001364 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001366 return NULL;
1367 }
1368 self->ob_item = item;
1369 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001370 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001371 memcpy(item + (self->ob_size - n) * itemsize,
1372 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001373 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001374 Py_INCREF(Py_None);
1375 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001376}
1377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001379"fromstring(string)\n\
1380\n\
1381Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001382values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001383
1384
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001385static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001386array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001387{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001388 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001389 self->ob_size * self->ob_descr->itemsize);
1390}
1391
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001392PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001393"tostring() -> string\n\
1394\n\
1395Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001396representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001397
Martin v. Löwis99866332002-03-01 10:27:01 +00001398
1399
1400#ifdef Py_USING_UNICODE
1401static PyObject *
1402array_fromunicode(arrayobject *self, PyObject *args)
1403{
1404 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001405 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001406
1407 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1408 return NULL;
1409 if (self->ob_descr->typecode != 'u') {
1410 PyErr_SetString(PyExc_ValueError,
1411 "fromunicode() may only be called on "
1412 "type 'u' arrays");
1413 return NULL;
1414 }
1415 if (n > 0) {
1416 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1417 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1418 if (item == NULL) {
1419 PyErr_NoMemory();
1420 return NULL;
1421 }
1422 self->ob_item = (char *) item;
1423 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001424 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001425 memcpy(item + self->ob_size - n,
1426 ustr, n * sizeof(Py_UNICODE));
1427 }
1428
1429 Py_INCREF(Py_None);
1430 return Py_None;
1431}
1432
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001433PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001434"fromunicode(ustr)\n\
1435\n\
1436Extends this array with data from the unicode string ustr.\n\
1437The array must be a type 'u' array; otherwise a ValueError\n\
1438is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001440
1441
1442static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001443array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001444{
Martin v. Löwis99866332002-03-01 10:27:01 +00001445 if (self->ob_descr->typecode != 'u') {
1446 PyErr_SetString(PyExc_ValueError,
1447 "tounicode() may only be called on type 'u' arrays");
1448 return NULL;
1449 }
1450 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1451}
1452
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001453PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001454"tounicode() -> unicode\n\
1455\n\
1456Convert the array to a unicode string. The array must be\n\
1457a type 'u' array; otherwise a ValueError is raised. Use\n\
1458array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001459an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001460
1461#endif /* Py_USING_UNICODE */
1462
1463
1464static PyObject *
1465array_get_typecode(arrayobject *a, void *closure)
1466{
1467 char tc = a->ob_descr->typecode;
1468 return PyString_FromStringAndSize(&tc, 1);
1469}
1470
1471static PyObject *
1472array_get_itemsize(arrayobject *a, void *closure)
1473{
1474 return PyInt_FromLong((long)a->ob_descr->itemsize);
1475}
1476
1477static PyGetSetDef array_getsets [] = {
1478 {"typecode", (getter) array_get_typecode, NULL,
1479 "the typecode character used to create the array"},
1480 {"itemsize", (getter) array_get_itemsize, NULL,
1481 "the size, in bytes, of one array item"},
1482 {NULL}
1483};
1484
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001485PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001486 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001487 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001488 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001489 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001490 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001491 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001492 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1493 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001494 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001495 count_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001496 {"__deepcopy__",(PyCFunction)array_copy, METH_NOARGS,
1497 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001498 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001499 extend_doc},
1500 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1501 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001502 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001503 fromlist_doc},
1504 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1505 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001506#ifdef Py_USING_UNICODE
1507 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1508 fromunicode_doc},
1509#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001510 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001511 index_doc},
1512 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1513 insert_doc},
1514 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1515 pop_doc},
1516 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1517 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001518 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1519 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001520 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001521 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001522 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001523 reverse_doc},
1524/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1525 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001526 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001527 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001528 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001529 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001530 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001531 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001532#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001533 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001534 tounicode_doc},
1535#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001536 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001537 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001538 {NULL, NULL} /* sentinel */
1539};
1540
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001541static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001542array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001543{
Martin v. Löwis99866332002-03-01 10:27:01 +00001544 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001545 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001546 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001547
Guido van Rossum778983b1993-02-19 15:55:02 +00001548 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001549 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001550 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001551 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001552 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001553 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001554
1555 if (typecode == 'c')
1556 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001557#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001558 else if (typecode == 'u')
1559 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001560#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001561 else
1562 v = array_tolist(a, NULL);
1563 t = PyObject_Repr(v);
1564 Py_XDECREF(v);
1565
1566 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001567 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001568 PyString_ConcatAndDel(&s, t);
1569 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001570 return s;
1571}
1572
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001573static PyObject*
1574array_subscr(arrayobject* self, PyObject* item)
1575{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001576 PyNumberMethods *nb = item->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001577 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001578 Py_ssize_t i = nb->nb_index(item);
1579 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001580 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001581 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001582 if (i < 0)
1583 i += self->ob_size;
1584 return array_item(self, i);
1585 }
1586 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001587 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001588 PyObject* result;
1589 arrayobject* ar;
1590 int itemsize = self->ob_descr->itemsize;
1591
1592 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1593 &start, &stop, &step, &slicelength) < 0) {
1594 return NULL;
1595 }
1596
1597 if (slicelength <= 0) {
1598 return newarrayobject(&Arraytype, 0, self->ob_descr);
1599 }
1600 else {
1601 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1602 if (!result) return NULL;
1603
1604 ar = (arrayobject*)result;
1605
1606 for (cur = start, i = 0; i < slicelength;
1607 cur += step, i++) {
1608 memcpy(ar->ob_item + i*itemsize,
1609 self->ob_item + cur*itemsize,
1610 itemsize);
1611 }
1612
1613 return result;
1614 }
1615 }
1616 else {
1617 PyErr_SetString(PyExc_TypeError,
1618 "list indices must be integers");
1619 return NULL;
1620 }
1621}
1622
1623static int
1624array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1625{
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001626 PyNumberMethods *nb = item->ob_type->tp_as_number;
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001627 if (nb != NULL && nb->nb_index != NULL) {
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001628 Py_ssize_t i = nb->nb_index(item);
1629 if (i==-1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001630 return -1;
1631 if (i < 0)
1632 i += self->ob_size;
1633 return array_ass_item(self, i, value);
1634 }
1635 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001636 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001637 int itemsize = self->ob_descr->itemsize;
1638
1639 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1640 &start, &stop, &step, &slicelength) < 0) {
1641 return -1;
1642 }
1643
1644 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1645 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1646 return array_ass_slice(self, start, stop, value);
1647
1648 if (value == NULL) {
1649 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001650 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001651
1652 if (slicelength <= 0)
1653 return 0;
1654
1655 if (step < 0) {
1656 stop = start + 1;
1657 start = stop + step*(slicelength - 1) - 1;
1658 step = -step;
1659 }
1660
Michael W. Hudson56796f62002-07-29 14:35:04 +00001661 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001662 cur += step, i++) {
1663 memmove(self->ob_item + (cur - i)*itemsize,
1664 self->ob_item + (cur + 1)*itemsize,
1665 (step - 1) * itemsize);
1666 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001667 extra = self->ob_size - (cur + 1);
1668 if (extra > 0) {
1669 memmove(self->ob_item + (cur - i)*itemsize,
1670 self->ob_item + (cur + 1)*itemsize,
1671 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001672 }
1673
1674 self->ob_size -= slicelength;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001675 self->ob_item = (char *)PyMem_REALLOC(self->ob_item,
1676 itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001677 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001678
1679 return 0;
1680 }
1681 else {
1682 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001683 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001684 arrayobject* av;
1685
1686 if (!array_Check(value)) {
1687 PyErr_Format(PyExc_TypeError,
1688 "must assign array (not \"%.200s\") to slice",
1689 value->ob_type->tp_name);
1690 return -1;
1691 }
1692
1693 av = (arrayobject*)value;
1694
1695 if (av->ob_size != slicelength) {
1696 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001697 "attempt to assign array of size %ld to extended slice of size %ld",
1698 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001699 return -1;
1700 }
1701
1702 if (!slicelength)
1703 return 0;
1704
1705 /* protect against a[::-1] = a */
1706 if (self == av) {
1707 value = array_slice(av, 0, av->ob_size);
1708 av = (arrayobject*)value;
1709 }
1710 else {
1711 Py_INCREF(value);
1712 }
1713
1714 for (cur = start, i = 0; i < slicelength;
1715 cur += step, i++) {
1716 memcpy(self->ob_item + cur*itemsize,
1717 av->ob_item + i*itemsize,
1718 itemsize);
1719 }
1720
1721 Py_DECREF(value);
1722
1723 return 0;
1724 }
1725 }
1726 else {
1727 PyErr_SetString(PyExc_TypeError,
1728 "list indices must be integers");
1729 return -1;
1730 }
1731}
1732
1733static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001734 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001735 (binaryfunc)array_subscr,
1736 (objobjargproc)array_ass_subscr
1737};
1738
Martin v. Löwis18e16552006-02-15 17:27:45 +00001739static Py_ssize_t
1740array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001741{
1742 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001743 PyErr_SetString(PyExc_SystemError,
1744 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001745 return -1;
1746 }
1747 *ptr = (void *)self->ob_item;
1748 return self->ob_size*self->ob_descr->itemsize;
1749}
1750
Martin v. Löwis18e16552006-02-15 17:27:45 +00001751static Py_ssize_t
1752array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001753{
1754 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001755 PyErr_SetString(PyExc_SystemError,
1756 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001757 return -1;
1758 }
1759 *ptr = (void *)self->ob_item;
1760 return self->ob_size*self->ob_descr->itemsize;
1761}
1762
Martin v. Löwis18e16552006-02-15 17:27:45 +00001763static Py_ssize_t
1764array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001765{
1766 if ( lenp )
1767 *lenp = self->ob_size*self->ob_descr->itemsize;
1768 return 1;
1769}
1770
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001771static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001772 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001773 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001774 (ssizeargfunc)array_repeat, /*sq_repeat*/
1775 (ssizeargfunc)array_item, /*sq_item*/
1776 (ssizessizeargfunc)array_slice, /*sq_slice*/
1777 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1778 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001779 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001780 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001781 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001782};
1783
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001784static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001785 (readbufferproc)array_buffer_getreadbuf,
1786 (writebufferproc)array_buffer_getwritebuf,
1787 (segcountproc)array_buffer_getsegcount,
Thomas Wouters0e3f5912006-08-11 14:57:12 +00001788 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001789};
1790
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001791static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001792array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001793{
1794 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001795 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001796 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001797
1798 if (!_PyArg_NoKeywords("array.array()", kwds))
1799 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001800
1801 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1802 return NULL;
1803
1804 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001805 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001806 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001807 it = PyObject_GetIter(initial);
1808 if (it == NULL)
1809 return NULL;
1810 /* We set initial to NULL so that the subsequent code
1811 will create an empty array of the appropriate type
1812 and afterwards we can use array_iter_extend to populate
1813 the array.
1814 */
1815 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001816 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001817 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1818 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001819 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001820 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001821
1822 if (initial == NULL || !(PyList_Check(initial)
1823 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001824 len = 0;
1825 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001826 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001827
1828 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001829 if (a == NULL)
1830 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001831
Guido van Rossum778983b1993-02-19 15:55:02 +00001832 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001833 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001834 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001835 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001836 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001837 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001838 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001839 return NULL;
1840 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001841 if (setarrayitem(a, i, v) != 0) {
1842 Py_DECREF(v);
1843 Py_DECREF(a);
1844 return NULL;
1845 }
1846 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001847 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001848 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001849 PyObject *t_initial, *v;
1850 t_initial = PyTuple_Pack(1, initial);
1851 if (t_initial == NULL) {
1852 Py_DECREF(a);
1853 return NULL;
1854 }
1855 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001856 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001857 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001858 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001859 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001860 return NULL;
1861 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001862 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001863#ifdef Py_USING_UNICODE
1864 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001865 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001866 if (n > 0) {
1867 arrayobject *self = (arrayobject *)a;
1868 char *item = self->ob_item;
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00001869 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001870 if (item == NULL) {
1871 PyErr_NoMemory();
1872 Py_DECREF(a);
1873 return NULL;
1874 }
1875 self->ob_item = item;
1876 self->ob_size = n / sizeof(Py_UNICODE);
1877 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001878 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001879 }
1880#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001881 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001882 if (it != NULL) {
1883 if (array_iter_extend((arrayobject *)a, it) == -1) {
1884 Py_DECREF(it);
1885 Py_DECREF(a);
1886 return NULL;
1887 }
1888 Py_DECREF(it);
1889 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001890 return a;
1891 }
1892 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001893 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001894 "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 +00001895 return NULL;
1896}
1897
Guido van Rossum778983b1993-02-19 15:55:02 +00001898
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001899PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001900"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001901an array of basic values: characters, integers, floating point\n\
1902numbers. Arrays are sequence types and behave very much like lists,\n\
1903except that the type of objects stored in them is constrained. The\n\
1904type is specified at object creation time by using a type code, which\n\
1905is a single character. The following type codes are defined:\n\
1906\n\
1907 Type code C Type Minimum size in bytes \n\
1908 'c' character 1 \n\
1909 'b' signed integer 1 \n\
1910 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001911 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001912 'h' signed integer 2 \n\
1913 'H' unsigned integer 2 \n\
1914 'i' signed integer 2 \n\
1915 'I' unsigned integer 2 \n\
1916 'l' signed integer 4 \n\
1917 'L' unsigned integer 4 \n\
1918 'f' floating point 4 \n\
1919 'd' floating point 8 \n\
1920\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001921The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001922\n\
1923array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001924");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001925
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001926PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001927"array(typecode [, initializer]) -> array\n\
1928\n\
1929Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001930initialized from the optional initializer value, which must be a list,\n\
1931string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001932\n\
1933Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001934the type of objects stored in them is constrained.\n\
1935\n\
1936Methods:\n\
1937\n\
1938append() -- append a new item to the end of the array\n\
1939buffer_info() -- return information giving the current memory info\n\
1940byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001941count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001942extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001943fromfile() -- read items from a file object\n\
1944fromlist() -- append items from the list\n\
1945fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001946index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001947insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001948pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001949read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001950remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001951reverse() -- reverse the order of the items in the array\n\
1952tofile() -- write all items to a file object\n\
1953tolist() -- return the array converted to an ordinary list\n\
1954tostring() -- return the array converted to a string\n\
1955write() -- DEPRECATED, use tofile()\n\
1956\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001957Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001958\n\
1959typecode -- the typecode character used to create the array\n\
1960itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001961");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001962
Raymond Hettinger625812f2003-01-07 01:58:52 +00001963static PyObject *array_iter(arrayobject *ao);
1964
Tim Peters0c322792002-07-17 16:49:03 +00001965static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001966 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001967 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001968 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001969 sizeof(arrayobject),
1970 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001971 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001972 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001973 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001974 0, /* tp_setattr */
1975 0, /* tp_compare */
1976 (reprfunc)array_repr, /* tp_repr */
Thomas Wouters477c8d52006-05-27 19:21:47 +00001977 0, /* tp_as_number*/
1978 &array_as_sequence, /* tp_as_sequence*/
1979 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001980 0, /* tp_hash */
1981 0, /* tp_call */
1982 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001983 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001984 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001985 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum3cf5b1e2006-07-27 21:53:35 +00001986 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001987 arraytype_doc, /* tp_doc */
1988 0, /* tp_traverse */
1989 0, /* tp_clear */
1990 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001991 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00001992 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00001993 0, /* tp_iternext */
1994 array_methods, /* tp_methods */
1995 0, /* tp_members */
1996 array_getsets, /* tp_getset */
1997 0, /* tp_base */
1998 0, /* tp_dict */
1999 0, /* tp_descr_get */
2000 0, /* tp_descr_set */
2001 0, /* tp_dictoffset */
2002 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002003 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002004 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002005 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002006};
2007
Raymond Hettinger625812f2003-01-07 01:58:52 +00002008
2009/*********************** Array Iterator **************************/
2010
2011typedef struct {
2012 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002013 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002014 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002015 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002016} arrayiterobject;
2017
2018static PyTypeObject PyArrayIter_Type;
2019
2020#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2021
2022static PyObject *
2023array_iter(arrayobject *ao)
2024{
2025 arrayiterobject *it;
2026
2027 if (!array_Check(ao)) {
2028 PyErr_BadInternalCall();
2029 return NULL;
2030 }
2031
2032 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2033 if (it == NULL)
2034 return NULL;
2035
2036 Py_INCREF(ao);
2037 it->ao = ao;
2038 it->index = 0;
2039 it->getitem = ao->ob_descr->getitem;
2040 PyObject_GC_Track(it);
2041 return (PyObject *)it;
2042}
2043
2044static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002045arrayiter_next(arrayiterobject *it)
2046{
2047 assert(PyArrayIter_Check(it));
2048 if (it->index < it->ao->ob_size)
2049 return (*it->getitem)(it->ao, it->index++);
2050 return NULL;
2051}
2052
2053static void
2054arrayiter_dealloc(arrayiterobject *it)
2055{
2056 PyObject_GC_UnTrack(it);
2057 Py_XDECREF(it->ao);
2058 PyObject_GC_Del(it);
2059}
2060
2061static int
2062arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2063{
Thomas Wouters49fd7fa2006-04-21 10:40:58 +00002064 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002065 return 0;
2066}
2067
2068static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002069 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002070 0, /* ob_size */
2071 "arrayiterator", /* tp_name */
2072 sizeof(arrayiterobject), /* tp_basicsize */
2073 0, /* tp_itemsize */
2074 /* methods */
2075 (destructor)arrayiter_dealloc, /* tp_dealloc */
2076 0, /* tp_print */
2077 0, /* tp_getattr */
2078 0, /* tp_setattr */
2079 0, /* tp_compare */
2080 0, /* tp_repr */
2081 0, /* tp_as_number */
2082 0, /* tp_as_sequence */
2083 0, /* tp_as_mapping */
2084 0, /* tp_hash */
2085 0, /* tp_call */
2086 0, /* tp_str */
2087 PyObject_GenericGetAttr, /* tp_getattro */
2088 0, /* tp_setattro */
2089 0, /* tp_as_buffer */
2090 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2091 0, /* tp_doc */
2092 (traverseproc)arrayiter_traverse, /* tp_traverse */
2093 0, /* tp_clear */
2094 0, /* tp_richcompare */
2095 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002096 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002097 (iternextfunc)arrayiter_next, /* tp_iternext */
2098 0, /* tp_methods */
2099};
2100
2101
2102/*********************** Install Module **************************/
2103
Martin v. Löwis99866332002-03-01 10:27:01 +00002104/* No functions in array module. */
2105static PyMethodDef a_methods[] = {
2106 {NULL, NULL, 0, NULL} /* Sentinel */
2107};
2108
2109
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002110PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002111initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002112{
Fred Drakef4e34842002-04-01 03:45:06 +00002113 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002114
Guido van Rossum50e9fb92006-08-17 05:42:55 +00002115 if (PyType_Ready(&Arraytype) < 0)
2116 return;
Jason Tishler84375702003-02-10 20:45:47 +00002117 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002118 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002119 if (m == NULL)
2120 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002121
2122 Py_INCREF((PyObject *)&Arraytype);
2123 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2124 Py_INCREF((PyObject *)&Arraytype);
2125 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002126 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002127}