blob: 595d930f0db6eb72925ee4bac6bfc624f2f18ecd [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;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000034 PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
35 int (*setitem) Py_FPROTO((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 */
Roger E. Masse2919eaa1996-12-09 20:10:36 +000049static PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000050#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000051static int getarraysize Py_PROTO((PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000052#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +000053static PyObject *getarrayitem Py_PROTO((PyObject *, int));
54static int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000055#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000056static int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
57static int addarrayitem Py_PROTO((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 *
Guido van Rossum778983b1993-02-19 15:55:02 +000061c_getitem(ap, i)
62 arrayobject *ap;
63 int i;
64{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000065 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000066}
67
68static int
69c_setitem(ap, i, v)
70 arrayobject *ap;
71 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000072 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000073{
74 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000075 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000076 return -1;
77 if (i >= 0)
78 ((char *)ap->ob_item)[i] = x;
79 return 0;
80}
81
Roger E. Masse2919eaa1996-12-09 20:10:36 +000082static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000083b_getitem(ap, i)
84 arrayobject *ap;
85 int i;
86{
87 long x = ((char *)ap->ob_item)[i];
88 if (x >= 128)
89 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000090 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000091}
92
93static int
94b_setitem(ap, i, v)
95 arrayobject *ap;
96 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000097 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000098{
Fred Drake541dc3b2000-06-28 17:49:30 +000099 short x;
100 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
101 must use the next size up that is signed ('h') and manually do
102 the overflow checking */
103 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000104 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000105 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000106 PyErr_SetString(PyExc_OverflowError,
107 "signed char is less than minimum");
108 return -1;
109 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000110 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000111 PyErr_SetString(PyExc_OverflowError,
112 "signed char is greater than maximum");
113 return -1;
114 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000115 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000116 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000117 return 0;
118}
119
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000120static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000121BB_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000122 arrayobject *ap;
123 int i;
124{
125 long x = ((unsigned char *)ap->ob_item)[i];
126 return PyInt_FromLong(x);
127}
128
Fred Drake541dc3b2000-06-28 17:49:30 +0000129static int
130BB_setitem(ap, i, v)
131 arrayobject *ap;
132 int i;
133 PyObject *v;
134{
135 unsigned char x;
136 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
137 if (!PyArg_Parse(v, "b;array item must be integer", &x))
138 return -1;
139 if (i >= 0)
140 ((char *)ap->ob_item)[i] = x;
141 return 0;
142}
Guido van Rossum549ab711997-01-03 19:09:47 +0000143
144static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000145h_getitem(ap, i)
146 arrayobject *ap;
147 int i;
148{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000149 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000150}
151
152static int
153h_setitem(ap, i, v)
154 arrayobject *ap;
155 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000156 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000157{
158 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000159 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000160 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000161 return -1;
162 if (i >= 0)
163 ((short *)ap->ob_item)[i] = x;
164 return 0;
165}
166
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000167static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000168HH_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000169 arrayobject *ap;
170 int i;
171{
172 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
173}
174
Fred Drake541dc3b2000-06-28 17:49:30 +0000175static int
176HH_setitem(ap, i, v)
177 arrayobject *ap;
178 int i;
179 PyObject *v;
180{
181 int x;
182 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
183 must use the next size up and manually do the overflow checking */
184 if (!PyArg_Parse(v, "i;array item must be integer", &x))
185 return -1;
186 else if (x < 0) {
187 PyErr_SetString(PyExc_OverflowError,
188 "unsigned short is less than minimum");
189 return -1;
190 }
191 else if (x > USHRT_MAX) {
192 PyErr_SetString(PyExc_OverflowError,
193 "unsigned short is greater than maximum");
194 return -1;
195 }
196 if (i >= 0)
197 ((short *)ap->ob_item)[i] = (short)x;
198 return 0;
199}
Guido van Rossum549ab711997-01-03 19:09:47 +0000200
201static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000202i_getitem(ap, i)
203 arrayobject *ap;
204 int i;
205{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000206 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000207}
208
209static int
210i_setitem(ap, i, v)
211 arrayobject *ap;
212 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000213 PyObject *v;
Guido van Rossume77a7571993-11-03 15:01:26 +0000214{
215 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000216 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000217 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000218 return -1;
219 if (i >= 0)
220 ((int *)ap->ob_item)[i] = x;
221 return 0;
222}
223
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000224static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000225II_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000226 arrayobject *ap;
227 int i;
228{
229 return PyLong_FromUnsignedLong(
230 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
231}
232
233static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000234II_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000235 arrayobject *ap;
236 int i;
237 PyObject *v;
238{
239 unsigned long x;
240 if (PyLong_Check(v)) {
241 x = PyLong_AsUnsignedLong(v);
242 if (x == (unsigned long) -1 && PyErr_Occurred())
243 return -1;
244 }
245 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000246 long y;
247 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000248 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000249 if (y < 0) {
250 PyErr_SetString(PyExc_OverflowError,
251 "unsigned int is less than minimum");
252 return -1;
253 }
254 x = (unsigned long)y;
255
Guido van Rossum549ab711997-01-03 19:09:47 +0000256 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000257 if (x > UINT_MAX) {
258 PyErr_SetString(PyExc_OverflowError,
259 "unsigned int is greater than maximum");
260 return -1;
261 }
262
Guido van Rossum549ab711997-01-03 19:09:47 +0000263 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000264 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000265 return 0;
266}
267
268static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000269l_getitem(ap, i)
270 arrayobject *ap;
271 int i;
272{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000273 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000274}
275
276static int
277l_setitem(ap, i, v)
278 arrayobject *ap;
279 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000280 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000281{
282 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000283 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000284 return -1;
285 if (i >= 0)
286 ((long *)ap->ob_item)[i] = x;
287 return 0;
288}
289
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000290static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000291LL_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000292 arrayobject *ap;
293 int i;
294{
295 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
296}
297
298static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000299LL_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000300 arrayobject *ap;
301 int i;
302 PyObject *v;
303{
304 unsigned long x;
305 if (PyLong_Check(v)) {
306 x = PyLong_AsUnsignedLong(v);
307 if (x == (unsigned long) -1 && PyErr_Occurred())
308 return -1;
309 }
310 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000311 long y;
312 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000313 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000314 if (y < 0) {
315 PyErr_SetString(PyExc_OverflowError,
316 "unsigned long is less than minimum");
317 return -1;
318 }
319 x = (unsigned long)y;
320
Guido van Rossum549ab711997-01-03 19:09:47 +0000321 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000322 if (x > ULONG_MAX) {
323 PyErr_SetString(PyExc_OverflowError,
324 "unsigned long is greater than maximum");
325 return -1;
326 }
327
Guido van Rossum549ab711997-01-03 19:09:47 +0000328 if (i >= 0)
329 ((unsigned long *)ap->ob_item)[i] = x;
330 return 0;
331}
332
333static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000334f_getitem(ap, i)
335 arrayobject *ap;
336 int i;
337{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000338 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000339}
340
341static int
342f_setitem(ap, i, v)
343 arrayobject *ap;
344 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000345 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000346{
347 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000348 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000349 return -1;
350 if (i >= 0)
351 ((float *)ap->ob_item)[i] = x;
352 return 0;
353}
354
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000355static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000356d_getitem(ap, i)
357 arrayobject *ap;
358 int i;
359{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000360 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000361}
362
363static int
364d_setitem(ap, i, v)
365 arrayobject *ap;
366 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000367 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000368{
369 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000370 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000371 return -1;
372 if (i >= 0)
373 ((double *)ap->ob_item)[i] = x;
374 return 0;
375}
376
377/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000378static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000379 {'c', sizeof(char), c_getitem, c_setitem},
380 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000381 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000382 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000383 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000384 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000385 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000386 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000387 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000388 {'f', sizeof(float), f_getitem, f_setitem},
389 {'d', sizeof(double), d_getitem, d_setitem},
390 {'\0', 0, 0, 0} /* Sentinel */
391};
Guido van Rossume77a7571993-11-03 15:01:26 +0000392/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000393
394
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000395static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000396newarrayobject(size, descr)
397 int size;
398 struct arraydescr *descr;
399{
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000401 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000402 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000403 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 return NULL;
405 }
406 nbytes = size * descr->itemsize;
407 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000408 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000409 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000410 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000411 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000412 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000413 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000414 }
415 if (size <= 0) {
416 op->ob_item = NULL;
417 }
418 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000419 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000421 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000422 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000423 }
424 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000425 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000426 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000427}
428
Guido van Rossuma376cc51996-12-05 23:43:35 +0000429#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000430static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000431getarraysize(op)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000432 PyObject *op;
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 ((arrayobject *)op) -> ob_size;
439}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000440#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000441
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000442static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000443getarrayitem(op, i)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000444 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000445 int i;
446{
447 register arrayobject *ap;
448 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000449 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000450 return NULL;
451 }
452 ap = (arrayobject *)op;
453 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000454 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000455 return NULL;
456 }
457 return (*ap->ob_descr->getitem)(ap, i);
458}
459
460static int
461ins1(self, where, v)
462 arrayobject *self;
463 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000464 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000465{
Guido van Rossum778983b1993-02-19 15:55:02 +0000466 char *items;
467 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000468 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000469 return -1;
470 }
471 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
472 return -1;
473 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000474 PyMem_RESIZE(items, char,
475 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000476 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000477 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000478 return -1;
479 }
480 if (where < 0)
481 where = 0;
482 if (where > self->ob_size)
483 where = self->ob_size;
484 memmove(items + (where+1)*self->ob_descr->itemsize,
485 items + where*self->ob_descr->itemsize,
486 (self->ob_size-where)*self->ob_descr->itemsize);
487 self->ob_item = items;
488 self->ob_size++;
489 return (*self->ob_descr->setitem)(self, where, v);
490}
491
Guido van Rossuma376cc51996-12-05 23:43:35 +0000492#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000493static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000494insarrayitem(op, where, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000495 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000496 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000497 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000498{
499 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000501 return -1;
502 }
503 return ins1((arrayobject *)op, where, newitem);
504}
505
Guido van Rossum62de97f1995-01-22 00:48:41 +0000506static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000507addarrayitem(op, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000508 PyObject *op;
509 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000510{
511 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000512 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000513 return -1;
514 }
515 return ins1((arrayobject *)op,
516 (int) ((arrayobject *)op)->ob_size, newitem);
517}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000518#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000519
520/* Methods */
521
522static void
523array_dealloc(op)
524 arrayobject *op;
525{
Guido van Rossum778983b1993-02-19 15:55:02 +0000526 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000527 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000528 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000529}
530
531static int
532array_compare(v, w)
533 arrayobject *v, *w;
534{
535 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
536 int i;
537 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000538 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000539 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000540 ai = getarrayitem((PyObject *)v, i);
541 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000542 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000543 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000544 else
545 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000546 Py_XDECREF(ai);
547 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000548 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000549 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000550 }
551 return v->ob_size - w->ob_size;
552}
553
554static int
555array_length(a)
556 arrayobject *a;
557{
558 return a->ob_size;
559}
560
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000561static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000562array_item(a, i)
563 arrayobject *a;
564 int i;
565{
566 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000567 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000568 return NULL;
569 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000570 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000571}
572
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000573static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000574array_slice(a, ilow, ihigh)
575 arrayobject *a;
576 int ilow, ihigh;
577{
578 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000579 if (ilow < 0)
580 ilow = 0;
581 else if (ilow > a->ob_size)
582 ilow = a->ob_size;
583 if (ihigh < 0)
584 ihigh = 0;
585 if (ihigh < ilow)
586 ihigh = ilow;
587 else if (ihigh > a->ob_size)
588 ihigh = a->ob_size;
589 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
590 if (np == NULL)
591 return NULL;
592 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
593 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000594 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000595}
596
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000597static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000598array_concat(a, bb)
599 arrayobject *a;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000600 PyObject *bb;
Guido van Rossum778983b1993-02-19 15:55:02 +0000601{
602 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000603 arrayobject *np;
604 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000605 PyErr_Format(PyExc_TypeError,
606 "can only append array (not \"%.200s\") to array",
607 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000608 return NULL;
609 }
610#define b ((arrayobject *)bb)
611 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000612 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000613 return NULL;
614 }
615 size = a->ob_size + b->ob_size;
616 np = (arrayobject *) newarrayobject(size, a->ob_descr);
617 if (np == NULL) {
618 return NULL;
619 }
620 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
621 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000622 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000623 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000624#undef b
625}
626
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000627static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000628array_repeat(a, n)
629 arrayobject *a;
630 int n;
631{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000632 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000633 int size;
634 arrayobject *np;
635 char *p;
636 int nbytes;
637 if (n < 0)
638 n = 0;
639 size = a->ob_size * n;
640 np = (arrayobject *) newarrayobject(size, a->ob_descr);
641 if (np == NULL)
642 return NULL;
643 p = np->ob_item;
644 nbytes = a->ob_size * a->ob_descr->itemsize;
645 for (i = 0; i < n; i++) {
646 memcpy(p, a->ob_item, nbytes);
647 p += nbytes;
648 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000649 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000650}
651
652static int
653array_ass_slice(a, ilow, ihigh, v)
654 arrayobject *a;
655 int ilow, ihigh;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000656 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000657{
658 char *item;
659 int n; /* Size of replacement array */
660 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000661#define b ((arrayobject *)v)
662 if (v == NULL)
663 n = 0;
664 else if (is_arrayobject(v)) {
665 n = b->ob_size;
666 if (a == b) {
667 /* Special case "a[i:j] = a" -- copy b first */
668 int ret;
669 v = array_slice(b, 0, n);
670 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000671 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000672 return ret;
673 }
674 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000675 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000676 return -1;
677 }
678 }
679 else {
Fred Drake137507e2000-06-01 02:02:46 +0000680 PyErr_Format(PyExc_TypeError,
681 "can only assign array (not \"%.200s\") to array slice",
682 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 return -1;
684 }
685 if (ilow < 0)
686 ilow = 0;
687 else if (ilow > a->ob_size)
688 ilow = a->ob_size;
689 if (ihigh < 0)
690 ihigh = 0;
691 if (ihigh < ilow)
692 ihigh = ilow;
693 else if (ihigh > a->ob_size)
694 ihigh = a->ob_size;
695 item = a->ob_item;
696 d = n - (ihigh-ilow);
697 if (d < 0) { /* Delete -d items */
698 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
699 item + ihigh*a->ob_descr->itemsize,
700 (a->ob_size-ihigh)*a->ob_descr->itemsize);
701 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000702 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000703 /* Can't fail */
704 a->ob_item = item;
705 }
706 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000707 PyMem_RESIZE(item, char,
708 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000709 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000710 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000711 return -1;
712 }
713 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
714 item + ihigh*a->ob_descr->itemsize,
715 (a->ob_size-ihigh)*a->ob_descr->itemsize);
716 a->ob_item = item;
717 a->ob_size += d;
718 }
719 if (n > 0)
720 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
721 n*b->ob_descr->itemsize);
722 return 0;
723#undef b
724}
725
726static int
727array_ass_item(a, i, v)
728 arrayobject *a;
729 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000730 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000731{
732 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000733 PyErr_SetString(PyExc_IndexError,
734 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000735 return -1;
736 }
737 if (v == NULL)
738 return array_ass_slice(a, i, i+1, v);
739 return (*a->ob_descr->setitem)(a, i, v);
740}
741
742static int
743setarrayitem(a, i, v)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000744 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +0000745 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000746 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000747{
748 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000749 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000750 return -1;
751 }
752 return array_ass_item((arrayobject *)a, i, v);
753}
754
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000755static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000756ins(self, where, v)
757 arrayobject *self;
758 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000759 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000760{
761 if (ins1(self, where, v) != 0)
762 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000763 Py_INCREF(Py_None);
764 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000765}
766
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000767static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000768array_insert(self, args)
769 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000770 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000771{
772 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000773 PyObject *v;
774 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000775 return NULL;
776 return ins(self, i, v);
777}
778
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000779static char insert_doc [] =
780"insert (i,x)\n\
781\n\
782Insert a new item x into the array before position i.";
783
784
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000785static PyObject *
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000786array_buffer_info(self, args)
787 arrayobject *self;
788 PyObject *args;
789{
Fred Drake541dc3b2000-06-28 17:49:30 +0000790 PyObject* retval = PyTuple_New(2);
791 if (!retval) return NULL;
792
793 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
794 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
795
796 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000797}
798
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000799static char buffer_info_doc [] =
800"buffer_info -> (address, length)\n\
801\n\
802Return a tuple (address, length) giving the current memory address and\n\
803the length in bytes of the buffer used to hold array's contents.";
804
805
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000806static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000807array_append(self, args)
808 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000809 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000810{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000811 PyObject *v;
812 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000813 return NULL;
814 return ins(self, (int) self->ob_size, v);
815}
816
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000817static char append_doc [] =
818"append(x)\n\
819\n\
820Append new value x to the end of the array.";
821
822
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000823static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000824array_byteswap(self, args)
825 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000826 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000827{
828 char *p;
829 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000830
831 if (!PyArg_ParseTuple(args, ":byteswap"))
832 return NULL;
833
Guido van Rossum778983b1993-02-19 15:55:02 +0000834 switch (self->ob_descr->itemsize) {
835 case 1:
836 break;
837 case 2:
838 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
839 char p0 = p[0];
840 p[0] = p[1];
841 p[1] = p0;
842 }
843 break;
844 case 4:
845 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
846 char p0 = p[0];
847 char p1 = p[1];
848 p[0] = p[3];
849 p[1] = p[2];
850 p[2] = p1;
851 p[3] = p0;
852 }
853 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000854 case 8:
855 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
856 char p0 = p[0];
857 char p1 = p[1];
858 char p2 = p[2];
859 char p3 = p[3];
860 p[0] = p[7];
861 p[1] = p[6];
862 p[2] = p[5];
863 p[3] = p[4];
864 p[4] = p3;
865 p[5] = p2;
866 p[6] = p1;
867 p[7] = p0;
868 }
869 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000870 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000871 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000872 "don't know how to byteswap this array type");
873 return NULL;
874 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000875 Py_INCREF(Py_None);
876 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000877}
878
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000879static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000880"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000881\n\
Fred Drakebf272981999-12-03 17:15:30 +0000882Byteswap all items of the array. If the items in the array are not 1, 2,\n\
8834, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000884
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000885static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000886array_reverse(self, args)
887 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000888 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000889{
Guido van Rossume77a7571993-11-03 15:01:26 +0000890 register int itemsize = self->ob_descr->itemsize;
891 register char *p, *q;
892 char tmp[sizeof(double)]; /* Assume that's the max item size */
893
Guido van Rossum778983b1993-02-19 15:55:02 +0000894 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000895 PyErr_SetString(PyExc_TypeError,
896 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000897 return NULL;
898 }
899
900 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000901 for (p = self->ob_item,
902 q = self->ob_item + (self->ob_size - 1)*itemsize;
903 p < q;
904 p += itemsize, q -= itemsize) {
905 memmove(tmp, p, itemsize);
906 memmove(p, q, itemsize);
907 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000908 }
909 }
910
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000911 Py_INCREF(Py_None);
912 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000913}
Guido van Rossume77a7571993-11-03 15:01:26 +0000914
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000915static char reverse_doc [] =
916"reverse()\n\
917\n\
918Reverse the order of the items in the array.";
919
Guido van Rossume77a7571993-11-03 15:01:26 +0000920/* The following routines were adapted from listobject.c but not converted.
921 To make them work you will have to work! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000922
923#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000924static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000925array_index(self, args)
926 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000927 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000928{
929 int i;
930
931 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000932 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000933 return NULL;
934 }
935 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000936 if (PyObject_Compare(self->ob_item[i], args) == 0)
937 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000938 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000939 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000940 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000941 return NULL;
942}
943#endif
944
945#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000946static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000947array_count(self, args)
948 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000949 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000950{
951 int count = 0;
952 int i;
953
954 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000955 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000956 return NULL;
957 }
958 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000959 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000960 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000961 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000962 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000963 return PyInt_FromLong((long)count);
Guido van Rossum778983b1993-02-19 15:55:02 +0000964}
965#endif
966
967#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000968static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000969array_remove(self, args)
970 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000971 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000972{
973 int i;
974
975 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000976 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000977 return NULL;
978 }
979 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000980 if (PyObject_Compare(self->ob_item[i], args) == 0) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000981 if (array_ass_slice(self, i, i+1,
982 (PyObject *)NULL) != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000983 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000984 Py_INCREF(Py_None);
985 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000986 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000987 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000988 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000989 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000990 return NULL;
991}
992#endif
993
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000994static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000995array_fromfile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000996 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000997 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000998{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000999 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001000 int n;
1001 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001002 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001003 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001004 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001005 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001006 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001007 return NULL;
1008 }
1009 if (n > 0) {
1010 char *item = self->ob_item;
1011 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001012 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001013 int newlength;
1014 size_t newbytes;
1015 /* Be careful here about overflow */
1016 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001017 (newbytes = newlength * itemsize) / itemsize !=
1018 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001019 goto nomem;
1020 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001021 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001022 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001023 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001024 return NULL;
1025 }
1026 self->ob_item = item;
1027 self->ob_size += n;
1028 nread = fread(item + (self->ob_size - n) * itemsize,
1029 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001030 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001032 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 PyErr_SetString(PyExc_EOFError,
1035 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001036 return NULL;
1037 }
1038 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001039 Py_INCREF(Py_None);
1040 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001041}
1042
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001043static char fromfile_doc [] =
1044"fromfile(f, n)\n\
1045\n\
1046Read n objects from the file object f and append them to the end of the\n\
1047array. Also called as read.";
1048
1049
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001050static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +00001051array_tofile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001052 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001054{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001055 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001056 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001057 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001058 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001060 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001061 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001062 return NULL;
1063 }
1064 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +00001065 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001066 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001067 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 clearerr(fp);
1069 return NULL;
1070 }
1071 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001072 Py_INCREF(Py_None);
1073 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001074}
1075
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001076static char tofile_doc [] =
1077"tofile(f)\n\
1078\n\
1079Write all items (as machine values) to the file object f. Also called as\n\
1080write.";
1081
1082
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001083static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001084array_fromlist(self, args)
1085 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001086 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001087{
1088 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001090 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001091 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001092 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001093 if (!PyList_Check(list)) {
1094 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001095 return NULL;
1096 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 if (n > 0) {
1099 char *item = self->ob_item;
1100 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001101 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001102 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001103 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001104 return NULL;
1105 }
1106 self->ob_item = item;
1107 self->ob_size += n;
1108 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001109 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 if ((*self->ob_descr->setitem)(self,
1111 self->ob_size - n + i, v) != 0) {
1112 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001113 PyMem_RESIZE(item, char,
1114 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001115 self->ob_item = item;
1116 return NULL;
1117 }
1118 }
1119 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001120 Py_INCREF(Py_None);
1121 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001122}
1123
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001124static char fromlist_doc [] =
1125"fromlist(list)\n\
1126\n\
1127Append items to array from list.";
1128
1129
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001130static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001131array_tolist(self, args)
1132 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001133 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001134{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001135 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001136 int i;
1137 if (list == NULL)
1138 return NULL;
1139 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001140 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001141 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001142 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001143 return NULL;
1144 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001145 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001146 }
1147 return list;
1148}
1149
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001150static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001151"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001152\n\
1153Convert array to an ordinary list with the same items.";
1154
1155
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001156static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001157array_fromstring(self, args)
1158 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001159 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001160{
1161 char *str;
1162 int n;
1163 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001164 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001165 return NULL;
1166 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001168 "string length not a multiple of item size");
1169 return NULL;
1170 }
1171 n = n / itemsize;
1172 if (n > 0) {
1173 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001174 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001175 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001176 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001177 return NULL;
1178 }
1179 self->ob_item = item;
1180 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001181 memcpy(item + (self->ob_size - n) * itemsize,
1182 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001183 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001184 Py_INCREF(Py_None);
1185 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001186}
1187
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001188static char fromstring_doc [] =
1189"fromstring(string)\n\
1190\n\
1191Appends items from the string, interpreting it as an array of machine\n\
1192values,as if it had been read from a file using the fromfile() method).";
1193
1194
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001196array_tostring(self, args)
1197 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001198 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001199{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001200 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001202 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001203 self->ob_size * self->ob_descr->itemsize);
1204}
1205
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001206static char tostring_doc [] =
1207"tostring() -> string\n\
1208\n\
1209Convert the array to an array of machine values and return the string\n\
1210representation.";
1211
1212PyMethodDef array_methods[] = {
1213 {"append", (PyCFunction)array_append, 0, append_doc},
1214 {"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
Fred Drakebf272981999-12-03 17:15:30 +00001215 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1216 byteswap_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001217/* {"count", (method)array_count},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001218 {"fromfile", (PyCFunction)array_fromfile, 0, fromfile_doc},
1219 {"fromlist", (PyCFunction)array_fromlist, 0, fromlist_doc},
1220 {"fromstring", (PyCFunction)array_fromstring, 0, fromstring_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001221/* {"index", (method)array_index},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001222 {"insert", (PyCFunction)array_insert, 0, insert_doc},
1223 {"read", (PyCFunction)array_fromfile, 0, fromfile_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001224/* {"remove", (method)array_remove},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001225 {"reverse", (PyCFunction)array_reverse, 0, reverse_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001226/* {"sort", (method)array_sort},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001227 {"tofile", (PyCFunction)array_tofile, 0, tofile_doc},
1228 {"tolist", (PyCFunction)array_tolist, 0, tolist_doc},
1229 {"tostring", (PyCFunction)array_tostring, 0, tostring_doc},
1230 {"write", (PyCFunction)array_tofile, 0, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001231 {NULL, NULL} /* sentinel */
1232};
1233
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001234static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001235array_getattr(a, name)
1236 arrayobject *a;
1237 char *name;
1238{
1239 if (strcmp(name, "typecode") == 0) {
1240 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001241 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001242 }
1243 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001244 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001245 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001246 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001247 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001248 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001249 PyList_SetItem(list, 0,
1250 PyString_FromString("typecode"));
1251 PyList_SetItem(list, 1,
1252 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 if (PyErr_Occurred()) {
1254 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001255 list = NULL;
1256 }
1257 }
1258 return list;
1259 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001260 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001261}
1262
1263static int
1264array_print(a, fp, flags)
1265 arrayobject *a;
1266 FILE *fp;
1267 int flags;
1268{
1269 int ok = 0;
1270 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001271 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001272 len = a->ob_size;
1273 if (len == 0) {
1274 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1275 return ok;
1276 }
1277 if (a->ob_descr->typecode == 'c') {
1278 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001279 v = array_tostring(a, (PyObject *)NULL);
1280 ok = PyObject_Print(v, fp, 0);
1281 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001282 fprintf(fp, ")");
1283 return ok;
1284 }
1285 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1286 for (i = 0; i < len && ok == 0; i++) {
1287 if (i > 0)
1288 fprintf(fp, ", ");
1289 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001290 ok = PyObject_Print(v, fp, 0);
1291 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001292 }
1293 fprintf(fp, "])");
1294 return ok;
1295}
1296
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001297static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001298array_repr(a)
1299 arrayobject *a;
1300{
1301 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001302 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001303 int i, len;
1304 len = a->ob_size;
1305 if (len == 0) {
1306 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001307 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001308 }
1309 if (a->ob_descr->typecode == 'c') {
1310 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001311 s = PyString_FromString(buf);
1312 v = array_tostring(a, (PyObject *)NULL);
1313 t = PyObject_Repr(v);
1314 Py_XDECREF(v);
1315 PyString_ConcatAndDel(&s, t);
1316 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001317 return s;
1318 }
1319 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001320 s = PyString_FromString(buf);
1321 comma = PyString_FromString(", ");
1322 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001323 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001324 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001325 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001326 t = PyObject_Repr(v);
1327 Py_XDECREF(v);
1328 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001329 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001330 Py_XDECREF(comma);
1331 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001332 return s;
1333}
1334
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001335static int
1336array_buffer_getreadbuf(self, index, ptr)
1337 arrayobject *self;
1338 int index;
1339 const void **ptr;
1340{
1341 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001342 PyErr_SetString(PyExc_SystemError,
1343 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001344 return -1;
1345 }
1346 *ptr = (void *)self->ob_item;
1347 return self->ob_size*self->ob_descr->itemsize;
1348}
1349
1350static int
1351array_buffer_getwritebuf(self, index, ptr)
1352 arrayobject *self;
1353 int index;
1354 const void **ptr;
1355{
1356 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001357 PyErr_SetString(PyExc_SystemError,
1358 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001359 return -1;
1360 }
1361 *ptr = (void *)self->ob_item;
1362 return self->ob_size*self->ob_descr->itemsize;
1363}
1364
1365static int
1366array_buffer_getsegcount(self, lenp)
1367 arrayobject *self;
1368 int *lenp;
1369{
1370 if ( lenp )
1371 *lenp = self->ob_size*self->ob_descr->itemsize;
1372 return 1;
1373}
1374
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001375static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001376 (inquiry)array_length, /*sq_length*/
1377 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001378 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001379 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001380 (intintargfunc)array_slice, /*sq_slice*/
1381 (intobjargproc)array_ass_item, /*sq_ass_item*/
1382 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001383};
1384
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001385static PyBufferProcs array_as_buffer = {
1386 (getreadbufferproc)array_buffer_getreadbuf,
1387 (getwritebufferproc)array_buffer_getwritebuf,
1388 (getsegcountproc)array_buffer_getsegcount,
1389};
1390
1391
Guido van Rossum778983b1993-02-19 15:55:02 +00001392
1393
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001394static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001395a_array(self, args)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001396 PyObject *self;
1397 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001398{
1399 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001400 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001401 struct arraydescr *descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001402 if (!PyArg_Parse(args, "c", &c)) {
1403 PyErr_Clear();
1404 if (!PyArg_Parse(args, "(cO)", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001405 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001406 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1407 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001408 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001409 return NULL;
1410 }
1411 }
1412 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1413 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001414 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001415 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001416 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001417 len = 0;
1418 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001419 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001420 a = newarrayobject(len, descr);
1421 if (a == NULL)
1422 return NULL;
1423 if (len > 0) {
1424 int i;
1425 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001426 PyObject *v =
1427 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001428 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001429 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001430 return NULL;
1431 }
1432 }
1433 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001434 if (initial != NULL && PyString_Check(initial)) {
1435 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001436 array_fromstring((arrayobject *)a, initial);
1437 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001438 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001439 return NULL;
1440 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001441 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001442 }
1443 return a;
1444 }
1445 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001446 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001447 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001448 return NULL;
1449}
1450
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001451static char a_array_doc [] =
1452"array(typecode [, initializer]) -> array\n\
1453\n\
1454Return a new array whose items are restricted by typecode, and\n\
1455initialized from the optional initializer value, which must be a list\n\
1456or a string.";
1457
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001458static PyMethodDef a_methods[] = {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001459 {"array", a_array, 0, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001460 {NULL, NULL} /* sentinel */
1461};
1462
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001463static char module_doc [] =
1464"This module defines a new object type which can efficiently represent\n\
1465an array of basic values: characters, integers, floating point\n\
1466numbers. Arrays are sequence types and behave very much like lists,\n\
1467except that the type of objects stored in them is constrained. The\n\
1468type is specified at object creation time by using a type code, which\n\
1469is a single character. The following type codes are defined:\n\
1470\n\
1471 Type code C Type Minimum size in bytes \n\
1472 'c' character 1 \n\
1473 'b' signed integer 1 \n\
1474 'B' unsigned integer 1 \n\
1475 'h' signed integer 2 \n\
1476 'H' unsigned integer 2 \n\
1477 'i' signed integer 2 \n\
1478 'I' unsigned integer 2 \n\
1479 'l' signed integer 4 \n\
1480 'L' unsigned integer 4 \n\
1481 'f' floating point 4 \n\
1482 'd' floating point 8 \n\
1483\n\
1484Functions:\n\
1485\n\
1486array(typecode [, initializer]) -- create a new array\n\
1487\n\
1488Special Objects:\n\
1489\n\
1490ArrayType -- type object for array objects\n\
1491";
1492
1493static char arraytype_doc [] =
1494"An array represents basic values and behave very much like lists, except\n\
1495the type of objects stored in them is constrained.\n\
1496\n\
1497Methods:\n\
1498\n\
1499append() -- append a new item to the end of the array\n\
1500buffer_info() -- return information giving the current memory info\n\
1501byteswap() -- byteswap all the items of the array\n\
1502fromfile() -- read items from a file object\n\
1503fromlist() -- append items from the list\n\
1504fromstring() -- append items from the string\n\
1505insert() -- insert a new item into the array at a provided position\n\
1506read() -- DEPRECATED, use fromfile()\n\
1507reverse() -- reverse the order of the items in the array\n\
1508tofile() -- write all items to a file object\n\
1509tolist() -- return the array converted to an ordinary list\n\
1510tostring() -- return the array converted to a string\n\
1511write() -- DEPRECATED, use tofile()\n\
1512\n\
1513Variables:\n\
1514\n\
1515typecode -- the typecode character used to create the array\n\
1516itemsize -- the length in bytes of one array item\n\
1517";
1518
1519statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001520 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001521 0,
1522 "array",
1523 sizeof(arrayobject),
1524 0,
1525 (destructor)array_dealloc, /*tp_dealloc*/
1526 (printfunc)array_print, /*tp_print*/
1527 (getattrfunc)array_getattr, /*tp_getattr*/
1528 0, /*tp_setattr*/
1529 (cmpfunc)array_compare, /*tp_compare*/
1530 (reprfunc)array_repr, /*tp_repr*/
1531 0, /*tp_as_number*/
1532 &array_as_sequence, /*tp_as_sequence*/
1533 0, /*tp_as_mapping*/
1534 0, /*tp_hash*/
1535 0, /*tp_call*/
1536 0, /*tp_str*/
1537 0, /*tp_getattro*/
1538 0, /*tp_setattro*/
1539 &array_as_buffer, /*tp_as_buffer*/
1540 0, /*tp_xxx4*/
1541 arraytype_doc, /*tp_doc*/
1542};
1543
Guido van Rossum3886bb61998-12-04 18:50:17 +00001544DL_EXPORT(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001545initarray()
1546{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001547 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001548
1549 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001550 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001551 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001552 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1553 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001554}