blob: a011d3083b2212aa6826a1524bd5f38fb2c9152e [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;
797 arrayobject *np;
798
799 if (!PyArg_ParseTuple(args, "O:extend", &bb))
800 return NULL;
801
802 if (!is_arrayobject(bb)) {
803 PyErr_Format(PyExc_TypeError,
804 "can only append array (not \"%.200s\") to array",
805 bb->ob_type->tp_name);
806 return NULL;
807 }
808#define b ((arrayobject *)bb)
809 if (self->ob_descr != b->ob_descr) {
810 PyErr_SetString(PyExc_TypeError,
811 "can only append arrays of same kind");
812 return NULL;
813 }
814 size = self->ob_size + b->ob_size;
815 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
816 if (self->ob_item == NULL) {
817 PyObject_Del(self);
818 return PyErr_NoMemory();
819 }
820 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
821 b->ob_item, b->ob_size*b->ob_descr->itemsize);
822 self->ob_size = size;
823 Py_INCREF(Py_None);
824 return Py_None;
825#undef b
826}
827
828static char extend_doc [] =
829"extend(array)\n\
830\n\
831 Append array items to the end of the array.";
832
833static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000834array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000835{
836 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000837 PyObject *v;
838 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000839 return NULL;
840 return ins(self, i, v);
841}
842
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000843static char insert_doc [] =
844"insert (i,x)\n\
845\n\
846Insert a new item x into the array before position i.";
847
848
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000849static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000850array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000851{
Fred Drake541dc3b2000-06-28 17:49:30 +0000852 PyObject* retval = PyTuple_New(2);
853 if (!retval) return NULL;
854
855 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
856 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
857
858 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000859}
860
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000861static char buffer_info_doc [] =
862"buffer_info -> (address, length)\n\
863\n\
864Return a tuple (address, length) giving the current memory address and\n\
865the length in bytes of the buffer used to hold array's contents.";
866
867
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000868static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000869array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000870{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000871 PyObject *v;
872 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000873 return NULL;
874 return ins(self, (int) self->ob_size, v);
875}
876
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000877static char append_doc [] =
878"append(x)\n\
879\n\
880Append new value x to the end of the array.";
881
882
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000883static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000884array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000885{
886 char *p;
887 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000888
889 if (!PyArg_ParseTuple(args, ":byteswap"))
890 return NULL;
891
Guido van Rossum778983b1993-02-19 15:55:02 +0000892 switch (self->ob_descr->itemsize) {
893 case 1:
894 break;
895 case 2:
896 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
897 char p0 = p[0];
898 p[0] = p[1];
899 p[1] = p0;
900 }
901 break;
902 case 4:
903 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
904 char p0 = p[0];
905 char p1 = p[1];
906 p[0] = p[3];
907 p[1] = p[2];
908 p[2] = p1;
909 p[3] = p0;
910 }
911 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000912 case 8:
913 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
914 char p0 = p[0];
915 char p1 = p[1];
916 char p2 = p[2];
917 char p3 = p[3];
918 p[0] = p[7];
919 p[1] = p[6];
920 p[2] = p[5];
921 p[3] = p[4];
922 p[4] = p3;
923 p[5] = p2;
924 p[6] = p1;
925 p[7] = p0;
926 }
927 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000928 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000929 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000930 "don't know how to byteswap this array type");
931 return NULL;
932 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000933 Py_INCREF(Py_None);
934 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000935}
936
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000937static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000938"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000939\n\
Fred Drakebf272981999-12-03 17:15:30 +0000940Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9414, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000942
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000943static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000944array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000945{
Guido van Rossume77a7571993-11-03 15:01:26 +0000946 register int itemsize = self->ob_descr->itemsize;
947 register char *p, *q;
948 char tmp[sizeof(double)]; /* Assume that's the max item size */
949
Guido van Rossum778983b1993-02-19 15:55:02 +0000950 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000951 PyErr_SetString(PyExc_TypeError,
952 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000953 return NULL;
954 }
955
956 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000957 for (p = self->ob_item,
958 q = self->ob_item + (self->ob_size - 1)*itemsize;
959 p < q;
960 p += itemsize, q -= itemsize) {
961 memmove(tmp, p, itemsize);
962 memmove(p, q, itemsize);
963 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000964 }
965 }
966
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 Py_INCREF(Py_None);
968 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000969}
Guido van Rossume77a7571993-11-03 15:01:26 +0000970
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000971static char reverse_doc [] =
972"reverse()\n\
973\n\
974Reverse the order of the items in the array.";
975
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000976static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000977array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000978{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000979 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000980 int n;
981 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000982 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000983 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000984 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000985 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000986 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000987 return NULL;
988 }
989 if (n > 0) {
990 char *item = self->ob_item;
991 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000992 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000993 int newlength;
994 size_t newbytes;
995 /* Be careful here about overflow */
996 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000997 (newbytes = newlength * itemsize) / itemsize !=
998 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000999 goto nomem;
1000 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001002 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001003 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001004 return NULL;
1005 }
1006 self->ob_item = item;
1007 self->ob_size += n;
1008 nread = fread(item + (self->ob_size - n) * itemsize,
1009 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001010 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001011 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001012 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001013 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001014 PyErr_SetString(PyExc_EOFError,
1015 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001016 return NULL;
1017 }
1018 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001019 Py_INCREF(Py_None);
1020 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001021}
1022
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001023static char fromfile_doc [] =
1024"fromfile(f, n)\n\
1025\n\
1026Read n objects from the file object f and append them to the end of the\n\
1027array. Also called as read.";
1028
1029
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001030static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001031array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001032{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001033 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001034 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001035 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001036 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001037 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001038 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001039 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001040 return NULL;
1041 }
1042 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +00001043 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001044 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001045 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001046 clearerr(fp);
1047 return NULL;
1048 }
1049 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001050 Py_INCREF(Py_None);
1051 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001052}
1053
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001054static char tofile_doc [] =
1055"tofile(f)\n\
1056\n\
1057Write all items (as machine values) to the file object f. Also called as\n\
1058write.";
1059
1060
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001061static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001062array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001063{
1064 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001065 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001066 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001067 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001069 if (!PyList_Check(list)) {
1070 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001071 return NULL;
1072 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001073 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 if (n > 0) {
1075 char *item = self->ob_item;
1076 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001077 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001078 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001079 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001080 return NULL;
1081 }
1082 self->ob_item = item;
1083 self->ob_size += n;
1084 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001085 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001086 if ((*self->ob_descr->setitem)(self,
1087 self->ob_size - n + i, v) != 0) {
1088 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089 PyMem_RESIZE(item, char,
1090 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001091 self->ob_item = item;
1092 return NULL;
1093 }
1094 }
1095 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001096 Py_INCREF(Py_None);
1097 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001098}
1099
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001100static char fromlist_doc [] =
1101"fromlist(list)\n\
1102\n\
1103Append items to array from list.";
1104
1105
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001106static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001107array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001108{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001109 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 int i;
1111 if (list == NULL)
1112 return NULL;
1113 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001114 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001115 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001117 return NULL;
1118 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001119 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 }
1121 return list;
1122}
1123
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001124static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001125"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001126\n\
1127Convert array to an ordinary list with the same items.";
1128
1129
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001130static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001131array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001132{
1133 char *str;
1134 int n;
1135 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001136 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001137 return NULL;
1138 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001140 "string length not a multiple of item size");
1141 return NULL;
1142 }
1143 n = n / itemsize;
1144 if (n > 0) {
1145 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001146 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001147 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001149 return NULL;
1150 }
1151 self->ob_item = item;
1152 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001153 memcpy(item + (self->ob_size - n) * itemsize,
1154 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001155 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001156 Py_INCREF(Py_None);
1157 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001158}
1159
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001160static char fromstring_doc [] =
1161"fromstring(string)\n\
1162\n\
1163Appends items from the string, interpreting it as an array of machine\n\
1164values,as if it had been read from a file using the fromfile() method).";
1165
1166
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001168array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001169{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001170 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001171 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001172 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001173 self->ob_size * self->ob_descr->itemsize);
1174}
1175
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001176static char tostring_doc [] =
1177"tostring() -> string\n\
1178\n\
1179Convert the array to an array of machine values and return the string\n\
1180representation.";
1181
1182PyMethodDef array_methods[] = {
1183 {"append", (PyCFunction)array_append, 0, append_doc},
1184 {"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
Fred Drakebf272981999-12-03 17:15:30 +00001185 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1186 byteswap_doc},
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001187 {"count", (PyCFunction)array_count, 1, count_doc},
1188 {"extend", (PyCFunction)array_extend, 1, extend_doc},
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001189 {"fromfile", (PyCFunction)array_fromfile, 0, fromfile_doc},
1190 {"fromlist", (PyCFunction)array_fromlist, 0, fromlist_doc},
1191 {"fromstring", (PyCFunction)array_fromstring, 0, fromstring_doc},
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001192 {"index", (PyCFunction)array_index, 1, index_doc},
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001193 {"insert", (PyCFunction)array_insert, 0, insert_doc},
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001194 {"pop", (PyCFunction)array_pop, 1, pop_doc},
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001195 {"read", (PyCFunction)array_fromfile, 0, fromfile_doc},
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001196 {"remove", (PyCFunction)array_remove, 1, remove_doc},
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001197 {"reverse", (PyCFunction)array_reverse, 0, reverse_doc},
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001198/* {"sort", (PyCFunction)array_sort, 0, sort_doc},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001199 {"tofile", (PyCFunction)array_tofile, 0, tofile_doc},
1200 {"tolist", (PyCFunction)array_tolist, 0, tolist_doc},
1201 {"tostring", (PyCFunction)array_tostring, 0, tostring_doc},
1202 {"write", (PyCFunction)array_tofile, 0, 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;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001238 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001239 len = a->ob_size;
1240 if (len == 0) {
1241 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1242 return ok;
1243 }
1244 if (a->ob_descr->typecode == 'c') {
1245 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001246 v = array_tostring(a, (PyObject *)NULL);
1247 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;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001358 if (!PyArg_Parse(args, "c", &c)) {
1359 PyErr_Clear();
1360 if (!PyArg_Parse(args, "(cO)", &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)) {
1391 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001392 array_fromstring((arrayobject *)a, initial);
1393 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001394 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001395 return NULL;
1396 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001397 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001398 }
1399 return a;
1400 }
1401 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001402 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001403 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001404 return NULL;
1405}
1406
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001407static char a_array_doc [] =
1408"array(typecode [, initializer]) -> array\n\
1409\n\
1410Return a new array whose items are restricted by typecode, and\n\
1411initialized from the optional initializer value, which must be a list\n\
1412or a string.";
1413
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001414static PyMethodDef a_methods[] = {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001415 {"array", a_array, 0, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001416 {NULL, NULL} /* sentinel */
1417};
1418
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001419static char module_doc [] =
1420"This module defines a new object type which can efficiently represent\n\
1421an array of basic values: characters, integers, floating point\n\
1422numbers. Arrays are sequence types and behave very much like lists,\n\
1423except that the type of objects stored in them is constrained. The\n\
1424type is specified at object creation time by using a type code, which\n\
1425is a single character. The following type codes are defined:\n\
1426\n\
1427 Type code C Type Minimum size in bytes \n\
1428 'c' character 1 \n\
1429 'b' signed integer 1 \n\
1430 'B' unsigned integer 1 \n\
1431 'h' signed integer 2 \n\
1432 'H' unsigned integer 2 \n\
1433 'i' signed integer 2 \n\
1434 'I' unsigned integer 2 \n\
1435 'l' signed integer 4 \n\
1436 'L' unsigned integer 4 \n\
1437 'f' floating point 4 \n\
1438 'd' floating point 8 \n\
1439\n\
1440Functions:\n\
1441\n\
1442array(typecode [, initializer]) -- create a new array\n\
1443\n\
1444Special Objects:\n\
1445\n\
1446ArrayType -- type object for array objects\n\
1447";
1448
1449static char arraytype_doc [] =
1450"An array represents basic values and behave very much like lists, except\n\
1451the type of objects stored in them is constrained.\n\
1452\n\
1453Methods:\n\
1454\n\
1455append() -- append a new item to the end of the array\n\
1456buffer_info() -- return information giving the current memory info\n\
1457byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001458count() -- return number of occurences of an object\n\
1459extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001460fromfile() -- read items from a file object\n\
1461fromlist() -- append items from the list\n\
1462fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001463index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001464insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001465pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001466read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001467remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001468reverse() -- reverse the order of the items in the array\n\
1469tofile() -- write all items to a file object\n\
1470tolist() -- return the array converted to an ordinary list\n\
1471tostring() -- return the array converted to a string\n\
1472write() -- DEPRECATED, use tofile()\n\
1473\n\
1474Variables:\n\
1475\n\
1476typecode -- the typecode character used to create the array\n\
1477itemsize -- the length in bytes of one array item\n\
1478";
1479
1480statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001481 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001482 0,
1483 "array",
1484 sizeof(arrayobject),
1485 0,
1486 (destructor)array_dealloc, /*tp_dealloc*/
1487 (printfunc)array_print, /*tp_print*/
1488 (getattrfunc)array_getattr, /*tp_getattr*/
1489 0, /*tp_setattr*/
1490 (cmpfunc)array_compare, /*tp_compare*/
1491 (reprfunc)array_repr, /*tp_repr*/
1492 0, /*tp_as_number*/
1493 &array_as_sequence, /*tp_as_sequence*/
1494 0, /*tp_as_mapping*/
1495 0, /*tp_hash*/
1496 0, /*tp_call*/
1497 0, /*tp_str*/
1498 0, /*tp_getattro*/
1499 0, /*tp_setattro*/
1500 &array_as_buffer, /*tp_as_buffer*/
1501 0, /*tp_xxx4*/
1502 arraytype_doc, /*tp_doc*/
1503};
1504
Guido van Rossum3886bb61998-12-04 18:50:17 +00001505DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001506initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001507{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001508 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001509
1510 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001511 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001512 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001513 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1514 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001515}