blob: 530b214c1ab16b6dea13607468ebee36462116b4 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum778983b1993-02-19 15:55:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum778983b1993-02-19 15:55:02 +00009******************************************************************/
10
11/* Array object implementation */
12
13/* An array is a uniform list -- all items have the same type.
14 The item type is restricted to simple C types like int or float */
15
Roger E. Masse2919eaa1996-12-09 20:10:36 +000016#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +000017
Guido van Rossum0c709541994-08-19 12:01:32 +000018#ifdef STDC_HEADERS
19#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000020#else /* !STDC_HEADERS */
21#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000022#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000023#endif /* DONT_HAVE_SYS_TYPES_H */
24#endif /* !STDC_HEADERS */
Guido van Rossumdb677392000-07-01 01:09:43 +000025#ifdef HAVE_LIMITS_H
26#include <limits.h>
27#endif /* HAVE_LIMITS_H */
Guido van Rossum778983b1993-02-19 15:55:02 +000028
29struct arrayobject; /* Forward */
30
31struct arraydescr {
32 int typecode;
33 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000034 PyObject * (*getitem)(struct arrayobject *, int);
35 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000036};
37
38typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000039 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000040 char *ob_item;
41 struct arraydescr *ob_descr;
42} arrayobject;
43
Roger E. Masse2919eaa1996-12-09 20:10:36 +000044staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000045
46#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
47
Guido van Rossumb73cc041993-11-01 16:28:59 +000048/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000049static PyObject *newarrayobject(int, struct arraydescr *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000050#if 0
Tim Petersdbd9ba62000-07-09 03:09:57 +000051static int getarraysize(PyObject *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000052#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000053static PyObject *getarrayitem(PyObject *, int);
54static int setarrayitem(PyObject *, int, PyObject *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000055#if 0
Tim Petersdbd9ba62000-07-09 03:09:57 +000056static int insarrayitem(PyObject *, int, PyObject *);
57static int addarrayitem(PyObject *, PyObject *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000058#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000059
Roger E. Masse2919eaa1996-12-09 20:10:36 +000060static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000061c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000062{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000063 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000064}
65
66static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000067c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000068{
69 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000070 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000071 return -1;
72 if (i >= 0)
73 ((char *)ap->ob_item)[i] = x;
74 return 0;
75}
76
Roger E. Masse2919eaa1996-12-09 20:10:36 +000077static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000078b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000079{
80 long x = ((char *)ap->ob_item)[i];
81 if (x >= 128)
82 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000083 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000084}
85
86static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000087b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000088{
Fred Drake541dc3b2000-06-28 17:49:30 +000089 short x;
90 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
91 must use the next size up that is signed ('h') and manually do
92 the overflow checking */
93 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000094 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +000095 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +000096 PyErr_SetString(PyExc_OverflowError,
97 "signed char is less than minimum");
98 return -1;
99 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000100 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000101 PyErr_SetString(PyExc_OverflowError,
102 "signed char is greater than maximum");
103 return -1;
104 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000105 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000106 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000107 return 0;
108}
109
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000110static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000111BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000112{
113 long x = ((unsigned char *)ap->ob_item)[i];
114 return PyInt_FromLong(x);
115}
116
Fred Drake541dc3b2000-06-28 17:49:30 +0000117static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000118BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000119{
120 unsigned char x;
121 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
122 if (!PyArg_Parse(v, "b;array item must be integer", &x))
123 return -1;
124 if (i >= 0)
125 ((char *)ap->ob_item)[i] = x;
126 return 0;
127}
Guido van Rossum549ab711997-01-03 19:09:47 +0000128
129static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000130h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000131{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000132 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000133}
134
135static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000136h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000137{
138 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000139 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000140 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000141 return -1;
142 if (i >= 0)
143 ((short *)ap->ob_item)[i] = x;
144 return 0;
145}
146
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000147static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000148HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000149{
150 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
151}
152
Fred Drake541dc3b2000-06-28 17:49:30 +0000153static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000154HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000155{
156 int x;
157 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
158 must use the next size up and manually do the overflow checking */
159 if (!PyArg_Parse(v, "i;array item must be integer", &x))
160 return -1;
161 else if (x < 0) {
162 PyErr_SetString(PyExc_OverflowError,
163 "unsigned short is less than minimum");
164 return -1;
165 }
166 else if (x > USHRT_MAX) {
167 PyErr_SetString(PyExc_OverflowError,
168 "unsigned short is greater than maximum");
169 return -1;
170 }
171 if (i >= 0)
172 ((short *)ap->ob_item)[i] = (short)x;
173 return 0;
174}
Guido van Rossum549ab711997-01-03 19:09:47 +0000175
176static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000177i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000178{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000179 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000180}
181
182static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000183i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000184{
185 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000186 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000187 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000188 return -1;
189 if (i >= 0)
190 ((int *)ap->ob_item)[i] = x;
191 return 0;
192}
193
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000194static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000195II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000196{
197 return PyLong_FromUnsignedLong(
198 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
199}
200
201static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000202II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000203{
204 unsigned long x;
205 if (PyLong_Check(v)) {
206 x = PyLong_AsUnsignedLong(v);
207 if (x == (unsigned long) -1 && PyErr_Occurred())
208 return -1;
209 }
210 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000211 long y;
212 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000213 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000214 if (y < 0) {
215 PyErr_SetString(PyExc_OverflowError,
216 "unsigned int is less than minimum");
217 return -1;
218 }
219 x = (unsigned long)y;
220
Guido van Rossum549ab711997-01-03 19:09:47 +0000221 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000222 if (x > UINT_MAX) {
223 PyErr_SetString(PyExc_OverflowError,
224 "unsigned int is greater than maximum");
225 return -1;
226 }
227
Guido van Rossum549ab711997-01-03 19:09:47 +0000228 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000229 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000230 return 0;
231}
232
233static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000234l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000235{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000236 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000237}
238
239static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000240l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000241{
242 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000243 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000244 return -1;
245 if (i >= 0)
246 ((long *)ap->ob_item)[i] = x;
247 return 0;
248}
249
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000250static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000251LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000252{
253 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
254}
255
256static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000257LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000258{
259 unsigned long x;
260 if (PyLong_Check(v)) {
261 x = PyLong_AsUnsignedLong(v);
262 if (x == (unsigned long) -1 && PyErr_Occurred())
263 return -1;
264 }
265 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000266 long y;
267 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000268 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000269 if (y < 0) {
270 PyErr_SetString(PyExc_OverflowError,
271 "unsigned long is less than minimum");
272 return -1;
273 }
274 x = (unsigned long)y;
275
Guido van Rossum549ab711997-01-03 19:09:47 +0000276 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000277 if (x > ULONG_MAX) {
278 PyErr_SetString(PyExc_OverflowError,
279 "unsigned long is greater than maximum");
280 return -1;
281 }
282
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 if (i >= 0)
284 ((unsigned long *)ap->ob_item)[i] = x;
285 return 0;
286}
287
288static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000289f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000290{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000291 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000292}
293
294static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000295f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000296{
297 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000298 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000299 return -1;
300 if (i >= 0)
301 ((float *)ap->ob_item)[i] = x;
302 return 0;
303}
304
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000305static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000306d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000307{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000308 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000309}
310
311static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000312d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000313{
314 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000315 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000316 return -1;
317 if (i >= 0)
318 ((double *)ap->ob_item)[i] = x;
319 return 0;
320}
321
322/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000323static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000324 {'c', sizeof(char), c_getitem, c_setitem},
325 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000326 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000327 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000328 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000329 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000330 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000331 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000332 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000333 {'f', sizeof(float), f_getitem, f_setitem},
334 {'d', sizeof(double), d_getitem, d_setitem},
335 {'\0', 0, 0, 0} /* Sentinel */
336};
Guido van Rossume77a7571993-11-03 15:01:26 +0000337/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000338
339
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000340static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000341newarrayobject(int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000342{
Guido van Rossum778983b1993-02-19 15:55:02 +0000343 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000344 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000345 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000346 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000347 return NULL;
348 }
349 nbytes = size * descr->itemsize;
350 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000351 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000352 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000353 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000354 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000355 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000356 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000357 }
358 if (size <= 0) {
359 op->ob_item = NULL;
360 }
361 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000362 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000363 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000364 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000365 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000366 }
367 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000368 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000369 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000370}
371
Guido van Rossuma376cc51996-12-05 23:43:35 +0000372#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000373static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000374getarraysize(PyObject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000375{
376 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000377 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000378 return -1;
379 }
380 return ((arrayobject *)op) -> ob_size;
381}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000382#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000383
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000384static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000385getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000386{
387 register arrayobject *ap;
388 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000389 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000390 return NULL;
391 }
392 ap = (arrayobject *)op;
393 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000394 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000395 return NULL;
396 }
397 return (*ap->ob_descr->getitem)(ap, i);
398}
399
400static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000401ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000402{
Guido van Rossum778983b1993-02-19 15:55:02 +0000403 char *items;
404 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000405 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 return -1;
407 }
408 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
409 return -1;
410 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000411 PyMem_RESIZE(items, char,
412 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000413 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000414 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 return -1;
416 }
417 if (where < 0)
418 where = 0;
419 if (where > self->ob_size)
420 where = self->ob_size;
421 memmove(items + (where+1)*self->ob_descr->itemsize,
422 items + where*self->ob_descr->itemsize,
423 (self->ob_size-where)*self->ob_descr->itemsize);
424 self->ob_item = items;
425 self->ob_size++;
426 return (*self->ob_descr->setitem)(self, where, v);
427}
428
Guido van Rossuma376cc51996-12-05 23:43:35 +0000429#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000430static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000431insarrayitem(PyObject *op, int where, PyObject *newitem)
Guido van Rossum778983b1993-02-19 15:55:02 +0000432{
433 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000434 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 return -1;
436 }
437 return ins1((arrayobject *)op, where, newitem);
438}
439
Guido van Rossum62de97f1995-01-22 00:48:41 +0000440static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000441addarrayitem(PyObject *op, PyObject *newitem)
Guido van Rossum778983b1993-02-19 15:55:02 +0000442{
443 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000444 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000445 return -1;
446 }
447 return ins1((arrayobject *)op,
448 (int) ((arrayobject *)op)->ob_size, newitem);
449}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000450#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000451
452/* Methods */
453
454static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000455array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000456{
Guido van Rossum778983b1993-02-19 15:55:02 +0000457 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000458 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000459 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000460}
461
462static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000463array_compare(arrayobject *v, arrayobject *w)
Guido van Rossum778983b1993-02-19 15:55:02 +0000464{
465 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
466 int i;
467 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000470 ai = getarrayitem((PyObject *)v, i);
471 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000472 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000473 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000474 else
475 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000476 Py_XDECREF(ai);
477 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000478 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000479 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000480 }
481 return v->ob_size - w->ob_size;
482}
483
484static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000485array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000486{
487 return a->ob_size;
488}
489
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000490static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000491array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000492{
493 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000494 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000495 return NULL;
496 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000497 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000498}
499
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000501array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000502{
503 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000504 if (ilow < 0)
505 ilow = 0;
506 else if (ilow > a->ob_size)
507 ilow = a->ob_size;
508 if (ihigh < 0)
509 ihigh = 0;
510 if (ihigh < ilow)
511 ihigh = ilow;
512 else if (ihigh > a->ob_size)
513 ihigh = a->ob_size;
514 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
515 if (np == NULL)
516 return NULL;
517 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
518 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000519 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000520}
521
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000522static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000523array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000524{
525 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000526 arrayobject *np;
527 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000528 PyErr_Format(PyExc_TypeError,
529 "can only append array (not \"%.200s\") to array",
530 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000531 return NULL;
532 }
533#define b ((arrayobject *)bb)
534 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000535 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000536 return NULL;
537 }
538 size = a->ob_size + b->ob_size;
539 np = (arrayobject *) newarrayobject(size, a->ob_descr);
540 if (np == NULL) {
541 return NULL;
542 }
543 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
544 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000545 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000546 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000547#undef b
548}
549
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000550static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000551array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000552{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000553 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000554 int size;
555 arrayobject *np;
556 char *p;
557 int nbytes;
558 if (n < 0)
559 n = 0;
560 size = a->ob_size * n;
561 np = (arrayobject *) newarrayobject(size, a->ob_descr);
562 if (np == NULL)
563 return NULL;
564 p = np->ob_item;
565 nbytes = a->ob_size * a->ob_descr->itemsize;
566 for (i = 0; i < n; i++) {
567 memcpy(p, a->ob_item, nbytes);
568 p += nbytes;
569 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000570 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000571}
572
573static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000574array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000575{
576 char *item;
577 int n; /* Size of replacement array */
578 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000579#define b ((arrayobject *)v)
580 if (v == NULL)
581 n = 0;
582 else if (is_arrayobject(v)) {
583 n = b->ob_size;
584 if (a == b) {
585 /* Special case "a[i:j] = a" -- copy b first */
586 int ret;
587 v = array_slice(b, 0, n);
588 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000589 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000590 return ret;
591 }
592 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000593 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000594 return -1;
595 }
596 }
597 else {
Fred Drake137507e2000-06-01 02:02:46 +0000598 PyErr_Format(PyExc_TypeError,
599 "can only assign array (not \"%.200s\") to array slice",
600 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000601 return -1;
602 }
603 if (ilow < 0)
604 ilow = 0;
605 else if (ilow > a->ob_size)
606 ilow = a->ob_size;
607 if (ihigh < 0)
608 ihigh = 0;
609 if (ihigh < ilow)
610 ihigh = ilow;
611 else if (ihigh > a->ob_size)
612 ihigh = a->ob_size;
613 item = a->ob_item;
614 d = n - (ihigh-ilow);
615 if (d < 0) { /* Delete -d items */
616 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
617 item + ihigh*a->ob_descr->itemsize,
618 (a->ob_size-ihigh)*a->ob_descr->itemsize);
619 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000620 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 /* Can't fail */
622 a->ob_item = item;
623 }
624 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000625 PyMem_RESIZE(item, char,
626 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000627 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000628 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000629 return -1;
630 }
631 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
632 item + ihigh*a->ob_descr->itemsize,
633 (a->ob_size-ihigh)*a->ob_descr->itemsize);
634 a->ob_item = item;
635 a->ob_size += d;
636 }
637 if (n > 0)
638 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
639 n*b->ob_descr->itemsize);
640 return 0;
641#undef b
642}
643
644static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000645array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000646{
647 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000648 PyErr_SetString(PyExc_IndexError,
649 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000650 return -1;
651 }
652 if (v == NULL)
653 return array_ass_slice(a, i, i+1, v);
654 return (*a->ob_descr->setitem)(a, i, v);
655}
656
657static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000658setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000659{
660 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000661 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000662 return -1;
663 }
664 return array_ass_item((arrayobject *)a, i, v);
665}
666
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000668ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000669{
670 if (ins1(self, where, v) != 0)
671 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000672 Py_INCREF(Py_None);
673 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000674}
675
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000676static PyObject *
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000677array_count(arrayobject *self, PyObject *args)
678{
679 int count = 0;
680 int i;
681 PyObject *v;
682
683 if (!PyArg_ParseTuple(args, "O:count", &v))
684 return NULL;
685 for (i = 0; i < self->ob_size; i++) {
686 PyObject *selfi = getarrayitem((PyObject *)self, i);
687 if (PyObject_Compare(selfi, v) == 0)
688 count++;
689 Py_DECREF(selfi);
690 if (PyErr_Occurred())
691 return NULL;
692 }
693 return PyInt_FromLong((long)count);
694}
695
696static char count_doc [] =
697"count (x)\n\
698\n\
699Return number of occurences of x in the array.";
700
701static PyObject *
702array_index(arrayobject *self, PyObject *args)
703{
704 int i;
705 PyObject *v;
706
707 if (!PyArg_ParseTuple(args, "O:index", &v))
708 return NULL;
709 for (i = 0; i < self->ob_size; i++) {
710 PyObject *selfi = getarrayitem((PyObject *)self, i);
711 if (PyObject_Compare(selfi, v) == 0) {
712 Py_DECREF(selfi);
713 return PyInt_FromLong((long)i);
714 }
715 Py_DECREF(selfi);
716 if (PyErr_Occurred())
717 return NULL;
718 }
719 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
720 return NULL;
721}
722
723static char index_doc [] =
724"index (x)\n\
725\n\
726Return index of first occurence of x in the array.";
727
728static PyObject *
729array_remove(arrayobject *self, PyObject *args)
730{
731 int i;
732 PyObject *v;
733
734 if (!PyArg_ParseTuple(args, "O:remove", &v))
735 return NULL;
736 for (i = 0; i < self->ob_size; i++) {
737 PyObject *selfi = getarrayitem((PyObject *)self,i);
738 if (PyObject_Compare(selfi, v) == 0) {
739 Py_DECREF(selfi);
740 if (array_ass_slice(self, i, i+1,
741 (PyObject *)NULL) != 0)
742 return NULL;
743 Py_INCREF(Py_None);
744 return Py_None;
745 }
746 Py_DECREF(selfi);
747 if (PyErr_Occurred())
748 return NULL;
749 }
750 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
751 return NULL;
752}
753
754static char remove_doc [] =
755"remove (x)\n\
756\n\
757Remove the first occurence of x in the array.";
758
759static PyObject *
760array_pop(arrayobject *self, PyObject *args)
761{
762 int i = -1;
763 PyObject *v;
764 if (!PyArg_ParseTuple(args, "|i:pop", &i))
765 return NULL;
766 if (self->ob_size == 0) {
767 /* Special-case most common failure cause */
768 PyErr_SetString(PyExc_IndexError, "pop from empty array");
769 return NULL;
770 }
771 if (i < 0)
772 i += self->ob_size;
773 if (i < 0 || i >= self->ob_size) {
774 PyErr_SetString(PyExc_IndexError, "pop index out of range");
775 return NULL;
776 }
777 v = getarrayitem((PyObject *)self,i);
778 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
779 Py_DECREF(v);
780 return NULL;
781 }
782 return v;
783}
784
785static char pop_doc [] =
786"pop ([i])\n\
787\n\
788Return the i-th element and delete it from the array. i defaults to -1.";
789
790static PyObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000791array_extend(arrayobject *self, PyObject *args)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000792{
793 int size;
794 PyObject *bb;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000795
796 if (!PyArg_ParseTuple(args, "O:extend", &bb))
797 return NULL;
798
799 if (!is_arrayobject(bb)) {
800 PyErr_Format(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000801 "can only extend array with array (not \"%.200s\")",
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000802 bb->ob_type->tp_name);
803 return NULL;
804 }
805#define b ((arrayobject *)bb)
806 if (self->ob_descr != b->ob_descr) {
807 PyErr_SetString(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000808 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000809 return NULL;
810 }
811 size = self->ob_size + b->ob_size;
812 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
813 if (self->ob_item == NULL) {
814 PyObject_Del(self);
815 return PyErr_NoMemory();
816 }
817 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
818 b->ob_item, b->ob_size*b->ob_descr->itemsize);
819 self->ob_size = size;
820 Py_INCREF(Py_None);
821 return Py_None;
822#undef b
823}
824
825static char extend_doc [] =
826"extend(array)\n\
827\n\
828 Append array items to the end of the array.";
829
830static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000831array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000832{
833 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000834 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000835 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000836 return NULL;
837 return ins(self, i, v);
838}
839
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000840static char insert_doc [] =
841"insert (i,x)\n\
842\n\
843Insert a new item x into the array before position i.";
844
845
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000846static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000847array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000848{
Fred Drake541dc3b2000-06-28 17:49:30 +0000849 PyObject* retval = PyTuple_New(2);
850 if (!retval) return NULL;
851
852 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
853 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
854
855 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000856}
857
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000858static char buffer_info_doc [] =
859"buffer_info -> (address, length)\n\
860\n\
861Return a tuple (address, length) giving the current memory address and\n\
862the length in bytes of the buffer used to hold array's contents.";
863
864
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000865static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000866array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000867{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000868 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000869 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000870 return NULL;
871 return ins(self, (int) self->ob_size, v);
872}
873
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000874static char append_doc [] =
875"append(x)\n\
876\n\
877Append new value x to the end of the array.";
878
879
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000880static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000881array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000882{
883 char *p;
884 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000885
886 if (!PyArg_ParseTuple(args, ":byteswap"))
887 return NULL;
888
Guido van Rossum778983b1993-02-19 15:55:02 +0000889 switch (self->ob_descr->itemsize) {
890 case 1:
891 break;
892 case 2:
893 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
894 char p0 = p[0];
895 p[0] = p[1];
896 p[1] = p0;
897 }
898 break;
899 case 4:
900 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
901 char p0 = p[0];
902 char p1 = p[1];
903 p[0] = p[3];
904 p[1] = p[2];
905 p[2] = p1;
906 p[3] = p0;
907 }
908 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000909 case 8:
910 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
911 char p0 = p[0];
912 char p1 = p[1];
913 char p2 = p[2];
914 char p3 = p[3];
915 p[0] = p[7];
916 p[1] = p[6];
917 p[2] = p[5];
918 p[3] = p[4];
919 p[4] = p3;
920 p[5] = p2;
921 p[6] = p1;
922 p[7] = p0;
923 }
924 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000925 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000926 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000927 "don't know how to byteswap this array type");
928 return NULL;
929 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000930 Py_INCREF(Py_None);
931 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000932}
933
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000934static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000935"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000936\n\
Fred Drakebf272981999-12-03 17:15:30 +0000937Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9384, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000939
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000940static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000941array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000942{
Guido van Rossume77a7571993-11-03 15:01:26 +0000943 register int itemsize = self->ob_descr->itemsize;
944 register char *p, *q;
945 char tmp[sizeof(double)]; /* Assume that's the max item size */
946
Guido van Rossum778983b1993-02-19 15:55:02 +0000947 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000948 PyErr_SetString(PyExc_TypeError,
949 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000950 return NULL;
951 }
952
953 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000954 for (p = self->ob_item,
955 q = self->ob_item + (self->ob_size - 1)*itemsize;
956 p < q;
957 p += itemsize, q -= itemsize) {
958 memmove(tmp, p, itemsize);
959 memmove(p, q, itemsize);
960 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000961 }
962 }
963
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000964 Py_INCREF(Py_None);
965 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000966}
Guido van Rossume77a7571993-11-03 15:01:26 +0000967
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000968static char reverse_doc [] =
969"reverse()\n\
970\n\
971Reverse the order of the items in the array.";
972
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000973static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000974array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000975{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000976 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000977 int n;
978 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000979 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000980 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000981 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000982 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000983 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000984 return NULL;
985 }
986 if (n > 0) {
987 char *item = self->ob_item;
988 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000989 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000990 int newlength;
991 size_t newbytes;
992 /* Be careful here about overflow */
993 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000994 (newbytes = newlength * itemsize) / itemsize !=
995 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000996 goto nomem;
997 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000998 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000999 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001000 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 return NULL;
1002 }
1003 self->ob_item = item;
1004 self->ob_size += n;
1005 nread = fread(item + (self->ob_size - n) * itemsize,
1006 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001007 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001008 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001009 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001010 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001011 PyErr_SetString(PyExc_EOFError,
1012 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001013 return NULL;
1014 }
1015 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016 Py_INCREF(Py_None);
1017 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001018}
1019
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001020static char fromfile_doc [] =
1021"fromfile(f, n)\n\
1022\n\
1023Read n objects from the file object f and append them to the end of the\n\
1024array. Also called as read.";
1025
1026
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001027static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001028array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001029{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001030 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001032 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001037 return NULL;
1038 }
1039 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001040 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1041 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001042 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001043 clearerr(fp);
1044 return NULL;
1045 }
1046 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001047 Py_INCREF(Py_None);
1048 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001049}
1050
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001051static char tofile_doc [] =
1052"tofile(f)\n\
1053\n\
1054Write all items (as machine values) to the file object f. Also called as\n\
1055write.";
1056
1057
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001058static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001059array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001060{
1061 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001062 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001063 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001064 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001065 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001066 if (!PyList_Check(list)) {
1067 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 return NULL;
1069 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001070 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001071 if (n > 0) {
1072 char *item = self->ob_item;
1073 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001074 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001075 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001076 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001077 return NULL;
1078 }
1079 self->ob_item = item;
1080 self->ob_size += n;
1081 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001082 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001083 if ((*self->ob_descr->setitem)(self,
1084 self->ob_size - n + i, v) != 0) {
1085 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001086 PyMem_RESIZE(item, char,
1087 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001088 self->ob_item = item;
1089 return NULL;
1090 }
1091 }
1092 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001093 Py_INCREF(Py_None);
1094 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001095}
1096
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001097static char fromlist_doc [] =
1098"fromlist(list)\n\
1099\n\
1100Append items to array from list.";
1101
1102
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001103static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001104array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001105{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001106 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001107 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001108 if (!PyArg_ParseTuple(args, ":tolist"))
1109 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 if (list == NULL)
1111 return NULL;
1112 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001113 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001114 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001115 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001116 return NULL;
1117 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001118 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001119 }
1120 return list;
1121}
1122
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001123static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001124"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001125\n\
1126Convert array to an ordinary list with the same items.";
1127
1128
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001130array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001131{
1132 char *str;
1133 int n;
1134 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001135 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001136 return NULL;
1137 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001138 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001139 "string length not a multiple of item size");
1140 return NULL;
1141 }
1142 n = n / itemsize;
1143 if (n > 0) {
1144 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001145 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001146 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001147 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001148 return NULL;
1149 }
1150 self->ob_item = item;
1151 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001152 memcpy(item + (self->ob_size - n) * itemsize,
1153 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001154 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001155 Py_INCREF(Py_None);
1156 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001157}
1158
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001159static char fromstring_doc [] =
1160"fromstring(string)\n\
1161\n\
1162Appends items from the string, interpreting it as an array of machine\n\
1163values,as if it had been read from a file using the fromfile() method).";
1164
1165
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001166static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001167array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001168{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001169 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001170 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001171 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001172 self->ob_size * self->ob_descr->itemsize);
1173}
1174
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001175static char tostring_doc [] =
1176"tostring() -> string\n\
1177\n\
1178Convert the array to an array of machine values and return the string\n\
1179representation.";
1180
1181PyMethodDef array_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001182 {"append", (PyCFunction)array_append, METH_VARARGS, append_doc},
1183 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS, buffer_info_doc},
1184 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS, byteswap_doc},
1185 {"count", (PyCFunction)array_count, METH_VARARGS, count_doc},
1186 {"extend", (PyCFunction)array_extend, METH_VARARGS, extend_doc},
1187 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1188 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS, fromlist_doc},
1189 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc},
1190 {"index", (PyCFunction)array_index, METH_VARARGS, index_doc},
1191 {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc},
1192 {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc},
1193 {"read", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1194 {"remove", (PyCFunction)array_remove, METH_VARARGS, remove_doc},
1195 {"reverse", (PyCFunction)array_reverse, METH_VARARGS, reverse_doc},
1196/* {"sort", (PyCFunction)array_sort, METH_VARARGS, sort_doc},*/
1197 {"tofile", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
1198 {"tolist", (PyCFunction)array_tolist, METH_VARARGS, tolist_doc},
1199 {"tostring", (PyCFunction)array_tostring, METH_VARARGS, tostring_doc},
1200 {"write", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 {NULL, NULL} /* sentinel */
1202};
1203
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001204static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001205array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001206{
1207 if (strcmp(name, "typecode") == 0) {
1208 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001209 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001210 }
1211 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001212 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001213 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001214 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001215 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001216 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001217 PyList_SetItem(list, 0,
1218 PyString_FromString("typecode"));
1219 PyList_SetItem(list, 1,
1220 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001221 if (PyErr_Occurred()) {
1222 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001223 list = NULL;
1224 }
1225 }
1226 return list;
1227 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001229}
1230
1231static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001232array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001233{
1234 int ok = 0;
1235 int i, len;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001236 PyObject *t_empty = PyTuple_New(0);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001237 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001238 len = a->ob_size;
1239 if (len == 0) {
1240 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1241 return ok;
1242 }
1243 if (a->ob_descr->typecode == 'c') {
1244 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001245 v = array_tostring(a, t_empty);
1246 Py_DECREF(t_empty);;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001247 ok = PyObject_Print(v, fp, 0);
1248 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001249 fprintf(fp, ")");
1250 return ok;
1251 }
1252 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1253 for (i = 0; i < len && ok == 0; i++) {
1254 if (i > 0)
1255 fprintf(fp, ", ");
1256 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001257 ok = PyObject_Print(v, fp, 0);
1258 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001259 }
1260 fprintf(fp, "])");
1261 return ok;
1262}
1263
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001265array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001266{
1267 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001269 int i, len;
1270 len = a->ob_size;
1271 if (len == 0) {
1272 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001273 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001274 }
1275 if (a->ob_descr->typecode == 'c') {
1276 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001277 s = PyString_FromString(buf);
1278 v = array_tostring(a, (PyObject *)NULL);
1279 t = PyObject_Repr(v);
1280 Py_XDECREF(v);
1281 PyString_ConcatAndDel(&s, t);
1282 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001283 return s;
1284 }
1285 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001286 s = PyString_FromString(buf);
1287 comma = PyString_FromString(", ");
1288 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001289 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001290 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001291 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001292 t = PyObject_Repr(v);
1293 Py_XDECREF(v);
1294 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001295 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001296 Py_XDECREF(comma);
1297 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001298 return s;
1299}
1300
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001301static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001302array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001303{
1304 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001305 PyErr_SetString(PyExc_SystemError,
1306 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001307 return -1;
1308 }
1309 *ptr = (void *)self->ob_item;
1310 return self->ob_size*self->ob_descr->itemsize;
1311}
1312
1313static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001314array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001315{
1316 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001317 PyErr_SetString(PyExc_SystemError,
1318 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001319 return -1;
1320 }
1321 *ptr = (void *)self->ob_item;
1322 return self->ob_size*self->ob_descr->itemsize;
1323}
1324
1325static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001326array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001327{
1328 if ( lenp )
1329 *lenp = self->ob_size*self->ob_descr->itemsize;
1330 return 1;
1331}
1332
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001334 (inquiry)array_length, /*sq_length*/
1335 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001336 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001337 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001338 (intintargfunc)array_slice, /*sq_slice*/
1339 (intobjargproc)array_ass_item, /*sq_ass_item*/
1340 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001341};
1342
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001343static PyBufferProcs array_as_buffer = {
1344 (getreadbufferproc)array_buffer_getreadbuf,
1345 (getwritebufferproc)array_buffer_getwritebuf,
1346 (getsegcountproc)array_buffer_getsegcount,
1347};
1348
1349
Guido van Rossum778983b1993-02-19 15:55:02 +00001350
1351
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001352static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001353a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001354{
1355 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001356 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001357 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001358 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001359 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001360 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001361 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1363 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001364 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001365 return NULL;
1366 }
1367 }
1368 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1369 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001370 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001371 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001372 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001373 len = 0;
1374 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001375 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001376 a = newarrayobject(len, descr);
1377 if (a == NULL)
1378 return NULL;
1379 if (len > 0) {
1380 int i;
1381 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001382 PyObject *v =
1383 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001384 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001385 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 return NULL;
1387 }
1388 }
1389 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001390 if (initial != NULL && PyString_Check(initial)) {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001391 PyObject *t_initial = Py_BuildValue("(O)", initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001392 PyObject *v =
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001393 array_fromstring((arrayobject *)a, t_initial);
1394 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001395 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001396 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001397 return NULL;
1398 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001399 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001400 }
1401 return a;
1402 }
1403 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001404 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001405 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 return NULL;
1407}
1408
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001409static char a_array_doc [] =
1410"array(typecode [, initializer]) -> array\n\
1411\n\
1412Return a new array whose items are restricted by typecode, and\n\
1413initialized from the optional initializer value, which must be a list\n\
1414or a string.";
1415
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001416static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001417 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001418 {NULL, NULL} /* sentinel */
1419};
1420
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001421static char module_doc [] =
1422"This module defines a new object type which can efficiently represent\n\
1423an array of basic values: characters, integers, floating point\n\
1424numbers. Arrays are sequence types and behave very much like lists,\n\
1425except that the type of objects stored in them is constrained. The\n\
1426type is specified at object creation time by using a type code, which\n\
1427is a single character. The following type codes are defined:\n\
1428\n\
1429 Type code C Type Minimum size in bytes \n\
1430 'c' character 1 \n\
1431 'b' signed integer 1 \n\
1432 'B' unsigned integer 1 \n\
1433 'h' signed integer 2 \n\
1434 'H' unsigned integer 2 \n\
1435 'i' signed integer 2 \n\
1436 'I' unsigned integer 2 \n\
1437 'l' signed integer 4 \n\
1438 'L' unsigned integer 4 \n\
1439 'f' floating point 4 \n\
1440 'd' floating point 8 \n\
1441\n\
1442Functions:\n\
1443\n\
1444array(typecode [, initializer]) -- create a new array\n\
1445\n\
1446Special Objects:\n\
1447\n\
1448ArrayType -- type object for array objects\n\
1449";
1450
1451static char arraytype_doc [] =
1452"An array represents basic values and behave very much like lists, except\n\
1453the type of objects stored in them is constrained.\n\
1454\n\
1455Methods:\n\
1456\n\
1457append() -- append a new item to the end of the array\n\
1458buffer_info() -- return information giving the current memory info\n\
1459byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001460count() -- return number of occurences of an object\n\
1461extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001462fromfile() -- read items from a file object\n\
1463fromlist() -- append items from the list\n\
1464fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001465index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001466insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001467pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001468read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001469remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001470reverse() -- reverse the order of the items in the array\n\
1471tofile() -- write all items to a file object\n\
1472tolist() -- return the array converted to an ordinary list\n\
1473tostring() -- return the array converted to a string\n\
1474write() -- DEPRECATED, use tofile()\n\
1475\n\
1476Variables:\n\
1477\n\
1478typecode -- the typecode character used to create the array\n\
1479itemsize -- the length in bytes of one array item\n\
1480";
1481
1482statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001483 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001484 0,
1485 "array",
1486 sizeof(arrayobject),
1487 0,
1488 (destructor)array_dealloc, /*tp_dealloc*/
1489 (printfunc)array_print, /*tp_print*/
1490 (getattrfunc)array_getattr, /*tp_getattr*/
1491 0, /*tp_setattr*/
1492 (cmpfunc)array_compare, /*tp_compare*/
1493 (reprfunc)array_repr, /*tp_repr*/
1494 0, /*tp_as_number*/
1495 &array_as_sequence, /*tp_as_sequence*/
1496 0, /*tp_as_mapping*/
1497 0, /*tp_hash*/
1498 0, /*tp_call*/
1499 0, /*tp_str*/
1500 0, /*tp_getattro*/
1501 0, /*tp_setattro*/
1502 &array_as_buffer, /*tp_as_buffer*/
1503 0, /*tp_xxx4*/
1504 arraytype_doc, /*tp_doc*/
1505};
1506
Guido van Rossum3886bb61998-12-04 18:50:17 +00001507DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001508initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001509{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001510 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001511
1512 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001513 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001514 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001515 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1516 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001517}