blob: debd59418f466b85c1fdf976b0b8fc873814e49a [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>
41#else
Guido van Rossumb6775db1994-08-01 11:34:53 +000042#include <sys/types.h> /* For size_t */
Guido van Rossum0c709541994-08-19 12:01:32 +000043#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000044
45struct arrayobject; /* Forward */
46
47struct arraydescr {
48 int typecode;
49 int itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000050 PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
51 int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *));
Guido van Rossum778983b1993-02-19 15:55:02 +000052};
53
54typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000055 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000056 char *ob_item;
57 struct arraydescr *ob_descr;
58} arrayobject;
59
Roger E. Masse2919eaa1996-12-09 20:10:36 +000060staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000061
62#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
63
Guido van Rossumb73cc041993-11-01 16:28:59 +000064/* Forward */
Roger E. Masse2919eaa1996-12-09 20:10:36 +000065static PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000066#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000067static int getarraysize Py_PROTO((PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000068#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +000069static PyObject *getarrayitem Py_PROTO((PyObject *, int));
70static int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000071#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000072static int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
73static int addarrayitem Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000074#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000075
Roger E. Masse2919eaa1996-12-09 20:10:36 +000076static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000077c_getitem(ap, i)
78 arrayobject *ap;
79 int i;
80{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000081 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000082}
83
84static int
85c_setitem(ap, i, v)
86 arrayobject *ap;
87 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000088 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000089{
90 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000091 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000092 return -1;
93 if (i >= 0)
94 ((char *)ap->ob_item)[i] = x;
95 return 0;
96}
97
Roger E. Masse2919eaa1996-12-09 20:10:36 +000098static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000099b_getitem(ap, i)
100 arrayobject *ap;
101 int i;
102{
103 long x = ((char *)ap->ob_item)[i];
104 if (x >= 128)
105 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000106 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000107}
108
109static int
110b_setitem(ap, i, v)
111 arrayobject *ap;
112 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000113 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000114{
115 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000116 if (!PyArg_Parse(v, "b;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000117 return -1;
118 if (i >= 0)
119 ((char *)ap->ob_item)[i] = x;
120 return 0;
121}
122
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000123static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000124BB_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000125 arrayobject *ap;
126 int i;
127{
128 long x = ((unsigned char *)ap->ob_item)[i];
129 return PyInt_FromLong(x);
130}
131
Guido van Rossum1a747f81997-05-16 16:21:38 +0000132#define BB_setitem b_setitem
Guido van Rossum549ab711997-01-03 19:09:47 +0000133
134static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000135h_getitem(ap, i)
136 arrayobject *ap;
137 int i;
138{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000139 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000140}
141
142static int
143h_setitem(ap, i, v)
144 arrayobject *ap;
145 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000146 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000147{
148 short x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000149 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000150 return -1;
151 if (i >= 0)
152 ((short *)ap->ob_item)[i] = x;
153 return 0;
154}
155
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000156static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000157HH_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000158 arrayobject *ap;
159 int i;
160{
161 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
162}
163
Guido van Rossum1a747f81997-05-16 16:21:38 +0000164#define HH_setitem h_setitem
Guido van Rossum549ab711997-01-03 19:09:47 +0000165
166static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000167i_getitem(ap, i)
168 arrayobject *ap;
169 int i;
170{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000171 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000172}
173
174static int
175i_setitem(ap, i, v)
176 arrayobject *ap;
177 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000178 PyObject *v;
Guido van Rossume77a7571993-11-03 15:01:26 +0000179{
180 int x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000181 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000182 return -1;
183 if (i >= 0)
184 ((int *)ap->ob_item)[i] = x;
185 return 0;
186}
187
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000188static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000189II_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000190 arrayobject *ap;
191 int i;
192{
193 return PyLong_FromUnsignedLong(
194 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
195}
196
197static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000198II_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000199 arrayobject *ap;
200 int i;
201 PyObject *v;
202{
203 unsigned long x;
204 if (PyLong_Check(v)) {
205 x = PyLong_AsUnsignedLong(v);
206 if (x == (unsigned long) -1 && PyErr_Occurred())
207 return -1;
208 }
209 else {
210 if (!PyArg_Parse(v, "l;array item must be integer", &x))
211 return -1;
212 }
213 if (i >= 0)
214 ((unsigned int *)ap->ob_item)[i] = x;
215 return 0;
216}
217
218static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000219l_getitem(ap, i)
220 arrayobject *ap;
221 int i;
222{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000223 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000224}
225
226static int
227l_setitem(ap, i, v)
228 arrayobject *ap;
229 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000230 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000231{
232 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000233 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000234 return -1;
235 if (i >= 0)
236 ((long *)ap->ob_item)[i] = x;
237 return 0;
238}
239
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000240static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000241LL_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000242 arrayobject *ap;
243 int i;
244{
245 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
246}
247
248static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000249LL_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000250 arrayobject *ap;
251 int i;
252 PyObject *v;
253{
254 unsigned long x;
255 if (PyLong_Check(v)) {
256 x = PyLong_AsUnsignedLong(v);
257 if (x == (unsigned long) -1 && PyErr_Occurred())
258 return -1;
259 }
260 else {
261 if (!PyArg_Parse(v, "l;array item must be integer", &x))
262 return -1;
263 }
264 if (i >= 0)
265 ((unsigned long *)ap->ob_item)[i] = x;
266 return 0;
267}
268
269static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000270f_getitem(ap, i)
271 arrayobject *ap;
272 int i;
273{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000274 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000275}
276
277static int
278f_setitem(ap, i, v)
279 arrayobject *ap;
280 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000281 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000282{
283 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000284 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000285 return -1;
286 if (i >= 0)
287 ((float *)ap->ob_item)[i] = x;
288 return 0;
289}
290
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000291static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000292d_getitem(ap, i)
293 arrayobject *ap;
294 int i;
295{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000296 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000297}
298
299static int
300d_setitem(ap, i, v)
301 arrayobject *ap;
302 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000303 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000304{
305 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000307 return -1;
308 if (i >= 0)
309 ((double *)ap->ob_item)[i] = x;
310 return 0;
311}
312
313/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000314static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000315 {'c', sizeof(char), c_getitem, c_setitem},
316 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000317 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000318 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000319 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000320 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000321 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000322 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000323 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000324 {'f', sizeof(float), f_getitem, f_setitem},
325 {'d', sizeof(double), d_getitem, d_setitem},
326 {'\0', 0, 0, 0} /* Sentinel */
327};
Guido van Rossume77a7571993-11-03 15:01:26 +0000328/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000329
330
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000331static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000332newarrayobject(size, descr)
333 int size;
334 struct arraydescr *descr;
335{
Guido van Rossum778983b1993-02-19 15:55:02 +0000336 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000337 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000338 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000339 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000340 return NULL;
341 }
342 nbytes = size * descr->itemsize;
343 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000344 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000345 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000346 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000347 op = PyMem_NEW(arrayobject, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000348 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000349 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000350 }
351 if (size <= 0) {
352 op->ob_item = NULL;
353 }
354 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000355 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000356 if (op->ob_item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000357 PyMem_DEL(op);
358 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000359 }
360 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000361 op->ob_type = &Arraytype;
362 op->ob_size = size;
363 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000364 _Py_NewReference(op);
365 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000366}
367
Guido van Rossuma376cc51996-12-05 23:43:35 +0000368#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000369static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000370getarraysize(op)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000371 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000372{
373 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000374 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000375 return -1;
376 }
377 return ((arrayobject *)op) -> ob_size;
378}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000379#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000380
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000381static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000382getarrayitem(op, i)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000383 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000384 int i;
385{
386 register arrayobject *ap;
387 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000388 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000389 return NULL;
390 }
391 ap = (arrayobject *)op;
392 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000393 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 return NULL;
395 }
396 return (*ap->ob_descr->getitem)(ap, i);
397}
398
399static int
400ins1(self, where, v)
401 arrayobject *self;
402 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000403 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000404{
Guido van Rossum778983b1993-02-19 15:55:02 +0000405 char *items;
406 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000407 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000408 return -1;
409 }
410 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
411 return -1;
412 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000413 PyMem_RESIZE(items, char,
414 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000416 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 return -1;
418 }
419 if (where < 0)
420 where = 0;
421 if (where > self->ob_size)
422 where = self->ob_size;
423 memmove(items + (where+1)*self->ob_descr->itemsize,
424 items + where*self->ob_descr->itemsize,
425 (self->ob_size-where)*self->ob_descr->itemsize);
426 self->ob_item = items;
427 self->ob_size++;
428 return (*self->ob_descr->setitem)(self, where, v);
429}
430
Guido van Rossuma376cc51996-12-05 23:43:35 +0000431#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000432static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000433insarrayitem(op, where, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000434 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000436 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000437{
438 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000440 return -1;
441 }
442 return ins1((arrayobject *)op, where, newitem);
443}
444
Guido van Rossum62de97f1995-01-22 00:48:41 +0000445static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000446addarrayitem(op, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000447 PyObject *op;
448 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000449{
450 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000451 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000452 return -1;
453 }
454 return ins1((arrayobject *)op,
455 (int) ((arrayobject *)op)->ob_size, newitem);
456}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000457#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000458
459/* Methods */
460
461static void
462array_dealloc(op)
463 arrayobject *op;
464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000466 PyMem_DEL(op->ob_item);
467 PyMem_DEL(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000468}
469
470static int
471array_compare(v, w)
472 arrayobject *v, *w;
473{
474 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
475 int i;
476 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000477 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000478 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000479 ai = getarrayitem((PyObject *)v, i);
480 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000481 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000482 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000483 else
484 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000485 Py_XDECREF(ai);
486 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000487 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000488 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 }
490 return v->ob_size - w->ob_size;
491}
492
493static int
494array_length(a)
495 arrayobject *a;
496{
497 return a->ob_size;
498}
499
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000500static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000501array_item(a, i)
502 arrayobject *a;
503 int i;
504{
505 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000506 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000507 return NULL;
508 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000509 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000510}
511
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000512static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000513array_slice(a, ilow, ihigh)
514 arrayobject *a;
515 int ilow, ihigh;
516{
517 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000518 if (ilow < 0)
519 ilow = 0;
520 else if (ilow > a->ob_size)
521 ilow = a->ob_size;
522 if (ihigh < 0)
523 ihigh = 0;
524 if (ihigh < ilow)
525 ihigh = ilow;
526 else if (ihigh > a->ob_size)
527 ihigh = a->ob_size;
528 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
529 if (np == NULL)
530 return NULL;
531 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
532 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000533 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000534}
535
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000536static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000537array_concat(a, bb)
538 arrayobject *a;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000539 PyObject *bb;
Guido van Rossum778983b1993-02-19 15:55:02 +0000540{
541 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000542 arrayobject *np;
543 if (!is_arrayobject(bb)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000544 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000545 return NULL;
546 }
547#define b ((arrayobject *)bb)
548 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000549 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000550 return NULL;
551 }
552 size = a->ob_size + b->ob_size;
553 np = (arrayobject *) newarrayobject(size, a->ob_descr);
554 if (np == NULL) {
555 return NULL;
556 }
557 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
558 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000559 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000560 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000561#undef b
562}
563
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000564static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000565array_repeat(a, n)
566 arrayobject *a;
567 int n;
568{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000569 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000570 int size;
571 arrayobject *np;
572 char *p;
573 int nbytes;
574 if (n < 0)
575 n = 0;
576 size = a->ob_size * n;
577 np = (arrayobject *) newarrayobject(size, a->ob_descr);
578 if (np == NULL)
579 return NULL;
580 p = np->ob_item;
581 nbytes = a->ob_size * a->ob_descr->itemsize;
582 for (i = 0; i < n; i++) {
583 memcpy(p, a->ob_item, nbytes);
584 p += nbytes;
585 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000586 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000587}
588
589static int
590array_ass_slice(a, ilow, ihigh, v)
591 arrayobject *a;
592 int ilow, ihigh;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000593 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000594{
595 char *item;
596 int n; /* Size of replacement array */
597 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000598#define b ((arrayobject *)v)
599 if (v == NULL)
600 n = 0;
601 else if (is_arrayobject(v)) {
602 n = b->ob_size;
603 if (a == b) {
604 /* Special case "a[i:j] = a" -- copy b first */
605 int ret;
606 v = array_slice(b, 0, n);
607 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000608 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000609 return ret;
610 }
611 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000612 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000613 return -1;
614 }
615 }
616 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000617 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000618 return -1;
619 }
620 if (ilow < 0)
621 ilow = 0;
622 else if (ilow > a->ob_size)
623 ilow = a->ob_size;
624 if (ihigh < 0)
625 ihigh = 0;
626 if (ihigh < ilow)
627 ihigh = ilow;
628 else if (ihigh > a->ob_size)
629 ihigh = a->ob_size;
630 item = a->ob_item;
631 d = n - (ihigh-ilow);
632 if (d < 0) { /* Delete -d items */
633 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
634 item + ihigh*a->ob_descr->itemsize,
635 (a->ob_size-ihigh)*a->ob_descr->itemsize);
636 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000637 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000638 /* Can't fail */
639 a->ob_item = item;
640 }
641 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000642 PyMem_RESIZE(item, char,
643 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000644 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000645 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000646 return -1;
647 }
648 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
649 item + ihigh*a->ob_descr->itemsize,
650 (a->ob_size-ihigh)*a->ob_descr->itemsize);
651 a->ob_item = item;
652 a->ob_size += d;
653 }
654 if (n > 0)
655 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
656 n*b->ob_descr->itemsize);
657 return 0;
658#undef b
659}
660
661static int
662array_ass_item(a, i, v)
663 arrayobject *a;
664 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000665 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000666{
667 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000668 PyErr_SetString(PyExc_IndexError,
669 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000670 return -1;
671 }
672 if (v == NULL)
673 return array_ass_slice(a, i, i+1, v);
674 return (*a->ob_descr->setitem)(a, i, v);
675}
676
677static int
678setarrayitem(a, i, v)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000679 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +0000680 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000681 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000682{
683 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000684 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000685 return -1;
686 }
687 return array_ass_item((arrayobject *)a, i, v);
688}
689
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000690static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000691ins(self, where, v)
692 arrayobject *self;
693 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000694 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000695{
696 if (ins1(self, where, v) != 0)
697 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000698 Py_INCREF(Py_None);
699 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000700}
701
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000702static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000703array_insert(self, args)
704 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000705 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000706{
707 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000708 PyObject *v;
709 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000710 return NULL;
711 return ins(self, i, v);
712}
713
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000714static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000715array_append(self, args)
716 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000717 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000718{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000719 PyObject *v;
720 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000721 return NULL;
722 return ins(self, (int) self->ob_size, v);
723}
724
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000725static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000726array_byteswap(self, args)
727 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000728 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000729{
730 char *p;
731 int i;
732 switch (self->ob_descr->itemsize) {
733 case 1:
734 break;
735 case 2:
736 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
737 char p0 = p[0];
738 p[0] = p[1];
739 p[1] = p0;
740 }
741 break;
742 case 4:
743 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
744 char p0 = p[0];
745 char p1 = p[1];
746 p[0] = p[3];
747 p[1] = p[2];
748 p[2] = p1;
749 p[3] = p0;
750 }
751 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000752 case 8:
753 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
754 char p0 = p[0];
755 char p1 = p[1];
756 char p2 = p[2];
757 char p3 = p[3];
758 p[0] = p[7];
759 p[1] = p[6];
760 p[2] = p[5];
761 p[3] = p[4];
762 p[4] = p3;
763 p[5] = p2;
764 p[6] = p1;
765 p[7] = p0;
766 }
767 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000768 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000769 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000770 "don't know how to byteswap this array type");
771 return NULL;
772 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000773 Py_INCREF(Py_None);
774 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000775}
776
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000777static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000778array_reverse(self, args)
779 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000780 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000781{
Guido van Rossume77a7571993-11-03 15:01:26 +0000782 register int itemsize = self->ob_descr->itemsize;
783 register char *p, *q;
784 char tmp[sizeof(double)]; /* Assume that's the max item size */
785
Guido van Rossum778983b1993-02-19 15:55:02 +0000786 if (args != NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000787 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 return NULL;
789 }
790
791 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000792 for (p = self->ob_item,
793 q = self->ob_item + (self->ob_size - 1)*itemsize;
794 p < q;
795 p += itemsize, q -= itemsize) {
796 memmove(tmp, p, itemsize);
797 memmove(p, q, itemsize);
798 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000799 }
800 }
801
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000802 Py_INCREF(Py_None);
803 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000804}
Guido van Rossume77a7571993-11-03 15:01:26 +0000805
806/* The following routines were adapted from listobject.c but not converted.
807 To make them work you will have to work! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000808
809#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000810static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000811array_index(self, args)
812 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000813 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000814{
815 int i;
816
817 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000818 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000819 return NULL;
820 }
821 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000822 if (PyObject_Compare(self->ob_item[i], args) == 0)
823 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000824 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000825 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000826 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000827 return NULL;
828}
829#endif
830
831#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000832static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000833array_count(self, args)
834 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000835 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000836{
837 int count = 0;
838 int i;
839
840 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000841 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000842 return NULL;
843 }
844 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000845 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000846 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000847 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000848 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000849 return PyInt_FromLong((long)count);
Guido van Rossum778983b1993-02-19 15:55:02 +0000850}
851#endif
852
853#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000854static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000855array_remove(self, args)
856 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000857 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000858{
859 int i;
860
861 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000862 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000863 return NULL;
864 }
865 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000866 if (PyObject_Compare(self->ob_item[i], args) == 0) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000867 if (array_ass_slice(self, i, i+1,
868 (PyObject *)NULL) != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000869 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000870 Py_INCREF(Py_None);
871 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000872 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000873 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000874 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000875 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000876 return NULL;
877}
878#endif
879
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000880static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000881array_fromfile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000882 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000883 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000884{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000885 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000886 int n;
887 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000888 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000889 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000890 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000891 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000892 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000893 return NULL;
894 }
895 if (n > 0) {
896 char *item = self->ob_item;
897 int itemsize = self->ob_descr->itemsize;
898 int nread;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000899 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000900 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000901 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000902 return NULL;
903 }
904 self->ob_item = item;
905 self->ob_size += n;
906 nread = fread(item + (self->ob_size - n) * itemsize,
907 itemsize, n, fp);
908 if (nread < n) {
909 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000910 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000911 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000912 PyErr_SetString(PyExc_EOFError,
913 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000914 return NULL;
915 }
916 }
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}
920
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000921static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000922array_tofile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000923 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000924 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000925{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000926 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000927 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000928 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +0000929 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000930 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000931 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000932 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000933 return NULL;
934 }
935 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +0000936 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +0000937 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000938 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +0000939 clearerr(fp);
940 return NULL;
941 }
942 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000943 Py_INCREF(Py_None);
944 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000945}
946
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000947static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000948array_fromlist(self, args)
949 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000950 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000951{
952 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000953 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +0000954 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000955 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +0000956 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000957 if (!PyList_Check(list)) {
958 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +0000959 return NULL;
960 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000961 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +0000962 if (n > 0) {
963 char *item = self->ob_item;
964 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000965 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000966 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000968 return NULL;
969 }
970 self->ob_item = item;
971 self->ob_size += n;
972 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000973 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000974 if ((*self->ob_descr->setitem)(self,
975 self->ob_size - n + i, v) != 0) {
976 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000977 PyMem_RESIZE(item, char,
978 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000979 self->ob_item = item;
980 return NULL;
981 }
982 }
983 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000984 Py_INCREF(Py_None);
985 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000986}
987
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000988static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000989array_tolist(self, args)
990 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000991 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000992{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000993 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000994 int i;
995 if (list == NULL)
996 return NULL;
997 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000998 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000999 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001000 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 return NULL;
1002 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001003 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001004 }
1005 return list;
1006}
1007
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001008static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001009array_fromstring(self, args)
1010 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001011 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001012{
1013 char *str;
1014 int n;
1015 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001017 return NULL;
1018 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001019 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001020 "string length not a multiple of item size");
1021 return NULL;
1022 }
1023 n = n / itemsize;
1024 if (n > 0) {
1025 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001026 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001027 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001028 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001029 return NULL;
1030 }
1031 self->ob_item = item;
1032 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001033 memcpy(item + (self->ob_size - n) * itemsize,
1034 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 Py_INCREF(Py_None);
1037 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001038}
1039
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001040static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001041array_tostring(self, args)
1042 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001043 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001044{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001045 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001046 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001047 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001048 self->ob_size * self->ob_descr->itemsize);
1049}
1050
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001051static PyMethodDef array_methods[] = {
1052 {"append", (PyCFunction)array_append},
1053 {"byteswap", (PyCFunction)array_byteswap},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054/* {"count", (method)array_count},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001055 {"fromfile", (PyCFunction)array_fromfile},
1056 {"fromlist", (PyCFunction)array_fromlist},
1057 {"fromstring", (PyCFunction)array_fromstring},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001058/* {"index", (method)array_index},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059 {"insert", (PyCFunction)array_insert},
1060 {"read", (PyCFunction)array_fromfile},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061/* {"remove", (method)array_remove},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001062 {"reverse", (PyCFunction)array_reverse},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063/* {"sort", (method)array_sort},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001064 {"tofile", (PyCFunction)array_tofile},
1065 {"tolist", (PyCFunction)array_tolist},
1066 {"tostring", (PyCFunction)array_tostring},
1067 {"write", (PyCFunction)array_tofile},
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 {NULL, NULL} /* sentinel */
1069};
1070
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001071static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001072array_getattr(a, name)
1073 arrayobject *a;
1074 char *name;
1075{
1076 if (strcmp(name, "typecode") == 0) {
1077 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001078 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001079 }
1080 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001081 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001082 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001083 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001084 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001085 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001086 PyList_SetItem(list, 0,
1087 PyString_FromString("typecode"));
1088 PyList_SetItem(list, 1,
1089 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001090 if (PyErr_Occurred()) {
1091 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001092 list = NULL;
1093 }
1094 }
1095 return list;
1096 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001098}
1099
1100static int
1101array_print(a, fp, flags)
1102 arrayobject *a;
1103 FILE *fp;
1104 int flags;
1105{
1106 int ok = 0;
1107 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001108 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001109 len = a->ob_size;
1110 if (len == 0) {
1111 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1112 return ok;
1113 }
1114 if (a->ob_descr->typecode == 'c') {
1115 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116 v = array_tostring(a, (PyObject *)NULL);
1117 ok = PyObject_Print(v, fp, 0);
1118 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001119 fprintf(fp, ")");
1120 return ok;
1121 }
1122 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1123 for (i = 0; i < len && ok == 0; i++) {
1124 if (i > 0)
1125 fprintf(fp, ", ");
1126 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127 ok = PyObject_Print(v, fp, 0);
1128 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001129 }
1130 fprintf(fp, "])");
1131 return ok;
1132}
1133
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001134static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001135array_repr(a)
1136 arrayobject *a;
1137{
1138 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001140 int i, len;
1141 len = a->ob_size;
1142 if (len == 0) {
1143 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001144 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001145 }
1146 if (a->ob_descr->typecode == 'c') {
1147 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148 s = PyString_FromString(buf);
1149 v = array_tostring(a, (PyObject *)NULL);
1150 t = PyObject_Repr(v);
1151 Py_XDECREF(v);
1152 PyString_ConcatAndDel(&s, t);
1153 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001154 return s;
1155 }
1156 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157 s = PyString_FromString(buf);
1158 comma = PyString_FromString(", ");
1159 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001160 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001161 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001162 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001163 t = PyObject_Repr(v);
1164 Py_XDECREF(v);
1165 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001166 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 Py_XDECREF(comma);
1168 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 return s;
1170}
1171
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001172static int
1173array_buffer_getreadbuf(self, index, ptr)
1174 arrayobject *self;
1175 int index;
1176 const void **ptr;
1177{
1178 if ( index != 0 ) {
1179 PyErr_SetString(PyExc_SystemError, "Accessing non-existent array segment");
1180 return -1;
1181 }
1182 *ptr = (void *)self->ob_item;
1183 return self->ob_size*self->ob_descr->itemsize;
1184}
1185
1186static int
1187array_buffer_getwritebuf(self, index, ptr)
1188 arrayobject *self;
1189 int index;
1190 const void **ptr;
1191{
1192 if ( index != 0 ) {
1193 PyErr_SetString(PyExc_SystemError, "Accessing non-existent array segment");
1194 return -1;
1195 }
1196 *ptr = (void *)self->ob_item;
1197 return self->ob_size*self->ob_descr->itemsize;
1198}
1199
1200static int
1201array_buffer_getsegcount(self, lenp)
1202 arrayobject *self;
1203 int *lenp;
1204{
1205 if ( lenp )
1206 *lenp = self->ob_size*self->ob_descr->itemsize;
1207 return 1;
1208}
1209
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001210static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001211 (inquiry)array_length, /*sq_length*/
1212 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001214 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001215 (intintargfunc)array_slice, /*sq_slice*/
1216 (intobjargproc)array_ass_item, /*sq_ass_item*/
1217 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001218};
1219
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001220static PyBufferProcs array_as_buffer = {
1221 (getreadbufferproc)array_buffer_getreadbuf,
1222 (getwritebufferproc)array_buffer_getwritebuf,
1223 (getsegcountproc)array_buffer_getsegcount,
1224};
1225
1226
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001227statichere PyTypeObject Arraytype = {
1228 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 0,
1230 "array",
1231 sizeof(arrayobject),
1232 0,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001233 (destructor)array_dealloc, /*tp_dealloc*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001234 (printfunc)array_print, /*tp_print*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001235 (getattrfunc)array_getattr, /*tp_getattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001236 0, /*tp_setattr*/
1237 (cmpfunc)array_compare, /*tp_compare*/
1238 (reprfunc)array_repr, /*tp_repr*/
1239 0, /*tp_as_number*/
1240 &array_as_sequence, /*tp_as_sequence*/
1241 0, /*tp_as_mapping*/
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001242 0, /*tp_hash*/
1243 0, /*tp_call*/
1244 0, /*tp_str*/
1245 0, /*tp_getattro*/
1246 0, /*tp_setattro*/
1247 &array_as_buffer, /*tp_as_buffer*/
1248 0, /*tp_xxx4*/
1249 0, /*tp_doc*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001250};
1251
1252
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001254a_array(self, args)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001255 PyObject *self;
1256 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001257{
1258 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001260 struct arraydescr *descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 if (!PyArg_Parse(args, "c", &c)) {
1262 PyErr_Clear();
1263 if (!PyArg_Parse(args, "(cO)", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001264 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1266 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001267 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001268 return NULL;
1269 }
1270 }
1271 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1272 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001273 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001274 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001275 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001276 len = 0;
1277 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001278 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001279 a = newarrayobject(len, descr);
1280 if (a == NULL)
1281 return NULL;
1282 if (len > 0) {
1283 int i;
1284 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001285 PyObject *v =
1286 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001287 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001288 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001289 return NULL;
1290 }
1291 }
1292 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 if (initial != NULL && PyString_Check(initial)) {
1294 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001295 array_fromstring((arrayobject *)a, initial);
1296 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001297 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001298 return NULL;
1299 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001300 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001301 }
1302 return a;
1303 }
1304 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001305 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001306 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001307 return NULL;
1308}
1309
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001310static PyMethodDef a_methods[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +00001311 {"array", a_array},
1312 {NULL, NULL} /* sentinel */
1313};
1314
1315void
1316initarray()
1317{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001318 PyObject *m, *d;
1319 m = Py_InitModule("array", a_methods);
1320 d = PyModule_GetDict(m);
Guido van Rossum24995b91997-06-02 22:17:49 +00001321 if (PyDict_SetItemString(d, "ArrayType",
Guido van Rossumb6190d31997-05-22 14:56:36 +00001322 (PyObject *)&Arraytype) != 0)
Guido van Rossum24995b91997-06-02 22:17:49 +00001323 Py_FatalError("can't define array.ArrayType");
Guido van Rossum778983b1993-02-19 15:55:02 +00001324}