blob: eafea988c9674b8c7f3fa9eb2ee17ce359d040e1 [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 */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +000013#ifdef HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Martin v. Löwis0e8bd7e2006-06-10 12:23:46 +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) {
Neal Norwitz92a6be42006-04-03 04:46:28 +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) {
Martin v. Löwis9c042572008-02-15 19:11:46 +0000442 _Py_ForgetReference(op);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000443 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000444 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000445 }
446 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000448 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000449 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000450 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000451}
452
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000453static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000454getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000455{
456 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000457 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000458 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000459 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000460 return (*ap->ob_descr->getitem)(ap, i);
461}
462
463static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000464ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000465{
Guido van Rossum778983b1993-02-19 15:55:02 +0000466 char *items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000467 Py_ssize_t n = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000468 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000469 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000470 return -1;
471 }
472 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
473 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000474
475 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000476 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000477 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000478 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000479 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000480 if (where < 0)
481 where = 0;
482 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000483 if (where > n)
484 where = n;
485 /* appends don't need to call memmove() */
486 if (where != n)
487 memmove(items + (where+1)*self->ob_descr->itemsize,
488 items + where*self->ob_descr->itemsize,
489 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000490 return (*self->ob_descr->setitem)(self, where, v);
491}
492
Guido van Rossum778983b1993-02-19 15:55:02 +0000493/* Methods */
494
495static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000496array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000497{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000498 if (op->weakreflist != NULL)
499 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000500 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000501 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000502 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000503}
504
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000505static PyObject *
506array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000507{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000508 arrayobject *va, *wa;
509 PyObject *vi = NULL;
510 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000511 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000512 PyObject *res;
513
Martin v. Löwis99866332002-03-01 10:27:01 +0000514 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000515 Py_INCREF(Py_NotImplemented);
516 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000517 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000518
519 va = (arrayobject *)v;
520 wa = (arrayobject *)w;
521
522 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
523 /* Shortcut: if the lengths differ, the arrays differ */
524 if (op == Py_EQ)
525 res = Py_False;
526 else
527 res = Py_True;
528 Py_INCREF(res);
529 return res;
530 }
531
532 /* Search for the first index where items are different */
533 k = 1;
534 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
535 vi = getarrayitem(v, i);
536 wi = getarrayitem(w, i);
537 if (vi == NULL || wi == NULL) {
538 Py_XDECREF(vi);
539 Py_XDECREF(wi);
540 return NULL;
541 }
542 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
543 if (k == 0)
544 break; /* Keeping vi and wi alive! */
545 Py_DECREF(vi);
546 Py_DECREF(wi);
547 if (k < 0)
548 return NULL;
549 }
550
551 if (k) {
552 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000553 Py_ssize_t vs = va->ob_size;
554 Py_ssize_t ws = wa->ob_size;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000555 int cmp;
556 switch (op) {
557 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000558 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000559 case Py_EQ: cmp = vs == ws; break;
560 case Py_NE: cmp = vs != ws; break;
561 case Py_GT: cmp = vs > ws; break;
562 case Py_GE: cmp = vs >= ws; break;
563 default: return NULL; /* cannot happen */
564 }
565 if (cmp)
566 res = Py_True;
567 else
568 res = Py_False;
569 Py_INCREF(res);
570 return res;
571 }
572
573 /* We have an item that differs. First, shortcuts for EQ/NE */
574 if (op == Py_EQ) {
575 Py_INCREF(Py_False);
576 res = Py_False;
577 }
578 else if (op == Py_NE) {
579 Py_INCREF(Py_True);
580 res = Py_True;
581 }
582 else {
583 /* Compare the final item again using the proper operator */
584 res = PyObject_RichCompare(vi, wi, op);
585 }
586 Py_DECREF(vi);
587 Py_DECREF(wi);
588 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000589}
590
Martin v. Löwis18e16552006-02-15 17:27:45 +0000591static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000592array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000593{
594 return a->ob_size;
595}
596
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000597static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000598array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000599{
600 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000601 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000602 return NULL;
603 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000604 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000605}
606
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000607static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000608array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000609{
610 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000611 if (ilow < 0)
612 ilow = 0;
613 else if (ilow > a->ob_size)
614 ilow = a->ob_size;
615 if (ihigh < 0)
616 ihigh = 0;
617 if (ihigh < ilow)
618 ihigh = ilow;
619 else if (ihigh > a->ob_size)
620 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000621 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000622 if (np == NULL)
623 return NULL;
624 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
625 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000626 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000627}
628
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000629static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000630array_copy(arrayobject *a, PyObject *unused)
631{
632 return array_slice(a, 0, a->ob_size);
633}
634
635PyDoc_STRVAR(copy_doc,
636"copy(array)\n\
637\n\
638 Return a copy of the array.");
639
640static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000641array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000642{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000643 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000644 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000645 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000646 PyErr_Format(PyExc_TypeError,
647 "can only append array (not \"%.200s\") to array",
648 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000649 return NULL;
650 }
651#define b ((arrayobject *)bb)
652 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000653 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000654 return NULL;
655 }
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000656 if (a->ob_size > PY_SSIZE_T_MAX - b->ob_size) {
657 return PyErr_NoMemory();
658 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000659 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000660 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000661 if (np == NULL) {
662 return NULL;
663 }
664 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
665 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000666 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000668#undef b
669}
670
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000671static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000672array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000673{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000674 Py_ssize_t i;
675 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000676 arrayobject *np;
677 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000678 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000679 if (n < 0)
680 n = 0;
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000681 if ((a->ob_size != 0) && (n > PY_SSIZE_T_MAX / a->ob_size)) {
682 return PyErr_NoMemory();
683 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000684 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000685 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000686 if (np == NULL)
687 return NULL;
688 p = np->ob_item;
689 nbytes = a->ob_size * a->ob_descr->itemsize;
690 for (i = 0; i < n; i++) {
691 memcpy(p, a->ob_item, nbytes);
692 p += nbytes;
693 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000694 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000695}
696
697static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000698array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000699{
700 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000701 Py_ssize_t n; /* Size of replacement array */
702 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000703#define b ((arrayobject *)v)
704 if (v == NULL)
705 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000706 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000707 n = b->ob_size;
708 if (a == b) {
709 /* Special case "a[i:j] = a" -- copy b first */
710 int ret;
711 v = array_slice(b, 0, n);
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +0000712 if (!v)
713 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000714 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000715 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000716 return ret;
717 }
718 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000719 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000720 return -1;
721 }
722 }
723 else {
Fred Drake137507e2000-06-01 02:02:46 +0000724 PyErr_Format(PyExc_TypeError,
725 "can only assign array (not \"%.200s\") to array slice",
726 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000727 return -1;
728 }
729 if (ilow < 0)
730 ilow = 0;
731 else if (ilow > a->ob_size)
732 ilow = a->ob_size;
733 if (ihigh < 0)
734 ihigh = 0;
735 if (ihigh < ilow)
736 ihigh = ilow;
737 else if (ihigh > a->ob_size)
738 ihigh = a->ob_size;
739 item = a->ob_item;
740 d = n - (ihigh-ilow);
741 if (d < 0) { /* Delete -d items */
742 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
743 item + ihigh*a->ob_descr->itemsize,
744 (a->ob_size-ihigh)*a->ob_descr->itemsize);
745 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000746 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000747 /* Can't fail */
748 a->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000749 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000750 }
751 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000752 PyMem_RESIZE(item, char,
753 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000754 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000755 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000756 return -1;
757 }
758 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
759 item + ihigh*a->ob_descr->itemsize,
760 (a->ob_size-ihigh)*a->ob_descr->itemsize);
761 a->ob_item = item;
762 a->ob_size += d;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000763 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000764 }
765 if (n > 0)
766 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
767 n*b->ob_descr->itemsize);
768 return 0;
769#undef b
770}
771
772static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000773array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000774{
775 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000776 PyErr_SetString(PyExc_IndexError,
777 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000778 return -1;
779 }
780 if (v == NULL)
781 return array_ass_slice(a, i, i+1, v);
782 return (*a->ob_descr->setitem)(a, i, v);
783}
784
785static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000786setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000787{
Martin v. Löwis99866332002-03-01 10:27:01 +0000788 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000789 return array_ass_item((arrayobject *)a, i, v);
790}
791
Martin v. Löwis99866332002-03-01 10:27:01 +0000792static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000793array_iter_extend(arrayobject *self, PyObject *bb)
794{
795 PyObject *it, *v;
796
797 it = PyObject_GetIter(bb);
798 if (it == NULL)
799 return -1;
800
801 while ((v = PyIter_Next(it)) != NULL) {
802 if (ins1(self, (int) self->ob_size, v) != 0) {
803 Py_DECREF(v);
804 Py_DECREF(it);
805 return -1;
806 }
807 Py_DECREF(v);
808 }
809 Py_DECREF(it);
810 if (PyErr_Occurred())
811 return -1;
812 return 0;
813}
814
815static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000816array_do_extend(arrayobject *self, PyObject *bb)
817{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000818 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000819
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000820 if (!array_Check(bb))
821 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000822#define b ((arrayobject *)bb)
823 if (self->ob_descr != b->ob_descr) {
824 PyErr_SetString(PyExc_TypeError,
825 "can only extend with array of same kind");
826 return -1;
827 }
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000828 if ((self->ob_size > PY_SSIZE_T_MAX - b->ob_size) ||
829 ((self->ob_size + b->ob_size) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
830 PyErr_NoMemory();
831 return -1;
832 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000833 size = self->ob_size + b->ob_size;
834 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
835 if (self->ob_item == NULL) {
836 PyObject_Del(self);
837 PyErr_NoMemory();
838 return -1;
839 }
840 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
841 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000842 self->ob_size = size;
843 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000844
845 return 0;
846#undef b
847}
848
849static PyObject *
850array_inplace_concat(arrayobject *self, PyObject *bb)
851{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000852 if (!array_Check(bb)) {
853 PyErr_Format(PyExc_TypeError,
854 "can only extend array with array (not \"%.200s\")",
855 bb->ob_type->tp_name);
856 return NULL;
857 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000858 if (array_do_extend(self, bb) == -1)
859 return NULL;
860 Py_INCREF(self);
861 return (PyObject *)self;
862}
863
864static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000865array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000866{
867 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000868 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000869
870 if (self->ob_size > 0) {
871 if (n < 0)
872 n = 0;
873 items = self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000874 if ((self->ob_descr->itemsize != 0) &&
875 (self->ob_size > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
876 return PyErr_NoMemory();
877 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000878 size = self->ob_size * self->ob_descr->itemsize;
879 if (n == 0) {
880 PyMem_FREE(items);
881 self->ob_item = NULL;
882 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000883 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000884 }
885 else {
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000886 if (size > PY_SSIZE_T_MAX / n) {
887 return PyErr_NoMemory();
888 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000889 PyMem_Resize(items, char, n * size);
890 if (items == NULL)
891 return PyErr_NoMemory();
892 p = items;
893 for (i = 1; i < n; i++) {
894 p += size;
895 memcpy(p, items, size);
896 }
897 self->ob_item = items;
898 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000899 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000900 }
901 }
902 Py_INCREF(self);
903 return (PyObject *)self;
904}
905
906
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000907static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000908ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000909{
910 if (ins1(self, where, v) != 0)
911 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000912 Py_INCREF(Py_None);
913 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000914}
915
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000916static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000917array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000919 Py_ssize_t count = 0;
920 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922 for (i = 0; i < self->ob_size; i++) {
923 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000924 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000926 if (cmp > 0)
927 count++;
928 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000929 return NULL;
930 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000931 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000932}
933
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000934PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000935"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000936\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000937Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000938
939static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000940array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000941{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000942 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000944 for (i = 0; i < self->ob_size; i++) {
945 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000946 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
947 Py_DECREF(selfi);
948 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000949 return PyInt_FromLong((long)i);
950 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000951 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000952 return NULL;
953 }
954 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
955 return NULL;
956}
957
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000958PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000959"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000960\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000961Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000962
Raymond Hettinger625812f2003-01-07 01:58:52 +0000963static int
964array_contains(arrayobject *self, PyObject *v)
965{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000966 Py_ssize_t i;
967 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000968
969 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
970 PyObject *selfi = getarrayitem((PyObject *)self, i);
971 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
972 Py_DECREF(selfi);
973 }
974 return cmp;
975}
976
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000977static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000978array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979{
980 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982 for (i = 0; i < self->ob_size; i++) {
983 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000984 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
985 Py_DECREF(selfi);
986 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000987 if (array_ass_slice(self, i, i+1,
988 (PyObject *)NULL) != 0)
989 return NULL;
990 Py_INCREF(Py_None);
991 return Py_None;
992 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000993 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000994 return NULL;
995 }
996 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
997 return NULL;
998}
999
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001000PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001001"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001002\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001003Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001004
1005static PyObject *
1006array_pop(arrayobject *self, PyObject *args)
1007{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001008 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001009 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001010 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001011 return NULL;
1012 if (self->ob_size == 0) {
1013 /* Special-case most common failure cause */
1014 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1015 return NULL;
1016 }
1017 if (i < 0)
1018 i += self->ob_size;
1019 if (i < 0 || i >= self->ob_size) {
1020 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1021 return NULL;
1022 }
1023 v = getarrayitem((PyObject *)self,i);
1024 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1025 Py_DECREF(v);
1026 return NULL;
1027 }
1028 return v;
1029}
1030
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001031PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001032"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001033\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001034Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001035
1036static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001037array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001038{
Martin v. Löwis99866332002-03-01 10:27:01 +00001039 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001040 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001041 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001042 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001043}
1044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001045PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001046"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001047\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001048 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001049
1050static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001051array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001052{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001053 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001054 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001055 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001056 return NULL;
1057 return ins(self, i, v);
1058}
1059
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001060PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001061"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001062\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001063Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001064
1065
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001066static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001067array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001068{
Tim Peters077a11d2000-09-16 22:31:29 +00001069 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001070 retval = PyTuple_New(2);
1071 if (!retval)
1072 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001073
1074 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1075 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1076
1077 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001078}
1079
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001080PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001081"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001082\n\
1083Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001084the length in items of the buffer used to hold array's contents\n\
1085The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001086the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001087
1088
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001089static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001090array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001091{
Guido van Rossum778983b1993-02-19 15:55:02 +00001092 return ins(self, (int) self->ob_size, v);
1093}
1094
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001095PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001096"append(x)\n\
1097\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001098Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001099
1100
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001101static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001102array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001103{
1104 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001105 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001106
Guido van Rossum778983b1993-02-19 15:55:02 +00001107 switch (self->ob_descr->itemsize) {
1108 case 1:
1109 break;
1110 case 2:
1111 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1112 char p0 = p[0];
1113 p[0] = p[1];
1114 p[1] = p0;
1115 }
1116 break;
1117 case 4:
1118 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1119 char p0 = p[0];
1120 char p1 = p[1];
1121 p[0] = p[3];
1122 p[1] = p[2];
1123 p[2] = p1;
1124 p[3] = p0;
1125 }
1126 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001127 case 8:
1128 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1129 char p0 = p[0];
1130 char p1 = p[1];
1131 char p2 = p[2];
1132 char p3 = p[3];
1133 p[0] = p[7];
1134 p[1] = p[6];
1135 p[2] = p[5];
1136 p[3] = p[4];
1137 p[4] = p3;
1138 p[5] = p2;
1139 p[6] = p1;
1140 p[7] = p0;
1141 }
1142 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001143 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001144 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001145 "don't know how to byteswap this array type");
1146 return NULL;
1147 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148 Py_INCREF(Py_None);
1149 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001150}
1151
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001152PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001153"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001154\n\
Fred Drakebf272981999-12-03 17:15:30 +00001155Byteswap 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 +000011564, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001157
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001158static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001159array_reduce(arrayobject *array)
1160{
1161 PyObject *dict, *result;
1162
1163 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1164 if (dict == NULL) {
1165 PyErr_Clear();
1166 dict = Py_None;
1167 Py_INCREF(dict);
1168 }
Raymond Hettinger4bbcb642007-04-02 17:03:46 +00001169 if (array->ob_size > 0) {
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001170 if (array->ob_descr->itemsize
1171 > PY_SSIZE_T_MAX / array->ob_size) {
1172 return PyErr_NoMemory();
1173 }
Raymond Hettinger4bbcb642007-04-02 17:03:46 +00001174 result = Py_BuildValue("O(cs#)O",
1175 array->ob_type,
1176 array->ob_descr->typecode,
1177 array->ob_item,
1178 array->ob_size * array->ob_descr->itemsize,
1179 dict);
1180 } else {
1181 result = Py_BuildValue("O(c)O",
1182 array->ob_type,
1183 array->ob_descr->typecode,
1184 dict);
1185 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001186 Py_DECREF(dict);
1187 return result;
1188}
1189
1190PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1191
1192static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001193array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001194{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001195 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001196 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001197 /* little buffer to hold items while swapping */
1198 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001199 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001200
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001202 for (p = self->ob_item,
1203 q = self->ob_item + (self->ob_size - 1)*itemsize;
1204 p < q;
1205 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001206 /* memory areas guaranteed disjoint, so memcpy
1207 * is safe (& memmove may be slower).
1208 */
1209 memcpy(tmp, p, itemsize);
1210 memcpy(p, q, itemsize);
1211 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001212 }
1213 }
Tim Petersbb307342000-09-10 05:22:54 +00001214
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001215 Py_INCREF(Py_None);
1216 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001217}
Guido van Rossume77a7571993-11-03 15:01:26 +00001218
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001219PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001220"reverse()\n\
1221\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001222Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001223
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001224static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001225array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001226{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001227 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001228 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001230 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001231 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001232 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001233 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001234 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001235 return NULL;
1236 }
1237 if (n > 0) {
1238 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001239 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001240 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001241 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001242 size_t newbytes;
1243 /* Be careful here about overflow */
1244 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001245 (newbytes = newlength * itemsize) / itemsize !=
1246 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001247 goto nomem;
1248 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001249 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001250 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001251 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001252 return NULL;
1253 }
1254 self->ob_item = item;
1255 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001256 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001257 nread = fread(item + (self->ob_size - n) * itemsize,
1258 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001259 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001260 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001262 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001263 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264 PyErr_SetString(PyExc_EOFError,
1265 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001266 return NULL;
1267 }
1268 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001269 Py_INCREF(Py_None);
1270 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001271}
1272
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001273PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001274"fromfile(f, n)\n\
1275\n\
1276Read 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 +00001277array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001278
1279
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001280static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001281array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001282{
Guido van Rossum778983b1993-02-19 15:55:02 +00001283 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001284
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001285 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001286 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001287 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001288 return NULL;
1289 }
1290 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001291 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1292 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001294 clearerr(fp);
1295 return NULL;
1296 }
1297 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001298 Py_INCREF(Py_None);
1299 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001300}
1301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001302PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001303"tofile(f)\n\
1304\n\
1305Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001306write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001307
1308
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001309static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001310array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001311{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001312 Py_ssize_t n;
1313 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001314
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001315 if (!PyList_Check(list)) {
1316 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001317 return NULL;
1318 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001319 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001320 if (n > 0) {
1321 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001322 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001323 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001324 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001326 return NULL;
1327 }
1328 self->ob_item = item;
1329 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001330 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001331 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001332 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001333 if ((*self->ob_descr->setitem)(self,
1334 self->ob_size - n + i, v) != 0) {
1335 self->ob_size -= n;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001336 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1337 return PyErr_NoMemory();
1338 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001339 PyMem_RESIZE(item, char,
1340 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001341 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001342 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 return NULL;
1344 }
1345 }
1346 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347 Py_INCREF(Py_None);
1348 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001349}
1350
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001351PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001352"fromlist(list)\n\
1353\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001354Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001355
1356
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001357static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001358array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001359{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001360 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001361 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001362
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 if (list == NULL)
1364 return NULL;
1365 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001366 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001367 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001368 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001369 return NULL;
1370 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001371 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001372 }
1373 return list;
1374}
1375
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001376PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001377"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001378\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001379Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001380
1381
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001382static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001383array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001384{
1385 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001386 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001387 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001388 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001389 return NULL;
1390 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001391 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001392 "string length not a multiple of item size");
1393 return NULL;
1394 }
1395 n = n / itemsize;
1396 if (n > 0) {
1397 char *item = self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001398 if ((n > PY_SSIZE_T_MAX - self->ob_size) ||
1399 ((self->ob_size + n) > PY_SSIZE_T_MAX / itemsize)) {
1400 return PyErr_NoMemory();
1401 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001402 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001403 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001404 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001405 return NULL;
1406 }
1407 self->ob_item = item;
1408 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001409 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001410 memcpy(item + (self->ob_size - n) * itemsize,
1411 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001412 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001413 Py_INCREF(Py_None);
1414 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001415}
1416
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001417PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001418"fromstring(string)\n\
1419\n\
1420Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001421values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001422
1423
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001424static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001425array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001426{
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001427 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1428 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001429 self->ob_size * self->ob_descr->itemsize);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001430 } else {
1431 return PyErr_NoMemory();
1432 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001433}
1434
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001435PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001436"tostring() -> string\n\
1437\n\
1438Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001439representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001440
Martin v. Löwis99866332002-03-01 10:27:01 +00001441
1442
1443#ifdef Py_USING_UNICODE
1444static PyObject *
1445array_fromunicode(arrayobject *self, PyObject *args)
1446{
1447 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001448 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001449
1450 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1451 return NULL;
1452 if (self->ob_descr->typecode != 'u') {
1453 PyErr_SetString(PyExc_ValueError,
1454 "fromunicode() may only be called on "
1455 "type 'u' arrays");
1456 return NULL;
1457 }
1458 if (n > 0) {
1459 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001460 if (self->ob_size > PY_SSIZE_T_MAX - n) {
1461 return PyErr_NoMemory();
1462 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001463 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1464 if (item == NULL) {
1465 PyErr_NoMemory();
1466 return NULL;
1467 }
1468 self->ob_item = (char *) item;
1469 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001470 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001471 memcpy(item + self->ob_size - n,
1472 ustr, n * sizeof(Py_UNICODE));
1473 }
1474
1475 Py_INCREF(Py_None);
1476 return Py_None;
1477}
1478
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001479PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001480"fromunicode(ustr)\n\
1481\n\
1482Extends this array with data from the unicode string ustr.\n\
1483The array must be a type 'u' array; otherwise a ValueError\n\
1484is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001485append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001486
1487
1488static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001489array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001490{
Martin v. Löwis99866332002-03-01 10:27:01 +00001491 if (self->ob_descr->typecode != 'u') {
1492 PyErr_SetString(PyExc_ValueError,
1493 "tounicode() may only be called on type 'u' arrays");
1494 return NULL;
1495 }
1496 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1497}
1498
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001499PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001500"tounicode() -> unicode\n\
1501\n\
1502Convert the array to a unicode string. The array must be\n\
1503a type 'u' array; otherwise a ValueError is raised. Use\n\
1504array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001505an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001506
1507#endif /* Py_USING_UNICODE */
1508
1509
1510static PyObject *
1511array_get_typecode(arrayobject *a, void *closure)
1512{
1513 char tc = a->ob_descr->typecode;
1514 return PyString_FromStringAndSize(&tc, 1);
1515}
1516
1517static PyObject *
1518array_get_itemsize(arrayobject *a, void *closure)
1519{
1520 return PyInt_FromLong((long)a->ob_descr->itemsize);
1521}
1522
1523static PyGetSetDef array_getsets [] = {
1524 {"typecode", (getter) array_get_typecode, NULL,
1525 "the typecode character used to create the array"},
1526 {"itemsize", (getter) array_get_itemsize, NULL,
1527 "the size, in bytes, of one array item"},
1528 {NULL}
1529};
1530
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001531PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001532 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001533 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001534 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001535 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001536 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001537 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001538 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1539 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001540 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001541 count_doc},
Thomas Wouters04e82042006-12-29 14:42:17 +00001542 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001543 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001544 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001545 extend_doc},
1546 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1547 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001548 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001549 fromlist_doc},
1550 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1551 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001552#ifdef Py_USING_UNICODE
1553 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1554 fromunicode_doc},
1555#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001556 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001557 index_doc},
1558 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1559 insert_doc},
1560 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1561 pop_doc},
1562 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1563 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001564 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1565 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001566 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001567 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001568 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001569 reverse_doc},
1570/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1571 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001572 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001573 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001574 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001575 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001576 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001577 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001578#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001579 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001580 tounicode_doc},
1581#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001582 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001583 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001584 {NULL, NULL} /* sentinel */
1585};
1586
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001587static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001588array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001589{
Martin v. Löwis99866332002-03-01 10:27:01 +00001590 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001591 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001592 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001593
Guido van Rossum778983b1993-02-19 15:55:02 +00001594 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001595 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001596 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001597 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001598 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001599 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001600
1601 if (typecode == 'c')
1602 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001603#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001604 else if (typecode == 'u')
1605 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001606#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001607 else
1608 v = array_tolist(a, NULL);
1609 t = PyObject_Repr(v);
1610 Py_XDECREF(v);
1611
1612 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001613 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001614 PyString_ConcatAndDel(&s, t);
1615 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001616 return s;
1617}
1618
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001619static PyObject*
1620array_subscr(arrayobject* self, PyObject* item)
1621{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001622 if (PyIndex_Check(item)) {
1623 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001624 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001625 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001626 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001627 if (i < 0)
1628 i += self->ob_size;
1629 return array_item(self, i);
1630 }
1631 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001632 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001633 PyObject* result;
1634 arrayobject* ar;
1635 int itemsize = self->ob_descr->itemsize;
1636
1637 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1638 &start, &stop, &step, &slicelength) < 0) {
1639 return NULL;
1640 }
1641
1642 if (slicelength <= 0) {
1643 return newarrayobject(&Arraytype, 0, self->ob_descr);
1644 }
1645 else {
1646 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1647 if (!result) return NULL;
1648
1649 ar = (arrayobject*)result;
1650
1651 for (cur = start, i = 0; i < slicelength;
1652 cur += step, i++) {
1653 memcpy(ar->ob_item + i*itemsize,
1654 self->ob_item + cur*itemsize,
1655 itemsize);
1656 }
1657
1658 return result;
1659 }
1660 }
1661 else {
1662 PyErr_SetString(PyExc_TypeError,
1663 "list indices must be integers");
1664 return NULL;
1665 }
1666}
1667
1668static int
1669array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1670{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001671 if (PyIndex_Check(item)) {
1672 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001673 if (i==-1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001674 return -1;
1675 if (i < 0)
1676 i += self->ob_size;
1677 return array_ass_item(self, i, value);
1678 }
1679 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001680 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001681 int itemsize = self->ob_descr->itemsize;
1682
1683 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1684 &start, &stop, &step, &slicelength) < 0) {
1685 return -1;
1686 }
1687
1688 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1689 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1690 return array_ass_slice(self, start, stop, value);
1691
1692 if (value == NULL) {
1693 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001694 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001695
1696 if (slicelength <= 0)
1697 return 0;
1698
1699 if (step < 0) {
1700 stop = start + 1;
1701 start = stop + step*(slicelength - 1) - 1;
1702 step = -step;
1703 }
1704
Michael W. Hudson56796f62002-07-29 14:35:04 +00001705 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001706 cur += step, i++) {
1707 memmove(self->ob_item + (cur - i)*itemsize,
1708 self->ob_item + (cur + 1)*itemsize,
1709 (step - 1) * itemsize);
1710 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001711 extra = self->ob_size - (cur + 1);
1712 if (extra > 0) {
1713 memmove(self->ob_item + (cur - i)*itemsize,
1714 self->ob_item + (cur + 1)*itemsize,
1715 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001716 }
1717
1718 self->ob_size -= slicelength;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001719 self->ob_item = (char *)PyMem_REALLOC(self->ob_item,
1720 itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001721 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001722
1723 return 0;
1724 }
1725 else {
1726 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001727 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001728 arrayobject* av;
1729
1730 if (!array_Check(value)) {
1731 PyErr_Format(PyExc_TypeError,
1732 "must assign array (not \"%.200s\") to slice",
1733 value->ob_type->tp_name);
1734 return -1;
1735 }
1736
1737 av = (arrayobject*)value;
1738
1739 if (av->ob_size != slicelength) {
1740 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001741 "attempt to assign array of size %ld to extended slice of size %ld",
1742 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001743 return -1;
1744 }
1745
1746 if (!slicelength)
1747 return 0;
1748
1749 /* protect against a[::-1] = a */
1750 if (self == av) {
1751 value = array_slice(av, 0, av->ob_size);
1752 av = (arrayobject*)value;
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +00001753 if (!av)
1754 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001755 }
1756 else {
1757 Py_INCREF(value);
1758 }
1759
1760 for (cur = start, i = 0; i < slicelength;
1761 cur += step, i++) {
1762 memcpy(self->ob_item + cur*itemsize,
1763 av->ob_item + i*itemsize,
1764 itemsize);
1765 }
1766
1767 Py_DECREF(value);
1768
1769 return 0;
1770 }
1771 }
1772 else {
1773 PyErr_SetString(PyExc_TypeError,
1774 "list indices must be integers");
1775 return -1;
1776 }
1777}
1778
1779static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001780 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001781 (binaryfunc)array_subscr,
1782 (objobjargproc)array_ass_subscr
1783};
1784
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001785static const void *emptybuf = "";
1786
Martin v. Löwis18e16552006-02-15 17:27:45 +00001787static Py_ssize_t
1788array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001789{
1790 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001791 PyErr_SetString(PyExc_SystemError,
1792 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001793 return -1;
1794 }
1795 *ptr = (void *)self->ob_item;
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001796 if (*ptr == NULL)
1797 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001798 return self->ob_size*self->ob_descr->itemsize;
1799}
1800
Martin v. Löwis18e16552006-02-15 17:27:45 +00001801static Py_ssize_t
1802array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001803{
1804 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001805 PyErr_SetString(PyExc_SystemError,
1806 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001807 return -1;
1808 }
1809 *ptr = (void *)self->ob_item;
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001810 if (*ptr == NULL)
1811 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001812 return self->ob_size*self->ob_descr->itemsize;
1813}
1814
Martin v. Löwis18e16552006-02-15 17:27:45 +00001815static Py_ssize_t
1816array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001817{
1818 if ( lenp )
1819 *lenp = self->ob_size*self->ob_descr->itemsize;
1820 return 1;
1821}
1822
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001823static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001824 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001825 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826 (ssizeargfunc)array_repeat, /*sq_repeat*/
1827 (ssizeargfunc)array_item, /*sq_item*/
1828 (ssizessizeargfunc)array_slice, /*sq_slice*/
1829 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1830 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001831 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001832 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001833 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001834};
1835
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001836static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001837 (readbufferproc)array_buffer_getreadbuf,
1838 (writebufferproc)array_buffer_getwritebuf,
1839 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001840 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001841};
1842
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001843static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001844array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001845{
1846 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001847 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001848 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001849
Georg Brandl8e932e72007-01-21 10:28:56 +00001850 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001851 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001852
1853 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1854 return NULL;
1855
1856 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001857 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001858 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001859 it = PyObject_GetIter(initial);
1860 if (it == NULL)
1861 return NULL;
1862 /* We set initial to NULL so that the subsequent code
1863 will create an empty array of the appropriate type
1864 and afterwards we can use array_iter_extend to populate
1865 the array.
1866 */
1867 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001868 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001869 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1870 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001871 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001872 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001873
1874 if (initial == NULL || !(PyList_Check(initial)
1875 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001876 len = 0;
1877 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001878 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001879
1880 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001881 if (a == NULL)
1882 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001883
Guido van Rossum778983b1993-02-19 15:55:02 +00001884 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001885 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001886 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001887 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001888 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001889 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001890 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001891 return NULL;
1892 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001893 if (setarrayitem(a, i, v) != 0) {
1894 Py_DECREF(v);
1895 Py_DECREF(a);
1896 return NULL;
1897 }
1898 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001899 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001900 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001901 PyObject *t_initial, *v;
1902 t_initial = PyTuple_Pack(1, initial);
1903 if (t_initial == NULL) {
1904 Py_DECREF(a);
1905 return NULL;
1906 }
1907 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001908 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001909 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001910 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001911 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001912 return NULL;
1913 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001914 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001915#ifdef Py_USING_UNICODE
1916 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001917 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001918 if (n > 0) {
1919 arrayobject *self = (arrayobject *)a;
1920 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001921 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001922 if (item == NULL) {
1923 PyErr_NoMemory();
1924 Py_DECREF(a);
1925 return NULL;
1926 }
1927 self->ob_item = item;
1928 self->ob_size = n / sizeof(Py_UNICODE);
1929 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001930 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001931 }
1932#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001933 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001934 if (it != NULL) {
1935 if (array_iter_extend((arrayobject *)a, it) == -1) {
1936 Py_DECREF(it);
1937 Py_DECREF(a);
1938 return NULL;
1939 }
1940 Py_DECREF(it);
1941 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001942 return a;
1943 }
1944 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001945 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001946 "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 +00001947 return NULL;
1948}
1949
Guido van Rossum778983b1993-02-19 15:55:02 +00001950
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001951PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001952"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001953an array of basic values: characters, integers, floating point\n\
1954numbers. Arrays are sequence types and behave very much like lists,\n\
1955except that the type of objects stored in them is constrained. The\n\
1956type is specified at object creation time by using a type code, which\n\
1957is a single character. The following type codes are defined:\n\
1958\n\
1959 Type code C Type Minimum size in bytes \n\
1960 'c' character 1 \n\
1961 'b' signed integer 1 \n\
1962 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001963 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001964 'h' signed integer 2 \n\
1965 'H' unsigned integer 2 \n\
1966 'i' signed integer 2 \n\
1967 'I' unsigned integer 2 \n\
1968 'l' signed integer 4 \n\
1969 'L' unsigned integer 4 \n\
1970 'f' floating point 4 \n\
1971 'd' floating point 8 \n\
1972\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001973The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001974\n\
1975array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001976");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001979"array(typecode [, initializer]) -> array\n\
1980\n\
1981Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001982initialized from the optional initializer value, which must be a list,\n\
1983string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001984\n\
1985Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001986the type of objects stored in them is constrained.\n\
1987\n\
1988Methods:\n\
1989\n\
1990append() -- append a new item to the end of the array\n\
1991buffer_info() -- return information giving the current memory info\n\
1992byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001993count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001994extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001995fromfile() -- read items from a file object\n\
1996fromlist() -- append items from the list\n\
1997fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001998index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001999insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002000pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002001read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002002remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002003reverse() -- reverse the order of the items in the array\n\
2004tofile() -- write all items to a file object\n\
2005tolist() -- return the array converted to an ordinary list\n\
2006tostring() -- return the array converted to a string\n\
2007write() -- DEPRECATED, use tofile()\n\
2008\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002009Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002010\n\
2011typecode -- the typecode character used to create the array\n\
2012itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002013");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002014
Raymond Hettinger625812f2003-01-07 01:58:52 +00002015static PyObject *array_iter(arrayobject *ao);
2016
Tim Peters0c322792002-07-17 16:49:03 +00002017static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00002018 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002019 0,
Guido van Rossum14648392001-12-08 18:02:58 +00002020 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002021 sizeof(arrayobject),
2022 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002023 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002024 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002025 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002026 0, /* tp_setattr */
2027 0, /* tp_compare */
2028 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002029 0, /* tp_as_number*/
2030 &array_as_sequence, /* tp_as_sequence*/
2031 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002032 0, /* tp_hash */
2033 0, /* tp_call */
2034 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002035 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002036 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002037 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002038 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002039 arraytype_doc, /* tp_doc */
2040 0, /* tp_traverse */
2041 0, /* tp_clear */
2042 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002043 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002044 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002045 0, /* tp_iternext */
2046 array_methods, /* tp_methods */
2047 0, /* tp_members */
2048 array_getsets, /* tp_getset */
2049 0, /* tp_base */
2050 0, /* tp_dict */
2051 0, /* tp_descr_get */
2052 0, /* tp_descr_set */
2053 0, /* tp_dictoffset */
2054 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002055 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002056 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002057 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002058};
2059
Raymond Hettinger625812f2003-01-07 01:58:52 +00002060
2061/*********************** Array Iterator **************************/
2062
2063typedef struct {
2064 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002065 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002066 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002067 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002068} arrayiterobject;
2069
2070static PyTypeObject PyArrayIter_Type;
2071
2072#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2073
2074static PyObject *
2075array_iter(arrayobject *ao)
2076{
2077 arrayiterobject *it;
2078
2079 if (!array_Check(ao)) {
2080 PyErr_BadInternalCall();
2081 return NULL;
2082 }
2083
2084 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2085 if (it == NULL)
2086 return NULL;
2087
2088 Py_INCREF(ao);
2089 it->ao = ao;
2090 it->index = 0;
2091 it->getitem = ao->ob_descr->getitem;
2092 PyObject_GC_Track(it);
2093 return (PyObject *)it;
2094}
2095
2096static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002097arrayiter_next(arrayiterobject *it)
2098{
2099 assert(PyArrayIter_Check(it));
2100 if (it->index < it->ao->ob_size)
2101 return (*it->getitem)(it->ao, it->index++);
2102 return NULL;
2103}
2104
2105static void
2106arrayiter_dealloc(arrayiterobject *it)
2107{
2108 PyObject_GC_UnTrack(it);
2109 Py_XDECREF(it->ao);
2110 PyObject_GC_Del(it);
2111}
2112
2113static int
2114arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2115{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002116 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002117 return 0;
2118}
2119
2120static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002121 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002122 0, /* ob_size */
2123 "arrayiterator", /* tp_name */
2124 sizeof(arrayiterobject), /* tp_basicsize */
2125 0, /* tp_itemsize */
2126 /* methods */
2127 (destructor)arrayiter_dealloc, /* tp_dealloc */
2128 0, /* tp_print */
2129 0, /* tp_getattr */
2130 0, /* tp_setattr */
2131 0, /* tp_compare */
2132 0, /* tp_repr */
2133 0, /* tp_as_number */
2134 0, /* tp_as_sequence */
2135 0, /* tp_as_mapping */
2136 0, /* tp_hash */
2137 0, /* tp_call */
2138 0, /* tp_str */
2139 PyObject_GenericGetAttr, /* tp_getattro */
2140 0, /* tp_setattro */
2141 0, /* tp_as_buffer */
2142 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2143 0, /* tp_doc */
2144 (traverseproc)arrayiter_traverse, /* tp_traverse */
2145 0, /* tp_clear */
2146 0, /* tp_richcompare */
2147 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002148 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002149 (iternextfunc)arrayiter_next, /* tp_iternext */
2150 0, /* tp_methods */
2151};
2152
2153
2154/*********************** Install Module **************************/
2155
Martin v. Löwis99866332002-03-01 10:27:01 +00002156/* No functions in array module. */
2157static PyMethodDef a_methods[] = {
2158 {NULL, NULL, 0, NULL} /* Sentinel */
2159};
2160
2161
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002162PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002163initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002164{
Fred Drakef4e34842002-04-01 03:45:06 +00002165 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002166
Martin v. Löwis99866332002-03-01 10:27:01 +00002167 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002168 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002169 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002170 if (m == NULL)
2171 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002172
2173 Py_INCREF((PyObject *)&Arraytype);
2174 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2175 Py_INCREF((PyObject *)&Arraytype);
2176 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002177 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002178}