blob: 7966e0a7874f3515cb508b492007055b27b3971a [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{
117 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000118 if (!PyArg_Parse(v, "b;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000119 return -1;
120 if (i >= 0)
121 ((char *)ap->ob_item)[i] = x;
122 return 0;
123}
124
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000125static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000126BB_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000127 arrayobject *ap;
128 int i;
129{
130 long x = ((unsigned char *)ap->ob_item)[i];
131 return PyInt_FromLong(x);
132}
133
Guido van Rossum1a747f81997-05-16 16:21:38 +0000134#define BB_setitem b_setitem
Guido van Rossum549ab711997-01-03 19:09:47 +0000135
136static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000137h_getitem(ap, i)
138 arrayobject *ap;
139 int i;
140{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000141 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000142}
143
144static int
145h_setitem(ap, i, v)
146 arrayobject *ap;
147 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000148 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000149{
150 short x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000151 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000152 return -1;
153 if (i >= 0)
154 ((short *)ap->ob_item)[i] = x;
155 return 0;
156}
157
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000158static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000159HH_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000160 arrayobject *ap;
161 int i;
162{
163 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
164}
165
Guido van Rossum1a747f81997-05-16 16:21:38 +0000166#define HH_setitem h_setitem
Guido van Rossum549ab711997-01-03 19:09:47 +0000167
168static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000169i_getitem(ap, i)
170 arrayobject *ap;
171 int i;
172{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000173 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000174}
175
176static int
177i_setitem(ap, i, v)
178 arrayobject *ap;
179 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000180 PyObject *v;
Guido van Rossume77a7571993-11-03 15:01:26 +0000181{
182 int x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000183 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000184 return -1;
185 if (i >= 0)
186 ((int *)ap->ob_item)[i] = x;
187 return 0;
188}
189
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000190static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000191II_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000192 arrayobject *ap;
193 int i;
194{
195 return PyLong_FromUnsignedLong(
196 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
197}
198
199static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000200II_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000201 arrayobject *ap;
202 int i;
203 PyObject *v;
204{
205 unsigned long x;
206 if (PyLong_Check(v)) {
207 x = PyLong_AsUnsignedLong(v);
208 if (x == (unsigned long) -1 && PyErr_Occurred())
209 return -1;
210 }
211 else {
212 if (!PyArg_Parse(v, "l;array item must be integer", &x))
213 return -1;
214 }
215 if (i >= 0)
216 ((unsigned int *)ap->ob_item)[i] = x;
217 return 0;
218}
219
220static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000221l_getitem(ap, i)
222 arrayobject *ap;
223 int i;
224{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000225 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000226}
227
228static int
229l_setitem(ap, i, v)
230 arrayobject *ap;
231 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000232 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000233{
234 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000235 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000236 return -1;
237 if (i >= 0)
238 ((long *)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 +0000243LL_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000244 arrayobject *ap;
245 int i;
246{
247 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
248}
249
250static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000251LL_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000252 arrayobject *ap;
253 int i;
254 PyObject *v;
255{
256 unsigned long x;
257 if (PyLong_Check(v)) {
258 x = PyLong_AsUnsignedLong(v);
259 if (x == (unsigned long) -1 && PyErr_Occurred())
260 return -1;
261 }
262 else {
263 if (!PyArg_Parse(v, "l;array item must be integer", &x))
264 return -1;
265 }
266 if (i >= 0)
267 ((unsigned long *)ap->ob_item)[i] = x;
268 return 0;
269}
270
271static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000272f_getitem(ap, i)
273 arrayobject *ap;
274 int i;
275{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000276 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000277}
278
279static int
280f_setitem(ap, i, v)
281 arrayobject *ap;
282 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000283 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000284{
285 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000286 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000287 return -1;
288 if (i >= 0)
289 ((float *)ap->ob_item)[i] = x;
290 return 0;
291}
292
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000293static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000294d_getitem(ap, i)
295 arrayobject *ap;
296 int i;
297{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000298 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000299}
300
301static int
302d_setitem(ap, i, v)
303 arrayobject *ap;
304 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000305 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000306{
307 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000308 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000309 return -1;
310 if (i >= 0)
311 ((double *)ap->ob_item)[i] = x;
312 return 0;
313}
314
315/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000316static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000317 {'c', sizeof(char), c_getitem, c_setitem},
318 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000319 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000320 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000321 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000322 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000323 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000324 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000325 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000326 {'f', sizeof(float), f_getitem, f_setitem},
327 {'d', sizeof(double), d_getitem, d_setitem},
328 {'\0', 0, 0, 0} /* Sentinel */
329};
Guido van Rossume77a7571993-11-03 15:01:26 +0000330/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000331
332
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000333static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000334newarrayobject(size, descr)
335 int size;
336 struct arraydescr *descr;
337{
Guido van Rossum778983b1993-02-19 15:55:02 +0000338 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000339 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000340 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000341 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000342 return NULL;
343 }
344 nbytes = size * descr->itemsize;
345 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000346 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000347 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000348 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000349 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000350 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000351 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000352 }
353 if (size <= 0) {
354 op->ob_item = NULL;
355 }
356 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000357 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000358 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000359 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000360 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000361 }
362 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000363 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000364 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000365}
366
Guido van Rossuma376cc51996-12-05 23:43:35 +0000367#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000368static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000369getarraysize(op)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000370 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000371{
372 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000373 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000374 return -1;
375 }
376 return ((arrayobject *)op) -> ob_size;
377}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000378#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000379
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000380static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000381getarrayitem(op, i)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000382 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000383 int i;
384{
385 register arrayobject *ap;
386 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000387 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000388 return NULL;
389 }
390 ap = (arrayobject *)op;
391 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000392 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000393 return NULL;
394 }
395 return (*ap->ob_descr->getitem)(ap, i);
396}
397
398static int
399ins1(self, where, v)
400 arrayobject *self;
401 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000402 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000403{
Guido van Rossum778983b1993-02-19 15:55:02 +0000404 char *items;
405 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000406 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000407 return -1;
408 }
409 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
410 return -1;
411 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000412 PyMem_RESIZE(items, char,
413 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000414 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000415 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000416 return -1;
417 }
418 if (where < 0)
419 where = 0;
420 if (where > self->ob_size)
421 where = self->ob_size;
422 memmove(items + (where+1)*self->ob_descr->itemsize,
423 items + where*self->ob_descr->itemsize,
424 (self->ob_size-where)*self->ob_descr->itemsize);
425 self->ob_item = items;
426 self->ob_size++;
427 return (*self->ob_descr->setitem)(self, where, v);
428}
429
Guido van Rossuma376cc51996-12-05 23:43:35 +0000430#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000431static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000432insarrayitem(op, where, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000433 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000434 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000435 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000436{
437 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000438 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000439 return -1;
440 }
441 return ins1((arrayobject *)op, where, newitem);
442}
443
Guido van Rossum62de97f1995-01-22 00:48:41 +0000444static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000445addarrayitem(op, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 PyObject *op;
447 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000448{
449 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000450 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000451 return -1;
452 }
453 return ins1((arrayobject *)op,
454 (int) ((arrayobject *)op)->ob_size, newitem);
455}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000456#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000457
458/* Methods */
459
460static void
461array_dealloc(op)
462 arrayobject *op;
463{
Guido van Rossum778983b1993-02-19 15:55:02 +0000464 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000465 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000466 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000467}
468
469static int
470array_compare(v, w)
471 arrayobject *v, *w;
472{
473 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
474 int i;
475 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000476 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000477 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000478 ai = getarrayitem((PyObject *)v, i);
479 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000480 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000481 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000482 else
483 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000484 Py_XDECREF(ai);
485 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000486 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000487 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000488 }
489 return v->ob_size - w->ob_size;
490}
491
492static int
493array_length(a)
494 arrayobject *a;
495{
496 return a->ob_size;
497}
498
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000499static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000500array_item(a, i)
501 arrayobject *a;
502 int i;
503{
504 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000505 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000506 return NULL;
507 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000508 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000509}
510
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000511static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000512array_slice(a, ilow, ihigh)
513 arrayobject *a;
514 int ilow, ihigh;
515{
516 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000517 if (ilow < 0)
518 ilow = 0;
519 else if (ilow > a->ob_size)
520 ilow = a->ob_size;
521 if (ihigh < 0)
522 ihigh = 0;
523 if (ihigh < ilow)
524 ihigh = ilow;
525 else if (ihigh > a->ob_size)
526 ihigh = a->ob_size;
527 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
528 if (np == NULL)
529 return NULL;
530 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
531 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000532 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000533}
534
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000535static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000536array_concat(a, bb)
537 arrayobject *a;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000538 PyObject *bb;
Guido van Rossum778983b1993-02-19 15:55:02 +0000539{
540 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000541 arrayobject *np;
542 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000543 PyErr_Format(PyExc_TypeError,
544 "can only append array (not \"%.200s\") to array",
545 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000546 return NULL;
547 }
548#define b ((arrayobject *)bb)
549 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000550 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000551 return NULL;
552 }
553 size = a->ob_size + b->ob_size;
554 np = (arrayobject *) newarrayobject(size, a->ob_descr);
555 if (np == NULL) {
556 return NULL;
557 }
558 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
559 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000560 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000561 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000562#undef b
563}
564
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000565static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000566array_repeat(a, n)
567 arrayobject *a;
568 int n;
569{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000570 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000571 int size;
572 arrayobject *np;
573 char *p;
574 int nbytes;
575 if (n < 0)
576 n = 0;
577 size = a->ob_size * n;
578 np = (arrayobject *) newarrayobject(size, a->ob_descr);
579 if (np == NULL)
580 return NULL;
581 p = np->ob_item;
582 nbytes = a->ob_size * a->ob_descr->itemsize;
583 for (i = 0; i < n; i++) {
584 memcpy(p, a->ob_item, nbytes);
585 p += nbytes;
586 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000587 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000588}
589
590static int
591array_ass_slice(a, ilow, ihigh, v)
592 arrayobject *a;
593 int ilow, ihigh;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000594 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000595{
596 char *item;
597 int n; /* Size of replacement array */
598 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000599#define b ((arrayobject *)v)
600 if (v == NULL)
601 n = 0;
602 else if (is_arrayobject(v)) {
603 n = b->ob_size;
604 if (a == b) {
605 /* Special case "a[i:j] = a" -- copy b first */
606 int ret;
607 v = array_slice(b, 0, n);
608 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000609 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 return ret;
611 }
612 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000613 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000614 return -1;
615 }
616 }
617 else {
Fred Drake137507e2000-06-01 02:02:46 +0000618 PyErr_Format(PyExc_TypeError,
619 "can only assign array (not \"%.200s\") to array slice",
620 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000621 return -1;
622 }
623 if (ilow < 0)
624 ilow = 0;
625 else if (ilow > a->ob_size)
626 ilow = a->ob_size;
627 if (ihigh < 0)
628 ihigh = 0;
629 if (ihigh < ilow)
630 ihigh = ilow;
631 else if (ihigh > a->ob_size)
632 ihigh = a->ob_size;
633 item = a->ob_item;
634 d = n - (ihigh-ilow);
635 if (d < 0) { /* Delete -d items */
636 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
637 item + ihigh*a->ob_descr->itemsize,
638 (a->ob_size-ihigh)*a->ob_descr->itemsize);
639 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000640 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000641 /* Can't fail */
642 a->ob_item = item;
643 }
644 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000645 PyMem_RESIZE(item, char,
646 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000647 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000648 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000649 return -1;
650 }
651 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
652 item + ihigh*a->ob_descr->itemsize,
653 (a->ob_size-ihigh)*a->ob_descr->itemsize);
654 a->ob_item = item;
655 a->ob_size += d;
656 }
657 if (n > 0)
658 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
659 n*b->ob_descr->itemsize);
660 return 0;
661#undef b
662}
663
664static int
665array_ass_item(a, i, v)
666 arrayobject *a;
667 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000668 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000669{
670 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000671 PyErr_SetString(PyExc_IndexError,
672 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000673 return -1;
674 }
675 if (v == NULL)
676 return array_ass_slice(a, i, i+1, v);
677 return (*a->ob_descr->setitem)(a, i, v);
678}
679
680static int
681setarrayitem(a, i, v)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000682 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +0000683 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000684 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000685{
686 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000687 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000688 return -1;
689 }
690 return array_ass_item((arrayobject *)a, i, v);
691}
692
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000693static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000694ins(self, where, v)
695 arrayobject *self;
696 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000697 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000698{
699 if (ins1(self, where, v) != 0)
700 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000701 Py_INCREF(Py_None);
702 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000703}
704
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000705static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000706array_insert(self, args)
707 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000708 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000709{
710 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000711 PyObject *v;
712 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000713 return NULL;
714 return ins(self, i, v);
715}
716
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000717static char insert_doc [] =
718"insert (i,x)\n\
719\n\
720Insert a new item x into the array before position i.";
721
722
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000723static PyObject *
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000724array_buffer_info(self, args)
725 arrayobject *self;
726 PyObject *args;
727{
728 return Py_BuildValue("ll",
729 (long)(self->ob_item), (long)(self->ob_size));
730}
731
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000732static char buffer_info_doc [] =
733"buffer_info -> (address, length)\n\
734\n\
735Return a tuple (address, length) giving the current memory address and\n\
736the length in bytes of the buffer used to hold array's contents.";
737
738
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000739static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000740array_append(self, args)
741 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000742 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000743{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000744 PyObject *v;
745 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000746 return NULL;
747 return ins(self, (int) self->ob_size, v);
748}
749
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000750static char append_doc [] =
751"append(x)\n\
752\n\
753Append new value x to the end of the array.";
754
755
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000756static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000757array_byteswap(self, args)
758 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000759 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000760{
761 char *p;
762 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000763
764 if (!PyArg_ParseTuple(args, ":byteswap"))
765 return NULL;
766
Guido van Rossum778983b1993-02-19 15:55:02 +0000767 switch (self->ob_descr->itemsize) {
768 case 1:
769 break;
770 case 2:
771 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
772 char p0 = p[0];
773 p[0] = p[1];
774 p[1] = p0;
775 }
776 break;
777 case 4:
778 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
779 char p0 = p[0];
780 char p1 = p[1];
781 p[0] = p[3];
782 p[1] = p[2];
783 p[2] = p1;
784 p[3] = p0;
785 }
786 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000787 case 8:
788 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
789 char p0 = p[0];
790 char p1 = p[1];
791 char p2 = p[2];
792 char p3 = p[3];
793 p[0] = p[7];
794 p[1] = p[6];
795 p[2] = p[5];
796 p[3] = p[4];
797 p[4] = p3;
798 p[5] = p2;
799 p[6] = p1;
800 p[7] = p0;
801 }
802 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000803 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000804 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000805 "don't know how to byteswap this array type");
806 return NULL;
807 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000808 Py_INCREF(Py_None);
809 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000810}
811
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000812static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000813"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000814\n\
Fred Drakebf272981999-12-03 17:15:30 +0000815Byteswap all items of the array. If the items in the array are not 1, 2,\n\
8164, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000817
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000818static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000819array_reverse(self, args)
820 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000821 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000822{
Guido van Rossume77a7571993-11-03 15:01:26 +0000823 register int itemsize = self->ob_descr->itemsize;
824 register char *p, *q;
825 char tmp[sizeof(double)]; /* Assume that's the max item size */
826
Guido van Rossum778983b1993-02-19 15:55:02 +0000827 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000828 PyErr_SetString(PyExc_TypeError,
829 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000830 return NULL;
831 }
832
833 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000834 for (p = self->ob_item,
835 q = self->ob_item + (self->ob_size - 1)*itemsize;
836 p < q;
837 p += itemsize, q -= itemsize) {
838 memmove(tmp, p, itemsize);
839 memmove(p, q, itemsize);
840 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000841 }
842 }
843
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000844 Py_INCREF(Py_None);
845 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000846}
Guido van Rossume77a7571993-11-03 15:01:26 +0000847
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000848static char reverse_doc [] =
849"reverse()\n\
850\n\
851Reverse the order of the items in the array.";
852
Guido van Rossume77a7571993-11-03 15:01:26 +0000853/* The following routines were adapted from listobject.c but not converted.
854 To make them work you will have to work! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000855
856#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000857static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000858array_index(self, args)
859 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000860 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000861{
862 int i;
863
864 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000865 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000866 return NULL;
867 }
868 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000869 if (PyObject_Compare(self->ob_item[i], args) == 0)
870 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000871 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000872 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000873 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000874 return NULL;
875}
876#endif
877
878#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000879static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000880array_count(self, args)
881 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000883{
884 int count = 0;
885 int i;
886
887 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000888 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000889 return NULL;
890 }
891 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000892 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000893 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000894 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000895 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000896 return PyInt_FromLong((long)count);
Guido van Rossum778983b1993-02-19 15:55:02 +0000897}
898#endif
899
900#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000901static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000902array_remove(self, args)
903 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000904 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000905{
906 int i;
907
908 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000909 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000910 return NULL;
911 }
912 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000913 if (PyObject_Compare(self->ob_item[i], args) == 0) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000914 if (array_ass_slice(self, i, i+1,
915 (PyObject *)NULL) != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000916 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000917 Py_INCREF(Py_None);
918 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000919 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000920 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000921 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000922 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000923 return NULL;
924}
925#endif
926
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000927static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000928array_fromfile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000929 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000930 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000931{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000932 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000933 int n;
934 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000935 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000936 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000937 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000938 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000939 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000940 return NULL;
941 }
942 if (n > 0) {
943 char *item = self->ob_item;
944 int itemsize = self->ob_descr->itemsize;
945 int nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000946 int newlength;
947 size_t newbytes;
948 /* Be careful here about overflow */
949 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +0000950 (newbytes = newlength * itemsize) / itemsize !=
951 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000952 goto nomem;
953 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000954 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +0000955 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000956 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000957 return NULL;
958 }
959 self->ob_item = item;
960 self->ob_size += n;
961 nread = fread(item + (self->ob_size - n) * itemsize,
962 itemsize, n, fp);
963 if (nread < n) {
964 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000965 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000966 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyErr_SetString(PyExc_EOFError,
968 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000969 return NULL;
970 }
971 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000972 Py_INCREF(Py_None);
973 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000974}
975
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000976static char fromfile_doc [] =
977"fromfile(f, n)\n\
978\n\
979Read n objects from the file object f and append them to the end of the\n\
980array. Also called as read.";
981
982
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000983static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000984array_tofile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000985 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000986 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000987{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000988 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000989 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000990 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +0000991 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000992 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000993 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000994 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000995 return NULL;
996 }
997 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +0000998 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +0000999 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001000 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 clearerr(fp);
1002 return NULL;
1003 }
1004 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001005 Py_INCREF(Py_None);
1006 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001007}
1008
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001009static char tofile_doc [] =
1010"tofile(f)\n\
1011\n\
1012Write all items (as machine values) to the file object f. Also called as\n\
1013write.";
1014
1015
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001017array_fromlist(self, args)
1018 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001019 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001020{
1021 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001022 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001023 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001024 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001025 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001026 if (!PyList_Check(list)) {
1027 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001028 return NULL;
1029 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001030 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001031 if (n > 0) {
1032 char *item = self->ob_item;
1033 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001034 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001037 return NULL;
1038 }
1039 self->ob_item = item;
1040 self->ob_size += n;
1041 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001042 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001043 if ((*self->ob_descr->setitem)(self,
1044 self->ob_size - n + i, v) != 0) {
1045 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001046 PyMem_RESIZE(item, char,
1047 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001048 self->ob_item = item;
1049 return NULL;
1050 }
1051 }
1052 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001053 Py_INCREF(Py_None);
1054 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001055}
1056
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001057static char fromlist_doc [] =
1058"fromlist(list)\n\
1059\n\
1060Append items to array from list.";
1061
1062
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001063static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001064array_tolist(self, args)
1065 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001066 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001067{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001068 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001069 int i;
1070 if (list == NULL)
1071 return NULL;
1072 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001073 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001074 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001075 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001076 return NULL;
1077 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001078 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001079 }
1080 return list;
1081}
1082
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001083static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001084"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001085\n\
1086Convert array to an ordinary list with the same items.";
1087
1088
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001089static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001090array_fromstring(self, args)
1091 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001092 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001093{
1094 char *str;
1095 int n;
1096 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001098 return NULL;
1099 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001100 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001101 "string length not a multiple of item size");
1102 return NULL;
1103 }
1104 n = n / itemsize;
1105 if (n > 0) {
1106 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001107 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001108 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001109 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001110 return NULL;
1111 }
1112 self->ob_item = item;
1113 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001114 memcpy(item + (self->ob_size - n) * itemsize,
1115 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001116 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001117 Py_INCREF(Py_None);
1118 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001119}
1120
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001121static char fromstring_doc [] =
1122"fromstring(string)\n\
1123\n\
1124Appends items from the string, interpreting it as an array of machine\n\
1125values,as if it had been read from a file using the fromfile() method).";
1126
1127
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001128static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001129array_tostring(self, args)
1130 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001131 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001132{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001133 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001134 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001135 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001136 self->ob_size * self->ob_descr->itemsize);
1137}
1138
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001139static char tostring_doc [] =
1140"tostring() -> string\n\
1141\n\
1142Convert the array to an array of machine values and return the string\n\
1143representation.";
1144
1145PyMethodDef array_methods[] = {
1146 {"append", (PyCFunction)array_append, 0, append_doc},
1147 {"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
Fred Drakebf272981999-12-03 17:15:30 +00001148 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1149 byteswap_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001150/* {"count", (method)array_count},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001151 {"fromfile", (PyCFunction)array_fromfile, 0, fromfile_doc},
1152 {"fromlist", (PyCFunction)array_fromlist, 0, fromlist_doc},
1153 {"fromstring", (PyCFunction)array_fromstring, 0, fromstring_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001154/* {"index", (method)array_index},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001155 {"insert", (PyCFunction)array_insert, 0, insert_doc},
1156 {"read", (PyCFunction)array_fromfile, 0, fromfile_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001157/* {"remove", (method)array_remove},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001158 {"reverse", (PyCFunction)array_reverse, 0, reverse_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001159/* {"sort", (method)array_sort},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001160 {"tofile", (PyCFunction)array_tofile, 0, tofile_doc},
1161 {"tolist", (PyCFunction)array_tolist, 0, tolist_doc},
1162 {"tostring", (PyCFunction)array_tostring, 0, tostring_doc},
1163 {"write", (PyCFunction)array_tofile, 0, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001164 {NULL, NULL} /* sentinel */
1165};
1166
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001168array_getattr(a, name)
1169 arrayobject *a;
1170 char *name;
1171{
1172 if (strcmp(name, "typecode") == 0) {
1173 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001174 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001175 }
1176 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001177 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001178 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001179 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001180 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001181 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001182 PyList_SetItem(list, 0,
1183 PyString_FromString("typecode"));
1184 PyList_SetItem(list, 1,
1185 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001186 if (PyErr_Occurred()) {
1187 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001188 list = NULL;
1189 }
1190 }
1191 return list;
1192 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001193 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001194}
1195
1196static int
1197array_print(a, fp, flags)
1198 arrayobject *a;
1199 FILE *fp;
1200 int flags;
1201{
1202 int ok = 0;
1203 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001204 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001205 len = a->ob_size;
1206 if (len == 0) {
1207 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1208 return ok;
1209 }
1210 if (a->ob_descr->typecode == 'c') {
1211 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001212 v = array_tostring(a, (PyObject *)NULL);
1213 ok = PyObject_Print(v, fp, 0);
1214 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001215 fprintf(fp, ")");
1216 return ok;
1217 }
1218 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1219 for (i = 0; i < len && ok == 0; i++) {
1220 if (i > 0)
1221 fprintf(fp, ", ");
1222 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001223 ok = PyObject_Print(v, fp, 0);
1224 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001225 }
1226 fprintf(fp, "])");
1227 return ok;
1228}
1229
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001230static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001231array_repr(a)
1232 arrayobject *a;
1233{
1234 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001235 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001236 int i, len;
1237 len = a->ob_size;
1238 if (len == 0) {
1239 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001240 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001241 }
1242 if (a->ob_descr->typecode == 'c') {
1243 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001244 s = PyString_FromString(buf);
1245 v = array_tostring(a, (PyObject *)NULL);
1246 t = PyObject_Repr(v);
1247 Py_XDECREF(v);
1248 PyString_ConcatAndDel(&s, t);
1249 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001250 return s;
1251 }
1252 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253 s = PyString_FromString(buf);
1254 comma = PyString_FromString(", ");
1255 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001256 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001257 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001258 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 t = PyObject_Repr(v);
1260 Py_XDECREF(v);
1261 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001262 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001263 Py_XDECREF(comma);
1264 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001265 return s;
1266}
1267
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001268static int
1269array_buffer_getreadbuf(self, index, ptr)
1270 arrayobject *self;
1271 int index;
1272 const void **ptr;
1273{
1274 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001275 PyErr_SetString(PyExc_SystemError,
1276 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001277 return -1;
1278 }
1279 *ptr = (void *)self->ob_item;
1280 return self->ob_size*self->ob_descr->itemsize;
1281}
1282
1283static int
1284array_buffer_getwritebuf(self, index, ptr)
1285 arrayobject *self;
1286 int index;
1287 const void **ptr;
1288{
1289 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001290 PyErr_SetString(PyExc_SystemError,
1291 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001292 return -1;
1293 }
1294 *ptr = (void *)self->ob_item;
1295 return self->ob_size*self->ob_descr->itemsize;
1296}
1297
1298static int
1299array_buffer_getsegcount(self, lenp)
1300 arrayobject *self;
1301 int *lenp;
1302{
1303 if ( lenp )
1304 *lenp = self->ob_size*self->ob_descr->itemsize;
1305 return 1;
1306}
1307
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001308static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001309 (inquiry)array_length, /*sq_length*/
1310 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001311 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001312 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001313 (intintargfunc)array_slice, /*sq_slice*/
1314 (intobjargproc)array_ass_item, /*sq_ass_item*/
1315 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001316};
1317
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001318static PyBufferProcs array_as_buffer = {
1319 (getreadbufferproc)array_buffer_getreadbuf,
1320 (getwritebufferproc)array_buffer_getwritebuf,
1321 (getsegcountproc)array_buffer_getsegcount,
1322};
1323
1324
Guido van Rossum778983b1993-02-19 15:55:02 +00001325
1326
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001327static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001328a_array(self, args)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001329 PyObject *self;
1330 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001331{
1332 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001333 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001334 struct arraydescr *descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001335 if (!PyArg_Parse(args, "c", &c)) {
1336 PyErr_Clear();
1337 if (!PyArg_Parse(args, "(cO)", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001338 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001339 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1340 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001341 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001342 return NULL;
1343 }
1344 }
1345 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1346 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001347 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001348 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001349 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001350 len = 0;
1351 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001352 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001353 a = newarrayobject(len, descr);
1354 if (a == NULL)
1355 return NULL;
1356 if (len > 0) {
1357 int i;
1358 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001359 PyObject *v =
1360 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001361 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001362 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001363 return NULL;
1364 }
1365 }
1366 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001367 if (initial != NULL && PyString_Check(initial)) {
1368 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001369 array_fromstring((arrayobject *)a, initial);
1370 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001371 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001372 return NULL;
1373 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001374 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001375 }
1376 return a;
1377 }
1378 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001379 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001380 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001381 return NULL;
1382}
1383
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001384static char a_array_doc [] =
1385"array(typecode [, initializer]) -> array\n\
1386\n\
1387Return a new array whose items are restricted by typecode, and\n\
1388initialized from the optional initializer value, which must be a list\n\
1389or a string.";
1390
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001391static PyMethodDef a_methods[] = {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001392 {"array", a_array, 0, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001393 {NULL, NULL} /* sentinel */
1394};
1395
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001396static char module_doc [] =
1397"This module defines a new object type which can efficiently represent\n\
1398an array of basic values: characters, integers, floating point\n\
1399numbers. Arrays are sequence types and behave very much like lists,\n\
1400except that the type of objects stored in them is constrained. The\n\
1401type is specified at object creation time by using a type code, which\n\
1402is a single character. The following type codes are defined:\n\
1403\n\
1404 Type code C Type Minimum size in bytes \n\
1405 'c' character 1 \n\
1406 'b' signed integer 1 \n\
1407 'B' unsigned integer 1 \n\
1408 'h' signed integer 2 \n\
1409 'H' unsigned integer 2 \n\
1410 'i' signed integer 2 \n\
1411 'I' unsigned integer 2 \n\
1412 'l' signed integer 4 \n\
1413 'L' unsigned integer 4 \n\
1414 'f' floating point 4 \n\
1415 'd' floating point 8 \n\
1416\n\
1417Functions:\n\
1418\n\
1419array(typecode [, initializer]) -- create a new array\n\
1420\n\
1421Special Objects:\n\
1422\n\
1423ArrayType -- type object for array objects\n\
1424";
1425
1426static char arraytype_doc [] =
1427"An array represents basic values and behave very much like lists, except\n\
1428the type of objects stored in them is constrained.\n\
1429\n\
1430Methods:\n\
1431\n\
1432append() -- append a new item to the end of the array\n\
1433buffer_info() -- return information giving the current memory info\n\
1434byteswap() -- byteswap all the items of the array\n\
1435fromfile() -- read items from a file object\n\
1436fromlist() -- append items from the list\n\
1437fromstring() -- append items from the string\n\
1438insert() -- insert a new item into the array at a provided position\n\
1439read() -- DEPRECATED, use fromfile()\n\
1440reverse() -- reverse the order of the items in the array\n\
1441tofile() -- write all items to a file object\n\
1442tolist() -- return the array converted to an ordinary list\n\
1443tostring() -- return the array converted to a string\n\
1444write() -- DEPRECATED, use tofile()\n\
1445\n\
1446Variables:\n\
1447\n\
1448typecode -- the typecode character used to create the array\n\
1449itemsize -- the length in bytes of one array item\n\
1450";
1451
1452statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001453 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001454 0,
1455 "array",
1456 sizeof(arrayobject),
1457 0,
1458 (destructor)array_dealloc, /*tp_dealloc*/
1459 (printfunc)array_print, /*tp_print*/
1460 (getattrfunc)array_getattr, /*tp_getattr*/
1461 0, /*tp_setattr*/
1462 (cmpfunc)array_compare, /*tp_compare*/
1463 (reprfunc)array_repr, /*tp_repr*/
1464 0, /*tp_as_number*/
1465 &array_as_sequence, /*tp_as_sequence*/
1466 0, /*tp_as_mapping*/
1467 0, /*tp_hash*/
1468 0, /*tp_call*/
1469 0, /*tp_str*/
1470 0, /*tp_getattro*/
1471 0, /*tp_setattro*/
1472 &array_as_buffer, /*tp_as_buffer*/
1473 0, /*tp_xxx4*/
1474 arraytype_doc, /*tp_doc*/
1475};
1476
Guido van Rossum3886bb61998-12-04 18:50:17 +00001477DL_EXPORT(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001478initarray()
1479{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001480 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001481
1482 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001483 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001484 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001485 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1486 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001487}