blob: 6168bb08c61cb2158460a4cb8fcc78f11aef9fa3 [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\
Guido van Rossum702d08e2001-07-27 16:05:32 +0000883the length in items of the buffer used to hold array's contents\n\
884The length should be multiplied by the itemsize attribute to calculate\n\
885the buffer length in bytes.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000886
887
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000888static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000889array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000890{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000891 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000892 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000893 return NULL;
894 return ins(self, (int) self->ob_size, v);
895}
896
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000897static char append_doc [] =
898"append(x)\n\
899\n\
900Append new value x to the end of the array.";
901
902
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000903static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000904array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000905{
906 char *p;
907 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000908
909 if (!PyArg_ParseTuple(args, ":byteswap"))
910 return NULL;
911
Guido van Rossum778983b1993-02-19 15:55:02 +0000912 switch (self->ob_descr->itemsize) {
913 case 1:
914 break;
915 case 2:
916 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
917 char p0 = p[0];
918 p[0] = p[1];
919 p[1] = p0;
920 }
921 break;
922 case 4:
923 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
924 char p0 = p[0];
925 char p1 = p[1];
926 p[0] = p[3];
927 p[1] = p[2];
928 p[2] = p1;
929 p[3] = p0;
930 }
931 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000932 case 8:
933 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
934 char p0 = p[0];
935 char p1 = p[1];
936 char p2 = p[2];
937 char p3 = p[3];
938 p[0] = p[7];
939 p[1] = p[6];
940 p[2] = p[5];
941 p[3] = p[4];
942 p[4] = p3;
943 p[5] = p2;
944 p[6] = p1;
945 p[7] = p0;
946 }
947 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000948 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000949 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000950 "don't know how to byteswap this array type");
951 return NULL;
952 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000953 Py_INCREF(Py_None);
954 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000955}
956
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000957static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000958"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000959\n\
Fred Drakebf272981999-12-03 17:15:30 +0000960Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9614, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000962
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000963static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000964array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000965{
Guido van Rossume77a7571993-11-03 15:01:26 +0000966 register int itemsize = self->ob_descr->itemsize;
967 register char *p, *q;
Tim Peters077a11d2000-09-16 22:31:29 +0000968 /* little buffer to hold items while swapping */
969 char tmp[256]; /* 8 is probably enough -- but why skimp */
970 assert(itemsize <= sizeof(tmp));
Guido van Rossume77a7571993-11-03 15:01:26 +0000971
Tim Peters077a11d2000-09-16 22:31:29 +0000972 if (!PyArg_ParseTuple(args, ":reverse"))
973 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +0000974
975 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000976 for (p = self->ob_item,
977 q = self->ob_item + (self->ob_size - 1)*itemsize;
978 p < q;
979 p += itemsize, q -= itemsize) {
Tim Peters077a11d2000-09-16 22:31:29 +0000980 /* memory areas guaranteed disjoint, so memcpy
981 * is safe (& memmove may be slower).
982 */
983 memcpy(tmp, p, itemsize);
984 memcpy(p, q, itemsize);
985 memcpy(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000986 }
987 }
Tim Petersbb307342000-09-10 05:22:54 +0000988
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000989 Py_INCREF(Py_None);
990 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000991}
Guido van Rossume77a7571993-11-03 15:01:26 +0000992
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000993static char reverse_doc [] =
994"reverse()\n\
995\n\
996Reverse the order of the items in the array.";
997
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000998static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000999array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001000{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001001 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001002 int n;
1003 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001004 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001005 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001006 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001007 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001008 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001009 return NULL;
1010 }
1011 if (n > 0) {
1012 char *item = self->ob_item;
1013 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001014 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001015 int newlength;
1016 size_t newbytes;
1017 /* Be careful here about overflow */
1018 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001019 (newbytes = newlength * itemsize) / itemsize !=
1020 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001021 goto nomem;
1022 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001023 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001024 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001025 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001026 return NULL;
1027 }
1028 self->ob_item = item;
1029 self->ob_size += n;
1030 nread = fread(item + (self->ob_size - n) * itemsize,
1031 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001032 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 PyErr_SetString(PyExc_EOFError,
1037 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001038 return NULL;
1039 }
1040 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001041 Py_INCREF(Py_None);
1042 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001043}
1044
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001045static char fromfile_doc [] =
1046"fromfile(f, n)\n\
1047\n\
1048Read n objects from the file object f and append them to the end of the\n\
1049array. Also called as read.";
1050
1051
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001052static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001053array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001054{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001055 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001056 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001057 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001058 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001060 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001061 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001062 return NULL;
1063 }
1064 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001065 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1066 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001067 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 clearerr(fp);
1069 return NULL;
1070 }
1071 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001072 Py_INCREF(Py_None);
1073 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001074}
1075
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001076static char tofile_doc [] =
1077"tofile(f)\n\
1078\n\
1079Write all items (as machine values) to the file object f. Also called as\n\
1080write.";
1081
1082
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001083static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001084array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001085{
1086 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001087 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001088 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001089 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001090 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001091 if (!PyList_Check(list)) {
1092 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001093 return NULL;
1094 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001095 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001096 if (n > 0) {
1097 char *item = self->ob_item;
1098 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001099 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001100 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001101 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001102 return NULL;
1103 }
1104 self->ob_item = item;
1105 self->ob_size += n;
1106 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001107 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001108 if ((*self->ob_descr->setitem)(self,
1109 self->ob_size - n + i, v) != 0) {
1110 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001111 PyMem_RESIZE(item, char,
1112 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001113 self->ob_item = item;
1114 return NULL;
1115 }
1116 }
1117 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001118 Py_INCREF(Py_None);
1119 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001120}
1121
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001122static char fromlist_doc [] =
1123"fromlist(list)\n\
1124\n\
1125Append items to array from list.";
1126
1127
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001128static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001129array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001130{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001131 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001132 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001133 if (!PyArg_ParseTuple(args, ":tolist"))
1134 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001135 if (list == NULL)
1136 return NULL;
1137 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001138 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001139 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001140 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001141 return NULL;
1142 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001143 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001144 }
1145 return list;
1146}
1147
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001148static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001149"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001150\n\
1151Convert array to an ordinary list with the same items.";
1152
1153
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001154static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001155array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001156{
1157 char *str;
1158 int n;
1159 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001160 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001161 return NULL;
1162 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001163 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001164 "string length not a multiple of item size");
1165 return NULL;
1166 }
1167 n = n / itemsize;
1168 if (n > 0) {
1169 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001170 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001171 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001172 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001173 return NULL;
1174 }
1175 self->ob_item = item;
1176 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001177 memcpy(item + (self->ob_size - n) * itemsize,
1178 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001179 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001180 Py_INCREF(Py_None);
1181 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001182}
1183
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001184static char fromstring_doc [] =
1185"fromstring(string)\n\
1186\n\
1187Appends items from the string, interpreting it as an array of machine\n\
1188values,as if it had been read from a file using the fromfile() method).";
1189
1190
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001191static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001192array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001193{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001194 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001195 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001196 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001197 self->ob_size * self->ob_descr->itemsize);
1198}
1199
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001200static char tostring_doc [] =
1201"tostring() -> string\n\
1202\n\
1203Convert the array to an array of machine values and return the string\n\
1204representation.";
1205
1206PyMethodDef array_methods[] = {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001207 {"append", (PyCFunction)array_append, METH_VARARGS,
1208 append_doc},
1209 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS,
1210 buffer_info_doc},
1211 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1212 byteswap_doc},
1213 {"count", (PyCFunction)array_count, METH_VARARGS,
1214 count_doc},
1215 {"extend", (PyCFunction)array_extend, METH_VARARGS,
1216 extend_doc},
1217 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS,
1218 fromfile_doc},
1219 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS,
1220 fromlist_doc},
1221 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS,
1222 fromstring_doc},
1223 {"index", (PyCFunction)array_index, METH_VARARGS,
1224 index_doc},
1225 {"insert", (PyCFunction)array_insert, METH_VARARGS,
1226 insert_doc},
1227 {"pop", (PyCFunction)array_pop, METH_VARARGS,
1228 pop_doc},
1229 {"read", (PyCFunction)array_fromfile, METH_VARARGS,
1230 fromfile_doc},
1231 {"remove", (PyCFunction)array_remove, METH_VARARGS,
1232 remove_doc},
1233 {"reverse", (PyCFunction)array_reverse, METH_VARARGS,
1234 reverse_doc},
1235/* {"sort", (PyCFunction)array_sort, METH_VARARGS,
1236 sort_doc},*/
1237 {"tofile", (PyCFunction)array_tofile, METH_VARARGS,
1238 tofile_doc},
1239 {"tolist", (PyCFunction)array_tolist, METH_VARARGS,
1240 tolist_doc},
1241 {"tostring", (PyCFunction)array_tostring, METH_VARARGS,
1242 tostring_doc},
1243 {"write", (PyCFunction)array_tofile, METH_VARARGS,
1244 tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001245 {NULL, NULL} /* sentinel */
1246};
1247
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001248static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001249array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001250{
1251 if (strcmp(name, "typecode") == 0) {
1252 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001254 }
1255 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001256 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001257 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001258 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001260 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001261 PyList_SetItem(list, 0,
1262 PyString_FromString("typecode"));
1263 PyList_SetItem(list, 1,
1264 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 if (PyErr_Occurred()) {
1266 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001267 list = NULL;
1268 }
1269 }
1270 return list;
1271 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001272 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001273}
1274
1275static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001276array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001277{
1278 int ok = 0;
1279 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001280 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001281 len = a->ob_size;
1282 if (len == 0) {
1283 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1284 return ok;
1285 }
1286 if (a->ob_descr->typecode == 'c') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001287 PyObject *t_empty = PyTuple_New(0);
Guido van Rossum778983b1993-02-19 15:55:02 +00001288 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001289 v = array_tostring(a, t_empty);
Tim Peters7c1cb462000-11-10 19:04:19 +00001290 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001291 ok = PyObject_Print(v, fp, 0);
1292 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001293 fprintf(fp, ")");
1294 return ok;
1295 }
1296 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1297 for (i = 0; i < len && ok == 0; i++) {
1298 if (i > 0)
1299 fprintf(fp, ", ");
1300 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001301 ok = PyObject_Print(v, fp, 0);
1302 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001303 }
1304 fprintf(fp, "])");
1305 return ok;
1306}
1307
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001308static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001309array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001310{
1311 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001313 int i, len;
1314 len = a->ob_size;
1315 if (len == 0) {
1316 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001318 }
1319 if (a->ob_descr->typecode == 'c') {
Tim Peters7c1cb462000-11-10 19:04:19 +00001320 PyObject *t_empty = PyTuple_New(0);
Guido van Rossum778983b1993-02-19 15:55:02 +00001321 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001322 s = PyString_FromString(buf);
Tim Peters7c1cb462000-11-10 19:04:19 +00001323 v = array_tostring(a, t_empty);
1324 Py_DECREF(t_empty);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325 t = PyObject_Repr(v);
1326 Py_XDECREF(v);
1327 PyString_ConcatAndDel(&s, t);
1328 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001329 return s;
1330 }
1331 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001332 s = PyString_FromString(buf);
1333 comma = PyString_FromString(", ");
1334 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001335 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001336 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001337 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338 t = PyObject_Repr(v);
1339 Py_XDECREF(v);
1340 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001341 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001342 Py_XDECREF(comma);
1343 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001344 return s;
1345}
1346
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001347static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001348array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001349{
1350 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001351 PyErr_SetString(PyExc_SystemError,
1352 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001353 return -1;
1354 }
1355 *ptr = (void *)self->ob_item;
1356 return self->ob_size*self->ob_descr->itemsize;
1357}
1358
1359static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001360array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001361{
1362 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001363 PyErr_SetString(PyExc_SystemError,
1364 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001365 return -1;
1366 }
1367 *ptr = (void *)self->ob_item;
1368 return self->ob_size*self->ob_descr->itemsize;
1369}
1370
1371static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001372array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001373{
1374 if ( lenp )
1375 *lenp = self->ob_size*self->ob_descr->itemsize;
1376 return 1;
1377}
1378
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001379static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001380 (inquiry)array_length, /*sq_length*/
1381 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001382 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001383 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001384 (intintargfunc)array_slice, /*sq_slice*/
1385 (intobjargproc)array_ass_item, /*sq_ass_item*/
1386 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001387};
1388
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001389static PyBufferProcs array_as_buffer = {
1390 (getreadbufferproc)array_buffer_getreadbuf,
1391 (getwritebufferproc)array_buffer_getwritebuf,
1392 (getsegcountproc)array_buffer_getsegcount,
1393};
1394
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001395static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001396a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001397{
1398 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001399 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001400 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001401 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001402 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001403 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001404 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001405 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1406 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001407 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001408 return NULL;
1409 }
1410 }
1411 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1412 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001413 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001414 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001415 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001416 len = 0;
1417 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001418 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001419 a = newarrayobject(len, descr);
1420 if (a == NULL)
1421 return NULL;
1422 if (len > 0) {
1423 int i;
1424 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001425 PyObject *v =
1426 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001427 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001428 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001429 return NULL;
1430 }
1431 }
1432 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001433 if (initial != NULL && PyString_Check(initial)) {
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001434 PyObject *t_initial = Py_BuildValue("(O)",
1435 initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001436 PyObject *v =
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001437 array_fromstring((arrayobject *)a,
1438 t_initial);
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001439 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001440 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001441 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001442 return NULL;
1443 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001444 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001445 }
1446 return a;
1447 }
1448 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001449 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001450 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001451 return NULL;
1452}
1453
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001454static char a_array_doc [] =
1455"array(typecode [, initializer]) -> array\n\
1456\n\
1457Return a new array whose items are restricted by typecode, and\n\
1458initialized from the optional initializer value, which must be a list\n\
1459or a string.";
1460
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001461static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001462 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001463 {NULL, NULL} /* sentinel */
1464};
1465
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001466static char module_doc [] =
1467"This module defines a new object type which can efficiently represent\n\
1468an array of basic values: characters, integers, floating point\n\
1469numbers. Arrays are sequence types and behave very much like lists,\n\
1470except that the type of objects stored in them is constrained. The\n\
1471type is specified at object creation time by using a type code, which\n\
1472is a single character. The following type codes are defined:\n\
1473\n\
1474 Type code C Type Minimum size in bytes \n\
1475 'c' character 1 \n\
1476 'b' signed integer 1 \n\
1477 'B' unsigned integer 1 \n\
1478 'h' signed integer 2 \n\
1479 'H' unsigned integer 2 \n\
1480 'i' signed integer 2 \n\
1481 'I' unsigned integer 2 \n\
1482 'l' signed integer 4 \n\
1483 'L' unsigned integer 4 \n\
1484 'f' floating point 4 \n\
1485 'd' floating point 8 \n\
1486\n\
1487Functions:\n\
1488\n\
1489array(typecode [, initializer]) -- create a new array\n\
1490\n\
1491Special Objects:\n\
1492\n\
1493ArrayType -- type object for array objects\n\
1494";
1495
1496static char arraytype_doc [] =
1497"An array represents basic values and behave very much like lists, except\n\
1498the type of objects stored in them is constrained.\n\
1499\n\
1500Methods:\n\
1501\n\
1502append() -- append a new item to the end of the array\n\
1503buffer_info() -- return information giving the current memory info\n\
1504byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001505count() -- return number of occurences of an object\n\
1506extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001507fromfile() -- read items from a file object\n\
1508fromlist() -- append items from the list\n\
1509fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001510index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001511insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001512pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001513read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001514remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001515reverse() -- reverse the order of the items in the array\n\
1516tofile() -- write all items to a file object\n\
1517tolist() -- return the array converted to an ordinary list\n\
1518tostring() -- return the array converted to a string\n\
1519write() -- DEPRECATED, use tofile()\n\
1520\n\
1521Variables:\n\
1522\n\
1523typecode -- the typecode character used to create the array\n\
1524itemsize -- the length in bytes of one array item\n\
1525";
1526
1527statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001528 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001529 0,
1530 "array",
1531 sizeof(arrayobject),
1532 0,
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001533 (destructor)array_dealloc, /* tp_dealloc */
1534 (printfunc)array_print, /* tp_print */
1535 (getattrfunc)array_getattr, /* tp_getattr */
1536 0, /* tp_setattr */
1537 0, /* tp_compare */
1538 (reprfunc)array_repr, /* tp_repr */
1539 0, /* tp_as _number*/
1540 &array_as_sequence, /* tp_as _sequence*/
1541 0, /* tp_as _mapping*/
1542 0, /* tp_hash */
1543 0, /* tp_call */
1544 0, /* tp_str */
1545 0, /* tp_getattro */
1546 0, /* tp_setattro */
Tim Petersb870c752001-06-05 04:43:26 +00001547 &array_as_buffer, /* tp_as_buffer*/
Guido van Rossum05bbb9a2001-01-24 21:44:21 +00001548 Py_TPFLAGS_DEFAULT, /* tp_flags */
Guido van Rossum9d19cb82001-01-18 01:02:55 +00001549 arraytype_doc, /* tp_doc */
1550 0, /* tp_traverse */
1551 0, /* tp_clear */
1552 array_richcompare, /* tp_richcompare */
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001553};
1554
Guido van Rossum3886bb61998-12-04 18:50:17 +00001555DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001556initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001557{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001558 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001559
1560 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001561 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001562 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001563 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1564 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001565}