blob: 3ca1a80a35ff864aff44bf31aea99d60932e9110 [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum778983b1993-02-19 15:55:02 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum778983b1993-02-19 15:55:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum778983b1993-02-19 15:55:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum778983b1993-02-19 15:55:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum778983b1993-02-19 15:55:02 +000029
30******************************************************************/
31
32/* Array object implementation */
33
34/* An array is a uniform list -- all items have the same type.
35 The item type is restricted to simple C types like int or float */
36
Roger E. Masse2919eaa1996-12-09 20:10:36 +000037#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +000038
Guido van Rossum0c709541994-08-19 12:01:32 +000039#ifdef STDC_HEADERS
40#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000041#else /* !STDC_HEADERS */
42#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000043#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000044#endif /* DONT_HAVE_SYS_TYPES_H */
45#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000046
47struct arrayobject; /* Forward */
48
49struct arraydescr {
50 int typecode;
51 int itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000052 PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
53 int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *));
Guido van Rossum778983b1993-02-19 15:55:02 +000054};
55
56typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000057 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000058 char *ob_item;
59 struct arraydescr *ob_descr;
60} arrayobject;
61
Roger E. Masse2919eaa1996-12-09 20:10:36 +000062staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000063
64#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
65
Guido van Rossumb73cc041993-11-01 16:28:59 +000066/* Forward */
Roger E. Masse2919eaa1996-12-09 20:10:36 +000067static PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000068#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000069static int getarraysize Py_PROTO((PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000070#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +000071static PyObject *getarrayitem Py_PROTO((PyObject *, int));
72static int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000073#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000074static int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
75static int addarrayitem Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000076#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000077
Roger E. Masse2919eaa1996-12-09 20:10:36 +000078static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000079c_getitem(ap, i)
80 arrayobject *ap;
81 int i;
82{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000083 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000084}
85
86static int
87c_setitem(ap, i, v)
88 arrayobject *ap;
89 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000090 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000091{
92 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000093 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000094 return -1;
95 if (i >= 0)
96 ((char *)ap->ob_item)[i] = x;
97 return 0;
98}
99
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000100static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000101b_getitem(ap, i)
102 arrayobject *ap;
103 int i;
104{
105 long x = ((char *)ap->ob_item)[i];
106 if (x >= 128)
107 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000108 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000109}
110
111static int
112b_setitem(ap, i, v)
113 arrayobject *ap;
114 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000115 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000116{
Fred Drake541dc3b2000-06-28 17:49:30 +0000117 short x;
118 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
119 must use the next size up that is signed ('h') and manually do
120 the overflow checking */
121 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000122 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000123 else if (x < CHAR_MIN) {
124 PyErr_SetString(PyExc_OverflowError,
125 "signed char is less than minimum");
126 return -1;
127 }
128 else if (x > CHAR_MAX) {
129 PyErr_SetString(PyExc_OverflowError,
130 "signed char is greater than maximum");
131 return -1;
132 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000133 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000134 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000135 return 0;
136}
137
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000138static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000139BB_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000140 arrayobject *ap;
141 int i;
142{
143 long x = ((unsigned char *)ap->ob_item)[i];
144 return PyInt_FromLong(x);
145}
146
Fred Drake541dc3b2000-06-28 17:49:30 +0000147static int
148BB_setitem(ap, i, v)
149 arrayobject *ap;
150 int i;
151 PyObject *v;
152{
153 unsigned char x;
154 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
155 if (!PyArg_Parse(v, "b;array item must be integer", &x))
156 return -1;
157 if (i >= 0)
158 ((char *)ap->ob_item)[i] = x;
159 return 0;
160}
Guido van Rossum549ab711997-01-03 19:09:47 +0000161
162static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000163h_getitem(ap, i)
164 arrayobject *ap;
165 int i;
166{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000167 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000168}
169
170static int
171h_setitem(ap, i, v)
172 arrayobject *ap;
173 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000174 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000175{
176 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000177 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000178 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000179 return -1;
180 if (i >= 0)
181 ((short *)ap->ob_item)[i] = x;
182 return 0;
183}
184
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000185static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000186HH_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000187 arrayobject *ap;
188 int i;
189{
190 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
191}
192
Fred Drake541dc3b2000-06-28 17:49:30 +0000193static int
194HH_setitem(ap, i, v)
195 arrayobject *ap;
196 int i;
197 PyObject *v;
198{
199 int x;
200 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
201 must use the next size up and manually do the overflow checking */
202 if (!PyArg_Parse(v, "i;array item must be integer", &x))
203 return -1;
204 else if (x < 0) {
205 PyErr_SetString(PyExc_OverflowError,
206 "unsigned short is less than minimum");
207 return -1;
208 }
209 else if (x > USHRT_MAX) {
210 PyErr_SetString(PyExc_OverflowError,
211 "unsigned short is greater than maximum");
212 return -1;
213 }
214 if (i >= 0)
215 ((short *)ap->ob_item)[i] = (short)x;
216 return 0;
217}
Guido van Rossum549ab711997-01-03 19:09:47 +0000218
219static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000220i_getitem(ap, i)
221 arrayobject *ap;
222 int i;
223{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000224 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000225}
226
227static int
228i_setitem(ap, i, v)
229 arrayobject *ap;
230 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000231 PyObject *v;
Guido van Rossume77a7571993-11-03 15:01:26 +0000232{
233 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000234 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000235 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000236 return -1;
237 if (i >= 0)
238 ((int *)ap->ob_item)[i] = x;
239 return 0;
240}
241
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000242static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000243II_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000244 arrayobject *ap;
245 int i;
246{
247 return PyLong_FromUnsignedLong(
248 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
249}
250
251static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000252II_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000253 arrayobject *ap;
254 int i;
255 PyObject *v;
256{
257 unsigned long x;
258 if (PyLong_Check(v)) {
259 x = PyLong_AsUnsignedLong(v);
260 if (x == (unsigned long) -1 && PyErr_Occurred())
261 return -1;
262 }
263 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000264 long y;
265 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000266 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000267 if (y < 0) {
268 PyErr_SetString(PyExc_OverflowError,
269 "unsigned int is less than minimum");
270 return -1;
271 }
272 x = (unsigned long)y;
273
Guido van Rossum549ab711997-01-03 19:09:47 +0000274 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000275 if (x > UINT_MAX) {
276 PyErr_SetString(PyExc_OverflowError,
277 "unsigned int is greater than maximum");
278 return -1;
279 }
280
Guido van Rossum549ab711997-01-03 19:09:47 +0000281 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000282 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000283 return 0;
284}
285
286static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000287l_getitem(ap, i)
288 arrayobject *ap;
289 int i;
290{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000291 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000292}
293
294static int
295l_setitem(ap, i, v)
296 arrayobject *ap;
297 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000298 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000299{
300 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000301 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000302 return -1;
303 if (i >= 0)
304 ((long *)ap->ob_item)[i] = x;
305 return 0;
306}
307
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000308static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000309LL_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000310 arrayobject *ap;
311 int i;
312{
313 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
314}
315
316static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000317LL_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000318 arrayobject *ap;
319 int i;
320 PyObject *v;
321{
322 unsigned long x;
323 if (PyLong_Check(v)) {
324 x = PyLong_AsUnsignedLong(v);
325 if (x == (unsigned long) -1 && PyErr_Occurred())
326 return -1;
327 }
328 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000329 long y;
330 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000331 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000332 if (y < 0) {
333 PyErr_SetString(PyExc_OverflowError,
334 "unsigned long is less than minimum");
335 return -1;
336 }
337 x = (unsigned long)y;
338
Guido van Rossum549ab711997-01-03 19:09:47 +0000339 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000340 if (x > ULONG_MAX) {
341 PyErr_SetString(PyExc_OverflowError,
342 "unsigned long is greater than maximum");
343 return -1;
344 }
345
Guido van Rossum549ab711997-01-03 19:09:47 +0000346 if (i >= 0)
347 ((unsigned long *)ap->ob_item)[i] = x;
348 return 0;
349}
350
351static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000352f_getitem(ap, i)
353 arrayobject *ap;
354 int i;
355{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000356 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000357}
358
359static int
360f_setitem(ap, i, v)
361 arrayobject *ap;
362 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000363 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000364{
365 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000366 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000367 return -1;
368 if (i >= 0)
369 ((float *)ap->ob_item)[i] = x;
370 return 0;
371}
372
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000373static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000374d_getitem(ap, i)
375 arrayobject *ap;
376 int i;
377{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000378 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000379}
380
381static int
382d_setitem(ap, i, v)
383 arrayobject *ap;
384 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000385 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000386{
387 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000388 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000389 return -1;
390 if (i >= 0)
391 ((double *)ap->ob_item)[i] = x;
392 return 0;
393}
394
395/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000396static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000397 {'c', sizeof(char), c_getitem, c_setitem},
398 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000399 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000400 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000401 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000402 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000403 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000405 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000406 {'f', sizeof(float), f_getitem, f_setitem},
407 {'d', sizeof(double), d_getitem, d_setitem},
408 {'\0', 0, 0, 0} /* Sentinel */
409};
Guido van Rossume77a7571993-11-03 15:01:26 +0000410/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000411
412
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000413static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000414newarrayobject(size, descr)
415 int size;
416 struct arraydescr *descr;
417{
Guido van Rossum778983b1993-02-19 15:55:02 +0000418 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000419 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000421 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000422 return NULL;
423 }
424 nbytes = size * descr->itemsize;
425 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000426 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000427 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000428 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000429 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000430 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000431 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000432 }
433 if (size <= 0) {
434 op->ob_item = NULL;
435 }
436 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000437 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000438 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000439 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000440 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000441 }
442 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000443 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000444 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000445}
446
Guido van Rossuma376cc51996-12-05 23:43:35 +0000447#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000448static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000449getarraysize(op)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000450 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000451{
452 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000453 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000454 return -1;
455 }
456 return ((arrayobject *)op) -> ob_size;
457}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000458#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000459
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000460static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000461getarrayitem(op, i)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000462 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 int i;
464{
465 register arrayobject *ap;
466 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000467 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000468 return NULL;
469 }
470 ap = (arrayobject *)op;
471 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000472 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000473 return NULL;
474 }
475 return (*ap->ob_descr->getitem)(ap, i);
476}
477
478static int
479ins1(self, where, v)
480 arrayobject *self;
481 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000482 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000483{
Guido van Rossum778983b1993-02-19 15:55:02 +0000484 char *items;
485 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000486 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000487 return -1;
488 }
489 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
490 return -1;
491 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000492 PyMem_RESIZE(items, char,
493 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000494 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000495 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000496 return -1;
497 }
498 if (where < 0)
499 where = 0;
500 if (where > self->ob_size)
501 where = self->ob_size;
502 memmove(items + (where+1)*self->ob_descr->itemsize,
503 items + where*self->ob_descr->itemsize,
504 (self->ob_size-where)*self->ob_descr->itemsize);
505 self->ob_item = items;
506 self->ob_size++;
507 return (*self->ob_descr->setitem)(self, where, v);
508}
509
Guido van Rossuma376cc51996-12-05 23:43:35 +0000510#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000511static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000512insarrayitem(op, where, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000513 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000514 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000515 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000516{
517 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000518 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000519 return -1;
520 }
521 return ins1((arrayobject *)op, where, newitem);
522}
523
Guido van Rossum62de97f1995-01-22 00:48:41 +0000524static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000525addarrayitem(op, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000526 PyObject *op;
527 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000528{
529 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000530 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000531 return -1;
532 }
533 return ins1((arrayobject *)op,
534 (int) ((arrayobject *)op)->ob_size, newitem);
535}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000536#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000537
538/* Methods */
539
540static void
541array_dealloc(op)
542 arrayobject *op;
543{
Guido van Rossum778983b1993-02-19 15:55:02 +0000544 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000545 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000546 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000547}
548
549static int
550array_compare(v, w)
551 arrayobject *v, *w;
552{
553 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
554 int i;
555 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000556 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000557 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000558 ai = getarrayitem((PyObject *)v, i);
559 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000560 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000561 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000562 else
563 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000564 Py_XDECREF(ai);
565 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000566 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000567 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000568 }
569 return v->ob_size - w->ob_size;
570}
571
572static int
573array_length(a)
574 arrayobject *a;
575{
576 return a->ob_size;
577}
578
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000579static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000580array_item(a, i)
581 arrayobject *a;
582 int i;
583{
584 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000585 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000586 return NULL;
587 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000588 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000589}
590
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000591static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000592array_slice(a, ilow, ihigh)
593 arrayobject *a;
594 int ilow, ihigh;
595{
596 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000597 if (ilow < 0)
598 ilow = 0;
599 else if (ilow > a->ob_size)
600 ilow = a->ob_size;
601 if (ihigh < 0)
602 ihigh = 0;
603 if (ihigh < ilow)
604 ihigh = ilow;
605 else if (ihigh > a->ob_size)
606 ihigh = a->ob_size;
607 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
608 if (np == NULL)
609 return NULL;
610 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
611 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000612 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000613}
614
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000615static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000616array_concat(a, bb)
617 arrayobject *a;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000618 PyObject *bb;
Guido van Rossum778983b1993-02-19 15:55:02 +0000619{
620 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 arrayobject *np;
622 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000623 PyErr_Format(PyExc_TypeError,
624 "can only append array (not \"%.200s\") to array",
625 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000626 return NULL;
627 }
628#define b ((arrayobject *)bb)
629 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000630 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000631 return NULL;
632 }
633 size = a->ob_size + b->ob_size;
634 np = (arrayobject *) newarrayobject(size, a->ob_descr);
635 if (np == NULL) {
636 return NULL;
637 }
638 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
639 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000640 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000641 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000642#undef b
643}
644
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000645static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000646array_repeat(a, n)
647 arrayobject *a;
648 int n;
649{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000650 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000651 int size;
652 arrayobject *np;
653 char *p;
654 int nbytes;
655 if (n < 0)
656 n = 0;
657 size = a->ob_size * n;
658 np = (arrayobject *) newarrayobject(size, a->ob_descr);
659 if (np == NULL)
660 return NULL;
661 p = np->ob_item;
662 nbytes = a->ob_size * a->ob_descr->itemsize;
663 for (i = 0; i < n; i++) {
664 memcpy(p, a->ob_item, nbytes);
665 p += nbytes;
666 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000668}
669
670static int
671array_ass_slice(a, ilow, ihigh, v)
672 arrayobject *a;
673 int ilow, ihigh;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000674 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000675{
676 char *item;
677 int n; /* Size of replacement array */
678 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000679#define b ((arrayobject *)v)
680 if (v == NULL)
681 n = 0;
682 else if (is_arrayobject(v)) {
683 n = b->ob_size;
684 if (a == b) {
685 /* Special case "a[i:j] = a" -- copy b first */
686 int ret;
687 v = array_slice(b, 0, n);
688 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000689 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000690 return ret;
691 }
692 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000694 return -1;
695 }
696 }
697 else {
Fred Drake137507e2000-06-01 02:02:46 +0000698 PyErr_Format(PyExc_TypeError,
699 "can only assign array (not \"%.200s\") to array slice",
700 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000701 return -1;
702 }
703 if (ilow < 0)
704 ilow = 0;
705 else if (ilow > a->ob_size)
706 ilow = a->ob_size;
707 if (ihigh < 0)
708 ihigh = 0;
709 if (ihigh < ilow)
710 ihigh = ilow;
711 else if (ihigh > a->ob_size)
712 ihigh = a->ob_size;
713 item = a->ob_item;
714 d = n - (ihigh-ilow);
715 if (d < 0) { /* Delete -d items */
716 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
717 item + ihigh*a->ob_descr->itemsize,
718 (a->ob_size-ihigh)*a->ob_descr->itemsize);
719 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000720 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000721 /* Can't fail */
722 a->ob_item = item;
723 }
724 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000725 PyMem_RESIZE(item, char,
726 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000727 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000728 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000729 return -1;
730 }
731 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
732 item + ihigh*a->ob_descr->itemsize,
733 (a->ob_size-ihigh)*a->ob_descr->itemsize);
734 a->ob_item = item;
735 a->ob_size += d;
736 }
737 if (n > 0)
738 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
739 n*b->ob_descr->itemsize);
740 return 0;
741#undef b
742}
743
744static int
745array_ass_item(a, i, v)
746 arrayobject *a;
747 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000748 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000749{
750 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000751 PyErr_SetString(PyExc_IndexError,
752 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000753 return -1;
754 }
755 if (v == NULL)
756 return array_ass_slice(a, i, i+1, v);
757 return (*a->ob_descr->setitem)(a, i, v);
758}
759
760static int
761setarrayitem(a, i, v)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000762 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +0000763 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000764 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000765{
766 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000767 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000768 return -1;
769 }
770 return array_ass_item((arrayobject *)a, i, v);
771}
772
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000773static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000774ins(self, where, v)
775 arrayobject *self;
776 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000777 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000778{
779 if (ins1(self, where, v) != 0)
780 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000781 Py_INCREF(Py_None);
782 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000783}
784
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000785static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000786array_insert(self, args)
787 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000788 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000789{
790 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000791 PyObject *v;
792 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000793 return NULL;
794 return ins(self, i, v);
795}
796
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000797static char insert_doc [] =
798"insert (i,x)\n\
799\n\
800Insert a new item x into the array before position i.";
801
802
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000803static PyObject *
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000804array_buffer_info(self, args)
805 arrayobject *self;
806 PyObject *args;
807{
Fred Drake541dc3b2000-06-28 17:49:30 +0000808 PyObject* retval = PyTuple_New(2);
809 if (!retval) return NULL;
810
811 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
812 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
813
814 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000815}
816
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000817static char buffer_info_doc [] =
818"buffer_info -> (address, length)\n\
819\n\
820Return a tuple (address, length) giving the current memory address and\n\
821the length in bytes of the buffer used to hold array's contents.";
822
823
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000824static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000825array_append(self, args)
826 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000827 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000828{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000829 PyObject *v;
830 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000831 return NULL;
832 return ins(self, (int) self->ob_size, v);
833}
834
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000835static char append_doc [] =
836"append(x)\n\
837\n\
838Append new value x to the end of the array.";
839
840
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000841static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000842array_byteswap(self, args)
843 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000844 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000845{
846 char *p;
847 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000848
849 if (!PyArg_ParseTuple(args, ":byteswap"))
850 return NULL;
851
Guido van Rossum778983b1993-02-19 15:55:02 +0000852 switch (self->ob_descr->itemsize) {
853 case 1:
854 break;
855 case 2:
856 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
857 char p0 = p[0];
858 p[0] = p[1];
859 p[1] = p0;
860 }
861 break;
862 case 4:
863 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
864 char p0 = p[0];
865 char p1 = p[1];
866 p[0] = p[3];
867 p[1] = p[2];
868 p[2] = p1;
869 p[3] = p0;
870 }
871 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000872 case 8:
873 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
874 char p0 = p[0];
875 char p1 = p[1];
876 char p2 = p[2];
877 char p3 = p[3];
878 p[0] = p[7];
879 p[1] = p[6];
880 p[2] = p[5];
881 p[3] = p[4];
882 p[4] = p3;
883 p[5] = p2;
884 p[6] = p1;
885 p[7] = p0;
886 }
887 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000888 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000889 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000890 "don't know how to byteswap this array type");
891 return NULL;
892 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000893 Py_INCREF(Py_None);
894 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000895}
896
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000897static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000898"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000899\n\
Fred Drakebf272981999-12-03 17:15:30 +0000900Byteswap all items of the array. If the items in the array are not 1, 2,\n\
9014, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000902
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000903static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000904array_reverse(self, args)
905 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000906 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000907{
Guido van Rossume77a7571993-11-03 15:01:26 +0000908 register int itemsize = self->ob_descr->itemsize;
909 register char *p, *q;
910 char tmp[sizeof(double)]; /* Assume that's the max item size */
911
Guido van Rossum778983b1993-02-19 15:55:02 +0000912 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000913 PyErr_SetString(PyExc_TypeError,
914 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000915 return NULL;
916 }
917
918 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000919 for (p = self->ob_item,
920 q = self->ob_item + (self->ob_size - 1)*itemsize;
921 p < q;
922 p += itemsize, q -= itemsize) {
923 memmove(tmp, p, itemsize);
924 memmove(p, q, itemsize);
925 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000926 }
927 }
928
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000929 Py_INCREF(Py_None);
930 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000931}
Guido van Rossume77a7571993-11-03 15:01:26 +0000932
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000933static char reverse_doc [] =
934"reverse()\n\
935\n\
936Reverse the order of the items in the array.";
937
Guido van Rossume77a7571993-11-03 15:01:26 +0000938/* The following routines were adapted from listobject.c but not converted.
939 To make them work you will have to work! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000940
941#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000942static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000943array_index(self, args)
944 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000945 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000946{
947 int i;
948
949 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000950 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000951 return NULL;
952 }
953 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000954 if (PyObject_Compare(self->ob_item[i], args) == 0)
955 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000956 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000957 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000958 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000959 return NULL;
960}
961#endif
962
963#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000964static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000965array_count(self, args)
966 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000968{
969 int count = 0;
970 int i;
971
972 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000973 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000974 return NULL;
975 }
976 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000977 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000978 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000979 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000980 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000981 return PyInt_FromLong((long)count);
Guido van Rossum778983b1993-02-19 15:55:02 +0000982}
983#endif
984
985#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000986static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000987array_remove(self, args)
988 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000989 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000990{
991 int i;
992
993 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000994 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000995 return NULL;
996 }
997 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000998 if (PyObject_Compare(self->ob_item[i], args) == 0) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000999 if (array_ass_slice(self, i, i+1,
1000 (PyObject *)NULL) != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001002 Py_INCREF(Py_None);
1003 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001004 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001005 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +00001006 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001007 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +00001008 return NULL;
1009}
1010#endif
1011
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001012static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +00001013array_fromfile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001014 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001015 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001016{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001017 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001018 int n;
1019 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001020 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001021 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001022 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001023 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001024 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001025 return NULL;
1026 }
1027 if (n > 0) {
1028 char *item = self->ob_item;
1029 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001030 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001031 int newlength;
1032 size_t newbytes;
1033 /* Be careful here about overflow */
1034 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001035 (newbytes = newlength * itemsize) / itemsize !=
1036 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001037 goto nomem;
1038 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001039 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001040 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001041 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001042 return NULL;
1043 }
1044 self->ob_item = item;
1045 self->ob_size += n;
1046 nread = fread(item + (self->ob_size - n) * itemsize,
1047 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001048 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001049 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001050 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001051 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001052 PyErr_SetString(PyExc_EOFError,
1053 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001054 return NULL;
1055 }
1056 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001057 Py_INCREF(Py_None);
1058 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001059}
1060
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001061static char fromfile_doc [] =
1062"fromfile(f, n)\n\
1063\n\
1064Read n objects from the file object f and append them to the end of the\n\
1065array. Also called as read.";
1066
1067
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001068static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +00001069array_tofile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001070 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001071 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001072{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001073 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001075 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001076 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001077 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001078 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001079 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001080 return NULL;
1081 }
1082 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +00001083 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001084 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001085 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001086 clearerr(fp);
1087 return NULL;
1088 }
1089 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001090 Py_INCREF(Py_None);
1091 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001092}
1093
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001094static char tofile_doc [] =
1095"tofile(f)\n\
1096\n\
1097Write all items (as machine values) to the file object f. Also called as\n\
1098write.";
1099
1100
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001101static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001102array_fromlist(self, args)
1103 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001104 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001105{
1106 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001107 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001108 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001109 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001111 if (!PyList_Check(list)) {
1112 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001113 return NULL;
1114 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001115 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001116 if (n > 0) {
1117 char *item = self->ob_item;
1118 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001119 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001120 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001121 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001122 return NULL;
1123 }
1124 self->ob_item = item;
1125 self->ob_size += n;
1126 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001128 if ((*self->ob_descr->setitem)(self,
1129 self->ob_size - n + i, v) != 0) {
1130 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001131 PyMem_RESIZE(item, char,
1132 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001133 self->ob_item = item;
1134 return NULL;
1135 }
1136 }
1137 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001138 Py_INCREF(Py_None);
1139 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001140}
1141
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001142static char fromlist_doc [] =
1143"fromlist(list)\n\
1144\n\
1145Append items to array from list.";
1146
1147
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001149array_tolist(self, args)
1150 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001151 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001152{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001153 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001154 int i;
1155 if (list == NULL)
1156 return NULL;
1157 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001158 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001159 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001160 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001161 return NULL;
1162 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001163 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001164 }
1165 return list;
1166}
1167
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001168static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001169"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001170\n\
1171Convert array to an ordinary list with the same items.";
1172
1173
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001174static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001175array_fromstring(self, args)
1176 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001177 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001178{
1179 char *str;
1180 int n;
1181 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001182 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001183 return NULL;
1184 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001185 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001186 "string length not a multiple of item size");
1187 return NULL;
1188 }
1189 n = n / itemsize;
1190 if (n > 0) {
1191 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001192 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001193 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001194 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001195 return NULL;
1196 }
1197 self->ob_item = item;
1198 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001199 memcpy(item + (self->ob_size - n) * itemsize,
1200 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001201 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001202 Py_INCREF(Py_None);
1203 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001204}
1205
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001206static char fromstring_doc [] =
1207"fromstring(string)\n\
1208\n\
1209Appends items from the string, interpreting it as an array of machine\n\
1210values,as if it had been read from a file using the fromfile() method).";
1211
1212
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001213static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001214array_tostring(self, args)
1215 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001216 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001217{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001218 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001219 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001220 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001221 self->ob_size * self->ob_descr->itemsize);
1222}
1223
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001224static char tostring_doc [] =
1225"tostring() -> string\n\
1226\n\
1227Convert the array to an array of machine values and return the string\n\
1228representation.";
1229
1230PyMethodDef array_methods[] = {
1231 {"append", (PyCFunction)array_append, 0, append_doc},
1232 {"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
Fred Drakebf272981999-12-03 17:15:30 +00001233 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1234 byteswap_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001235/* {"count", (method)array_count},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001236 {"fromfile", (PyCFunction)array_fromfile, 0, fromfile_doc},
1237 {"fromlist", (PyCFunction)array_fromlist, 0, fromlist_doc},
1238 {"fromstring", (PyCFunction)array_fromstring, 0, fromstring_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001239/* {"index", (method)array_index},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001240 {"insert", (PyCFunction)array_insert, 0, insert_doc},
1241 {"read", (PyCFunction)array_fromfile, 0, fromfile_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001242/* {"remove", (method)array_remove},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001243 {"reverse", (PyCFunction)array_reverse, 0, reverse_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001244/* {"sort", (method)array_sort},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001245 {"tofile", (PyCFunction)array_tofile, 0, tofile_doc},
1246 {"tolist", (PyCFunction)array_tolist, 0, tolist_doc},
1247 {"tostring", (PyCFunction)array_tostring, 0, tostring_doc},
1248 {"write", (PyCFunction)array_tofile, 0, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001249 {NULL, NULL} /* sentinel */
1250};
1251
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001252static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001253array_getattr(a, name)
1254 arrayobject *a;
1255 char *name;
1256{
1257 if (strcmp(name, "typecode") == 0) {
1258 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001260 }
1261 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001262 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001263 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001264 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001266 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001267 PyList_SetItem(list, 0,
1268 PyString_FromString("typecode"));
1269 PyList_SetItem(list, 1,
1270 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001271 if (PyErr_Occurred()) {
1272 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001273 list = NULL;
1274 }
1275 }
1276 return list;
1277 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001278 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001279}
1280
1281static int
1282array_print(a, fp, flags)
1283 arrayobject *a;
1284 FILE *fp;
1285 int flags;
1286{
1287 int ok = 0;
1288 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001289 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001290 len = a->ob_size;
1291 if (len == 0) {
1292 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1293 return ok;
1294 }
1295 if (a->ob_descr->typecode == 'c') {
1296 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001297 v = array_tostring(a, (PyObject *)NULL);
1298 ok = PyObject_Print(v, fp, 0);
1299 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001300 fprintf(fp, ")");
1301 return ok;
1302 }
1303 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1304 for (i = 0; i < len && ok == 0; i++) {
1305 if (i > 0)
1306 fprintf(fp, ", ");
1307 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001308 ok = PyObject_Print(v, fp, 0);
1309 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001310 }
1311 fprintf(fp, "])");
1312 return ok;
1313}
1314
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001315static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001316array_repr(a)
1317 arrayobject *a;
1318{
1319 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001320 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001321 int i, len;
1322 len = a->ob_size;
1323 if (len == 0) {
1324 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001325 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001326 }
1327 if (a->ob_descr->typecode == 'c') {
1328 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001329 s = PyString_FromString(buf);
1330 v = array_tostring(a, (PyObject *)NULL);
1331 t = PyObject_Repr(v);
1332 Py_XDECREF(v);
1333 PyString_ConcatAndDel(&s, t);
1334 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001335 return s;
1336 }
1337 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001338 s = PyString_FromString(buf);
1339 comma = PyString_FromString(", ");
1340 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001341 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001342 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001343 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001344 t = PyObject_Repr(v);
1345 Py_XDECREF(v);
1346 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001347 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001348 Py_XDECREF(comma);
1349 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 return s;
1351}
1352
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001353static int
1354array_buffer_getreadbuf(self, index, ptr)
1355 arrayobject *self;
1356 int index;
1357 const void **ptr;
1358{
1359 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001360 PyErr_SetString(PyExc_SystemError,
1361 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001362 return -1;
1363 }
1364 *ptr = (void *)self->ob_item;
1365 return self->ob_size*self->ob_descr->itemsize;
1366}
1367
1368static int
1369array_buffer_getwritebuf(self, index, ptr)
1370 arrayobject *self;
1371 int index;
1372 const void **ptr;
1373{
1374 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001375 PyErr_SetString(PyExc_SystemError,
1376 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001377 return -1;
1378 }
1379 *ptr = (void *)self->ob_item;
1380 return self->ob_size*self->ob_descr->itemsize;
1381}
1382
1383static int
1384array_buffer_getsegcount(self, lenp)
1385 arrayobject *self;
1386 int *lenp;
1387{
1388 if ( lenp )
1389 *lenp = self->ob_size*self->ob_descr->itemsize;
1390 return 1;
1391}
1392
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001393static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001394 (inquiry)array_length, /*sq_length*/
1395 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001396 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001397 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001398 (intintargfunc)array_slice, /*sq_slice*/
1399 (intobjargproc)array_ass_item, /*sq_ass_item*/
1400 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001401};
1402
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001403static PyBufferProcs array_as_buffer = {
1404 (getreadbufferproc)array_buffer_getreadbuf,
1405 (getwritebufferproc)array_buffer_getwritebuf,
1406 (getsegcountproc)array_buffer_getsegcount,
1407};
1408
1409
Guido van Rossum778983b1993-02-19 15:55:02 +00001410
1411
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001412static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001413a_array(self, args)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001414 PyObject *self;
1415 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001416{
1417 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001418 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001419 struct arraydescr *descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001420 if (!PyArg_Parse(args, "c", &c)) {
1421 PyErr_Clear();
1422 if (!PyArg_Parse(args, "(cO)", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001423 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001424 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1425 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001426 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001427 return NULL;
1428 }
1429 }
1430 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1431 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001432 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001433 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001434 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001435 len = 0;
1436 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001437 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001438 a = newarrayobject(len, descr);
1439 if (a == NULL)
1440 return NULL;
1441 if (len > 0) {
1442 int i;
1443 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001444 PyObject *v =
1445 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001446 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001447 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001448 return NULL;
1449 }
1450 }
1451 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001452 if (initial != NULL && PyString_Check(initial)) {
1453 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001454 array_fromstring((arrayobject *)a, initial);
1455 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001456 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001457 return NULL;
1458 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001459 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001460 }
1461 return a;
1462 }
1463 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001464 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001465 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001466 return NULL;
1467}
1468
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001469static char a_array_doc [] =
1470"array(typecode [, initializer]) -> array\n\
1471\n\
1472Return a new array whose items are restricted by typecode, and\n\
1473initialized from the optional initializer value, which must be a list\n\
1474or a string.";
1475
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001476static PyMethodDef a_methods[] = {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001477 {"array", a_array, 0, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001478 {NULL, NULL} /* sentinel */
1479};
1480
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001481static char module_doc [] =
1482"This module defines a new object type which can efficiently represent\n\
1483an array of basic values: characters, integers, floating point\n\
1484numbers. Arrays are sequence types and behave very much like lists,\n\
1485except that the type of objects stored in them is constrained. The\n\
1486type is specified at object creation time by using a type code, which\n\
1487is a single character. The following type codes are defined:\n\
1488\n\
1489 Type code C Type Minimum size in bytes \n\
1490 'c' character 1 \n\
1491 'b' signed integer 1 \n\
1492 'B' unsigned integer 1 \n\
1493 'h' signed integer 2 \n\
1494 'H' unsigned integer 2 \n\
1495 'i' signed integer 2 \n\
1496 'I' unsigned integer 2 \n\
1497 'l' signed integer 4 \n\
1498 'L' unsigned integer 4 \n\
1499 'f' floating point 4 \n\
1500 'd' floating point 8 \n\
1501\n\
1502Functions:\n\
1503\n\
1504array(typecode [, initializer]) -- create a new array\n\
1505\n\
1506Special Objects:\n\
1507\n\
1508ArrayType -- type object for array objects\n\
1509";
1510
1511static char arraytype_doc [] =
1512"An array represents basic values and behave very much like lists, except\n\
1513the type of objects stored in them is constrained.\n\
1514\n\
1515Methods:\n\
1516\n\
1517append() -- append a new item to the end of the array\n\
1518buffer_info() -- return information giving the current memory info\n\
1519byteswap() -- byteswap all the items of the array\n\
1520fromfile() -- read items from a file object\n\
1521fromlist() -- append items from the list\n\
1522fromstring() -- append items from the string\n\
1523insert() -- insert a new item into the array at a provided position\n\
1524read() -- DEPRECATED, use fromfile()\n\
1525reverse() -- reverse the order of the items in the array\n\
1526tofile() -- write all items to a file object\n\
1527tolist() -- return the array converted to an ordinary list\n\
1528tostring() -- return the array converted to a string\n\
1529write() -- DEPRECATED, use tofile()\n\
1530\n\
1531Variables:\n\
1532\n\
1533typecode -- the typecode character used to create the array\n\
1534itemsize -- the length in bytes of one array item\n\
1535";
1536
1537statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001538 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001539 0,
1540 "array",
1541 sizeof(arrayobject),
1542 0,
1543 (destructor)array_dealloc, /*tp_dealloc*/
1544 (printfunc)array_print, /*tp_print*/
1545 (getattrfunc)array_getattr, /*tp_getattr*/
1546 0, /*tp_setattr*/
1547 (cmpfunc)array_compare, /*tp_compare*/
1548 (reprfunc)array_repr, /*tp_repr*/
1549 0, /*tp_as_number*/
1550 &array_as_sequence, /*tp_as_sequence*/
1551 0, /*tp_as_mapping*/
1552 0, /*tp_hash*/
1553 0, /*tp_call*/
1554 0, /*tp_str*/
1555 0, /*tp_getattro*/
1556 0, /*tp_setattro*/
1557 &array_as_buffer, /*tp_as_buffer*/
1558 0, /*tp_xxx4*/
1559 arraytype_doc, /*tp_doc*/
1560};
1561
Guido van Rossum3886bb61998-12-04 18:50:17 +00001562DL_EXPORT(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001563initarray()
1564{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001565 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001566
1567 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001568 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001569 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001570 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1571 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001572}