blob: 4152baddf129b8c995a187dba74f93c94a975f86 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Martin v. Löwis18e16552006-02-15 17:27:45 +00006#define PY_SSIZE_T_CLEAN
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Raymond Hettingercb87bc82004-05-31 00:35:52 +00008#include "structmember.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00009
Guido van Rossum0c709541994-08-19 12:01:32 +000010#ifdef STDC_HEADERS
11#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000012#else /* !STDC_HEADERS */
13#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000014#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000015#endif /* DONT_HAVE_SYS_TYPES_H */
16#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000017
18struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Martin v. Löwis18e16552006-02-15 17:27:45 +000027 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
28 int (*setitem)(struct arrayobject *, Py_ssize_t, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
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) {
189 PyErr_SetString(PyExc_TypeError, "array item must be unicode character");
190 return -1;
191 }
192 if (i >= 0)
193 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
194 return 0;
195}
196#endif
197
Guido van Rossum549ab711997-01-03 19:09:47 +0000198static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000199h_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000200{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000201 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000202}
203
204static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000205h_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000206{
207 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000208 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000209 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000210 return -1;
211 if (i >= 0)
212 ((short *)ap->ob_item)[i] = x;
213 return 0;
214}
215
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000216static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000217HH_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000218{
219 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
220}
221
Fred Drake541dc3b2000-06-28 17:49:30 +0000222static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000223HH_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000224{
225 int x;
226 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
227 must use the next size up and manually do the overflow checking */
228 if (!PyArg_Parse(v, "i;array item must be integer", &x))
229 return -1;
230 else if (x < 0) {
231 PyErr_SetString(PyExc_OverflowError,
232 "unsigned short is less than minimum");
233 return -1;
234 }
235 else if (x > USHRT_MAX) {
236 PyErr_SetString(PyExc_OverflowError,
237 "unsigned short is greater than maximum");
238 return -1;
239 }
240 if (i >= 0)
241 ((short *)ap->ob_item)[i] = (short)x;
242 return 0;
243}
Guido van Rossum549ab711997-01-03 19:09:47 +0000244
245static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000246i_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000247{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000248 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000249}
250
251static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000252i_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000253{
254 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000255 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000256 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000257 return -1;
258 if (i >= 0)
259 ((int *)ap->ob_item)[i] = x;
260 return 0;
261}
262
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000263static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000264II_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000265{
266 return PyLong_FromUnsignedLong(
267 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
268}
269
270static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000271II_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000272{
273 unsigned long x;
274 if (PyLong_Check(v)) {
275 x = PyLong_AsUnsignedLong(v);
276 if (x == (unsigned long) -1 && PyErr_Occurred())
277 return -1;
278 }
279 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000280 long y;
281 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000282 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000283 if (y < 0) {
284 PyErr_SetString(PyExc_OverflowError,
285 "unsigned int is less than minimum");
286 return -1;
287 }
288 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000289
Guido van Rossum549ab711997-01-03 19:09:47 +0000290 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000291 if (x > UINT_MAX) {
292 PyErr_SetString(PyExc_OverflowError,
293 "unsigned int is greater than maximum");
294 return -1;
295 }
296
Guido van Rossum549ab711997-01-03 19:09:47 +0000297 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000298 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000299 return 0;
300}
301
302static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000303l_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000304{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000305 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000306}
307
308static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000309l_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000310{
311 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000312 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000313 return -1;
314 if (i >= 0)
315 ((long *)ap->ob_item)[i] = x;
316 return 0;
317}
318
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000319static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000320LL_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000321{
322 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
323}
324
325static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000326LL_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000327{
328 unsigned long x;
329 if (PyLong_Check(v)) {
330 x = PyLong_AsUnsignedLong(v);
331 if (x == (unsigned long) -1 && PyErr_Occurred())
332 return -1;
333 }
334 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000335 long y;
336 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000337 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000338 if (y < 0) {
339 PyErr_SetString(PyExc_OverflowError,
340 "unsigned long is less than minimum");
341 return -1;
342 }
343 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000344
Guido van Rossum549ab711997-01-03 19:09:47 +0000345 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000346 if (x > ULONG_MAX) {
347 PyErr_SetString(PyExc_OverflowError,
348 "unsigned long is greater than maximum");
349 return -1;
350 }
Tim Petersbb307342000-09-10 05:22:54 +0000351
Guido van Rossum549ab711997-01-03 19:09:47 +0000352 if (i >= 0)
353 ((unsigned long *)ap->ob_item)[i] = x;
354 return 0;
355}
356
357static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000358f_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000359{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000360 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000361}
362
363static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000364f_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000365{
366 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000367 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000368 return -1;
369 if (i >= 0)
370 ((float *)ap->ob_item)[i] = x;
371 return 0;
372}
373
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000374static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000375d_getitem(arrayobject *ap, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000376{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000377 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000378}
379
380static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000381d_setitem(arrayobject *ap, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000382{
383 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000384 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000385 return -1;
386 if (i >= 0)
387 ((double *)ap->ob_item)[i] = x;
388 return 0;
389}
390
391/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000392static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000393 {'c', sizeof(char), c_getitem, c_setitem},
394 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000395 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000396#ifdef Py_USING_UNICODE
397 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
398#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000399 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000400 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000401 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000402 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000403 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000404 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000405 {'f', sizeof(float), f_getitem, f_setitem},
406 {'d', sizeof(double), d_getitem, d_setitem},
407 {'\0', 0, 0, 0} /* Sentinel */
408};
Tim Petersbb307342000-09-10 05:22:54 +0000409
410/****************************************************************************
411Implementations of array object methods.
412****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000413
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000414static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000415newarrayobject(PyTypeObject *type, Py_ssize_t size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000416{
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000418 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000419
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000421 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000422 return NULL;
423 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000424
Guido van Rossum778983b1993-02-19 15:55:02 +0000425 nbytes = size * descr->itemsize;
426 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000427 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000428 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000429 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000430 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000431 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000432 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000434 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 if (size <= 0) {
436 op->ob_item = NULL;
437 }
438 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000440 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000441 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000442 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000443 }
444 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000445 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000446 op->allocated = size;
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000447 op->weakreflist = NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000448 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000449}
450
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000451static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000452getarrayitem(PyObject *op, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000453{
454 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000455 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000456 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000457 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000458 return (*ap->ob_descr->getitem)(ap, i);
459}
460
461static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000462ins1(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000463{
Guido van Rossum778983b1993-02-19 15:55:02 +0000464 char *items;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000465 Py_ssize_t n = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000466 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000467 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000468 return -1;
469 }
470 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
471 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000472
473 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000474 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000475 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000476 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000477 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000478 if (where < 0)
479 where = 0;
480 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000481 if (where > n)
482 where = n;
483 /* appends don't need to call memmove() */
484 if (where != n)
485 memmove(items + (where+1)*self->ob_descr->itemsize,
486 items + where*self->ob_descr->itemsize,
487 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000488 return (*self->ob_descr->setitem)(self, where, v);
489}
490
Guido van Rossum778983b1993-02-19 15:55:02 +0000491/* Methods */
492
493static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000494array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000495{
Raymond Hettingercb87bc82004-05-31 00:35:52 +0000496 if (op->weakreflist != NULL)
497 PyObject_ClearWeakRefs((PyObject *) op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000498 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000499 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000500 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000501}
502
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000503static PyObject *
504array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000505{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000506 arrayobject *va, *wa;
507 PyObject *vi = NULL;
508 PyObject *wi = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000509 Py_ssize_t i, k;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000510 PyObject *res;
511
Martin v. Löwis99866332002-03-01 10:27:01 +0000512 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000513 Py_INCREF(Py_NotImplemented);
514 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000515 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000516
517 va = (arrayobject *)v;
518 wa = (arrayobject *)w;
519
520 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
521 /* Shortcut: if the lengths differ, the arrays differ */
522 if (op == Py_EQ)
523 res = Py_False;
524 else
525 res = Py_True;
526 Py_INCREF(res);
527 return res;
528 }
529
530 /* Search for the first index where items are different */
531 k = 1;
532 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
533 vi = getarrayitem(v, i);
534 wi = getarrayitem(w, i);
535 if (vi == NULL || wi == NULL) {
536 Py_XDECREF(vi);
537 Py_XDECREF(wi);
538 return NULL;
539 }
540 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
541 if (k == 0)
542 break; /* Keeping vi and wi alive! */
543 Py_DECREF(vi);
544 Py_DECREF(wi);
545 if (k < 0)
546 return NULL;
547 }
548
549 if (k) {
550 /* No more items to compare -- compare sizes */
Martin v. Löwis18e16552006-02-15 17:27:45 +0000551 Py_ssize_t vs = va->ob_size;
552 Py_ssize_t ws = wa->ob_size;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000553 int cmp;
554 switch (op) {
555 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000556 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000557 case Py_EQ: cmp = vs == ws; break;
558 case Py_NE: cmp = vs != ws; break;
559 case Py_GT: cmp = vs > ws; break;
560 case Py_GE: cmp = vs >= ws; break;
561 default: return NULL; /* cannot happen */
562 }
563 if (cmp)
564 res = Py_True;
565 else
566 res = Py_False;
567 Py_INCREF(res);
568 return res;
569 }
570
571 /* We have an item that differs. First, shortcuts for EQ/NE */
572 if (op == Py_EQ) {
573 Py_INCREF(Py_False);
574 res = Py_False;
575 }
576 else if (op == Py_NE) {
577 Py_INCREF(Py_True);
578 res = Py_True;
579 }
580 else {
581 /* Compare the final item again using the proper operator */
582 res = PyObject_RichCompare(vi, wi, op);
583 }
584 Py_DECREF(vi);
585 Py_DECREF(wi);
586 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000587}
588
Martin v. Löwis18e16552006-02-15 17:27:45 +0000589static Py_ssize_t
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000590array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000591{
592 return a->ob_size;
593}
594
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000595static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000596array_item(arrayobject *a, Py_ssize_t i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000597{
598 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000599 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000600 return NULL;
601 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000602 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000603}
604
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000605static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000606array_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000607{
608 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000609 if (ilow < 0)
610 ilow = 0;
611 else if (ilow > a->ob_size)
612 ilow = a->ob_size;
613 if (ihigh < 0)
614 ihigh = 0;
615 if (ihigh < ilow)
616 ihigh = ilow;
617 else if (ihigh > a->ob_size)
618 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000619 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000620 if (np == NULL)
621 return NULL;
622 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
623 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000624 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000625}
626
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000627static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000628array_copy(arrayobject *a, PyObject *unused)
629{
630 return array_slice(a, 0, a->ob_size);
631}
632
633PyDoc_STRVAR(copy_doc,
634"copy(array)\n\
635\n\
636 Return a copy of the array.");
637
638static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000639array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000640{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000641 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000642 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000643 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000644 PyErr_Format(PyExc_TypeError,
645 "can only append array (not \"%.200s\") to array",
646 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000647 return NULL;
648 }
649#define b ((arrayobject *)bb)
650 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000651 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000652 return NULL;
653 }
654 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000655 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000656 if (np == NULL) {
657 return NULL;
658 }
659 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
660 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000661 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000662 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000663#undef b
664}
665
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000666static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000667array_repeat(arrayobject *a, Py_ssize_t n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000668{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000669 Py_ssize_t i;
670 Py_ssize_t size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000671 arrayobject *np;
672 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000673 Py_ssize_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000674 if (n < 0)
675 n = 0;
676 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000677 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000678 if (np == NULL)
679 return NULL;
680 p = np->ob_item;
681 nbytes = a->ob_size * a->ob_descr->itemsize;
682 for (i = 0; i < n; i++) {
683 memcpy(p, a->ob_item, nbytes);
684 p += nbytes;
685 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000686 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000687}
688
689static int
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000690array_ass_slice(arrayobject *a, Py_ssize_t ilow, Py_ssize_t ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000691{
692 char *item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000693 Py_ssize_t n; /* Size of replacement array */
694 Py_ssize_t d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000695#define b ((arrayobject *)v)
696 if (v == NULL)
697 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000698 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000699 n = b->ob_size;
700 if (a == b) {
701 /* Special case "a[i:j] = a" -- copy b first */
702 int ret;
703 v = array_slice(b, 0, n);
704 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000705 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000706 return ret;
707 }
708 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000709 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000710 return -1;
711 }
712 }
713 else {
Fred Drake137507e2000-06-01 02:02:46 +0000714 PyErr_Format(PyExc_TypeError,
715 "can only assign array (not \"%.200s\") to array slice",
716 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000717 return -1;
718 }
719 if (ilow < 0)
720 ilow = 0;
721 else if (ilow > a->ob_size)
722 ilow = a->ob_size;
723 if (ihigh < 0)
724 ihigh = 0;
725 if (ihigh < ilow)
726 ihigh = ilow;
727 else if (ihigh > a->ob_size)
728 ihigh = a->ob_size;
729 item = a->ob_item;
730 d = n - (ihigh-ilow);
731 if (d < 0) { /* Delete -d items */
732 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
733 item + ihigh*a->ob_descr->itemsize,
734 (a->ob_size-ihigh)*a->ob_descr->itemsize);
735 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000736 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000737 /* Can't fail */
738 a->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000739 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000740 }
741 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000742 PyMem_RESIZE(item, char,
743 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000744 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000745 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 return -1;
747 }
748 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
749 item + ihigh*a->ob_descr->itemsize,
750 (a->ob_size-ihigh)*a->ob_descr->itemsize);
751 a->ob_item = item;
752 a->ob_size += d;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000753 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000754 }
755 if (n > 0)
756 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
757 n*b->ob_descr->itemsize);
758 return 0;
759#undef b
760}
761
762static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000763array_ass_item(arrayobject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000764{
765 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000766 PyErr_SetString(PyExc_IndexError,
767 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000768 return -1;
769 }
770 if (v == NULL)
771 return array_ass_slice(a, i, i+1, v);
772 return (*a->ob_descr->setitem)(a, i, v);
773}
774
775static int
Martin v. Löwis18e16552006-02-15 17:27:45 +0000776setarrayitem(PyObject *a, Py_ssize_t i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000777{
Martin v. Löwis99866332002-03-01 10:27:01 +0000778 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000779 return array_ass_item((arrayobject *)a, i, v);
780}
781
Martin v. Löwis99866332002-03-01 10:27:01 +0000782static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000783array_iter_extend(arrayobject *self, PyObject *bb)
784{
785 PyObject *it, *v;
786
787 it = PyObject_GetIter(bb);
788 if (it == NULL)
789 return -1;
790
791 while ((v = PyIter_Next(it)) != NULL) {
792 if (ins1(self, (int) self->ob_size, v) != 0) {
793 Py_DECREF(v);
794 Py_DECREF(it);
795 return -1;
796 }
797 Py_DECREF(v);
798 }
799 Py_DECREF(it);
800 if (PyErr_Occurred())
801 return -1;
802 return 0;
803}
804
805static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000806array_do_extend(arrayobject *self, PyObject *bb)
807{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000808 Py_ssize_t size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000809
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000810 if (!array_Check(bb))
811 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000812#define b ((arrayobject *)bb)
813 if (self->ob_descr != b->ob_descr) {
814 PyErr_SetString(PyExc_TypeError,
815 "can only extend with array of same kind");
816 return -1;
817 }
818 size = self->ob_size + b->ob_size;
819 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
820 if (self->ob_item == NULL) {
821 PyObject_Del(self);
822 PyErr_NoMemory();
823 return -1;
824 }
825 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
826 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000827 self->ob_size = size;
828 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000829
830 return 0;
831#undef b
832}
833
834static PyObject *
835array_inplace_concat(arrayobject *self, PyObject *bb)
836{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000837 if (!array_Check(bb)) {
838 PyErr_Format(PyExc_TypeError,
839 "can only extend array with array (not \"%.200s\")",
840 bb->ob_type->tp_name);
841 return NULL;
842 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000843 if (array_do_extend(self, bb) == -1)
844 return NULL;
845 Py_INCREF(self);
846 return (PyObject *)self;
847}
848
849static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000850array_inplace_repeat(arrayobject *self, Py_ssize_t n)
Martin v. Löwis99866332002-03-01 10:27:01 +0000851{
852 char *items, *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +0000853 Py_ssize_t size, i;
Martin v. Löwis99866332002-03-01 10:27:01 +0000854
855 if (self->ob_size > 0) {
856 if (n < 0)
857 n = 0;
858 items = self->ob_item;
859 size = self->ob_size * self->ob_descr->itemsize;
860 if (n == 0) {
861 PyMem_FREE(items);
862 self->ob_item = NULL;
863 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000864 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000865 }
866 else {
867 PyMem_Resize(items, char, n * size);
868 if (items == NULL)
869 return PyErr_NoMemory();
870 p = items;
871 for (i = 1; i < n; i++) {
872 p += size;
873 memcpy(p, items, size);
874 }
875 self->ob_item = items;
876 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000877 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000878 }
879 }
880 Py_INCREF(self);
881 return (PyObject *)self;
882}
883
884
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000885static PyObject *
Martin v. Löwis18e16552006-02-15 17:27:45 +0000886ins(arrayobject *self, Py_ssize_t where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000887{
888 if (ins1(self, where, v) != 0)
889 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000890 Py_INCREF(Py_None);
891 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000892}
893
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000894static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000895array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000896{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000897 Py_ssize_t count = 0;
898 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000899
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000900 for (i = 0; i < self->ob_size; i++) {
901 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000902 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000903 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000904 if (cmp > 0)
905 count++;
906 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000907 return NULL;
908 }
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000909 return PyInt_FromSsize_t(count);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000910}
911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000912PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000913"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000915Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916
917static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000918array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000920 Py_ssize_t i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922 for (i = 0; i < self->ob_size; i++) {
923 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000924 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
925 Py_DECREF(selfi);
926 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927 return PyInt_FromLong((long)i);
928 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000929 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000930 return NULL;
931 }
932 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
933 return NULL;
934}
935
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000936PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000937"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000938\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000939Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000940
Raymond Hettinger625812f2003-01-07 01:58:52 +0000941static int
942array_contains(arrayobject *self, PyObject *v)
943{
Martin v. Löwis18e16552006-02-15 17:27:45 +0000944 Py_ssize_t i;
945 int cmp;
Raymond Hettinger625812f2003-01-07 01:58:52 +0000946
947 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
948 PyObject *selfi = getarrayitem((PyObject *)self, i);
949 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
950 Py_DECREF(selfi);
951 }
952 return cmp;
953}
954
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000955static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000956array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000957{
958 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000960 for (i = 0; i < self->ob_size; i++) {
961 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000962 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
963 Py_DECREF(selfi);
964 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000965 if (array_ass_slice(self, i, i+1,
966 (PyObject *)NULL) != 0)
967 return NULL;
968 Py_INCREF(Py_None);
969 return Py_None;
970 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000971 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000972 return NULL;
973 }
974 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
975 return NULL;
976}
977
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000978PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000979"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000981Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982
983static PyObject *
984array_pop(arrayobject *self, PyObject *args)
985{
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000986 Py_ssize_t i = -1;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000987 PyObject *v;
Martin v. Löwisad0a4622006-02-16 14:30:23 +0000988 if (!PyArg_ParseTuple(args, "|n:pop", &i))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000989 return NULL;
990 if (self->ob_size == 0) {
991 /* Special-case most common failure cause */
992 PyErr_SetString(PyExc_IndexError, "pop from empty array");
993 return NULL;
994 }
995 if (i < 0)
996 i += self->ob_size;
997 if (i < 0 || i >= self->ob_size) {
998 PyErr_SetString(PyExc_IndexError, "pop index out of range");
999 return NULL;
1000 }
1001 v = getarrayitem((PyObject *)self,i);
1002 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
1003 Py_DECREF(v);
1004 return NULL;
1005 }
1006 return v;
1007}
1008
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001009PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001010"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001011\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001012Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001013
1014static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001015array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001016{
Martin v. Löwis99866332002-03-01 10:27:01 +00001017 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001018 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001019 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001020 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021}
1022
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001023PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001024"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001025\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001026 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001027
1028static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001029array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001030{
1031 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001033 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001034 return NULL;
1035 return ins(self, i, v);
1036}
1037
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001038PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001039"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001040\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001041Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001042
1043
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001044static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001045array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001046{
Tim Peters077a11d2000-09-16 22:31:29 +00001047 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001048 retval = PyTuple_New(2);
1049 if (!retval)
1050 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001051
1052 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1053 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1054
1055 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001056}
1057
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001058PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001059"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001060\n\
1061Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001062the length in items of the buffer used to hold array's contents\n\
1063The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001064the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001065
1066
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001067static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001068array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001069{
Guido van Rossum778983b1993-02-19 15:55:02 +00001070 return ins(self, (int) self->ob_size, v);
1071}
1072
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001073PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001074"append(x)\n\
1075\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001076Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001077
1078
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001079static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001080array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001081{
1082 char *p;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001083 Py_ssize_t i;
Fred Drakebf272981999-12-03 17:15:30 +00001084
Guido van Rossum778983b1993-02-19 15:55:02 +00001085 switch (self->ob_descr->itemsize) {
1086 case 1:
1087 break;
1088 case 2:
1089 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1090 char p0 = p[0];
1091 p[0] = p[1];
1092 p[1] = p0;
1093 }
1094 break;
1095 case 4:
1096 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1097 char p0 = p[0];
1098 char p1 = p[1];
1099 p[0] = p[3];
1100 p[1] = p[2];
1101 p[2] = p1;
1102 p[3] = p0;
1103 }
1104 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001105 case 8:
1106 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1107 char p0 = p[0];
1108 char p1 = p[1];
1109 char p2 = p[2];
1110 char p3 = p[3];
1111 p[0] = p[7];
1112 p[1] = p[6];
1113 p[2] = p[5];
1114 p[3] = p[4];
1115 p[4] = p3;
1116 p[5] = p2;
1117 p[6] = p1;
1118 p[7] = p0;
1119 }
1120 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001121 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001122 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001123 "don't know how to byteswap this array type");
1124 return NULL;
1125 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001126 Py_INCREF(Py_None);
1127 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001128}
1129
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001130PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001131"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001132\n\
Fred Drakebf272981999-12-03 17:15:30 +00001133Byteswap 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 +000011344, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001135
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001136static PyObject *
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001137array_reduce(arrayobject *array)
1138{
1139 PyObject *dict, *result;
1140
1141 dict = PyObject_GetAttrString((PyObject *)array, "__dict__");
1142 if (dict == NULL) {
1143 PyErr_Clear();
1144 dict = Py_None;
1145 Py_INCREF(dict);
1146 }
1147 result = Py_BuildValue("O(cs#)O",
1148 array->ob_type,
1149 array->ob_descr->typecode,
1150 array->ob_item,
1151 array->ob_size * array->ob_descr->itemsize,
1152 dict);
1153 Py_DECREF(dict);
1154 return result;
1155}
1156
1157PyDoc_STRVAR(array_doc, "Return state information for pickling.");
1158
1159static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001160array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001161{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001162 register Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossume77a7571993-11-03 15:01:26 +00001163 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001164 /* little buffer to hold items while swapping */
1165 char tmp[256]; /* 8 is probably enough -- but why skimp */
1166 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001167
Guido van Rossum778983b1993-02-19 15:55:02 +00001168 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001169 for (p = self->ob_item,
1170 q = self->ob_item + (self->ob_size - 1)*itemsize;
1171 p < q;
1172 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001173 /* memory areas guaranteed disjoint, so memcpy
1174 * is safe (& memmove may be slower).
1175 */
1176 memcpy(tmp, p, itemsize);
1177 memcpy(p, q, itemsize);
1178 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001179 }
1180 }
Tim Petersbb307342000-09-10 05:22:54 +00001181
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001182 Py_INCREF(Py_None);
1183 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001184}
Guido van Rossume77a7571993-11-03 15:01:26 +00001185
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001186PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001187"reverse()\n\
1188\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001189Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001190
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001191static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001192array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001193{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001194 PyObject *f;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001195 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001196 FILE *fp;
Thomas Wouters7a2f83b2006-02-16 17:07:41 +00001197 if (!PyArg_ParseTuple(args, "On:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001198 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001201 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001202 return NULL;
1203 }
1204 if (n > 0) {
1205 char *item = self->ob_item;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001206 Py_ssize_t itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001207 size_t nread;
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001208 Py_ssize_t newlength;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001209 size_t newbytes;
1210 /* Be careful here about overflow */
1211 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001212 (newbytes = newlength * itemsize) / itemsize !=
1213 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001214 goto nomem;
1215 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001216 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001217 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001219 return NULL;
1220 }
1221 self->ob_item = item;
1222 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001223 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001224 nread = fread(item + (self->ob_size - n) * itemsize,
1225 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001226 if (nread < (size_t)n) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001227 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001230 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 PyErr_SetString(PyExc_EOFError,
1232 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001233 return NULL;
1234 }
1235 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001236 Py_INCREF(Py_None);
1237 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001238}
1239
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001240PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001241"fromfile(f, n)\n\
1242\n\
1243Read 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 +00001244array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001245
1246
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001247static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001248array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001249{
Guido van Rossum778983b1993-02-19 15:55:02 +00001250 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001251
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001252 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001253 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001254 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001255 return NULL;
1256 }
1257 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001258 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1259 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001260 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001261 clearerr(fp);
1262 return NULL;
1263 }
1264 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 Py_INCREF(Py_None);
1266 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001267}
1268
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001269PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001270"tofile(f)\n\
1271\n\
1272Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001273write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001274
1275
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001276static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001277array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001278{
Martin v. Löwis18e16552006-02-15 17:27:45 +00001279 Py_ssize_t n;
1280 Py_ssize_t itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001281
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001282 if (!PyList_Check(list)) {
1283 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001284 return NULL;
1285 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001286 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001287 if (n > 0) {
1288 char *item = self->ob_item;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001289 Py_ssize_t i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001290 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001292 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001293 return NULL;
1294 }
1295 self->ob_item = item;
1296 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001297 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001298 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001299 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001300 if ((*self->ob_descr->setitem)(self,
1301 self->ob_size - n + i, v) != 0) {
1302 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001303 PyMem_RESIZE(item, char,
1304 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001305 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001306 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001307 return NULL;
1308 }
1309 }
1310 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001311 Py_INCREF(Py_None);
1312 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001313}
1314
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001315PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001316"fromlist(list)\n\
1317\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001318Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001319
1320
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001321static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001322array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001323{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001324 PyObject *list = PyList_New(self->ob_size);
Martin v. Löwis18e16552006-02-15 17:27:45 +00001325 Py_ssize_t i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001326
Guido van Rossum778983b1993-02-19 15:55:02 +00001327 if (list == NULL)
1328 return NULL;
1329 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001330 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001331 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001332 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001333 return NULL;
1334 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001336 }
1337 return list;
1338}
1339
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001340PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001341"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001342\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001343Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001344
1345
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001346static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001347array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001348{
1349 char *str;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001350 Py_ssize_t n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001351 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001352 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001353 return NULL;
1354 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001355 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001356 "string length not a multiple of item size");
1357 return NULL;
1358 }
1359 n = n / itemsize;
1360 if (n > 0) {
1361 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001364 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001365 return NULL;
1366 }
1367 self->ob_item = item;
1368 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001369 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001370 memcpy(item + (self->ob_size - n) * itemsize,
1371 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001372 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001373 Py_INCREF(Py_None);
1374 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001375}
1376
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001377PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001378"fromstring(string)\n\
1379\n\
1380Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001381values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001382
1383
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001384static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001385array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001386{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001387 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 self->ob_size * self->ob_descr->itemsize);
1389}
1390
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001391PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001392"tostring() -> string\n\
1393\n\
1394Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001395representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001396
Martin v. Löwis99866332002-03-01 10:27:01 +00001397
1398
1399#ifdef Py_USING_UNICODE
1400static PyObject *
1401array_fromunicode(arrayobject *self, PyObject *args)
1402{
1403 Py_UNICODE *ustr;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001404 Py_ssize_t n;
Martin v. Löwis99866332002-03-01 10:27:01 +00001405
1406 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1407 return NULL;
1408 if (self->ob_descr->typecode != 'u') {
1409 PyErr_SetString(PyExc_ValueError,
1410 "fromunicode() may only be called on "
1411 "type 'u' arrays");
1412 return NULL;
1413 }
1414 if (n > 0) {
1415 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1416 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1417 if (item == NULL) {
1418 PyErr_NoMemory();
1419 return NULL;
1420 }
1421 self->ob_item = (char *) item;
1422 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001423 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001424 memcpy(item + self->ob_size - n,
1425 ustr, n * sizeof(Py_UNICODE));
1426 }
1427
1428 Py_INCREF(Py_None);
1429 return Py_None;
1430}
1431
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001432PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001433"fromunicode(ustr)\n\
1434\n\
1435Extends this array with data from the unicode string ustr.\n\
1436The array must be a type 'u' array; otherwise a ValueError\n\
1437is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001438append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001439
1440
1441static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001442array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001443{
Martin v. Löwis99866332002-03-01 10:27:01 +00001444 if (self->ob_descr->typecode != 'u') {
1445 PyErr_SetString(PyExc_ValueError,
1446 "tounicode() may only be called on type 'u' arrays");
1447 return NULL;
1448 }
1449 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1450}
1451
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001452PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001453"tounicode() -> unicode\n\
1454\n\
1455Convert the array to a unicode string. The array must be\n\
1456a type 'u' array; otherwise a ValueError is raised. Use\n\
1457array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001458an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001459
1460#endif /* Py_USING_UNICODE */
1461
1462
1463static PyObject *
1464array_get_typecode(arrayobject *a, void *closure)
1465{
1466 char tc = a->ob_descr->typecode;
1467 return PyString_FromStringAndSize(&tc, 1);
1468}
1469
1470static PyObject *
1471array_get_itemsize(arrayobject *a, void *closure)
1472{
1473 return PyInt_FromLong((long)a->ob_descr->itemsize);
1474}
1475
1476static PyGetSetDef array_getsets [] = {
1477 {"typecode", (getter) array_get_typecode, NULL,
1478 "the typecode character used to create the array"},
1479 {"itemsize", (getter) array_get_itemsize, NULL,
1480 "the size, in bytes, of one array item"},
1481 {NULL}
1482};
1483
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001484PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001485 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001486 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001487 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001488 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001489 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001490 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001491 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1492 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001493 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001494 count_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001495 {"__deepcopy__",(PyCFunction)array_copy, METH_NOARGS,
1496 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001497 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001498 extend_doc},
1499 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1500 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001501 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001502 fromlist_doc},
1503 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1504 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001505#ifdef Py_USING_UNICODE
1506 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1507 fromunicode_doc},
1508#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001509 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001510 index_doc},
1511 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1512 insert_doc},
1513 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1514 pop_doc},
1515 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1516 fromfile_doc},
Raymond Hettingerb0900e62004-12-16 16:23:40 +00001517 {"__reduce__", (PyCFunction)array_reduce, METH_NOARGS,
1518 array_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001519 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001520 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001521 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001522 reverse_doc},
1523/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1524 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001525 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001526 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001527 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001528 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001529 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001530 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001531#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001532 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001533 tounicode_doc},
1534#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001535 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001536 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001537 {NULL, NULL} /* sentinel */
1538};
1539
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001540static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001541array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001542{
Martin v. Löwis99866332002-03-01 10:27:01 +00001543 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001544 PyObject *s, *t, *v = NULL;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001545 Py_ssize_t len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001546
Guido van Rossum778983b1993-02-19 15:55:02 +00001547 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001548 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001549 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001550 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001551 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001552 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001553
1554 if (typecode == 'c')
1555 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001556#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001557 else if (typecode == 'u')
1558 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001559#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001560 else
1561 v = array_tolist(a, NULL);
1562 t = PyObject_Repr(v);
1563 Py_XDECREF(v);
1564
1565 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001566 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001567 PyString_ConcatAndDel(&s, t);
1568 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001569 return s;
1570}
1571
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001572static PyObject*
1573array_subscr(arrayobject* self, PyObject* item)
1574{
1575 if (PyInt_Check(item)) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001576 Py_ssize_t i = PyInt_AS_LONG(item);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001577 if (i < 0)
1578 i += self->ob_size;
1579 return array_item(self, i);
1580 }
1581 else if (PyLong_Check(item)) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001582 Py_ssize_t i = PyInt_AsSsize_t(item);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001583 if (i == -1 && PyErr_Occurred())
1584 return NULL;
1585 if (i < 0)
1586 i += self->ob_size;
1587 return array_item(self, i);
1588 }
1589 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001590 Py_ssize_t start, stop, step, slicelength, cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001591 PyObject* result;
1592 arrayobject* ar;
1593 int itemsize = self->ob_descr->itemsize;
1594
1595 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1596 &start, &stop, &step, &slicelength) < 0) {
1597 return NULL;
1598 }
1599
1600 if (slicelength <= 0) {
1601 return newarrayobject(&Arraytype, 0, self->ob_descr);
1602 }
1603 else {
1604 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1605 if (!result) return NULL;
1606
1607 ar = (arrayobject*)result;
1608
1609 for (cur = start, i = 0; i < slicelength;
1610 cur += step, i++) {
1611 memcpy(ar->ob_item + i*itemsize,
1612 self->ob_item + cur*itemsize,
1613 itemsize);
1614 }
1615
1616 return result;
1617 }
1618 }
1619 else {
1620 PyErr_SetString(PyExc_TypeError,
1621 "list indices must be integers");
1622 return NULL;
1623 }
1624}
1625
1626static int
1627array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1628{
1629 if (PyInt_Check(item)) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001630 Py_ssize_t i = PyInt_AS_LONG(item);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001631 if (i < 0)
1632 i += self->ob_size;
1633 return array_ass_item(self, i, value);
1634 }
1635 else if (PyLong_Check(item)) {
Martin v. Löwisad0a4622006-02-16 14:30:23 +00001636 Py_ssize_t i = PyInt_AsSsize_t(item);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001637 if (i == -1 && PyErr_Occurred())
1638 return -1;
1639 if (i < 0)
1640 i += self->ob_size;
1641 return array_ass_item(self, i, value);
1642 }
1643 else if (PySlice_Check(item)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001644 Py_ssize_t start, stop, step, slicelength;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001645 int itemsize = self->ob_descr->itemsize;
1646
1647 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1648 &start, &stop, &step, &slicelength) < 0) {
1649 return -1;
1650 }
1651
1652 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1653 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1654 return array_ass_slice(self, start, stop, value);
1655
1656 if (value == NULL) {
1657 /* delete slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001658 Py_ssize_t cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001659
1660 if (slicelength <= 0)
1661 return 0;
1662
1663 if (step < 0) {
1664 stop = start + 1;
1665 start = stop + step*(slicelength - 1) - 1;
1666 step = -step;
1667 }
1668
Michael W. Hudson56796f62002-07-29 14:35:04 +00001669 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001670 cur += step, i++) {
1671 memmove(self->ob_item + (cur - i)*itemsize,
1672 self->ob_item + (cur + 1)*itemsize,
1673 (step - 1) * itemsize);
1674 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001675 extra = self->ob_size - (cur + 1);
1676 if (extra > 0) {
1677 memmove(self->ob_item + (cur - i)*itemsize,
1678 self->ob_item + (cur + 1)*itemsize,
1679 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001680 }
1681
1682 self->ob_size -= slicelength;
1683 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001684 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001685
1686 return 0;
1687 }
1688 else {
1689 /* assign slice */
Martin v. Löwis18e16552006-02-15 17:27:45 +00001690 Py_ssize_t cur, i;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001691 arrayobject* av;
1692
1693 if (!array_Check(value)) {
1694 PyErr_Format(PyExc_TypeError,
1695 "must assign array (not \"%.200s\") to slice",
1696 value->ob_type->tp_name);
1697 return -1;
1698 }
1699
1700 av = (arrayobject*)value;
1701
1702 if (av->ob_size != slicelength) {
1703 PyErr_Format(PyExc_ValueError,
Martin v. Löwis18e16552006-02-15 17:27:45 +00001704 "attempt to assign array of size %ld to extended slice of size %ld",
1705 /*XXX*/(long)av->ob_size, /*XXX*/(long)slicelength);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001706 return -1;
1707 }
1708
1709 if (!slicelength)
1710 return 0;
1711
1712 /* protect against a[::-1] = a */
1713 if (self == av) {
1714 value = array_slice(av, 0, av->ob_size);
1715 av = (arrayobject*)value;
1716 }
1717 else {
1718 Py_INCREF(value);
1719 }
1720
1721 for (cur = start, i = 0; i < slicelength;
1722 cur += step, i++) {
1723 memcpy(self->ob_item + cur*itemsize,
1724 av->ob_item + i*itemsize,
1725 itemsize);
1726 }
1727
1728 Py_DECREF(value);
1729
1730 return 0;
1731 }
1732 }
1733 else {
1734 PyErr_SetString(PyExc_TypeError,
1735 "list indices must be integers");
1736 return -1;
1737 }
1738}
1739
1740static PyMappingMethods array_as_mapping = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001741 (lenfunc)array_length,
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001742 (binaryfunc)array_subscr,
1743 (objobjargproc)array_ass_subscr
1744};
1745
Martin v. Löwis18e16552006-02-15 17:27:45 +00001746static Py_ssize_t
1747array_buffer_getreadbuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001748{
1749 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001750 PyErr_SetString(PyExc_SystemError,
1751 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001752 return -1;
1753 }
1754 *ptr = (void *)self->ob_item;
1755 return self->ob_size*self->ob_descr->itemsize;
1756}
1757
Martin v. Löwis18e16552006-02-15 17:27:45 +00001758static Py_ssize_t
1759array_buffer_getwritebuf(arrayobject *self, Py_ssize_t index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001760{
1761 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001762 PyErr_SetString(PyExc_SystemError,
1763 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001764 return -1;
1765 }
1766 *ptr = (void *)self->ob_item;
1767 return self->ob_size*self->ob_descr->itemsize;
1768}
1769
Martin v. Löwis18e16552006-02-15 17:27:45 +00001770static Py_ssize_t
1771array_buffer_getsegcount(arrayobject *self, Py_ssize_t *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001772{
1773 if ( lenp )
1774 *lenp = self->ob_size*self->ob_descr->itemsize;
1775 return 1;
1776}
1777
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001778static PySequenceMethods array_as_sequence = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001779 (lenfunc)array_length, /*sq_length*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001780 (binaryfunc)array_concat, /*sq_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001781 (ssizeargfunc)array_repeat, /*sq_repeat*/
1782 (ssizeargfunc)array_item, /*sq_item*/
1783 (ssizessizeargfunc)array_slice, /*sq_slice*/
1784 (ssizeobjargproc)array_ass_item, /*sq_ass_item*/
1785 (ssizessizeobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001786 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001787 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
Martin v. Löwis18e16552006-02-15 17:27:45 +00001788 (ssizeargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001789};
1790
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001791static PyBufferProcs array_as_buffer = {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001792 (readbufferproc)array_buffer_getreadbuf,
1793 (writebufferproc)array_buffer_getwritebuf,
1794 (segcountproc)array_buffer_getsegcount,
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001795};
1796
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001797static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001798array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001799{
1800 char c;
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001801 PyObject *initial = NULL, *it = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001802 struct arraydescr *descr;
Georg Brandl02c42872005-08-26 06:42:30 +00001803
1804 if (!_PyArg_NoKeywords("array.array()", kwds))
1805 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001806
1807 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1808 return NULL;
1809
1810 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001811 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001812 || (c == 'u' && PyUnicode_Check(initial)))) {
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001813 it = PyObject_GetIter(initial);
1814 if (it == NULL)
1815 return NULL;
1816 /* We set initial to NULL so that the subsequent code
1817 will create an empty array of the appropriate type
1818 and afterwards we can use array_iter_extend to populate
1819 the array.
1820 */
1821 initial = NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001822 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001823 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1824 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001825 PyObject *a;
Martin v. Löwis18e16552006-02-15 17:27:45 +00001826 Py_ssize_t len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001827
1828 if (initial == NULL || !(PyList_Check(initial)
1829 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001830 len = 0;
1831 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001832 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001833
1834 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001835 if (a == NULL)
1836 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001837
Guido van Rossum778983b1993-02-19 15:55:02 +00001838 if (len > 0) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001839 Py_ssize_t i;
Guido van Rossum778983b1993-02-19 15:55:02 +00001840 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001841 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001842 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001843 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001844 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001845 return NULL;
1846 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001847 if (setarrayitem(a, i, v) != 0) {
1848 Py_DECREF(v);
1849 Py_DECREF(a);
1850 return NULL;
1851 }
1852 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001853 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001854 } else if (initial != NULL && PyString_Check(initial)) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001855 PyObject *t_initial = PyTuple_Pack(1,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001856 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001857 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001858 array_fromstring((arrayobject *)a,
1859 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001860 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001861 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001862 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001863 return NULL;
1864 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001865 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001866#ifdef Py_USING_UNICODE
1867 } else if (initial != NULL && PyUnicode_Check(initial)) {
Martin v. Löwis18e16552006-02-15 17:27:45 +00001868 Py_ssize_t n = PyUnicode_GET_DATA_SIZE(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001869 if (n > 0) {
1870 arrayobject *self = (arrayobject *)a;
1871 char *item = self->ob_item;
1872 item = PyMem_Realloc(item, n);
1873 if (item == NULL) {
1874 PyErr_NoMemory();
1875 Py_DECREF(a);
1876 return NULL;
1877 }
1878 self->ob_item = item;
1879 self->ob_size = n / sizeof(Py_UNICODE);
1880 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001881 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001882 }
1883#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001884 }
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001885 if (it != NULL) {
1886 if (array_iter_extend((arrayobject *)a, it) == -1) {
1887 Py_DECREF(it);
1888 Py_DECREF(a);
1889 return NULL;
1890 }
1891 Py_DECREF(it);
1892 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001893 return a;
1894 }
1895 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001896 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001897 "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 +00001898 return NULL;
1899}
1900
Guido van Rossum778983b1993-02-19 15:55:02 +00001901
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001902PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001903"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001904an array of basic values: characters, integers, floating point\n\
1905numbers. Arrays are sequence types and behave very much like lists,\n\
1906except that the type of objects stored in them is constrained. The\n\
1907type is specified at object creation time by using a type code, which\n\
1908is a single character. The following type codes are defined:\n\
1909\n\
1910 Type code C Type Minimum size in bytes \n\
1911 'c' character 1 \n\
1912 'b' signed integer 1 \n\
1913 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001914 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001915 'h' signed integer 2 \n\
1916 'H' unsigned integer 2 \n\
1917 'i' signed integer 2 \n\
1918 'I' unsigned integer 2 \n\
1919 'l' signed integer 4 \n\
1920 'L' unsigned integer 4 \n\
1921 'f' floating point 4 \n\
1922 'd' floating point 8 \n\
1923\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001924The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001925\n\
1926array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001927");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001928
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001929PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001930"array(typecode [, initializer]) -> array\n\
1931\n\
1932Return a new array whose items are restricted by typecode, and\n\
Raymond Hettinger6ab78cd2004-08-29 07:50:43 +00001933initialized from the optional initializer value, which must be a list,\n\
1934string. or iterable over elements of the appropriate type.\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001935\n\
1936Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001937the type of objects stored in them is constrained.\n\
1938\n\
1939Methods:\n\
1940\n\
1941append() -- append a new item to the end of the array\n\
1942buffer_info() -- return information giving the current memory info\n\
1943byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001944count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001945extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001946fromfile() -- read items from a file object\n\
1947fromlist() -- append items from the list\n\
1948fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001949index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001950insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001951pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001952read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001953remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001954reverse() -- reverse the order of the items in the array\n\
1955tofile() -- write all items to a file object\n\
1956tolist() -- return the array converted to an ordinary list\n\
1957tostring() -- return the array converted to a string\n\
1958write() -- DEPRECATED, use tofile()\n\
1959\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001960Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001961\n\
1962typecode -- the typecode character used to create the array\n\
1963itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001964");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001965
Raymond Hettinger625812f2003-01-07 01:58:52 +00001966static PyObject *array_iter(arrayobject *ao);
1967
Tim Peters0c322792002-07-17 16:49:03 +00001968static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001969 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001970 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001971 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001972 sizeof(arrayobject),
1973 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001974 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001975 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001976 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001977 0, /* tp_setattr */
1978 0, /* tp_compare */
1979 (reprfunc)array_repr, /* tp_repr */
1980 0, /* tp_as _number*/
1981 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001982 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001983 0, /* tp_hash */
1984 0, /* tp_call */
1985 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001986 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001987 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001988 &array_as_buffer, /* tp_as_buffer*/
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001989 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE | Py_TPFLAGS_HAVE_WEAKREFS, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001990 arraytype_doc, /* tp_doc */
1991 0, /* tp_traverse */
1992 0, /* tp_clear */
1993 array_richcompare, /* tp_richcompare */
Raymond Hettingercb87bc82004-05-31 00:35:52 +00001994 offsetof(arrayobject, weakreflist), /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00001995 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00001996 0, /* tp_iternext */
1997 array_methods, /* tp_methods */
1998 0, /* tp_members */
1999 array_getsets, /* tp_getset */
2000 0, /* tp_base */
2001 0, /* tp_dict */
2002 0, /* tp_descr_get */
2003 0, /* tp_descr_set */
2004 0, /* tp_dictoffset */
2005 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002006 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00002007 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00002008 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002009};
2010
Raymond Hettinger625812f2003-01-07 01:58:52 +00002011
2012/*********************** Array Iterator **************************/
2013
2014typedef struct {
2015 PyObject_HEAD
Martin v. Löwis18e16552006-02-15 17:27:45 +00002016 Py_ssize_t index;
Raymond Hettinger625812f2003-01-07 01:58:52 +00002017 arrayobject *ao;
Martin v. Löwis18e16552006-02-15 17:27:45 +00002018 PyObject * (*getitem)(struct arrayobject *, Py_ssize_t);
Raymond Hettinger625812f2003-01-07 01:58:52 +00002019} arrayiterobject;
2020
2021static PyTypeObject PyArrayIter_Type;
2022
2023#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
2024
2025static PyObject *
2026array_iter(arrayobject *ao)
2027{
2028 arrayiterobject *it;
2029
2030 if (!array_Check(ao)) {
2031 PyErr_BadInternalCall();
2032 return NULL;
2033 }
2034
2035 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2036 if (it == NULL)
2037 return NULL;
2038
2039 Py_INCREF(ao);
2040 it->ao = ao;
2041 it->index = 0;
2042 it->getitem = ao->ob_descr->getitem;
2043 PyObject_GC_Track(it);
2044 return (PyObject *)it;
2045}
2046
2047static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002048arrayiter_next(arrayiterobject *it)
2049{
2050 assert(PyArrayIter_Check(it));
2051 if (it->index < it->ao->ob_size)
2052 return (*it->getitem)(it->ao, it->index++);
2053 return NULL;
2054}
2055
2056static void
2057arrayiter_dealloc(arrayiterobject *it)
2058{
2059 PyObject_GC_UnTrack(it);
2060 Py_XDECREF(it->ao);
2061 PyObject_GC_Del(it);
2062}
2063
2064static int
2065arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2066{
2067 if (it->ao != NULL)
2068 return visit((PyObject *)(it->ao), arg);
2069 return 0;
2070}
2071
2072static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002073 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002074 0, /* ob_size */
2075 "arrayiterator", /* tp_name */
2076 sizeof(arrayiterobject), /* tp_basicsize */
2077 0, /* tp_itemsize */
2078 /* methods */
2079 (destructor)arrayiter_dealloc, /* tp_dealloc */
2080 0, /* tp_print */
2081 0, /* tp_getattr */
2082 0, /* tp_setattr */
2083 0, /* tp_compare */
2084 0, /* tp_repr */
2085 0, /* tp_as_number */
2086 0, /* tp_as_sequence */
2087 0, /* tp_as_mapping */
2088 0, /* tp_hash */
2089 0, /* tp_call */
2090 0, /* tp_str */
2091 PyObject_GenericGetAttr, /* tp_getattro */
2092 0, /* tp_setattro */
2093 0, /* tp_as_buffer */
2094 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2095 0, /* tp_doc */
2096 (traverseproc)arrayiter_traverse, /* tp_traverse */
2097 0, /* tp_clear */
2098 0, /* tp_richcompare */
2099 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002100 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002101 (iternextfunc)arrayiter_next, /* tp_iternext */
2102 0, /* tp_methods */
2103};
2104
2105
2106/*********************** Install Module **************************/
2107
Martin v. Löwis99866332002-03-01 10:27:01 +00002108/* No functions in array module. */
2109static PyMethodDef a_methods[] = {
2110 {NULL, NULL, 0, NULL} /* Sentinel */
2111};
2112
2113
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002114PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002115initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002116{
Fred Drakef4e34842002-04-01 03:45:06 +00002117 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002118
Martin v. Löwis99866332002-03-01 10:27:01 +00002119 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002120 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002121 m = Py_InitModule3("array", a_methods, module_doc);
Neal Norwitz1ac754f2006-01-19 06:09:39 +00002122 if (m == NULL)
2123 return;
Fred Drakef4e34842002-04-01 03:45:06 +00002124
2125 Py_INCREF((PyObject *)&Arraytype);
2126 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2127 Py_INCREF((PyObject *)&Arraytype);
2128 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002129 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002130}