blob: bda5fefef3b3c5feeedca2aa43410fb1bd85d75f [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
Neal Norwitz937ca982003-02-24 02:08:42 +000016/* Shamelessy stolen from listobject.c */
17static int
18roundupsize(int n)
19{
20 unsigned int nbits = 0;
21 unsigned int n2 = (unsigned int)n >> 5;
22
23 /* Round up:
24 * If n < 256, to a multiple of 8.
25 * If n < 2048, to a multiple of 64.
26 * If n < 16384, to a multiple of 512.
27 * If n < 131072, to a multiple of 4096.
28 * If n < 1048576, to a multiple of 32768.
29 * If n < 8388608, to a multiple of 262144.
30 * If n < 67108864, to a multiple of 2097152.
31 * If n < 536870912, to a multiple of 16777216.
32 * ...
33 * If n < 2**(5+3*i), to a multiple of 2**(3*i).
34 *
35 * This over-allocates proportional to the list size, making room
36 * for additional growth. The over-allocation is mild, but is
37 * enough to give linear-time amortized behavior over a long
38 * sequence of appends() in the presence of a poorly-performing
39 * system realloc() (which is a reality, e.g., across all flavors
40 * of Windows, with Win9x behavior being particularly bad -- and
41 * we've still got address space fragmentation problems on Win9x
42 * even with this scheme, although it requires much longer lists to
43 * provoke them than it used to).
44 */
45 do {
46 n2 >>= 3;
47 nbits += 3;
48 } while (n2);
49 return ((n >> nbits) + 1) << nbits;
50 }
51
52#define NRESIZE(var, type, nitems) \
53do { \
54 size_t _new_size = roundupsize(nitems); \
55 if (_new_size <= ((~(size_t)0) / sizeof(type))) \
56 PyMem_RESIZE(var, type, _new_size); \
57 else \
58 var = NULL; \
59} while (0)
60/* END SHAMELESSLY STOLEN CODE */
61
Guido van Rossum778983b1993-02-19 15:55:02 +000062struct arrayobject; /* Forward */
63
Tim Petersbb307342000-09-10 05:22:54 +000064/* All possible arraydescr values are defined in the vector "descriptors"
65 * below. That's defined later because the appropriate get and set
66 * functions aren't visible yet.
67 */
Guido van Rossum778983b1993-02-19 15:55:02 +000068struct arraydescr {
69 int typecode;
70 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000071 PyObject * (*getitem)(struct arrayobject *, int);
72 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000073};
74
75typedef struct arrayobject {
Martin v. Löwis99866332002-03-01 10:27:01 +000076 PyObject_HEAD
77 int ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +000078 char *ob_item;
79 struct arraydescr *ob_descr;
80} arrayobject;
81
Jeremy Hylton938ace62002-07-17 16:30:39 +000082static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000083
Martin v. Löwis99866332002-03-01 10:27:01 +000084#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
85#define array_CheckExact(op) ((op)->ob_type == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000086
Tim Petersbb307342000-09-10 05:22:54 +000087/****************************************************************************
88Get and Set functions for each type.
89A Get function takes an arrayobject* and an integer index, returning the
90array value at that index wrapped in an appropriate PyObject*.
91A Set function takes an arrayobject, integer index, and PyObject*; sets
92the array value at that index to the raw C data extracted from the PyObject*,
93and returns 0 if successful, else nonzero on failure (PyObject* not of an
94appropriate type or value).
95Note that the basic Get and Set functions do NOT check that the index is
96in bounds; that's the responsibility of the caller.
97****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +000098
Roger E. Masse2919eaa1996-12-09 20:10:36 +000099static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000100c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000101{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000102 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000103}
104
105static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000106c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000107{
108 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000109 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000110 return -1;
111 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000112 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000113 return 0;
114}
115
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000116static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000117b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000118{
119 long x = ((char *)ap->ob_item)[i];
120 if (x >= 128)
121 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000122 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000123}
124
125static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000126b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000127{
Fred Drake541dc3b2000-06-28 17:49:30 +0000128 short x;
129 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
130 must use the next size up that is signed ('h') and manually do
131 the overflow checking */
132 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000133 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000134 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000135 PyErr_SetString(PyExc_OverflowError,
136 "signed char is less than minimum");
137 return -1;
138 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000139 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000140 PyErr_SetString(PyExc_OverflowError,
141 "signed char is greater than maximum");
142 return -1;
143 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000144 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000145 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000146 return 0;
147}
148
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000149static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000150BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000151{
152 long x = ((unsigned char *)ap->ob_item)[i];
153 return PyInt_FromLong(x);
154}
155
Fred Drake541dc3b2000-06-28 17:49:30 +0000156static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000157BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000158{
159 unsigned char x;
160 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
161 if (!PyArg_Parse(v, "b;array item must be integer", &x))
162 return -1;
163 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000164 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000165 return 0;
166}
Guido van Rossum549ab711997-01-03 19:09:47 +0000167
Martin v. Löwis99866332002-03-01 10:27:01 +0000168#ifdef Py_USING_UNICODE
169static PyObject *
170u_getitem(arrayobject *ap, int i)
171{
172 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
173}
174
175static int
176u_setitem(arrayobject *ap, int i, PyObject *v)
177{
178 Py_UNICODE *p;
179 int len;
180
181 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
182 return -1;
183 if (len != 1) {
184 PyErr_SetString(PyExc_TypeError, "array item must be unicode character");
185 return -1;
186 }
187 if (i >= 0)
188 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
189 return 0;
190}
191#endif
192
Guido van Rossum549ab711997-01-03 19:09:47 +0000193static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000194h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000195{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000196 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000197}
198
199static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000200h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000201{
202 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000203 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000204 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000205 return -1;
206 if (i >= 0)
207 ((short *)ap->ob_item)[i] = x;
208 return 0;
209}
210
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000211static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000212HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000213{
214 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
215}
216
Fred Drake541dc3b2000-06-28 17:49:30 +0000217static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000218HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000219{
220 int x;
221 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
222 must use the next size up and manually do the overflow checking */
223 if (!PyArg_Parse(v, "i;array item must be integer", &x))
224 return -1;
225 else if (x < 0) {
226 PyErr_SetString(PyExc_OverflowError,
227 "unsigned short is less than minimum");
228 return -1;
229 }
230 else if (x > USHRT_MAX) {
231 PyErr_SetString(PyExc_OverflowError,
232 "unsigned short is greater than maximum");
233 return -1;
234 }
235 if (i >= 0)
236 ((short *)ap->ob_item)[i] = (short)x;
237 return 0;
238}
Guido van Rossum549ab711997-01-03 19:09:47 +0000239
240static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000241i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000242{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000243 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000244}
245
246static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000247i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000248{
249 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000250 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000251 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000252 return -1;
253 if (i >= 0)
254 ((int *)ap->ob_item)[i] = x;
255 return 0;
256}
257
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000258static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000259II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000260{
261 return PyLong_FromUnsignedLong(
262 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
263}
264
265static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000266II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000267{
268 unsigned long x;
269 if (PyLong_Check(v)) {
270 x = PyLong_AsUnsignedLong(v);
271 if (x == (unsigned long) -1 && PyErr_Occurred())
272 return -1;
273 }
274 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000275 long y;
276 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000277 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000278 if (y < 0) {
279 PyErr_SetString(PyExc_OverflowError,
280 "unsigned int is less than minimum");
281 return -1;
282 }
283 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000284
Guido van Rossum549ab711997-01-03 19:09:47 +0000285 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000286 if (x > UINT_MAX) {
287 PyErr_SetString(PyExc_OverflowError,
288 "unsigned int is greater than maximum");
289 return -1;
290 }
291
Guido van Rossum549ab711997-01-03 19:09:47 +0000292 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000293 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000294 return 0;
295}
296
297static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000298l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000299{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000300 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000301}
302
303static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000304l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000305{
306 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000307 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000308 return -1;
309 if (i >= 0)
310 ((long *)ap->ob_item)[i] = x;
311 return 0;
312}
313
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000314static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000315LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000316{
317 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
318}
319
320static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000321LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000322{
323 unsigned long x;
324 if (PyLong_Check(v)) {
325 x = PyLong_AsUnsignedLong(v);
326 if (x == (unsigned long) -1 && PyErr_Occurred())
327 return -1;
328 }
329 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000330 long y;
331 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000332 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000333 if (y < 0) {
334 PyErr_SetString(PyExc_OverflowError,
335 "unsigned long is less than minimum");
336 return -1;
337 }
338 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000339
Guido van Rossum549ab711997-01-03 19:09:47 +0000340 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000341 if (x > ULONG_MAX) {
342 PyErr_SetString(PyExc_OverflowError,
343 "unsigned long is greater than maximum");
344 return -1;
345 }
Tim Petersbb307342000-09-10 05:22:54 +0000346
Guido van Rossum549ab711997-01-03 19:09:47 +0000347 if (i >= 0)
348 ((unsigned long *)ap->ob_item)[i] = x;
349 return 0;
350}
351
352static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000353f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000354{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000355 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000356}
357
358static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000359f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000360{
361 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000362 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000363 return -1;
364 if (i >= 0)
365 ((float *)ap->ob_item)[i] = x;
366 return 0;
367}
368
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000369static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000370d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000371{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000372 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000373}
374
375static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000376d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
378 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000379 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000380 return -1;
381 if (i >= 0)
382 ((double *)ap->ob_item)[i] = x;
383 return 0;
384}
385
386/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000387static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000388 {'c', sizeof(char), c_getitem, c_setitem},
389 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000390 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000391#ifdef Py_USING_UNICODE
392 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
393#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000395 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000396 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000397 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000398 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000399 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'f', sizeof(float), f_getitem, f_setitem},
401 {'d', sizeof(double), d_getitem, d_setitem},
402 {'\0', 0, 0, 0} /* Sentinel */
403};
Tim Petersbb307342000-09-10 05:22:54 +0000404
405/****************************************************************************
406Implementations of array object methods.
407****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000408
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000409static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +0000410newarrayobject(PyTypeObject *type, int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000411{
Guido van Rossum778983b1993-02-19 15:55:02 +0000412 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000413 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000414
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000416 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 return NULL;
418 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000419
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 nbytes = size * descr->itemsize;
421 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000422 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000423 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000424 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000425 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000427 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000429 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 if (size <= 0) {
431 op->ob_item = NULL;
432 }
433 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000434 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000436 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000437 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000438 }
439 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000440 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000441 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000442}
443
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000444static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000445getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000446{
447 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000448 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000449 ap = (arrayobject *)op;
Walter Dörwald8bb1ae92003-05-23 10:01:07 +0000450 assert(i>=0 && i<ap->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000451 return (*ap->ob_descr->getitem)(ap, i);
452}
453
454static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000455ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000456{
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 char *items;
458 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000459 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000460 return -1;
461 }
462 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
463 return -1;
464 items = self->ob_item;
Neal Norwitz937ca982003-02-24 02:08:42 +0000465 NRESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000466 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000467 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000468 return -1;
469 }
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000470 if (where < 0) {
471 where += self->ob_size;
472 if (where < 0)
473 where = 0;
474 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 if (where > self->ob_size)
476 where = self->ob_size;
477 memmove(items + (where+1)*self->ob_descr->itemsize,
478 items + where*self->ob_descr->itemsize,
479 (self->ob_size-where)*self->ob_descr->itemsize);
480 self->ob_item = items;
481 self->ob_size++;
482 return (*self->ob_descr->setitem)(self, where, v);
483}
484
Guido van Rossum778983b1993-02-19 15:55:02 +0000485/* Methods */
486
487static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000488array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000489{
Guido van Rossum778983b1993-02-19 15:55:02 +0000490 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000491 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000492 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000493}
494
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000495static PyObject *
496array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000497{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000498 arrayobject *va, *wa;
499 PyObject *vi = NULL;
500 PyObject *wi = NULL;
501 int i, k;
502 PyObject *res;
503
Martin v. Löwis99866332002-03-01 10:27:01 +0000504 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000505 Py_INCREF(Py_NotImplemented);
506 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000507 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000508
509 va = (arrayobject *)v;
510 wa = (arrayobject *)w;
511
512 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
513 /* Shortcut: if the lengths differ, the arrays differ */
514 if (op == Py_EQ)
515 res = Py_False;
516 else
517 res = Py_True;
518 Py_INCREF(res);
519 return res;
520 }
521
522 /* Search for the first index where items are different */
523 k = 1;
524 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
525 vi = getarrayitem(v, i);
526 wi = getarrayitem(w, i);
527 if (vi == NULL || wi == NULL) {
528 Py_XDECREF(vi);
529 Py_XDECREF(wi);
530 return NULL;
531 }
532 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
533 if (k == 0)
534 break; /* Keeping vi and wi alive! */
535 Py_DECREF(vi);
536 Py_DECREF(wi);
537 if (k < 0)
538 return NULL;
539 }
540
541 if (k) {
542 /* No more items to compare -- compare sizes */
543 int vs = va->ob_size;
544 int ws = wa->ob_size;
545 int cmp;
546 switch (op) {
547 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000548 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000549 case Py_EQ: cmp = vs == ws; break;
550 case Py_NE: cmp = vs != ws; break;
551 case Py_GT: cmp = vs > ws; break;
552 case Py_GE: cmp = vs >= ws; break;
553 default: return NULL; /* cannot happen */
554 }
555 if (cmp)
556 res = Py_True;
557 else
558 res = Py_False;
559 Py_INCREF(res);
560 return res;
561 }
562
563 /* We have an item that differs. First, shortcuts for EQ/NE */
564 if (op == Py_EQ) {
565 Py_INCREF(Py_False);
566 res = Py_False;
567 }
568 else if (op == Py_NE) {
569 Py_INCREF(Py_True);
570 res = Py_True;
571 }
572 else {
573 /* Compare the final item again using the proper operator */
574 res = PyObject_RichCompare(vi, wi, op);
575 }
576 Py_DECREF(vi);
577 Py_DECREF(wi);
578 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000579}
580
581static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000582array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000583{
584 return a->ob_size;
585}
586
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000587static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000588array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000589{
590 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000591 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000592 return NULL;
593 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000594 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000595}
596
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000597static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000598array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000599{
600 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 if (ilow < 0)
602 ilow = 0;
603 else if (ilow > a->ob_size)
604 ilow = a->ob_size;
605 if (ihigh < 0)
606 ihigh = 0;
607 if (ihigh < ilow)
608 ihigh = ilow;
609 else if (ihigh > a->ob_size)
610 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000611 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000612 if (np == NULL)
613 return NULL;
614 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
615 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000616 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000617}
618
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000619static PyObject *
Raymond Hettinger3aa82c02004-03-13 18:18:51 +0000620array_copy(arrayobject *a, PyObject *unused)
621{
622 return array_slice(a, 0, a->ob_size);
623}
624
625PyDoc_STRVAR(copy_doc,
626"copy(array)\n\
627\n\
628 Return a copy of the array.");
629
630static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000631array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000632{
633 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000634 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000635 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000636 PyErr_Format(PyExc_TypeError,
637 "can only append array (not \"%.200s\") to array",
638 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000639 return NULL;
640 }
641#define b ((arrayobject *)bb)
642 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000643 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000644 return NULL;
645 }
646 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000647 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 if (np == NULL) {
649 return NULL;
650 }
651 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
652 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000653 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000654 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000655#undef b
656}
657
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000658static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000659array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000660{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000661 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000662 int size;
663 arrayobject *np;
664 char *p;
665 int nbytes;
666 if (n < 0)
667 n = 0;
668 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000669 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000670 if (np == NULL)
671 return NULL;
672 p = np->ob_item;
673 nbytes = a->ob_size * a->ob_descr->itemsize;
674 for (i = 0; i < n; i++) {
675 memcpy(p, a->ob_item, nbytes);
676 p += nbytes;
677 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000678 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000679}
680
681static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000682array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000683{
684 char *item;
685 int n; /* Size of replacement array */
686 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000687#define b ((arrayobject *)v)
688 if (v == NULL)
689 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000690 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000691 n = b->ob_size;
692 if (a == b) {
693 /* Special case "a[i:j] = a" -- copy b first */
694 int ret;
695 v = array_slice(b, 0, n);
696 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000697 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000698 return ret;
699 }
700 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000701 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000702 return -1;
703 }
704 }
705 else {
Fred Drake137507e2000-06-01 02:02:46 +0000706 PyErr_Format(PyExc_TypeError,
707 "can only assign array (not \"%.200s\") to array slice",
708 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000709 return -1;
710 }
711 if (ilow < 0)
712 ilow = 0;
713 else if (ilow > a->ob_size)
714 ilow = a->ob_size;
715 if (ihigh < 0)
716 ihigh = 0;
717 if (ihigh < ilow)
718 ihigh = ilow;
719 else if (ihigh > a->ob_size)
720 ihigh = a->ob_size;
721 item = a->ob_item;
722 d = n - (ihigh-ilow);
723 if (d < 0) { /* Delete -d items */
724 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
725 item + ihigh*a->ob_descr->itemsize,
726 (a->ob_size-ihigh)*a->ob_descr->itemsize);
727 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000728 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000729 /* Can't fail */
730 a->ob_item = item;
731 }
732 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000733 PyMem_RESIZE(item, char,
734 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000735 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000736 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000737 return -1;
738 }
739 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
740 item + ihigh*a->ob_descr->itemsize,
741 (a->ob_size-ihigh)*a->ob_descr->itemsize);
742 a->ob_item = item;
743 a->ob_size += d;
744 }
745 if (n > 0)
746 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
747 n*b->ob_descr->itemsize);
748 return 0;
749#undef b
750}
751
752static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000753array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000754{
755 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000756 PyErr_SetString(PyExc_IndexError,
757 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000758 return -1;
759 }
760 if (v == NULL)
761 return array_ass_slice(a, i, i+1, v);
762 return (*a->ob_descr->setitem)(a, i, v);
763}
764
765static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000766setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000767{
Martin v. Löwis99866332002-03-01 10:27:01 +0000768 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000769 return array_ass_item((arrayobject *)a, i, v);
770}
771
Martin v. Löwis99866332002-03-01 10:27:01 +0000772static int
773array_do_extend(arrayobject *self, PyObject *bb)
774{
775 int size;
776
777 if (!array_Check(bb)) {
778 PyErr_Format(PyExc_TypeError,
779 "can only extend array with array (not \"%.200s\")",
780 bb->ob_type->tp_name);
781 return -1;
782 }
783#define b ((arrayobject *)bb)
784 if (self->ob_descr != b->ob_descr) {
785 PyErr_SetString(PyExc_TypeError,
786 "can only extend with array of same kind");
787 return -1;
788 }
789 size = self->ob_size + b->ob_size;
790 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
791 if (self->ob_item == NULL) {
792 PyObject_Del(self);
793 PyErr_NoMemory();
794 return -1;
795 }
796 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
797 b->ob_item, b->ob_size*b->ob_descr->itemsize);
798 self->ob_size = size;
799
800 return 0;
801#undef b
802}
803
804static PyObject *
805array_inplace_concat(arrayobject *self, PyObject *bb)
806{
807 if (array_do_extend(self, bb) == -1)
808 return NULL;
809 Py_INCREF(self);
810 return (PyObject *)self;
811}
812
813static PyObject *
814array_inplace_repeat(arrayobject *self, int n)
815{
816 char *items, *p;
817 int size, i;
818
819 if (self->ob_size > 0) {
820 if (n < 0)
821 n = 0;
822 items = self->ob_item;
823 size = self->ob_size * self->ob_descr->itemsize;
824 if (n == 0) {
825 PyMem_FREE(items);
826 self->ob_item = NULL;
827 self->ob_size = 0;
828 }
829 else {
830 PyMem_Resize(items, char, n * size);
831 if (items == NULL)
832 return PyErr_NoMemory();
833 p = items;
834 for (i = 1; i < n; i++) {
835 p += size;
836 memcpy(p, items, size);
837 }
838 self->ob_item = items;
839 self->ob_size *= n;
840 }
841 }
842 Py_INCREF(self);
843 return (PyObject *)self;
844}
845
846
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000847static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000848ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000849{
850 if (ins1(self, where, v) != 0)
851 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000852 Py_INCREF(Py_None);
853 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000854}
855
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000856static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000857array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000858{
859 int count = 0;
860 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000861
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000862 for (i = 0; i < self->ob_size; i++) {
863 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000864 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000865 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000866 if (cmp > 0)
867 count++;
868 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000869 return NULL;
870 }
871 return PyInt_FromLong((long)count);
872}
873
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000874PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000875"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000876\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000877Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000878
879static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000880array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000881{
882 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000883
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000884 for (i = 0; i < self->ob_size; i++) {
885 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000886 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
887 Py_DECREF(selfi);
888 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000889 return PyInt_FromLong((long)i);
890 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000891 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000892 return NULL;
893 }
894 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
895 return NULL;
896}
897
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000898PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000899"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000900\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000901Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000902
Raymond Hettinger625812f2003-01-07 01:58:52 +0000903static int
904array_contains(arrayobject *self, PyObject *v)
905{
906 int i, cmp;
907
908 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
909 PyObject *selfi = getarrayitem((PyObject *)self, i);
910 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
911 Py_DECREF(selfi);
912 }
913 return cmp;
914}
915
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000917array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918{
919 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921 for (i = 0; i < self->ob_size; i++) {
922 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000923 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
924 Py_DECREF(selfi);
925 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000926 if (array_ass_slice(self, i, i+1,
927 (PyObject *)NULL) != 0)
928 return NULL;
929 Py_INCREF(Py_None);
930 return Py_None;
931 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000932 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933 return NULL;
934 }
935 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
936 return NULL;
937}
938
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000939PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000940"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000941\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000942Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000943
944static PyObject *
945array_pop(arrayobject *self, PyObject *args)
946{
947 int i = -1;
948 PyObject *v;
949 if (!PyArg_ParseTuple(args, "|i:pop", &i))
950 return NULL;
951 if (self->ob_size == 0) {
952 /* Special-case most common failure cause */
953 PyErr_SetString(PyExc_IndexError, "pop from empty array");
954 return NULL;
955 }
956 if (i < 0)
957 i += self->ob_size;
958 if (i < 0 || i >= self->ob_size) {
959 PyErr_SetString(PyExc_IndexError, "pop index out of range");
960 return NULL;
961 }
962 v = getarrayitem((PyObject *)self,i);
963 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
964 Py_DECREF(v);
965 return NULL;
966 }
967 return v;
968}
969
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000970PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000971"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000972\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000973Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974
975static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000976array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000977{
Martin v. Löwis99866332002-03-01 10:27:01 +0000978 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000979 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +0000980 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000981 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000982}
983
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000984PyDoc_STRVAR(extend_doc,
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000985"extend(array)\n\
986\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000987 Append array items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000988
989static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000990array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000991{
992 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000993 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000994 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000995 return NULL;
996 return ins(self, i, v);
997}
998
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000999PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001000"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001001\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001002Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001003
1004
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001005static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001006array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001007{
Tim Peters077a11d2000-09-16 22:31:29 +00001008 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001009 retval = PyTuple_New(2);
1010 if (!retval)
1011 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001012
1013 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1014 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1015
1016 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001017}
1018
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001019PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001020"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001021\n\
1022Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001023the length in items of the buffer used to hold array's contents\n\
1024The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001025the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001026
1027
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001028static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001029array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001030{
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 return ins(self, (int) self->ob_size, v);
1032}
1033
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001034PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001035"append(x)\n\
1036\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001037Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001038
1039
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001040static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001041array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001042{
1043 char *p;
1044 int i;
Fred Drakebf272981999-12-03 17:15:30 +00001045
Guido van Rossum778983b1993-02-19 15:55:02 +00001046 switch (self->ob_descr->itemsize) {
1047 case 1:
1048 break;
1049 case 2:
1050 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1051 char p0 = p[0];
1052 p[0] = p[1];
1053 p[1] = p0;
1054 }
1055 break;
1056 case 4:
1057 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1058 char p0 = p[0];
1059 char p1 = p[1];
1060 p[0] = p[3];
1061 p[1] = p[2];
1062 p[2] = p1;
1063 p[3] = p0;
1064 }
1065 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001066 case 8:
1067 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1068 char p0 = p[0];
1069 char p1 = p[1];
1070 char p2 = p[2];
1071 char p3 = p[3];
1072 p[0] = p[7];
1073 p[1] = p[6];
1074 p[2] = p[5];
1075 p[3] = p[4];
1076 p[4] = p3;
1077 p[5] = p2;
1078 p[6] = p1;
1079 p[7] = p0;
1080 }
1081 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001082 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001083 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001084 "don't know how to byteswap this array type");
1085 return NULL;
1086 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001087 Py_INCREF(Py_None);
1088 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001089}
1090
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001091PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001092"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001093\n\
Fred Drakebf272981999-12-03 17:15:30 +00001094Byteswap 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 +000010954, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001096
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001098array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001099{
Guido van Rossume77a7571993-11-03 15:01:26 +00001100 register int itemsize = self->ob_descr->itemsize;
1101 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001102 /* little buffer to hold items while swapping */
1103 char tmp[256]; /* 8 is probably enough -- but why skimp */
1104 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001105
Guido van Rossum778983b1993-02-19 15:55:02 +00001106 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001107 for (p = self->ob_item,
1108 q = self->ob_item + (self->ob_size - 1)*itemsize;
1109 p < q;
1110 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001111 /* memory areas guaranteed disjoint, so memcpy
1112 * is safe (& memmove may be slower).
1113 */
1114 memcpy(tmp, p, itemsize);
1115 memcpy(p, q, itemsize);
1116 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001117 }
1118 }
Tim Petersbb307342000-09-10 05:22:54 +00001119
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}
Guido van Rossume77a7571993-11-03 15:01:26 +00001123
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001124PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001125"reverse()\n\
1126\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001127Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001128
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001130array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001131{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001132 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001133 int n;
1134 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001135 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001136 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001137 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001138 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001140 return NULL;
1141 }
1142 if (n > 0) {
1143 char *item = self->ob_item;
1144 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001145 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001146 int newlength;
1147 size_t newbytes;
1148 /* Be careful here about overflow */
1149 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001150 (newbytes = newlength * itemsize) / itemsize !=
1151 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001152 goto nomem;
1153 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001154 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001155 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001156 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001157 return NULL;
1158 }
1159 self->ob_item = item;
1160 self->ob_size += n;
1161 nread = fread(item + (self->ob_size - n) * itemsize,
1162 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001163 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001164 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001165 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001166 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 PyErr_SetString(PyExc_EOFError,
1168 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 return NULL;
1170 }
1171 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001172 Py_INCREF(Py_None);
1173 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001174}
1175
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001176PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001177"fromfile(f, n)\n\
1178\n\
1179Read 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 +00001180array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001181
1182
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001183static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001184array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001185{
Guido van Rossum778983b1993-02-19 15:55:02 +00001186 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001187
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001188 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001189 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001190 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001191 return NULL;
1192 }
1193 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001194 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1195 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001196 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001197 clearerr(fp);
1198 return NULL;
1199 }
1200 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001201 Py_INCREF(Py_None);
1202 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001203}
1204
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001205PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001206"tofile(f)\n\
1207\n\
1208Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001209write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001210
1211
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001212static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001213array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001214{
1215 int n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001216 int itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001217
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218 if (!PyList_Check(list)) {
1219 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001220 return NULL;
1221 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001222 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001223 if (n > 0) {
1224 char *item = self->ob_item;
1225 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001227 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 return NULL;
1230 }
1231 self->ob_item = item;
1232 self->ob_size += n;
1233 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001234 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001235 if ((*self->ob_descr->setitem)(self,
1236 self->ob_size - n + i, v) != 0) {
1237 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001238 PyMem_RESIZE(item, char,
1239 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001240 self->ob_item = item;
1241 return NULL;
1242 }
1243 }
1244 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001245 Py_INCREF(Py_None);
1246 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001247}
1248
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001249PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001250"fromlist(list)\n\
1251\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001252Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001253
1254
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001255static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001256array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001257{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001258 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 int i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001260
Guido van Rossum778983b1993-02-19 15:55:02 +00001261 if (list == NULL)
1262 return NULL;
1263 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001266 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001267 return NULL;
1268 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001269 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001270 }
1271 return list;
1272}
1273
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001274PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001275"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001276\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001277Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001278
1279
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001280static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001281array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001282{
1283 char *str;
1284 int n;
1285 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001286 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001287 return NULL;
1288 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001289 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001290 "string length not a multiple of item size");
1291 return NULL;
1292 }
1293 n = n / itemsize;
1294 if (n > 0) {
1295 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001296 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001298 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001299 return NULL;
1300 }
1301 self->ob_item = item;
1302 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001303 memcpy(item + (self->ob_size - n) * itemsize,
1304 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001305 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001306 Py_INCREF(Py_None);
1307 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001308}
1309
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001310PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001311"fromstring(string)\n\
1312\n\
1313Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001314values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001315
1316
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001318array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001319{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001320 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001321 self->ob_size * self->ob_descr->itemsize);
1322}
1323
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001324PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001325"tostring() -> string\n\
1326\n\
1327Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001328representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001329
Martin v. Löwis99866332002-03-01 10:27:01 +00001330
1331
1332#ifdef Py_USING_UNICODE
1333static PyObject *
1334array_fromunicode(arrayobject *self, PyObject *args)
1335{
1336 Py_UNICODE *ustr;
1337 int n;
1338
1339 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1340 return NULL;
1341 if (self->ob_descr->typecode != 'u') {
1342 PyErr_SetString(PyExc_ValueError,
1343 "fromunicode() may only be called on "
1344 "type 'u' arrays");
1345 return NULL;
1346 }
1347 if (n > 0) {
1348 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1349 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1350 if (item == NULL) {
1351 PyErr_NoMemory();
1352 return NULL;
1353 }
1354 self->ob_item = (char *) item;
1355 self->ob_size += n;
1356 memcpy(item + self->ob_size - n,
1357 ustr, n * sizeof(Py_UNICODE));
1358 }
1359
1360 Py_INCREF(Py_None);
1361 return Py_None;
1362}
1363
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001364PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001365"fromunicode(ustr)\n\
1366\n\
1367Extends this array with data from the unicode string ustr.\n\
1368The array must be a type 'u' array; otherwise a ValueError\n\
1369is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001370append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001371
1372
1373static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001374array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001375{
Martin v. Löwis99866332002-03-01 10:27:01 +00001376 if (self->ob_descr->typecode != 'u') {
1377 PyErr_SetString(PyExc_ValueError,
1378 "tounicode() may only be called on type 'u' arrays");
1379 return NULL;
1380 }
1381 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1382}
1383
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001384PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001385"tounicode() -> unicode\n\
1386\n\
1387Convert the array to a unicode string. The array must be\n\
1388a type 'u' array; otherwise a ValueError is raised. Use\n\
1389array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001390an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001391
1392#endif /* Py_USING_UNICODE */
1393
1394
1395static PyObject *
1396array_get_typecode(arrayobject *a, void *closure)
1397{
1398 char tc = a->ob_descr->typecode;
1399 return PyString_FromStringAndSize(&tc, 1);
1400}
1401
1402static PyObject *
1403array_get_itemsize(arrayobject *a, void *closure)
1404{
1405 return PyInt_FromLong((long)a->ob_descr->itemsize);
1406}
1407
1408static PyGetSetDef array_getsets [] = {
1409 {"typecode", (getter) array_get_typecode, NULL,
1410 "the typecode character used to create the array"},
1411 {"itemsize", (getter) array_get_itemsize, NULL,
1412 "the size, in bytes, of one array item"},
1413 {NULL}
1414};
1415
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001416PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001417 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001418 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001419 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001420 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001421 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001422 byteswap_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001423 {"__copy__", (PyCFunction)array_copy, METH_NOARGS,
1424 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001425 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001426 count_doc},
Raymond Hettinger3aa82c02004-03-13 18:18:51 +00001427 {"__deepcopy__",(PyCFunction)array_copy, METH_NOARGS,
1428 copy_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001429 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001430 extend_doc},
1431 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1432 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001433 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001434 fromlist_doc},
1435 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1436 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001437#ifdef Py_USING_UNICODE
1438 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1439 fromunicode_doc},
1440#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001441 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001442 index_doc},
1443 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1444 insert_doc},
1445 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1446 pop_doc},
1447 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1448 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001449 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001450 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001451 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001452 reverse_doc},
1453/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1454 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001455 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001456 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001457 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001458 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001459 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001460 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001461#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001462 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001463 tounicode_doc},
1464#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001465 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001466 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001467 {NULL, NULL} /* sentinel */
1468};
1469
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001470static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001471array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001472{
Martin v. Löwis99866332002-03-01 10:27:01 +00001473 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001474 PyObject *s, *t, *v = NULL;
1475 int len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001476
Guido van Rossum778983b1993-02-19 15:55:02 +00001477 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001478 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001479 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001480 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001481 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001482 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001483
1484 if (typecode == 'c')
1485 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001486#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001487 else if (typecode == 'u')
1488 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001489#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001490 else
1491 v = array_tolist(a, NULL);
1492 t = PyObject_Repr(v);
1493 Py_XDECREF(v);
1494
1495 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001496 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001497 PyString_ConcatAndDel(&s, t);
1498 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001499 return s;
1500}
1501
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001502static PyObject*
1503array_subscr(arrayobject* self, PyObject* item)
1504{
1505 if (PyInt_Check(item)) {
1506 long i = PyInt_AS_LONG(item);
1507 if (i < 0)
1508 i += self->ob_size;
1509 return array_item(self, i);
1510 }
1511 else if (PyLong_Check(item)) {
1512 long i = PyLong_AsLong(item);
1513 if (i == -1 && PyErr_Occurred())
1514 return NULL;
1515 if (i < 0)
1516 i += self->ob_size;
1517 return array_item(self, i);
1518 }
1519 else if (PySlice_Check(item)) {
1520 int start, stop, step, slicelength, cur, i;
1521 PyObject* result;
1522 arrayobject* ar;
1523 int itemsize = self->ob_descr->itemsize;
1524
1525 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1526 &start, &stop, &step, &slicelength) < 0) {
1527 return NULL;
1528 }
1529
1530 if (slicelength <= 0) {
1531 return newarrayobject(&Arraytype, 0, self->ob_descr);
1532 }
1533 else {
1534 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1535 if (!result) return NULL;
1536
1537 ar = (arrayobject*)result;
1538
1539 for (cur = start, i = 0; i < slicelength;
1540 cur += step, i++) {
1541 memcpy(ar->ob_item + i*itemsize,
1542 self->ob_item + cur*itemsize,
1543 itemsize);
1544 }
1545
1546 return result;
1547 }
1548 }
1549 else {
1550 PyErr_SetString(PyExc_TypeError,
1551 "list indices must be integers");
1552 return NULL;
1553 }
1554}
1555
1556static int
1557array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1558{
1559 if (PyInt_Check(item)) {
1560 long i = PyInt_AS_LONG(item);
1561 if (i < 0)
1562 i += self->ob_size;
1563 return array_ass_item(self, i, value);
1564 }
1565 else if (PyLong_Check(item)) {
1566 long i = PyLong_AsLong(item);
1567 if (i == -1 && PyErr_Occurred())
1568 return -1;
1569 if (i < 0)
1570 i += self->ob_size;
1571 return array_ass_item(self, i, value);
1572 }
1573 else if (PySlice_Check(item)) {
1574 int start, stop, step, slicelength;
1575 int itemsize = self->ob_descr->itemsize;
1576
1577 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1578 &start, &stop, &step, &slicelength) < 0) {
1579 return -1;
1580 }
1581
1582 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1583 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1584 return array_ass_slice(self, start, stop, value);
1585
1586 if (value == NULL) {
1587 /* delete slice */
Michael W. Hudson56796f62002-07-29 14:35:04 +00001588 int cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001589
1590 if (slicelength <= 0)
1591 return 0;
1592
1593 if (step < 0) {
1594 stop = start + 1;
1595 start = stop + step*(slicelength - 1) - 1;
1596 step = -step;
1597 }
1598
Michael W. Hudson56796f62002-07-29 14:35:04 +00001599 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001600 cur += step, i++) {
1601 memmove(self->ob_item + (cur - i)*itemsize,
1602 self->ob_item + (cur + 1)*itemsize,
1603 (step - 1) * itemsize);
1604 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001605 extra = self->ob_size - (cur + 1);
1606 if (extra > 0) {
1607 memmove(self->ob_item + (cur - i)*itemsize,
1608 self->ob_item + (cur + 1)*itemsize,
1609 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001610 }
1611
1612 self->ob_size -= slicelength;
1613 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
1614
1615
1616 return 0;
1617 }
1618 else {
1619 /* assign slice */
1620 int cur, i;
1621 arrayobject* av;
1622
1623 if (!array_Check(value)) {
1624 PyErr_Format(PyExc_TypeError,
1625 "must assign array (not \"%.200s\") to slice",
1626 value->ob_type->tp_name);
1627 return -1;
1628 }
1629
1630 av = (arrayobject*)value;
1631
1632 if (av->ob_size != slicelength) {
1633 PyErr_Format(PyExc_ValueError,
1634 "attempt to assign array of size %d to extended slice of size %d",
1635 av->ob_size, slicelength);
1636 return -1;
1637 }
1638
1639 if (!slicelength)
1640 return 0;
1641
1642 /* protect against a[::-1] = a */
1643 if (self == av) {
1644 value = array_slice(av, 0, av->ob_size);
1645 av = (arrayobject*)value;
1646 }
1647 else {
1648 Py_INCREF(value);
1649 }
1650
1651 for (cur = start, i = 0; i < slicelength;
1652 cur += step, i++) {
1653 memcpy(self->ob_item + cur*itemsize,
1654 av->ob_item + i*itemsize,
1655 itemsize);
1656 }
1657
1658 Py_DECREF(value);
1659
1660 return 0;
1661 }
1662 }
1663 else {
1664 PyErr_SetString(PyExc_TypeError,
1665 "list indices must be integers");
1666 return -1;
1667 }
1668}
1669
1670static PyMappingMethods array_as_mapping = {
1671 (inquiry)array_length,
1672 (binaryfunc)array_subscr,
1673 (objobjargproc)array_ass_subscr
1674};
1675
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001676static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001677array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001678{
1679 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001680 PyErr_SetString(PyExc_SystemError,
1681 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001682 return -1;
1683 }
1684 *ptr = (void *)self->ob_item;
1685 return self->ob_size*self->ob_descr->itemsize;
1686}
1687
1688static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001689array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001690{
1691 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001692 PyErr_SetString(PyExc_SystemError,
1693 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001694 return -1;
1695 }
1696 *ptr = (void *)self->ob_item;
1697 return self->ob_size*self->ob_descr->itemsize;
1698}
1699
1700static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001701array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001702{
1703 if ( lenp )
1704 *lenp = self->ob_size*self->ob_descr->itemsize;
1705 return 1;
1706}
1707
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001708static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001709 (inquiry)array_length, /*sq_length*/
1710 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001711 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001712 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001713 (intintargfunc)array_slice, /*sq_slice*/
1714 (intobjargproc)array_ass_item, /*sq_ass_item*/
1715 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001716 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001717 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
1718 (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001719};
1720
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001721static PyBufferProcs array_as_buffer = {
1722 (getreadbufferproc)array_buffer_getreadbuf,
1723 (getwritebufferproc)array_buffer_getwritebuf,
1724 (getsegcountproc)array_buffer_getsegcount,
1725};
1726
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001727static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001728array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001729{
1730 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001731 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001732 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00001733
1734 if (kwds != NULL) {
1735 int i = PyObject_Length(kwds);
1736 if (i < 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001737 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001738 else if (i > 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001739 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001740 "array.array constructor takes "
1741 "no keyword arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +00001742 return NULL;
1743 }
1744 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001745
1746 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1747 return NULL;
1748
1749 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001750 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001751 || (c == 'u' && PyUnicode_Check(initial)))) {
1752 PyErr_SetString(PyExc_TypeError,
1753 "array initializer must be list or string");
1754 return NULL;
1755 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001756 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1757 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001758 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001759 int len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001760
1761 if (initial == NULL || !(PyList_Check(initial)
1762 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001763 len = 0;
1764 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001765 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001766
1767 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001768 if (a == NULL)
1769 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001770
Guido van Rossum778983b1993-02-19 15:55:02 +00001771 if (len > 0) {
1772 int i;
1773 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001774 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001775 PySequence_GetItem(initial, i);
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001776 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001777 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001778 return NULL;
1779 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001780 if (setarrayitem(a, i, v) != 0) {
1781 Py_DECREF(v);
1782 Py_DECREF(a);
1783 return NULL;
1784 }
1785 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001786 }
Raymond Hettinger85004cc2003-08-05 11:23:59 +00001787 } else if (initial != NULL && PyString_Check(initial)) {
Raymond Hettinger8ae46892003-10-12 19:09:37 +00001788 PyObject *t_initial = PyTuple_Pack(1,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001789 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001790 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001791 array_fromstring((arrayobject *)a,
1792 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001793 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001794 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001795 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001796 return NULL;
1797 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001798 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001799#ifdef Py_USING_UNICODE
1800 } else if (initial != NULL && PyUnicode_Check(initial)) {
1801 int n = PyUnicode_GET_DATA_SIZE(initial);
1802 if (n > 0) {
1803 arrayobject *self = (arrayobject *)a;
1804 char *item = self->ob_item;
1805 item = PyMem_Realloc(item, n);
1806 if (item == NULL) {
1807 PyErr_NoMemory();
1808 Py_DECREF(a);
1809 return NULL;
1810 }
1811 self->ob_item = item;
1812 self->ob_size = n / sizeof(Py_UNICODE);
1813 memcpy(item, PyUnicode_AS_DATA(initial), n);
1814 }
1815#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001816 }
1817 return a;
1818 }
1819 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001820 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001821 "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 +00001822 return NULL;
1823}
1824
Guido van Rossum778983b1993-02-19 15:55:02 +00001825
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001826PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001827"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001828an array of basic values: characters, integers, floating point\n\
1829numbers. Arrays are sequence types and behave very much like lists,\n\
1830except that the type of objects stored in them is constrained. The\n\
1831type is specified at object creation time by using a type code, which\n\
1832is a single character. The following type codes are defined:\n\
1833\n\
1834 Type code C Type Minimum size in bytes \n\
1835 'c' character 1 \n\
1836 'b' signed integer 1 \n\
1837 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001838 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001839 'h' signed integer 2 \n\
1840 'H' unsigned integer 2 \n\
1841 'i' signed integer 2 \n\
1842 'I' unsigned integer 2 \n\
1843 'l' signed integer 4 \n\
1844 'L' unsigned integer 4 \n\
1845 'f' floating point 4 \n\
1846 'd' floating point 8 \n\
1847\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001848The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001849\n\
1850array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001851");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001852
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001853PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001854"array(typecode [, initializer]) -> array\n\
1855\n\
1856Return a new array whose items are restricted by typecode, and\n\
1857initialized from the optional initializer value, which must be a list\n\
1858or a string.\n\
1859\n\
1860Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001861the type of objects stored in them is constrained.\n\
1862\n\
1863Methods:\n\
1864\n\
1865append() -- append a new item to the end of the array\n\
1866buffer_info() -- return information giving the current memory info\n\
1867byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001868count() -- return number of occurences of an object\n\
1869extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001870fromfile() -- read items from a file object\n\
1871fromlist() -- append items from the list\n\
1872fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001873index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001874insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001875pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001876read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001877remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001878reverse() -- reverse the order of the items in the array\n\
1879tofile() -- write all items to a file object\n\
1880tolist() -- return the array converted to an ordinary list\n\
1881tostring() -- return the array converted to a string\n\
1882write() -- DEPRECATED, use tofile()\n\
1883\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001884Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001885\n\
1886typecode -- the typecode character used to create the array\n\
1887itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001888");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001889
Raymond Hettinger625812f2003-01-07 01:58:52 +00001890static PyObject *array_iter(arrayobject *ao);
1891
Tim Peters0c322792002-07-17 16:49:03 +00001892static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001893 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001894 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001895 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001896 sizeof(arrayobject),
1897 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001898 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001899 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001900 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001901 0, /* tp_setattr */
1902 0, /* tp_compare */
1903 (reprfunc)array_repr, /* tp_repr */
1904 0, /* tp_as _number*/
1905 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001906 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001907 0, /* tp_hash */
1908 0, /* tp_call */
1909 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001910 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001911 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001912 &array_as_buffer, /* tp_as_buffer*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001913 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001914 arraytype_doc, /* tp_doc */
1915 0, /* tp_traverse */
1916 0, /* tp_clear */
1917 array_richcompare, /* tp_richcompare */
Martin v. Löwis99866332002-03-01 10:27:01 +00001918 0, /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00001919 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00001920 0, /* tp_iternext */
1921 array_methods, /* tp_methods */
1922 0, /* tp_members */
1923 array_getsets, /* tp_getset */
1924 0, /* tp_base */
1925 0, /* tp_dict */
1926 0, /* tp_descr_get */
1927 0, /* tp_descr_set */
1928 0, /* tp_dictoffset */
1929 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001930 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00001931 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001932 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001933};
1934
Raymond Hettinger625812f2003-01-07 01:58:52 +00001935
1936/*********************** Array Iterator **************************/
1937
1938typedef struct {
1939 PyObject_HEAD
1940 long index;
1941 arrayobject *ao;
1942 PyObject * (*getitem)(struct arrayobject *, int);
1943} arrayiterobject;
1944
1945static PyTypeObject PyArrayIter_Type;
1946
1947#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
1948
1949static PyObject *
1950array_iter(arrayobject *ao)
1951{
1952 arrayiterobject *it;
1953
1954 if (!array_Check(ao)) {
1955 PyErr_BadInternalCall();
1956 return NULL;
1957 }
1958
1959 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
1960 if (it == NULL)
1961 return NULL;
1962
1963 Py_INCREF(ao);
1964 it->ao = ao;
1965 it->index = 0;
1966 it->getitem = ao->ob_descr->getitem;
1967 PyObject_GC_Track(it);
1968 return (PyObject *)it;
1969}
1970
1971static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00001972arrayiter_next(arrayiterobject *it)
1973{
1974 assert(PyArrayIter_Check(it));
1975 if (it->index < it->ao->ob_size)
1976 return (*it->getitem)(it->ao, it->index++);
1977 return NULL;
1978}
1979
1980static void
1981arrayiter_dealloc(arrayiterobject *it)
1982{
1983 PyObject_GC_UnTrack(it);
1984 Py_XDECREF(it->ao);
1985 PyObject_GC_Del(it);
1986}
1987
1988static int
1989arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
1990{
1991 if (it->ao != NULL)
1992 return visit((PyObject *)(it->ao), arg);
1993 return 0;
1994}
1995
1996static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00001997 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00001998 0, /* ob_size */
1999 "arrayiterator", /* tp_name */
2000 sizeof(arrayiterobject), /* tp_basicsize */
2001 0, /* tp_itemsize */
2002 /* methods */
2003 (destructor)arrayiter_dealloc, /* tp_dealloc */
2004 0, /* tp_print */
2005 0, /* tp_getattr */
2006 0, /* tp_setattr */
2007 0, /* tp_compare */
2008 0, /* tp_repr */
2009 0, /* tp_as_number */
2010 0, /* tp_as_sequence */
2011 0, /* tp_as_mapping */
2012 0, /* tp_hash */
2013 0, /* tp_call */
2014 0, /* tp_str */
2015 PyObject_GenericGetAttr, /* tp_getattro */
2016 0, /* tp_setattro */
2017 0, /* tp_as_buffer */
2018 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2019 0, /* tp_doc */
2020 (traverseproc)arrayiter_traverse, /* tp_traverse */
2021 0, /* tp_clear */
2022 0, /* tp_richcompare */
2023 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002024 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002025 (iternextfunc)arrayiter_next, /* tp_iternext */
2026 0, /* tp_methods */
2027};
2028
2029
2030/*********************** Install Module **************************/
2031
Martin v. Löwis99866332002-03-01 10:27:01 +00002032/* No functions in array module. */
2033static PyMethodDef a_methods[] = {
2034 {NULL, NULL, 0, NULL} /* Sentinel */
2035};
2036
2037
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002038PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002039initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002040{
Fred Drakef4e34842002-04-01 03:45:06 +00002041 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002042
Martin v. Löwis99866332002-03-01 10:27:01 +00002043 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002044 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002045 m = Py_InitModule3("array", a_methods, module_doc);
Fred Drakef4e34842002-04-01 03:45:06 +00002046
2047 Py_INCREF((PyObject *)&Arraytype);
2048 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2049 Py_INCREF((PyObject *)&Arraytype);
2050 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002051 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002052}