blob: 43be90cb72ef13f0020d2c15f3b893d93a0ae52e [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001
2/* Array object implementation */
3
4/* An array is a uniform list -- all items have the same type.
5 The item type is restricted to simple C types like int or float */
6
Roger E. Masse2919eaa1996-12-09 20:10:36 +00007#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +00008
Guido van Rossum0c709541994-08-19 12:01:32 +00009#ifdef STDC_HEADERS
10#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000011#else /* !STDC_HEADERS */
12#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000013#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000014#endif /* DONT_HAVE_SYS_TYPES_H */
15#endif /* !STDC_HEADERS */
Guido van Rossumdb677392000-07-01 01:09:43 +000016#ifdef HAVE_LIMITS_H
17#include <limits.h>
18#endif /* HAVE_LIMITS_H */
Guido van Rossum778983b1993-02-19 15:55:02 +000019
20struct arrayobject; /* Forward */
21
22struct arraydescr {
23 int typecode;
24 int itemsize;
Tim Petersdbd9ba62000-07-09 03:09:57 +000025 PyObject * (*getitem)(struct arrayobject *, int);
26 int (*setitem)(struct arrayobject *, int, PyObject *);
Guido van Rossum778983b1993-02-19 15:55:02 +000027};
28
29typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000030 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000031 char *ob_item;
32 struct arraydescr *ob_descr;
33} arrayobject;
34
Roger E. Masse2919eaa1996-12-09 20:10:36 +000035staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000036
37#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
38
Guido van Rossumb73cc041993-11-01 16:28:59 +000039/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000040static PyObject *newarrayobject(int, struct arraydescr *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000041#if 0
Tim Petersdbd9ba62000-07-09 03:09:57 +000042static int getarraysize(PyObject *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000043#endif
Tim Petersdbd9ba62000-07-09 03:09:57 +000044static PyObject *getarrayitem(PyObject *, int);
45static int setarrayitem(PyObject *, int, PyObject *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000046#if 0
Tim Petersdbd9ba62000-07-09 03:09:57 +000047static int insarrayitem(PyObject *, int, PyObject *);
48static int addarrayitem(PyObject *, PyObject *);
Guido van Rossuma376cc51996-12-05 23:43:35 +000049#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000050
Roger E. Masse2919eaa1996-12-09 20:10:36 +000051static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000052c_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000053{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000054 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000055}
56
57static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000058c_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000059{
60 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000061 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000062 return -1;
63 if (i >= 0)
64 ((char *)ap->ob_item)[i] = x;
65 return 0;
66}
67
Roger E. Masse2919eaa1996-12-09 20:10:36 +000068static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000069b_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +000070{
71 long x = ((char *)ap->ob_item)[i];
72 if (x >= 128)
73 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000074 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000075}
76
77static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +000078b_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +000079{
Fred Drake541dc3b2000-06-28 17:49:30 +000080 short x;
81 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
82 must use the next size up that is signed ('h') and manually do
83 the overflow checking */
84 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000085 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +000086 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +000087 PyErr_SetString(PyExc_OverflowError,
88 "signed char is less than minimum");
89 return -1;
90 }
Guido van Rossum9f754e02000-07-01 00:38:19 +000091 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +000092 PyErr_SetString(PyExc_OverflowError,
93 "signed char is greater than maximum");
94 return -1;
95 }
Guido van Rossum778983b1993-02-19 15:55:02 +000096 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +000097 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +000098 return 0;
99}
100
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000101static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000102BB_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000103{
104 long x = ((unsigned char *)ap->ob_item)[i];
105 return PyInt_FromLong(x);
106}
107
Fred Drake541dc3b2000-06-28 17:49:30 +0000108static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000109BB_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000110{
111 unsigned char x;
112 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
113 if (!PyArg_Parse(v, "b;array item must be integer", &x))
114 return -1;
115 if (i >= 0)
116 ((char *)ap->ob_item)[i] = x;
117 return 0;
118}
Guido van Rossum549ab711997-01-03 19:09:47 +0000119
120static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000121h_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000122{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000123 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000124}
125
126static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000127h_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000128{
129 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000130 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000131 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000132 return -1;
133 if (i >= 0)
134 ((short *)ap->ob_item)[i] = x;
135 return 0;
136}
137
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000138static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000139HH_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000140{
141 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
142}
143
Fred Drake541dc3b2000-06-28 17:49:30 +0000144static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000145HH_setitem(arrayobject *ap, int i, PyObject *v)
Fred Drake541dc3b2000-06-28 17:49:30 +0000146{
147 int x;
148 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
149 must use the next size up and manually do the overflow checking */
150 if (!PyArg_Parse(v, "i;array item must be integer", &x))
151 return -1;
152 else if (x < 0) {
153 PyErr_SetString(PyExc_OverflowError,
154 "unsigned short is less than minimum");
155 return -1;
156 }
157 else if (x > USHRT_MAX) {
158 PyErr_SetString(PyExc_OverflowError,
159 "unsigned short is greater than maximum");
160 return -1;
161 }
162 if (i >= 0)
163 ((short *)ap->ob_item)[i] = (short)x;
164 return 0;
165}
Guido van Rossum549ab711997-01-03 19:09:47 +0000166
167static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000168i_getitem(arrayobject *ap, int i)
Guido van Rossume77a7571993-11-03 15:01:26 +0000169{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000170 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000171}
172
173static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000174i_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossume77a7571993-11-03 15:01:26 +0000175{
176 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000177 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000178 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000179 return -1;
180 if (i >= 0)
181 ((int *)ap->ob_item)[i] = x;
182 return 0;
183}
184
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000185static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000186II_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000187{
188 return PyLong_FromUnsignedLong(
189 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
190}
191
192static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000193II_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000194{
195 unsigned long x;
196 if (PyLong_Check(v)) {
197 x = PyLong_AsUnsignedLong(v);
198 if (x == (unsigned long) -1 && PyErr_Occurred())
199 return -1;
200 }
201 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000202 long y;
203 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000204 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000205 if (y < 0) {
206 PyErr_SetString(PyExc_OverflowError,
207 "unsigned int is less than minimum");
208 return -1;
209 }
210 x = (unsigned long)y;
211
Guido van Rossum549ab711997-01-03 19:09:47 +0000212 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000213 if (x > UINT_MAX) {
214 PyErr_SetString(PyExc_OverflowError,
215 "unsigned int is greater than maximum");
216 return -1;
217 }
218
Guido van Rossum549ab711997-01-03 19:09:47 +0000219 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000220 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000221 return 0;
222}
223
224static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000225l_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000226{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000227 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000228}
229
230static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000231l_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000232{
233 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000234 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000235 return -1;
236 if (i >= 0)
237 ((long *)ap->ob_item)[i] = x;
238 return 0;
239}
240
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000241static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000242LL_getitem(arrayobject *ap, int i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000243{
244 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
245}
246
247static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000248LL_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000249{
250 unsigned long x;
251 if (PyLong_Check(v)) {
252 x = PyLong_AsUnsignedLong(v);
253 if (x == (unsigned long) -1 && PyErr_Occurred())
254 return -1;
255 }
256 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000257 long y;
258 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000259 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000260 if (y < 0) {
261 PyErr_SetString(PyExc_OverflowError,
262 "unsigned long is less than minimum");
263 return -1;
264 }
265 x = (unsigned long)y;
266
Guido van Rossum549ab711997-01-03 19:09:47 +0000267 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000268 if (x > ULONG_MAX) {
269 PyErr_SetString(PyExc_OverflowError,
270 "unsigned long is greater than maximum");
271 return -1;
272 }
273
Guido van Rossum549ab711997-01-03 19:09:47 +0000274 if (i >= 0)
275 ((unsigned long *)ap->ob_item)[i] = x;
276 return 0;
277}
278
279static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000280f_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000281{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000282 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000283}
284
285static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000286f_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000287{
288 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000289 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000290 return -1;
291 if (i >= 0)
292 ((float *)ap->ob_item)[i] = x;
293 return 0;
294}
295
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000296static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000297d_getitem(arrayobject *ap, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000298{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000299 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000300}
301
302static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000303d_setitem(arrayobject *ap, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000304{
305 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000307 return -1;
308 if (i >= 0)
309 ((double *)ap->ob_item)[i] = x;
310 return 0;
311}
312
313/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000314static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000315 {'c', sizeof(char), c_getitem, c_setitem},
316 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000317 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000318 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000319 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000320 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000321 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000322 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000323 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000324 {'f', sizeof(float), f_getitem, f_setitem},
325 {'d', sizeof(double), d_getitem, d_setitem},
326 {'\0', 0, 0, 0} /* Sentinel */
327};
Guido van Rossume77a7571993-11-03 15:01:26 +0000328/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000329
330
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000331static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000332newarrayobject(int size, struct arraydescr *descr)
Guido van Rossum778983b1993-02-19 15:55:02 +0000333{
Guido van Rossum778983b1993-02-19 15:55:02 +0000334 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000335 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000336 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000337 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000338 return NULL;
339 }
340 nbytes = size * descr->itemsize;
341 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000342 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000343 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000344 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000345 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000346 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000347 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000348 }
349 if (size <= 0) {
350 op->ob_item = NULL;
351 }
352 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000353 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000354 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000355 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000356 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000357 }
358 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000359 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000360 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000361}
362
Guido van Rossuma376cc51996-12-05 23:43:35 +0000363#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000364static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000365getarraysize(PyObject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000366{
367 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000368 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000369 return -1;
370 }
371 return ((arrayobject *)op) -> ob_size;
372}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000373#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000374
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000375static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000376getarrayitem(PyObject *op, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000377{
378 register arrayobject *ap;
379 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000380 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000381 return NULL;
382 }
383 ap = (arrayobject *)op;
384 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 return NULL;
387 }
388 return (*ap->ob_descr->getitem)(ap, i);
389}
390
391static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000392ins1(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000393{
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 char *items;
395 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000396 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000397 return -1;
398 }
399 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
400 return -1;
401 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000402 PyMem_RESIZE(items, char,
403 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000405 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 return -1;
407 }
408 if (where < 0)
409 where = 0;
410 if (where > self->ob_size)
411 where = self->ob_size;
412 memmove(items + (where+1)*self->ob_descr->itemsize,
413 items + where*self->ob_descr->itemsize,
414 (self->ob_size-where)*self->ob_descr->itemsize);
415 self->ob_item = items;
416 self->ob_size++;
417 return (*self->ob_descr->setitem)(self, where, v);
418}
419
Guido van Rossuma376cc51996-12-05 23:43:35 +0000420#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000421static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000422insarrayitem(PyObject *op, int where, PyObject *newitem)
Guido van Rossum778983b1993-02-19 15:55:02 +0000423{
424 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000425 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000426 return -1;
427 }
428 return ins1((arrayobject *)op, where, newitem);
429}
430
Guido van Rossum62de97f1995-01-22 00:48:41 +0000431static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000432addarrayitem(PyObject *op, PyObject *newitem)
Guido van Rossum778983b1993-02-19 15:55:02 +0000433{
434 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000435 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000436 return -1;
437 }
438 return ins1((arrayobject *)op,
439 (int) ((arrayobject *)op)->ob_size, newitem);
440}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000441#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000442
443/* Methods */
444
445static void
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000446array_dealloc(arrayobject *op)
Guido van Rossum778983b1993-02-19 15:55:02 +0000447{
Guido van Rossum778983b1993-02-19 15:55:02 +0000448 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000450 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000451}
452
453static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000454array_compare(arrayobject *v, arrayobject *w)
Guido van Rossum778983b1993-02-19 15:55:02 +0000455{
456 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
457 int i;
458 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000459 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000460 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000461 ai = getarrayitem((PyObject *)v, i);
462 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000464 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 else
466 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000467 Py_XDECREF(ai);
468 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000469 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000470 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000471 }
472 return v->ob_size - w->ob_size;
473}
474
475static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000476array_length(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +0000477{
478 return a->ob_size;
479}
480
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000481static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000482array_item(arrayobject *a, int i)
Guido van Rossum778983b1993-02-19 15:55:02 +0000483{
484 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000485 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000486 return NULL;
487 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000488 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000489}
490
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000491static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000492array_slice(arrayobject *a, int ilow, int ihigh)
Guido van Rossum778983b1993-02-19 15:55:02 +0000493{
494 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000495 if (ilow < 0)
496 ilow = 0;
497 else if (ilow > a->ob_size)
498 ilow = a->ob_size;
499 if (ihigh < 0)
500 ihigh = 0;
501 if (ihigh < ilow)
502 ihigh = ilow;
503 else if (ihigh > a->ob_size)
504 ihigh = a->ob_size;
505 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
506 if (np == NULL)
507 return NULL;
508 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
509 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000510 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000511}
512
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000513static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000514array_concat(arrayobject *a, PyObject *bb)
Guido van Rossum778983b1993-02-19 15:55:02 +0000515{
516 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000517 arrayobject *np;
518 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000519 PyErr_Format(PyExc_TypeError,
520 "can only append array (not \"%.200s\") to array",
521 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000522 return NULL;
523 }
524#define b ((arrayobject *)bb)
525 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000526 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000527 return NULL;
528 }
529 size = a->ob_size + b->ob_size;
530 np = (arrayobject *) newarrayobject(size, a->ob_descr);
531 if (np == NULL) {
532 return NULL;
533 }
534 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
535 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000536 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000537 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000538#undef b
539}
540
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000541static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000542array_repeat(arrayobject *a, int n)
Guido van Rossum778983b1993-02-19 15:55:02 +0000543{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000544 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000545 int size;
546 arrayobject *np;
547 char *p;
548 int nbytes;
549 if (n < 0)
550 n = 0;
551 size = a->ob_size * n;
552 np = (arrayobject *) newarrayobject(size, a->ob_descr);
553 if (np == NULL)
554 return NULL;
555 p = np->ob_item;
556 nbytes = a->ob_size * a->ob_descr->itemsize;
557 for (i = 0; i < n; i++) {
558 memcpy(p, a->ob_item, nbytes);
559 p += nbytes;
560 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000561 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000562}
563
564static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000565array_ass_slice(arrayobject *a, int ilow, int ihigh, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000566{
567 char *item;
568 int n; /* Size of replacement array */
569 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000570#define b ((arrayobject *)v)
571 if (v == NULL)
572 n = 0;
573 else if (is_arrayobject(v)) {
574 n = b->ob_size;
575 if (a == b) {
576 /* Special case "a[i:j] = a" -- copy b first */
577 int ret;
578 v = array_slice(b, 0, n);
579 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000580 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000581 return ret;
582 }
583 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000584 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000585 return -1;
586 }
587 }
588 else {
Fred Drake137507e2000-06-01 02:02:46 +0000589 PyErr_Format(PyExc_TypeError,
590 "can only assign array (not \"%.200s\") to array slice",
591 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000592 return -1;
593 }
594 if (ilow < 0)
595 ilow = 0;
596 else if (ilow > a->ob_size)
597 ilow = a->ob_size;
598 if (ihigh < 0)
599 ihigh = 0;
600 if (ihigh < ilow)
601 ihigh = ilow;
602 else if (ihigh > a->ob_size)
603 ihigh = a->ob_size;
604 item = a->ob_item;
605 d = n - (ihigh-ilow);
606 if (d < 0) { /* Delete -d items */
607 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
608 item + ihigh*a->ob_descr->itemsize,
609 (a->ob_size-ihigh)*a->ob_descr->itemsize);
610 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000611 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000612 /* Can't fail */
613 a->ob_item = item;
614 }
615 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000616 PyMem_RESIZE(item, char,
617 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000618 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000619 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000620 return -1;
621 }
622 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
623 item + ihigh*a->ob_descr->itemsize,
624 (a->ob_size-ihigh)*a->ob_descr->itemsize);
625 a->ob_item = item;
626 a->ob_size += d;
627 }
628 if (n > 0)
629 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
630 n*b->ob_descr->itemsize);
631 return 0;
632#undef b
633}
634
635static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000636array_ass_item(arrayobject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000637{
638 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000639 PyErr_SetString(PyExc_IndexError,
640 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000641 return -1;
642 }
643 if (v == NULL)
644 return array_ass_slice(a, i, i+1, v);
645 return (*a->ob_descr->setitem)(a, i, v);
646}
647
648static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000649setarrayitem(PyObject *a, int i, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000650{
651 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000652 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000653 return -1;
654 }
655 return array_ass_item((arrayobject *)a, i, v);
656}
657
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000658static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000659ins(arrayobject *self, int where, PyObject *v)
Guido van Rossum778983b1993-02-19 15:55:02 +0000660{
661 if (ins1(self, where, v) != 0)
662 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000663 Py_INCREF(Py_None);
664 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000665}
666
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667static PyObject *
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000668array_count(arrayobject *self, PyObject *args)
669{
670 int count = 0;
671 int i;
672 PyObject *v;
673
674 if (!PyArg_ParseTuple(args, "O:count", &v))
675 return NULL;
676 for (i = 0; i < self->ob_size; i++) {
677 PyObject *selfi = getarrayitem((PyObject *)self, i);
678 if (PyObject_Compare(selfi, v) == 0)
679 count++;
680 Py_DECREF(selfi);
681 if (PyErr_Occurred())
682 return NULL;
683 }
684 return PyInt_FromLong((long)count);
685}
686
687static char count_doc [] =
688"count (x)\n\
689\n\
690Return number of occurences of x in the array.";
691
692static PyObject *
693array_index(arrayobject *self, PyObject *args)
694{
695 int i;
696 PyObject *v;
697
698 if (!PyArg_ParseTuple(args, "O:index", &v))
699 return NULL;
700 for (i = 0; i < self->ob_size; i++) {
701 PyObject *selfi = getarrayitem((PyObject *)self, i);
702 if (PyObject_Compare(selfi, v) == 0) {
703 Py_DECREF(selfi);
704 return PyInt_FromLong((long)i);
705 }
706 Py_DECREF(selfi);
707 if (PyErr_Occurred())
708 return NULL;
709 }
710 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in list");
711 return NULL;
712}
713
714static char index_doc [] =
715"index (x)\n\
716\n\
717Return index of first occurence of x in the array.";
718
719static PyObject *
720array_remove(arrayobject *self, PyObject *args)
721{
722 int i;
723 PyObject *v;
724
725 if (!PyArg_ParseTuple(args, "O:remove", &v))
726 return NULL;
727 for (i = 0; i < self->ob_size; i++) {
728 PyObject *selfi = getarrayitem((PyObject *)self,i);
729 if (PyObject_Compare(selfi, v) == 0) {
730 Py_DECREF(selfi);
731 if (array_ass_slice(self, i, i+1,
732 (PyObject *)NULL) != 0)
733 return NULL;
734 Py_INCREF(Py_None);
735 return Py_None;
736 }
737 Py_DECREF(selfi);
738 if (PyErr_Occurred())
739 return NULL;
740 }
741 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in list");
742 return NULL;
743}
744
745static char remove_doc [] =
746"remove (x)\n\
747\n\
748Remove the first occurence of x in the array.";
749
750static PyObject *
751array_pop(arrayobject *self, PyObject *args)
752{
753 int i = -1;
754 PyObject *v;
755 if (!PyArg_ParseTuple(args, "|i:pop", &i))
756 return NULL;
757 if (self->ob_size == 0) {
758 /* Special-case most common failure cause */
759 PyErr_SetString(PyExc_IndexError, "pop from empty array");
760 return NULL;
761 }
762 if (i < 0)
763 i += self->ob_size;
764 if (i < 0 || i >= self->ob_size) {
765 PyErr_SetString(PyExc_IndexError, "pop index out of range");
766 return NULL;
767 }
768 v = getarrayitem((PyObject *)self,i);
769 if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
770 Py_DECREF(v);
771 return NULL;
772 }
773 return v;
774}
775
776static char pop_doc [] =
777"pop ([i])\n\
778\n\
779Return the i-th element and delete it from the array. i defaults to -1.";
780
781static PyObject *
Fred Drake8ce159a2000-08-31 05:18:54 +0000782array_extend(arrayobject *self, PyObject *args)
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000783{
784 int size;
785 PyObject *bb;
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000786
787 if (!PyArg_ParseTuple(args, "O:extend", &bb))
788 return NULL;
789
790 if (!is_arrayobject(bb)) {
791 PyErr_Format(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000792 "can only extend array with array (not \"%.200s\")",
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000793 bb->ob_type->tp_name);
794 return NULL;
795 }
796#define b ((arrayobject *)bb)
797 if (self->ob_descr != b->ob_descr) {
798 PyErr_SetString(PyExc_TypeError,
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000799 "can only extend with array of same kind");
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +0000800 return NULL;
801 }
802 size = self->ob_size + b->ob_size;
803 PyMem_RESIZE(self->ob_item, char, size*self->ob_descr->itemsize);
804 if (self->ob_item == NULL) {
805 PyObject_Del(self);
806 return PyErr_NoMemory();
807 }
808 memcpy(self->ob_item + self->ob_size*self->ob_descr->itemsize,
809 b->ob_item, b->ob_size*b->ob_descr->itemsize);
810 self->ob_size = size;
811 Py_INCREF(Py_None);
812 return Py_None;
813#undef b
814}
815
816static char extend_doc [] =
817"extend(array)\n\
818\n\
819 Append array items to the end of the array.";
820
821static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000822array_insert(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000823{
824 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000825 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000826 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000827 return NULL;
828 return ins(self, i, v);
829}
830
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000831static char insert_doc [] =
832"insert (i,x)\n\
833\n\
834Insert a new item x into the array before position i.";
835
836
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000837static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000838array_buffer_info(arrayobject *self, PyObject *args)
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000839{
Fred Drake541dc3b2000-06-28 17:49:30 +0000840 PyObject* retval = PyTuple_New(2);
841 if (!retval) return NULL;
842
843 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
844 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
845
846 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000847}
848
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000849static char buffer_info_doc [] =
850"buffer_info -> (address, length)\n\
851\n\
852Return a tuple (address, length) giving the current memory address and\n\
853the length in bytes of the buffer used to hold array's contents.";
854
855
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000856static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000857array_append(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000858{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000859 PyObject *v;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000860 if (!PyArg_ParseTuple(args, "O:append", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000861 return NULL;
862 return ins(self, (int) self->ob_size, v);
863}
864
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000865static char append_doc [] =
866"append(x)\n\
867\n\
868Append new value x to the end of the array.";
869
870
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000871static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000872array_byteswap(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000873{
874 char *p;
875 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000876
877 if (!PyArg_ParseTuple(args, ":byteswap"))
878 return NULL;
879
Guido van Rossum778983b1993-02-19 15:55:02 +0000880 switch (self->ob_descr->itemsize) {
881 case 1:
882 break;
883 case 2:
884 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
885 char p0 = p[0];
886 p[0] = p[1];
887 p[1] = p0;
888 }
889 break;
890 case 4:
891 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
892 char p0 = p[0];
893 char p1 = p[1];
894 p[0] = p[3];
895 p[1] = p[2];
896 p[2] = p1;
897 p[3] = p0;
898 }
899 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000900 case 8:
901 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
902 char p0 = p[0];
903 char p1 = p[1];
904 char p2 = p[2];
905 char p3 = p[3];
906 p[0] = p[7];
907 p[1] = p[6];
908 p[2] = p[5];
909 p[3] = p[4];
910 p[4] = p3;
911 p[5] = p2;
912 p[6] = p1;
913 p[7] = p0;
914 }
915 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000916 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000917 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000918 "don't know how to byteswap this array type");
919 return NULL;
920 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000921 Py_INCREF(Py_None);
922 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000923}
924
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000925static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000926"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000927\n\
Fred Drakebf272981999-12-03 17:15:30 +0000928Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9294, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000930
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000931static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000932array_reverse(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000933{
Guido van Rossume77a7571993-11-03 15:01:26 +0000934 register int itemsize = self->ob_descr->itemsize;
935 register char *p, *q;
936 char tmp[sizeof(double)]; /* Assume that's the max item size */
937
Guido van Rossum778983b1993-02-19 15:55:02 +0000938 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000939 PyErr_SetString(PyExc_TypeError,
940 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000941 return NULL;
942 }
943
944 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000945 for (p = self->ob_item,
946 q = self->ob_item + (self->ob_size - 1)*itemsize;
947 p < q;
948 p += itemsize, q -= itemsize) {
949 memmove(tmp, p, itemsize);
950 memmove(p, q, itemsize);
951 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000952 }
953 }
954
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000955 Py_INCREF(Py_None);
956 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000957}
Guido van Rossume77a7571993-11-03 15:01:26 +0000958
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000959static char reverse_doc [] =
960"reverse()\n\
961\n\
962Reverse the order of the items in the array.";
963
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000964static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +0000965array_fromfile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000966{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000968 int n;
969 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +0000970 if (!PyArg_ParseTuple(args, "Oi:fromfile", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000971 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000972 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000973 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000974 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000975 return NULL;
976 }
977 if (n > 0) {
978 char *item = self->ob_item;
979 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000980 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000981 int newlength;
982 size_t newbytes;
983 /* Be careful here about overflow */
984 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000985 (newbytes = newlength * itemsize) / itemsize !=
986 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000987 goto nomem;
988 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000989 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000990 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000991 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000992 return NULL;
993 }
994 self->ob_item = item;
995 self->ob_size += n;
996 nread = fread(item + (self->ob_size - n) * itemsize,
997 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +0000998 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +0000999 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001000 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001002 PyErr_SetString(PyExc_EOFError,
1003 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001004 return NULL;
1005 }
1006 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001007 Py_INCREF(Py_None);
1008 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001009}
1010
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001011static char fromfile_doc [] =
1012"fromfile(f, n)\n\
1013\n\
1014Read n objects from the file object f and append them to the end of the\n\
1015array. Also called as read.";
1016
1017
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001018static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001019array_tofile(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001020{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001021 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001022 FILE *fp;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001023 if (!PyArg_ParseTuple(args, "O:tofile", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001024 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001025 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001026 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001027 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001028 return NULL;
1029 }
1030 if (self->ob_size > 0) {
Trent Mick6c116dd2000-08-12 20:58:11 +00001031 if (fwrite(self->ob_item, self->ob_descr->itemsize,
1032 self->ob_size, fp) != (size_t)self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001033 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001034 clearerr(fp);
1035 return NULL;
1036 }
1037 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001038 Py_INCREF(Py_None);
1039 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001040}
1041
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001042static char tofile_doc [] =
1043"tofile(f)\n\
1044\n\
1045Write all items (as machine values) to the file object f. Also called as\n\
1046write.";
1047
1048
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001049static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001050array_fromlist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001051{
1052 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001054 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001055 if (!PyArg_ParseTuple(args, "O:fromlist", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001056 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001057 if (!PyList_Check(list)) {
1058 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001059 return NULL;
1060 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001061 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001062 if (n > 0) {
1063 char *item = self->ob_item;
1064 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001065 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001066 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001067 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 return NULL;
1069 }
1070 self->ob_item = item;
1071 self->ob_size += n;
1072 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001073 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 if ((*self->ob_descr->setitem)(self,
1075 self->ob_size - n + i, v) != 0) {
1076 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001077 PyMem_RESIZE(item, char,
1078 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001079 self->ob_item = item;
1080 return NULL;
1081 }
1082 }
1083 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001084 Py_INCREF(Py_None);
1085 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001086}
1087
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001088static char fromlist_doc [] =
1089"fromlist(list)\n\
1090\n\
1091Append items to array from list.";
1092
1093
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001094static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001095array_tolist(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001096{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 int i;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001099 if (!PyArg_ParseTuple(args, ":tolist"))
1100 return NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001101 if (list == NULL)
1102 return NULL;
1103 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001104 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001105 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001106 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001107 return NULL;
1108 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001109 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 }
1111 return list;
1112}
1113
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001114static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001115"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001116\n\
1117Convert array to an ordinary list with the same items.";
1118
1119
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001120static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001121array_fromstring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001122{
1123 char *str;
1124 int n;
1125 int itemsize = self->ob_descr->itemsize;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001126 if (!PyArg_ParseTuple(args, "s#:fromstring", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001127 return NULL;
1128 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001129 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001130 "string length not a multiple of item size");
1131 return NULL;
1132 }
1133 n = n / itemsize;
1134 if (n > 0) {
1135 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001136 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001137 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001138 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001139 return NULL;
1140 }
1141 self->ob_item = item;
1142 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001143 memcpy(item + (self->ob_size - n) * itemsize,
1144 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001145 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001146 Py_INCREF(Py_None);
1147 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001148}
1149
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001150static char fromstring_doc [] =
1151"fromstring(string)\n\
1152\n\
1153Appends items from the string, interpreting it as an array of machine\n\
1154values,as if it had been read from a file using the fromfile() method).";
1155
1156
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001158array_tostring(arrayobject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001159{
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001160 if (!PyArg_ParseTuple(args, ":tostring"))
Guido van Rossum778983b1993-02-19 15:55:02 +00001161 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001162 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001163 self->ob_size * self->ob_descr->itemsize);
1164}
1165
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001166static char tostring_doc [] =
1167"tostring() -> string\n\
1168\n\
1169Convert the array to an array of machine values and return the string\n\
1170representation.";
1171
1172PyMethodDef array_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001173 {"append", (PyCFunction)array_append, METH_VARARGS, append_doc},
1174 {"buffer_info", (PyCFunction)array_buffer_info, METH_VARARGS, buffer_info_doc},
1175 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS, byteswap_doc},
1176 {"count", (PyCFunction)array_count, METH_VARARGS, count_doc},
1177 {"extend", (PyCFunction)array_extend, METH_VARARGS, extend_doc},
1178 {"fromfile", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1179 {"fromlist", (PyCFunction)array_fromlist, METH_VARARGS, fromlist_doc},
1180 {"fromstring", (PyCFunction)array_fromstring, METH_VARARGS, fromstring_doc},
1181 {"index", (PyCFunction)array_index, METH_VARARGS, index_doc},
1182 {"insert", (PyCFunction)array_insert, METH_VARARGS, insert_doc},
1183 {"pop", (PyCFunction)array_pop, METH_VARARGS, pop_doc},
1184 {"read", (PyCFunction)array_fromfile, METH_VARARGS, fromfile_doc},
1185 {"remove", (PyCFunction)array_remove, METH_VARARGS, remove_doc},
1186 {"reverse", (PyCFunction)array_reverse, METH_VARARGS, reverse_doc},
1187/* {"sort", (PyCFunction)array_sort, METH_VARARGS, sort_doc},*/
1188 {"tofile", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
1189 {"tolist", (PyCFunction)array_tolist, METH_VARARGS, tolist_doc},
1190 {"tostring", (PyCFunction)array_tostring, METH_VARARGS, tostring_doc},
1191 {"write", (PyCFunction)array_tofile, METH_VARARGS, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001192 {NULL, NULL} /* sentinel */
1193};
1194
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001196array_getattr(arrayobject *a, char *name)
Guido van Rossum778983b1993-02-19 15:55:02 +00001197{
1198 if (strcmp(name, "typecode") == 0) {
1199 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001200 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 }
1202 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001203 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001204 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001205 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001206 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001207 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001208 PyList_SetItem(list, 0,
1209 PyString_FromString("typecode"));
1210 PyList_SetItem(list, 1,
1211 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001212 if (PyErr_Occurred()) {
1213 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001214 list = NULL;
1215 }
1216 }
1217 return list;
1218 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001219 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001220}
1221
1222static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001223array_print(arrayobject *a, FILE *fp, int flags)
Guido van Rossum778983b1993-02-19 15:55:02 +00001224{
1225 int ok = 0;
1226 int i, len;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001227 PyObject *t_empty = PyTuple_New(0);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001228 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 len = a->ob_size;
1230 if (len == 0) {
1231 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1232 return ok;
1233 }
1234 if (a->ob_descr->typecode == 'c') {
1235 fprintf(fp, "array('c', ");
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001236 v = array_tostring(a, t_empty);
1237 Py_DECREF(t_empty);;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001238 ok = PyObject_Print(v, fp, 0);
1239 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001240 fprintf(fp, ")");
1241 return ok;
1242 }
1243 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1244 for (i = 0; i < len && ok == 0; i++) {
1245 if (i > 0)
1246 fprintf(fp, ", ");
1247 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001248 ok = PyObject_Print(v, fp, 0);
1249 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001250 }
1251 fprintf(fp, "])");
1252 return ok;
1253}
1254
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001255static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001256array_repr(arrayobject *a)
Guido van Rossum778983b1993-02-19 15:55:02 +00001257{
1258 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001260 int i, len;
1261 len = a->ob_size;
1262 if (len == 0) {
1263 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001264 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 }
1266 if (a->ob_descr->typecode == 'c') {
1267 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268 s = PyString_FromString(buf);
1269 v = array_tostring(a, (PyObject *)NULL);
1270 t = PyObject_Repr(v);
1271 Py_XDECREF(v);
1272 PyString_ConcatAndDel(&s, t);
1273 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001274 return s;
1275 }
1276 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001277 s = PyString_FromString(buf);
1278 comma = PyString_FromString(", ");
1279 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001280 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001281 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001282 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001283 t = PyObject_Repr(v);
1284 Py_XDECREF(v);
1285 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001286 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001287 Py_XDECREF(comma);
1288 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001289 return s;
1290}
1291
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001292static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001293array_buffer_getreadbuf(arrayobject *self, int index, const void **ptr)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001294{
1295 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001296 PyErr_SetString(PyExc_SystemError,
1297 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001298 return -1;
1299 }
1300 *ptr = (void *)self->ob_item;
1301 return self->ob_size*self->ob_descr->itemsize;
1302}
1303
1304static int
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001305array_buffer_getwritebuf(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_getsegcount(arrayobject *self, int *lenp)
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001318{
1319 if ( lenp )
1320 *lenp = self->ob_size*self->ob_descr->itemsize;
1321 return 1;
1322}
1323
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001324static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001325 (inquiry)array_length, /*sq_length*/
1326 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001327 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001328 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001329 (intintargfunc)array_slice, /*sq_slice*/
1330 (intobjargproc)array_ass_item, /*sq_ass_item*/
1331 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001332};
1333
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001334static PyBufferProcs array_as_buffer = {
1335 (getreadbufferproc)array_buffer_getreadbuf,
1336 (getwritebufferproc)array_buffer_getwritebuf,
1337 (getsegcountproc)array_buffer_getsegcount,
1338};
1339
1340
Guido van Rossum778983b1993-02-19 15:55:02 +00001341
1342
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001343static PyObject *
Peter Schneider-Kamp9656abd2000-07-13 21:10:57 +00001344a_array(PyObject *self, PyObject *args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001345{
1346 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001348 struct arraydescr *descr;
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001349 if (!PyArg_ParseTuple(args, "c:array", &c)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001350 PyErr_Clear();
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001351 if (!PyArg_ParseTuple(args, "cO:array", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001352 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001353 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1354 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001355 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001356 return NULL;
1357 }
1358 }
1359 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1360 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001361 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001362 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001363 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001364 len = 0;
1365 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001366 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001367 a = newarrayobject(len, descr);
1368 if (a == NULL)
1369 return NULL;
1370 if (len > 0) {
1371 int i;
1372 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001373 PyObject *v =
1374 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001375 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001376 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001377 return NULL;
1378 }
1379 }
1380 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001381 if (initial != NULL && PyString_Check(initial)) {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001382 PyObject *t_initial = Py_BuildValue("(O)", initial);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001383 PyObject *v =
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001384 array_fromstring((arrayobject *)a, t_initial);
1385 Py_DECREF(t_initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001386 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001387 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001388 return NULL;
1389 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001390 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001391 }
1392 return a;
1393 }
1394 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001395 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001396 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001397 return NULL;
1398}
1399
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001400static char a_array_doc [] =
1401"array(typecode [, initializer]) -> array\n\
1402\n\
1403Return a new array whose items are restricted by typecode, and\n\
1404initialized from the optional initializer value, which must be a list\n\
1405or a string.";
1406
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001407static PyMethodDef a_methods[] = {
Peter Schneider-Kampdc71cac2000-07-31 21:57:30 +00001408 {"array", a_array, METH_VARARGS, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001409 {NULL, NULL} /* sentinel */
1410};
1411
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001412static char module_doc [] =
1413"This module defines a new object type which can efficiently represent\n\
1414an array of basic values: characters, integers, floating point\n\
1415numbers. Arrays are sequence types and behave very much like lists,\n\
1416except that the type of objects stored in them is constrained. The\n\
1417type is specified at object creation time by using a type code, which\n\
1418is a single character. The following type codes are defined:\n\
1419\n\
1420 Type code C Type Minimum size in bytes \n\
1421 'c' character 1 \n\
1422 'b' signed integer 1 \n\
1423 'B' unsigned integer 1 \n\
1424 'h' signed integer 2 \n\
1425 'H' unsigned integer 2 \n\
1426 'i' signed integer 2 \n\
1427 'I' unsigned integer 2 \n\
1428 'l' signed integer 4 \n\
1429 'L' unsigned integer 4 \n\
1430 'f' floating point 4 \n\
1431 'd' floating point 8 \n\
1432\n\
1433Functions:\n\
1434\n\
1435array(typecode [, initializer]) -- create a new array\n\
1436\n\
1437Special Objects:\n\
1438\n\
1439ArrayType -- type object for array objects\n\
1440";
1441
1442static char arraytype_doc [] =
1443"An array represents basic values and behave very much like lists, except\n\
1444the type of objects stored in them is constrained.\n\
1445\n\
1446Methods:\n\
1447\n\
1448append() -- append a new item to the end of the array\n\
1449buffer_info() -- return information giving the current memory info\n\
1450byteswap() -- byteswap all the items of the array\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001451count() -- return number of occurences of an object\n\
1452extend() -- extend array by appending array elements\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001453fromfile() -- read items from a file object\n\
1454fromlist() -- append items from the list\n\
1455fromstring() -- append items from the string\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001456index() -- return index of first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001457insert() -- insert a new item into the array at a provided position\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001458pop() -- remove and return item (default last)\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001459read() -- DEPRECATED, use fromfile()\n\
Peter Schneider-Kamp5a65c2d2000-07-31 20:52:21 +00001460remove() -- remove first occurence of an object\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001461reverse() -- reverse the order of the items in the array\n\
1462tofile() -- write all items to a file object\n\
1463tolist() -- return the array converted to an ordinary list\n\
1464tostring() -- return the array converted to a string\n\
1465write() -- DEPRECATED, use tofile()\n\
1466\n\
1467Variables:\n\
1468\n\
1469typecode -- the typecode character used to create the array\n\
1470itemsize -- the length in bytes of one array item\n\
1471";
1472
1473statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001474 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001475 0,
1476 "array",
1477 sizeof(arrayobject),
1478 0,
1479 (destructor)array_dealloc, /*tp_dealloc*/
1480 (printfunc)array_print, /*tp_print*/
1481 (getattrfunc)array_getattr, /*tp_getattr*/
1482 0, /*tp_setattr*/
1483 (cmpfunc)array_compare, /*tp_compare*/
1484 (reprfunc)array_repr, /*tp_repr*/
1485 0, /*tp_as_number*/
1486 &array_as_sequence, /*tp_as_sequence*/
1487 0, /*tp_as_mapping*/
1488 0, /*tp_hash*/
1489 0, /*tp_call*/
1490 0, /*tp_str*/
1491 0, /*tp_getattro*/
1492 0, /*tp_setattro*/
1493 &array_as_buffer, /*tp_as_buffer*/
1494 0, /*tp_xxx4*/
1495 arraytype_doc, /*tp_doc*/
1496};
1497
Guido van Rossum3886bb61998-12-04 18:50:17 +00001498DL_EXPORT(void)
Thomas Woutersf3f33dc2000-07-21 06:00:07 +00001499initarray(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001500{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001501 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001502
1503 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001504 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001505 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001506 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1507 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001508}