blob: da6e88f1295973c2f1992ba5511a54343b4adb3e [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) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000442 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000443 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000444 }
445 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000446 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000447 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000448 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000453getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
455 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000456 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000458 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 return (*ap->ob_descr->getitem)(ap, i);
460}
461
462static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000463ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 char *items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000466 Py_ssize_t n = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000473
474 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000476 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000477 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000479 if (where < 0)
480 where = 0;
481 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000482 if (where > n)
483 where = n;
484 /* appends don't need to call memmove() */
485 if (where != n)
486 memmove(items + (where+1)*self->ob_descr->itemsize,
487 items + where*self->ob_descr->itemsize,
488 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossum778983b1993-02-19 15:55:02 +0000492/* Methods */
493
494static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000495array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000496{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000497 if (op->weakreflist != NULL)
498 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000499 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000501 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000502}
503
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000504static PyObject *
505array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000506{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000507 arrayobject *va, *wa;
508 PyObject *vi = NULL;
509 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000510 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511 PyObject *res;
512
Martin v. Löwis99866332002-03-01 10:27:01 +0000513 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000514 Py_INCREF(Py_NotImplemented);
515 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000517
518 va = (arrayobject *)v;
519 wa = (arrayobject *)w;
520
521 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
522 /* Shortcut: if the lengths differ, the arrays differ */
523 if (op == Py_EQ)
524 res = Py_False;
525 else
526 res = Py_True;
527 Py_INCREF(res);
528 return res;
529 }
530
531 /* Search for the first index where items are different */
532 k = 1;
533 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
534 vi = getarrayitem(v, i);
535 wi = getarrayitem(w, i);
536 if (vi == NULL || wi == NULL) {
537 Py_XDECREF(vi);
538 Py_XDECREF(wi);
539 return NULL;
540 }
541 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
542 if (k == 0)
543 break; /* Keeping vi and wi alive! */
544 Py_DECREF(vi);
545 Py_DECREF(wi);
546 if (k < 0)
547 return NULL;
548 }
549
550 if (k) {
551 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000552 Py_ssize_t vs = va->ob_size;
553 Py_ssize_t ws = wa->ob_size;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000554 int cmp;
555 switch (op) {
556 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000557 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000558 case Py_EQ: cmp = vs == ws; break;
559 case Py_NE: cmp = vs != ws; break;
560 case Py_GT: cmp = vs > ws; break;
561 case Py_GE: cmp = vs >= ws; break;
562 default: return NULL; /* cannot happen */
563 }
564 if (cmp)
565 res = Py_True;
566 else
567 res = Py_False;
568 Py_INCREF(res);
569 return res;
570 }
571
572 /* We have an item that differs. First, shortcuts for EQ/NE */
573 if (op == Py_EQ) {
574 Py_INCREF(Py_False);
575 res = Py_False;
576 }
577 else if (op == Py_NE) {
578 Py_INCREF(Py_True);
579 res = Py_True;
580 }
581 else {
582 /* Compare the final item again using the proper operator */
583 res = PyObject_RichCompare(vi, wi, op);
584 }
585 Py_DECREF(vi);
586 Py_DECREF(wi);
587 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
Martin v. Löwis18e16552006-02-15 17:27:45 +0000590static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
593 return a->ob_size;
594}
595
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000596static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000597array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
599 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return NULL;
602 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000604}
605
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000606static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000607array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000608{
609 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 if (ilow < 0)
611 ilow = 0;
612 else if (ilow > a->ob_size)
613 ilow = a->ob_size;
614 if (ihigh < 0)
615 ihigh = 0;
616 if (ihigh < ilow)
617 ihigh = ilow;
618 else if (ihigh > a->ob_size)
619 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000620 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 if (np == NULL)
622 return NULL;
623 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
624 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000629array_copy(arrayobject *a, PyObject *unused)
630{
631 return array_slice(a, 0, a->ob_size);
632}
633
634PyDoc_STRVAR(copy_doc,
635"copy(array)\n\
636\n\
637 Return a copy of the array.");
638
639static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000640array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000641{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000642 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000643 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000644 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000645 PyErr_Format(PyExc_TypeError,
646 "can only append array (not \"%.200s\") to array",
647 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return NULL;
649 }
650#define b ((arrayobject *)bb)
651 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return NULL;
654 }
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000655 if (a->ob_size > PY_SSIZE_T_MAX - b->ob_size) {
656 return PyErr_NoMemory();
657 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000658 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000659 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000660 if (np == NULL) {
661 return NULL;
662 }
663 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
664 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000665 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000666 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000667#undef b
668}
669
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000671array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000672{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673 Py_ssize_t i;
674 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 arrayobject *np;
676 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000677 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000678 if (n < 0)
679 n = 0;
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000680 if ((a->ob_size != 0) && (n > PY_SSIZE_T_MAX / a->ob_size)) {
681 return PyErr_NoMemory();
682 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000684 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000685 if (np == NULL)
686 return NULL;
687 p = np->ob_item;
688 nbytes = a->ob_size * a->ob_descr->itemsize;
689 for (i = 0; i < n; i++) {
690 memcpy(p, a->ob_item, nbytes);
691 p += nbytes;
692 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000694}
695
696static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000697array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000698{
699 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000700 Py_ssize_t n; /* Size of replacement array */
701 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000702#define b ((arrayobject *)v)
703 if (v == NULL)
704 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000705 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000706 n = b->ob_size;
707 if (a == b) {
708 /* Special case "a[i:j] = a" -- copy b first */
709 int ret;
710 v = array_slice(b, 0, n);
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +0000711 if (!v)
712 return -1;
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000714 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000715 return ret;
716 }
717 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000718 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000719 return -1;
720 }
721 }
722 else {
Fred Drake137507e2000-06-01 02:02:46 +0000723 PyErr_Format(PyExc_TypeError,
724 "can only assign array (not \"%.200s\") to array slice",
725 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000726 return -1;
727 }
728 if (ilow < 0)
729 ilow = 0;
730 else if (ilow > a->ob_size)
731 ilow = a->ob_size;
732 if (ihigh < 0)
733 ihigh = 0;
734 if (ihigh < ilow)
735 ihigh = ilow;
736 else if (ihigh > a->ob_size)
737 ihigh = a->ob_size;
738 item = a->ob_item;
739 d = n - (ihigh-ilow);
740 if (d < 0) { /* Delete -d items */
741 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
742 item + ihigh*a->ob_descr->itemsize,
743 (a->ob_size-ihigh)*a->ob_descr->itemsize);
744 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000745 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 /* Can't fail */
747 a->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000748 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000749 }
750 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000751 PyMem_RESIZE(item, char,
752 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000754 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000755 return -1;
756 }
757 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
758 item + ihigh*a->ob_descr->itemsize,
759 (a->ob_size-ihigh)*a->ob_descr->itemsize);
760 a->ob_item = item;
761 a->ob_size += d;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000762 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000763 }
764 if (n > 0)
765 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
766 n*b->ob_descr->itemsize);
767 return 0;
768#undef b
769}
770
771static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000772array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000773{
774 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000775 PyErr_SetString(PyExc_IndexError,
776 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000777 return -1;
778 }
779 if (v == NULL)
780 return array_ass_slice(a, i, i+1, v);
781 return (*a->ob_descr->setitem)(a, i, v);
782}
783
784static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000785setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000786{
Martin v. Löwis99866332002-03-01 10:27:01 +0000787 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 return array_ass_item((arrayobject *)a, i, v);
789}
790
Martin v. Löwis99866332002-03-01 10:27:01 +0000791static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000792array_iter_extend(arrayobject *self, PyObject *bb)
793{
794 PyObject *it, *v;
795
796 it = PyObject_GetIter(bb);
797 if (it == NULL)
798 return -1;
799
800 while ((v = PyIter_Next(it)) != NULL) {
801 if (ins1(self, (int) self->ob_size, v) != 0) {
802 Py_DECREF(v);
803 Py_DECREF(it);
804 return -1;
805 }
806 Py_DECREF(v);
807 }
808 Py_DECREF(it);
809 if (PyErr_Occurred())
810 return -1;
811 return 0;
812}
813
814static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000815array_do_extend(arrayobject *self, PyObject *bb)
816{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000817 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000818
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000819 if (!array_Check(bb))
820 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000821#define b ((arrayobject *)bb)
822 if (self->ob_descr != b->ob_descr) {
823 PyErr_SetString(PyExc_TypeError,
824 "can only extend with array of same kind");
825 return -1;
826 }
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000827 if ((self->ob_size > PY_SSIZE_T_MAX - b->ob_size) ||
828 ((self->ob_size + b->ob_size) > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
829 PyErr_NoMemory();
830 return -1;
831 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000832 size = self->ob_size + b->ob_size;
833 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
834 if (self->ob_item == NULL) {
835 PyObject_Del(self);
836 PyErr_NoMemory();
837 return -1;
838 }
839 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
840 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000841 self->ob_size = size;
842 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000843
844 return 0;
845#undef b
846}
847
848static PyObject *
849array_inplace_concat(arrayobject *self, PyObject *bb)
850{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000851 if (!array_Check(bb)) {
852 PyErr_Format(PyExc_TypeError,
853 "can only extend array with array (not \"%.200s\")",
854 bb->ob_type->tp_name);
855 return NULL;
856 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000857 if (array_do_extend(self, bb) == -1)
858 return NULL;
859 Py_INCREF(self);
860 return (PyObject *)self;
861}
862
863static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000864array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000865{
866 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000867 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000868
869 if (self->ob_size > 0) {
870 if (n < 0)
871 n = 0;
872 items = self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000873 if ((self->ob_descr->itemsize != 0) &&
874 (self->ob_size > PY_SSIZE_T_MAX / self->ob_descr->itemsize)) {
875 return PyErr_NoMemory();
876 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000877 size = self->ob_size * self->ob_descr->itemsize;
878 if (n == 0) {
879 PyMem_FREE(items);
880 self->ob_item = NULL;
881 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000882 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000883 }
884 else {
Martin v. Löwis73c01d42008-02-14 11:26:18 +0000885 if (size > PY_SSIZE_T_MAX / n) {
886 return PyErr_NoMemory();
887 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000888 PyMem_Resize(items, char, n * size);
889 if (items == NULL)
890 return PyErr_NoMemory();
891 p = items;
892 for (i = 1; i < n; i++) {
893 p += size;
894 memcpy(p, items, size);
895 }
896 self->ob_item = items;
897 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000898 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000899 }
900 }
901 Py_INCREF(self);
902 return (PyObject *)self;
903}
904
905
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000906static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000907ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000908{
909 if (ins1(self, where, v) != 0)
910 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000911 Py_INCREF(Py_None);
912 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000913}
914
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000915static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000916array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000917{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000918 Py_ssize_t count = 0;
919 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921 for (i = 0; i < self->ob_size; i++) {
922 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000923 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000924 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000925 if (cmp > 0)
926 count++;
927 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000928 return NULL;
929 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000930 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931}
932
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000933PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000934"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000935\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000937
938static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000939array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000940{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000941 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000942
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943 for (i = 0; i < self->ob_size; i++) {
944 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000945 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
946 Py_DECREF(selfi);
947 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000948 return PyInt_FromLong((long)i);
949 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000950 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000951 return NULL;
952 }
953 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
954 return NULL;
955}
956
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000957PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000958"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000960Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000961
Raymond Hettinger625812f2003-01-07 01:58:52 +0000962static int
963array_contains(arrayobject *self, PyObject *v)
964{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000965 Py_ssize_t i;
966 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000967
968 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
969 PyObject *selfi = getarrayitem((PyObject *)self, i);
970 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
971 Py_DECREF(selfi);
972 }
973 return cmp;
974}
975
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000976static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000977array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000978{
979 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981 for (i = 0; i < self->ob_size; i++) {
982 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000983 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
984 Py_DECREF(selfi);
985 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000986 if (array_ass_slice(self, i, i+1,
987 (PyObject *)NULL) != 0)
988 return NULL;
989 Py_INCREF(Py_None);
990 return Py_None;
991 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000992 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000993 return NULL;
994 }
995 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
996 return NULL;
997}
998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000999PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001000"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001001\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001002Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001003
1004static PyObject *
1005array_pop(arrayobject *self, PyObject *args)
1006{
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001007 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001008 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001009 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010 return NULL;
1011 if (self->ob_size == 0) {
1012 /* Special-case most common failure cause */
1013 PyErr_SetString(PyExc_IndexError, "pop from empty array");
1014 return NULL;
1015 }
1016 if (i < 0)
1017 i += self->ob_size;
1018 if (i < 0 || i >= self->ob_size) {
1019 PyErr_SetString(PyExc_IndexError, "pop index out of range");
1020 return NULL;
1021 }
1022 v = getarrayitem((PyObject *)self,i);
1023 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1024 Py_DECREF(v);
1025 return NULL;
1026 }
1027 return v;
1028}
1029
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001030PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001031"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001032\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001033Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001034
1035static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001036array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001037{
Martin v. Löwis99866332002-03-01 10:27:01 +00001038 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001039 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001040 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001041 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001042}
1043
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001044PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001045"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001046\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001047 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001048
1049static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001050array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001051{
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001052 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 PyObject *v;
Thomas Woutersb9eb5512006-02-27 19:44:56 +00001054 if (!PyArg_ParseTuple(args, "nO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001055 return NULL;
1056 return ins(self, i, v);
1057}
1058
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001059PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001060"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001061\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001062Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001063
1064
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001065static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001066array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001067{
Tim Peters077a11d2000-09-16 22:31:29 +00001068 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001069 retval = PyTuple_New(2);
1070 if (!retval)
1071 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001072
1073 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1074 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1075
1076 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001077}
1078
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001079PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001080"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001081\n\
1082Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001083the length in items of the buffer used to hold array's contents\n\
1084The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001085the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001086
1087
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001088static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001089array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001090{
Guido van Rossum778983b1993-02-19 15:55:02 +00001091 return ins(self, (int) self->ob_size, v);
1092}
1093
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001094PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001095"append(x)\n\
1096\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001097Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001098
1099
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001100static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001101array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001102{
1103 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001104 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001105
Guido van Rossum778983b1993-02-19 15:55:02 +00001106 switch (self->ob_descr->itemsize) {
1107 case 1:
1108 break;
1109 case 2:
1110 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1111 char p0 = p[0];
1112 p[0] = p[1];
1113 p[1] = p0;
1114 }
1115 break;
1116 case 4:
1117 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1118 char p0 = p[0];
1119 char p1 = p[1];
1120 p[0] = p[3];
1121 p[1] = p[2];
1122 p[2] = p1;
1123 p[3] = p0;
1124 }
1125 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001126 case 8:
1127 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1128 char p0 = p[0];
1129 char p1 = p[1];
1130 char p2 = p[2];
1131 char p3 = p[3];
1132 p[0] = p[7];
1133 p[1] = p[6];
1134 p[2] = p[5];
1135 p[3] = p[4];
1136 p[4] = p3;
1137 p[5] = p2;
1138 p[6] = p1;
1139 p[7] = p0;
1140 }
1141 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001142 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001143 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001144 "don't know how to byteswap this array type");
1145 return NULL;
1146 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001147 Py_INCREF(Py_None);
1148 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001149}
1150
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001151PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001152"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001153\n\
Fred Drakebf272981999-12-03 17:15:30 +00001154Byteswap 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 +000011554, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001156
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001158array_reduce(arrayobject *array)
1159{
1160 PyObject *dict, *result;
1161
1162 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1163 if (dict == NULL) {
1164 PyErr_Clear();
1165 dict = Py_None;
1166 Py_INCREF(dict);
1167 }
Raymond Hettinger4bbcb642007-04-02 17:03:46 +00001168 if (array->ob_size > 0) {
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001169 if (array->ob_descr->itemsize
1170 > PY_SSIZE_T_MAX / array->ob_size) {
1171 return PyErr_NoMemory();
1172 }
Raymond Hettinger4bbcb642007-04-02 17:03:46 +00001173 result = Py_BuildValue("O(cs#)O",
1174 array->ob_type,
1175 array->ob_descr->typecode,
1176 array->ob_item,
1177 array->ob_size * array->ob_descr->itemsize,
1178 dict);
1179 } else {
1180 result = Py_BuildValue("O(c)O",
1181 array->ob_type,
1182 array->ob_descr->typecode,
1183 dict);
1184 }
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001185 Py_DECREF(dict);
1186 return result;
1187}
1188
1189PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1190
1191static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001192array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001193{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001194 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001195 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001196 /* little buffer to hold items while swapping */
1197 char tmp[256]; /* 8 is probably enough -- but why skimp */
Skip Montanarocbe2e492006-04-18 19:39:48 +00001198 assert((size_t)itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001199
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001201 for (p = self->ob_item,
1202 q = self->ob_item + (self->ob_size - 1)*itemsize;
1203 p < q;
1204 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001205 /* memory areas guaranteed disjoint, so memcpy
1206 * is safe (& memmove may be slower).
1207 */
1208 memcpy(tmp, p, itemsize);
1209 memcpy(p, q, itemsize);
1210 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001211 }
1212 }
Tim Petersbb307342000-09-10 05:22:54 +00001213
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001214 Py_INCREF(Py_None);
1215 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001216}
Guido van Rossume77a7571993-11-03 15:01:26 +00001217
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001218PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001219"reverse()\n\
1220\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001221Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001222
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001223static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001224array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001225{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001227 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001228 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001229 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001233 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001234 return NULL;
1235 }
1236 if (n > 0) {
1237 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001238 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001239 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001240 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001241 size_t newbytes;
1242 /* Be careful here about overflow */
1243 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001244 (newbytes = newlength * itemsize) / itemsize !=
1245 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001246 goto nomem;
1247 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001248 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001249 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 return NULL;
1252 }
1253 self->ob_item = item;
1254 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001255 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001256 nread = fread(item + (self->ob_size - n) * itemsize,
1257 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001258 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001259 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001260 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001261 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001262 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001263 PyErr_SetString(PyExc_EOFError,
1264 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 return NULL;
1266 }
1267 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268 Py_INCREF(Py_None);
1269 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001270}
1271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001272PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001273"fromfile(f, n)\n\
1274\n\
1275Read 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 +00001276array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001277
1278
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001279static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001280array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001281{
Guido van Rossum778983b1993-02-19 15:55:02 +00001282 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001283
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001284 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001285 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001286 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001287 return NULL;
1288 }
1289 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001290 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1291 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001292 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001293 clearerr(fp);
1294 return NULL;
1295 }
1296 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001297 Py_INCREF(Py_None);
1298 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001299}
1300
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001301PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001302"tofile(f)\n\
1303\n\
1304Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001305write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001306
1307
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001308static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001309array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001310{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001311 Py_ssize_t n;
1312 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001313
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001314 if (!PyList_Check(list)) {
1315 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001316 return NULL;
1317 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001318 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001319 if (n > 0) {
1320 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001321 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001322 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001323 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001324 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001325 return NULL;
1326 }
1327 self->ob_item = item;
1328 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001329 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001330 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001331 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001332 if ((*self->ob_descr->setitem)(self,
1333 self->ob_size - n + i, v) != 0) {
1334 self->ob_size -= n;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001335 if (itemsize && (self->ob_size > PY_SSIZE_T_MAX / itemsize)) {
1336 return PyErr_NoMemory();
1337 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338 PyMem_RESIZE(item, char,
1339 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001340 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001341 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001342 return NULL;
1343 }
1344 }
1345 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001346 Py_INCREF(Py_None);
1347 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001348}
1349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001350PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001351"fromlist(list)\n\
1352\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001353Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001354
1355
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001356static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001357array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001358{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001359 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001360 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001361
Guido van Rossum778983b1993-02-19 15:55:02 +00001362 if (list == NULL)
1363 return NULL;
1364 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001366 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001367 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001368 return NULL;
1369 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001370 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001371 }
1372 return list;
1373}
1374
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001375PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001376"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001377\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001378Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001379
1380
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001381static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001382array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001383{
1384 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001385 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001387 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 return NULL;
1389 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001390 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001391 "string length not a multiple of item size");
1392 return NULL;
1393 }
1394 n = n / itemsize;
1395 if (n > 0) {
1396 char *item = self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001397 if ((n > PY_SSIZE_T_MAX - self->ob_size) ||
1398 ((self->ob_size + n) > PY_SSIZE_T_MAX / itemsize)) {
1399 return PyErr_NoMemory();
1400 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001401 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001404 return NULL;
1405 }
1406 self->ob_item = item;
1407 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001408 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001409 memcpy(item + (self->ob_size - n) * itemsize,
1410 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001411 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001412 Py_INCREF(Py_None);
1413 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001414}
1415
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001416PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001417"fromstring(string)\n\
1418\n\
1419Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001420values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001421
1422
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001423static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001424array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001425{
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001426 if (self->ob_size <= PY_SSIZE_T_MAX / self->ob_descr->itemsize) {
1427 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001428 self->ob_size * self->ob_descr->itemsize);
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001429 } else {
1430 return PyErr_NoMemory();
1431 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001432}
1433
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001434PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001435"tostring() -> string\n\
1436\n\
1437Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001439
Martin v. Löwis99866332002-03-01 10:27:01 +00001440
1441
1442#ifdef Py_USING_UNICODE
1443static PyObject *
1444array_fromunicode(arrayobject *self, PyObject *args)
1445{
1446 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001447 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001448
1449 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1450 return NULL;
1451 if (self->ob_descr->typecode != 'u') {
1452 PyErr_SetString(PyExc_ValueError,
1453 "fromunicode() may only be called on "
1454 "type 'u' arrays");
1455 return NULL;
1456 }
1457 if (n > 0) {
1458 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
Martin v. Löwis73c01d42008-02-14 11:26:18 +00001459 if (self->ob_size > PY_SSIZE_T_MAX - n) {
1460 return PyErr_NoMemory();
1461 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001462 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1463 if (item == NULL) {
1464 PyErr_NoMemory();
1465 return NULL;
1466 }
1467 self->ob_item = (char *) item;
1468 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001469 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001470 memcpy(item + self->ob_size - n,
1471 ustr, n * sizeof(Py_UNICODE));
1472 }
1473
1474 Py_INCREF(Py_None);
1475 return Py_None;
1476}
1477
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001478PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001479"fromunicode(ustr)\n\
1480\n\
1481Extends this array with data from the unicode string ustr.\n\
1482The array must be a type 'u' array; otherwise a ValueError\n\
1483is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001484append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001485
1486
1487static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001488array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001489{
Martin v. Löwis99866332002-03-01 10:27:01 +00001490 if (self->ob_descr->typecode != 'u') {
1491 PyErr_SetString(PyExc_ValueError,
1492 "tounicode() may only be called on type 'u' arrays");
1493 return NULL;
1494 }
1495 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1496}
1497
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001498PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001499"tounicode() -> unicode\n\
1500\n\
1501Convert the array to a unicode string. The array must be\n\
1502a type 'u' array; otherwise a ValueError is raised. Use\n\
1503array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001504an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001505
1506#endif /* Py_USING_UNICODE */
1507
1508
1509static PyObject *
1510array_get_typecode(arrayobject *a, void *closure)
1511{
1512 char tc = a->ob_descr->typecode;
1513 return PyString_FromStringAndSize(&tc, 1);
1514}
1515
1516static PyObject *
1517array_get_itemsize(arrayobject *a, void *closure)
1518{
1519 return PyInt_FromLong((long)a->ob_descr->itemsize);
1520}
1521
1522static PyGetSetDef array_getsets [] = {
1523 {"typecode", (getter) array_get_typecode, NULL,
1524 "the typecode character used to create the array"},
1525 {"itemsize", (getter) array_get_itemsize, NULL,
1526 "the size, in bytes, of one array item"},
1527 {NULL}
1528};
1529
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001530PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001531 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001532 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001533 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001534 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001535 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001536 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001537 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1538 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001539 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001540 count_doc},
Thomas Wouters04e82042006-12-29 14:42:17 +00001541 {"__deepcopy__",(PyCFunction)array_copy, METH_O,
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001542 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001543 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001544 extend_doc},
1545 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1546 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001547 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001548 fromlist_doc},
1549 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1550 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001551#ifdef Py_USING_UNICODE
1552 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1553 fromunicode_doc},
1554#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001555 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001556 index_doc},
1557 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1558 insert_doc},
1559 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1560 pop_doc},
1561 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1562 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001563 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1564 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001565 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001566 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001567 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001568 reverse_doc},
1569/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1570 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001571 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001572 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001573 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001574 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001575 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001576 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001577#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001578 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001579 tounicode_doc},
1580#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001581 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001582 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001583 {NULL, NULL} /* sentinel */
1584};
1585
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001586static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001587array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001588{
Martin v. Löwis99866332002-03-01 10:27:01 +00001589 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001590 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001591 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001592
Guido van Rossum778983b1993-02-19 15:55:02 +00001593 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001594 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001595 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001596 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001597 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001598 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001599
1600 if (typecode == 'c')
1601 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001602#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001603 else if (typecode == 'u')
1604 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001605#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001606 else
1607 v = array_tolist(a, NULL);
1608 t = PyObject_Repr(v);
1609 Py_XDECREF(v);
1610
1611 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001612 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001613 PyString_ConcatAndDel(&s, t);
1614 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001615 return s;
1616}
1617
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001618static PyObject*
1619array_subscr(arrayobject* self, PyObject* item)
1620{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001621 if (PyIndex_Check(item)) {
1622 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001623 if (i==-1 && PyErr_Occurred()) {
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001624 return NULL;
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001625 }
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001626 if (i < 0)
1627 i += self->ob_size;
1628 return array_item(self, i);
1629 }
1630 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001631 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001632 PyObject* result;
1633 arrayobject* ar;
1634 int itemsize = self->ob_descr->itemsize;
1635
1636 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1637 &start, &stop, &step, &slicelength) < 0) {
1638 return NULL;
1639 }
1640
1641 if (slicelength <= 0) {
1642 return newarrayobject(&Arraytype, 0, self->ob_descr);
1643 }
1644 else {
1645 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1646 if (!result) return NULL;
1647
1648 ar = (arrayobject*)result;
1649
1650 for (cur = start, i = 0; i < slicelength;
1651 cur += step, i++) {
1652 memcpy(ar->ob_item + i*itemsize,
1653 self->ob_item + cur*itemsize,
1654 itemsize);
1655 }
1656
1657 return result;
1658 }
1659 }
1660 else {
1661 PyErr_SetString(PyExc_TypeError,
1662 "list indices must be integers");
1663 return NULL;
1664 }
1665}
1666
1667static int
1668array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1669{
Neal Norwitz8a87f5d2006-08-12 17:03:09 +00001670 if (PyIndex_Check(item)) {
1671 Py_ssize_t i = PyNumber_AsSsize_t(item, PyExc_IndexError);
Guido van Rossum38fff8c2006-03-07 18:50:55 +00001672 if (i==-1 && PyErr_Occurred())
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001673 return -1;
1674 if (i < 0)
1675 i += self->ob_size;
1676 return array_ass_item(self, i, value);
1677 }
1678 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001679 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001680 int itemsize = self->ob_descr->itemsize;
1681
1682 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1683 &start, &stop, &step, &slicelength) < 0) {
1684 return -1;
1685 }
1686
1687 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1688 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1689 return array_ass_slice(self, start, stop, value);
1690
1691 if (value == NULL) {
1692 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001693 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001694
1695 if (slicelength <= 0)
1696 return 0;
1697
1698 if (step < 0) {
1699 stop = start + 1;
1700 start = stop + step*(slicelength - 1) - 1;
1701 step = -step;
1702 }
1703
Michael W. Hudson56796f62002-07-29 14:35:04 +00001704 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001705 cur += step, i++) {
1706 memmove(self->ob_item + (cur - i)*itemsize,
1707 self->ob_item + (cur + 1)*itemsize,
1708 (step - 1) * itemsize);
1709 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001710 extra = self->ob_size - (cur + 1);
1711 if (extra > 0) {
1712 memmove(self->ob_item + (cur - i)*itemsize,
1713 self->ob_item + (cur + 1)*itemsize,
1714 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001715 }
1716
1717 self->ob_size -= slicelength;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001718 self->ob_item = (char *)PyMem_REALLOC(self->ob_item,
1719 itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001720 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001721
1722 return 0;
1723 }
1724 else {
1725 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001726 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001727 arrayobject* av;
1728
1729 if (!array_Check(value)) {
1730 PyErr_Format(PyExc_TypeError,
1731 "must assign array (not \"%.200s\") to slice",
1732 value->ob_type->tp_name);
1733 return -1;
1734 }
1735
1736 av = (arrayobject*)value;
1737
1738 if (av->ob_size != slicelength) {
1739 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001740 "attempt to assign array of size %ld to extended slice of size %ld",
1741 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001742 return -1;
1743 }
1744
1745 if (!slicelength)
1746 return 0;
1747
1748 /* protect against a[::-1] = a */
1749 if (self == av) {
1750 value = array_slice(av, 0, av->ob_size);
1751 av = (arrayobject*)value;
Neal Norwitz6f5ff3f2006-08-12 01:43:40 +00001752 if (!av)
1753 return -1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001754 }
1755 else {
1756 Py_INCREF(value);
1757 }
1758
1759 for (cur = start, i = 0; i < slicelength;
1760 cur += step, i++) {
1761 memcpy(self->ob_item + cur*itemsize,
1762 av->ob_item + i*itemsize,
1763 itemsize);
1764 }
1765
1766 Py_DECREF(value);
1767
1768 return 0;
1769 }
1770 }
1771 else {
1772 PyErr_SetString(PyExc_TypeError,
1773 "list indices must be integers");
1774 return -1;
1775 }
1776}
1777
1778static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001779 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001780 (binaryfunc)array_subscr,
1781 (objobjargproc)array_ass_subscr
1782};
1783
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001784static const void *emptybuf = "";
1785
Martin v. Löwis18e16552006-02-15 17:27:45 +00001786static Py_ssize_t
1787array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001788{
1789 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001790 PyErr_SetString(PyExc_SystemError,
1791 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001792 return -1;
1793 }
1794 *ptr = (void *)self->ob_item;
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001795 if (*ptr == NULL)
1796 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001797 return self->ob_size*self->ob_descr->itemsize;
1798}
1799
Martin v. Löwis18e16552006-02-15 17:27:45 +00001800static Py_ssize_t
1801array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001802{
1803 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001804 PyErr_SetString(PyExc_SystemError,
1805 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001806 return -1;
1807 }
1808 *ptr = (void *)self->ob_item;
Raymond Hettingerd6030ac2007-04-02 22:39:08 +00001809 if (*ptr == NULL)
1810 *ptr = emptybuf;
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001811 return self->ob_size*self->ob_descr->itemsize;
1812}
1813
Martin v. Löwis18e16552006-02-15 17:27:45 +00001814static Py_ssize_t
1815array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001816{
1817 if ( lenp )
1818 *lenp = self->ob_size*self->ob_descr->itemsize;
1819 return 1;
1820}
1821
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001822static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001823 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001824 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001825 (ssizeargfunc)array_repeat, /*sq_repeat*/
1826 (ssizeargfunc)array_item, /*sq_item*/
1827 (ssizessizeargfunc)array_slice, /*sq_slice*/
1828 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1829 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001830 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001831 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001832 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001833};
1834
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001835static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001836 (readbufferproc)array_buffer_getreadbuf,
1837 (writebufferproc)array_buffer_getwritebuf,
1838 (segcountproc)array_buffer_getsegcount,
Brett Cannonde3b0522006-06-08 17:00:45 +00001839 NULL,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001840};
1841
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001842static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001843array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001844{
1845 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001846 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001847 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001848
Georg Brandl8e932e72007-01-21 10:28:56 +00001849 if (type == &Arraytype && !_PyArg_NoKeywords("array.array()", kwds))
Georg Brandl02c42872005-08-26 06:42:30 +00001850 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001851
1852 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1853 return NULL;
1854
1855 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001856 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001857 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001858 it = PyObject_GetIter(initial);
1859 if (it == NULL)
1860 return NULL;
1861 /* We set initial to NULL so that the subsequent code
1862 will create an empty array of the appropriate type
1863 and afterwards we can use array_iter_extend to populate
1864 the array.
1865 */
1866 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001867 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001868 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1869 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001870 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001871 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001872
1873 if (initial == NULL || !(PyList_Check(initial)
1874 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001875 len = 0;
1876 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001877 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001878
1879 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001880 if (a == NULL)
1881 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001882
Guido van Rossum778983b1993-02-19 15:55:02 +00001883 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001884 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001885 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001886 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001887 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001888 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001889 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001890 return NULL;
1891 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001892 if (setarrayitem(a, i, v) != 0) {
1893 Py_DECREF(v);
1894 Py_DECREF(a);
1895 return NULL;
1896 }
1897 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001898 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001899 } else if (initial != NULL && PyString_Check(initial)) {
Hye-Shik Chang4af5c8c2006-03-07 15:39:21 +00001900 PyObject *t_initial, *v;
1901 t_initial = PyTuple_Pack(1, initial);
1902 if (t_initial == NULL) {
1903 Py_DECREF(a);
1904 return NULL;
1905 }
1906 v = array_fromstring((arrayobject *)a,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001907 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001908 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001909 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001910 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001911 return NULL;
1912 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001913 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001914#ifdef Py_USING_UNICODE
1915 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001916 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001917 if (n > 0) {
1918 arrayobject *self = (arrayobject *)a;
1919 char *item = self->ob_item;
Skip Montanarocbe2e492006-04-18 19:39:48 +00001920 item = (char *)PyMem_Realloc(item, n);
Martin v. Löwis99866332002-03-01 10:27:01 +00001921 if (item == NULL) {
1922 PyErr_NoMemory();
1923 Py_DECREF(a);
1924 return NULL;
1925 }
1926 self->ob_item = item;
1927 self->ob_size = n / sizeof(Py_UNICODE);
1928 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001929 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001930 }
1931#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001932 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001933 if (it != NULL) {
1934 if (array_iter_extend((arrayobject *)a, it) == -1) {
1935 Py_DECREF(it);
1936 Py_DECREF(a);
1937 return NULL;
1938 }
1939 Py_DECREF(it);
1940 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001941 return a;
1942 }
1943 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001944 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001945 "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 +00001946 return NULL;
1947}
1948
Guido van Rossum778983b1993-02-19 15:55:02 +00001949
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001950PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001951"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001952an array of basic values: characters, integers, floating point\n\
1953numbers. Arrays are sequence types and behave very much like lists,\n\
1954except that the type of objects stored in them is constrained. The\n\
1955type is specified at object creation time by using a type code, which\n\
1956is a single character. The following type codes are defined:\n\
1957\n\
1958 Type code C Type Minimum size in bytes \n\
1959 'c' character 1 \n\
1960 'b' signed integer 1 \n\
1961 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001962 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001963 'h' signed integer 2 \n\
1964 'H' unsigned integer 2 \n\
1965 'i' signed integer 2 \n\
1966 'I' unsigned integer 2 \n\
1967 'l' signed integer 4 \n\
1968 'L' unsigned integer 4 \n\
1969 'f' floating point 4 \n\
1970 'd' floating point 8 \n\
1971\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001972The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001973\n\
1974array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001975");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001976
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001977PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001978"array(typecode [, initializer]) -> array\n\
1979\n\
1980Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001981initialized from the optional initializer value, which must be a list,\n\
1982string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001983\n\
1984Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001985the type of objects stored in them is constrained.\n\
1986\n\
1987Methods:\n\
1988\n\
1989append() -- append a new item to the end of the array\n\
1990buffer_info() -- return information giving the current memory info\n\
1991byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001992count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001993extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001994fromfile() -- read items from a file object\n\
1995fromlist() -- append items from the list\n\
1996fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001997index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001998insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001999pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002000read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00002001remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002002reverse() -- reverse the order of the items in the array\n\
2003tofile() -- write all items to a file object\n\
2004tolist() -- return the array converted to an ordinary list\n\
2005tostring() -- return the array converted to a string\n\
2006write() -- DEPRECATED, use tofile()\n\
2007\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00002008Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002009\n\
2010typecode -- the typecode character used to create the array\n\
2011itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00002012");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002013
Raymond Hettinger625812f2003-01-07 01:58:52 +00002014static PyObject *array_iter(arrayobject *ao);
2015
Tim Peters0c322792002-07-17 16:49:03 +00002016static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00002017 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002018 0,
Guido van Rossum14648392001-12-08 18:02:58 +00002019 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002020 sizeof(arrayobject),
2021 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002022 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00002023 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00002024 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002025 0, /* tp_setattr */
2026 0, /* tp_compare */
2027 (reprfunc)array_repr, /* tp_repr */
Martin Blais2856e5f2006-05-26 12:03:27 +00002028 0, /* tp_as_number*/
2029 &array_as_sequence, /* tp_as_sequence*/
2030 &array_as_mapping, /* tp_as_mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002031 0, /* tp_hash */
2032 0, /* tp_call */
2033 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002034 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002035 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00002036 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002037 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00002038 arraytype_doc, /* tp_doc */
2039 0, /* tp_traverse */
2040 0, /* tp_clear */
2041 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00002042 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002043 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00002044 0, /* tp_iternext */
2045 array_methods, /* tp_methods */
2046 0, /* tp_members */
2047 array_getsets, /* tp_getset */
2048 0, /* tp_base */
2049 0, /* tp_dict */
2050 0, /* tp_descr_get */
2051 0, /* tp_descr_set */
2052 0, /* tp_dictoffset */
2053 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002054 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002055 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002056 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002057};
2058
Raymond Hettinger625812f2003-01-07 01:58:52 +00002059
2060/*********************** Array Iterator **************************/
2061
2062typedef struct {
2063 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002064 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002065 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002066 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002067} arrayiterobject;
2068
2069static PyTypeObject PyArrayIter_Type;
2070
2071#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2072
2073static PyObject *
2074array_iter(arrayobject *ao)
2075{
2076 arrayiterobject *it;
2077
2078 if (!array_Check(ao)) {
2079 PyErr_BadInternalCall();
2080 return NULL;
2081 }
2082
2083 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2084 if (it == NULL)
2085 return NULL;
2086
2087 Py_INCREF(ao);
2088 it->ao = ao;
2089 it->index = 0;
2090 it->getitem = ao->ob_descr->getitem;
2091 PyObject_GC_Track(it);
2092 return (PyObject *)it;
2093}
2094
2095static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002096arrayiter_next(arrayiterobject *it)
2097{
2098 assert(PyArrayIter_Check(it));
2099 if (it->index < it->ao->ob_size)
2100 return (*it->getitem)(it->ao, it->index++);
2101 return NULL;
2102}
2103
2104static void
2105arrayiter_dealloc(arrayiterobject *it)
2106{
2107 PyObject_GC_UnTrack(it);
2108 Py_XDECREF(it->ao);
2109 PyObject_GC_Del(it);
2110}
2111
2112static int
2113arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2114{
Thomas Woutersc6e55062006-04-15 21:47:09 +00002115 Py_VISIT(it->ao);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002116 return 0;
2117}
2118
2119static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002120 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002121 0, /* ob_size */
2122 "arrayiterator", /* tp_name */
2123 sizeof(arrayiterobject), /* tp_basicsize */
2124 0, /* tp_itemsize */
2125 /* methods */
2126 (destructor)arrayiter_dealloc, /* tp_dealloc */
2127 0, /* tp_print */
2128 0, /* tp_getattr */
2129 0, /* tp_setattr */
2130 0, /* tp_compare */
2131 0, /* tp_repr */
2132 0, /* tp_as_number */
2133 0, /* tp_as_sequence */
2134 0, /* tp_as_mapping */
2135 0, /* tp_hash */
2136 0, /* tp_call */
2137 0, /* tp_str */
2138 PyObject_GenericGetAttr, /* tp_getattro */
2139 0, /* tp_setattro */
2140 0, /* tp_as_buffer */
2141 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2142 0, /* tp_doc */
2143 (traverseproc)arrayiter_traverse, /* tp_traverse */
2144 0, /* tp_clear */
2145 0, /* tp_richcompare */
2146 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002147 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002148 (iternextfunc)arrayiter_next, /* tp_iternext */
2149 0, /* tp_methods */
2150};
2151
2152
2153/*********************** Install Module **************************/
2154
Martin v. Löwis99866332002-03-01 10:27:01 +00002155/* No functions in array module. */
2156static PyMethodDef a_methods[] = {
2157 {NULL, NULL, 0, NULL} /* Sentinel */
2158};
2159
2160
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002161PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002162initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002163{
Fred Drakef4e34842002-04-01 03:45:06 +00002164 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002165
Martin v. Löwis99866332002-03-01 10:27:01 +00002166 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002167 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002168 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002169 if (m == NULL)
2170 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002171
2172 Py_INCREF((PyObject *)&Arraytype);
2173 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2174 Py_INCREF((PyObject *)&Arraytype);
2175 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002176 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002177}