blob: 5bb5e2ceee8f2ed9c7f915c555cb98cf57101e6c [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 *
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000803array_count(arrayobject *self, PyObject *args)
804{
805 int count = 0;
806 int i;
807 PyObject *v;
808
809 if (!PyArg_ParseTuple(args, "O:count", &v))
810 return NULL;
811 for (i = 0; i < self->ob_size; i++) {
812 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000813 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000814 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000815 if (cmp > 0)
816 count++;
817 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000818 return NULL;
819 }
820 return PyInt_FromLong((long)count);
821}
822
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000823PyDoc_STRVAR(count_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000824"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000825\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000826Return number of occurences of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000827
828static PyObject *
829array_index(arrayobject *self, PyObject *args)
830{
831 int i;
832 PyObject *v;
833
834 if (!PyArg_ParseTuple(args, "O:index", &v))
835 return NULL;
836 for (i = 0; i < self->ob_size; i++) {
837 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000838 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
839 Py_DECREF(selfi);
840 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000841 return PyInt_FromLong((long)i);
842 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000843 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000844 return NULL;
845 }
846 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
847 return NULL;
848}
849
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000850PyDoc_STRVAR(index_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000851"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000852\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000853Return index of first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000854
855static PyObject *
856array_remove(arrayobject *self, PyObject *args)
857{
858 int i;
859 PyObject *v;
860
861 if (!PyArg_ParseTuple(args, "O:remove", &v))
862 return NULL;
863 for (i = 0; i < self->ob_size; i++) {
864 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000865 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
866 Py_DECREF(selfi);
867 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000868 if (array_ass_slice(self, i, i+1,
869 (PyObject *)NULL) != 0)
870 return NULL;
871 Py_INCREF(Py_None);
872 return Py_None;
873 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000874 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000875 return NULL;
876 }
877 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
878 return NULL;
879}
880
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000881PyDoc_STRVAR(remove_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000882"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000883\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000884Remove the first occurence of x in the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000885
886static PyObject *
887array_pop(arrayobject *self, PyObject *args)
888{
889 int i = -1;
890 PyObject *v;
891 if (!PyArg_ParseTuple(args, "|i:pop", &i))
892 return NULL;
893 if (self->ob_size == 0) {
894 /* Special-case most common failure cause */
895 PyErr_SetString(PyExc_IndexError, "pop from empty array");
896 return NULL;
897 }
898 if (i < 0)
899 i += self->ob_size;
900 if (i < 0 || i >= self->ob_size) {
901 PyErr_SetString(PyExc_IndexError, "pop index out of range");
902 return NULL;
903 }
904 v = getarrayitem((PyObject *)self,i);
905 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
906 Py_DECREF(v);
907 return NULL;
908 }
909 return v;
910}
911
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000912PyDoc_STRVAR(pop_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000913"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000914\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000915Return the i-th element and delete it from the array. i defaults to -1.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000916
917static PyObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000918array_extend(arrayobject *self, PyObject *args)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000919{
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000920 PyObject *bb;
Tim Petersbb307342000-09-10 05:22:54 +0000921
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000922 if (!PyArg_ParseTuple(args, "O:extend", &bb))
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000923 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +0000924 if (array_do_extend(self, bb) == -1)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000925 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +0000926 Py_INCREF(Py_None);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000927 return Py_None;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000928}
929
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000930PyDoc_STRVAR(extend_doc,
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000931"extend(array)\n\
932\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000933 Append array items to the end of the array.");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000934
935static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000936array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000937{
938 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000939 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000940 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000941 return NULL;
942 return ins(self, i, v);
943}
944
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000945PyDoc_STRVAR(insert_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000946"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000947\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000948Insert a new item x into the array before position i.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000949
950
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000951static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000952array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000953{
Tim Peters077a11d2000-09-16 22:31:29 +0000954 PyObject* retval = NULL;
955 if (!PyArg_ParseTuple(args, ":buffer_info"))
956 return NULL;
957 retval = PyTuple_New(2);
958 if (!retval)
959 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +0000960
961 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
962 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
963
964 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000965}
966
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000967PyDoc_STRVAR(buffer_info_doc,
Tim Peters077a11d2000-09-16 22:31:29 +0000968"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000969\n\
970Return a tuple (address, length) giving the current memory address and\n\
Guido van Rossum702d08e2001-07-27 16:05:32 +0000971the length in items of the buffer used to hold array's contents\n\
972The length should be multiplied by the itemsize attribute to calculate\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000973the buffer length in bytes.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000974
975
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000976static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000977array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000978{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000979 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000980 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000981 return NULL;
982 return ins(self, (int) self->ob_size, v);
983}
984
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000985PyDoc_STRVAR(append_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000986"append(x)\n\
987\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +0000988Append new value x to the end of the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000989
990
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000991static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000992array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000993{
994 char *p;
995 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000996
997 if (!PyArg_ParseTuple(args, ":byteswap"))
998 return NULL;
999
Guido van Rossum778983b1993-02-19 15:55:02 +00001000 switch (self->ob_descr->itemsize) {
1001 case 1:
1002 break;
1003 case 2:
1004 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
1005 char p0 = p[0];
1006 p[0] = p[1];
1007 p[1] = p0;
1008 }
1009 break;
1010 case 4:
1011 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
1012 char p0 = p[0];
1013 char p1 = p[1];
1014 p[0] = p[3];
1015 p[1] = p[2];
1016 p[2] = p1;
1017 p[3] = p0;
1018 }
1019 break;
Guido van Rossume77a7571993-11-03 15:01:26 +00001020 case 8:
1021 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
1022 char p0 = p[0];
1023 char p1 = p[1];
1024 char p2 = p[2];
1025 char p3 = p[3];
1026 p[0] = p[7];
1027 p[1] = p[6];
1028 p[2] = p[5];
1029 p[3] = p[4];
1030 p[4] = p3;
1031 p[5] = p2;
1032 p[6] = p1;
1033 p[7] = p0;
1034 }
1035 break;
Guido van Rossum778983b1993-02-19 15:55:02 +00001036 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001037 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001038 "don't know how to byteswap this array type");
1039 return NULL;
1040 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001041 Py_INCREF(Py_None);
1042 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001043}
1044
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001045PyDoc_STRVAR(byteswap_doc,
Fred Drakebf272981999-12-03 17:15:30 +00001046"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001047\n\
Fred Drakebf272981999-12-03 17:15:30 +00001048Byteswap 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 +000010494, or 8 bytes in size, RuntimeError is raised.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001050
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001051static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001052array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001053{
Guido van Rossume77a7571993-11-03 15:01:26 +00001054 register int itemsize = self->ob_descr->itemsize;
1055 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +00001056 /* little buffer to hold items while swapping */
1057 char tmp[256]; /* 8 is probably enough -- but why skimp */
1058 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +00001059
Tim Peters077a11d2000-09-16 22:31:29 +00001060 if (!PyArg_ParseTuple(args, ":reverse"))
1061 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001062
1063 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +00001064 for (p = self->ob_item,
1065 q = self->ob_item + (self->ob_size - 1)*itemsize;
1066 p < q;
1067 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +00001068 /* memory areas guaranteed disjoint, so memcpy
1069 * is safe (& memmove may be slower).
1070 */
1071 memcpy(tmp, p, itemsize);
1072 memcpy(p, q, itemsize);
1073 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 }
1075 }
Tim Petersbb307342000-09-10 05:22:54 +00001076
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001077 Py_INCREF(Py_None);
1078 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001079}
Guido van Rossume77a7571993-11-03 15:01:26 +00001080
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001081PyDoc_STRVAR(reverse_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001082"reverse()\n\
1083\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001084Reverse the order of the items in the array.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001085
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001086static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001087array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001088{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001090 int n;
1091 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001092 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001093 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001094 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001095 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001096 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001097 return NULL;
1098 }
1099 if (n > 0) {
1100 char *item = self->ob_item;
1101 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001102 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001103 int newlength;
1104 size_t newbytes;
1105 /* Be careful here about overflow */
1106 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001107 (newbytes = newlength * itemsize) / itemsize !=
1108 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001109 goto nomem;
1110 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001111 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001112 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001113 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001114 return NULL;
1115 }
1116 self->ob_item = item;
1117 self->ob_size += n;
1118 nread = fread(item + (self->ob_size - n) * itemsize,
1119 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001120 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001121 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001122 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001123 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001124 PyErr_SetString(PyExc_EOFError,
1125 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001126 return NULL;
1127 }
1128 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 Py_INCREF(Py_None);
1130 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001131}
1132
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001133PyDoc_STRVAR(fromfile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001134"fromfile(f, n)\n\
1135\n\
1136Read 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 +00001137array. Also called as read.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001138
1139
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001140static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001141array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001142{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001143 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001144 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001145 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001146 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001147 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001148 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001150 return NULL;
1151 }
1152 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001153 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1154 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001155 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001156 clearerr(fp);
1157 return NULL;
1158 }
1159 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001160 Py_INCREF(Py_None);
1161 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001162}
1163
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001164PyDoc_STRVAR(tofile_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001165"tofile(f)\n\
1166\n\
1167Write all items (as machine values) to the file object f. Also called as\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001168write.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001169
1170
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001171static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001172array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001173{
1174 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001175 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001176 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001177 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001178 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001179 if (!PyList_Check(list)) {
1180 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001181 return NULL;
1182 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001183 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001184 if (n > 0) {
1185 char *item = self->ob_item;
1186 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001187 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001188 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001189 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001190 return NULL;
1191 }
1192 self->ob_item = item;
1193 self->ob_size += n;
1194 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001196 if ((*self->ob_descr->setitem)(self,
1197 self->ob_size - n + i, v) != 0) {
1198 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199 PyMem_RESIZE(item, char,
1200 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 self->ob_item = item;
1202 return NULL;
1203 }
1204 }
1205 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001206 Py_INCREF(Py_None);
1207 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001208}
1209
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001210PyDoc_STRVAR(fromlist_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001211"fromlist(list)\n\
1212\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001213Append items to array from list.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001214
1215
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001216static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001217array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001218{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001219 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001220 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001221 if (!PyArg_ParseTuple(args, ":tolist"))
1222 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001223 if (list == NULL)
1224 return NULL;
1225 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001227 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 return NULL;
1230 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 }
1233 return list;
1234}
1235
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001236PyDoc_STRVAR(tolist_doc,
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001237"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001238\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001239Convert array to an ordinary list with the same items.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001240
1241
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001242static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001243array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001244{
1245 char *str;
1246 int n;
1247 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001248 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001249 return NULL;
1250 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001251 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001252 "string length not a multiple of item size");
1253 return NULL;
1254 }
1255 n = n / itemsize;
1256 if (n > 0) {
1257 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001258 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001260 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001261 return NULL;
1262 }
1263 self->ob_item = item;
1264 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001265 memcpy(item + (self->ob_size - n) * itemsize,
1266 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001267 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268 Py_INCREF(Py_None);
1269 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001270}
1271
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001272PyDoc_STRVAR(fromstring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001273"fromstring(string)\n\
1274\n\
1275Appends items from the string, interpreting it as an array of machine\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001276values,as if it had been read from a file using the fromfile() method).");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001277
1278
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001279static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001280array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001281{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001282 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001283 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001284 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001285 self->ob_size * self->ob_descr->itemsize);
1286}
1287
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001288PyDoc_STRVAR(tostring_doc,
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001289"tostring() -> string\n\
1290\n\
1291Convert the array to an array of machine values and return the string\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001292representation.");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001293
Martin v. Löwis99866332002-03-01 10:27:01 +00001294
1295
1296#ifdef Py_USING_UNICODE
1297static PyObject *
1298array_fromunicode(arrayobject *self, PyObject *args)
1299{
1300 Py_UNICODE *ustr;
1301 int n;
1302
1303 if (!PyArg_ParseTuple(args, "u#:fromunicode", &ustr, &n))
1304 return NULL;
1305 if (self->ob_descr->typecode != 'u') {
1306 PyErr_SetString(PyExc_ValueError,
1307 "fromunicode() may only be called on "
1308 "type 'u' arrays");
1309 return NULL;
1310 }
1311 if (n > 0) {
1312 Py_UNICODE *item = (Py_UNICODE *) self->ob_item;
1313 PyMem_RESIZE(item, Py_UNICODE, self->ob_size + n);
1314 if (item == NULL) {
1315 PyErr_NoMemory();
1316 return NULL;
1317 }
1318 self->ob_item = (char *) item;
1319 self->ob_size += n;
1320 memcpy(item + self->ob_size - n,
1321 ustr, n * sizeof(Py_UNICODE));
1322 }
1323
1324 Py_INCREF(Py_None);
1325 return Py_None;
1326}
1327
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001328PyDoc_STRVAR(fromunicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001329"fromunicode(ustr)\n\
1330\n\
1331Extends this array with data from the unicode string ustr.\n\
1332The array must be a type 'u' array; otherwise a ValueError\n\
1333is raised. Use array.fromstring(ustr.decode(...)) to\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001334append Unicode data to an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001335
1336
1337static PyObject *
1338array_tounicode(arrayobject *self, PyObject *args)
1339{
1340 if (!PyArg_ParseTuple(args, ":tounicode"))
1341 return NULL;
1342 if (self->ob_descr->typecode != 'u') {
1343 PyErr_SetString(PyExc_ValueError,
1344 "tounicode() may only be called on type 'u' arrays");
1345 return NULL;
1346 }
1347 return PyUnicode_FromUnicode((Py_UNICODE *) self->ob_item, self->ob_size);
1348}
1349
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001350PyDoc_STRVAR(tounicode_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001351"tounicode() -> unicode\n\
1352\n\
1353Convert the array to a unicode string. The array must be\n\
1354a type 'u' array; otherwise a ValueError is raised. Use\n\
1355array.tostring().decode() to obtain a unicode string from\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001356an array of some other type.");
Martin v. Löwis99866332002-03-01 10:27:01 +00001357
1358#endif /* Py_USING_UNICODE */
1359
1360
1361static PyObject *
1362array_get_typecode(arrayobject *a, void *closure)
1363{
1364 char tc = a->ob_descr->typecode;
1365 return PyString_FromStringAndSize(&tc, 1);
1366}
1367
1368static PyObject *
1369array_get_itemsize(arrayobject *a, void *closure)
1370{
1371 return PyInt_FromLong((long)a->ob_descr->itemsize);
1372}
1373
1374static PyGetSetDef array_getsets [] = {
1375 {"typecode", (getter) array_get_typecode, NULL,
1376 "the typecode character used to create the array"},
1377 {"itemsize", (getter) array_get_itemsize, NULL,
1378 "the size, in bytes, of one array item"},
1379 {NULL}
1380};
1381
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001382PyMethodDef array_methods[] = {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001383 {"append", (PyCFunction)array_append, METH_VARARGS,
1384 append_doc},
1385 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS,
1386 buffer_info_doc},
1387 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1388 byteswap_doc},
1389 {"count", (PyCFunction)array_count, METH_VARARGS,
1390 count_doc},
1391 {"extend", (PyCFunction)array_extend, METH_VARARGS,
1392 extend_doc},
1393 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1394 fromfile_doc},
1395 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS,
1396 fromlist_doc},
1397 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1398 fromstring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001399#ifdef Py_USING_UNICODE
1400 {"fromunicode", (PyCFunction)array_fromunicode, METH_VARARGS,
1401 fromunicode_doc},
1402#endif
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001403 {"index", (PyCFunction)array_index, METH_VARARGS,
1404 index_doc},
1405 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1406 insert_doc},
1407 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1408 pop_doc},
1409 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1410 fromfile_doc},
1411 {"remove", (PyCFunction)array_remove, METH_VARARGS,
1412 remove_doc},
1413 {"reverse", (PyCFunction)array_reverse, METH_VARARGS,
1414 reverse_doc},
1415/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1416 sort_doc},*/
1417 {"tofile", (PyCFunction)array_tofile, METH_VARARGS,
1418 tofile_doc},
1419 {"tolist", (PyCFunction)array_tolist, METH_VARARGS,
1420 tolist_doc},
1421 {"tostring", (PyCFunction)array_tostring, METH_VARARGS,
1422 tostring_doc},
Martin v. Löwis99866332002-03-01 10:27:01 +00001423#ifdef Py_USING_UNICODE
1424 {"tounicode", (PyCFunction)array_tounicode, METH_VARARGS,
1425 tounicode_doc},
1426#endif
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001427 {"write", (PyCFunction)array_tofile, METH_VARARGS,
1428 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001429 {NULL, NULL} /* sentinel */
1430};
1431
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001432static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001433array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001434{
Martin v. Löwis99866332002-03-01 10:27:01 +00001435 char buf[256], typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001436 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001437 int i, len;
Martin v. Löwis99866332002-03-01 10:27:01 +00001438
Guido van Rossum778983b1993-02-19 15:55:02 +00001439 len = a->ob_size;
Martin v. Löwis99866332002-03-01 10:27:01 +00001440 typecode = a->ob_descr->typecode;
Guido van Rossum778983b1993-02-19 15:55:02 +00001441 if (len == 0) {
Martin v. Löwis99866332002-03-01 10:27:01 +00001442 PyOS_snprintf(buf, sizeof(buf), "array('%c')", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001443 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001444 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001445
1446 if (typecode == 'c' || typecode == 'u') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001447 PyObject *t_empty = PyTuple_New(0);
Martin v. Löwis99866332002-03-01 10:27:01 +00001448 PyOS_snprintf(buf, sizeof(buf), "array('%c', ", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001449 s = PyString_FromString(buf);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001450#ifdef Py_USING_UNICODE
Martin v. Löwis99866332002-03-01 10:27:01 +00001451 if (typecode == 'c')
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001452#endif
Martin v. Löwis99866332002-03-01 10:27:01 +00001453 v = array_tostring(a, t_empty);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001454#ifdef Py_USING_UNICODE
Martin v. Löwis99866332002-03-01 10:27:01 +00001455 else
1456 v = array_tounicode(a, t_empty);
Michael W. Hudson1755ad92002-05-13 10:14:59 +00001457#endif
Tim Peters7c1cb462000-11-10 19:04:19 +00001458 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001459 t = PyObject_Repr(v);
1460 Py_XDECREF(v);
1461 PyString_ConcatAndDel(&s, t);
1462 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001463 return s;
1464 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001465 PyOS_snprintf(buf, sizeof(buf), "array('%c', [", typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001466 s = PyString_FromString(buf);
1467 comma = PyString_FromString(", ");
1468 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001469 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001470 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001471 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001472 t = PyObject_Repr(v);
1473 Py_XDECREF(v);
1474 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001475 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001476 Py_XDECREF(comma);
1477 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001478 return s;
1479}
1480
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001481static PyObject*
1482array_subscr(arrayobject* self, PyObject* item)
1483{
1484 if (PyInt_Check(item)) {
1485 long i = PyInt_AS_LONG(item);
1486 if (i < 0)
1487 i += self->ob_size;
1488 return array_item(self, i);
1489 }
1490 else if (PyLong_Check(item)) {
1491 long i = PyLong_AsLong(item);
1492 if (i == -1 && PyErr_Occurred())
1493 return NULL;
1494 if (i < 0)
1495 i += self->ob_size;
1496 return array_item(self, i);
1497 }
1498 else if (PySlice_Check(item)) {
1499 int start, stop, step, slicelength, cur, i;
1500 PyObject* result;
1501 arrayobject* ar;
1502 int itemsize = self->ob_descr->itemsize;
1503
1504 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1505 &start, &stop, &step, &slicelength) < 0) {
1506 return NULL;
1507 }
1508
1509 if (slicelength <= 0) {
1510 return newarrayobject(&Arraytype, 0, self->ob_descr);
1511 }
1512 else {
1513 result = newarrayobject(&Arraytype, slicelength, self->ob_descr);
1514 if (!result) return NULL;
1515
1516 ar = (arrayobject*)result;
1517
1518 for (cur = start, i = 0; i < slicelength;
1519 cur += step, i++) {
1520 memcpy(ar->ob_item + i*itemsize,
1521 self->ob_item + cur*itemsize,
1522 itemsize);
1523 }
1524
1525 return result;
1526 }
1527 }
1528 else {
1529 PyErr_SetString(PyExc_TypeError,
1530 "list indices must be integers");
1531 return NULL;
1532 }
1533}
1534
1535static int
1536array_ass_subscr(arrayobject* self, PyObject* item, PyObject* value)
1537{
1538 if (PyInt_Check(item)) {
1539 long i = PyInt_AS_LONG(item);
1540 if (i < 0)
1541 i += self->ob_size;
1542 return array_ass_item(self, i, value);
1543 }
1544 else if (PyLong_Check(item)) {
1545 long i = PyLong_AsLong(item);
1546 if (i == -1 && PyErr_Occurred())
1547 return -1;
1548 if (i < 0)
1549 i += self->ob_size;
1550 return array_ass_item(self, i, value);
1551 }
1552 else if (PySlice_Check(item)) {
1553 int start, stop, step, slicelength;
1554 int itemsize = self->ob_descr->itemsize;
1555
1556 if (PySlice_GetIndicesEx((PySliceObject*)item, self->ob_size,
1557 &start, &stop, &step, &slicelength) < 0) {
1558 return -1;
1559 }
1560
1561 /* treat A[slice(a,b)] = v _exactly_ like A[a:b] = v */
1562 if (step == 1 && ((PySliceObject*)item)->step == Py_None)
1563 return array_ass_slice(self, start, stop, value);
1564
1565 if (value == NULL) {
1566 /* delete slice */
Michael W. Hudson56796f62002-07-29 14:35:04 +00001567 int cur, i, extra;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001568
1569 if (slicelength <= 0)
1570 return 0;
1571
1572 if (step < 0) {
1573 stop = start + 1;
1574 start = stop + step*(slicelength - 1) - 1;
1575 step = -step;
1576 }
1577
Michael W. Hudson56796f62002-07-29 14:35:04 +00001578 for (cur = start, i = 0; i < slicelength - 1;
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001579 cur += step, i++) {
1580 memmove(self->ob_item + (cur - i)*itemsize,
1581 self->ob_item + (cur + 1)*itemsize,
1582 (step - 1) * itemsize);
1583 }
Michael W. Hudson56796f62002-07-29 14:35:04 +00001584 extra = self->ob_size - (cur + 1);
1585 if (extra > 0) {
1586 memmove(self->ob_item + (cur - i)*itemsize,
1587 self->ob_item + (cur + 1)*itemsize,
1588 extra*itemsize);
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001589 }
1590
1591 self->ob_size -= slicelength;
1592 self->ob_item = PyMem_REALLOC(self->ob_item, itemsize*self->ob_size);
1593
1594
1595 return 0;
1596 }
1597 else {
1598 /* assign slice */
1599 int cur, i;
1600 arrayobject* av;
1601
1602 if (!array_Check(value)) {
1603 PyErr_Format(PyExc_TypeError,
1604 "must assign array (not \"%.200s\") to slice",
1605 value->ob_type->tp_name);
1606 return -1;
1607 }
1608
1609 av = (arrayobject*)value;
1610
1611 if (av->ob_size != slicelength) {
1612 PyErr_Format(PyExc_ValueError,
1613 "attempt to assign array of size %d to extended slice of size %d",
1614 av->ob_size, slicelength);
1615 return -1;
1616 }
1617
1618 if (!slicelength)
1619 return 0;
1620
1621 /* protect against a[::-1] = a */
1622 if (self == av) {
1623 value = array_slice(av, 0, av->ob_size);
1624 av = (arrayobject*)value;
1625 }
1626 else {
1627 Py_INCREF(value);
1628 }
1629
1630 for (cur = start, i = 0; i < slicelength;
1631 cur += step, i++) {
1632 memcpy(self->ob_item + cur*itemsize,
1633 av->ob_item + i*itemsize,
1634 itemsize);
1635 }
1636
1637 Py_DECREF(value);
1638
1639 return 0;
1640 }
1641 }
1642 else {
1643 PyErr_SetString(PyExc_TypeError,
1644 "list indices must be integers");
1645 return -1;
1646 }
1647}
1648
1649static PyMappingMethods array_as_mapping = {
1650 (inquiry)array_length,
1651 (binaryfunc)array_subscr,
1652 (objobjargproc)array_ass_subscr
1653};
1654
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001655static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001656array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001657{
1658 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001659 PyErr_SetString(PyExc_SystemError,
1660 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001661 return -1;
1662 }
1663 *ptr = (void *)self->ob_item;
1664 return self->ob_size*self->ob_descr->itemsize;
1665}
1666
1667static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001668array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001669{
1670 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001671 PyErr_SetString(PyExc_SystemError,
1672 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001673 return -1;
1674 }
1675 *ptr = (void *)self->ob_item;
1676 return self->ob_size*self->ob_descr->itemsize;
1677}
1678
1679static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001680array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001681{
1682 if ( lenp )
1683 *lenp = self->ob_size*self->ob_descr->itemsize;
1684 return 1;
1685}
1686
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001687static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001688 (inquiry)array_length, /*sq_length*/
1689 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001690 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001691 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001692 (intintargfunc)array_slice, /*sq_slice*/
1693 (intobjargproc)array_ass_item, /*sq_ass_item*/
1694 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001695 NULL, /*sq_contains*/
1696 (binaryfunc)array_inplace_concat, /*sq_inplace_concat*/
1697 (intargfunc)array_inplace_repeat /*sq_inplace_repeat*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001698};
1699
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001700static PyBufferProcs array_as_buffer = {
1701 (getreadbufferproc)array_buffer_getreadbuf,
1702 (getwritebufferproc)array_buffer_getwritebuf,
1703 (getsegcountproc)array_buffer_getsegcount,
1704};
1705
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001706static PyObject *
Martin v. Löwis99866332002-03-01 10:27:01 +00001707array_new(PyTypeObject *type, PyObject *args, PyObject *kwds)
Guido van Rossum778983b1993-02-19 15:55:02 +00001708{
1709 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001710 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001711 struct arraydescr *descr;
Martin v. Löwis99866332002-03-01 10:27:01 +00001712
1713 if (kwds != NULL) {
1714 int i = PyObject_Length(kwds);
1715 if (i < 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001716 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001717 else if (i > 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001718 PyErr_SetString(PyExc_TypeError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001719 "array.array constructor takes "
1720 "no keyword arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +00001721 return NULL;
1722 }
1723 }
Martin v. Löwis99866332002-03-01 10:27:01 +00001724
1725 if (!PyArg_ParseTuple(args, "c|O:array", &c, &initial))
1726 return NULL;
1727
1728 if (!(initial == NULL || PyList_Check(initial)
1729 || PyString_Check(initial)
1730 || (c == 'u' && PyUnicode_Check(initial)))) {
1731 PyErr_SetString(PyExc_TypeError,
1732 "array initializer must be list or string");
1733 return NULL;
1734 }
Guido van Rossum778983b1993-02-19 15:55:02 +00001735 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1736 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001737 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001738 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001739 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001740 len = 0;
1741 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001742 len = PyList_Size(initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001743
1744 a = newarrayobject(type, len, descr);
Guido van Rossum778983b1993-02-19 15:55:02 +00001745 if (a == NULL)
1746 return NULL;
Martin v. Löwis99866332002-03-01 10:27:01 +00001747
Guido van Rossum778983b1993-02-19 15:55:02 +00001748 if (len > 0) {
1749 int i;
1750 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001751 PyObject *v =
Martin v. Löwis99866332002-03-01 10:27:01 +00001752 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001753 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001754 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001755 return NULL;
1756 }
1757 }
1758 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001759 if (initial != NULL && PyString_Check(initial)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001760 PyObject *t_initial = Py_BuildValue("(O)",
1761 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001762 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001763 array_fromstring((arrayobject *)a,
1764 t_initial);
Martin v. Löwis99866332002-03-01 10:27:01 +00001765 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001766 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001767 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001768 return NULL;
1769 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001770 Py_DECREF(v);
Martin v. Löwis99866332002-03-01 10:27:01 +00001771#ifdef Py_USING_UNICODE
1772 } else if (initial != NULL && PyUnicode_Check(initial)) {
1773 int n = PyUnicode_GET_DATA_SIZE(initial);
1774 if (n > 0) {
1775 arrayobject *self = (arrayobject *)a;
1776 char *item = self->ob_item;
1777 item = PyMem_Realloc(item, n);
1778 if (item == NULL) {
1779 PyErr_NoMemory();
1780 Py_DECREF(a);
1781 return NULL;
1782 }
1783 self->ob_item = item;
1784 self->ob_size = n / sizeof(Py_UNICODE);
1785 memcpy(item, PyUnicode_AS_DATA(initial), n);
1786 }
1787#endif
Guido van Rossum778983b1993-02-19 15:55:02 +00001788 }
1789 return a;
1790 }
1791 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001792 PyErr_SetString(PyExc_ValueError,
Martin v. Löwis99866332002-03-01 10:27:01 +00001793 "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 +00001794 return NULL;
1795}
1796
Guido van Rossum778983b1993-02-19 15:55:02 +00001797
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001798PyDoc_STRVAR(module_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001799"This module defines an object type which can efficiently represent\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001800an array of basic values: characters, integers, floating point\n\
1801numbers. Arrays are sequence types and behave very much like lists,\n\
1802except that the type of objects stored in them is constrained. The\n\
1803type is specified at object creation time by using a type code, which\n\
1804is a single character. The following type codes are defined:\n\
1805\n\
1806 Type code C Type Minimum size in bytes \n\
1807 'c' character 1 \n\
1808 'b' signed integer 1 \n\
1809 'B' unsigned integer 1 \n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001810 'u' Unicode character 2 \n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001811 'h' signed integer 2 \n\
1812 'H' unsigned integer 2 \n\
1813 'i' signed integer 2 \n\
1814 'I' unsigned integer 2 \n\
1815 'l' signed integer 4 \n\
1816 'L' unsigned integer 4 \n\
1817 'f' floating point 4 \n\
1818 'd' floating point 8 \n\
1819\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001820The constructor is:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001821\n\
1822array(typecode [, initializer]) -- create a new array\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001823");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001824
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001825PyDoc_STRVAR(arraytype_doc,
Martin v. Löwis99866332002-03-01 10:27:01 +00001826"array(typecode [, initializer]) -> array\n\
1827\n\
1828Return a new array whose items are restricted by typecode, and\n\
1829initialized from the optional initializer value, which must be a list\n\
1830or a string.\n\
1831\n\
1832Arrays represent basic values and behave very much like lists, except\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001833the type of objects stored in them is constrained.\n\
1834\n\
1835Methods:\n\
1836\n\
1837append() -- append a new item to the end of the array\n\
1838buffer_info() -- return information giving the current memory info\n\
1839byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001840count() -- return number of occurences of an object\n\
1841extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001842fromfile() -- read items from a file object\n\
1843fromlist() -- append items from the list\n\
1844fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001845index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001846insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001847pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001848read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001849remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001850reverse() -- reverse the order of the items in the array\n\
1851tofile() -- write all items to a file object\n\
1852tolist() -- return the array converted to an ordinary list\n\
1853tostring() -- return the array converted to a string\n\
1854write() -- DEPRECATED, use tofile()\n\
1855\n\
Martin v. Löwis99866332002-03-01 10:27:01 +00001856Attributes:\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001857\n\
1858typecode -- the typecode character used to create the array\n\
1859itemsize -- the length in bytes of one array item\n\
Martin v. Löwis14f8b4c2002-06-13 20:33:02 +00001860");
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001861
Tim Peters0c322792002-07-17 16:49:03 +00001862static PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001863 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001864 0,
Guido van Rossum14648392001-12-08 18:02:58 +00001865 "array.array",
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001866 sizeof(arrayobject),
1867 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001868 (destructor)array_dealloc, /* tp_dealloc */
Martin v. Löwisaa158be2002-03-04 09:38:52 +00001869 0, /* tp_print */
Martin v. Löwis99866332002-03-01 10:27:01 +00001870 0, /* tp_getattr */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001871 0, /* tp_setattr */
1872 0, /* tp_compare */
1873 (reprfunc)array_repr, /* tp_repr */
1874 0, /* tp_as _number*/
1875 &array_as_sequence, /* tp_as _sequence*/
Michael W. Hudson9c14bad2002-06-19 15:44:15 +00001876 &array_as_mapping, /* tp_as _mapping*/
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001877 0, /* tp_hash */
1878 0, /* tp_call */
1879 0, /* tp_str */
Martin v. Löwisb9132a22002-05-02 20:34:12 +00001880 DELAYED(PyObject_GenericGetAttr), /* tp_getattro */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001881 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001882 &array_as_buffer, /* tp_as_buffer*/
Martin v. Löwis99866332002-03-01 10:27:01 +00001883 Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001884 arraytype_doc, /* tp_doc */
1885 0, /* tp_traverse */
1886 0, /* tp_clear */
1887 array_richcompare, /* tp_richcompare */
Martin v. Löwis99866332002-03-01 10:27:01 +00001888 0, /* tp_weaklistoffset */
1889 0, /* tp_iter */
1890 0, /* tp_iternext */
1891 array_methods, /* tp_methods */
1892 0, /* tp_members */
1893 array_getsets, /* tp_getset */
1894 0, /* tp_base */
1895 0, /* tp_dict */
1896 0, /* tp_descr_get */
1897 0, /* tp_descr_set */
1898 0, /* tp_dictoffset */
1899 0, /* tp_init */
Martin v. Löwisb9132a22002-05-02 20:34:12 +00001900 DELAYED(PyType_GenericAlloc), /* tp_alloc */
Martin v. Löwis99866332002-03-01 10:27:01 +00001901 array_new, /* tp_new */
Martin v. Löwisb9132a22002-05-02 20:34:12 +00001902 DELAYED(PyObject_Del), /* tp_free */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001903};
1904
Martin v. Löwis99866332002-03-01 10:27:01 +00001905/* No functions in array module. */
1906static PyMethodDef a_methods[] = {
1907 {NULL, NULL, 0, NULL} /* Sentinel */
1908};
1909
1910
Mark Hammondfe51c6d2002-08-02 02:27:13 +00001911PyMODINIT_FUNC
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001912initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001913{
Fred Drakef4e34842002-04-01 03:45:06 +00001914 PyObject *m;
Fred Drake0d40ba42000-02-04 20:33:49 +00001915
Martin v. Löwis99866332002-03-01 10:27:01 +00001916 Arraytype.ob_type = &PyType_Type;
Martin v. Löwisedbffc12002-05-02 20:09:59 +00001917 Arraytype.tp_getattro = PyObject_GenericGetAttr;
1918 Arraytype.tp_alloc = PyType_GenericAlloc;
1919 Arraytype.tp_free = PyObject_Del;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001920 m = Py_InitModule3("array", a_methods, module_doc);
Fred Drakef4e34842002-04-01 03:45:06 +00001921
1922 Py_INCREF((PyObject *)&Arraytype);
1923 PyModule_AddObject(m, "ArrayType", (PyObject *)&Arraytype);
1924 Py_INCREF((PyObject *)&Arraytype);
1925 PyModule_AddObject(m, "array", (PyObject *)&Arraytype);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001926 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001927}