blob: ed2ea9d1688183427005a81b87c0f3ab70a2c5a2 [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
Roger E. Masse2919eaa1996-12-09 20:10:36 +00006#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00007
Guido van Rossum0c709541994-08-19 12:01:32 +00008#ifdef STDC_HEADERS
9#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000010#else /* !STDC_HEADERS */
11#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000013#endif /* DONT_HAVE_SYS_TYPES_H */
14#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000015
16struct arrayobject; /* Forward */
17
Tim Petersbb307342000-09-10 05:22:54 +000018/* All possible arraydescr values are defined in the vector "descriptors"
19 * below. That's defined later because the appropriate get and set
20 * functions aren't visible yet.
21 */
Guido van Rossum778983b1993-02-19 15:55:02 +000022struct arraydescr {
23 int typecode;
24 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000025 PyObject * (*getitem)(struct arrayobject *, int);
26 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000027};
28
29typedef struct arrayobject {
Martin v. Löwis99866332002-03-01 10:27:01 +000030 PyObject_HEAD
31 int ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +000032 char *ob_item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000033 int allocated;
Guido van Rossum778983b1993-02-19 15:55:02 +000034 struct arraydescr *ob_descr;
35} arrayobject;
36
Jeremy Hylton938ace62002-07-17 16:30:39 +000037static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000038
Martin v. Löwis99866332002-03-01 10:27:01 +000039#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
40#define array_CheckExact(op) ((op)->ob_type == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000041
Raymond Hettinger6e2ee862004-03-14 04:37:50 +000042static int
43array_resize(arrayobject *self, int newsize)
44{
45 char *items;
46 size_t _new_size;
47
48 /* Bypass realloc() when a previous overallocation is large enough
49 to accommodate the newsize. If the newsize is 16 smaller than the
50 current size, then proceed with the realloc() to shrink the list.
51 */
52
53 if (self->allocated >= newsize &&
54 self->ob_size < newsize + 16 &&
55 self->ob_item != NULL) {
56 self->ob_size = newsize;
57 return 0;
58 }
59
60 /* This over-allocates proportional to the array size, making room
61 * for additional growth. The over-allocation is mild, but is
62 * enough to give linear-time amortized behavior over a long
63 * sequence of appends() in the presence of a poorly-performing
64 * system realloc().
65 * The growth pattern is: 0, 4, 8, 16, 25, 34, 46, 56, 67, 79, ...
66 * Note, the pattern starts out the same as for lists but then
67 * grows at a smaller rate so that larger arrays only overallocate
68 * by about 1/16th -- this is done because arrays are presumed to be more
69 * memory critical.
70 */
71
72 _new_size = (newsize >> 4) + (self->ob_size < 8 ? 3 : 7) + newsize;
73 items = self->ob_item;
74 /* XXX The following multiplication and division does not optimize away
75 like it does for lists since the size is not known at compile time */
76 if (_new_size <= ((~(size_t)0) / self->ob_descr->itemsize))
77 PyMem_RESIZE(items, char, (_new_size * self->ob_descr->itemsize));
78 else
79 items = NULL;
80 if (items == NULL) {
81 PyErr_NoMemory();
82 return -1;
83 }
84 self->ob_item = items;
85 self->ob_size = newsize;
86 self->allocated = _new_size;
87 return 0;
88}
89
Tim Petersbb307342000-09-10 05:22:54 +000090/****************************************************************************
91Get and Set functions for each type.
92A Get function takes an arrayobject* and an integer index, returning the
93array value at that index wrapped in an appropriate PyObject*.
94A Set function takes an arrayobject, integer index, and PyObject*; sets
95the array value at that index to the raw C data extracted from the PyObject*,
96and returns 0 if successful, else nonzero on failure (PyObject* not of an
97appropriate type or value).
98Note that the basic Get and Set functions do NOT check that the index is
99in bounds; that's the responsibility of the caller.
100****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000101
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000102static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000103c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000104{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000105 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000106}
107
108static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000109c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000110{
111 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000112 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000113 return -1;
114 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000115 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000116 return 0;
117}
118
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000119static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000120b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000121{
122 long x = ((char *)ap->ob_item)[i];
123 if (x >= 128)
124 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000125 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000126}
127
128static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000129b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000130{
Fred Drake541dc3b2000-06-28 17:49:30 +0000131 short x;
132 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
133 must use the next size up that is signed ('h') and manually do
134 the overflow checking */
135 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000136 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000137 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000138 PyErr_SetString(PyExc_OverflowError,
139 "signed char is less than minimum");
140 return -1;
141 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000142 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000143 PyErr_SetString(PyExc_OverflowError,
144 "signed char is greater than maximum");
145 return -1;
146 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000147 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000148 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000149 return 0;
150}
151
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000152static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000153BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000154{
155 long x = ((unsigned char *)ap->ob_item)[i];
156 return PyInt_FromLong(x);
157}
158
Fred Drake541dc3b2000-06-28 17:49:30 +0000159static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000160BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000161{
162 unsigned char x;
163 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
164 if (!PyArg_Parse(v, "b;array item must be integer", &x))
165 return -1;
166 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000167 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000168 return 0;
169}
Guido van Rossum549ab711997-01-03 19:09:47 +0000170
Martin v. Löwis99866332002-03-01 10:27:01 +0000171#ifdef Py_USING_UNICODE
172static PyObject *
173u_getitem(arrayobject *ap, int i)
174{
175 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
176}
177
178static int
179u_setitem(arrayobject *ap, int i, PyObject *v)
180{
181 Py_UNICODE *p;
182 int len;
183
184 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
185 return -1;
186 if (len != 1) {
187 PyErr_SetString(PyExc_TypeError, "array item must be unicode character");
188 return -1;
189 }
190 if (i >= 0)
191 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
192 return 0;
193}
194#endif
195
Guido van Rossum549ab711997-01-03 19:09:47 +0000196static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000197h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000198{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000199 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000200}
201
202static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000203h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000204{
205 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000206 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000207 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000208 return -1;
209 if (i >= 0)
210 ((short *)ap->ob_item)[i] = x;
211 return 0;
212}
213
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000214static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000215HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000216{
217 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
218}
219
Fred Drake541dc3b2000-06-28 17:49:30 +0000220static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000221HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000222{
223 int x;
224 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
225 must use the next size up and manually do the overflow checking */
226 if (!PyArg_Parse(v, "i;array item must be integer", &x))
227 return -1;
228 else if (x < 0) {
229 PyErr_SetString(PyExc_OverflowError,
230 "unsigned short is less than minimum");
231 return -1;
232 }
233 else if (x > USHRT_MAX) {
234 PyErr_SetString(PyExc_OverflowError,
235 "unsigned short is greater than maximum");
236 return -1;
237 }
238 if (i >= 0)
239 ((short *)ap->ob_item)[i] = (short)x;
240 return 0;
241}
Guido van Rossum549ab711997-01-03 19:09:47 +0000242
243static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000244i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000245{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000246 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000247}
248
249static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000250i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000251{
252 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000253 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000254 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000255 return -1;
256 if (i >= 0)
257 ((int *)ap->ob_item)[i] = x;
258 return 0;
259}
260
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000261static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000262II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000263{
264 return PyLong_FromUnsignedLong(
265 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
266}
267
268static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000269II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000270{
271 unsigned long x;
272 if (PyLong_Check(v)) {
273 x = PyLong_AsUnsignedLong(v);
274 if (x == (unsigned long) -1 && PyErr_Occurred())
275 return -1;
276 }
277 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000278 long y;
279 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000280 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000281 if (y < 0) {
282 PyErr_SetString(PyExc_OverflowError,
283 "unsigned int is less than minimum");
284 return -1;
285 }
286 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000287
Guido van Rossum549ab711997-01-03 19:09:47 +0000288 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000289 if (x > UINT_MAX) {
290 PyErr_SetString(PyExc_OverflowError,
291 "unsigned int is greater than maximum");
292 return -1;
293 }
294
Guido van Rossum549ab711997-01-03 19:09:47 +0000295 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000296 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000297 return 0;
298}
299
300static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000301l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000302{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000303 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000304}
305
306static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000307l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000308{
309 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000310 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000311 return -1;
312 if (i >= 0)
313 ((long *)ap->ob_item)[i] = x;
314 return 0;
315}
316
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000317static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000318LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000319{
320 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
321}
322
323static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000324LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000325{
326 unsigned long x;
327 if (PyLong_Check(v)) {
328 x = PyLong_AsUnsignedLong(v);
329 if (x == (unsigned long) -1 && PyErr_Occurred())
330 return -1;
331 }
332 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000333 long y;
334 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000335 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000336 if (y < 0) {
337 PyErr_SetString(PyExc_OverflowError,
338 "unsigned long is less than minimum");
339 return -1;
340 }
341 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000342
Guido van Rossum549ab711997-01-03 19:09:47 +0000343 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000344 if (x > ULONG_MAX) {
345 PyErr_SetString(PyExc_OverflowError,
346 "unsigned long is greater than maximum");
347 return -1;
348 }
Tim Petersbb307342000-09-10 05:22:54 +0000349
Guido van Rossum549ab711997-01-03 19:09:47 +0000350 if (i >= 0)
351 ((unsigned long *)ap->ob_item)[i] = x;
352 return 0;
353}
354
355static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000356f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000357{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000358 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000359}
360
361static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000362f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000363{
364 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000365 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000366 return -1;
367 if (i >= 0)
368 ((float *)ap->ob_item)[i] = x;
369 return 0;
370}
371
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000372static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000373d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000374{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000376}
377
378static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000379d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000380{
381 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000382 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000383 return -1;
384 if (i >= 0)
385 ((double *)ap->ob_item)[i] = x;
386 return 0;
387}
388
389/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000390static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000391 {'c', sizeof(char), c_getitem, c_setitem},
392 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000393 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000394#ifdef Py_USING_UNICODE
395 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
396#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000397 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000398 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000399 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000400 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000401 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000402 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000403 {'f', sizeof(float), f_getitem, f_setitem},
404 {'d', sizeof(double), d_getitem, d_setitem},
405 {'\0', 0, 0, 0} /* Sentinel */
406};
Tim Petersbb307342000-09-10 05:22:54 +0000407
408/****************************************************************************
409Implementations of array object methods.
410****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000411
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000412static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +0000413newarrayobject(PyTypeObject *type, int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000414{
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000416 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000417
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000419 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 return NULL;
421 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000422
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 nbytes = size * descr->itemsize;
424 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000425 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000426 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000427 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000428 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000429 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000430 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000431 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000432 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 if (size <= 0) {
434 op->ob_item = NULL;
435 }
436 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000437 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000438 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000439 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000440 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000441 }
442 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000443 op->ob_descr = descr;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000444 op->allocated = size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000445 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000446}
447
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000448static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000449getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000450{
451 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000452 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000453 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000454 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000455 return (*ap->ob_descr->getitem)(ap, i);
456}
457
458static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000459ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000460{
Guido van Rossum778983b1993-02-19 15:55:02 +0000461 char *items;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000462 int n = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000464 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 return -1;
466 }
467 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
468 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000469
470 if (array_resize(self, n+1) == -1)
Guido van Rossum778983b1993-02-19 15:55:02 +0000471 return -1;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000472 items = self->ob_item;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000473 if (where < 0) {
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000474 where += n;
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000475 if (where < 0)
476 where = 0;
477 }
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000478 if (where > n)
479 where = n;
480 /* appends don't need to call memmove() */
481 if (where != n)
482 memmove(items + (where+1)*self->ob_descr->itemsize,
483 items + where*self->ob_descr->itemsize,
484 (n-where)*self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000485 return (*self->ob_descr->setitem)(self, where, v);
486}
487
Guido van Rossum778983b1993-02-19 15:55:02 +0000488/* Methods */
489
490static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000491array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000492{
Guido van Rossum778983b1993-02-19 15:55:02 +0000493 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000494 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000495 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000496}
497
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000498static PyObject *
499array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000500{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000501 arrayobject *va, *wa;
502 PyObject *vi = NULL;
503 PyObject *wi = NULL;
504 int i, k;
505 PyObject *res;
506
Martin v. Löwis99866332002-03-01 10:27:01 +0000507 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000508 Py_INCREF(Py_NotImplemented);
509 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000510 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000511
512 va = (arrayobject *)v;
513 wa = (arrayobject *)w;
514
515 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
516 /* Shortcut: if the lengths differ, the arrays differ */
517 if (op == Py_EQ)
518 res = Py_False;
519 else
520 res = Py_True;
521 Py_INCREF(res);
522 return res;
523 }
524
525 /* Search for the first index where items are different */
526 k = 1;
527 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
528 vi = getarrayitem(v, i);
529 wi = getarrayitem(w, i);
530 if (vi == NULL || wi == NULL) {
531 Py_XDECREF(vi);
532 Py_XDECREF(wi);
533 return NULL;
534 }
535 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
536 if (k == 0)
537 break; /* Keeping vi and wi alive! */
538 Py_DECREF(vi);
539 Py_DECREF(wi);
540 if (k < 0)
541 return NULL;
542 }
543
544 if (k) {
545 /* No more items to compare -- compare sizes */
546 int vs = va->ob_size;
547 int ws = wa->ob_size;
548 int cmp;
549 switch (op) {
550 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000551 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000552 case Py_EQ: cmp = vs == ws; break;
553 case Py_NE: cmp = vs != ws; break;
554 case Py_GT: cmp = vs > ws; break;
555 case Py_GE: cmp = vs >= ws; break;
556 default: return NULL; /* cannot happen */
557 }
558 if (cmp)
559 res = Py_True;
560 else
561 res = Py_False;
562 Py_INCREF(res);
563 return res;
564 }
565
566 /* We have an item that differs. First, shortcuts for EQ/NE */
567 if (op == Py_EQ) {
568 Py_INCREF(Py_False);
569 res = Py_False;
570 }
571 else if (op == Py_NE) {
572 Py_INCREF(Py_True);
573 res = Py_True;
574 }
575 else {
576 /* Compare the final item again using the proper operator */
577 res = PyObject_RichCompare(vi, wi, op);
578 }
579 Py_DECREF(vi);
580 Py_DECREF(wi);
581 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000582}
583
584static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000585array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000586{
587 return a->ob_size;
588}
589
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000590static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000591array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000592{
593 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000594 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000595 return NULL;
596 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000597 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000598}
599
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000601array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000602{
603 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000604 if (ilow < 0)
605 ilow = 0;
606 else if (ilow > a->ob_size)
607 ilow = a->ob_size;
608 if (ihigh < 0)
609 ihigh = 0;
610 if (ihigh < ilow)
611 ihigh = ilow;
612 else if (ihigh > a->ob_size)
613 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000614 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000615 if (np == NULL)
616 return NULL;
617 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
618 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000619 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000620}
621
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000622static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000623array_copy(arrayobject *a, PyObject *unused)
624{
625 return array_slice(a, 0, a->ob_size);
626}
627
628PyDoc_STRVAR(copy_doc,
629"copy(array)\n\
630\n\
631 Return a copy of the array.");
632
633static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000634array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000635{
636 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000637 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000638 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000639 PyErr_Format(PyExc_TypeError,
640 "can only append array (not \"%.200s\") to array",
641 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000642 return NULL;
643 }
644#define b ((arrayobject *)bb)
645 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000646 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000647 return NULL;
648 }
649 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000650 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000651 if (np == NULL) {
652 return NULL;
653 }
654 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
655 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000656 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000657 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000658#undef b
659}
660
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000661static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000662array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000663{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000664 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000665 int size;
666 arrayobject *np;
667 char *p;
668 int nbytes;
669 if (n < 0)
670 n = 0;
671 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000672 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000673 if (np == NULL)
674 return NULL;
675 p = np->ob_item;
676 nbytes = a->ob_size * a->ob_descr->itemsize;
677 for (i = 0; i < n; i++) {
678 memcpy(p, a->ob_item, nbytes);
679 p += nbytes;
680 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000681 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000682}
683
684static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000685array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000686{
687 char *item;
688 int n; /* Size of replacement array */
689 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000690#define b ((arrayobject *)v)
691 if (v == NULL)
692 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000693 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000694 n = b->ob_size;
695 if (a == b) {
696 /* Special case "a[i:j] = a" -- copy b first */
697 int ret;
698 v = array_slice(b, 0, n);
699 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000700 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000701 return ret;
702 }
703 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000704 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000705 return -1;
706 }
707 }
708 else {
Fred Drake137507e2000-06-01 02:02:46 +0000709 PyErr_Format(PyExc_TypeError,
710 "can only assign array (not \"%.200s\") to array slice",
711 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000712 return -1;
713 }
714 if (ilow < 0)
715 ilow = 0;
716 else if (ilow > a->ob_size)
717 ilow = a->ob_size;
718 if (ihigh < 0)
719 ihigh = 0;
720 if (ihigh < ilow)
721 ihigh = ilow;
722 else if (ihigh > a->ob_size)
723 ihigh = a->ob_size;
724 item = a->ob_item;
725 d = n - (ihigh-ilow);
726 if (d < 0) { /* Delete -d items */
727 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
728 item + ihigh*a->ob_descr->itemsize,
729 (a->ob_size-ihigh)*a->ob_descr->itemsize);
730 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000731 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000732 /* Can't fail */
733 a->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000734 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000735 }
736 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000737 PyMem_RESIZE(item, char,
738 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000739 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000740 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000741 return -1;
742 }
743 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
744 item + ihigh*a->ob_descr->itemsize,
745 (a->ob_size-ihigh)*a->ob_descr->itemsize);
746 a->ob_item = item;
747 a->ob_size += d;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000748 a->allocated = a->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000749 }
750 if (n > 0)
751 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
752 n*b->ob_descr->itemsize);
753 return 0;
754#undef b
755}
756
757static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000758array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000759{
760 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000761 PyErr_SetString(PyExc_IndexError,
762 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000763 return -1;
764 }
765 if (v == NULL)
766 return array_ass_slice(a, i, i+1, v);
767 return (*a->ob_descr->setitem)(a, i, v);
768}
769
770static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000771setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000772{
Martin v. Löwis99866332002-03-01 10:27:01 +0000773 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000774 return array_ass_item((arrayobject *)a, i, v);
775}
776
Martin v. Löwis99866332002-03-01 10:27:01 +0000777static int
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000778array_iter_extend(arrayobject *self, PyObject *bb)
779{
780 PyObject *it, *v;
781
782 it = PyObject_GetIter(bb);
783 if (it == NULL)
784 return -1;
785
786 while ((v = PyIter_Next(it)) != NULL) {
787 if (ins1(self, (int) self->ob_size, v) != 0) {
788 Py_DECREF(v);
789 Py_DECREF(it);
790 return -1;
791 }
792 Py_DECREF(v);
793 }
794 Py_DECREF(it);
795 if (PyErr_Occurred())
796 return -1;
797 return 0;
798}
799
800static int
Martin v. Löwis99866332002-03-01 10:27:01 +0000801array_do_extend(arrayobject *self, PyObject *bb)
802{
803 int size;
804
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000805 if (!array_Check(bb))
806 return array_iter_extend(self, bb);
Martin v. Löwis99866332002-03-01 10:27:01 +0000807#define b ((arrayobject *)bb)
808 if (self->ob_descr != b->ob_descr) {
809 PyErr_SetString(PyExc_TypeError,
810 "can only extend with array of same kind");
811 return -1;
812 }
813 size = self->ob_size + b->ob_size;
814 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
815 if (self->ob_item == NULL) {
816 PyObject_Del(self);
817 PyErr_NoMemory();
818 return -1;
819 }
820 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
821 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000822 self->ob_size = size;
823 self->allocated = size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000824
825 return 0;
826#undef b
827}
828
829static PyObject *
830array_inplace_concat(arrayobject *self, PyObject *bb)
831{
Raymond Hettinger49f9bd12004-03-14 05:43:59 +0000832 if (!array_Check(bb)) {
833 PyErr_Format(PyExc_TypeError,
834 "can only extend array with array (not \"%.200s\")",
835 bb->ob_type->tp_name);
836 return NULL;
837 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000838 if (array_do_extend(self, bb) == -1)
839 return NULL;
840 Py_INCREF(self);
841 return (PyObject *)self;
842}
843
844static PyObject *
845array_inplace_repeat(arrayobject *self, int n)
846{
847 char *items, *p;
848 int size, i;
849
850 if (self->ob_size > 0) {
851 if (n < 0)
852 n = 0;
853 items = self->ob_item;
854 size = self->ob_size * self->ob_descr->itemsize;
855 if (n == 0) {
856 PyMem_FREE(items);
857 self->ob_item = NULL;
858 self->ob_size = 0;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000859 self->allocated = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000860 }
861 else {
862 PyMem_Resize(items, char, n * size);
863 if (items == NULL)
864 return PyErr_NoMemory();
865 p = items;
866 for (i = 1; i < n; i++) {
867 p += size;
868 memcpy(p, items, size);
869 }
870 self->ob_item = items;
871 self->ob_size *= n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +0000872 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000873 }
874 }
875 Py_INCREF(self);
876 return (PyObject *)self;
877}
878
879
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000880static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000881ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000882{
883 if (ins1(self, where, v) != 0)
884 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000885 Py_INCREF(Py_None);
886 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000887}
888
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000889static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000890array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000891{
892 int count = 0;
893 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000894
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000895 for (i = 0; i < self->ob_size; i++) {
896 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000897 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000898 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000899 if (cmp > 0)
900 count++;
901 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000902 return NULL;
903 }
904 return PyInt_FromLong((long)count);
905}
906
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000907PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000908"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000909\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000910Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000911
912static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000913array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914{
915 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000917 for (i = 0; i < self->ob_size; i++) {
918 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000919 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
920 Py_DECREF(selfi);
921 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922 return PyInt_FromLong((long)i);
923 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000924 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925 return NULL;
926 }
927 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
928 return NULL;
929}
930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000931PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000932"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000934Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000935
Raymond Hettinger625812f2003-01-07 01:58:52 +0000936static int
937array_contains(arrayobject *self, PyObject *v)
938{
939 int i, cmp;
940
941 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
942 PyObject *selfi = getarrayitem((PyObject *)self, i);
943 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
944 Py_DECREF(selfi);
945 }
946 return cmp;
947}
948
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000949static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000950array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000951{
952 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000953
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000954 for (i = 0; i < self->ob_size; i++) {
955 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000956 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
957 Py_DECREF(selfi);
958 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000959 if (array_ass_slice(self, i, i+1,
960 (PyObject *)NULL) != 0)
961 return NULL;
962 Py_INCREF(Py_None);
963 return Py_None;
964 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000965 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000966 return NULL;
967 }
968 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
969 return NULL;
970}
971
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000972PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000973"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000975Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000976
977static PyObject *
978array_pop(arrayobject *self, PyObject *args)
979{
980 int i = -1;
981 PyObject *v;
982 if (!PyArg_ParseTuple(args, "|i:pop", &i))
983 return NULL;
984 if (self->ob_size == 0) {
985 /* Special-case most common failure cause */
986 PyErr_SetString(PyExc_IndexError, "pop from empty array");
987 return NULL;
988 }
989 if (i < 0)
990 i += self->ob_size;
991 if (i < 0 || i >= self->ob_size) {
992 PyErr_SetString(PyExc_IndexError, "pop index out of range");
993 return NULL;
994 }
995 v = getarrayitem((PyObject *)self,i);
996 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
997 Py_DECREF(v);
998 return NULL;
999 }
1000 return v;
1001}
1002
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001003PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001004"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001005\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001006Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001007
1008static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001009array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001010{
Martin v. Löwis99866332002-03-01 10:27:01 +00001011 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001012 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001013 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001014 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001015}
1016
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001017PyDoc_STRVAR(extend_doc,
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001018"extend(array or iterable)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001019\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001020 Append items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001021
1022static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001023array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001024{
1025 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001026 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001027 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +00001028 return NULL;
1029 return ins(self, i, v);
1030}
1031
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001032PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001033"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001034\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001035Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001036
1037
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001038static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001039array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001040{
Tim Peters077a11d2000-09-16 22:31:29 +00001041 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001042 retval = PyTuple_New(2);
1043 if (!retval)
1044 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001045
1046 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1047 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1048
1049 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001050}
1051
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001052PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001053"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001054\n\
1055Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001056the length in items of the buffer used to hold array's contents\n\
1057The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001058the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001059
1060
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001061static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001062array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001063{
Guido van Rossum778983b1993-02-19 15:55:02 +00001064 return ins(self, (int) self->ob_size, v);
1065}
1066
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001067PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001068"append(x)\n\
1069\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001070Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001071
1072
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001073static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001074array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001075{
1076 char *p;
1077 int i;
Fred Drakebf272981999-12-03 17:15:30 +00001078
Guido van Rossum778983b1993-02-19 15:55:02 +00001079 switch (self->ob_descr->itemsize) {
1080 case 1:
1081 break;
1082 case 2:
1083 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1084 char p0 = p[0];
1085 p[0] = p[1];
1086 p[1] = p0;
1087 }
1088 break;
1089 case 4:
1090 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1091 char p0 = p[0];
1092 char p1 = p[1];
1093 p[0] = p[3];
1094 p[1] = p[2];
1095 p[2] = p1;
1096 p[3] = p0;
1097 }
1098 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001099 case 8:
1100 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1101 char p0 = p[0];
1102 char p1 = p[1];
1103 char p2 = p[2];
1104 char p3 = p[3];
1105 p[0] = p[7];
1106 p[1] = p[6];
1107 p[2] = p[5];
1108 p[3] = p[4];
1109 p[4] = p3;
1110 p[5] = p2;
1111 p[6] = p1;
1112 p[7] = p0;
1113 }
1114 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001115 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001117 "don't know how to byteswap this array type");
1118 return NULL;
1119 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001120 Py_INCREF(Py_None);
1121 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001122}
1123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001124PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001125"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001126\n\
Fred Drakebf272981999-12-03 17:15:30 +00001127Byteswap 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 +000011284, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001129
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001130static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001131array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001132{
Guido van Rossume77a7571993-11-03 15:01:26 +00001133 register int itemsize = self->ob_descr->itemsize;
1134 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001135 /* little buffer to hold items while swapping */
1136 char tmp[256]; /* 8 is probably enough -- but why skimp */
1137 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001138
Guido van Rossum778983b1993-02-19 15:55:02 +00001139 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001140 for (p = self->ob_item,
1141 q = self->ob_item + (self->ob_size - 1)*itemsize;
1142 p < q;
1143 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001144 /* memory areas guaranteed disjoint, so memcpy
1145 * is safe (& memmove may be slower).
1146 */
1147 memcpy(tmp, p, itemsize);
1148 memcpy(p, q, itemsize);
1149 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001150 }
1151 }
Tim Petersbb307342000-09-10 05:22:54 +00001152
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001153 Py_INCREF(Py_None);
1154 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001155}
Guido van Rossume77a7571993-11-03 15:01:26 +00001156
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001157PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001158"reverse()\n\
1159\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001160Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001161
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001162static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001163array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001164{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001165 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001166 int n;
1167 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001168 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001170 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001171 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001172 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001173 return NULL;
1174 }
1175 if (n > 0) {
1176 char *item = self->ob_item;
1177 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001178 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001179 int newlength;
1180 size_t newbytes;
1181 /* Be careful here about overflow */
1182 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001183 (newbytes = newlength * itemsize) / itemsize !=
1184 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001185 goto nomem;
1186 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001187 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001188 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001189 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001190 return NULL;
1191 }
1192 self->ob_item = item;
1193 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001194 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001195 nread = fread(item + (self->ob_size - n) * itemsize,
1196 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001197 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001198 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001201 self->allocated = self->ob_size;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001202 PyErr_SetString(PyExc_EOFError,
1203 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001204 return NULL;
1205 }
1206 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001207 Py_INCREF(Py_None);
1208 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001209}
1210
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001211PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001212"fromfile(f, n)\n\
1213\n\
1214Read 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 +00001215array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001216
1217
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001219array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001220{
Guido van Rossum778983b1993-02-19 15:55:02 +00001221 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001222
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001223 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001224 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001225 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001226 return NULL;
1227 }
1228 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001229 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1230 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 clearerr(fp);
1233 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(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001241"tofile(f)\n\
1242\n\
1243Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244write.");
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_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001249{
1250 int n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 int itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001252
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 if (!PyList_Check(list)) {
1254 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001255 return NULL;
1256 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001257 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001258 if (n > 0) {
1259 char *item = self->ob_item;
1260 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001262 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001263 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001264 return NULL;
1265 }
1266 self->ob_item = item;
1267 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001268 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001269 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001270 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001271 if ((*self->ob_descr->setitem)(self,
1272 self->ob_size - n + i, v) != 0) {
1273 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001274 PyMem_RESIZE(item, char,
1275 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001276 self->ob_item = item;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001277 self->allocated = self->ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +00001278 return NULL;
1279 }
1280 }
1281 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001282 Py_INCREF(Py_None);
1283 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001284}
1285
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001286PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001287"fromlist(list)\n\
1288\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001289Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001290
1291
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001292static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001293array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001294{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001296 int i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001297
Guido van Rossum778983b1993-02-19 15:55:02 +00001298 if (list == NULL)
1299 return NULL;
1300 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001301 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001302 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001303 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001304 return NULL;
1305 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001306 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001307 }
1308 return list;
1309}
1310
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001311PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001312"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001313\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001314Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001315
1316
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001318array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001319{
1320 char *str;
1321 int n;
1322 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001323 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001324 return NULL;
1325 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001326 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001327 "string length not a multiple of item size");
1328 return NULL;
1329 }
1330 n = n / itemsize;
1331 if (n > 0) {
1332 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001334 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001336 return NULL;
1337 }
1338 self->ob_item = item;
1339 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001340 self->allocated = self->ob_size;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001341 memcpy(item + (self->ob_size - n) * itemsize,
1342 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001344 Py_INCREF(Py_None);
1345 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001346}
1347
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001348PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001349"fromstring(string)\n\
1350\n\
1351Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001352values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001353
1354
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001355static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001356array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001357{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001358 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001359 self->ob_size * self->ob_descr->itemsize);
1360}
1361
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001362PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001363"tostring() -> string\n\
1364\n\
1365Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001366representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001367
Martin v. Löwis99866332002-03-01 10:27:01 +00001368
1369
1370#ifdef Py_USING_UNICODE
1371static PyObject *
1372array_fromunicode(arrayobject *self, PyObject *args)
1373{
1374 Py_UNICODE *ustr;
1375 int n;
1376
1377 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1378 return NULL;
1379 if (self->ob_descr->typecode != 'u') {
1380 PyErr_SetString(PyExc_ValueError,
1381 "fromunicode() may only be called on "
1382 "type 'u' arrays");
1383 return NULL;
1384 }
1385 if (n > 0) {
1386 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1387 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1388 if (item == NULL) {
1389 PyErr_NoMemory();
1390 return NULL;
1391 }
1392 self->ob_item = (char *) item;
1393 self->ob_size += n;
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001394 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001395 memcpy(item + self->ob_size - n,
1396 ustr, n * sizeof(Py_UNICODE));
1397 }
1398
1399 Py_INCREF(Py_None);
1400 return Py_None;
1401}
1402
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001403PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001404"fromunicode(ustr)\n\
1405\n\
1406Extends this array with data from the unicode string ustr.\n\
1407The array must be a type 'u' array; otherwise a ValueError\n\
1408is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001409append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001410
1411
1412static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001413array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001414{
Martin v. Löwis99866332002-03-01 10:27:01 +00001415 if (self->ob_descr->typecode != 'u') {
1416 PyErr_SetString(PyExc_ValueError,
1417 "tounicode() may only be called on type 'u' arrays");
1418 return NULL;
1419 }
1420 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1421}
1422
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001423PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001424"tounicode() -> unicode\n\
1425\n\
1426Convert the array to a unicode string. The array must be\n\
1427a type 'u' array; otherwise a ValueError is raised. Use\n\
1428array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001429an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001430
1431#endif /* Py_USING_UNICODE */
1432
1433
1434static PyObject *
1435array_get_typecode(arrayobject *a, void *closure)
1436{
1437 char tc = a->ob_descr->typecode;
1438 return PyString_FromStringAndSize(&tc, 1);
1439}
1440
1441static PyObject *
1442array_get_itemsize(arrayobject *a, void *closure)
1443{
1444 return PyInt_FromLong((long)a->ob_descr->itemsize);
1445}
1446
1447static PyGetSetDef array_getsets [] = {
1448 {"typecode", (getter) array_get_typecode, NULL,
1449 "the typecode character used to create the array"},
1450 {"itemsize", (getter) array_get_itemsize, NULL,
1451 "the size, in bytes, of one array item"},
1452 {NULL}
1453};
1454
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001455PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001456 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001457 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001458 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001459 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001460 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001461 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001462 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1463 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001464 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001465 count_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001466 {"__deepcopy__",(PyCFunction)array_copy, METH_NOARGS,
1467 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001468 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001469 extend_doc},
1470 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1471 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001472 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001473 fromlist_doc},
1474 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1475 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001476#ifdef Py_USING_UNICODE
1477 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1478 fromunicode_doc},
1479#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001480 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001481 index_doc},
1482 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1483 insert_doc},
1484 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1485 pop_doc},
1486 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1487 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001488 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001489 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001490 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001491 reverse_doc},
1492/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1493 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001494 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001495 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001496 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001497 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001498 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001499 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001500#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001501 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001502 tounicode_doc},
1503#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001504 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001505 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001506 {NULL, NULL} /* sentinel */
1507};
1508
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001509static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001510array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001511{
Martin v. Löwis99866332002-03-01 10:27:01 +00001512 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001513 PyObject *s, *t, *v = NULL;
1514 int len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001515
Guido van Rossum778983b1993-02-19 15:55:02 +00001516 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001517 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001518 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001519 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001520 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001521 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001522
1523 if (typecode == 'c')
1524 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001525#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001526 else if (typecode == 'u')
1527 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001528#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001529 else
1530 v = array_tolist(a, NULL);
1531 t = PyObject_Repr(v);
1532 Py_XDECREF(v);
1533
1534 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001535 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001536 PyString_ConcatAndDel(&s, t);
1537 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001538 return s;
1539}
1540
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001541static PyObject*
1542array_subscr(arrayobject* self, PyObject* item)
1543{
1544 if (PyInt_Check(item)) {
1545 long i = PyInt_AS_LONG(item);
1546 if (i < 0)
1547 i += self->ob_size;
1548 return array_item(self, i);
1549 }
1550 else if (PyLong_Check(item)) {
1551 long i = PyLong_AsLong(item);
1552 if (i == -1 && PyErr_Occurred())
1553 return NULL;
1554 if (i < 0)
1555 i += self->ob_size;
1556 return array_item(self, i);
1557 }
1558 else if (PySlice_Check(item)) {
1559 int start, stop, step, slicelength, cur, i;
1560 PyObject* result;
1561 arrayobject* ar;
1562 int itemsize = self->ob_descr->itemsize;
1563
1564 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1565 &start, &stop, &step, &slicelength) < 0) {
1566 return NULL;
1567 }
1568
1569 if (slicelength <= 0) {
1570 return newarrayobject(&Arraytype, 0, self->ob_descr);
1571 }
1572 else {
1573 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1574 if (!result) return NULL;
1575
1576 ar = (arrayobject*)result;
1577
1578 for (cur = start, i = 0; i < slicelength;
1579 cur += step, i++) {
1580 memcpy(ar->ob_item + i*itemsize,
1581 self->ob_item + cur*itemsize,
1582 itemsize);
1583 }
1584
1585 return result;
1586 }
1587 }
1588 else {
1589 PyErr_SetString(PyExc_TypeError,
1590 "list indices must be integers");
1591 return NULL;
1592 }
1593}
1594
1595static int
1596array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1597{
1598 if (PyInt_Check(item)) {
1599 long i = PyInt_AS_LONG(item);
1600 if (i < 0)
1601 i += self->ob_size;
1602 return array_ass_item(self, i, value);
1603 }
1604 else if (PyLong_Check(item)) {
1605 long i = PyLong_AsLong(item);
1606 if (i == -1 && PyErr_Occurred())
1607 return -1;
1608 if (i < 0)
1609 i += self->ob_size;
1610 return array_ass_item(self, i, value);
1611 }
1612 else if (PySlice_Check(item)) {
1613 int start, stop, step, slicelength;
1614 int itemsize = self->ob_descr->itemsize;
1615
1616 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1617 &start, &stop, &step, &slicelength) < 0) {
1618 return -1;
1619 }
1620
1621 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1622 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1623 return array_ass_slice(self, start, stop, value);
1624
1625 if (value == NULL) {
1626 /* delete slice */
Michael W. Hudson56796f62002-07-29 14:35:04 +00001627 int cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001628
1629 if (slicelength <= 0)
1630 return 0;
1631
1632 if (step < 0) {
1633 stop = start + 1;
1634 start = stop + step*(slicelength - 1) - 1;
1635 step = -step;
1636 }
1637
Michael W. Hudson56796f62002-07-29 14:35:04 +00001638 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001639 cur += step, i++) {
1640 memmove(self->ob_item + (cur - i)*itemsize,
1641 self->ob_item + (cur + 1)*itemsize,
1642 (step - 1) * itemsize);
1643 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001644 extra = self->ob_size - (cur + 1);
1645 if (extra > 0) {
1646 memmove(self->ob_item + (cur - i)*itemsize,
1647 self->ob_item + (cur + 1)*itemsize,
1648 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001649 }
1650
1651 self->ob_size -= slicelength;
1652 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001653 self->allocated = self->ob_size;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001654
1655 return 0;
1656 }
1657 else {
1658 /* assign slice */
1659 int cur, i;
1660 arrayobject* av;
1661
1662 if (!array_Check(value)) {
1663 PyErr_Format(PyExc_TypeError,
1664 "must assign array (not \"%.200s\") to slice",
1665 value->ob_type->tp_name);
1666 return -1;
1667 }
1668
1669 av = (arrayobject*)value;
1670
1671 if (av->ob_size != slicelength) {
1672 PyErr_Format(PyExc_ValueError,
1673 "attempt to assign array of size %d to extended slice of size %d",
1674 av->ob_size, slicelength);
1675 return -1;
1676 }
1677
1678 if (!slicelength)
1679 return 0;
1680
1681 /* protect against a[::-1] = a */
1682 if (self == av) {
1683 value = array_slice(av, 0, av->ob_size);
1684 av = (arrayobject*)value;
1685 }
1686 else {
1687 Py_INCREF(value);
1688 }
1689
1690 for (cur = start, i = 0; i < slicelength;
1691 cur += step, i++) {
1692 memcpy(self->ob_item + cur*itemsize,
1693 av->ob_item + i*itemsize,
1694 itemsize);
1695 }
1696
1697 Py_DECREF(value);
1698
1699 return 0;
1700 }
1701 }
1702 else {
1703 PyErr_SetString(PyExc_TypeError,
1704 "list indices must be integers");
1705 return -1;
1706 }
1707}
1708
1709static PyMappingMethods array_as_mapping = {
1710 (inquiry)array_length,
1711 (binaryfunc)array_subscr,
1712 (objobjargproc)array_ass_subscr
1713};
1714
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001715static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001716array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001717{
1718 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001719 PyErr_SetString(PyExc_SystemError,
1720 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001721 return -1;
1722 }
1723 *ptr = (void *)self->ob_item;
1724 return self->ob_size*self->ob_descr->itemsize;
1725}
1726
1727static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001728array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001729{
1730 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001731 PyErr_SetString(PyExc_SystemError,
1732 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001733 return -1;
1734 }
1735 *ptr = (void *)self->ob_item;
1736 return self->ob_size*self->ob_descr->itemsize;
1737}
1738
1739static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001740array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001741{
1742 if ( lenp )
1743 *lenp = self->ob_size*self->ob_descr->itemsize;
1744 return 1;
1745}
1746
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001747static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001748 (inquiry)array_length, /*sq_length*/
1749 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001750 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001751 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001752 (intintargfunc)array_slice, /*sq_slice*/
1753 (intobjargproc)array_ass_item, /*sq_ass_item*/
1754 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001755 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001756 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
1757 (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001758};
1759
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001760static PyBufferProcs array_as_buffer = {
1761 (getreadbufferproc)array_buffer_getreadbuf,
1762 (getwritebufferproc)array_buffer_getwritebuf,
1763 (getsegcountproc)array_buffer_getsegcount,
1764};
1765
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001766static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001767array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001768{
1769 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001770 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001771 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00001772
1773 if (kwds != NULL) {
1774 int i = PyObject_Length(kwds);
1775 if (i < 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001776 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001777 else if (i > 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001778 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001779 "array.array constructor takes "
1780 "no keyword arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +00001781 return NULL;
1782 }
1783 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001784
1785 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1786 return NULL;
1787
1788 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001789 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001790 || (c == 'u' && PyUnicode_Check(initial)))) {
1791 PyErr_SetString(PyExc_TypeError,
1792 "array initializer must be list or string");
1793 return NULL;
1794 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001795 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1796 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001797 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001798 int len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001799
1800 if (initial == NULL || !(PyList_Check(initial)
1801 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001802 len = 0;
1803 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001804 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001805
1806 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001807 if (a == NULL)
1808 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001809
Guido van Rossum778983b1993-02-19 15:55:02 +00001810 if (len > 0) {
1811 int i;
1812 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001813 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001814 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001815 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001816 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001817 return NULL;
1818 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001819 if (setarrayitem(a, i, v) != 0) {
1820 Py_DECREF(v);
1821 Py_DECREF(a);
1822 return NULL;
1823 }
1824 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001825 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001826 } else if (initial != NULL && PyString_Check(initial)) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001827 PyObject *t_initial = PyTuple_Pack(1,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001828 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001829 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001830 array_fromstring((arrayobject *)a,
1831 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001832 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001833 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001834 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001835 return NULL;
1836 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001837 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001838#ifdef Py_USING_UNICODE
1839 } else if (initial != NULL && PyUnicode_Check(initial)) {
1840 int n = PyUnicode_GET_DATA_SIZE(initial);
1841 if (n > 0) {
1842 arrayobject *self = (arrayobject *)a;
1843 char *item = self->ob_item;
1844 item = PyMem_Realloc(item, n);
1845 if (item == NULL) {
1846 PyErr_NoMemory();
1847 Py_DECREF(a);
1848 return NULL;
1849 }
1850 self->ob_item = item;
1851 self->ob_size = n / sizeof(Py_UNICODE);
1852 memcpy(item, PyUnicode_AS_DATA(initial), n);
Raymond Hettinger6e2ee862004-03-14 04:37:50 +00001853 self->allocated = self->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001854 }
1855#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001856 }
1857 return a;
1858 }
1859 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001860 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001861 "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 +00001862 return NULL;
1863}
1864
Guido van Rossum778983b1993-02-19 15:55:02 +00001865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001866PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001867"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001868an array of basic values: characters, integers, floating point\n\
1869numbers. Arrays are sequence types and behave very much like lists,\n\
1870except that the type of objects stored in them is constrained. The\n\
1871type is specified at object creation time by using a type code, which\n\
1872is a single character. The following type codes are defined:\n\
1873\n\
1874 Type code C Type Minimum size in bytes \n\
1875 'c' character 1 \n\
1876 'b' signed integer 1 \n\
1877 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001878 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001879 'h' signed integer 2 \n\
1880 'H' unsigned integer 2 \n\
1881 'i' signed integer 2 \n\
1882 'I' unsigned integer 2 \n\
1883 'l' signed integer 4 \n\
1884 'L' unsigned integer 4 \n\
1885 'f' floating point 4 \n\
1886 'd' floating point 8 \n\
1887\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001888The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001889\n\
1890array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001891");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001892
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001893PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001894"array(typecode [, initializer]) -> array\n\
1895\n\
1896Return a new array whose items are restricted by typecode, and\n\
1897initialized from the optional initializer value, which must be a list\n\
1898or a string.\n\
1899\n\
1900Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001901the type of objects stored in them is constrained.\n\
1902\n\
1903Methods:\n\
1904\n\
1905append() -- append a new item to the end of the array\n\
1906buffer_info() -- return information giving the current memory info\n\
1907byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001908count() -- return number of occurences of an object\n\
Raymond Hettinger49f9bd12004-03-14 05:43:59 +00001909extend() -- extend array by appending multiple elements from an iterable\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001910fromfile() -- read items from a file object\n\
1911fromlist() -- append items from the list\n\
1912fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001913index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001914insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001915pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001916read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001917remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001918reverse() -- reverse the order of the items in the array\n\
1919tofile() -- write all items to a file object\n\
1920tolist() -- return the array converted to an ordinary list\n\
1921tostring() -- return the array converted to a string\n\
1922write() -- DEPRECATED, use tofile()\n\
1923\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001924Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001925\n\
1926typecode -- the typecode character used to create the array\n\
1927itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001928");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001929
Raymond Hettinger625812f2003-01-07 01:58:52 +00001930static PyObject *array_iter(arrayobject *ao);
1931
Tim Peters0c322792002-07-17 16:49:03 +00001932static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001933 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001934 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001935 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001936 sizeof(arrayobject),
1937 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001938 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001939 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001940 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001941 0, /* tp_setattr */
1942 0, /* tp_compare */
1943 (reprfunc)array_repr, /* tp_repr */
1944 0, /* tp_as _number*/
1945 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001946 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001947 0, /* tp_hash */
1948 0, /* tp_call */
1949 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001950 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001951 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001952 &array_as_buffer, /* tp_as_buffer*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001953 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001954 arraytype_doc, /* tp_doc */
1955 0, /* tp_traverse */
1956 0, /* tp_clear */
1957 array_richcompare, /* tp_richcompare */
Martin v. Löwis99866332002-03-01 10:27:01 +00001958 0, /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00001959 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00001960 0, /* tp_iternext */
1961 array_methods, /* tp_methods */
1962 0, /* tp_members */
1963 array_getsets, /* tp_getset */
1964 0, /* tp_base */
1965 0, /* tp_dict */
1966 0, /* tp_descr_get */
1967 0, /* tp_descr_set */
1968 0, /* tp_dictoffset */
1969 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001970 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00001971 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001972 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001973};
1974
Raymond Hettinger625812f2003-01-07 01:58:52 +00001975
1976/*********************** Array Iterator **************************/
1977
1978typedef struct {
1979 PyObject_HEAD
1980 long index;
1981 arrayobject *ao;
1982 PyObject * (*getitem)(struct arrayobject *, int);
1983} arrayiterobject;
1984
1985static PyTypeObject PyArrayIter_Type;
1986
1987#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
1988
1989static PyObject *
1990array_iter(arrayobject *ao)
1991{
1992 arrayiterobject *it;
1993
1994 if (!array_Check(ao)) {
1995 PyErr_BadInternalCall();
1996 return NULL;
1997 }
1998
1999 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
2000 if (it == NULL)
2001 return NULL;
2002
2003 Py_INCREF(ao);
2004 it->ao = ao;
2005 it->index = 0;
2006 it->getitem = ao->ob_descr->getitem;
2007 PyObject_GC_Track(it);
2008 return (PyObject *)it;
2009}
2010
2011static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00002012arrayiter_next(arrayiterobject *it)
2013{
2014 assert(PyArrayIter_Check(it));
2015 if (it->index < it->ao->ob_size)
2016 return (*it->getitem)(it->ao, it->index++);
2017 return NULL;
2018}
2019
2020static void
2021arrayiter_dealloc(arrayiterobject *it)
2022{
2023 PyObject_GC_UnTrack(it);
2024 Py_XDECREF(it->ao);
2025 PyObject_GC_Del(it);
2026}
2027
2028static int
2029arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
2030{
2031 if (it->ao != NULL)
2032 return visit((PyObject *)(it->ao), arg);
2033 return 0;
2034}
2035
2036static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00002037 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00002038 0, /* ob_size */
2039 "arrayiterator", /* tp_name */
2040 sizeof(arrayiterobject), /* tp_basicsize */
2041 0, /* tp_itemsize */
2042 /* methods */
2043 (destructor)arrayiter_dealloc, /* tp_dealloc */
2044 0, /* tp_print */
2045 0, /* tp_getattr */
2046 0, /* tp_setattr */
2047 0, /* tp_compare */
2048 0, /* tp_repr */
2049 0, /* tp_as_number */
2050 0, /* tp_as_sequence */
2051 0, /* tp_as_mapping */
2052 0, /* tp_hash */
2053 0, /* tp_call */
2054 0, /* tp_str */
2055 PyObject_GenericGetAttr, /* tp_getattro */
2056 0, /* tp_setattro */
2057 0, /* tp_as_buffer */
2058 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2059 0, /* tp_doc */
2060 (traverseproc)arrayiter_traverse, /* tp_traverse */
2061 0, /* tp_clear */
2062 0, /* tp_richcompare */
2063 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002064 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002065 (iternextfunc)arrayiter_next, /* tp_iternext */
2066 0, /* tp_methods */
2067};
2068
2069
2070/*********************** Install Module **************************/
2071
Martin v. Löwis99866332002-03-01 10:27:01 +00002072/* No functions in array module. */
2073static PyMethodDef a_methods[] = {
2074 {NULL, NULL, 0, NULL} /* Sentinel */
2075};
2076
2077
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002078PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002079initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002080{
Fred Drakef4e34842002-04-01 03:45:06 +00002081 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002082
Martin v. Löwis99866332002-03-01 10:27:01 +00002083 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002084 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002085 m = Py_InitModule3("array", a_methods, module_doc);
Fred Drakef4e34842002-04-01 03:45:06 +00002086
2087 Py_INCREF((PyObject *)&Arraytype);
2088 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2089 Py_INCREF((PyObject *)&Arraytype);
2090 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002091 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002092}