blob: 43bafcdfb34672092766130f96f0858c80c1540e [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,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000804 "can only extend array with array (not \"%.200s\")",
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000805 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,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000811 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000812 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;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000838 if (!PyArg_ParseTuple(args, "iO:insert", &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;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000872 if (!PyArg_ParseTuple(args, "O:append", &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;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000982 if (!PyArg_ParseTuple(args, "Oi:fromfile", &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;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001035 if (!PyArg_ParseTuple(args, "O:tofile", &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;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001067 if (!PyArg_ParseTuple(args, "O:fromlist", &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;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001111 if (!PyArg_ParseTuple(args, ":tolist"))
1112 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001113 if (list == NULL)
1114 return NULL;
1115 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001117 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001118 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001119 return NULL;
1120 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001121 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001122 }
1123 return list;
1124}
1125
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001126static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001127"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001128\n\
1129Convert array to an ordinary list with the same items.";
1130
1131
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001132static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001133array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001134{
1135 char *str;
1136 int n;
1137 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001138 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001139 return NULL;
1140 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001141 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001142 "string length not a multiple of item size");
1143 return NULL;
1144 }
1145 n = n / itemsize;
1146 if (n > 0) {
1147 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001149 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001150 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001151 return NULL;
1152 }
1153 self->ob_item = item;
1154 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001155 memcpy(item + (self->ob_size - n) * itemsize,
1156 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001157 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001158 Py_INCREF(Py_None);
1159 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001160}
1161
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001162static char fromstring_doc [] =
1163"fromstring(string)\n\
1164\n\
1165Appends items from the string, interpreting it as an array of machine\n\
1166values,as if it had been read from a file using the fromfile() method).";
1167
1168
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001169static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001170array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001171{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001172 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001173 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001174 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001175 self->ob_size * self->ob_descr->itemsize);
1176}
1177
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001178static char tostring_doc [] =
1179"tostring() -> string\n\
1180\n\
1181Convert the array to an array of machine values and return the string\n\
1182representation.";
1183
1184PyMethodDef array_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001185 {"append", (PyCFunction)array_append, METH_VARARGS, append_doc},
1186 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS, buffer_info_doc},
1187 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS, byteswap_doc},
1188 {"count", (PyCFunction)array_count, METH_VARARGS, count_doc},
1189 {"extend", (PyCFunction)array_extend, METH_VARARGS, extend_doc},
1190 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1191 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS, fromlist_doc},
1192 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc},
1193 {"index", (PyCFunction)array_index, METH_VARARGS, index_doc},
1194 {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc},
1195 {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc},
1196 {"read", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1197 {"remove", (PyCFunction)array_remove, METH_VARARGS, remove_doc},
1198 {"reverse", (PyCFunction)array_reverse, METH_VARARGS, reverse_doc},
1199/* {"sort", (PyCFunction)array_sort, METH_VARARGS, sort_doc},*/
1200 {"tofile", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
1201 {"tolist", (PyCFunction)array_tolist, METH_VARARGS, tolist_doc},
1202 {"tostring", (PyCFunction)array_tostring, METH_VARARGS, tostring_doc},
1203 {"write", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001204 {NULL, NULL} /* sentinel */
1205};
1206
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001207static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001208array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001209{
1210 if (strcmp(name, "typecode") == 0) {
1211 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001212 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001213 }
1214 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001215 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001216 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001217 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001219 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001220 PyList_SetItem(list, 0,
1221 PyString_FromString("typecode"));
1222 PyList_SetItem(list, 1,
1223 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001224 if (PyErr_Occurred()) {
1225 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001226 list = NULL;
1227 }
1228 }
1229 return list;
1230 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001232}
1233
1234static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001235array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001236{
1237 int ok = 0;
1238 int i, len;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001239 PyObject *t_empty = PyTuple_New(0);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001240 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001241 len = a->ob_size;
1242 if (len == 0) {
1243 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1244 return ok;
1245 }
1246 if (a->ob_descr->typecode == 'c') {
1247 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001248 v = array_tostring(a, t_empty);
1249 Py_DECREF(t_empty);;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250 ok = PyObject_Print(v, fp, 0);
1251 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001252 fprintf(fp, ")");
1253 return ok;
1254 }
1255 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1256 for (i = 0; i < len && ok == 0; i++) {
1257 if (i > 0)
1258 fprintf(fp, ", ");
1259 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001260 ok = PyObject_Print(v, fp, 0);
1261 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001262 }
1263 fprintf(fp, "])");
1264 return ok;
1265}
1266
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001267static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001268array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001269{
1270 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001271 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001272 int i, len;
1273 len = a->ob_size;
1274 if (len == 0) {
1275 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001276 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001277 }
1278 if (a->ob_descr->typecode == 'c') {
1279 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001280 s = PyString_FromString(buf);
1281 v = array_tostring(a, (PyObject *)NULL);
1282 t = PyObject_Repr(v);
1283 Py_XDECREF(v);
1284 PyString_ConcatAndDel(&s, t);
1285 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001286 return s;
1287 }
1288 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001289 s = PyString_FromString(buf);
1290 comma = PyString_FromString(", ");
1291 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001292 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001294 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001295 t = PyObject_Repr(v);
1296 Py_XDECREF(v);
1297 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001298 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001299 Py_XDECREF(comma);
1300 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001301 return s;
1302}
1303
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001304static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001305array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001306{
1307 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001308 PyErr_SetString(PyExc_SystemError,
1309 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001310 return -1;
1311 }
1312 *ptr = (void *)self->ob_item;
1313 return self->ob_size*self->ob_descr->itemsize;
1314}
1315
1316static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001317array_buffer_getwritebuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001318{
1319 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001320 PyErr_SetString(PyExc_SystemError,
1321 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001322 return -1;
1323 }
1324 *ptr = (void *)self->ob_item;
1325 return self->ob_size*self->ob_descr->itemsize;
1326}
1327
1328static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001329array_buffer_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001330{
1331 if ( lenp )
1332 *lenp = self->ob_size*self->ob_descr->itemsize;
1333 return 1;
1334}
1335
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001336static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001337 (inquiry)array_length, /*sq_length*/
1338 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001339 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001340 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001341 (intintargfunc)array_slice, /*sq_slice*/
1342 (intobjargproc)array_ass_item, /*sq_ass_item*/
1343 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001344};
1345
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001346static PyBufferProcs array_as_buffer = {
1347 (getreadbufferproc)array_buffer_getreadbuf,
1348 (getwritebufferproc)array_buffer_getwritebuf,
1349 (getsegcountproc)array_buffer_getsegcount,
1350};
1351
1352
Guido van Rossum778983b1993-02-19 15:55:02 +00001353
1354
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001355static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001356a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001357{
1358 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001359 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001360 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001361 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001363 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001364 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001365 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1366 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001367 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001368 return NULL;
1369 }
1370 }
1371 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1372 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001373 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001374 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001375 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001376 len = 0;
1377 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001378 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001379 a = newarrayobject(len, descr);
1380 if (a == NULL)
1381 return NULL;
1382 if (len > 0) {
1383 int i;
1384 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001385 PyObject *v =
1386 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001387 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001388 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001389 return NULL;
1390 }
1391 }
1392 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001393 if (initial != NULL && PyString_Check(initial)) {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001394 PyObject *t_initial = Py_BuildValue("(O)", initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001395 PyObject *v =
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001396 array_fromstring((arrayobject *)a, t_initial);
1397 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001398 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001399 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001400 return NULL;
1401 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001402 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001403 }
1404 return a;
1405 }
1406 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001407 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001408 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001409 return NULL;
1410}
1411
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001412static char a_array_doc [] =
1413"array(typecode [, initializer]) -> array\n\
1414\n\
1415Return a new array whose items are restricted by typecode, and\n\
1416initialized from the optional initializer value, which must be a list\n\
1417or a string.";
1418
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001419static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001420 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001421 {NULL, NULL} /* sentinel */
1422};
1423
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001424static char module_doc [] =
1425"This module defines a new object type which can efficiently represent\n\
1426an array of basic values: characters, integers, floating point\n\
1427numbers. Arrays are sequence types and behave very much like lists,\n\
1428except that the type of objects stored in them is constrained. The\n\
1429type is specified at object creation time by using a type code, which\n\
1430is a single character. The following type codes are defined:\n\
1431\n\
1432 Type code C Type Minimum size in bytes \n\
1433 'c' character 1 \n\
1434 'b' signed integer 1 \n\
1435 'B' unsigned integer 1 \n\
1436 'h' signed integer 2 \n\
1437 'H' unsigned integer 2 \n\
1438 'i' signed integer 2 \n\
1439 'I' unsigned integer 2 \n\
1440 'l' signed integer 4 \n\
1441 'L' unsigned integer 4 \n\
1442 'f' floating point 4 \n\
1443 'd' floating point 8 \n\
1444\n\
1445Functions:\n\
1446\n\
1447array(typecode [, initializer]) -- create a new array\n\
1448\n\
1449Special Objects:\n\
1450\n\
1451ArrayType -- type object for array objects\n\
1452";
1453
1454static char arraytype_doc [] =
1455"An array represents basic values and behave very much like lists, except\n\
1456the type of objects stored in them is constrained.\n\
1457\n\
1458Methods:\n\
1459\n\
1460append() -- append a new item to the end of the array\n\
1461buffer_info() -- return information giving the current memory info\n\
1462byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001463count() -- return number of occurences of an object\n\
1464extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001465fromfile() -- read items from a file object\n\
1466fromlist() -- append items from the list\n\
1467fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001468index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001469insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001470pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001471read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001472remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001473reverse() -- reverse the order of the items in the array\n\
1474tofile() -- write all items to a file object\n\
1475tolist() -- return the array converted to an ordinary list\n\
1476tostring() -- return the array converted to a string\n\
1477write() -- DEPRECATED, use tofile()\n\
1478\n\
1479Variables:\n\
1480\n\
1481typecode -- the typecode character used to create the array\n\
1482itemsize -- the length in bytes of one array item\n\
1483";
1484
1485statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001486 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001487 0,
1488 "array",
1489 sizeof(arrayobject),
1490 0,
1491 (destructor)array_dealloc, /*tp_dealloc*/
1492 (printfunc)array_print, /*tp_print*/
1493 (getattrfunc)array_getattr, /*tp_getattr*/
1494 0, /*tp_setattr*/
1495 (cmpfunc)array_compare, /*tp_compare*/
1496 (reprfunc)array_repr, /*tp_repr*/
1497 0, /*tp_as_number*/
1498 &array_as_sequence, /*tp_as_sequence*/
1499 0, /*tp_as_mapping*/
1500 0, /*tp_hash*/
1501 0, /*tp_call*/
1502 0, /*tp_str*/
1503 0, /*tp_getattro*/
1504 0, /*tp_setattro*/
1505 &array_as_buffer, /*tp_as_buffer*/
1506 0, /*tp_xxx4*/
1507 arraytype_doc, /*tp_doc*/
1508};
1509
Guido van Rossum3886bb61998-12-04 18:50:17 +00001510DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001511initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001512{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001513 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001514
1515 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001516 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001517 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001518 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1519 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001520}