blob: 6648c9c0b3b907f9f7187dc9a311ddca6ec871c2 [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 *
791array_extend(self, args)
792 arrayobject *self;
793 PyObject *args;
794{
795 int size;
796 PyObject *bb;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000797
798 if (!PyArg_ParseTuple(args, "O:extend", &bb))
799 return NULL;
800
801 if (!is_arrayobject(bb)) {
802 PyErr_Format(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000803 "can only extend array with array (not \"%.200s\")",
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000804 bb->ob_type->tp_name);
805 return NULL;
806 }
807#define b ((arrayobject *)bb)
808 if (self->ob_descr != b->ob_descr) {
809 PyErr_SetString(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000810 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000811 return NULL;
812 }
813 size = self->ob_size + b->ob_size;
814 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
815 if (self->ob_item == NULL) {
816 PyObject_Del(self);
817 return PyErr_NoMemory();
818 }
819 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
820 b->ob_item, b->ob_size*b->ob_descr->itemsize);
821 self->ob_size = size;
822 Py_INCREF(Py_None);
823 return Py_None;
824#undef b
825}
826
827static char extend_doc [] =
828"extend(array)\n\
829\n\
830 Append array items to the end of the array.";
831
832static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000833array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000834{
835 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000836 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000837 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000838 return NULL;
839 return ins(self, i, v);
840}
841
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000842static char insert_doc [] =
843"insert (i,x)\n\
844\n\
845Insert a new item x into the array before position i.";
846
847
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000848static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000849array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000850{
Fred Drake541dc3b2000-06-28 17:49:30 +0000851 PyObject* retval = PyTuple_New(2);
852 if (!retval) return NULL;
853
854 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
855 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
856
857 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000858}
859
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000860static char buffer_info_doc [] =
861"buffer_info -> (address, length)\n\
862\n\
863Return a tuple (address, length) giving the current memory address and\n\
864the length in bytes of the buffer used to hold array's contents.";
865
866
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000867static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000868array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000869{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000870 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000871 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000872 return NULL;
873 return ins(self, (int) self->ob_size, v);
874}
875
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000876static char append_doc [] =
877"append(x)\n\
878\n\
879Append new value x to the end of the array.";
880
881
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000883array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000884{
885 char *p;
886 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000887
888 if (!PyArg_ParseTuple(args, ":byteswap"))
889 return NULL;
890
Guido van Rossum778983b1993-02-19 15:55:02 +0000891 switch (self->ob_descr->itemsize) {
892 case 1:
893 break;
894 case 2:
895 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
896 char p0 = p[0];
897 p[0] = p[1];
898 p[1] = p0;
899 }
900 break;
901 case 4:
902 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
903 char p0 = p[0];
904 char p1 = p[1];
905 p[0] = p[3];
906 p[1] = p[2];
907 p[2] = p1;
908 p[3] = p0;
909 }
910 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000911 case 8:
912 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
913 char p0 = p[0];
914 char p1 = p[1];
915 char p2 = p[2];
916 char p3 = p[3];
917 p[0] = p[7];
918 p[1] = p[6];
919 p[2] = p[5];
920 p[3] = p[4];
921 p[4] = p3;
922 p[5] = p2;
923 p[6] = p1;
924 p[7] = p0;
925 }
926 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000927 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000928 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000929 "don't know how to byteswap this array type");
930 return NULL;
931 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000932 Py_INCREF(Py_None);
933 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000934}
935
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000936static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000937"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000938\n\
Fred Drakebf272981999-12-03 17:15:30 +0000939Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9404, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000941
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000942static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000943array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000944{
Guido van Rossume77a7571993-11-03 15:01:26 +0000945 register int itemsize = self->ob_descr->itemsize;
946 register char *p, *q;
947 char tmp[sizeof(double)]; /* Assume that's the max item size */
948
Guido van Rossum778983b1993-02-19 15:55:02 +0000949 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000950 PyErr_SetString(PyExc_TypeError,
951 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000952 return NULL;
953 }
954
955 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000956 for (p = self->ob_item,
957 q = self->ob_item + (self->ob_size - 1)*itemsize;
958 p < q;
959 p += itemsize, q -= itemsize) {
960 memmove(tmp, p, itemsize);
961 memmove(p, q, itemsize);
962 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000963 }
964 }
965
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000966 Py_INCREF(Py_None);
967 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000968}
Guido van Rossume77a7571993-11-03 15:01:26 +0000969
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000970static char reverse_doc [] =
971"reverse()\n\
972\n\
973Reverse the order of the items in the array.";
974
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000975static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000976array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000977{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000978 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000979 int n;
980 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000981 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000982 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000983 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000984 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000985 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000986 return NULL;
987 }
988 if (n > 0) {
989 char *item = self->ob_item;
990 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000991 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000992 int newlength;
993 size_t newbytes;
994 /* Be careful here about overflow */
995 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000996 (newbytes = newlength * itemsize) / itemsize !=
997 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000998 goto nomem;
999 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001000 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001001 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001002 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001003 return NULL;
1004 }
1005 self->ob_item = item;
1006 self->ob_size += n;
1007 nread = fread(item + (self->ob_size - n) * itemsize,
1008 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001009 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001010 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001011 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001012 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001013 PyErr_SetString(PyExc_EOFError,
1014 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001015 return NULL;
1016 }
1017 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001018 Py_INCREF(Py_None);
1019 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001020}
1021
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001022static char fromfile_doc [] =
1023"fromfile(f, n)\n\
1024\n\
1025Read n objects from the file object f and append them to the end of the\n\
1026array. Also called as read.";
1027
1028
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001029static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001030array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001031{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001034 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001037 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001038 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001039 return NULL;
1040 }
1041 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001042 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1043 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001044 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001045 clearerr(fp);
1046 return NULL;
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 tofile_doc [] =
1054"tofile(f)\n\
1055\n\
1056Write all items (as machine values) to the file object f. Also called as\n\
1057write.";
1058
1059
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001060static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001061array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001062{
1063 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001064 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001065 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001066 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001067 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001068 if (!PyList_Check(list)) {
1069 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001070 return NULL;
1071 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001072 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001073 if (n > 0) {
1074 char *item = self->ob_item;
1075 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001076 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001077 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001078 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001079 return NULL;
1080 }
1081 self->ob_item = item;
1082 self->ob_size += n;
1083 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001084 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001085 if ((*self->ob_descr->setitem)(self,
1086 self->ob_size - n + i, v) != 0) {
1087 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001088 PyMem_RESIZE(item, char,
1089 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001090 self->ob_item = item;
1091 return NULL;
1092 }
1093 }
1094 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001095 Py_INCREF(Py_None);
1096 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001097}
1098
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001099static char fromlist_doc [] =
1100"fromlist(list)\n\
1101\n\
1102Append items to array from list.";
1103
1104
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001105static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001106array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001107{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001108 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001109 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001110 if (!PyArg_ParseTuple(args, ":tolist"))
1111 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001112 if (list == NULL)
1113 return NULL;
1114 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001115 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001116 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001117 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001118 return NULL;
1119 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001120 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001121 }
1122 return list;
1123}
1124
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001125static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001126"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001127\n\
1128Convert array to an ordinary list with the same items.";
1129
1130
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001131static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001132array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001133{
1134 char *str;
1135 int n;
1136 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001137 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001138 return NULL;
1139 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001140 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001141 "string length not a multiple of item size");
1142 return NULL;
1143 }
1144 n = n / itemsize;
1145 if (n > 0) {
1146 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001147 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001148 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001149 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001150 return NULL;
1151 }
1152 self->ob_item = item;
1153 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001154 memcpy(item + (self->ob_size - n) * itemsize,
1155 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001156 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157 Py_INCREF(Py_None);
1158 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001159}
1160
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001161static char fromstring_doc [] =
1162"fromstring(string)\n\
1163\n\
1164Appends items from the string, interpreting it as an array of machine\n\
1165values,as if it had been read from a file using the fromfile() method).";
1166
1167
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001168static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001169array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001170{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001171 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001172 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001173 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001174 self->ob_size * self->ob_descr->itemsize);
1175}
1176
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001177static char tostring_doc [] =
1178"tostring() -> string\n\
1179\n\
1180Convert the array to an array of machine values and return the string\n\
1181representation.";
1182
1183PyMethodDef array_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001184 {"append", (PyCFunction)array_append, METH_VARARGS, append_doc},
1185 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS, buffer_info_doc},
1186 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS, byteswap_doc},
1187 {"count", (PyCFunction)array_count, METH_VARARGS, count_doc},
1188 {"extend", (PyCFunction)array_extend, METH_VARARGS, extend_doc},
1189 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1190 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS, fromlist_doc},
1191 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc},
1192 {"index", (PyCFunction)array_index, METH_VARARGS, index_doc},
1193 {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc},
1194 {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc},
1195 {"read", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1196 {"remove", (PyCFunction)array_remove, METH_VARARGS, remove_doc},
1197 {"reverse", (PyCFunction)array_reverse, METH_VARARGS, reverse_doc},
1198/* {"sort", (PyCFunction)array_sort, METH_VARARGS, sort_doc},*/
1199 {"tofile", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
1200 {"tolist", (PyCFunction)array_tolist, METH_VARARGS, tolist_doc},
1201 {"tostring", (PyCFunction)array_tostring, METH_VARARGS, tostring_doc},
1202 {"write", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001203 {NULL, NULL} /* sentinel */
1204};
1205
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001206static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001207array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001208{
1209 if (strcmp(name, "typecode") == 0) {
1210 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001211 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001212 }
1213 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001214 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001215 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001216 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001217 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001218 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001219 PyList_SetItem(list, 0,
1220 PyString_FromString("typecode"));
1221 PyList_SetItem(list, 1,
1222 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001223 if (PyErr_Occurred()) {
1224 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001225 list = NULL;
1226 }
1227 }
1228 return list;
1229 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001230 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001231}
1232
1233static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001234array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001235{
1236 int ok = 0;
1237 int i, len;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001238 PyObject *t_empty = PyTuple_New(0);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001239 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001240 len = a->ob_size;
1241 if (len == 0) {
1242 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1243 return ok;
1244 }
1245 if (a->ob_descr->typecode == 'c') {
1246 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001247 v = array_tostring(a, t_empty);
1248 Py_DECREF(t_empty);;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001249 ok = PyObject_Print(v, fp, 0);
1250 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001251 fprintf(fp, ")");
1252 return ok;
1253 }
1254 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1255 for (i = 0; i < len && ok == 0; i++) {
1256 if (i > 0)
1257 fprintf(fp, ", ");
1258 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 ok = PyObject_Print(v, fp, 0);
1260 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001261 }
1262 fprintf(fp, "])");
1263 return ok;
1264}
1265
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001266static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001267array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001268{
1269 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001270 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001271 int i, len;
1272 len = a->ob_size;
1273 if (len == 0) {
1274 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001275 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001276 }
1277 if (a->ob_descr->typecode == 'c') {
1278 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001279 s = PyString_FromString(buf);
1280 v = array_tostring(a, (PyObject *)NULL);
1281 t = PyObject_Repr(v);
1282 Py_XDECREF(v);
1283 PyString_ConcatAndDel(&s, t);
1284 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001285 return s;
1286 }
1287 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001288 s = PyString_FromString(buf);
1289 comma = PyString_FromString(", ");
1290 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001291 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001292 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001293 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001294 t = PyObject_Repr(v);
1295 Py_XDECREF(v);
1296 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001297 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001298 Py_XDECREF(comma);
1299 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001300 return s;
1301}
1302
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001303static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001304array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001305{
1306 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001307 PyErr_SetString(PyExc_SystemError,
1308 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001309 return -1;
1310 }
1311 *ptr = (void *)self->ob_item;
1312 return self->ob_size*self->ob_descr->itemsize;
1313}
1314
1315static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001316array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001317{
1318 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001319 PyErr_SetString(PyExc_SystemError,
1320 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001321 return -1;
1322 }
1323 *ptr = (void *)self->ob_item;
1324 return self->ob_size*self->ob_descr->itemsize;
1325}
1326
1327static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001328array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001329{
1330 if ( lenp )
1331 *lenp = self->ob_size*self->ob_descr->itemsize;
1332 return 1;
1333}
1334
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001336 (inquiry)array_length, /*sq_length*/
1337 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001338 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001339 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001340 (intintargfunc)array_slice, /*sq_slice*/
1341 (intobjargproc)array_ass_item, /*sq_ass_item*/
1342 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001343};
1344
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001345static PyBufferProcs array_as_buffer = {
1346 (getreadbufferproc)array_buffer_getreadbuf,
1347 (getwritebufferproc)array_buffer_getwritebuf,
1348 (getsegcountproc)array_buffer_getsegcount,
1349};
1350
1351
Guido van Rossum778983b1993-02-19 15:55:02 +00001352
1353
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001354static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001355a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001356{
1357 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001358 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001359 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001360 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001361 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001362 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001364 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1365 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001366 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001367 return NULL;
1368 }
1369 }
1370 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1371 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001372 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001373 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001374 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001375 len = 0;
1376 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001377 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001378 a = newarrayobject(len, descr);
1379 if (a == NULL)
1380 return NULL;
1381 if (len > 0) {
1382 int i;
1383 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001384 PyObject *v =
1385 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001387 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 return NULL;
1389 }
1390 }
1391 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001392 if (initial != NULL && PyString_Check(initial)) {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001393 PyObject *t_initial = Py_BuildValue("(O)", initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001394 PyObject *v =
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001395 array_fromstring((arrayobject *)a, t_initial);
1396 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001397 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001398 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001399 return NULL;
1400 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001401 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 }
1403 return a;
1404 }
1405 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001406 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001407 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001408 return NULL;
1409}
1410
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001411static char a_array_doc [] =
1412"array(typecode [, initializer]) -> array\n\
1413\n\
1414Return a new array whose items are restricted by typecode, and\n\
1415initialized from the optional initializer value, which must be a list\n\
1416or a string.";
1417
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001418static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001419 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001420 {NULL, NULL} /* sentinel */
1421};
1422
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001423static char module_doc [] =
1424"This module defines a new object type which can efficiently represent\n\
1425an array of basic values: characters, integers, floating point\n\
1426numbers. Arrays are sequence types and behave very much like lists,\n\
1427except that the type of objects stored in them is constrained. The\n\
1428type is specified at object creation time by using a type code, which\n\
1429is a single character. The following type codes are defined:\n\
1430\n\
1431 Type code C Type Minimum size in bytes \n\
1432 'c' character 1 \n\
1433 'b' signed integer 1 \n\
1434 'B' unsigned integer 1 \n\
1435 'h' signed integer 2 \n\
1436 'H' unsigned integer 2 \n\
1437 'i' signed integer 2 \n\
1438 'I' unsigned integer 2 \n\
1439 'l' signed integer 4 \n\
1440 'L' unsigned integer 4 \n\
1441 'f' floating point 4 \n\
1442 'd' floating point 8 \n\
1443\n\
1444Functions:\n\
1445\n\
1446array(typecode [, initializer]) -- create a new array\n\
1447\n\
1448Special Objects:\n\
1449\n\
1450ArrayType -- type object for array objects\n\
1451";
1452
1453static char arraytype_doc [] =
1454"An array represents basic values and behave very much like lists, except\n\
1455the type of objects stored in them is constrained.\n\
1456\n\
1457Methods:\n\
1458\n\
1459append() -- append a new item to the end of the array\n\
1460buffer_info() -- return information giving the current memory info\n\
1461byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001462count() -- return number of occurences of an object\n\
1463extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001464fromfile() -- read items from a file object\n\
1465fromlist() -- append items from the list\n\
1466fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001467index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001468insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001469pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001470read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001471remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001472reverse() -- reverse the order of the items in the array\n\
1473tofile() -- write all items to a file object\n\
1474tolist() -- return the array converted to an ordinary list\n\
1475tostring() -- return the array converted to a string\n\
1476write() -- DEPRECATED, use tofile()\n\
1477\n\
1478Variables:\n\
1479\n\
1480typecode -- the typecode character used to create the array\n\
1481itemsize -- the length in bytes of one array item\n\
1482";
1483
1484statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001485 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001486 0,
1487 "array",
1488 sizeof(arrayobject),
1489 0,
1490 (destructor)array_dealloc, /*tp_dealloc*/
1491 (printfunc)array_print, /*tp_print*/
1492 (getattrfunc)array_getattr, /*tp_getattr*/
1493 0, /*tp_setattr*/
1494 (cmpfunc)array_compare, /*tp_compare*/
1495 (reprfunc)array_repr, /*tp_repr*/
1496 0, /*tp_as_number*/
1497 &array_as_sequence, /*tp_as_sequence*/
1498 0, /*tp_as_mapping*/
1499 0, /*tp_hash*/
1500 0, /*tp_call*/
1501 0, /*tp_str*/
1502 0, /*tp_getattro*/
1503 0, /*tp_setattro*/
1504 &array_as_buffer, /*tp_as_buffer*/
1505 0, /*tp_xxx4*/
1506 arraytype_doc, /*tp_doc*/
1507};
1508
Guido van Rossum3886bb61998-12-04 18:50:17 +00001509DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001510initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001511{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001512 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001513
1514 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001515 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001516 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001517 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1518 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001519}