blob: edc2f0bec3433d1ac7b98eb447a1bf850d7f935a [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
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000417static PyObject *
418array_richcompare(PyObject *v, PyObject *w, int op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000419{
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000420 arrayobject *va, *wa;
421 PyObject *vi = NULL;
422 PyObject *wi = NULL;
423 int i, k;
424 PyObject *res;
425
426 if (!is_arrayobject(v) || !is_arrayobject(w)) {
427 Py_INCREF(Py_NotImplemented);
428 return Py_NotImplemented;
Guido van Rossum778983b1993-02-19 15:55:02 +0000429 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000430
431 va = (arrayobject *)v;
432 wa = (arrayobject *)w;
433
434 if (va->ob_size != wa->ob_size && (op == Py_EQ || op == Py_NE)) {
435 /* Shortcut: if the lengths differ, the arrays differ */
436 if (op == Py_EQ)
437 res = Py_False;
438 else
439 res = Py_True;
440 Py_INCREF(res);
441 return res;
442 }
443
444 /* Search for the first index where items are different */
445 k = 1;
446 for (i = 0; i < va->ob_size && i < wa->ob_size; i++) {
447 vi = getarrayitem(v, i);
448 wi = getarrayitem(w, i);
449 if (vi == NULL || wi == NULL) {
450 Py_XDECREF(vi);
451 Py_XDECREF(wi);
452 return NULL;
453 }
454 k = PyObject_RichCompareBool(vi, wi, Py_EQ);
455 if (k == 0)
456 break; /* Keeping vi and wi alive! */
457 Py_DECREF(vi);
458 Py_DECREF(wi);
459 if (k < 0)
460 return NULL;
461 }
462
463 if (k) {
464 /* No more items to compare -- compare sizes */
465 int vs = va->ob_size;
466 int ws = wa->ob_size;
467 int cmp;
468 switch (op) {
469 case Py_LT: cmp = vs < ws; break;
Guido van Rossum2b597e42001-01-25 22:12:43 +0000470 case Py_LE: cmp = vs <= ws; break;
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000471 case Py_EQ: cmp = vs == ws; break;
472 case Py_NE: cmp = vs != ws; break;
473 case Py_GT: cmp = vs > ws; break;
474 case Py_GE: cmp = vs >= ws; break;
475 default: return NULL; /* cannot happen */
476 }
477 if (cmp)
478 res = Py_True;
479 else
480 res = Py_False;
481 Py_INCREF(res);
482 return res;
483 }
484
485 /* We have an item that differs. First, shortcuts for EQ/NE */
486 if (op == Py_EQ) {
487 Py_INCREF(Py_False);
488 res = Py_False;
489 }
490 else if (op == Py_NE) {
491 Py_INCREF(Py_True);
492 res = Py_True;
493 }
494 else {
495 /* Compare the final item again using the proper operator */
496 res = PyObject_RichCompare(vi, wi, op);
497 }
498 Py_DECREF(vi);
499 Py_DECREF(wi);
500 return res;
Guido van Rossum778983b1993-02-19 15:55:02 +0000501}
502
503static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000504array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000505{
506 return a->ob_size;
507}
508
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000509static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000510array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000511{
512 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000513 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000514 return NULL;
515 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000516 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000517}
518
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000519static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000520array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000521{
522 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000523 if (ilow < 0)
524 ilow = 0;
525 else if (ilow > a->ob_size)
526 ilow = a->ob_size;
527 if (ihigh < 0)
528 ihigh = 0;
529 if (ihigh < ilow)
530 ihigh = ilow;
531 else if (ihigh > a->ob_size)
532 ihigh = a->ob_size;
533 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
534 if (np == NULL)
535 return NULL;
536 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
537 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000538 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000539}
540
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000541static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000542array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000543{
544 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000545 arrayobject *np;
546 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000547 PyErr_Format(PyExc_TypeError,
548 "can only append array (not \"%.200s\") to array",
549 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000550 return NULL;
551 }
552#define b ((arrayobject *)bb)
553 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000554 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000555 return NULL;
556 }
557 size = a->ob_size + b->ob_size;
558 np = (arrayobject *) newarrayobject(size, a->ob_descr);
559 if (np == NULL) {
560 return NULL;
561 }
562 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
563 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000564 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000565 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000566#undef b
567}
568
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000569static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000570array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000571{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000572 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000573 int size;
574 arrayobject *np;
575 char *p;
576 int nbytes;
577 if (n < 0)
578 n = 0;
579 size = a->ob_size * n;
580 np = (arrayobject *) newarrayobject(size, a->ob_descr);
581 if (np == NULL)
582 return NULL;
583 p = np->ob_item;
584 nbytes = a->ob_size * a->ob_descr->itemsize;
585 for (i = 0; i < n; i++) {
586 memcpy(p, a->ob_item, nbytes);
587 p += nbytes;
588 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000589 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000590}
591
592static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000593array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000594{
595 char *item;
596 int n; /* Size of replacement array */
597 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000598#define b ((arrayobject *)v)
599 if (v == NULL)
600 n = 0;
601 else if (is_arrayobject(v)) {
602 n = b->ob_size;
603 if (a == b) {
604 /* Special case "a[i:j] = a" -- copy b first */
605 int ret;
606 v = array_slice(b, 0, n);
607 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000608 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000609 return ret;
610 }
611 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000612 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000613 return -1;
614 }
615 }
616 else {
Fred Drake137507e2000-06-01 02:02:46 +0000617 PyErr_Format(PyExc_TypeError,
618 "can only assign array (not \"%.200s\") to array slice",
619 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000620 return -1;
621 }
622 if (ilow < 0)
623 ilow = 0;
624 else if (ilow > a->ob_size)
625 ilow = a->ob_size;
626 if (ihigh < 0)
627 ihigh = 0;
628 if (ihigh < ilow)
629 ihigh = ilow;
630 else if (ihigh > a->ob_size)
631 ihigh = a->ob_size;
632 item = a->ob_item;
633 d = n - (ihigh-ilow);
634 if (d < 0) { /* Delete -d items */
635 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
636 item + ihigh*a->ob_descr->itemsize,
637 (a->ob_size-ihigh)*a->ob_descr->itemsize);
638 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000639 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000640 /* Can't fail */
641 a->ob_item = item;
642 }
643 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000644 PyMem_RESIZE(item, char,
645 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000646 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000647 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return -1;
649 }
650 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
651 item + ihigh*a->ob_descr->itemsize,
652 (a->ob_size-ihigh)*a->ob_descr->itemsize);
653 a->ob_item = item;
654 a->ob_size += d;
655 }
656 if (n > 0)
657 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
658 n*b->ob_descr->itemsize);
659 return 0;
660#undef b
661}
662
663static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000664array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000665{
666 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667 PyErr_SetString(PyExc_IndexError,
668 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000669 return -1;
670 }
671 if (v == NULL)
672 return array_ass_slice(a, i, i+1, v);
673 return (*a->ob_descr->setitem)(a, i, v);
674}
675
676static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000677setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000678{
Tim Petersbb307342000-09-10 05:22:54 +0000679 assert(is_arrayobject(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000680 return array_ass_item((arrayobject *)a, i, v);
681}
682
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000683static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000684ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000685{
686 if (ins1(self, where, v) != 0)
687 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000688 Py_INCREF(Py_None);
689 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000690}
691
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000692static PyObject *
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000693array_count(arrayobject *self, PyObject *args)
694{
695 int count = 0;
696 int i;
697 PyObject *v;
698
699 if (!PyArg_ParseTuple(args, "O:count", &v))
700 return NULL;
701 for (i = 0; i < self->ob_size; i++) {
702 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000703 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000704 Py_DECREF(selfi);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000705 if (cmp > 0)
706 count++;
707 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000708 return NULL;
709 }
710 return PyInt_FromLong((long)count);
711}
712
713static char count_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000714"count(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000715\n\
716Return number of occurences of x in the array.";
717
718static PyObject *
719array_index(arrayobject *self, PyObject *args)
720{
721 int i;
722 PyObject *v;
723
724 if (!PyArg_ParseTuple(args, "O:index", &v))
725 return NULL;
726 for (i = 0; i < self->ob_size; i++) {
727 PyObject *selfi = getarrayitem((PyObject *)self, i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000728 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
729 Py_DECREF(selfi);
730 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000731 return PyInt_FromLong((long)i);
732 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000733 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000734 return NULL;
735 }
736 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
737 return NULL;
738}
739
740static char index_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000741"index(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000742\n\
743Return index of first occurence of x in the array.";
744
745static PyObject *
746array_remove(arrayobject *self, PyObject *args)
747{
748 int i;
749 PyObject *v;
750
751 if (!PyArg_ParseTuple(args, "O:remove", &v))
752 return NULL;
753 for (i = 0; i < self->ob_size; i++) {
754 PyObject *selfi = getarrayitem((PyObject *)self,i);
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000755 int cmp = PyObject_RichCompareBool(selfi, v, Py_EQ);
756 Py_DECREF(selfi);
757 if (cmp > 0) {
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000758 if (array_ass_slice(self, i, i+1,
759 (PyObject *)NULL) != 0)
760 return NULL;
761 Py_INCREF(Py_None);
762 return Py_None;
763 }
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000764 else if (cmp < 0)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000765 return NULL;
766 }
767 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
768 return NULL;
769}
770
771static char remove_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000772"remove(x)\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000773\n\
774Remove the first occurence of x in the array.";
775
776static PyObject *
777array_pop(arrayobject *self, PyObject *args)
778{
779 int i = -1;
780 PyObject *v;
781 if (!PyArg_ParseTuple(args, "|i:pop", &i))
782 return NULL;
783 if (self->ob_size == 0) {
784 /* Special-case most common failure cause */
785 PyErr_SetString(PyExc_IndexError, "pop from empty array");
786 return NULL;
787 }
788 if (i < 0)
789 i += self->ob_size;
790 if (i < 0 || i >= self->ob_size) {
791 PyErr_SetString(PyExc_IndexError, "pop index out of range");
792 return NULL;
793 }
794 v = getarrayitem((PyObject *)self,i);
795 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
796 Py_DECREF(v);
797 return NULL;
798 }
799 return v;
800}
801
802static char pop_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000803"pop([i])\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000804\n\
805Return the i-th element and delete it from the array. i defaults to -1.";
806
807static PyObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000808array_extend(arrayobject *self, PyObject *args)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000809{
810 int size;
811 PyObject *bb;
Tim Petersbb307342000-09-10 05:22:54 +0000812
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000813 if (!PyArg_ParseTuple(args, "O:extend", &bb))
814 return NULL;
Tim Petersbb307342000-09-10 05:22:54 +0000815
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000816 if (!is_arrayobject(bb)) {
817 PyErr_Format(PyExc_TypeError,
Guido van Rossum9d19cb82001-01-18 01:02:55 +0000818 "can only extend array with array (not \"%.200s\")",
819 bb->ob_type->tp_name);
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000820 return NULL;
821 }
822#define b ((arrayobject *)bb)
823 if (self->ob_descr != b->ob_descr) {
824 PyErr_SetString(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000825 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000826 return NULL;
827 }
828 size = self->ob_size + b->ob_size;
829 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
830 if (self->ob_item == NULL) {
831 PyObject_Del(self);
832 return PyErr_NoMemory();
833 }
834 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
835 b->ob_item, b->ob_size*b->ob_descr->itemsize);
836 self->ob_size = size;
837 Py_INCREF(Py_None);
838 return Py_None;
839#undef b
840}
841
842static char extend_doc [] =
843"extend(array)\n\
844\n\
845 Append array items to the end of the array.";
846
847static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000848array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000849{
850 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000851 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000852 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000853 return NULL;
854 return ins(self, i, v);
855}
856
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000857static char insert_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000858"insert(i,x)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000859\n\
860Insert a new item x into the array before position i.";
861
862
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000863static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000864array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000865{
Tim Peters077a11d2000-09-16 22:31:29 +0000866 PyObject* retval = NULL;
867 if (!PyArg_ParseTuple(args, ":buffer_info"))
868 return NULL;
869 retval = PyTuple_New(2);
870 if (!retval)
871 return NULL;
Fred Drake541dc3b2000-06-28 17:49:30 +0000872
873 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
874 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
875
876 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000877}
878
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000879static char buffer_info_doc [] =
Tim Peters077a11d2000-09-16 22:31:29 +0000880"buffer_info() -> (address, length)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000881\n\
882Return a tuple (address, length) giving the current memory address and\n\
883the length in bytes of the buffer used to hold array's contents.";
884
885
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000886static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000887array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000888{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000889 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000890 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000891 return NULL;
892 return ins(self, (int) self->ob_size, v);
893}
894
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000895static char append_doc [] =
896"append(x)\n\
897\n\
898Append new value x to the end of the array.";
899
900
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000901static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000902array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000903{
904 char *p;
905 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000906
907 if (!PyArg_ParseTuple(args, ":byteswap"))
908 return NULL;
909
Guido van Rossum778983b1993-02-19 15:55:02 +0000910 switch (self->ob_descr->itemsize) {
911 case 1:
912 break;
913 case 2:
914 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
915 char p0 = p[0];
916 p[0] = p[1];
917 p[1] = p0;
918 }
919 break;
920 case 4:
921 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
922 char p0 = p[0];
923 char p1 = p[1];
924 p[0] = p[3];
925 p[1] = p[2];
926 p[2] = p1;
927 p[3] = p0;
928 }
929 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000930 case 8:
931 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
932 char p0 = p[0];
933 char p1 = p[1];
934 char p2 = p[2];
935 char p3 = p[3];
936 p[0] = p[7];
937 p[1] = p[6];
938 p[2] = p[5];
939 p[3] = p[4];
940 p[4] = p3;
941 p[5] = p2;
942 p[6] = p1;
943 p[7] = p0;
944 }
945 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000946 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000947 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000948 "don't know how to byteswap this array type");
949 return NULL;
950 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000951 Py_INCREF(Py_None);
952 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000953}
954
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000955static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000956"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000957\n\
Fred Drakebf272981999-12-03 17:15:30 +0000958Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9594, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000960
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000961static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000962array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000963{
Guido van Rossume77a7571993-11-03 15:01:26 +0000964 register int itemsize = self->ob_descr->itemsize;
965 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +0000966 /* little buffer to hold items while swapping */
967 char tmp[256]; /* 8 is probably enough -- but why skimp */
968 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +0000969
Tim Peters077a11d2000-09-16 22:31:29 +0000970 if (!PyArg_ParseTuple(args, ":reverse"))
971 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000972
973 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000974 for (p = self->ob_item,
975 q = self->ob_item + (self->ob_size - 1)*itemsize;
976 p < q;
977 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +0000978 /* memory areas guaranteed disjoint, so memcpy
979 * is safe (& memmove may be slower).
980 */
981 memcpy(tmp, p, itemsize);
982 memcpy(p, q, itemsize);
983 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000984 }
985 }
Tim Petersbb307342000-09-10 05:22:54 +0000986
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000987 Py_INCREF(Py_None);
988 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000989}
Guido van Rossume77a7571993-11-03 15:01:26 +0000990
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000991static char reverse_doc [] =
992"reverse()\n\
993\n\
994Reverse the order of the items in the array.";
995
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000996static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000997array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000998{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000999 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001000 int n;
1001 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001002 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001003 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001004 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001005 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001006 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001007 return NULL;
1008 }
1009 if (n > 0) {
1010 char *item = self->ob_item;
1011 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001012 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001013 int newlength;
1014 size_t newbytes;
1015 /* Be careful here about overflow */
1016 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001017 (newbytes = newlength * itemsize) / itemsize !=
1018 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001019 goto nomem;
1020 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001021 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001022 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001023 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001024 return NULL;
1025 }
1026 self->ob_item = item;
1027 self->ob_size += n;
1028 nread = fread(item + (self->ob_size - n) * itemsize,
1029 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001030 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 PyErr_SetString(PyExc_EOFError,
1035 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001036 return NULL;
1037 }
1038 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001039 Py_INCREF(Py_None);
1040 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001041}
1042
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001043static char fromfile_doc [] =
1044"fromfile(f, n)\n\
1045\n\
1046Read n objects from the file object f and append them to the end of the\n\
1047array. Also called as read.";
1048
1049
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001050static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001051array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001052{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001054 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001055 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001056 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001057 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001058 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001060 return NULL;
1061 }
1062 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001063 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1064 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001065 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001066 clearerr(fp);
1067 return NULL;
1068 }
1069 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001070 Py_INCREF(Py_None);
1071 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001072}
1073
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001074static char tofile_doc [] =
1075"tofile(f)\n\
1076\n\
1077Write all items (as machine values) to the file object f. Also called as\n\
1078write.";
1079
1080
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001081static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001082array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001083{
1084 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001085 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001086 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001087 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001088 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089 if (!PyList_Check(list)) {
1090 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001091 return NULL;
1092 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001093 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001094 if (n > 0) {
1095 char *item = self->ob_item;
1096 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001099 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001100 return NULL;
1101 }
1102 self->ob_item = item;
1103 self->ob_size += n;
1104 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001105 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001106 if ((*self->ob_descr->setitem)(self,
1107 self->ob_size - n + i, v) != 0) {
1108 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001109 PyMem_RESIZE(item, char,
1110 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001111 self->ob_item = item;
1112 return NULL;
1113 }
1114 }
1115 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116 Py_INCREF(Py_None);
1117 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001118}
1119
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001120static char fromlist_doc [] =
1121"fromlist(list)\n\
1122\n\
1123Append items to array from list.";
1124
1125
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001126static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001127array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001128{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001130 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001131 if (!PyArg_ParseTuple(args, ":tolist"))
1132 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001133 if (list == NULL)
1134 return NULL;
1135 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001136 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001137 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001138 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001139 return NULL;
1140 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001141 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001142 }
1143 return list;
1144}
1145
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001146static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001147"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001148\n\
1149Convert array to an ordinary list with the same items.";
1150
1151
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001152static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001153array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001154{
1155 char *str;
1156 int n;
1157 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001158 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001159 return NULL;
1160 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001161 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001162 "string length not a multiple of item size");
1163 return NULL;
1164 }
1165 n = n / itemsize;
1166 if (n > 0) {
1167 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001168 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001170 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001171 return NULL;
1172 }
1173 self->ob_item = item;
1174 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001175 memcpy(item + (self->ob_size - n) * itemsize,
1176 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001177 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001178 Py_INCREF(Py_None);
1179 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001180}
1181
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001182static char fromstring_doc [] =
1183"fromstring(string)\n\
1184\n\
1185Appends items from the string, interpreting it as an array of machine\n\
1186values,as if it had been read from a file using the fromfile() method).";
1187
1188
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001189static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001190array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001191{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001192 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001193 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001194 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001195 self->ob_size * self->ob_descr->itemsize);
1196}
1197
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001198static char tostring_doc [] =
1199"tostring() -> string\n\
1200\n\
1201Convert the array to an array of machine values and return the string\n\
1202representation.";
1203
1204PyMethodDef array_methods[] = {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001205 {"append", (PyCFunction)array_append, METH_VARARGS,
1206 append_doc},
1207 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS,
1208 buffer_info_doc},
1209 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1210 byteswap_doc},
1211 {"count", (PyCFunction)array_count, METH_VARARGS,
1212 count_doc},
1213 {"extend", (PyCFunction)array_extend, METH_VARARGS,
1214 extend_doc},
1215 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1216 fromfile_doc},
1217 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS,
1218 fromlist_doc},
1219 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1220 fromstring_doc},
1221 {"index", (PyCFunction)array_index, METH_VARARGS,
1222 index_doc},
1223 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1224 insert_doc},
1225 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1226 pop_doc},
1227 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1228 fromfile_doc},
1229 {"remove", (PyCFunction)array_remove, METH_VARARGS,
1230 remove_doc},
1231 {"reverse", (PyCFunction)array_reverse, METH_VARARGS,
1232 reverse_doc},
1233/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1234 sort_doc},*/
1235 {"tofile", (PyCFunction)array_tofile, METH_VARARGS,
1236 tofile_doc},
1237 {"tolist", (PyCFunction)array_tolist, METH_VARARGS,
1238 tolist_doc},
1239 {"tostring", (PyCFunction)array_tostring, METH_VARARGS,
1240 tostring_doc},
1241 {"write", (PyCFunction)array_tofile, METH_VARARGS,
1242 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001243 {NULL, NULL} /* sentinel */
1244};
1245
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001246static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001247array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001248{
1249 if (strcmp(name, "typecode") == 0) {
1250 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001251 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001252 }
1253 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001254 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001255 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001256 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001257 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001258 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001259 PyList_SetItem(list, 0,
1260 PyString_FromString("typecode"));
1261 PyList_SetItem(list, 1,
1262 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001263 if (PyErr_Occurred()) {
1264 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001265 list = NULL;
1266 }
1267 }
1268 return list;
1269 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001270 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001271}
1272
1273static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001274array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001275{
1276 int ok = 0;
1277 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001278 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001279 len = a->ob_size;
1280 if (len == 0) {
1281 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1282 return ok;
1283 }
1284 if (a->ob_descr->typecode == 'c') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001285 PyObject *t_empty = PyTuple_New(0);
Guido van Rossum778983b1993-02-19 15:55:02 +00001286 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001287 v = array_tostring(a, t_empty);
Tim Peters7c1cb462000-11-10 19:04:19 +00001288 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001289 ok = PyObject_Print(v, fp, 0);
1290 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 fprintf(fp, ")");
1292 return ok;
1293 }
1294 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1295 for (i = 0; i < len && ok == 0; i++) {
1296 if (i > 0)
1297 fprintf(fp, ", ");
1298 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001299 ok = PyObject_Print(v, fp, 0);
1300 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001301 }
1302 fprintf(fp, "])");
1303 return ok;
1304}
1305
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001306static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001307array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001308{
1309 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001310 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001311 int i, len;
1312 len = a->ob_size;
1313 if (len == 0) {
1314 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001315 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001316 }
1317 if (a->ob_descr->typecode == 'c') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001318 PyObject *t_empty = PyTuple_New(0);
Guido van Rossum778983b1993-02-19 15:55:02 +00001319 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001320 s = PyString_FromString(buf);
Tim Peters7c1cb462000-11-10 19:04:19 +00001321 v = array_tostring(a, t_empty);
1322 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001323 t = PyObject_Repr(v);
1324 Py_XDECREF(v);
1325 PyString_ConcatAndDel(&s, t);
1326 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001327 return s;
1328 }
1329 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001330 s = PyString_FromString(buf);
1331 comma = PyString_FromString(", ");
1332 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001333 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001334 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001336 t = PyObject_Repr(v);
1337 Py_XDECREF(v);
1338 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001339 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001340 Py_XDECREF(comma);
1341 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001342 return s;
1343}
1344
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001345static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001346array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001347{
1348 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001349 PyErr_SetString(PyExc_SystemError,
1350 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001351 return -1;
1352 }
1353 *ptr = (void *)self->ob_item;
1354 return self->ob_size*self->ob_descr->itemsize;
1355}
1356
1357static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001358array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001359{
1360 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001361 PyErr_SetString(PyExc_SystemError,
1362 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001363 return -1;
1364 }
1365 *ptr = (void *)self->ob_item;
1366 return self->ob_size*self->ob_descr->itemsize;
1367}
1368
1369static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001370array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001371{
1372 if ( lenp )
1373 *lenp = self->ob_size*self->ob_descr->itemsize;
1374 return 1;
1375}
1376
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001377static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001378 (inquiry)array_length, /*sq_length*/
1379 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001380 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001381 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001382 (intintargfunc)array_slice, /*sq_slice*/
1383 (intobjargproc)array_ass_item, /*sq_ass_item*/
1384 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001385};
1386
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001387static PyBufferProcs array_as_buffer = {
1388 (getreadbufferproc)array_buffer_getreadbuf,
1389 (getwritebufferproc)array_buffer_getwritebuf,
1390 (getsegcountproc)array_buffer_getsegcount,
1391};
1392
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001393static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001394a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001395{
1396 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001397 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001398 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001399 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001400 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001401 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1404 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001405 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 return NULL;
1407 }
1408 }
1409 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1410 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001411 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001412 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001413 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001414 len = 0;
1415 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001416 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001417 a = newarrayobject(len, descr);
1418 if (a == NULL)
1419 return NULL;
1420 if (len > 0) {
1421 int i;
1422 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001423 PyObject *v =
1424 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001425 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001426 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001427 return NULL;
1428 }
1429 }
1430 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001431 if (initial != NULL && PyString_Check(initial)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001432 PyObject *t_initial = Py_BuildValue("(O)",
1433 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001434 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001435 array_fromstring((arrayobject *)a,
1436 t_initial);
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001437 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001438 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001439 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001440 return NULL;
1441 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001442 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001443 }
1444 return a;
1445 }
1446 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001447 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001448 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001449 return NULL;
1450}
1451
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001452static char a_array_doc [] =
1453"array(typecode [, initializer]) -> array\n\
1454\n\
1455Return a new array whose items are restricted by typecode, and\n\
1456initialized from the optional initializer value, which must be a list\n\
1457or a string.";
1458
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001459static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001460 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001461 {NULL, NULL} /* sentinel */
1462};
1463
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001464static char module_doc [] =
1465"This module defines a new object type which can efficiently represent\n\
1466an array of basic values: characters, integers, floating point\n\
1467numbers. Arrays are sequence types and behave very much like lists,\n\
1468except that the type of objects stored in them is constrained. The\n\
1469type is specified at object creation time by using a type code, which\n\
1470is a single character. The following type codes are defined:\n\
1471\n\
1472 Type code C Type Minimum size in bytes \n\
1473 'c' character 1 \n\
1474 'b' signed integer 1 \n\
1475 'B' unsigned integer 1 \n\
1476 'h' signed integer 2 \n\
1477 'H' unsigned integer 2 \n\
1478 'i' signed integer 2 \n\
1479 'I' unsigned integer 2 \n\
1480 'l' signed integer 4 \n\
1481 'L' unsigned integer 4 \n\
1482 'f' floating point 4 \n\
1483 'd' floating point 8 \n\
1484\n\
1485Functions:\n\
1486\n\
1487array(typecode [, initializer]) -- create a new array\n\
1488\n\
1489Special Objects:\n\
1490\n\
1491ArrayType -- type object for array objects\n\
1492";
1493
1494static char arraytype_doc [] =
1495"An array represents basic values and behave very much like lists, except\n\
1496the type of objects stored in them is constrained.\n\
1497\n\
1498Methods:\n\
1499\n\
1500append() -- append a new item to the end of the array\n\
1501buffer_info() -- return information giving the current memory info\n\
1502byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001503count() -- return number of occurences of an object\n\
1504extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001505fromfile() -- read items from a file object\n\
1506fromlist() -- append items from the list\n\
1507fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001508index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001509insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001510pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001511read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001512remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001513reverse() -- reverse the order of the items in the array\n\
1514tofile() -- write all items to a file object\n\
1515tolist() -- return the array converted to an ordinary list\n\
1516tostring() -- return the array converted to a string\n\
1517write() -- DEPRECATED, use tofile()\n\
1518\n\
1519Variables:\n\
1520\n\
1521typecode -- the typecode character used to create the array\n\
1522itemsize -- the length in bytes of one array item\n\
1523";
1524
1525statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001526 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001527 0,
1528 "array",
1529 sizeof(arrayobject),
1530 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001531 (destructor)array_dealloc, /* tp_dealloc */
1532 (printfunc)array_print, /* tp_print */
1533 (getattrfunc)array_getattr, /* tp_getattr */
1534 0, /* tp_setattr */
1535 0, /* tp_compare */
1536 (reprfunc)array_repr, /* tp_repr */
1537 0, /* tp_as _number*/
1538 &array_as_sequence, /* tp_as _sequence*/
1539 0, /* tp_as _mapping*/
1540 0, /* tp_hash */
1541 0, /* tp_call */
1542 0, /* tp_str */
1543 0, /* tp_getattro */
1544 0, /* tp_setattro */
1545 &array_as_buffer, /* tp_as _buffer*/
Guido van Rossum05bbb9a2001-01-24 21:44:21 +00001546 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001547 arraytype_doc, /* tp_doc */
1548 0, /* tp_traverse */
1549 0, /* tp_clear */
1550 array_richcompare, /* tp_richcompare */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001551};
1552
Guido van Rossum3886bb61998-12-04 18:50:17 +00001553DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001554initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001555{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001556 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001557
1558 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001559 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001560 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001561 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1562 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001563}