blob: 933eae01bd0568d606682d4a68b851f7f412e835 [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
Martin v. Löwisb9132a22002-05-02 20:34:12 +000016#define DELAYED(X) 0
17
Guido van Rossum778983b1993-02-19 15:55:02 +000018struct arrayobject; /* Forward */
19
Tim Petersbb307342000-09-10 05:22:54 +000020/* All possible arraydescr values are defined in the vector "descriptors"
21 * below. That's defined later because the appropriate get and set
22 * functions aren't visible yet.
23 */
Guido van Rossum778983b1993-02-19 15:55:02 +000024struct arraydescr {
25 int typecode;
26 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000027 PyObject * (*getitem)(struct arrayobject *, int);
28 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000029};
30
31typedef struct arrayobject {
Martin v. Löwis99866332002-03-01 10:27:01 +000032 PyObject_HEAD
33 int ob_size;
Guido van Rossum778983b1993-02-19 15:55:02 +000034 char *ob_item;
35 struct arraydescr *ob_descr;
36} arrayobject;
37
Jeremy Hylton938ace62002-07-17 16:30:39 +000038static PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000039
Martin v. Löwis99866332002-03-01 10:27:01 +000040#define array_Check(op) PyObject_TypeCheck(op, &Arraytype)
41#define array_CheckExact(op) ((op)->ob_type == &Arraytype)
Guido van Rossum778983b1993-02-19 15:55:02 +000042
Tim Petersbb307342000-09-10 05:22:54 +000043/****************************************************************************
44Get and Set functions for each type.
45A Get function takes an arrayobject* and an integer index, returning the
46array value at that index wrapped in an appropriate PyObject*.
47A Set function takes an arrayobject, integer index, and PyObject*; sets
48the array value at that index to the raw C data extracted from the PyObject*,
49and returns 0 if successful, else nonzero on failure (PyObject* not of an
50appropriate type or value).
51Note that the basic Get and Set functions do NOT check that the index is
52in bounds; that's the responsibility of the caller.
53****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +000054
Roger E. Masse2919eaa1996-12-09 20:10:36 +000055static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000056c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000057{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000058 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000059}
60
61static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000062c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000063{
64 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000065 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000066 return -1;
67 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +000068 ((char *)ap->ob_item)[i] = x;
Guido van Rossum778983b1993-02-19 15:55:02 +000069 return 0;
70}
71
Roger E. Masse2919eaa1996-12-09 20:10:36 +000072static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000073b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000074{
75 long x = ((char *)ap->ob_item)[i];
76 if (x >= 128)
77 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000078 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000079}
80
81static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000082b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000083{
Fred Drake541dc3b2000-06-28 17:49:30 +000084 short x;
85 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
86 must use the next size up that is signed ('h') and manually do
87 the overflow checking */
88 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000089 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +000090 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +000091 PyErr_SetString(PyExc_OverflowError,
92 "signed char is less than minimum");
93 return -1;
94 }
Guido van Rossum9f754e02000-07-01 00:38:19 +000095 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +000096 PyErr_SetString(PyExc_OverflowError,
97 "signed char is greater than maximum");
98 return -1;
99 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000100 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000101 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000102 return 0;
103}
104
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000105static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000106BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000107{
108 long x = ((unsigned char *)ap->ob_item)[i];
109 return PyInt_FromLong(x);
110}
111
Fred Drake541dc3b2000-06-28 17:49:30 +0000112static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000113BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000114{
115 unsigned char x;
116 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
117 if (!PyArg_Parse(v, "b;array item must be integer", &x))
118 return -1;
119 if (i >= 0)
Martin v. Löwis99866332002-03-01 10:27:01 +0000120 ((char *)ap->ob_item)[i] = x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000121 return 0;
122}
Guido van Rossum549ab711997-01-03 19:09:47 +0000123
Martin v. Löwis99866332002-03-01 10:27:01 +0000124#ifdef Py_USING_UNICODE
125static PyObject *
126u_getitem(arrayobject *ap, int i)
127{
128 return PyUnicode_FromUnicode(&((Py_UNICODE *) ap->ob_item)[i], 1);
129}
130
131static int
132u_setitem(arrayobject *ap, int i, PyObject *v)
133{
134 Py_UNICODE *p;
135 int len;
136
137 if (!PyArg_Parse(v, "u#;array item must be unicode character", &p, &len))
138 return -1;
139 if (len != 1) {
140 PyErr_SetString(PyExc_TypeError, "array item must be unicode character");
141 return -1;
142 }
143 if (i >= 0)
144 ((Py_UNICODE *)ap->ob_item)[i] = p[0];
145 return 0;
146}
147#endif
148
Guido van Rossum549ab711997-01-03 19:09:47 +0000149static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000150h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000151{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000152 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000153}
154
155static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000156h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000157{
158 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000159 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000160 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000161 return -1;
162 if (i >= 0)
163 ((short *)ap->ob_item)[i] = x;
164 return 0;
165}
166
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000167static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000168HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000169{
170 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
171}
172
Fred Drake541dc3b2000-06-28 17:49:30 +0000173static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000174HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000175{
176 int x;
177 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
178 must use the next size up and manually do the overflow checking */
179 if (!PyArg_Parse(v, "i;array item must be integer", &x))
180 return -1;
181 else if (x < 0) {
182 PyErr_SetString(PyExc_OverflowError,
183 "unsigned short is less than minimum");
184 return -1;
185 }
186 else if (x > USHRT_MAX) {
187 PyErr_SetString(PyExc_OverflowError,
188 "unsigned short is greater than maximum");
189 return -1;
190 }
191 if (i >= 0)
192 ((short *)ap->ob_item)[i] = (short)x;
193 return 0;
194}
Guido van Rossum549ab711997-01-03 19:09:47 +0000195
196static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000197i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000198{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000199 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000200}
201
202static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000203i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000204{
205 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000206 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000207 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000208 return -1;
209 if (i >= 0)
210 ((int *)ap->ob_item)[i] = x;
211 return 0;
212}
213
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000214static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000215II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000216{
217 return PyLong_FromUnsignedLong(
218 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
219}
220
221static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000222II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000223{
224 unsigned long x;
225 if (PyLong_Check(v)) {
226 x = PyLong_AsUnsignedLong(v);
227 if (x == (unsigned long) -1 && PyErr_Occurred())
228 return -1;
229 }
230 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000231 long y;
232 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000233 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000234 if (y < 0) {
235 PyErr_SetString(PyExc_OverflowError,
236 "unsigned int is less than minimum");
237 return -1;
238 }
239 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000240
Guido van Rossum549ab711997-01-03 19:09:47 +0000241 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000242 if (x > UINT_MAX) {
243 PyErr_SetString(PyExc_OverflowError,
244 "unsigned int is greater than maximum");
245 return -1;
246 }
247
Guido van Rossum549ab711997-01-03 19:09:47 +0000248 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000249 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000250 return 0;
251}
252
253static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000254l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000255{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000256 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000257}
258
259static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000260l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000261{
262 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000263 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000264 return -1;
265 if (i >= 0)
266 ((long *)ap->ob_item)[i] = x;
267 return 0;
268}
269
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000270static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000271LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000272{
273 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
274}
275
276static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000277LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000278{
279 unsigned long x;
280 if (PyLong_Check(v)) {
281 x = PyLong_AsUnsignedLong(v);
282 if (x == (unsigned long) -1 && PyErr_Occurred())
283 return -1;
284 }
285 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000286 long y;
287 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000288 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000289 if (y < 0) {
290 PyErr_SetString(PyExc_OverflowError,
291 "unsigned long is less than minimum");
292 return -1;
293 }
294 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000295
Guido van Rossum549ab711997-01-03 19:09:47 +0000296 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000297 if (x > ULONG_MAX) {
298 PyErr_SetString(PyExc_OverflowError,
299 "unsigned long is greater than maximum");
300 return -1;
301 }
Tim Petersbb307342000-09-10 05:22:54 +0000302
Guido van Rossum549ab711997-01-03 19:09:47 +0000303 if (i >= 0)
304 ((unsigned long *)ap->ob_item)[i] = x;
305 return 0;
306}
307
308static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000309f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000310{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000311 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000312}
313
314static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000315f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000316{
317 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000318 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000319 return -1;
320 if (i >= 0)
321 ((float *)ap->ob_item)[i] = x;
322 return 0;
323}
324
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000325static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000326d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000327{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000328 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000329}
330
331static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000332d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000333{
334 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000335 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000336 return -1;
337 if (i >= 0)
338 ((double *)ap->ob_item)[i] = x;
339 return 0;
340}
341
342/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000343static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000344 {'c', sizeof(char), c_getitem, c_setitem},
345 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000346 {'B', sizeof(char), BB_getitem, BB_setitem},
Martin v. Löwis99866332002-03-01 10:27:01 +0000347#ifdef Py_USING_UNICODE
348 {'u', sizeof(Py_UNICODE), u_getitem, u_setitem},
349#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000350 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000351 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000352 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000353 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000354 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000355 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000356 {'f', sizeof(float), f_getitem, f_setitem},
357 {'d', sizeof(double), d_getitem, d_setitem},
358 {'\0', 0, 0, 0} /* Sentinel */
359};
Tim Petersbb307342000-09-10 05:22:54 +0000360
361/****************************************************************************
362Implementations of array object methods.
363****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000364
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000365static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +0000366newarrayobject(PyTypeObject *type, int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000367{
Guido van Rossum778983b1993-02-19 15:55:02 +0000368 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000369 size_t nbytes;
Martin v. Löwis99866332002-03-01 10:27:01 +0000370
Guido van Rossum778983b1993-02-19 15:55:02 +0000371 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000372 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000373 return NULL;
374 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000375
Guido van Rossum778983b1993-02-19 15:55:02 +0000376 nbytes = size * descr->itemsize;
377 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000378 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000379 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000380 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000381 op = (arrayobject *) type->tp_alloc(type, 0);
Guido van Rossum778983b1993-02-19 15:55:02 +0000382 if (op == NULL) {
Martin v. Löwis99866332002-03-01 10:27:01 +0000383 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000384 }
Martin v. Löwis99866332002-03-01 10:27:01 +0000385 op->ob_size = size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 if (size <= 0) {
387 op->ob_item = NULL;
388 }
389 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000390 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000391 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000392 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000393 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 }
395 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000396 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000397 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000398}
399
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000400static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000401getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000402{
403 register arrayobject *ap;
Martin v. Löwis99866332002-03-01 10:27:01 +0000404 assert(array_Check(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000405 ap = (arrayobject *)op;
406 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000407 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000408 return NULL;
409 }
410 return (*ap->ob_descr->getitem)(ap, i);
411}
412
413static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000414ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000415{
Guido van Rossum778983b1993-02-19 15:55:02 +0000416 char *items;
417 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000418 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000419 return -1;
420 }
421 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
422 return -1;
423 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000424 PyMem_RESIZE(items, char,
425 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000427 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 return -1;
429 }
430 if (where < 0)
431 where = 0;
432 if (where > self->ob_size)
433 where = self->ob_size;
434 memmove(items + (where+1)*self->ob_descr->itemsize,
435 items + where*self->ob_descr->itemsize,
436 (self->ob_size-where)*self->ob_descr->itemsize);
437 self->ob_item = items;
438 self->ob_size++;
439 return (*self->ob_descr->setitem)(self, where, v);
440}
441
Guido van Rossum778983b1993-02-19 15:55:02 +0000442/* Methods */
443
444static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000445array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000446{
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000448 PyMem_DEL(op->ob_item);
Martin v. Löwis99866332002-03-01 10:27:01 +0000449 op->ob_type->tp_free((PyObject *)op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000450}
451
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000452static PyObject *
453array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000454{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000455 arrayobject *va, *wa;
456 PyObject *vi = NULL;
457 PyObject *wi = NULL;
458 int i, k;
459 PyObject *res;
460
Martin v. Löwis99866332002-03-01 10:27:01 +0000461 if (!array_Check(v) || !array_Check(w)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000462 Py_INCREF(Py_NotImplemented);
463 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000464 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000465
466 va = (arrayobject *)v;
467 wa = (arrayobject *)w;
468
469 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
470 /* Shortcut: if the lengths differ, the arrays differ */
471 if (op == Py_EQ)
472 res = Py_False;
473 else
474 res = Py_True;
475 Py_INCREF(res);
476 return res;
477 }
478
479 /* Search for the first index where items are different */
480 k = 1;
481 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
482 vi = getarrayitem(v, i);
483 wi = getarrayitem(w, i);
484 if (vi == NULL || wi == NULL) {
485 Py_XDECREF(vi);
486 Py_XDECREF(wi);
487 return NULL;
488 }
489 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
490 if (k == 0)
491 break; /* Keeping vi and wi alive! */
492 Py_DECREF(vi);
493 Py_DECREF(wi);
494 if (k < 0)
495 return NULL;
496 }
497
498 if (k) {
499 /* No more items to compare -- compare sizes */
500 int vs = va->ob_size;
501 int ws = wa->ob_size;
502 int cmp;
503 switch (op) {
504 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000505 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000506 case Py_EQ: cmp = vs == ws; break;
507 case Py_NE: cmp = vs != ws; break;
508 case Py_GT: cmp = vs > ws; break;
509 case Py_GE: cmp = vs >= ws; break;
510 default: return NULL; /* cannot happen */
511 }
512 if (cmp)
513 res = Py_True;
514 else
515 res = Py_False;
516 Py_INCREF(res);
517 return res;
518 }
519
520 /* We have an item that differs. First, shortcuts for EQ/NE */
521 if (op == Py_EQ) {
522 Py_INCREF(Py_False);
523 res = Py_False;
524 }
525 else if (op == Py_NE) {
526 Py_INCREF(Py_True);
527 res = Py_True;
528 }
529 else {
530 /* Compare the final item again using the proper operator */
531 res = PyObject_RichCompare(vi, wi, op);
532 }
533 Py_DECREF(vi);
534 Py_DECREF(wi);
535 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000536}
537
538static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000539array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000540{
541 return a->ob_size;
542}
543
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000544static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000545array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000546{
547 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000548 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000549 return NULL;
550 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000551 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000552}
553
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000554static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000555array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000556{
557 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000558 if (ilow < 0)
559 ilow = 0;
560 else if (ilow > a->ob_size)
561 ilow = a->ob_size;
562 if (ihigh < 0)
563 ihigh = 0;
564 if (ihigh < ilow)
565 ihigh = ilow;
566 else if (ihigh > a->ob_size)
567 ihigh = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000568 np = (arrayobject *) newarrayobject(&Arraytype, ihigh - ilow, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000569 if (np == NULL)
570 return NULL;
571 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
572 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000573 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000574}
575
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000576static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000577array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000578{
579 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000580 arrayobject *np;
Martin v. Löwis99866332002-03-01 10:27:01 +0000581 if (!array_Check(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000582 PyErr_Format(PyExc_TypeError,
583 "can only append array (not \"%.200s\") to array",
584 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000585 return NULL;
586 }
587#define b ((arrayobject *)bb)
588 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000589 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000590 return NULL;
591 }
592 size = a->ob_size + b->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +0000593 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000594 if (np == NULL) {
595 return NULL;
596 }
597 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
598 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000599 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000601#undef b
602}
603
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000604static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000605array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000606{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000607 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000608 int size;
609 arrayobject *np;
610 char *p;
611 int nbytes;
612 if (n < 0)
613 n = 0;
614 size = a->ob_size * n;
Martin v. Löwis99866332002-03-01 10:27:01 +0000615 np = (arrayobject *) newarrayobject(&Arraytype, size, a->ob_descr);
Guido van Rossum778983b1993-02-19 15:55:02 +0000616 if (np == NULL)
617 return NULL;
618 p = np->ob_item;
619 nbytes = a->ob_size * a->ob_descr->itemsize;
620 for (i = 0; i < n; i++) {
621 memcpy(p, a->ob_item, nbytes);
622 p += nbytes;
623 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000624 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000625}
626
627static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000628array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000629{
630 char *item;
631 int n; /* Size of replacement array */
632 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000633#define b ((arrayobject *)v)
634 if (v == NULL)
635 n = 0;
Martin v. Löwis99866332002-03-01 10:27:01 +0000636 else if (array_Check(v)) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000637 n = b->ob_size;
638 if (a == b) {
639 /* Special case "a[i:j] = a" -- copy b first */
640 int ret;
641 v = array_slice(b, 0, n);
642 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000643 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000644 return ret;
645 }
646 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000647 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return -1;
649 }
650 }
651 else {
Fred Drake137507e2000-06-01 02:02:46 +0000652 PyErr_Format(PyExc_TypeError,
653 "can only assign array (not \"%.200s\") to array slice",
654 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000655 return -1;
656 }
657 if (ilow < 0)
658 ilow = 0;
659 else if (ilow > a->ob_size)
660 ilow = a->ob_size;
661 if (ihigh < 0)
662 ihigh = 0;
663 if (ihigh < ilow)
664 ihigh = ilow;
665 else if (ihigh > a->ob_size)
666 ihigh = a->ob_size;
667 item = a->ob_item;
668 d = n - (ihigh-ilow);
669 if (d < 0) { /* Delete -d items */
670 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
671 item + ihigh*a->ob_descr->itemsize,
672 (a->ob_size-ihigh)*a->ob_descr->itemsize);
673 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000674 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000675 /* Can't fail */
676 a->ob_item = item;
677 }
678 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000679 PyMem_RESIZE(item, char,
680 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000681 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000682 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 return -1;
684 }
685 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
686 item + ihigh*a->ob_descr->itemsize,
687 (a->ob_size-ihigh)*a->ob_descr->itemsize);
688 a->ob_item = item;
689 a->ob_size += d;
690 }
691 if (n > 0)
692 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
693 n*b->ob_descr->itemsize);
694 return 0;
695#undef b
696}
697
698static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000699array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000700{
701 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000702 PyErr_SetString(PyExc_IndexError,
703 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000704 return -1;
705 }
706 if (v == NULL)
707 return array_ass_slice(a, i, i+1, v);
708 return (*a->ob_descr->setitem)(a, i, v);
709}
710
711static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000712setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000713{
Martin v. Löwis99866332002-03-01 10:27:01 +0000714 assert(array_Check(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000715 return array_ass_item((arrayobject *)a, i, v);
716}
717
Martin v. Löwis99866332002-03-01 10:27:01 +0000718static int
719array_do_extend(arrayobject *self, PyObject *bb)
720{
721 int size;
722
723 if (!array_Check(bb)) {
724 PyErr_Format(PyExc_TypeError,
725 "can only extend array with array (not \"%.200s\")",
726 bb->ob_type->tp_name);
727 return -1;
728 }
729#define b ((arrayobject *)bb)
730 if (self->ob_descr != b->ob_descr) {
731 PyErr_SetString(PyExc_TypeError,
732 "can only extend with array of same kind");
733 return -1;
734 }
735 size = self->ob_size + b->ob_size;
736 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
737 if (self->ob_item == NULL) {
738 PyObject_Del(self);
739 PyErr_NoMemory();
740 return -1;
741 }
742 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
743 b->ob_item, b->ob_size*b->ob_descr->itemsize);
744 self->ob_size = size;
745
746 return 0;
747#undef b
748}
749
750static PyObject *
751array_inplace_concat(arrayobject *self, PyObject *bb)
752{
753 if (array_do_extend(self, bb) == -1)
754 return NULL;
755 Py_INCREF(self);
756 return (PyObject *)self;
757}
758
759static PyObject *
760array_inplace_repeat(arrayobject *self, int n)
761{
762 char *items, *p;
763 int size, i;
764
765 if (self->ob_size > 0) {
766 if (n < 0)
767 n = 0;
768 items = self->ob_item;
769 size = self->ob_size * self->ob_descr->itemsize;
770 if (n == 0) {
771 PyMem_FREE(items);
772 self->ob_item = NULL;
773 self->ob_size = 0;
774 }
775 else {
776 PyMem_Resize(items, char, n * size);
777 if (items == NULL)
778 return PyErr_NoMemory();
779 p = items;
780 for (i = 1; i < n; i++) {
781 p += size;
782 memcpy(p, items, size);
783 }
784 self->ob_item = items;
785 self->ob_size *= n;
786 }
787 }
788 Py_INCREF(self);
789 return (PyObject *)self;
790}
791
792
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000793static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000794ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000795{
796 if (ins1(self, where, v) != 0)
797 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000798 Py_INCREF(Py_None);
799 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000800}
801
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000802static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000803array_count(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000804{
805 int count = 0;
806 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000807
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000808 for (i = 0; i < self->ob_size; i++) {
809 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000810 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000811 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000812 if (cmp > 0)
813 count++;
814 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000815 return NULL;
816 }
817 return PyInt_FromLong((long)count);
818}
819
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000820PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000821"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000822\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000823Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000824
825static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000826array_index(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000827{
828 int i;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000829
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000830 for (i = 0; i < self->ob_size; i++) {
831 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000832 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
833 Py_DECREF(selfi);
834 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000835 return PyInt_FromLong((long)i);
836 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000837 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000838 return NULL;
839 }
840 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
841 return NULL;
842}
843
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000844PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000845"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000846\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000847Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000848
849static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000850array_remove(arrayobject *self, PyObject *v)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000851{
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);
857 Py_DECREF(selfi);
858 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000859 if (array_ass_slice(self, i, i+1,
860 (PyObject *)NULL) != 0)
861 return NULL;
862 Py_INCREF(Py_None);
863 return Py_None;
864 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000865 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000866 return NULL;
867 }
868 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
869 return NULL;
870}
871
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000872PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000873"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000874\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000875Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000876
877static PyObject *
878array_pop(arrayobject *self, PyObject *args)
879{
880 int i = -1;
881 PyObject *v;
882 if (!PyArg_ParseTuple(args, "|i:pop", &i))
883 return NULL;
884 if (self->ob_size == 0) {
885 /* Special-case most common failure cause */
886 PyErr_SetString(PyExc_IndexError, "pop from empty array");
887 return NULL;
888 }
889 if (i < 0)
890 i += self->ob_size;
891 if (i < 0 || i >= self->ob_size) {
892 PyErr_SetString(PyExc_IndexError, "pop index out of range");
893 return NULL;
894 }
895 v = getarrayitem((PyObject *)self,i);
896 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
897 Py_DECREF(v);
898 return NULL;
899 }
900 return v;
901}
902
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000903PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000904"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000905\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000906Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000907
908static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000909array_extend(arrayobject *self, PyObject *bb)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000910{
Martin v. Löwis99866332002-03-01 10:27:01 +0000911 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000912 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +0000913 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000915}
916
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000917PyDoc_STRVAR(extend_doc,
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000918"extend(array)\n\
919\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000920 Append array items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000921
922static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000923array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000924{
925 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000926 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000927 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000928 return NULL;
929 return ins(self, i, v);
930}
931
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000932PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000933"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000934\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000935Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000936
937
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000938static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000939array_buffer_info(arrayobject *self, PyObject *unused)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000940{
Tim Peters077a11d2000-09-16 22:31:29 +0000941 PyObject* retval = NULL;
Tim Peters077a11d2000-09-16 22:31:29 +0000942 retval = PyTuple_New(2);
943 if (!retval)
944 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +0000945
946 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
947 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
948
949 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000950}
951
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000952PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000953"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000954\n\
955Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +0000956the length in items of the buffer used to hold array's contents\n\
957The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000958the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000959
960
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000961static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000962array_append(arrayobject *self, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000963{
Guido van Rossum778983b1993-02-19 15:55:02 +0000964 return ins(self, (int) self->ob_size, v);
965}
966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000967PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000968"append(x)\n\
969\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000970Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000971
972
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000973static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +0000974array_byteswap(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +0000975{
976 char *p;
977 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000978
Guido van Rossum778983b1993-02-19 15:55:02 +0000979 switch (self->ob_descr->itemsize) {
980 case 1:
981 break;
982 case 2:
983 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
984 char p0 = p[0];
985 p[0] = p[1];
986 p[1] = p0;
987 }
988 break;
989 case 4:
990 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
991 char p0 = p[0];
992 char p1 = p[1];
993 p[0] = p[3];
994 p[1] = p[2];
995 p[2] = p1;
996 p[3] = p0;
997 }
998 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000999 case 8:
1000 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1001 char p0 = p[0];
1002 char p1 = p[1];
1003 char p2 = p[2];
1004 char p3 = p[3];
1005 p[0] = p[7];
1006 p[1] = p[6];
1007 p[2] = p[5];
1008 p[3] = p[4];
1009 p[4] = p3;
1010 p[5] = p2;
1011 p[6] = p1;
1012 p[7] = p0;
1013 }
1014 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001015 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001017 "don't know how to byteswap this array type");
1018 return NULL;
1019 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001020 Py_INCREF(Py_None);
1021 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001022}
1023
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001024PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001025"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001026\n\
Fred Drakebf272981999-12-03 17:15:30 +00001027Byteswap 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 +000010284, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001029
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001030static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001031array_reverse(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001032{
Guido van Rossume77a7571993-11-03 15:01:26 +00001033 register int itemsize = self->ob_descr->itemsize;
1034 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001035 /* little buffer to hold items while swapping */
1036 char tmp[256]; /* 8 is probably enough -- but why skimp */
1037 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001038
Guido van Rossum778983b1993-02-19 15:55:02 +00001039 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001040 for (p = self->ob_item,
1041 q = self->ob_item + (self->ob_size - 1)*itemsize;
1042 p < q;
1043 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001044 /* memory areas guaranteed disjoint, so memcpy
1045 * is safe (& memmove may be slower).
1046 */
1047 memcpy(tmp, p, itemsize);
1048 memcpy(p, q, itemsize);
1049 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001050 }
1051 }
Tim Petersbb307342000-09-10 05:22:54 +00001052
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 Py_INCREF(Py_None);
1054 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001055}
Guido van Rossume77a7571993-11-03 15:01:26 +00001056
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001057PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001058"reverse()\n\
1059\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001060Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001061
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001062static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001063array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001064{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001065 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001066 int n;
1067 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001068 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001069 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001070 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001071 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001072 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001073 return NULL;
1074 }
1075 if (n > 0) {
1076 char *item = self->ob_item;
1077 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001078 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001079 int newlength;
1080 size_t newbytes;
1081 /* Be careful here about overflow */
1082 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001083 (newbytes = newlength * itemsize) / itemsize !=
1084 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001085 goto nomem;
1086 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001087 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001088 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001090 return NULL;
1091 }
1092 self->ob_item = item;
1093 self->ob_size += n;
1094 nread = fread(item + (self->ob_size - n) * itemsize,
1095 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001096 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001097 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001098 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001099 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001100 PyErr_SetString(PyExc_EOFError,
1101 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001102 return NULL;
1103 }
1104 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001105 Py_INCREF(Py_None);
1106 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001107}
1108
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001109PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001110"fromfile(f, n)\n\
1111\n\
1112Read 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 +00001113array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001114
1115
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001117array_tofile(arrayobject *self, PyObject *f)
Guido van Rossum778983b1993-02-19 15:55:02 +00001118{
Guido van Rossum778983b1993-02-19 15:55:02 +00001119 FILE *fp;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001120
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001121 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001122 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001123 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001124 return NULL;
1125 }
1126 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001127 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1128 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001130 clearerr(fp);
1131 return NULL;
1132 }
1133 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001134 Py_INCREF(Py_None);
1135 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001136}
1137
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001138PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001139"tofile(f)\n\
1140\n\
1141Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001142write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001143
1144
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001145static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001146array_fromlist(arrayobject *self, PyObject *list)
Guido van Rossum778983b1993-02-19 15:55:02 +00001147{
1148 int n;
Guido van Rossum778983b1993-02-19 15:55:02 +00001149 int itemsize = self->ob_descr->itemsize;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001150
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001151 if (!PyList_Check(list)) {
1152 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001153 return NULL;
1154 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001155 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001156 if (n > 0) {
1157 char *item = self->ob_item;
1158 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001159 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001160 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001161 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001162 return NULL;
1163 }
1164 self->ob_item = item;
1165 self->ob_size += n;
1166 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001168 if ((*self->ob_descr->setitem)(self,
1169 self->ob_size - n + i, v) != 0) {
1170 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001171 PyMem_RESIZE(item, char,
1172 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001173 self->ob_item = item;
1174 return NULL;
1175 }
1176 }
1177 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001178 Py_INCREF(Py_None);
1179 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001180}
1181
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001182PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001183"fromlist(list)\n\
1184\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001185Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001186
1187
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001188static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001189array_tolist(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001190{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001191 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001192 int i;
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001193
Guido van Rossum778983b1993-02-19 15:55:02 +00001194 if (list == NULL)
1195 return NULL;
1196 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001197 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001198 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 return NULL;
1201 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001202 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001203 }
1204 return list;
1205}
1206
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001207PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001208"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001209\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001210Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001211
1212
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001213static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001214array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001215{
1216 char *str;
1217 int n;
1218 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001219 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001220 return NULL;
1221 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001222 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001223 "string length not a multiple of item size");
1224 return NULL;
1225 }
1226 n = n / itemsize;
1227 if (n > 0) {
1228 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001229 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 return NULL;
1233 }
1234 self->ob_item = item;
1235 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001236 memcpy(item + (self->ob_size - n) * itemsize,
1237 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001238 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001239 Py_INCREF(Py_None);
1240 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001241}
1242
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001243PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001244"fromstring(string)\n\
1245\n\
1246Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001247values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001248
1249
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001251array_tostring(arrayobject *self, PyObject *unused)
Guido van Rossum778983b1993-02-19 15:55:02 +00001252{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001254 self->ob_size * self->ob_descr->itemsize);
1255}
1256
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001257PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001258"tostring() -> string\n\
1259\n\
1260Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001261representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001262
Martin v. Löwis99866332002-03-01 10:27:01 +00001263
1264
1265#ifdef Py_USING_UNICODE
1266static PyObject *
1267array_fromunicode(arrayobject *self, PyObject *args)
1268{
1269 Py_UNICODE *ustr;
1270 int n;
1271
1272 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1273 return NULL;
1274 if (self->ob_descr->typecode != 'u') {
1275 PyErr_SetString(PyExc_ValueError,
1276 "fromunicode() may only be called on "
1277 "type 'u' arrays");
1278 return NULL;
1279 }
1280 if (n > 0) {
1281 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1282 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1283 if (item == NULL) {
1284 PyErr_NoMemory();
1285 return NULL;
1286 }
1287 self->ob_item = (char *) item;
1288 self->ob_size += n;
1289 memcpy(item + self->ob_size - n,
1290 ustr, n * sizeof(Py_UNICODE));
1291 }
1292
1293 Py_INCREF(Py_None);
1294 return Py_None;
1295}
1296
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001297PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001298"fromunicode(ustr)\n\
1299\n\
1300Extends this array with data from the unicode string ustr.\n\
1301The array must be a type 'u' array; otherwise a ValueError\n\
1302is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001303append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001304
1305
1306static PyObject *
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001307array_tounicode(arrayobject *self, PyObject *unused)
Martin v. Löwis99866332002-03-01 10:27:01 +00001308{
Martin v. Löwis99866332002-03-01 10:27:01 +00001309 if (self->ob_descr->typecode != 'u') {
1310 PyErr_SetString(PyExc_ValueError,
1311 "tounicode() may only be called on type 'u' arrays");
1312 return NULL;
1313 }
1314 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1315}
1316
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001317PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001318"tounicode() -> unicode\n\
1319\n\
1320Convert the array to a unicode string. The array must be\n\
1321a type 'u' array; otherwise a ValueError is raised. Use\n\
1322array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001323an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001324
1325#endif /* Py_USING_UNICODE */
1326
1327
1328static PyObject *
1329array_get_typecode(arrayobject *a, void *closure)
1330{
1331 char tc = a->ob_descr->typecode;
1332 return PyString_FromStringAndSize(&tc, 1);
1333}
1334
1335static PyObject *
1336array_get_itemsize(arrayobject *a, void *closure)
1337{
1338 return PyInt_FromLong((long)a->ob_descr->itemsize);
1339}
1340
1341static PyGetSetDef array_getsets [] = {
1342 {"typecode", (getter) array_get_typecode, NULL,
1343 "the typecode character used to create the array"},
1344 {"itemsize", (getter) array_get_itemsize, NULL,
1345 "the size, in bytes, of one array item"},
1346 {NULL}
1347};
1348
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001349PyMethodDef array_methods[] = {
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001350 {"append", (PyCFunction)array_append, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001351 append_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001352 {"buffer_info", (PyCFunction)array_buffer_info, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001353 buffer_info_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001354 {"byteswap", (PyCFunction)array_byteswap, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001355 byteswap_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001356 {"count", (PyCFunction)array_count, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001357 count_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001358 {"extend", (PyCFunction)array_extend, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001359 extend_doc},
1360 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1361 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001362 {"fromlist", (PyCFunction)array_fromlist, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001363 fromlist_doc},
1364 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1365 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001366#ifdef Py_USING_UNICODE
1367 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1368 fromunicode_doc},
1369#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001370 {"index", (PyCFunction)array_index, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001371 index_doc},
1372 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1373 insert_doc},
1374 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1375 pop_doc},
1376 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1377 fromfile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001378 {"remove", (PyCFunction)array_remove, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001379 remove_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001380 {"reverse", (PyCFunction)array_reverse, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001381 reverse_doc},
1382/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1383 sort_doc},*/
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001384 {"tofile", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001385 tofile_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001386 {"tolist", (PyCFunction)array_tolist, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001387 tolist_doc},
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001388 {"tostring", (PyCFunction)array_tostring, METH_NOARGS,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001389 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001390#ifdef Py_USING_UNICODE
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001391 {"tounicode", (PyCFunction)array_tounicode, METH_NOARGS,
Martin v. Löwis99866332002-03-01 10:27:01 +00001392 tounicode_doc},
1393#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001394 {"write", (PyCFunction)array_tofile, METH_O,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001395 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001396 {NULL, NULL} /* sentinel */
1397};
1398
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001399static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001400array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001401{
Martin v. Löwis99866332002-03-01 10:27:01 +00001402 char buf[256], typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001404 int i, len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001405
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001407 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001408 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001409 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001410 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001411 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001412
1413 if (typecode == 'c' || typecode == 'u') {
Martin v. Löwis99866332002-03-01 10:27:01 +00001414 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001415 s = PyString_FromString(buf);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001416#ifdef Py_USING_UNICODE
Martin v. Löwis99866332002-03-01 10:27:01 +00001417 if (typecode == 'c')
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001418#endif
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001419 v = array_tostring(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001420#ifdef Py_USING_UNICODE
Martin v. Löwis99866332002-03-01 10:27:01 +00001421 else
Raymond Hettinger36cd2bf2003-01-03 08:24:58 +00001422 v = array_tounicode(a, NULL);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001423#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001424 t = PyObject_Repr(v);
1425 Py_XDECREF(v);
1426 PyString_ConcatAndDel(&s, t);
1427 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001428 return s;
1429 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001430 PyOS_snprintf(buf, sizeof(buf), "array('%c', [", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001431 s = PyString_FromString(buf);
1432 comma = PyString_FromString(", ");
1433 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001434 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001435 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001436 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001437 t = PyObject_Repr(v);
1438 Py_XDECREF(v);
1439 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001440 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001441 Py_XDECREF(comma);
1442 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001443 return s;
1444}
1445
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001446static PyObject*
1447array_subscr(arrayobject* self, PyObject* item)
1448{
1449 if (PyInt_Check(item)) {
1450 long i = PyInt_AS_LONG(item);
1451 if (i < 0)
1452 i += self->ob_size;
1453 return array_item(self, i);
1454 }
1455 else if (PyLong_Check(item)) {
1456 long i = PyLong_AsLong(item);
1457 if (i == -1 && PyErr_Occurred())
1458 return NULL;
1459 if (i < 0)
1460 i += self->ob_size;
1461 return array_item(self, i);
1462 }
1463 else if (PySlice_Check(item)) {
1464 int start, stop, step, slicelength, cur, i;
1465 PyObject* result;
1466 arrayobject* ar;
1467 int itemsize = self->ob_descr->itemsize;
1468
1469 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1470 &start, &stop, &step, &slicelength) < 0) {
1471 return NULL;
1472 }
1473
1474 if (slicelength <= 0) {
1475 return newarrayobject(&Arraytype, 0, self->ob_descr);
1476 }
1477 else {
1478 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1479 if (!result) return NULL;
1480
1481 ar = (arrayobject*)result;
1482
1483 for (cur = start, i = 0; i < slicelength;
1484 cur += step, i++) {
1485 memcpy(ar->ob_item + i*itemsize,
1486 self->ob_item + cur*itemsize,
1487 itemsize);
1488 }
1489
1490 return result;
1491 }
1492 }
1493 else {
1494 PyErr_SetString(PyExc_TypeError,
1495 "list indices must be integers");
1496 return NULL;
1497 }
1498}
1499
1500static int
1501array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1502{
1503 if (PyInt_Check(item)) {
1504 long i = PyInt_AS_LONG(item);
1505 if (i < 0)
1506 i += self->ob_size;
1507 return array_ass_item(self, i, value);
1508 }
1509 else if (PyLong_Check(item)) {
1510 long i = PyLong_AsLong(item);
1511 if (i == -1 && PyErr_Occurred())
1512 return -1;
1513 if (i < 0)
1514 i += self->ob_size;
1515 return array_ass_item(self, i, value);
1516 }
1517 else if (PySlice_Check(item)) {
1518 int start, stop, step, slicelength;
1519 int itemsize = self->ob_descr->itemsize;
1520
1521 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1522 &start, &stop, &step, &slicelength) < 0) {
1523 return -1;
1524 }
1525
1526 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1527 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1528 return array_ass_slice(self, start, stop, value);
1529
1530 if (value == NULL) {
1531 /* delete slice */
Michael W. Hudson56796f62002-07-29 14:35:04 +00001532 int cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001533
1534 if (slicelength <= 0)
1535 return 0;
1536
1537 if (step < 0) {
1538 stop = start + 1;
1539 start = stop + step*(slicelength - 1) - 1;
1540 step = -step;
1541 }
1542
Michael W. Hudson56796f62002-07-29 14:35:04 +00001543 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001544 cur += step, i++) {
1545 memmove(self->ob_item + (cur - i)*itemsize,
1546 self->ob_item + (cur + 1)*itemsize,
1547 (step - 1) * itemsize);
1548 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001549 extra = self->ob_size - (cur + 1);
1550 if (extra > 0) {
1551 memmove(self->ob_item + (cur - i)*itemsize,
1552 self->ob_item + (cur + 1)*itemsize,
1553 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001554 }
1555
1556 self->ob_size -= slicelength;
1557 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
1558
1559
1560 return 0;
1561 }
1562 else {
1563 /* assign slice */
1564 int cur, i;
1565 arrayobject* av;
1566
1567 if (!array_Check(value)) {
1568 PyErr_Format(PyExc_TypeError,
1569 "must assign array (not \"%.200s\") to slice",
1570 value->ob_type->tp_name);
1571 return -1;
1572 }
1573
1574 av = (arrayobject*)value;
1575
1576 if (av->ob_size != slicelength) {
1577 PyErr_Format(PyExc_ValueError,
1578 "attempt to assign array of size %d to extended slice of size %d",
1579 av->ob_size, slicelength);
1580 return -1;
1581 }
1582
1583 if (!slicelength)
1584 return 0;
1585
1586 /* protect against a[::-1] = a */
1587 if (self == av) {
1588 value = array_slice(av, 0, av->ob_size);
1589 av = (arrayobject*)value;
1590 }
1591 else {
1592 Py_INCREF(value);
1593 }
1594
1595 for (cur = start, i = 0; i < slicelength;
1596 cur += step, i++) {
1597 memcpy(self->ob_item + cur*itemsize,
1598 av->ob_item + i*itemsize,
1599 itemsize);
1600 }
1601
1602 Py_DECREF(value);
1603
1604 return 0;
1605 }
1606 }
1607 else {
1608 PyErr_SetString(PyExc_TypeError,
1609 "list indices must be integers");
1610 return -1;
1611 }
1612}
1613
1614static PyMappingMethods array_as_mapping = {
1615 (inquiry)array_length,
1616 (binaryfunc)array_subscr,
1617 (objobjargproc)array_ass_subscr
1618};
1619
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001620static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001621array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001622{
1623 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001624 PyErr_SetString(PyExc_SystemError,
1625 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001626 return -1;
1627 }
1628 *ptr = (void *)self->ob_item;
1629 return self->ob_size*self->ob_descr->itemsize;
1630}
1631
1632static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001633array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001634{
1635 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001636 PyErr_SetString(PyExc_SystemError,
1637 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001638 return -1;
1639 }
1640 *ptr = (void *)self->ob_item;
1641 return self->ob_size*self->ob_descr->itemsize;
1642}
1643
1644static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001645array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001646{
1647 if ( lenp )
1648 *lenp = self->ob_size*self->ob_descr->itemsize;
1649 return 1;
1650}
1651
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001652static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001653 (inquiry)array_length, /*sq_length*/
1654 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001655 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001656 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001657 (intintargfunc)array_slice, /*sq_slice*/
1658 (intobjargproc)array_ass_item, /*sq_ass_item*/
1659 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001660 NULL, /*sq_contains*/
1661 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
1662 (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001663};
1664
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001665static PyBufferProcs array_as_buffer = {
1666 (getreadbufferproc)array_buffer_getreadbuf,
1667 (getwritebufferproc)array_buffer_getwritebuf,
1668 (getsegcountproc)array_buffer_getsegcount,
1669};
1670
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001671static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001672array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001673{
1674 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001675 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001676 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00001677
1678 if (kwds != NULL) {
1679 int i = PyObject_Length(kwds);
1680 if (i < 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001681 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001682 else if (i > 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001683 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001684 "array.array constructor takes "
1685 "no keyword arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +00001686 return NULL;
1687 }
1688 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001689
1690 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1691 return NULL;
1692
1693 if (!(initial == NULL || PyList_Check(initial)
1694 || PyString_Check(initial)
1695 || (c == 'u' && PyUnicode_Check(initial)))) {
1696 PyErr_SetString(PyExc_TypeError,
1697 "array initializer must be list or string");
1698 return NULL;
1699 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001700 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1701 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001702 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001703 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001704 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001705 len = 0;
1706 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001707 len = PyList_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001708
1709 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001710 if (a == NULL)
1711 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001712
Guido van Rossum778983b1993-02-19 15:55:02 +00001713 if (len > 0) {
1714 int i;
1715 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001716 PyObject *v =
Martin v. Löwis99866332002-03-01 10:27:01 +00001717 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001718 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001719 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001720 return NULL;
1721 }
1722 }
1723 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001724 if (initial != NULL && PyString_Check(initial)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001725 PyObject *t_initial = Py_BuildValue("(O)",
1726 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001727 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001728 array_fromstring((arrayobject *)a,
1729 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001730 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001731 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001732 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001733 return NULL;
1734 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001735 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001736#ifdef Py_USING_UNICODE
1737 } else if (initial != NULL && PyUnicode_Check(initial)) {
1738 int n = PyUnicode_GET_DATA_SIZE(initial);
1739 if (n > 0) {
1740 arrayobject *self = (arrayobject *)a;
1741 char *item = self->ob_item;
1742 item = PyMem_Realloc(item, n);
1743 if (item == NULL) {
1744 PyErr_NoMemory();
1745 Py_DECREF(a);
1746 return NULL;
1747 }
1748 self->ob_item = item;
1749 self->ob_size = n / sizeof(Py_UNICODE);
1750 memcpy(item, PyUnicode_AS_DATA(initial), n);
1751 }
1752#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001753 }
1754 return a;
1755 }
1756 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001757 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001758 "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 +00001759 return NULL;
1760}
1761
Guido van Rossum778983b1993-02-19 15:55:02 +00001762
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001763PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001764"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001765an array of basic values: characters, integers, floating point\n\
1766numbers. Arrays are sequence types and behave very much like lists,\n\
1767except that the type of objects stored in them is constrained. The\n\
1768type is specified at object creation time by using a type code, which\n\
1769is a single character. The following type codes are defined:\n\
1770\n\
1771 Type code C Type Minimum size in bytes \n\
1772 'c' character 1 \n\
1773 'b' signed integer 1 \n\
1774 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001775 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001776 'h' signed integer 2 \n\
1777 'H' unsigned integer 2 \n\
1778 'i' signed integer 2 \n\
1779 'I' unsigned integer 2 \n\
1780 'l' signed integer 4 \n\
1781 'L' unsigned integer 4 \n\
1782 'f' floating point 4 \n\
1783 'd' floating point 8 \n\
1784\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001785The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001786\n\
1787array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001788");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001789
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001790PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001791"array(typecode [, initializer]) -> array\n\
1792\n\
1793Return a new array whose items are restricted by typecode, and\n\
1794initialized from the optional initializer value, which must be a list\n\
1795or a string.\n\
1796\n\
1797Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001798the type of objects stored in them is constrained.\n\
1799\n\
1800Methods:\n\
1801\n\
1802append() -- append a new item to the end of the array\n\
1803buffer_info() -- return information giving the current memory info\n\
1804byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001805count() -- return number of occurences of an object\n\
1806extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001807fromfile() -- read items from a file object\n\
1808fromlist() -- append items from the list\n\
1809fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001810index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001811insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001812pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001813read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001814remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001815reverse() -- reverse the order of the items in the array\n\
1816tofile() -- write all items to a file object\n\
1817tolist() -- return the array converted to an ordinary list\n\
1818tostring() -- return the array converted to a string\n\
1819write() -- DEPRECATED, use tofile()\n\
1820\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001821Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001822\n\
1823typecode -- the typecode character used to create the array\n\
1824itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001825");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001826
Tim Peters0c322792002-07-17 16:49:03 +00001827static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001828 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001829 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001830 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001831 sizeof(arrayobject),
1832 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001833 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001834 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001835 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001836 0, /* tp_setattr */
1837 0, /* tp_compare */
1838 (reprfunc)array_repr, /* tp_repr */
1839 0, /* tp_as _number*/
1840 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001841 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001842 0, /* tp_hash */
1843 0, /* tp_call */
1844 0, /* tp_str */
Martin v. Löwisb9132a22002-05-02 20:34:12 +00001845 DELAYED(PyObject_GenericGetAttr), /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001846 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001847 &array_as_buffer, /* tp_as_buffer*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001848 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001849 arraytype_doc, /* tp_doc */
1850 0, /* tp_traverse */
1851 0, /* tp_clear */
1852 array_richcompare, /* tp_richcompare */
Martin v. Löwis99866332002-03-01 10:27:01 +00001853 0, /* tp_weaklistoffset */
1854 0, /* tp_iter */
1855 0, /* tp_iternext */
1856 array_methods, /* tp_methods */
1857 0, /* tp_members */
1858 array_getsets, /* tp_getset */
1859 0, /* tp_base */
1860 0, /* tp_dict */
1861 0, /* tp_descr_get */
1862 0, /* tp_descr_set */
1863 0, /* tp_dictoffset */
1864 0, /* tp_init */
Martin v. Löwisb9132a22002-05-02 20:34:12 +00001865 DELAYED(PyType_GenericAlloc), /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00001866 array_new, /* tp_new */
Martin v. Löwisb9132a22002-05-02 20:34:12 +00001867 DELAYED(PyObject_Del), /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001868};
1869
Martin v. Löwis99866332002-03-01 10:27:01 +00001870/* No functions in array module. */
1871static PyMethodDef a_methods[] = {
1872 {NULL, NULL, 0, NULL} /* Sentinel */
1873};
1874
1875
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001876PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001877initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001878{
Fred Drakef4e34842002-04-01 03:45:06 +00001879 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00001880
Martin v. Löwis99866332002-03-01 10:27:01 +00001881 Arraytype.ob_type = &PyType_Type;
Martin v. Löwisedbffc12002-05-02 20:09:59 +00001882 Arraytype.tp_getattro = PyObject_GenericGetAttr;
1883 Arraytype.tp_alloc = PyType_GenericAlloc;
1884 Arraytype.tp_free = PyObject_Del;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001885 m = Py_InitModule3("array", a_methods, module_doc);
Fred Drakef4e34842002-04-01 03:45:06 +00001886
1887 Py_INCREF((PyObject *)&Arraytype);
1888 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
1889 Py_INCREF((PyObject *)&Arraytype);
1890 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001891 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001892}