blob: 8da9139a3af0c5d2440e3e38f0c404f596503faf [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/* Array object implementation */
2
3/* An array is a uniform list -- all items have the same type.
4 The item type is restricted to simple C types like int or float */
5
Roger E. Masse2919eaa1996-12-09 20:10:36 +00006#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00007
Guido van Rossum0c709541994-08-19 12:01:32 +00008#ifdef STDC_HEADERS
9#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000010#else /* !STDC_HEADERS */
11#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000012#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000013#endif /* DONT_HAVE_SYS_TYPES_H */
14#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000015
16struct arrayobject; /* Forward */
17
Tim Petersbb307342000-09-10 05:22:54 +000018/* All possible arraydescr values are defined in the vector "descriptors"
19 * below. That's defined later because the appropriate get and set
20 * functions aren't visible yet.
21 */
Guido van Rossum778983b1993-02-19 15:55:02 +000022struct arraydescr {
23 int typecode;
24 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000025 PyObject * (*getitem)(struct arrayobject *, int);
26 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000027};
28
29typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000030 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000031 char *ob_item;
32 struct arraydescr *ob_descr;
33} arrayobject;
34
Roger E. Masse2919eaa1996-12-09 20:10:36 +000035staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000036
37#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
38
Tim Petersbb307342000-09-10 05:22:54 +000039/****************************************************************************
40Get and Set functions for each type.
41A Get function takes an arrayobject* and an integer index, returning the
42array value at that index wrapped in an appropriate PyObject*.
43A Set function takes an arrayobject, integer index, and PyObject*; sets
44the array value at that index to the raw C data extracted from the PyObject*,
45and returns 0 if successful, else nonzero on failure (PyObject* not of an
46appropriate type or value).
47Note that the basic Get and Set functions do NOT check that the index is
48in bounds; that's the responsibility of the caller.
49****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +000050
Roger E. Masse2919eaa1996-12-09 20:10:36 +000051static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000052c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000053{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000054 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000055}
56
57static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000058c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000059{
60 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000061 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000062 return -1;
63 if (i >= 0)
64 ((char *)ap->ob_item)[i] = x;
65 return 0;
66}
67
Roger E. Masse2919eaa1996-12-09 20:10:36 +000068static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000069b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000070{
71 long x = ((char *)ap->ob_item)[i];
72 if (x >= 128)
73 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000074 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000075}
76
77static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000078b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000079{
Fred Drake541dc3b2000-06-28 17:49:30 +000080 short x;
81 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
82 must use the next size up that is signed ('h') and manually do
83 the overflow checking */
84 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000085 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +000086 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +000087 PyErr_SetString(PyExc_OverflowError,
88 "signed char is less than minimum");
89 return -1;
90 }
Guido van Rossum9f754e02000-07-01 00:38:19 +000091 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +000092 PyErr_SetString(PyExc_OverflowError,
93 "signed char is greater than maximum");
94 return -1;
95 }
Guido van Rossum778983b1993-02-19 15:55:02 +000096 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +000097 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +000098 return 0;
99}
100
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000101static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000102BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000103{
104 long x = ((unsigned char *)ap->ob_item)[i];
105 return PyInt_FromLong(x);
106}
107
Fred Drake541dc3b2000-06-28 17:49:30 +0000108static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000109BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000110{
111 unsigned char x;
112 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
113 if (!PyArg_Parse(v, "b;array item must be integer", &x))
114 return -1;
115 if (i >= 0)
116 ((char *)ap->ob_item)[i] = x;
117 return 0;
118}
Guido van Rossum549ab711997-01-03 19:09:47 +0000119
120static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000121h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000122{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000123 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000124}
125
126static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000127h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000128{
129 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000130 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000131 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000132 return -1;
133 if (i >= 0)
134 ((short *)ap->ob_item)[i] = x;
135 return 0;
136}
137
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000138static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000139HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000140{
141 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
142}
143
Fred Drake541dc3b2000-06-28 17:49:30 +0000144static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000145HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000146{
147 int x;
148 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
149 must use the next size up and manually do the overflow checking */
150 if (!PyArg_Parse(v, "i;array item must be integer", &x))
151 return -1;
152 else if (x < 0) {
153 PyErr_SetString(PyExc_OverflowError,
154 "unsigned short is less than minimum");
155 return -1;
156 }
157 else if (x > USHRT_MAX) {
158 PyErr_SetString(PyExc_OverflowError,
159 "unsigned short is greater than maximum");
160 return -1;
161 }
162 if (i >= 0)
163 ((short *)ap->ob_item)[i] = (short)x;
164 return 0;
165}
Guido van Rossum549ab711997-01-03 19:09:47 +0000166
167static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000168i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000169{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000170 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000171}
172
173static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000174i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000175{
176 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000177 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000178 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000179 return -1;
180 if (i >= 0)
181 ((int *)ap->ob_item)[i] = x;
182 return 0;
183}
184
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000185static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000186II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000187{
188 return PyLong_FromUnsignedLong(
189 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
190}
191
192static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000193II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000194{
195 unsigned long x;
196 if (PyLong_Check(v)) {
197 x = PyLong_AsUnsignedLong(v);
198 if (x == (unsigned long) -1 && PyErr_Occurred())
199 return -1;
200 }
201 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000202 long y;
203 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000204 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000205 if (y < 0) {
206 PyErr_SetString(PyExc_OverflowError,
207 "unsigned int is less than minimum");
208 return -1;
209 }
210 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000211
Guido van Rossum549ab711997-01-03 19:09:47 +0000212 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000213 if (x > UINT_MAX) {
214 PyErr_SetString(PyExc_OverflowError,
215 "unsigned int is greater than maximum");
216 return -1;
217 }
218
Guido van Rossum549ab711997-01-03 19:09:47 +0000219 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000220 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000221 return 0;
222}
223
224static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000225l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000226{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000227 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000228}
229
230static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000231l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000232{
233 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000234 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000235 return -1;
236 if (i >= 0)
237 ((long *)ap->ob_item)[i] = x;
238 return 0;
239}
240
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000241static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000242LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000243{
244 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
245}
246
247static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000248LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000249{
250 unsigned long x;
251 if (PyLong_Check(v)) {
252 x = PyLong_AsUnsignedLong(v);
253 if (x == (unsigned long) -1 && PyErr_Occurred())
254 return -1;
255 }
256 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000257 long y;
258 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000259 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000260 if (y < 0) {
261 PyErr_SetString(PyExc_OverflowError,
262 "unsigned long is less than minimum");
263 return -1;
264 }
265 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000266
Guido van Rossum549ab711997-01-03 19:09:47 +0000267 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000268 if (x > ULONG_MAX) {
269 PyErr_SetString(PyExc_OverflowError,
270 "unsigned long is greater than maximum");
271 return -1;
272 }
Tim Petersbb307342000-09-10 05:22:54 +0000273
Guido van Rossum549ab711997-01-03 19:09:47 +0000274 if (i >= 0)
275 ((unsigned long *)ap->ob_item)[i] = x;
276 return 0;
277}
278
279static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000280f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000281{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000282 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000283}
284
285static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000286f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000287{
288 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000289 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000290 return -1;
291 if (i >= 0)
292 ((float *)ap->ob_item)[i] = x;
293 return 0;
294}
295
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000296static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000297d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000298{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000299 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000300}
301
302static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000303d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000304{
305 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000307 return -1;
308 if (i >= 0)
309 ((double *)ap->ob_item)[i] = x;
310 return 0;
311}
312
313/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000314static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000315 {'c', sizeof(char), c_getitem, c_setitem},
316 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000317 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000318 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000319 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000320 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000321 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000322 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000323 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000324 {'f', sizeof(float), f_getitem, f_setitem},
325 {'d', sizeof(double), d_getitem, d_setitem},
326 {'\0', 0, 0, 0} /* Sentinel */
327};
Tim Petersbb307342000-09-10 05:22:54 +0000328
329/****************************************************************************
330Implementations of array object methods.
331****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000332
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000333static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000334newarrayobject(int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000335{
Guido van Rossum778983b1993-02-19 15:55:02 +0000336 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000337 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000338 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000339 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000340 return NULL;
341 }
342 nbytes = size * descr->itemsize;
343 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000344 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000345 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000346 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000347 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000348 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000349 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000350 }
351 if (size <= 0) {
352 op->ob_item = NULL;
353 }
354 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000355 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000356 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000357 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000358 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000359 }
360 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000361 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000362 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000363}
364
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000365static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000366getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000367{
368 register arrayobject *ap;
Tim Petersbb307342000-09-10 05:22:54 +0000369 assert(is_arrayobject(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000370 ap = (arrayobject *)op;
371 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000372 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000373 return NULL;
374 }
375 return (*ap->ob_descr->getitem)(ap, i);
376}
377
378static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000379ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000380{
Guido van Rossum778983b1993-02-19 15:55:02 +0000381 char *items;
382 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000383 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000384 return -1;
385 }
386 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
387 return -1;
388 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000389 PyMem_RESIZE(items, char,
390 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000391 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000392 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000393 return -1;
394 }
395 if (where < 0)
396 where = 0;
397 if (where > self->ob_size)
398 where = self->ob_size;
399 memmove(items + (where+1)*self->ob_descr->itemsize,
400 items + where*self->ob_descr->itemsize,
401 (self->ob_size-where)*self->ob_descr->itemsize);
402 self->ob_item = items;
403 self->ob_size++;
404 return (*self->ob_descr->setitem)(self, where, v);
405}
406
Guido van Rossum778983b1993-02-19 15:55:02 +0000407/* Methods */
408
409static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000410array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000411{
Guido van Rossum778983b1993-02-19 15:55:02 +0000412 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000413 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000414 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000415}
416
417static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000418array_compare(arrayobject *v, arrayobject *w)
Guido van Rossum778983b1993-02-19 15:55:02 +0000419{
420 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
421 int i;
422 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000423 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000424 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000425 ai = getarrayitem((PyObject *)v, i);
426 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000427 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000428 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000429 else
430 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000431 Py_XDECREF(ai);
432 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000433 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 }
436 return v->ob_size - w->ob_size;
437}
438
439static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000440array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000441{
442 return a->ob_size;
443}
444
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000445static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000446array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000447{
448 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000450 return NULL;
451 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000452 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000453}
454
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000455static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000456array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000457{
458 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000459 if (ilow < 0)
460 ilow = 0;
461 else if (ilow > a->ob_size)
462 ilow = a->ob_size;
463 if (ihigh < 0)
464 ihigh = 0;
465 if (ihigh < ilow)
466 ihigh = ilow;
467 else if (ihigh > a->ob_size)
468 ihigh = a->ob_size;
469 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
470 if (np == NULL)
471 return NULL;
472 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
473 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000474 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000475}
476
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000477static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000478array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000479{
480 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000481 arrayobject *np;
482 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000483 PyErr_Format(PyExc_TypeError,
484 "can only append array (not \"%.200s\") to array",
485 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000486 return NULL;
487 }
488#define b ((arrayobject *)bb)
489 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000490 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000491 return NULL;
492 }
493 size = a->ob_size + b->ob_size;
494 np = (arrayobject *) newarrayobject(size, a->ob_descr);
495 if (np == NULL) {
496 return NULL;
497 }
498 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
499 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000500 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000501 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000502#undef b
503}
504
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000505static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000506array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000507{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000508 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000509 int size;
510 arrayobject *np;
511 char *p;
512 int nbytes;
513 if (n < 0)
514 n = 0;
515 size = a->ob_size * n;
516 np = (arrayobject *) newarrayobject(size, a->ob_descr);
517 if (np == NULL)
518 return NULL;
519 p = np->ob_item;
520 nbytes = a->ob_size * a->ob_descr->itemsize;
521 for (i = 0; i < n; i++) {
522 memcpy(p, a->ob_item, nbytes);
523 p += nbytes;
524 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000525 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000526}
527
528static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000529array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000530{
531 char *item;
532 int n; /* Size of replacement array */
533 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000534#define b ((arrayobject *)v)
535 if (v == NULL)
536 n = 0;
537 else if (is_arrayobject(v)) {
538 n = b->ob_size;
539 if (a == b) {
540 /* Special case "a[i:j] = a" -- copy b first */
541 int ret;
542 v = array_slice(b, 0, n);
543 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000544 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000545 return ret;
546 }
547 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000548 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000549 return -1;
550 }
551 }
552 else {
Fred Drake137507e2000-06-01 02:02:46 +0000553 PyErr_Format(PyExc_TypeError,
554 "can only assign array (not \"%.200s\") to array slice",
555 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000556 return -1;
557 }
558 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;
568 item = a->ob_item;
569 d = n - (ihigh-ilow);
570 if (d < 0) { /* Delete -d items */
571 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
572 item + ihigh*a->ob_descr->itemsize,
573 (a->ob_size-ihigh)*a->ob_descr->itemsize);
574 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000575 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000576 /* Can't fail */
577 a->ob_item = item;
578 }
579 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000580 PyMem_RESIZE(item, char,
581 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000582 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000583 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000584 return -1;
585 }
586 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
587 item + ihigh*a->ob_descr->itemsize,
588 (a->ob_size-ihigh)*a->ob_descr->itemsize);
589 a->ob_item = item;
590 a->ob_size += d;
591 }
592 if (n > 0)
593 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
594 n*b->ob_descr->itemsize);
595 return 0;
596#undef b
597}
598
599static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000600array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000601{
602 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000603 PyErr_SetString(PyExc_IndexError,
604 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000605 return -1;
606 }
607 if (v == NULL)
608 return array_ass_slice(a, i, i+1, v);
609 return (*a->ob_descr->setitem)(a, i, v);
610}
611
612static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000613setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000614{
Tim Petersbb307342000-09-10 05:22:54 +0000615 assert(is_arrayobject(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000616 return array_ass_item((arrayobject *)a, i, v);
617}
618
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000619static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000620ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000621{
622 if (ins1(self, where, v) != 0)
623 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000624 Py_INCREF(Py_None);
625 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000626}
627
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628static PyObject *
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000629array_count(arrayobject *self, PyObject *args)
630{
631 int count = 0;
632 int i;
633 PyObject *v;
634
635 if (!PyArg_ParseTuple(args, "O:count", &v))
636 return NULL;
637 for (i = 0; i < self->ob_size; i++) {
638 PyObject *selfi = getarrayitem((PyObject *)self, i);
639 if (PyObject_Compare(selfi, v) == 0)
640 count++;
641 Py_DECREF(selfi);
642 if (PyErr_Occurred())
643 return NULL;
644 }
645 return PyInt_FromLong((long)count);
646}
647
648static char count_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000649"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000650\n\
651Return number of occurences of x in the array.";
652
653static PyObject *
654array_index(arrayobject *self, PyObject *args)
655{
656 int i;
657 PyObject *v;
658
659 if (!PyArg_ParseTuple(args, "O:index", &v))
660 return NULL;
661 for (i = 0; i < self->ob_size; i++) {
662 PyObject *selfi = getarrayitem((PyObject *)self, i);
663 if (PyObject_Compare(selfi, v) == 0) {
664 Py_DECREF(selfi);
665 return PyInt_FromLong((long)i);
666 }
667 Py_DECREF(selfi);
668 if (PyErr_Occurred())
669 return NULL;
670 }
671 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
672 return NULL;
673}
674
675static char index_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000676"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000677\n\
678Return index of first occurence of x in the array.";
679
680static PyObject *
681array_remove(arrayobject *self, PyObject *args)
682{
683 int i;
684 PyObject *v;
685
686 if (!PyArg_ParseTuple(args, "O:remove", &v))
687 return NULL;
688 for (i = 0; i < self->ob_size; i++) {
689 PyObject *selfi = getarrayitem((PyObject *)self,i);
690 if (PyObject_Compare(selfi, v) == 0) {
691 Py_DECREF(selfi);
692 if (array_ass_slice(self, i, i+1,
693 (PyObject *)NULL) != 0)
694 return NULL;
695 Py_INCREF(Py_None);
696 return Py_None;
697 }
698 Py_DECREF(selfi);
699 if (PyErr_Occurred())
700 return NULL;
701 }
702 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
703 return NULL;
704}
705
706static char remove_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000707"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000708\n\
709Remove the first occurence of x in the array.";
710
711static PyObject *
712array_pop(arrayobject *self, PyObject *args)
713{
714 int i = -1;
715 PyObject *v;
716 if (!PyArg_ParseTuple(args, "|i:pop", &i))
717 return NULL;
718 if (self->ob_size == 0) {
719 /* Special-case most common failure cause */
720 PyErr_SetString(PyExc_IndexError, "pop from empty array");
721 return NULL;
722 }
723 if (i < 0)
724 i += self->ob_size;
725 if (i < 0 || i >= self->ob_size) {
726 PyErr_SetString(PyExc_IndexError, "pop index out of range");
727 return NULL;
728 }
729 v = getarrayitem((PyObject *)self,i);
730 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
731 Py_DECREF(v);
732 return NULL;
733 }
734 return v;
735}
736
737static char pop_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000738"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000739\n\
740Return the i-th element and delete it from the array. i defaults to -1.";
741
742static PyObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000743array_extend(arrayobject *self, PyObject *args)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000744{
745 int size;
746 PyObject *bb;
Tim Petersbb307342000-09-10 05:22:54 +0000747
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000748 if (!PyArg_ParseTuple(args, "O:extend", &bb))
749 return NULL;
Tim Petersbb307342000-09-10 05:22:54 +0000750
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000751 if (!is_arrayobject(bb)) {
752 PyErr_Format(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000753 "can only extend array with array (not \"%.200s\")",
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000754 bb->ob_type->tp_name);
755 return NULL;
756 }
757#define b ((arrayobject *)bb)
758 if (self->ob_descr != b->ob_descr) {
759 PyErr_SetString(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000760 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000761 return NULL;
762 }
763 size = self->ob_size + b->ob_size;
764 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
765 if (self->ob_item == NULL) {
766 PyObject_Del(self);
767 return PyErr_NoMemory();
768 }
769 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
770 b->ob_item, b->ob_size*b->ob_descr->itemsize);
771 self->ob_size = size;
772 Py_INCREF(Py_None);
773 return Py_None;
774#undef b
775}
776
777static char extend_doc [] =
778"extend(array)\n\
779\n\
780 Append array items to the end of the array.";
781
782static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000783array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000784{
785 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000786 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000787 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 return NULL;
789 return ins(self, i, v);
790}
791
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000792static char insert_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000793"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000794\n\
795Insert a new item x into the array before position i.";
796
797
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000798static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000799array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000800{
Tim Peters077a11d2000-09-16 22:31:29 +0000801 PyObject* retval = NULL;
802 if (!PyArg_ParseTuple(args, ":buffer_info"))
803 return NULL;
804 retval = PyTuple_New(2);
805 if (!retval)
806 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +0000807
808 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
809 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
810
811 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000812}
813
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000814static char buffer_info_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000815"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000816\n\
817Return a tuple (address, length) giving the current memory address and\n\
818the length in bytes of the buffer used to hold array's contents.";
819
820
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000821static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000822array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000823{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000824 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000825 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000826 return NULL;
827 return ins(self, (int) self->ob_size, v);
828}
829
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000830static char append_doc [] =
831"append(x)\n\
832\n\
833Append new value x to the end of the array.";
834
835
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000836static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000837array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000838{
839 char *p;
840 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000841
842 if (!PyArg_ParseTuple(args, ":byteswap"))
843 return NULL;
844
Guido van Rossum778983b1993-02-19 15:55:02 +0000845 switch (self->ob_descr->itemsize) {
846 case 1:
847 break;
848 case 2:
849 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
850 char p0 = p[0];
851 p[0] = p[1];
852 p[1] = p0;
853 }
854 break;
855 case 4:
856 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
857 char p0 = p[0];
858 char p1 = p[1];
859 p[0] = p[3];
860 p[1] = p[2];
861 p[2] = p1;
862 p[3] = p0;
863 }
864 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000865 case 8:
866 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
867 char p0 = p[0];
868 char p1 = p[1];
869 char p2 = p[2];
870 char p3 = p[3];
871 p[0] = p[7];
872 p[1] = p[6];
873 p[2] = p[5];
874 p[3] = p[4];
875 p[4] = p3;
876 p[5] = p2;
877 p[6] = p1;
878 p[7] = p0;
879 }
880 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000881 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000883 "don't know how to byteswap this array type");
884 return NULL;
885 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000886 Py_INCREF(Py_None);
887 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000888}
889
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000890static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000891"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000892\n\
Fred Drakebf272981999-12-03 17:15:30 +0000893Byteswap all items of the array. If the items in the array are not 1, 2,\n\
8944, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000895
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000896static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000897array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000898{
Guido van Rossume77a7571993-11-03 15:01:26 +0000899 register int itemsize = self->ob_descr->itemsize;
900 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +0000901 /* little buffer to hold items while swapping */
902 char tmp[256]; /* 8 is probably enough -- but why skimp */
903 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +0000904
Tim Peters077a11d2000-09-16 22:31:29 +0000905 if (!PyArg_ParseTuple(args, ":reverse"))
906 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000907
908 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000909 for (p = self->ob_item,
910 q = self->ob_item + (self->ob_size - 1)*itemsize;
911 p < q;
912 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +0000913 /* memory areas guaranteed disjoint, so memcpy
914 * is safe (& memmove may be slower).
915 */
916 memcpy(tmp, p, itemsize);
917 memcpy(p, q, itemsize);
918 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000919 }
920 }
Tim Petersbb307342000-09-10 05:22:54 +0000921
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000922 Py_INCREF(Py_None);
923 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000924}
Guido van Rossume77a7571993-11-03 15:01:26 +0000925
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000926static char reverse_doc [] =
927"reverse()\n\
928\n\
929Reverse the order of the items in the array.";
930
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000931static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000932array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000933{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000934 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000935 int n;
936 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000937 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000938 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000939 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000940 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000941 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000942 return NULL;
943 }
944 if (n > 0) {
945 char *item = self->ob_item;
946 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000947 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000948 int newlength;
949 size_t newbytes;
950 /* Be careful here about overflow */
951 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000952 (newbytes = newlength * itemsize) / itemsize !=
953 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000954 goto nomem;
955 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000956 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000957 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000958 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000959 return NULL;
960 }
961 self->ob_item = item;
962 self->ob_size += n;
963 nread = fread(item + (self->ob_size - n) * itemsize,
964 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000965 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000966 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000968 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000969 PyErr_SetString(PyExc_EOFError,
970 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000971 return NULL;
972 }
973 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000974 Py_INCREF(Py_None);
975 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000976}
977
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000978static char fromfile_doc [] =
979"fromfile(f, n)\n\
980\n\
981Read n objects from the file object f and append them to the end of the\n\
982array. Also called as read.";
983
984
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000985static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000986array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000987{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000988 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000989 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000990 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +0000991 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000992 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000993 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000994 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000995 return NULL;
996 }
997 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +0000998 if (fwrite(self->ob_item, self->ob_descr->itemsize,
999 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001000 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 clearerr(fp);
1002 return NULL;
1003 }
1004 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001005 Py_INCREF(Py_None);
1006 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001007}
1008
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001009static char tofile_doc [] =
1010"tofile(f)\n\
1011\n\
1012Write all items (as machine values) to the file object f. Also called as\n\
1013write.";
1014
1015
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001017array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001018{
1019 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001020 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001021 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001022 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001023 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001024 if (!PyList_Check(list)) {
1025 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001026 return NULL;
1027 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001028 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001029 if (n > 0) {
1030 char *item = self->ob_item;
1031 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 return NULL;
1036 }
1037 self->ob_item = item;
1038 self->ob_size += n;
1039 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001040 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001041 if ((*self->ob_descr->setitem)(self,
1042 self->ob_size - n + i, v) != 0) {
1043 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001044 PyMem_RESIZE(item, char,
1045 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001046 self->ob_item = item;
1047 return NULL;
1048 }
1049 }
1050 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001051 Py_INCREF(Py_None);
1052 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001053}
1054
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001055static char fromlist_doc [] =
1056"fromlist(list)\n\
1057\n\
1058Append items to array from list.";
1059
1060
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001061static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001062array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001063{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001064 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001065 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001066 if (!PyArg_ParseTuple(args, ":tolist"))
1067 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 if (list == NULL)
1069 return NULL;
1070 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001071 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001072 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001073 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 return NULL;
1075 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001076 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001077 }
1078 return list;
1079}
1080
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001081static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001082"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001083\n\
1084Convert array to an ordinary list with the same items.";
1085
1086
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001087static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001088array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001089{
1090 char *str;
1091 int n;
1092 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001093 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001094 return NULL;
1095 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001096 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001097 "string length not a multiple of item size");
1098 return NULL;
1099 }
1100 n = n / itemsize;
1101 if (n > 0) {
1102 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001103 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001104 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001105 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001106 return NULL;
1107 }
1108 self->ob_item = item;
1109 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001110 memcpy(item + (self->ob_size - n) * itemsize,
1111 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001112 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001113 Py_INCREF(Py_None);
1114 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001115}
1116
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001117static char fromstring_doc [] =
1118"fromstring(string)\n\
1119\n\
1120Appends items from the string, interpreting it as an array of machine\n\
1121values,as if it had been read from a file using the fromfile() method).";
1122
1123
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001124static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001125array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001126{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001127 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001128 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001130 self->ob_size * self->ob_descr->itemsize);
1131}
1132
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001133static char tostring_doc [] =
1134"tostring() -> string\n\
1135\n\
1136Convert the array to an array of machine values and return the string\n\
1137representation.";
1138
1139PyMethodDef array_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001140 {"append", (PyCFunction)array_append, METH_VARARGS, append_doc},
1141 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS, buffer_info_doc},
1142 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS, byteswap_doc},
1143 {"count", (PyCFunction)array_count, METH_VARARGS, count_doc},
1144 {"extend", (PyCFunction)array_extend, METH_VARARGS, extend_doc},
1145 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1146 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS, fromlist_doc},
1147 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc},
1148 {"index", (PyCFunction)array_index, METH_VARARGS, index_doc},
1149 {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc},
1150 {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc},
1151 {"read", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1152 {"remove", (PyCFunction)array_remove, METH_VARARGS, remove_doc},
1153 {"reverse", (PyCFunction)array_reverse, METH_VARARGS, reverse_doc},
1154/* {"sort", (PyCFunction)array_sort, METH_VARARGS, sort_doc},*/
1155 {"tofile", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
1156 {"tolist", (PyCFunction)array_tolist, METH_VARARGS, tolist_doc},
1157 {"tostring", (PyCFunction)array_tostring, METH_VARARGS, tostring_doc},
1158 {"write", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001159 {NULL, NULL} /* sentinel */
1160};
1161
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001162static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001163array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001164{
1165 if (strcmp(name, "typecode") == 0) {
1166 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001168 }
1169 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001170 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001171 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001172 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001173 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001174 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001175 PyList_SetItem(list, 0,
1176 PyString_FromString("typecode"));
1177 PyList_SetItem(list, 1,
1178 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001179 if (PyErr_Occurred()) {
1180 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001181 list = NULL;
1182 }
1183 }
1184 return list;
1185 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001186 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001187}
1188
1189static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001190array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001191{
1192 int ok = 0;
1193 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001194 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001195 len = a->ob_size;
1196 if (len == 0) {
1197 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1198 return ok;
1199 }
1200 if (a->ob_descr->typecode == 'c') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001201 PyObject *t_empty = PyTuple_New(0);
Guido van Rossum778983b1993-02-19 15:55:02 +00001202 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001203 v = array_tostring(a, t_empty);
Tim Peters7c1cb462000-11-10 19:04:19 +00001204 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001205 ok = PyObject_Print(v, fp, 0);
1206 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001207 fprintf(fp, ")");
1208 return ok;
1209 }
1210 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1211 for (i = 0; i < len && ok == 0; i++) {
1212 if (i > 0)
1213 fprintf(fp, ", ");
1214 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001215 ok = PyObject_Print(v, fp, 0);
1216 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001217 }
1218 fprintf(fp, "])");
1219 return ok;
1220}
1221
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001222static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001223array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001224{
1225 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001226 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001227 int i, len;
1228 len = a->ob_size;
1229 if (len == 0) {
1230 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232 }
1233 if (a->ob_descr->typecode == 'c') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001234 PyObject *t_empty = PyTuple_New(0);
Guido van Rossum778983b1993-02-19 15:55:02 +00001235 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001236 s = PyString_FromString(buf);
Tim Peters7c1cb462000-11-10 19:04:19 +00001237 v = array_tostring(a, t_empty);
1238 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001239 t = PyObject_Repr(v);
1240 Py_XDECREF(v);
1241 PyString_ConcatAndDel(&s, t);
1242 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001243 return s;
1244 }
1245 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001246 s = PyString_FromString(buf);
1247 comma = PyString_FromString(", ");
1248 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001249 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001252 t = PyObject_Repr(v);
1253 Py_XDECREF(v);
1254 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001255 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001256 Py_XDECREF(comma);
1257 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001258 return s;
1259}
1260
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001261static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001262array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001263{
1264 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001265 PyErr_SetString(PyExc_SystemError,
1266 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001267 return -1;
1268 }
1269 *ptr = (void *)self->ob_item;
1270 return self->ob_size*self->ob_descr->itemsize;
1271}
1272
1273static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001274array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001275{
1276 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001277 PyErr_SetString(PyExc_SystemError,
1278 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001279 return -1;
1280 }
1281 *ptr = (void *)self->ob_item;
1282 return self->ob_size*self->ob_descr->itemsize;
1283}
1284
1285static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001286array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001287{
1288 if ( lenp )
1289 *lenp = self->ob_size*self->ob_descr->itemsize;
1290 return 1;
1291}
1292
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001294 (inquiry)array_length, /*sq_length*/
1295 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001296 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001297 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001298 (intintargfunc)array_slice, /*sq_slice*/
1299 (intobjargproc)array_ass_item, /*sq_ass_item*/
1300 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001301};
1302
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001303static PyBufferProcs array_as_buffer = {
1304 (getreadbufferproc)array_buffer_getreadbuf,
1305 (getwritebufferproc)array_buffer_getwritebuf,
1306 (getsegcountproc)array_buffer_getsegcount,
1307};
1308
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001309static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001310a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001311{
1312 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001313 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001314 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001315 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001316 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001317 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001318 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001319 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1320 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001321 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 return NULL;
1323 }
1324 }
1325 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1326 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001327 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001328 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001329 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001330 len = 0;
1331 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001332 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001333 a = newarrayobject(len, descr);
1334 if (a == NULL)
1335 return NULL;
1336 if (len > 0) {
1337 int i;
1338 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001339 PyObject *v =
1340 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001341 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001342 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 return NULL;
1344 }
1345 }
1346 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347 if (initial != NULL && PyString_Check(initial)) {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001348 PyObject *t_initial = Py_BuildValue("(O)", initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 PyObject *v =
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001350 array_fromstring((arrayobject *)a, t_initial);
1351 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001352 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001353 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001354 return NULL;
1355 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001356 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001357 }
1358 return a;
1359 }
1360 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001361 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001362 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 return NULL;
1364}
1365
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001366static char a_array_doc [] =
1367"array(typecode [, initializer]) -> array\n\
1368\n\
1369Return a new array whose items are restricted by typecode, and\n\
1370initialized from the optional initializer value, which must be a list\n\
1371or a string.";
1372
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001373static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001374 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001375 {NULL, NULL} /* sentinel */
1376};
1377
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001378static char module_doc [] =
1379"This module defines a new object type which can efficiently represent\n\
1380an array of basic values: characters, integers, floating point\n\
1381numbers. Arrays are sequence types and behave very much like lists,\n\
1382except that the type of objects stored in them is constrained. The\n\
1383type is specified at object creation time by using a type code, which\n\
1384is a single character. The following type codes are defined:\n\
1385\n\
1386 Type code C Type Minimum size in bytes \n\
1387 'c' character 1 \n\
1388 'b' signed integer 1 \n\
1389 'B' unsigned integer 1 \n\
1390 'h' signed integer 2 \n\
1391 'H' unsigned integer 2 \n\
1392 'i' signed integer 2 \n\
1393 'I' unsigned integer 2 \n\
1394 'l' signed integer 4 \n\
1395 'L' unsigned integer 4 \n\
1396 'f' floating point 4 \n\
1397 'd' floating point 8 \n\
1398\n\
1399Functions:\n\
1400\n\
1401array(typecode [, initializer]) -- create a new array\n\
1402\n\
1403Special Objects:\n\
1404\n\
1405ArrayType -- type object for array objects\n\
1406";
1407
1408static char arraytype_doc [] =
1409"An array represents basic values and behave very much like lists, except\n\
1410the type of objects stored in them is constrained.\n\
1411\n\
1412Methods:\n\
1413\n\
1414append() -- append a new item to the end of the array\n\
1415buffer_info() -- return information giving the current memory info\n\
1416byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001417count() -- return number of occurences of an object\n\
1418extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001419fromfile() -- read items from a file object\n\
1420fromlist() -- append items from the list\n\
1421fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001422index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001423insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001424pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001425read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001426remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001427reverse() -- reverse the order of the items in the array\n\
1428tofile() -- write all items to a file object\n\
1429tolist() -- return the array converted to an ordinary list\n\
1430tostring() -- return the array converted to a string\n\
1431write() -- DEPRECATED, use tofile()\n\
1432\n\
1433Variables:\n\
1434\n\
1435typecode -- the typecode character used to create the array\n\
1436itemsize -- the length in bytes of one array item\n\
1437";
1438
1439statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001440 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001441 0,
1442 "array",
1443 sizeof(arrayobject),
1444 0,
1445 (destructor)array_dealloc, /*tp_dealloc*/
1446 (printfunc)array_print, /*tp_print*/
1447 (getattrfunc)array_getattr, /*tp_getattr*/
1448 0, /*tp_setattr*/
1449 (cmpfunc)array_compare, /*tp_compare*/
1450 (reprfunc)array_repr, /*tp_repr*/
1451 0, /*tp_as_number*/
1452 &array_as_sequence, /*tp_as_sequence*/
1453 0, /*tp_as_mapping*/
1454 0, /*tp_hash*/
1455 0, /*tp_call*/
1456 0, /*tp_str*/
1457 0, /*tp_getattro*/
1458 0, /*tp_setattro*/
1459 &array_as_buffer, /*tp_as_buffer*/
1460 0, /*tp_xxx4*/
1461 arraytype_doc, /*tp_doc*/
1462};
1463
Guido van Rossum3886bb61998-12-04 18:50:17 +00001464DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001465initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001466{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001467 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001468
1469 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001470 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001471 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001472 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1473 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001474}