blob: 7197147008ef704b5c6f15ecb13b53518ef3c061 [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 Rossumdb677392000-07-01 01:09:43 +000015#ifdef HAVE_LIMITS_H
16#include <limits.h>
17#endif /* HAVE_LIMITS_H */
Guido van Rossum778983b1993-02-19 15:55:02 +000018
19struct arrayobject; /* Forward */
20
Tim Petersbb307342000-09-10 05:22:54 +000021/* All possible arraydescr values are defined in the vector "descriptors"
22 * below. That's defined later because the appropriate get and set
23 * functions aren't visible yet.
24 */
Guido van Rossum778983b1993-02-19 15:55:02 +000025struct arraydescr {
26 int typecode;
27 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000028 PyObject * (*getitem)(struct arrayobject *, int);
29 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000030};
31
32typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000033 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000034 char *ob_item;
35 struct arraydescr *ob_descr;
36} arrayobject;
37
Roger E. Masse2919eaa1996-12-09 20:10:36 +000038staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000039
40#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
41
Tim Petersbb307342000-09-10 05:22:54 +000042/****************************************************************************
43Get and Set functions for each type.
44A Get function takes an arrayobject* and an integer index, returning the
45array value at that index wrapped in an appropriate PyObject*.
46A Set function takes an arrayobject, integer index, and PyObject*; sets
47the array value at that index to the raw C data extracted from the PyObject*,
48and returns 0 if successful, else nonzero on failure (PyObject* not of an
49appropriate type or value).
50Note that the basic Get and Set functions do NOT check that the index is
51in bounds; that's the responsibility of the caller.
52****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +000053
Roger E. Masse2919eaa1996-12-09 20:10:36 +000054static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000055c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000056{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000057 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000058}
59
60static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000061c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000062{
63 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000064 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000065 return -1;
66 if (i >= 0)
67 ((char *)ap->ob_item)[i] = x;
68 return 0;
69}
70
Roger E. Masse2919eaa1996-12-09 20:10:36 +000071static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000072b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000073{
74 long x = ((char *)ap->ob_item)[i];
75 if (x >= 128)
76 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000077 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000078}
79
80static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000081b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000082{
Fred Drake541dc3b2000-06-28 17:49:30 +000083 short x;
84 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
85 must use the next size up that is signed ('h') and manually do
86 the overflow checking */
87 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000088 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +000089 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +000090 PyErr_SetString(PyExc_OverflowError,
91 "signed char is less than minimum");
92 return -1;
93 }
Guido van Rossum9f754e02000-07-01 00:38:19 +000094 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +000095 PyErr_SetString(PyExc_OverflowError,
96 "signed char is greater than maximum");
97 return -1;
98 }
Guido van Rossum778983b1993-02-19 15:55:02 +000099 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000100 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000101 return 0;
102}
103
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000104static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000105BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000106{
107 long x = ((unsigned char *)ap->ob_item)[i];
108 return PyInt_FromLong(x);
109}
110
Fred Drake541dc3b2000-06-28 17:49:30 +0000111static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000112BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000113{
114 unsigned char x;
115 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
116 if (!PyArg_Parse(v, "b;array item must be integer", &x))
117 return -1;
118 if (i >= 0)
119 ((char *)ap->ob_item)[i] = x;
120 return 0;
121}
Guido van Rossum549ab711997-01-03 19:09:47 +0000122
123static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000124h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000125{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000126 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000127}
128
129static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000130h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000131{
132 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000133 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000134 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000135 return -1;
136 if (i >= 0)
137 ((short *)ap->ob_item)[i] = x;
138 return 0;
139}
140
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000141static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000142HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000143{
144 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
145}
146
Fred Drake541dc3b2000-06-28 17:49:30 +0000147static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000148HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000149{
150 int x;
151 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
152 must use the next size up and manually do the overflow checking */
153 if (!PyArg_Parse(v, "i;array item must be integer", &x))
154 return -1;
155 else if (x < 0) {
156 PyErr_SetString(PyExc_OverflowError,
157 "unsigned short is less than minimum");
158 return -1;
159 }
160 else if (x > USHRT_MAX) {
161 PyErr_SetString(PyExc_OverflowError,
162 "unsigned short is greater than maximum");
163 return -1;
164 }
165 if (i >= 0)
166 ((short *)ap->ob_item)[i] = (short)x;
167 return 0;
168}
Guido van Rossum549ab711997-01-03 19:09:47 +0000169
170static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000171i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000172{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000173 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000174}
175
176static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000177i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000178{
179 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000180 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000181 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000182 return -1;
183 if (i >= 0)
184 ((int *)ap->ob_item)[i] = x;
185 return 0;
186}
187
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000188static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000189II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000190{
191 return PyLong_FromUnsignedLong(
192 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
193}
194
195static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000196II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000197{
198 unsigned long x;
199 if (PyLong_Check(v)) {
200 x = PyLong_AsUnsignedLong(v);
201 if (x == (unsigned long) -1 && PyErr_Occurred())
202 return -1;
203 }
204 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000205 long y;
206 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000207 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000208 if (y < 0) {
209 PyErr_SetString(PyExc_OverflowError,
210 "unsigned int is less than minimum");
211 return -1;
212 }
213 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000214
Guido van Rossum549ab711997-01-03 19:09:47 +0000215 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000216 if (x > UINT_MAX) {
217 PyErr_SetString(PyExc_OverflowError,
218 "unsigned int is greater than maximum");
219 return -1;
220 }
221
Guido van Rossum549ab711997-01-03 19:09:47 +0000222 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000223 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000224 return 0;
225}
226
227static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000228l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000229{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000230 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000231}
232
233static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000234l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000235{
236 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000237 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000238 return -1;
239 if (i >= 0)
240 ((long *)ap->ob_item)[i] = x;
241 return 0;
242}
243
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000244static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000245LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000246{
247 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
248}
249
250static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000251LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000252{
253 unsigned long x;
254 if (PyLong_Check(v)) {
255 x = PyLong_AsUnsignedLong(v);
256 if (x == (unsigned long) -1 && PyErr_Occurred())
257 return -1;
258 }
259 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000260 long y;
261 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000262 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000263 if (y < 0) {
264 PyErr_SetString(PyExc_OverflowError,
265 "unsigned long is less than minimum");
266 return -1;
267 }
268 x = (unsigned long)y;
Tim Petersbb307342000-09-10 05:22:54 +0000269
Guido van Rossum549ab711997-01-03 19:09:47 +0000270 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000271 if (x > ULONG_MAX) {
272 PyErr_SetString(PyExc_OverflowError,
273 "unsigned long is greater than maximum");
274 return -1;
275 }
Tim Petersbb307342000-09-10 05:22:54 +0000276
Guido van Rossum549ab711997-01-03 19:09:47 +0000277 if (i >= 0)
278 ((unsigned long *)ap->ob_item)[i] = x;
279 return 0;
280}
281
282static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000283f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000284{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000285 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000286}
287
288static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000289f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000290{
291 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000292 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000293 return -1;
294 if (i >= 0)
295 ((float *)ap->ob_item)[i] = x;
296 return 0;
297}
298
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000299static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000300d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000301{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000302 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000303}
304
305static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000306d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000307{
308 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000309 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000310 return -1;
311 if (i >= 0)
312 ((double *)ap->ob_item)[i] = x;
313 return 0;
314}
315
316/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000317static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000318 {'c', sizeof(char), c_getitem, c_setitem},
319 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000320 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000321 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000322 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000323 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000324 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000325 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000326 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000327 {'f', sizeof(float), f_getitem, f_setitem},
328 {'d', sizeof(double), d_getitem, d_setitem},
329 {'\0', 0, 0, 0} /* Sentinel */
330};
Guido van Rossume77a7571993-11-03 15:01:26 +0000331/* If we ever allow items larger than double, we must change reverse()! */
Tim Petersbb307342000-09-10 05:22:54 +0000332
333/****************************************************************************
334Implementations of array object methods.
335****************************************************************************/
Guido van Rossum778983b1993-02-19 15:55:02 +0000336
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000337static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000338newarrayobject(int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000339{
Guido van Rossum778983b1993-02-19 15:55:02 +0000340 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000341 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000342 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000343 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000344 return NULL;
345 }
346 nbytes = size * descr->itemsize;
347 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000348 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000349 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000350 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000351 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000352 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000353 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000354 }
355 if (size <= 0) {
356 op->ob_item = NULL;
357 }
358 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000359 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000360 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000361 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000362 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000363 }
364 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000365 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000366 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000367}
368
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000369static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000370getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000371{
372 register arrayobject *ap;
Tim Petersbb307342000-09-10 05:22:54 +0000373 assert(is_arrayobject(op));
Guido van Rossum778983b1993-02-19 15:55:02 +0000374 ap = (arrayobject *)op;
375 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000376 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000377 return NULL;
378 }
379 return (*ap->ob_descr->getitem)(ap, i);
380}
381
382static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000383ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000384{
Guido van Rossum778983b1993-02-19 15:55:02 +0000385 char *items;
386 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000387 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000388 return -1;
389 }
390 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
391 return -1;
392 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000393 PyMem_RESIZE(items, char,
394 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000395 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000396 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000397 return -1;
398 }
399 if (where < 0)
400 where = 0;
401 if (where > self->ob_size)
402 where = self->ob_size;
403 memmove(items + (where+1)*self->ob_descr->itemsize,
404 items + where*self->ob_descr->itemsize,
405 (self->ob_size-where)*self->ob_descr->itemsize);
406 self->ob_item = items;
407 self->ob_size++;
408 return (*self->ob_descr->setitem)(self, where, v);
409}
410
Guido van Rossum778983b1993-02-19 15:55:02 +0000411/* Methods */
412
413static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000414array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000415{
Guido van Rossum778983b1993-02-19 15:55:02 +0000416 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000417 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000418 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000419}
420
421static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000422array_compare(arrayobject *v, arrayobject *w)
Guido van Rossum778983b1993-02-19 15:55:02 +0000423{
424 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
425 int i;
426 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000427 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 ai = getarrayitem((PyObject *)v, i);
430 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000431 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000432 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 else
434 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000435 Py_XDECREF(ai);
436 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000437 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000438 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000439 }
440 return v->ob_size - w->ob_size;
441}
442
443static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000444array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000445{
446 return a->ob_size;
447}
448
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000450array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000451{
452 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000453 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000454 return NULL;
455 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000456 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000457}
458
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000459static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000460array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000461{
462 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 if (ilow < 0)
464 ilow = 0;
465 else if (ilow > a->ob_size)
466 ilow = a->ob_size;
467 if (ihigh < 0)
468 ihigh = 0;
469 if (ihigh < ilow)
470 ihigh = ilow;
471 else if (ihigh > a->ob_size)
472 ihigh = a->ob_size;
473 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
474 if (np == NULL)
475 return NULL;
476 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
477 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000478 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000479}
480
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000481static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000482array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000483{
484 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000485 arrayobject *np;
486 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000487 PyErr_Format(PyExc_TypeError,
488 "can only append array (not \"%.200s\") to array",
489 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000490 return NULL;
491 }
492#define b ((arrayobject *)bb)
493 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000494 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000495 return NULL;
496 }
497 size = a->ob_size + b->ob_size;
498 np = (arrayobject *) newarrayobject(size, a->ob_descr);
499 if (np == NULL) {
500 return NULL;
501 }
502 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
503 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000504 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000505 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000506#undef b
507}
508
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000509static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000510array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000511{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000512 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000513 int size;
514 arrayobject *np;
515 char *p;
516 int nbytes;
517 if (n < 0)
518 n = 0;
519 size = a->ob_size * n;
520 np = (arrayobject *) newarrayobject(size, a->ob_descr);
521 if (np == NULL)
522 return NULL;
523 p = np->ob_item;
524 nbytes = a->ob_size * a->ob_descr->itemsize;
525 for (i = 0; i < n; i++) {
526 memcpy(p, a->ob_item, nbytes);
527 p += nbytes;
528 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000529 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000530}
531
532static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000533array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000534{
535 char *item;
536 int n; /* Size of replacement array */
537 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000538#define b ((arrayobject *)v)
539 if (v == NULL)
540 n = 0;
541 else if (is_arrayobject(v)) {
542 n = b->ob_size;
543 if (a == b) {
544 /* Special case "a[i:j] = a" -- copy b first */
545 int ret;
546 v = array_slice(b, 0, n);
547 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000548 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000549 return ret;
550 }
551 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000552 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000553 return -1;
554 }
555 }
556 else {
Fred Drake137507e2000-06-01 02:02:46 +0000557 PyErr_Format(PyExc_TypeError,
558 "can only assign array (not \"%.200s\") to array slice",
559 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000560 return -1;
561 }
562 if (ilow < 0)
563 ilow = 0;
564 else if (ilow > a->ob_size)
565 ilow = a->ob_size;
566 if (ihigh < 0)
567 ihigh = 0;
568 if (ihigh < ilow)
569 ihigh = ilow;
570 else if (ihigh > a->ob_size)
571 ihigh = a->ob_size;
572 item = a->ob_item;
573 d = n - (ihigh-ilow);
574 if (d < 0) { /* Delete -d items */
575 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
576 item + ihigh*a->ob_descr->itemsize,
577 (a->ob_size-ihigh)*a->ob_descr->itemsize);
578 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000579 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000580 /* Can't fail */
581 a->ob_item = item;
582 }
583 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000584 PyMem_RESIZE(item, char,
585 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000586 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000587 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000588 return -1;
589 }
590 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
591 item + ihigh*a->ob_descr->itemsize,
592 (a->ob_size-ihigh)*a->ob_descr->itemsize);
593 a->ob_item = item;
594 a->ob_size += d;
595 }
596 if (n > 0)
597 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
598 n*b->ob_descr->itemsize);
599 return 0;
600#undef b
601}
602
603static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000604array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000605{
606 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000607 PyErr_SetString(PyExc_IndexError,
608 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000609 return -1;
610 }
611 if (v == NULL)
612 return array_ass_slice(a, i, i+1, v);
613 return (*a->ob_descr->setitem)(a, i, v);
614}
615
616static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000617setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000618{
Tim Petersbb307342000-09-10 05:22:54 +0000619 assert(is_arrayobject(a));
Guido van Rossum778983b1993-02-19 15:55:02 +0000620 return array_ass_item((arrayobject *)a, i, v);
621}
622
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000623static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000624ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000625{
626 if (ins1(self, where, v) != 0)
627 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628 Py_INCREF(Py_None);
629 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000630}
631
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000632static PyObject *
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000633array_count(arrayobject *self, PyObject *args)
634{
635 int count = 0;
636 int i;
637 PyObject *v;
638
639 if (!PyArg_ParseTuple(args, "O:count", &v))
640 return NULL;
641 for (i = 0; i < self->ob_size; i++) {
642 PyObject *selfi = getarrayitem((PyObject *)self, i);
643 if (PyObject_Compare(selfi, v) == 0)
644 count++;
645 Py_DECREF(selfi);
646 if (PyErr_Occurred())
647 return NULL;
648 }
649 return PyInt_FromLong((long)count);
650}
651
652static char count_doc [] =
653"count (x)\n\
654\n\
655Return number of occurences of x in the array.";
656
657static PyObject *
658array_index(arrayobject *self, PyObject *args)
659{
660 int i;
661 PyObject *v;
662
663 if (!PyArg_ParseTuple(args, "O:index", &v))
664 return NULL;
665 for (i = 0; i < self->ob_size; i++) {
666 PyObject *selfi = getarrayitem((PyObject *)self, i);
667 if (PyObject_Compare(selfi, v) == 0) {
668 Py_DECREF(selfi);
669 return PyInt_FromLong((long)i);
670 }
671 Py_DECREF(selfi);
672 if (PyErr_Occurred())
673 return NULL;
674 }
675 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
676 return NULL;
677}
678
679static char index_doc [] =
680"index (x)\n\
681\n\
682Return index of first occurence of x in the array.";
683
684static PyObject *
685array_remove(arrayobject *self, PyObject *args)
686{
687 int i;
688 PyObject *v;
689
690 if (!PyArg_ParseTuple(args, "O:remove", &v))
691 return NULL;
692 for (i = 0; i < self->ob_size; i++) {
693 PyObject *selfi = getarrayitem((PyObject *)self,i);
694 if (PyObject_Compare(selfi, v) == 0) {
695 Py_DECREF(selfi);
696 if (array_ass_slice(self, i, i+1,
697 (PyObject *)NULL) != 0)
698 return NULL;
699 Py_INCREF(Py_None);
700 return Py_None;
701 }
702 Py_DECREF(selfi);
703 if (PyErr_Occurred())
704 return NULL;
705 }
706 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
707 return NULL;
708}
709
710static char remove_doc [] =
711"remove (x)\n\
712\n\
713Remove the first occurence of x in the array.";
714
715static PyObject *
716array_pop(arrayobject *self, PyObject *args)
717{
718 int i = -1;
719 PyObject *v;
720 if (!PyArg_ParseTuple(args, "|i:pop", &i))
721 return NULL;
722 if (self->ob_size == 0) {
723 /* Special-case most common failure cause */
724 PyErr_SetString(PyExc_IndexError, "pop from empty array");
725 return NULL;
726 }
727 if (i < 0)
728 i += self->ob_size;
729 if (i < 0 || i >= self->ob_size) {
730 PyErr_SetString(PyExc_IndexError, "pop index out of range");
731 return NULL;
732 }
733 v = getarrayitem((PyObject *)self,i);
734 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
735 Py_DECREF(v);
736 return NULL;
737 }
738 return v;
739}
740
741static char pop_doc [] =
742"pop ([i])\n\
743\n\
744Return the i-th element and delete it from the array. i defaults to -1.";
745
746static PyObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000747array_extend(arrayobject *self, PyObject *args)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000748{
749 int size;
750 PyObject *bb;
Tim Petersbb307342000-09-10 05:22:54 +0000751
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000752 if (!PyArg_ParseTuple(args, "O:extend", &bb))
753 return NULL;
Tim Petersbb307342000-09-10 05:22:54 +0000754
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000755 if (!is_arrayobject(bb)) {
756 PyErr_Format(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000757 "can only extend array with array (not \"%.200s\")",
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000758 bb->ob_type->tp_name);
759 return NULL;
760 }
761#define b ((arrayobject *)bb)
762 if (self->ob_descr != b->ob_descr) {
763 PyErr_SetString(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000764 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000765 return NULL;
766 }
767 size = self->ob_size + b->ob_size;
768 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
769 if (self->ob_item == NULL) {
770 PyObject_Del(self);
771 return PyErr_NoMemory();
772 }
773 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
774 b->ob_item, b->ob_size*b->ob_descr->itemsize);
775 self->ob_size = size;
776 Py_INCREF(Py_None);
777 return Py_None;
778#undef b
779}
780
781static char extend_doc [] =
782"extend(array)\n\
783\n\
784 Append array items to the end of the array.";
785
786static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000787array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000788{
789 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000790 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000791 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000792 return NULL;
793 return ins(self, i, v);
794}
795
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000796static char insert_doc [] =
797"insert (i,x)\n\
798\n\
799Insert a new item x into the array before position i.";
800
801
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000802static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000803array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000804{
Fred Drake541dc3b2000-06-28 17:49:30 +0000805 PyObject* retval = PyTuple_New(2);
806 if (!retval) return NULL;
807
808 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
809 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
810
811 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000812}
813
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000814static char buffer_info_doc [] =
815"buffer_info -> (address, length)\n\
816\n\
817Return a tuple (address, length) giving the current memory address and\n\
818the length in bytes of the buffer used to hold array's contents.";
819
820
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000821static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000822array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000823{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000824 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000825 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000826 return NULL;
827 return ins(self, (int) self->ob_size, v);
828}
829
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000830static char append_doc [] =
831"append(x)\n\
832\n\
833Append new value x to the end of the array.";
834
835
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000836static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000837array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000838{
839 char *p;
840 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000841
842 if (!PyArg_ParseTuple(args, ":byteswap"))
843 return NULL;
844
Guido van Rossum778983b1993-02-19 15:55:02 +0000845 switch (self->ob_descr->itemsize) {
846 case 1:
847 break;
848 case 2:
849 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
850 char p0 = p[0];
851 p[0] = p[1];
852 p[1] = p0;
853 }
854 break;
855 case 4:
856 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
857 char p0 = p[0];
858 char p1 = p[1];
859 p[0] = p[3];
860 p[1] = p[2];
861 p[2] = p1;
862 p[3] = p0;
863 }
864 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000865 case 8:
866 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
867 char p0 = p[0];
868 char p1 = p[1];
869 char p2 = p[2];
870 char p3 = p[3];
871 p[0] = p[7];
872 p[1] = p[6];
873 p[2] = p[5];
874 p[3] = p[4];
875 p[4] = p3;
876 p[5] = p2;
877 p[6] = p1;
878 p[7] = p0;
879 }
880 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000881 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000883 "don't know how to byteswap this array type");
884 return NULL;
885 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000886 Py_INCREF(Py_None);
887 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000888}
889
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000890static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000891"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000892\n\
Fred Drakebf272981999-12-03 17:15:30 +0000893Byteswap all items of the array. If the items in the array are not 1, 2,\n\
8944, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000895
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000896static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000897array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000898{
Guido van Rossume77a7571993-11-03 15:01:26 +0000899 register int itemsize = self->ob_descr->itemsize;
900 register char *p, *q;
901 char tmp[sizeof(double)]; /* Assume that's the max item size */
902
Guido van Rossum778983b1993-02-19 15:55:02 +0000903 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000904 PyErr_SetString(PyExc_TypeError,
905 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000906 return NULL;
907 }
908
909 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000910 for (p = self->ob_item,
911 q = self->ob_item + (self->ob_size - 1)*itemsize;
912 p < q;
913 p += itemsize, q -= itemsize) {
914 memmove(tmp, p, itemsize);
915 memmove(p, q, itemsize);
916 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000917 }
918 }
Tim Petersbb307342000-09-10 05:22:54 +0000919
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000920 Py_INCREF(Py_None);
921 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000922}
Guido van Rossume77a7571993-11-03 15:01:26 +0000923
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000924static char reverse_doc [] =
925"reverse()\n\
926\n\
927Reverse the order of the items in the array.";
928
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000929static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000930array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000931{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000932 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000933 int n;
934 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000935 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000936 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000937 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000938 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000939 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000940 return NULL;
941 }
942 if (n > 0) {
943 char *item = self->ob_item;
944 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000945 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000946 int newlength;
947 size_t newbytes;
948 /* Be careful here about overflow */
949 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000950 (newbytes = newlength * itemsize) / itemsize !=
951 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000952 goto nomem;
953 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000954 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000955 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000956 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000957 return NULL;
958 }
959 self->ob_item = item;
960 self->ob_size += n;
961 nread = fread(item + (self->ob_size - n) * itemsize,
962 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000963 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000964 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000965 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000966 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyErr_SetString(PyExc_EOFError,
968 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000969 return NULL;
970 }
971 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000972 Py_INCREF(Py_None);
973 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000974}
975
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000976static char fromfile_doc [] =
977"fromfile(f, n)\n\
978\n\
979Read n objects from the file object f and append them to the end of the\n\
980array. Also called as read.";
981
982
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000983static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000984array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000985{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000986 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000987 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000988 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +0000989 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000990 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000991 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000992 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000993 return NULL;
994 }
995 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +0000996 if (fwrite(self->ob_item, self->ob_descr->itemsize,
997 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000998 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +0000999 clearerr(fp);
1000 return NULL;
1001 }
1002 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001003 Py_INCREF(Py_None);
1004 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001005}
1006
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001007static char tofile_doc [] =
1008"tofile(f)\n\
1009\n\
1010Write all items (as machine values) to the file object f. Also called as\n\
1011write.";
1012
1013
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001014static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001015array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001016{
1017 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001018 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001019 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001020 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001021 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001022 if (!PyList_Check(list)) {
1023 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001024 return NULL;
1025 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001026 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001027 if (n > 0) {
1028 char *item = self->ob_item;
1029 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001030 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 return NULL;
1034 }
1035 self->ob_item = item;
1036 self->ob_size += n;
1037 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001038 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001039 if ((*self->ob_descr->setitem)(self,
1040 self->ob_size - n + i, v) != 0) {
1041 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001042 PyMem_RESIZE(item, char,
1043 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001044 self->ob_item = item;
1045 return NULL;
1046 }
1047 }
1048 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001049 Py_INCREF(Py_None);
1050 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001051}
1052
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001053static char fromlist_doc [] =
1054"fromlist(list)\n\
1055\n\
1056Append items to array from list.";
1057
1058
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001060array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001061{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001062 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001063 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001064 if (!PyArg_ParseTuple(args, ":tolist"))
1065 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001066 if (list == NULL)
1067 return NULL;
1068 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001069 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001070 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001071 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001072 return NULL;
1073 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001074 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001075 }
1076 return list;
1077}
1078
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001079static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001080"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001081\n\
1082Convert array to an ordinary list with the same items.";
1083
1084
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001085static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001086array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001087{
1088 char *str;
1089 int n;
1090 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001091 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001092 return NULL;
1093 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001094 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001095 "string length not a multiple of item size");
1096 return NULL;
1097 }
1098 n = n / itemsize;
1099 if (n > 0) {
1100 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001101 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001102 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001103 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001104 return NULL;
1105 }
1106 self->ob_item = item;
1107 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001108 memcpy(item + (self->ob_size - n) * itemsize,
1109 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001111 Py_INCREF(Py_None);
1112 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001113}
1114
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001115static char fromstring_doc [] =
1116"fromstring(string)\n\
1117\n\
1118Appends items from the string, interpreting it as an array of machine\n\
1119values,as if it had been read from a file using the fromfile() method).";
1120
1121
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001122static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001123array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001124{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001125 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001126 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001128 self->ob_size * self->ob_descr->itemsize);
1129}
1130
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001131static char tostring_doc [] =
1132"tostring() -> string\n\
1133\n\
1134Convert the array to an array of machine values and return the string\n\
1135representation.";
1136
1137PyMethodDef array_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001138 {"append", (PyCFunction)array_append, METH_VARARGS, append_doc},
1139 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS, buffer_info_doc},
1140 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS, byteswap_doc},
1141 {"count", (PyCFunction)array_count, METH_VARARGS, count_doc},
1142 {"extend", (PyCFunction)array_extend, METH_VARARGS, extend_doc},
1143 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1144 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS, fromlist_doc},
1145 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc},
1146 {"index", (PyCFunction)array_index, METH_VARARGS, index_doc},
1147 {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc},
1148 {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc},
1149 {"read", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1150 {"remove", (PyCFunction)array_remove, METH_VARARGS, remove_doc},
1151 {"reverse", (PyCFunction)array_reverse, METH_VARARGS, reverse_doc},
1152/* {"sort", (PyCFunction)array_sort, METH_VARARGS, sort_doc},*/
1153 {"tofile", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
1154 {"tolist", (PyCFunction)array_tolist, METH_VARARGS, tolist_doc},
1155 {"tostring", (PyCFunction)array_tostring, METH_VARARGS, tostring_doc},
1156 {"write", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001157 {NULL, NULL} /* sentinel */
1158};
1159
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001160static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001161array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001162{
1163 if (strcmp(name, "typecode") == 0) {
1164 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001165 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001166 }
1167 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001168 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001170 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001171 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001172 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001173 PyList_SetItem(list, 0,
1174 PyString_FromString("typecode"));
1175 PyList_SetItem(list, 1,
1176 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001177 if (PyErr_Occurred()) {
1178 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001179 list = NULL;
1180 }
1181 }
1182 return list;
1183 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001184 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001185}
1186
1187static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001188array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001189{
1190 int ok = 0;
1191 int i, len;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001192 PyObject *t_empty = PyTuple_New(0);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001193 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001194 len = a->ob_size;
1195 if (len == 0) {
1196 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1197 return ok;
1198 }
1199 if (a->ob_descr->typecode == 'c') {
1200 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001201 v = array_tostring(a, t_empty);
1202 Py_DECREF(t_empty);;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001203 ok = PyObject_Print(v, fp, 0);
1204 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001205 fprintf(fp, ")");
1206 return ok;
1207 }
1208 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1209 for (i = 0; i < len && ok == 0; i++) {
1210 if (i > 0)
1211 fprintf(fp, ", ");
1212 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001213 ok = PyObject_Print(v, fp, 0);
1214 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001215 }
1216 fprintf(fp, "])");
1217 return ok;
1218}
1219
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001220static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001221array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001222{
1223 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001224 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001225 int i, len;
1226 len = a->ob_size;
1227 if (len == 0) {
1228 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001229 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001230 }
1231 if (a->ob_descr->typecode == 'c') {
1232 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001233 s = PyString_FromString(buf);
1234 v = array_tostring(a, (PyObject *)NULL);
1235 t = PyObject_Repr(v);
1236 Py_XDECREF(v);
1237 PyString_ConcatAndDel(&s, t);
1238 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001239 return s;
1240 }
1241 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001242 s = PyString_FromString(buf);
1243 comma = PyString_FromString(", ");
1244 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001245 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001246 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001247 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001248 t = PyObject_Repr(v);
1249 Py_XDECREF(v);
1250 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001252 Py_XDECREF(comma);
1253 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001254 return s;
1255}
1256
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001257static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001258array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001259{
1260 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001261 PyErr_SetString(PyExc_SystemError,
1262 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001263 return -1;
1264 }
1265 *ptr = (void *)self->ob_item;
1266 return self->ob_size*self->ob_descr->itemsize;
1267}
1268
1269static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001270array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001271{
1272 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001273 PyErr_SetString(PyExc_SystemError,
1274 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001275 return -1;
1276 }
1277 *ptr = (void *)self->ob_item;
1278 return self->ob_size*self->ob_descr->itemsize;
1279}
1280
1281static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001282array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001283{
1284 if ( lenp )
1285 *lenp = self->ob_size*self->ob_descr->itemsize;
1286 return 1;
1287}
1288
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001289static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001290 (inquiry)array_length, /*sq_length*/
1291 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001292 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001293 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001294 (intintargfunc)array_slice, /*sq_slice*/
1295 (intobjargproc)array_ass_item, /*sq_ass_item*/
1296 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001297};
1298
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001299static PyBufferProcs array_as_buffer = {
1300 (getreadbufferproc)array_buffer_getreadbuf,
1301 (getwritebufferproc)array_buffer_getwritebuf,
1302 (getsegcountproc)array_buffer_getsegcount,
1303};
1304
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001305static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001306a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001307{
1308 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001309 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001310 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001311 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001312 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001313 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001314 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001315 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1316 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001317 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001318 return NULL;
1319 }
1320 }
1321 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1322 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001323 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001324 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001326 len = 0;
1327 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001328 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001329 a = newarrayobject(len, descr);
1330 if (a == NULL)
1331 return NULL;
1332 if (len > 0) {
1333 int i;
1334 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335 PyObject *v =
1336 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001337 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001339 return NULL;
1340 }
1341 }
1342 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001343 if (initial != NULL && PyString_Check(initial)) {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001344 PyObject *t_initial = Py_BuildValue("(O)", initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001345 PyObject *v =
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001346 array_fromstring((arrayobject *)a, t_initial);
1347 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001348 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 return NULL;
1351 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001352 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001353 }
1354 return a;
1355 }
1356 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001357 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001358 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001359 return NULL;
1360}
1361
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001362static char a_array_doc [] =
1363"array(typecode [, initializer]) -> array\n\
1364\n\
1365Return a new array whose items are restricted by typecode, and\n\
1366initialized from the optional initializer value, which must be a list\n\
1367or a string.";
1368
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001369static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001370 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001371 {NULL, NULL} /* sentinel */
1372};
1373
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001374static char module_doc [] =
1375"This module defines a new object type which can efficiently represent\n\
1376an array of basic values: characters, integers, floating point\n\
1377numbers. Arrays are sequence types and behave very much like lists,\n\
1378except that the type of objects stored in them is constrained. The\n\
1379type is specified at object creation time by using a type code, which\n\
1380is a single character. The following type codes are defined:\n\
1381\n\
1382 Type code C Type Minimum size in bytes \n\
1383 'c' character 1 \n\
1384 'b' signed integer 1 \n\
1385 'B' unsigned integer 1 \n\
1386 'h' signed integer 2 \n\
1387 'H' unsigned integer 2 \n\
1388 'i' signed integer 2 \n\
1389 'I' unsigned integer 2 \n\
1390 'l' signed integer 4 \n\
1391 'L' unsigned integer 4 \n\
1392 'f' floating point 4 \n\
1393 'd' floating point 8 \n\
1394\n\
1395Functions:\n\
1396\n\
1397array(typecode [, initializer]) -- create a new array\n\
1398\n\
1399Special Objects:\n\
1400\n\
1401ArrayType -- type object for array objects\n\
1402";
1403
1404static char arraytype_doc [] =
1405"An array represents basic values and behave very much like lists, except\n\
1406the type of objects stored in them is constrained.\n\
1407\n\
1408Methods:\n\
1409\n\
1410append() -- append a new item to the end of the array\n\
1411buffer_info() -- return information giving the current memory info\n\
1412byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001413count() -- return number of occurences of an object\n\
1414extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001415fromfile() -- read items from a file object\n\
1416fromlist() -- append items from the list\n\
1417fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001418index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001419insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001420pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001421read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001422remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001423reverse() -- reverse the order of the items in the array\n\
1424tofile() -- write all items to a file object\n\
1425tolist() -- return the array converted to an ordinary list\n\
1426tostring() -- return the array converted to a string\n\
1427write() -- DEPRECATED, use tofile()\n\
1428\n\
1429Variables:\n\
1430\n\
1431typecode -- the typecode character used to create the array\n\
1432itemsize -- the length in bytes of one array item\n\
1433";
1434
1435statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001436 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001437 0,
1438 "array",
1439 sizeof(arrayobject),
1440 0,
1441 (destructor)array_dealloc, /*tp_dealloc*/
1442 (printfunc)array_print, /*tp_print*/
1443 (getattrfunc)array_getattr, /*tp_getattr*/
1444 0, /*tp_setattr*/
1445 (cmpfunc)array_compare, /*tp_compare*/
1446 (reprfunc)array_repr, /*tp_repr*/
1447 0, /*tp_as_number*/
1448 &array_as_sequence, /*tp_as_sequence*/
1449 0, /*tp_as_mapping*/
1450 0, /*tp_hash*/
1451 0, /*tp_call*/
1452 0, /*tp_str*/
1453 0, /*tp_getattro*/
1454 0, /*tp_setattro*/
1455 &array_as_buffer, /*tp_as_buffer*/
1456 0, /*tp_xxx4*/
1457 arraytype_doc, /*tp_doc*/
1458};
1459
Guido van Rossum3886bb61998-12-04 18:50:17 +00001460DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001461initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001462{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001463 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001464
1465 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001466 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001467 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001468 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1469 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001470}