blob: f262d206a875c4072b3329df600a060724ad0cc8 [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;
Neal Norwitz83ac0142008-07-28 05:06:20 +0000819 char *old_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000820
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000821 if (!array_Check(bb))
822 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000823#define b ((arrayobject *)bb)
824 if (self->ob_descr != b->ob_descr) {
825 PyErr_SetString(PyExc_TypeError,
826 "can only extend with array of same kind");
827 return -1;
828 }
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000829 if ((self->ob_size > PY_SSIZE_T_MAX - b->ob_size) ||
830 ((self->ob_size + b->ob_size) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
831 PyErr_NoMemory();
832 return -1;
833 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000834 size = self->ob_size + b->ob_size;
Neal Norwitz83ac0142008-07-28 05:06:20 +0000835 old_item = self->ob_item;
Martin v. Löwis99866332002-03-01 10:27:01 +0000836 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
837 if (self->ob_item == NULL) {
Neal Norwitz83ac0142008-07-28 05:06:20 +0000838 self->ob_item = old_item;
839 PyErr_NoMemory();
Martin v. Löwis99866332002-03-01 10:27:01 +0000840 return -1;
841 }
842 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
843 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000844 self->ob_size = size;
845 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000846
847 return 0;
848#undef b
849}
850
851static PyObject *
852array_inplace_concat(arrayobject *self, PyObject *bb)
853{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000854 if (!array_Check(bb)) {
855 PyErr_Format(PyExc_TypeError,
856 "can only extend array with array (not \"%.200s\")",
857 bb->ob_type->tp_name);
858 return NULL;
859 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000860 if (array_do_extend(self, bb) == -1)
861 return NULL;
862 Py_INCREF(self);
863 return (PyObject *)self;
864}
865
866static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000867array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000868{
869 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000870 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000871
872 if (self->ob_size > 0) {
873 if (n < 0)
874 n = 0;
875 items = self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000876 if ((self->ob_descr->itemsize != 0) &&
877 (self->ob_size > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
878 return PyErr_NoMemory();
879 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000880 size = self->ob_size * self->ob_descr->itemsize;
881 if (n == 0) {
882 PyMem_FREE(items);
883 self->ob_item = NULL;
884 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000885 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000886 }
887 else {
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000888 if (size > PY_SSIZE_T_MAX / n) {
889 return PyErr_NoMemory();
890 }
Neal Norwitz83ac0142008-07-28 05:06:20 +0000891 PyMem_RESIZE(items, char, n * size);
Martin v. Löwis99866332002-03-01 10:27:01 +0000892 if (items == NULL)
893 return PyErr_NoMemory();
894 p = items;
895 for (i = 1; i < n; i++) {
896 p += size;
897 memcpy(p, items, size);
898 }
899 self->ob_item = items;
900 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000901 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000902 }
903 }
904 Py_INCREF(self);
905 return (PyObject *)self;
906}
907
908
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000909static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000910ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000911{
912 if (ins1(self, where, v) != 0)
913 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000914 Py_INCREF(Py_None);
915 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000916}
917
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000918static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000919array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000921 Py_ssize_t count = 0;
922 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924 for (i = 0; i < self->ob_size; i++) {
925 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000926 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000928 if (cmp > 0)
929 count++;
930 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931 return NULL;
932 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000933 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000934}
935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000937"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000938\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000939Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000940
941static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000942array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000944 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000945
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000946 for (i = 0; i < self->ob_size; i++) {
947 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000948 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
949 Py_DECREF(selfi);
950 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000951 return PyInt_FromLong((long)i);
952 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000953 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000954 return NULL;
955 }
956 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
957 return NULL;
958}
959
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000960PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000961"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000962\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000963Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000964
Raymond Hettinger625812f2003-01-07 01:58:52 +0000965static int
966array_contains(arrayobject *self, PyObject *v)
967{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000968 Py_ssize_t i;
969 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000970
971 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
972 PyObject *selfi = getarrayitem((PyObject *)self, i);
973 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
974 Py_DECREF(selfi);
975 }
976 return cmp;
977}
978
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000980array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981{
982 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000983
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000984 for (i = 0; i < self->ob_size; i++) {
985 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000986 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
987 Py_DECREF(selfi);
988 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000989 if (array_ass_slice(self, i, i+1,
990 (PyObject *)NULL) != 0)
991 return NULL;
992 Py_INCREF(Py_None);
993 return Py_None;
994 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000995 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000996 return NULL;
997 }
998 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
999 return NULL;
1000}
1001
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001002PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001003"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001004\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001005Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001006
1007static PyObject *
1008array_pop(arrayobject *self, PyObject *args)
1009{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001010 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001011 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001012 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001013 return NULL;
1014 if (self->ob_size == 0) {
1015 /* Special-case most common failure cause */
1016 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1017 return NULL;
1018 }
1019 if (i < 0)
1020 i += self->ob_size;
1021 if (i < 0 || i >= self->ob_size) {
1022 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1023 return NULL;
1024 }
1025 v = getarrayitem((PyObject *)self,i);
1026 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1027 Py_DECREF(v);
1028 return NULL;
1029 }
1030 return v;
1031}
1032
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001033PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001034"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001035\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001036Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001037
1038static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001039array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001040{
Martin v. Löwis99866332002-03-01 10:27:01 +00001041 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001042 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001043 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001044 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001045}
1046
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001047PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001048"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001049\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001050 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001051
1052static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001053array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001054{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001055 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001056 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001057 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001058 return NULL;
1059 return ins(self, i, v);
1060}
1061
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001062PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001063"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001064\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001065Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001066
1067
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001068static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001069array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001070{
Tim Peters077a11d2000-09-16 22:31:29 +00001071 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001072 retval = PyTuple_New(2);
1073 if (!retval)
1074 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001075
1076 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1077 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1078
1079 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001080}
1081
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001082PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001083"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001084\n\
1085Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001086the length in items of the buffer used to hold array's contents\n\
1087The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001088the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001089
1090
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001091static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001092array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001093{
Guido van Rossum778983b1993-02-19 15:55:02 +00001094 return ins(self, (int) self->ob_size, v);
1095}
1096
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001097PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001098"append(x)\n\
1099\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001100Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001101
1102
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001103static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001104array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001105{
1106 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001107 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001108
Guido van Rossum778983b1993-02-19 15:55:02 +00001109 switch (self->ob_descr->itemsize) {
1110 case 1:
1111 break;
1112 case 2:
1113 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1114 char p0 = p[0];
1115 p[0] = p[1];
1116 p[1] = p0;
1117 }
1118 break;
1119 case 4:
1120 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1121 char p0 = p[0];
1122 char p1 = p[1];
1123 p[0] = p[3];
1124 p[1] = p[2];
1125 p[2] = p1;
1126 p[3] = p0;
1127 }
1128 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001129 case 8:
1130 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1131 char p0 = p[0];
1132 char p1 = p[1];
1133 char p2 = p[2];
1134 char p3 = p[3];
1135 p[0] = p[7];
1136 p[1] = p[6];
1137 p[2] = p[5];
1138 p[3] = p[4];
1139 p[4] = p3;
1140 p[5] = p2;
1141 p[6] = p1;
1142 p[7] = p0;
1143 }
1144 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001145 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001146 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001147 "don't know how to byteswap this array type");
1148 return NULL;
1149 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001150 Py_INCREF(Py_None);
1151 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001152}
1153
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001154PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001155"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001156\n\
Fred Drakebf272981999-12-03 17:15:30 +00001157Byteswap 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 +000011584, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001159
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001160static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001161array_reduce(arrayobject *array)
1162{
1163 PyObject *dict, *result;
1164
1165 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1166 if (dict == NULL) {
1167 PyErr_Clear();
1168 dict = Py_None;
1169 Py_INCREF(dict);
1170 }
Raymond Hettinger4bbcb642007-04-02 17:03:46 +00001171 if (array->ob_size > 0) {
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001172 if (array->ob_descr->itemsize
1173 > PY_SSIZE_T_MAX / array->ob_size) {
1174 return PyErr_NoMemory();
1175 }
Raymond Hettinger4bbcb642007-04-02 17:03:46 +00001176 result = Py_BuildValue("O(cs#)O",
1177 array->ob_type,
1178 array->ob_descr->typecode,
1179 array->ob_item,
1180 array->ob_size * array->ob_descr->itemsize,
1181 dict);
1182 } else {
1183 result = Py_BuildValue("O(c)O",
1184 array->ob_type,
1185 array->ob_descr->typecode,
1186 dict);
1187 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001188 Py_DECREF(dict);
1189 return result;
1190}
1191
1192PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1193
1194static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001195array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001196{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001197 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001198 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001199 /* little buffer to hold items while swapping */
1200 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001201 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001202
Guido van Rossum778983b1993-02-19 15:55:02 +00001203 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001204 for (p = self->ob_item,
1205 q = self->ob_item + (self->ob_size - 1)*itemsize;
1206 p < q;
1207 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001208 /* memory areas guaranteed disjoint, so memcpy
1209 * is safe (& memmove may be slower).
1210 */
1211 memcpy(tmp, p, itemsize);
1212 memcpy(p, q, itemsize);
1213 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001214 }
1215 }
Tim Petersbb307342000-09-10 05:22:54 +00001216
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001217 Py_INCREF(Py_None);
1218 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001219}
Guido van Rossume77a7571993-11-03 15:01:26 +00001220
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001221PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001222"reverse()\n\
1223\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001224Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001225
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001227array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001228{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001229 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001230 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001231 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001232 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001233 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001234 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001235 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001236 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001237 return NULL;
1238 }
1239 if (n > 0) {
1240 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001241 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001242 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001243 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001244 size_t newbytes;
1245 /* Be careful here about overflow */
1246 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001247 (newbytes = newlength * itemsize) / itemsize !=
1248 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001249 goto nomem;
1250 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001252 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001254 return NULL;
1255 }
1256 self->ob_item = item;
1257 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001258 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 nread = fread(item + (self->ob_size - n) * itemsize,
1260 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001261 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001262 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001263 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001264 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001265 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001266 PyErr_SetString(PyExc_EOFError,
1267 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001268 return NULL;
1269 }
1270 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001271 Py_INCREF(Py_None);
1272 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001273}
1274
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001275PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001276"fromfile(f, n)\n\
1277\n\
1278Read 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 +00001279array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001280
1281
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001282static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001283array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001284{
Guido van Rossum778983b1993-02-19 15:55:02 +00001285 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001286
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001287 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001288 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001289 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001290 return NULL;
1291 }
1292 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001293 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1294 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001296 clearerr(fp);
1297 return NULL;
1298 }
1299 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001300 Py_INCREF(Py_None);
1301 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001302}
1303
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001304PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001305"tofile(f)\n\
1306\n\
1307Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001308write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001309
1310
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001311static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001312array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001313{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001314 Py_ssize_t n;
1315 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001316
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317 if (!PyList_Check(list)) {
1318 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001319 return NULL;
1320 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001321 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 if (n > 0) {
1323 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001324 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001326 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001327 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 return NULL;
1329 }
1330 self->ob_item = item;
1331 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001332 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001333 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001334 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 if ((*self->ob_descr->setitem)(self,
1336 self->ob_size - n + i, v) != 0) {
1337 self->ob_size -= n;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001338 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1339 return PyErr_NoMemory();
1340 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001341 PyMem_RESIZE(item, char,
1342 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001344 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001345 return NULL;
1346 }
1347 }
1348 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 Py_INCREF(Py_None);
1350 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001351}
1352
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001353PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001354"fromlist(list)\n\
1355\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001357
1358
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001359static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001360array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001361{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001363 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001364
Guido van Rossum778983b1993-02-19 15:55:02 +00001365 if (list == NULL)
1366 return NULL;
1367 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001368 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001369 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001370 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001371 return NULL;
1372 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001373 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001374 }
1375 return list;
1376}
1377
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001379"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001380\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001382
1383
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001384static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001385array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001386{
1387 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001388 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001389 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001390 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001391 return NULL;
1392 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001393 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001394 "string length not a multiple of item size");
1395 return NULL;
1396 }
1397 n = n / itemsize;
1398 if (n > 0) {
1399 char *item = self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001400 if ((n > PY_SSIZE_T_MAX - self->ob_size) ||
1401 ((self->ob_size + n) > PY_SSIZE_T_MAX / itemsize)) {
1402 return PyErr_NoMemory();
1403 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001404 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001405 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001406 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001407 return NULL;
1408 }
1409 self->ob_item = item;
1410 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001411 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001412 memcpy(item + (self->ob_size - n) * itemsize,
1413 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001414 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001415 Py_INCREF(Py_None);
1416 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001417}
1418
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001419PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001420"fromstring(string)\n\
1421\n\
1422Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001423values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001424
1425
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001426static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001427array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001428{
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001429 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1430 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001431 self->ob_size * self->ob_descr->itemsize);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001432 } else {
1433 return PyErr_NoMemory();
1434 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001435}
1436
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001437PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001438"tostring() -> string\n\
1439\n\
1440Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001441representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001442
Martin v. Löwis99866332002-03-01 10:27:01 +00001443
1444
1445#ifdef Py_USING_UNICODE
1446static PyObject *
1447array_fromunicode(arrayobject *self, PyObject *args)
1448{
1449 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001450 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001451
1452 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1453 return NULL;
1454 if (self->ob_descr->typecode != 'u') {
1455 PyErr_SetString(PyExc_ValueError,
1456 "fromunicode() may only be called on "
1457 "type 'u' arrays");
1458 return NULL;
1459 }
1460 if (n > 0) {
1461 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001462 if (self->ob_size > PY_SSIZE_T_MAX - n) {
1463 return PyErr_NoMemory();
1464 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001465 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1466 if (item == NULL) {
1467 PyErr_NoMemory();
1468 return NULL;
1469 }
1470 self->ob_item = (char *) item;
1471 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001472 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001473 memcpy(item + self->ob_size - n,
1474 ustr, n * sizeof(Py_UNICODE));
1475 }
1476
1477 Py_INCREF(Py_None);
1478 return Py_None;
1479}
1480
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001481PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001482"fromunicode(ustr)\n\
1483\n\
1484Extends this array with data from the unicode string ustr.\n\
1485The array must be a type 'u' array; otherwise a ValueError\n\
1486is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001487append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001488
1489
1490static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001491array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001492{
Martin v. Löwis99866332002-03-01 10:27:01 +00001493 if (self->ob_descr->typecode != 'u') {
1494 PyErr_SetString(PyExc_ValueError,
1495 "tounicode() may only be called on type 'u' arrays");
1496 return NULL;
1497 }
1498 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1499}
1500
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001501PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001502"tounicode() -> unicode\n\
1503\n\
1504Convert the array to a unicode string. The array must be\n\
1505a type 'u' array; otherwise a ValueError is raised. Use\n\
1506array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001507an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001508
1509#endif /* Py_USING_UNICODE */
1510
1511
1512static PyObject *
1513array_get_typecode(arrayobject *a, void *closure)
1514{
1515 char tc = a->ob_descr->typecode;
1516 return PyString_FromStringAndSize(&tc, 1);
1517}
1518
1519static PyObject *
1520array_get_itemsize(arrayobject *a, void *closure)
1521{
1522 return PyInt_FromLong((long)a->ob_descr->itemsize);
1523}
1524
1525static PyGetSetDef array_getsets [] = {
1526 {"typecode", (getter) array_get_typecode, NULL,
1527 "the typecode character used to create the array"},
1528 {"itemsize", (getter) array_get_itemsize, NULL,
1529 "the size, in bytes, of one array item"},
1530 {NULL}
1531};
1532
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001533PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001534 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001535 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001536 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001537 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001538 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001539 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001540 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1541 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001542 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001543 count_doc},
Thomas Wouters04e82042006-12-29 14:42:17 +00001544 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001545 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001546 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001547 extend_doc},
1548 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1549 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001550 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001551 fromlist_doc},
1552 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1553 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001554#ifdef Py_USING_UNICODE
1555 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1556 fromunicode_doc},
1557#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001558 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001559 index_doc},
1560 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1561 insert_doc},
1562 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1563 pop_doc},
1564 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1565 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001566 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1567 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001568 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001569 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001570 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001571 reverse_doc},
1572/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1573 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001574 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001575 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001576 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001577 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001578 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001579 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001580#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001581 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001582 tounicode_doc},
1583#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001584 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001585 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001586 {NULL, NULL} /* sentinel */
1587};
1588
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001589static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001590array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001591{
Martin v. Löwis99866332002-03-01 10:27:01 +00001592 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001593 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001594 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001595
Guido van Rossum778983b1993-02-19 15:55:02 +00001596 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001597 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001598 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001599 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001600 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001601 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001602
1603 if (typecode == 'c')
1604 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001605#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001606 else if (typecode == 'u')
1607 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001608#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001609 else
1610 v = array_tolist(a, NULL);
1611 t = PyObject_Repr(v);
1612 Py_XDECREF(v);
1613
1614 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001615 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001616 PyString_ConcatAndDel(&s, t);
1617 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001618 return s;
1619}
1620
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001621static PyObject*
1622array_subscr(arrayobject* self, PyObject* item)
1623{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001624 if (PyIndex_Check(item)) {
1625 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001626 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001627 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001628 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001629 if (i < 0)
1630 i += self->ob_size;
1631 return array_item(self, i);
1632 }
1633 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001634 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001635 PyObject* result;
1636 arrayobject* ar;
1637 int itemsize = self->ob_descr->itemsize;
1638
1639 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1640 &start, &stop, &step, &slicelength) < 0) {
1641 return NULL;
1642 }
1643
1644 if (slicelength <= 0) {
1645 return newarrayobject(&Arraytype, 0, self->ob_descr);
1646 }
1647 else {
1648 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1649 if (!result) return NULL;
1650
1651 ar = (arrayobject*)result;
1652
1653 for (cur = start, i = 0; i < slicelength;
1654 cur += step, i++) {
1655 memcpy(ar->ob_item + i*itemsize,
1656 self->ob_item + cur*itemsize,
1657 itemsize);
1658 }
1659
1660 return result;
1661 }
1662 }
1663 else {
1664 PyErr_SetString(PyExc_TypeError,
1665 "list indices must be integers");
1666 return NULL;
1667 }
1668}
1669
1670static int
1671array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1672{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001673 if (PyIndex_Check(item)) {
1674 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001675 if (i==-1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001676 return -1;
1677 if (i < 0)
1678 i += self->ob_size;
1679 return array_ass_item(self, i, value);
1680 }
1681 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001682 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001683 int itemsize = self->ob_descr->itemsize;
1684
1685 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1686 &start, &stop, &step, &slicelength) < 0) {
1687 return -1;
1688 }
1689
1690 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1691 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1692 return array_ass_slice(self, start, stop, value);
1693
1694 if (value == NULL) {
1695 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001696 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001697
1698 if (slicelength <= 0)
1699 return 0;
1700
1701 if (step < 0) {
1702 stop = start + 1;
1703 start = stop + step*(slicelength - 1) - 1;
1704 step = -step;
1705 }
1706
Michael W. Hudson56796f62002-07-29 14:35:04 +00001707 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001708 cur += step, i++) {
1709 memmove(self->ob_item + (cur - i)*itemsize,
1710 self->ob_item + (cur + 1)*itemsize,
1711 (step - 1) * itemsize);
1712 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001713 extra = self->ob_size - (cur + 1);
1714 if (extra > 0) {
1715 memmove(self->ob_item + (cur - i)*itemsize,
1716 self->ob_item + (cur + 1)*itemsize,
1717 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001718 }
1719
1720 self->ob_size -= slicelength;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001721 self->ob_item = (char *)PyMem_REALLOC(self->ob_item,
1722 itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001723 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001724
1725 return 0;
1726 }
1727 else {
1728 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001729 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001730 arrayobject* av;
1731
1732 if (!array_Check(value)) {
1733 PyErr_Format(PyExc_TypeError,
1734 "must assign array (not \"%.200s\") to slice",
1735 value->ob_type->tp_name);
1736 return -1;
1737 }
1738
1739 av = (arrayobject*)value;
1740
1741 if (av->ob_size != slicelength) {
1742 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001743 "attempt to assign array of size %ld to extended slice of size %ld",
1744 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001745 return -1;
1746 }
1747
1748 if (!slicelength)
1749 return 0;
1750
1751 /* protect against a[::-1] = a */
1752 if (self == av) {
1753 value = array_slice(av, 0, av->ob_size);
1754 av = (arrayobject*)value;
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +00001755 if (!av)
1756 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001757 }
1758 else {
1759 Py_INCREF(value);
1760 }
1761
1762 for (cur = start, i = 0; i < slicelength;
1763 cur += step, i++) {
1764 memcpy(self->ob_item + cur*itemsize,
1765 av->ob_item + i*itemsize,
1766 itemsize);
1767 }
1768
1769 Py_DECREF(value);
1770
1771 return 0;
1772 }
1773 }
1774 else {
1775 PyErr_SetString(PyExc_TypeError,
1776 "list indices must be integers");
1777 return -1;
1778 }
1779}
1780
1781static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001782 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001783 (binaryfunc)array_subscr,
1784 (objobjargproc)array_ass_subscr
1785};
1786
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001787static const void *emptybuf = "";
1788
Martin v. Löwis18e16552006-02-15 17:27:45 +00001789static Py_ssize_t
1790array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001791{
1792 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001793 PyErr_SetString(PyExc_SystemError,
1794 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001795 return -1;
1796 }
1797 *ptr = (void *)self->ob_item;
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001798 if (*ptr == NULL)
1799 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001800 return self->ob_size*self->ob_descr->itemsize;
1801}
1802
Martin v. Löwis18e16552006-02-15 17:27:45 +00001803static Py_ssize_t
1804array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001805{
1806 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001807 PyErr_SetString(PyExc_SystemError,
1808 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001809 return -1;
1810 }
1811 *ptr = (void *)self->ob_item;
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001812 if (*ptr == NULL)
1813 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001814 return self->ob_size*self->ob_descr->itemsize;
1815}
1816
Martin v. Löwis18e16552006-02-15 17:27:45 +00001817static Py_ssize_t
1818array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001819{
1820 if ( lenp )
1821 *lenp = self->ob_size*self->ob_descr->itemsize;
1822 return 1;
1823}
1824
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001825static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001827 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001828 (ssizeargfunc)array_repeat, /*sq_repeat*/
1829 (ssizeargfunc)array_item, /*sq_item*/
1830 (ssizessizeargfunc)array_slice, /*sq_slice*/
1831 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1832 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001833 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001834 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001835 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001836};
1837
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001838static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001839 (readbufferproc)array_buffer_getreadbuf,
1840 (writebufferproc)array_buffer_getwritebuf,
1841 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001842 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001843};
1844
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001845static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001846array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001847{
1848 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001849 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001850 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001851
Georg Brandl8e932e72007-01-21 10:28:56 +00001852 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001853 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001854
1855 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1856 return NULL;
1857
1858 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001859 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001860 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001861 it = PyObject_GetIter(initial);
1862 if (it == NULL)
1863 return NULL;
1864 /* We set initial to NULL so that the subsequent code
1865 will create an empty array of the appropriate type
1866 and afterwards we can use array_iter_extend to populate
1867 the array.
1868 */
1869 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001870 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001871 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1872 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001873 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001874 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001875
1876 if (initial == NULL || !(PyList_Check(initial)
1877 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001878 len = 0;
1879 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001880 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001881
1882 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001883 if (a == NULL)
1884 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001885
Guido van Rossum778983b1993-02-19 15:55:02 +00001886 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001887 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001888 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001889 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001890 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001891 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001892 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001893 return NULL;
1894 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001895 if (setarrayitem(a, i, v) != 0) {
1896 Py_DECREF(v);
1897 Py_DECREF(a);
1898 return NULL;
1899 }
1900 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001901 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001902 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001903 PyObject *t_initial, *v;
1904 t_initial = PyTuple_Pack(1, initial);
1905 if (t_initial == NULL) {
1906 Py_DECREF(a);
1907 return NULL;
1908 }
1909 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001910 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001911 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001912 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001913 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001914 return NULL;
1915 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001916 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001917#ifdef Py_USING_UNICODE
1918 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001919 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001920 if (n > 0) {
1921 arrayobject *self = (arrayobject *)a;
1922 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001923 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001924 if (item == NULL) {
1925 PyErr_NoMemory();
1926 Py_DECREF(a);
1927 return NULL;
1928 }
1929 self->ob_item = item;
1930 self->ob_size = n / sizeof(Py_UNICODE);
1931 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001932 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001933 }
1934#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001935 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001936 if (it != NULL) {
1937 if (array_iter_extend((arrayobject *)a, it) == -1) {
1938 Py_DECREF(it);
1939 Py_DECREF(a);
1940 return NULL;
1941 }
1942 Py_DECREF(it);
1943 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001944 return a;
1945 }
1946 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001947 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001948 "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 +00001949 return NULL;
1950}
1951
Guido van Rossum778983b1993-02-19 15:55:02 +00001952
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001953PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001954"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001955an array of basic values: characters, integers, floating point\n\
1956numbers. Arrays are sequence types and behave very much like lists,\n\
1957except that the type of objects stored in them is constrained. The\n\
1958type is specified at object creation time by using a type code, which\n\
1959is a single character. The following type codes are defined:\n\
1960\n\
1961 Type code C Type Minimum size in bytes \n\
1962 'c' character 1 \n\
1963 'b' signed integer 1 \n\
1964 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001965 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001966 'h' signed integer 2 \n\
1967 'H' unsigned integer 2 \n\
1968 'i' signed integer 2 \n\
1969 'I' unsigned integer 2 \n\
1970 'l' signed integer 4 \n\
1971 'L' unsigned integer 4 \n\
1972 'f' floating point 4 \n\
1973 'd' floating point 8 \n\
1974\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001975The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001976\n\
1977array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001978");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001979
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001980PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001981"array(typecode [, initializer]) -> array\n\
1982\n\
1983Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001984initialized from the optional initializer value, which must be a list,\n\
1985string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001986\n\
1987Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001988the type of objects stored in them is constrained.\n\
1989\n\
1990Methods:\n\
1991\n\
1992append() -- append a new item to the end of the array\n\
1993buffer_info() -- return information giving the current memory info\n\
1994byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001995count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001996extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001997fromfile() -- read items from a file object\n\
1998fromlist() -- append items from the list\n\
1999fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002000index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002001insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002002pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002003read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002004remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002005reverse() -- reverse the order of the items in the array\n\
2006tofile() -- write all items to a file object\n\
2007tolist() -- return the array converted to an ordinary list\n\
2008tostring() -- return the array converted to a string\n\
2009write() -- DEPRECATED, use tofile()\n\
2010\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002011Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002012\n\
2013typecode -- the typecode character used to create the array\n\
2014itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002015");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002016
Raymond Hettinger625812f2003-01-07 01:58:52 +00002017static PyObject *array_iter(arrayobject *ao);
2018
Tim Peters0c322792002-07-17 16:49:03 +00002019static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00002020 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002021 0,
Guido van Rossum14648392001-12-08 18:02:58 +00002022 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002023 sizeof(arrayobject),
2024 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002025 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002026 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002027 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002028 0, /* tp_setattr */
2029 0, /* tp_compare */
2030 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002031 0, /* tp_as_number*/
2032 &array_as_sequence, /* tp_as_sequence*/
2033 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002034 0, /* tp_hash */
2035 0, /* tp_call */
2036 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002037 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002038 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002039 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002040 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002041 arraytype_doc, /* tp_doc */
2042 0, /* tp_traverse */
2043 0, /* tp_clear */
2044 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002045 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002046 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002047 0, /* tp_iternext */
2048 array_methods, /* tp_methods */
2049 0, /* tp_members */
2050 array_getsets, /* tp_getset */
2051 0, /* tp_base */
2052 0, /* tp_dict */
2053 0, /* tp_descr_get */
2054 0, /* tp_descr_set */
2055 0, /* tp_dictoffset */
2056 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002057 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002058 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002059 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002060};
2061
Raymond Hettinger625812f2003-01-07 01:58:52 +00002062
2063/*********************** Array Iterator **************************/
2064
2065typedef struct {
2066 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002067 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002068 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002069 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002070} arrayiterobject;
2071
2072static PyTypeObject PyArrayIter_Type;
2073
2074#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2075
2076static PyObject *
2077array_iter(arrayobject *ao)
2078{
2079 arrayiterobject *it;
2080
2081 if (!array_Check(ao)) {
2082 PyErr_BadInternalCall();
2083 return NULL;
2084 }
2085
2086 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2087 if (it == NULL)
2088 return NULL;
2089
2090 Py_INCREF(ao);
2091 it->ao = ao;
2092 it->index = 0;
2093 it->getitem = ao->ob_descr->getitem;
2094 PyObject_GC_Track(it);
2095 return (PyObject *)it;
2096}
2097
2098static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002099arrayiter_next(arrayiterobject *it)
2100{
2101 assert(PyArrayIter_Check(it));
2102 if (it->index < it->ao->ob_size)
2103 return (*it->getitem)(it->ao, it->index++);
2104 return NULL;
2105}
2106
2107static void
2108arrayiter_dealloc(arrayiterobject *it)
2109{
2110 PyObject_GC_UnTrack(it);
2111 Py_XDECREF(it->ao);
2112 PyObject_GC_Del(it);
2113}
2114
2115static int
2116arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2117{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002118 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002119 return 0;
2120}
2121
2122static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002123 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002124 0, /* ob_size */
2125 "arrayiterator", /* tp_name */
2126 sizeof(arrayiterobject), /* tp_basicsize */
2127 0, /* tp_itemsize */
2128 /* methods */
2129 (destructor)arrayiter_dealloc, /* tp_dealloc */
2130 0, /* tp_print */
2131 0, /* tp_getattr */
2132 0, /* tp_setattr */
2133 0, /* tp_compare */
2134 0, /* tp_repr */
2135 0, /* tp_as_number */
2136 0, /* tp_as_sequence */
2137 0, /* tp_as_mapping */
2138 0, /* tp_hash */
2139 0, /* tp_call */
2140 0, /* tp_str */
2141 PyObject_GenericGetAttr, /* tp_getattro */
2142 0, /* tp_setattro */
2143 0, /* tp_as_buffer */
2144 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2145 0, /* tp_doc */
2146 (traverseproc)arrayiter_traverse, /* tp_traverse */
2147 0, /* tp_clear */
2148 0, /* tp_richcompare */
2149 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002150 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002151 (iternextfunc)arrayiter_next, /* tp_iternext */
2152 0, /* tp_methods */
2153};
2154
2155
2156/*********************** Install Module **************************/
2157
Martin v. Löwis99866332002-03-01 10:27:01 +00002158/* No functions in array module. */
2159static PyMethodDef a_methods[] = {
2160 {NULL, NULL, 0, NULL} /* Sentinel */
2161};
2162
2163
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002164PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002165initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002166{
Fred Drakef4e34842002-04-01 03:45:06 +00002167 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002168
Martin v. Löwis99866332002-03-01 10:27:01 +00002169 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002170 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002171 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002172 if (m == NULL)
2173 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002174
2175 Py_INCREF((PyObject *)&Arraytype);
2176 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2177 Py_INCREF((PyObject *)&Arraytype);
2178 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002179 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002180}