blob: dcb66cf0a89da388718008620b4de4bcd6f4be43 [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;
450 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000451 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000452 return NULL;
453 }
454 return (*ap->ob_descr->getitem)(ap, i);
455}
456
457static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000458ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000459{
Guido van Rossum778983b1993-02-19 15:55:02 +0000460 char *items;
461 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000462 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 return -1;
464 }
465 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
466 return -1;
467 items = self->ob_item;
Neal Norwitz937ca982003-02-24 02:08:42 +0000468 NRESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000470 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000471 return -1;
472 }
Walter Dörwald9e46abe2003-05-18 03:15:10 +0000473 if (where < 0) {
474 where += self->ob_size;
475 if (where < 0)
476 where = 0;
477 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000478 if (where > self->ob_size)
479 where = self->ob_size;
480 memmove(items + (where+1)*self->ob_descr->itemsize,
481 items + where*self->ob_descr->itemsize,
482 (self->ob_size-where)*self->ob_descr->itemsize);
483 self->ob_item = items;
484 self->ob_size++;
485 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 *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000623array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000624{
625 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000627 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000628 PyErr_Format(PyExc_TypeError,
629 "can only append array (not \"%.200s\") to array",
630 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000631 return NULL;
632 }
633#define b ((arrayobject *)bb)
634 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000635 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000636 return NULL;
637 }
638 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000639 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000640 if (np == NULL) {
641 return NULL;
642 }
643 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
644 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000645 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000646 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000647#undef b
648}
649
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000650static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000651array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000652{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000653 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000654 int size;
655 arrayobject *np;
656 char *p;
657 int nbytes;
658 if (n < 0)
659 n = 0;
660 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000661 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000662 if (np == NULL)
663 return NULL;
664 p = np->ob_item;
665 nbytes = a->ob_size * a->ob_descr->itemsize;
666 for (i = 0; i < n; i++) {
667 memcpy(p, a->ob_item, nbytes);
668 p += nbytes;
669 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000671}
672
673static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000674array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000675{
676 char *item;
677 int n; /* Size of replacement array */
678 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000679#define b ((arrayobject *)v)
680 if (v == NULL)
681 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000682 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 n = b->ob_size;
684 if (a == b) {
685 /* Special case "a[i:j] = a" -- copy b first */
686 int ret;
687 v = array_slice(b, 0, n);
688 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000689 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000690 return ret;
691 }
692 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000694 return -1;
695 }
696 }
697 else {
Fred Drake137507e2000-06-01 02:02:46 +0000698 PyErr_Format(PyExc_TypeError,
699 "can only assign array (not \"%.200s\") to array slice",
700 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000701 return -1;
702 }
703 if (ilow < 0)
704 ilow = 0;
705 else if (ilow > a->ob_size)
706 ilow = a->ob_size;
707 if (ihigh < 0)
708 ihigh = 0;
709 if (ihigh < ilow)
710 ihigh = ilow;
711 else if (ihigh > a->ob_size)
712 ihigh = a->ob_size;
713 item = a->ob_item;
714 d = n - (ihigh-ilow);
715 if (d < 0) { /* Delete -d items */
716 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
717 item + ihigh*a->ob_descr->itemsize,
718 (a->ob_size-ihigh)*a->ob_descr->itemsize);
719 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000720 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000721 /* Can't fail */
722 a->ob_item = item;
723 }
724 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000725 PyMem_RESIZE(item, char,
726 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000727 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000728 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000729 return -1;
730 }
731 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
732 item + ihigh*a->ob_descr->itemsize,
733 (a->ob_size-ihigh)*a->ob_descr->itemsize);
734 a->ob_item = item;
735 a->ob_size += d;
736 }
737 if (n > 0)
738 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
739 n*b->ob_descr->itemsize);
740 return 0;
741#undef b
742}
743
744static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000745array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000746{
747 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000748 PyErr_SetString(PyExc_IndexError,
749 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000750 return -1;
751 }
752 if (v == NULL)
753 return array_ass_slice(a, i, i+1, v);
754 return (*a->ob_descr->setitem)(a, i, v);
755}
756
757static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000758setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000759{
Martin v. Löwis99866332002-03-01 10:27:01 +0000760 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000761 return array_ass_item((arrayobject *)a, i, v);
762}
763
Martin v. Löwis99866332002-03-01 10:27:01 +0000764static int
765array_do_extend(arrayobject *self, PyObject *bb)
766{
767 int size;
768
769 if (!array_Check(bb)) {
770 PyErr_Format(PyExc_TypeError,
771 "can only extend array with array (not \"%.200s\")",
772 bb->ob_type->tp_name);
773 return -1;
774 }
775#define b ((arrayobject *)bb)
776 if (self->ob_descr != b->ob_descr) {
777 PyErr_SetString(PyExc_TypeError,
778 "can only extend with array of same kind");
779 return -1;
780 }
781 size = self->ob_size + b->ob_size;
782 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
783 if (self->ob_item == NULL) {
784 PyObject_Del(self);
785 PyErr_NoMemory();
786 return -1;
787 }
788 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
789 b->ob_item, b->ob_size*b->ob_descr->itemsize);
790 self->ob_size = size;
791
792 return 0;
793#undef b
794}
795
796static PyObject *
797array_inplace_concat(arrayobject *self, PyObject *bb)
798{
799 if (array_do_extend(self, bb) == -1)
800 return NULL;
801 Py_INCREF(self);
802 return (PyObject *)self;
803}
804
805static PyObject *
806array_inplace_repeat(arrayobject *self, int n)
807{
808 char *items, *p;
809 int size, i;
810
811 if (self->ob_size > 0) {
812 if (n < 0)
813 n = 0;
814 items = self->ob_item;
815 size = self->ob_size * self->ob_descr->itemsize;
816 if (n == 0) {
817 PyMem_FREE(items);
818 self->ob_item = NULL;
819 self->ob_size = 0;
820 }
821 else {
822 PyMem_Resize(items, char, n * size);
823 if (items == NULL)
824 return PyErr_NoMemory();
825 p = items;
826 for (i = 1; i < n; i++) {
827 p += size;
828 memcpy(p, items, size);
829 }
830 self->ob_item = items;
831 self->ob_size *= n;
832 }
833 }
834 Py_INCREF(self);
835 return (PyObject *)self;
836}
837
838
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000839static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000840ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000841{
842 if (ins1(self, where, v) != 0)
843 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000844 Py_INCREF(Py_None);
845 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000846}
847
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000848static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000849array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000850{
851 int count = 0;
852 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000853
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000854 for (i = 0; i < self->ob_size; i++) {
855 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000856 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000857 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000858 if (cmp > 0)
859 count++;
860 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000861 return NULL;
862 }
863 return PyInt_FromLong((long)count);
864}
865
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000866PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000867"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000868\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000869Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000870
871static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000872array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000873{
874 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000875
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000876 for (i = 0; i < self->ob_size; i++) {
877 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000878 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
879 Py_DECREF(selfi);
880 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000881 return PyInt_FromLong((long)i);
882 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000883 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000884 return NULL;
885 }
886 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
887 return NULL;
888}
889
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000890PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000891"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000892\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000893Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000894
Raymond Hettinger625812f2003-01-07 01:58:52 +0000895static int
896array_contains(arrayobject *self, PyObject *v)
897{
898 int i, cmp;
899
900 for (i = 0, cmp = 0 ; cmp == 0 && i < self->ob_size; i++) {
901 PyObject *selfi = getarrayitem((PyObject *)self, i);
902 cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
903 Py_DECREF(selfi);
904 }
905 return cmp;
906}
907
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000908static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000909array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000910{
911 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000912
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000913 for (i = 0; i < self->ob_size; i++) {
914 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000915 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
916 Py_DECREF(selfi);
917 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918 if (array_ass_slice(self, i, i+1,
919 (PyObject *)NULL) != 0)
920 return NULL;
921 Py_INCREF(Py_None);
922 return Py_None;
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.remove(x): x not in list");
928 return NULL;
929}
930
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000931PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000932"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000933\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000934Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000935
936static PyObject *
937array_pop(arrayobject *self, PyObject *args)
938{
939 int i = -1;
940 PyObject *v;
941 if (!PyArg_ParseTuple(args, "|i:pop", &i))
942 return NULL;
943 if (self->ob_size == 0) {
944 /* Special-case most common failure cause */
945 PyErr_SetString(PyExc_IndexError, "pop from empty array");
946 return NULL;
947 }
948 if (i < 0)
949 i += self->ob_size;
950 if (i < 0 || i >= self->ob_size) {
951 PyErr_SetString(PyExc_IndexError, "pop index out of range");
952 return NULL;
953 }
954 v = getarrayitem((PyObject *)self,i);
955 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
956 Py_DECREF(v);
957 return NULL;
958 }
959 return v;
960}
961
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000962PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000963"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000964\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000965Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000966
967static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000968array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000969{
Martin v. Löwis99866332002-03-01 10:27:01 +0000970 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000971 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +0000972 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000973 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000974}
975
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000976PyDoc_STRVAR(extend_doc,
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000977"extend(array)\n\
978\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000979 Append array items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000980
981static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000982array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000983{
984 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000985 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000986 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000987 return NULL;
988 return ins(self, i, v);
989}
990
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000991PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000992"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000993\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000994Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000995
996
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000997static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000998array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000999{
Tim Peters077a11d2000-09-16 22:31:29 +00001000 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +00001001 retval = PyTuple_New(2);
1002 if (!retval)
1003 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +00001004
1005 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
1006 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
1007
1008 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001009}
1010
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001011PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +00001012"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001013\n\
1014Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +00001015the length in items of the buffer used to hold array's contents\n\
1016The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001017the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001018
1019
Guido van Rossumde4a4ca1997-08-12 14:55:56 +00001020static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001021array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +00001022{
Guido van Rossum778983b1993-02-19 15:55:02 +00001023 return ins(self, (int) self->ob_size, v);
1024}
1025
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001026PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001027"append(x)\n\
1028\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001029Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001030
1031
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001033array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001034{
1035 char *p;
1036 int i;
Fred Drakebf272981999-12-03 17:15:30 +00001037
Guido van Rossum778983b1993-02-19 15:55:02 +00001038 switch (self->ob_descr->itemsize) {
1039 case 1:
1040 break;
1041 case 2:
1042 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1043 char p0 = p[0];
1044 p[0] = p[1];
1045 p[1] = p0;
1046 }
1047 break;
1048 case 4:
1049 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1050 char p0 = p[0];
1051 char p1 = p[1];
1052 p[0] = p[3];
1053 p[1] = p[2];
1054 p[2] = p1;
1055 p[3] = p0;
1056 }
1057 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001058 case 8:
1059 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1060 char p0 = p[0];
1061 char p1 = p[1];
1062 char p2 = p[2];
1063 char p3 = p[3];
1064 p[0] = p[7];
1065 p[1] = p[6];
1066 p[2] = p[5];
1067 p[3] = p[4];
1068 p[4] = p3;
1069 p[5] = p2;
1070 p[6] = p1;
1071 p[7] = p0;
1072 }
1073 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001075 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001076 "don't know how to byteswap this array type");
1077 return NULL;
1078 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001079 Py_INCREF(Py_None);
1080 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001081}
1082
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001083PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001084"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001085\n\
Fred Drakebf272981999-12-03 17:15:30 +00001086Byteswap 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 +000010874, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001088
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001090array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001091{
Guido van Rossume77a7571993-11-03 15:01:26 +00001092 register int itemsize = self->ob_descr->itemsize;
1093 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001094 /* little buffer to hold items while swapping */
1095 char tmp[256]; /* 8 is probably enough -- but why skimp */
1096 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001097
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001099 for (p = self->ob_item,
1100 q = self->ob_item + (self->ob_size - 1)*itemsize;
1101 p < q;
1102 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001103 /* memory areas guaranteed disjoint, so memcpy
1104 * is safe (& memmove may be slower).
1105 */
1106 memcpy(tmp, p, itemsize);
1107 memcpy(p, q, itemsize);
1108 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001109 }
1110 }
Tim Petersbb307342000-09-10 05:22:54 +00001111
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001112 Py_INCREF(Py_None);
1113 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001114}
Guido van Rossume77a7571993-11-03 15:01:26 +00001115
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001116PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001117"reverse()\n\
1118\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001119Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001120
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001121static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001122array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001123{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001124 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001125 int n;
1126 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001127 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001128 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001130 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001131 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001132 return NULL;
1133 }
1134 if (n > 0) {
1135 char *item = self->ob_item;
1136 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001137 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001138 int newlength;
1139 size_t newbytes;
1140 /* Be careful here about overflow */
1141 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001142 (newbytes = newlength * itemsize) / itemsize !=
1143 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001144 goto nomem;
1145 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001146 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001147 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001149 return NULL;
1150 }
1151 self->ob_item = item;
1152 self->ob_size += n;
1153 nread = fread(item + (self->ob_size - n) * itemsize,
1154 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001155 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001156 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001158 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001159 PyErr_SetString(PyExc_EOFError,
1160 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001161 return NULL;
1162 }
1163 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001164 Py_INCREF(Py_None);
1165 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001166}
1167
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001168PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001169"fromfile(f, n)\n\
1170\n\
1171Read 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 +00001172array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001173
1174
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001175static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001176array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001177{
Guido van Rossum778983b1993-02-19 15:55:02 +00001178 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001179
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001180 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001181 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001182 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001183 return NULL;
1184 }
1185 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001186 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1187 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001188 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001189 clearerr(fp);
1190 return NULL;
1191 }
1192 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001193 Py_INCREF(Py_None);
1194 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001195}
1196
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001197PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001198"tofile(f)\n\
1199\n\
1200Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001201write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001202
1203
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001204static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001205array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001206{
1207 int n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001208 int itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001209
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001210 if (!PyList_Check(list)) {
1211 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001212 return NULL;
1213 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001214 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001215 if (n > 0) {
1216 char *item = self->ob_item;
1217 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001219 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001220 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001221 return NULL;
1222 }
1223 self->ob_item = item;
1224 self->ob_size += n;
1225 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001227 if ((*self->ob_descr->setitem)(self,
1228 self->ob_size - n + i, v) != 0) {
1229 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001230 PyMem_RESIZE(item, char,
1231 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 self->ob_item = item;
1233 return NULL;
1234 }
1235 }
1236 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001237 Py_INCREF(Py_None);
1238 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001239}
1240
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001241PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001242"fromlist(list)\n\
1243\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001244Append items to array from list.");
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_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001249{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 int i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001252
Guido van Rossum778983b1993-02-19 15:55:02 +00001253 if (list == NULL)
1254 return NULL;
1255 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001256 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001257 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001258 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 return NULL;
1260 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001262 }
1263 return list;
1264}
1265
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001266PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001267"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001268\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001269Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001270
1271
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001272static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001273array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001274{
1275 char *str;
1276 int n;
1277 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001278 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001279 return NULL;
1280 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001281 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001282 "string length not a multiple of item size");
1283 return NULL;
1284 }
1285 n = n / itemsize;
1286 if (n > 0) {
1287 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001288 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001289 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001290 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 return NULL;
1292 }
1293 self->ob_item = item;
1294 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001295 memcpy(item + (self->ob_size - n) * itemsize,
1296 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001298 Py_INCREF(Py_None);
1299 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001300}
1301
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001302PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001303"fromstring(string)\n\
1304\n\
1305Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001306values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001307
1308
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001309static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001310array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001311{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001313 self->ob_size * self->ob_descr->itemsize);
1314}
1315
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001316PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001317"tostring() -> string\n\
1318\n\
1319Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001320representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001321
Martin v. Löwis99866332002-03-01 10:27:01 +00001322
1323
1324#ifdef Py_USING_UNICODE
1325static PyObject *
1326array_fromunicode(arrayobject *self, PyObject *args)
1327{
1328 Py_UNICODE *ustr;
1329 int n;
1330
1331 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1332 return NULL;
1333 if (self->ob_descr->typecode != 'u') {
1334 PyErr_SetString(PyExc_ValueError,
1335 "fromunicode() may only be called on "
1336 "type 'u' arrays");
1337 return NULL;
1338 }
1339 if (n > 0) {
1340 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1341 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1342 if (item == NULL) {
1343 PyErr_NoMemory();
1344 return NULL;
1345 }
1346 self->ob_item = (char *) item;
1347 self->ob_size += n;
1348 memcpy(item + self->ob_size - n,
1349 ustr, n * sizeof(Py_UNICODE));
1350 }
1351
1352 Py_INCREF(Py_None);
1353 return Py_None;
1354}
1355
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001357"fromunicode(ustr)\n\
1358\n\
1359Extends this array with data from the unicode string ustr.\n\
1360The array must be a type 'u' array; otherwise a ValueError\n\
1361is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001362append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001363
1364
1365static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001366array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001367{
Martin v. Löwis99866332002-03-01 10:27:01 +00001368 if (self->ob_descr->typecode != 'u') {
1369 PyErr_SetString(PyExc_ValueError,
1370 "tounicode() may only be called on type 'u' arrays");
1371 return NULL;
1372 }
1373 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1374}
1375
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001376PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001377"tounicode() -> unicode\n\
1378\n\
1379Convert the array to a unicode string. The array must be\n\
1380a type 'u' array; otherwise a ValueError is raised. Use\n\
1381array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001382an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001383
1384#endif /* Py_USING_UNICODE */
1385
1386
1387static PyObject *
1388array_get_typecode(arrayobject *a, void *closure)
1389{
1390 char tc = a->ob_descr->typecode;
1391 return PyString_FromStringAndSize(&tc, 1);
1392}
1393
1394static PyObject *
1395array_get_itemsize(arrayobject *a, void *closure)
1396{
1397 return PyInt_FromLong((long)a->ob_descr->itemsize);
1398}
1399
1400static PyGetSetDef array_getsets [] = {
1401 {"typecode", (getter) array_get_typecode, NULL,
1402 "the typecode character used to create the array"},
1403 {"itemsize", (getter) array_get_itemsize, NULL,
1404 "the size, in bytes, of one array item"},
1405 {NULL}
1406};
1407
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001408PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001409 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001410 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001411 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001412 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001413 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001414 byteswap_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001415 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001416 count_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001417 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001418 extend_doc},
1419 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1420 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001421 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001422 fromlist_doc},
1423 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1424 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001425#ifdef Py_USING_UNICODE
1426 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1427 fromunicode_doc},
1428#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001429 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001430 index_doc},
1431 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1432 insert_doc},
1433 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1434 pop_doc},
1435 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1436 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001437 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001438 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001439 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001440 reverse_doc},
1441/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1442 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001443 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001444 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001445 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001446 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001447 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001448 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001449#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001450 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001451 tounicode_doc},
1452#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001453 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001454 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001455 {NULL, NULL} /* sentinel */
1456};
1457
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001458static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001459array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001460{
Martin v. Löwis99866332002-03-01 10:27:01 +00001461 char buf[256], typecode;
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001462 PyObject *s, *t, *v = NULL;
1463 int len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001464
Guido van Rossum778983b1993-02-19 15:55:02 +00001465 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001466 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001467 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001468 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001469 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001470 }
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001471
1472 if (typecode == 'c')
1473 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001474#ifdef Py_USING_UNICODE
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001475 else if (typecode == 'u')
1476 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001477#endif
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001478 else
1479 v = array_tolist(a, NULL);
1480 t = PyObject_Repr(v);
1481 Py_XDECREF(v);
1482
1483 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001484 s = PyString_FromString(buf);
Raymond Hettinger88ba1e32003-04-23 17:27:00 +00001485 PyString_ConcatAndDel(&s, t);
1486 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001487 return s;
1488}
1489
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001490static PyObject*
1491array_subscr(arrayobject* self, PyObject* item)
1492{
1493 if (PyInt_Check(item)) {
1494 long i = PyInt_AS_LONG(item);
1495 if (i < 0)
1496 i += self->ob_size;
1497 return array_item(self, i);
1498 }
1499 else if (PyLong_Check(item)) {
1500 long i = PyLong_AsLong(item);
1501 if (i == -1 && PyErr_Occurred())
1502 return NULL;
1503 if (i < 0)
1504 i += self->ob_size;
1505 return array_item(self, i);
1506 }
1507 else if (PySlice_Check(item)) {
1508 int start, stop, step, slicelength, cur, i;
1509 PyObject* result;
1510 arrayobject* ar;
1511 int itemsize = self->ob_descr->itemsize;
1512
1513 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1514 &start, &stop, &step, &slicelength) < 0) {
1515 return NULL;
1516 }
1517
1518 if (slicelength <= 0) {
1519 return newarrayobject(&Arraytype, 0, self->ob_descr);
1520 }
1521 else {
1522 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1523 if (!result) return NULL;
1524
1525 ar = (arrayobject*)result;
1526
1527 for (cur = start, i = 0; i < slicelength;
1528 cur += step, i++) {
1529 memcpy(ar->ob_item + i*itemsize,
1530 self->ob_item + cur*itemsize,
1531 itemsize);
1532 }
1533
1534 return result;
1535 }
1536 }
1537 else {
1538 PyErr_SetString(PyExc_TypeError,
1539 "list indices must be integers");
1540 return NULL;
1541 }
1542}
1543
1544static int
1545array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1546{
1547 if (PyInt_Check(item)) {
1548 long i = PyInt_AS_LONG(item);
1549 if (i < 0)
1550 i += self->ob_size;
1551 return array_ass_item(self, i, value);
1552 }
1553 else if (PyLong_Check(item)) {
1554 long i = PyLong_AsLong(item);
1555 if (i == -1 && PyErr_Occurred())
1556 return -1;
1557 if (i < 0)
1558 i += self->ob_size;
1559 return array_ass_item(self, i, value);
1560 }
1561 else if (PySlice_Check(item)) {
1562 int start, stop, step, slicelength;
1563 int itemsize = self->ob_descr->itemsize;
1564
1565 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1566 &start, &stop, &step, &slicelength) < 0) {
1567 return -1;
1568 }
1569
1570 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1571 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1572 return array_ass_slice(self, start, stop, value);
1573
1574 if (value == NULL) {
1575 /* delete slice */
Michael W. Hudson56796f62002-07-29 14:35:04 +00001576 int cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001577
1578 if (slicelength <= 0)
1579 return 0;
1580
1581 if (step < 0) {
1582 stop = start + 1;
1583 start = stop + step*(slicelength - 1) - 1;
1584 step = -step;
1585 }
1586
Michael W. Hudson56796f62002-07-29 14:35:04 +00001587 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001588 cur += step, i++) {
1589 memmove(self->ob_item + (cur - i)*itemsize,
1590 self->ob_item + (cur + 1)*itemsize,
1591 (step - 1) * itemsize);
1592 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001593 extra = self->ob_size - (cur + 1);
1594 if (extra > 0) {
1595 memmove(self->ob_item + (cur - i)*itemsize,
1596 self->ob_item + (cur + 1)*itemsize,
1597 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001598 }
1599
1600 self->ob_size -= slicelength;
1601 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
1602
1603
1604 return 0;
1605 }
1606 else {
1607 /* assign slice */
1608 int cur, i;
1609 arrayobject* av;
1610
1611 if (!array_Check(value)) {
1612 PyErr_Format(PyExc_TypeError,
1613 "must assign array (not \"%.200s\") to slice",
1614 value->ob_type->tp_name);
1615 return -1;
1616 }
1617
1618 av = (arrayobject*)value;
1619
1620 if (av->ob_size != slicelength) {
1621 PyErr_Format(PyExc_ValueError,
1622 "attempt to assign array of size %d to extended slice of size %d",
1623 av->ob_size, slicelength);
1624 return -1;
1625 }
1626
1627 if (!slicelength)
1628 return 0;
1629
1630 /* protect against a[::-1] = a */
1631 if (self == av) {
1632 value = array_slice(av, 0, av->ob_size);
1633 av = (arrayobject*)value;
1634 }
1635 else {
1636 Py_INCREF(value);
1637 }
1638
1639 for (cur = start, i = 0; i < slicelength;
1640 cur += step, i++) {
1641 memcpy(self->ob_item + cur*itemsize,
1642 av->ob_item + i*itemsize,
1643 itemsize);
1644 }
1645
1646 Py_DECREF(value);
1647
1648 return 0;
1649 }
1650 }
1651 else {
1652 PyErr_SetString(PyExc_TypeError,
1653 "list indices must be integers");
1654 return -1;
1655 }
1656}
1657
1658static PyMappingMethods array_as_mapping = {
1659 (inquiry)array_length,
1660 (binaryfunc)array_subscr,
1661 (objobjargproc)array_ass_subscr
1662};
1663
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001664static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001665array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001666{
1667 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001668 PyErr_SetString(PyExc_SystemError,
1669 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001670 return -1;
1671 }
1672 *ptr = (void *)self->ob_item;
1673 return self->ob_size*self->ob_descr->itemsize;
1674}
1675
1676static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001677array_buffer_getwritebuf(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_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001690{
1691 if ( lenp )
1692 *lenp = self->ob_size*self->ob_descr->itemsize;
1693 return 1;
1694}
1695
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001696static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001697 (inquiry)array_length, /*sq_length*/
1698 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001699 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001700 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001701 (intintargfunc)array_slice, /*sq_slice*/
1702 (intobjargproc)array_ass_item, /*sq_ass_item*/
1703 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Raymond Hettinger625812f2003-01-07 01:58:52 +00001704 (objobjproc)array_contains, /*sq_contains*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001705 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
1706 (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001707};
1708
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001709static PyBufferProcs array_as_buffer = {
1710 (getreadbufferproc)array_buffer_getreadbuf,
1711 (getwritebufferproc)array_buffer_getwritebuf,
1712 (getsegcountproc)array_buffer_getsegcount,
1713};
1714
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001715static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001716array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001717{
1718 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001719 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001720 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00001721
1722 if (kwds != NULL) {
1723 int i = PyObject_Length(kwds);
1724 if (i < 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001725 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001726 else if (i > 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001727 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001728 "array.array constructor takes "
1729 "no keyword arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +00001730 return NULL;
1731 }
1732 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001733
1734 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1735 return NULL;
1736
1737 if (!(initial == NULL || PyList_Check(initial)
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001738 || PyString_Check(initial) || PyTuple_Check(initial)
Martin v. Löwis99866332002-03-01 10:27:01 +00001739 || (c == 'u' && PyUnicode_Check(initial)))) {
1740 PyErr_SetString(PyExc_TypeError,
1741 "array initializer must be list or string");
1742 return NULL;
1743 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001744 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1745 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001746 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001747 int len;
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001748
1749 if (initial == NULL || !(PyList_Check(initial)
1750 || PyTuple_Check(initial)))
Guido van Rossum778983b1993-02-19 15:55:02 +00001751 len = 0;
1752 else
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001753 len = PySequence_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001754
1755 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001756 if (a == NULL)
1757 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001758
Guido van Rossum778983b1993-02-19 15:55:02 +00001759 if (len > 0) {
1760 int i;
1761 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001762 PyObject *v =
Raymond Hettinger84fc9aa2003-04-24 10:41:55 +00001763 PySequence_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001764 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001765 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001766 return NULL;
1767 }
1768 }
1769 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001770 if (initial != NULL && PyString_Check(initial)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001771 PyObject *t_initial = Py_BuildValue("(O)",
1772 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001773 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001774 array_fromstring((arrayobject *)a,
1775 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001776 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001777 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001778 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001779 return NULL;
1780 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001781 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001782#ifdef Py_USING_UNICODE
1783 } else if (initial != NULL && PyUnicode_Check(initial)) {
1784 int n = PyUnicode_GET_DATA_SIZE(initial);
1785 if (n > 0) {
1786 arrayobject *self = (arrayobject *)a;
1787 char *item = self->ob_item;
1788 item = PyMem_Realloc(item, n);
1789 if (item == NULL) {
1790 PyErr_NoMemory();
1791 Py_DECREF(a);
1792 return NULL;
1793 }
1794 self->ob_item = item;
1795 self->ob_size = n / sizeof(Py_UNICODE);
1796 memcpy(item, PyUnicode_AS_DATA(initial), n);
1797 }
1798#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001799 }
1800 return a;
1801 }
1802 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001803 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001804 "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 +00001805 return NULL;
1806}
1807
Guido van Rossum778983b1993-02-19 15:55:02 +00001808
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001809PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001810"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001811an array of basic values: characters, integers, floating point\n\
1812numbers. Arrays are sequence types and behave very much like lists,\n\
1813except that the type of objects stored in them is constrained. The\n\
1814type is specified at object creation time by using a type code, which\n\
1815is a single character. The following type codes are defined:\n\
1816\n\
1817 Type code C Type Minimum size in bytes \n\
1818 'c' character 1 \n\
1819 'b' signed integer 1 \n\
1820 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001821 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001822 'h' signed integer 2 \n\
1823 'H' unsigned integer 2 \n\
1824 'i' signed integer 2 \n\
1825 'I' unsigned integer 2 \n\
1826 'l' signed integer 4 \n\
1827 'L' unsigned integer 4 \n\
1828 'f' floating point 4 \n\
1829 'd' floating point 8 \n\
1830\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001831The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001832\n\
1833array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001834");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001835
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001836PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001837"array(typecode [, initializer]) -> array\n\
1838\n\
1839Return a new array whose items are restricted by typecode, and\n\
1840initialized from the optional initializer value, which must be a list\n\
1841or a string.\n\
1842\n\
1843Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001844the type of objects stored in them is constrained.\n\
1845\n\
1846Methods:\n\
1847\n\
1848append() -- append a new item to the end of the array\n\
1849buffer_info() -- return information giving the current memory info\n\
1850byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001851count() -- return number of occurences of an object\n\
1852extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001853fromfile() -- read items from a file object\n\
1854fromlist() -- append items from the list\n\
1855fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001856index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001857insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001858pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001859read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001860remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001861reverse() -- reverse the order of the items in the array\n\
1862tofile() -- write all items to a file object\n\
1863tolist() -- return the array converted to an ordinary list\n\
1864tostring() -- return the array converted to a string\n\
1865write() -- DEPRECATED, use tofile()\n\
1866\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001867Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001868\n\
1869typecode -- the typecode character used to create the array\n\
1870itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001871");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001872
Raymond Hettinger625812f2003-01-07 01:58:52 +00001873static PyObject *array_iter(arrayobject *ao);
1874
Tim Peters0c322792002-07-17 16:49:03 +00001875static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001876 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001877 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001878 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001879 sizeof(arrayobject),
1880 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001881 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001882 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001883 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001884 0, /* tp_setattr */
1885 0, /* tp_compare */
1886 (reprfunc)array_repr, /* tp_repr */
1887 0, /* tp_as _number*/
1888 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001889 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001890 0, /* tp_hash */
1891 0, /* tp_call */
1892 0, /* tp_str */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001893 PyObject_GenericGetAttr, /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001894 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001895 &array_as_buffer, /* tp_as_buffer*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001896 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001897 arraytype_doc, /* tp_doc */
1898 0, /* tp_traverse */
1899 0, /* tp_clear */
1900 array_richcompare, /* tp_richcompare */
Martin v. Löwis99866332002-03-01 10:27:01 +00001901 0, /* tp_weaklistoffset */
Raymond Hettinger625812f2003-01-07 01:58:52 +00001902 (getiterfunc)array_iter, /* tp_iter */
Martin v. Löwis99866332002-03-01 10:27:01 +00001903 0, /* tp_iternext */
1904 array_methods, /* tp_methods */
1905 0, /* tp_members */
1906 array_getsets, /* tp_getset */
1907 0, /* tp_base */
1908 0, /* tp_dict */
1909 0, /* tp_descr_get */
1910 0, /* tp_descr_set */
1911 0, /* tp_dictoffset */
1912 0, /* tp_init */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001913 PyType_GenericAlloc, /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00001914 array_new, /* tp_new */
Jason Tishlerfb8595d2003-01-06 12:41:26 +00001915 PyObject_Del, /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001916};
1917
Raymond Hettinger625812f2003-01-07 01:58:52 +00001918
1919/*********************** Array Iterator **************************/
1920
1921typedef struct {
1922 PyObject_HEAD
1923 long index;
1924 arrayobject *ao;
1925 PyObject * (*getitem)(struct arrayobject *, int);
1926} arrayiterobject;
1927
1928static PyTypeObject PyArrayIter_Type;
1929
1930#define PyArrayIter_Check(op) PyObject_TypeCheck(op, &PyArrayIter_Type)
1931
1932static PyObject *
1933array_iter(arrayobject *ao)
1934{
1935 arrayiterobject *it;
1936
1937 if (!array_Check(ao)) {
1938 PyErr_BadInternalCall();
1939 return NULL;
1940 }
1941
1942 it = PyObject_GC_New(arrayiterobject, &PyArrayIter_Type);
1943 if (it == NULL)
1944 return NULL;
1945
1946 Py_INCREF(ao);
1947 it->ao = ao;
1948 it->index = 0;
1949 it->getitem = ao->ob_descr->getitem;
1950 PyObject_GC_Track(it);
1951 return (PyObject *)it;
1952}
1953
1954static PyObject *
Raymond Hettinger625812f2003-01-07 01:58:52 +00001955arrayiter_next(arrayiterobject *it)
1956{
1957 assert(PyArrayIter_Check(it));
1958 if (it->index < it->ao->ob_size)
1959 return (*it->getitem)(it->ao, it->index++);
1960 return NULL;
1961}
1962
1963static void
1964arrayiter_dealloc(arrayiterobject *it)
1965{
1966 PyObject_GC_UnTrack(it);
1967 Py_XDECREF(it->ao);
1968 PyObject_GC_Del(it);
1969}
1970
1971static int
1972arrayiter_traverse(arrayiterobject *it, visitproc visit, void *arg)
1973{
1974 if (it->ao != NULL)
1975 return visit((PyObject *)(it->ao), arg);
1976 return 0;
1977}
1978
1979static PyTypeObject PyArrayIter_Type = {
Jason Tishler84375702003-02-10 20:45:47 +00001980 PyObject_HEAD_INIT(NULL)
Raymond Hettinger625812f2003-01-07 01:58:52 +00001981 0, /* ob_size */
1982 "arrayiterator", /* tp_name */
1983 sizeof(arrayiterobject), /* tp_basicsize */
1984 0, /* tp_itemsize */
1985 /* methods */
1986 (destructor)arrayiter_dealloc, /* tp_dealloc */
1987 0, /* tp_print */
1988 0, /* tp_getattr */
1989 0, /* tp_setattr */
1990 0, /* tp_compare */
1991 0, /* tp_repr */
1992 0, /* tp_as_number */
1993 0, /* tp_as_sequence */
1994 0, /* tp_as_mapping */
1995 0, /* tp_hash */
1996 0, /* tp_call */
1997 0, /* tp_str */
1998 PyObject_GenericGetAttr, /* tp_getattro */
1999 0, /* tp_setattro */
2000 0, /* tp_as_buffer */
2001 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_GC,/* tp_flags */
2002 0, /* tp_doc */
2003 (traverseproc)arrayiter_traverse, /* tp_traverse */
2004 0, /* tp_clear */
2005 0, /* tp_richcompare */
2006 0, /* tp_weaklistoffset */
Raymond Hettinger1da1dbf2003-03-17 19:46:11 +00002007 PyObject_SelfIter, /* tp_iter */
Raymond Hettinger625812f2003-01-07 01:58:52 +00002008 (iternextfunc)arrayiter_next, /* tp_iternext */
2009 0, /* tp_methods */
2010};
2011
2012
2013/*********************** Install Module **************************/
2014
Martin v. Löwis99866332002-03-01 10:27:01 +00002015/* No functions in array module. */
2016static PyMethodDef a_methods[] = {
2017 {NULL, NULL, 0, NULL} /* Sentinel */
2018};
2019
2020
Mark Hammondfe51c6d2002-08-02 02:27:13 +00002021PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00002022initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00002023{
Fred Drakef4e34842002-04-01 03:45:06 +00002024 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00002025
Martin v. Löwis99866332002-03-01 10:27:01 +00002026 Arraytype.ob_type = &PyType_Type;
Jason Tishler84375702003-02-10 20:45:47 +00002027 PyArrayIter_Type.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00002028 m = Py_InitModule3("array", a_methods, module_doc);
Fred Drakef4e34842002-04-01 03:45:06 +00002029
2030 Py_INCREF((PyObject *)&Arraytype);
2031 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
2032 Py_INCREF((PyObject *)&Arraytype);
2033 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00002034 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00002035}