arraymodule.c revision 5817f8f7171c31d574e4529f6ad9a346c4332ca8
1778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/***********************************************************
2524b588553afb0759c5be590a7aa41db92dcd2aeGuido van RossumCopyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3524b588553afb0759c5be590a7aa41db92dcd2aeGuido van RossumThe Netherlands.
4778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
5778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum                        All Rights Reserved
6778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
7d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPermission to use, copy, modify, and distribute this software and its
8d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumdocumentation for any purpose and without fee is hereby granted,
9778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumprovided that the above copyright notice appear in all copies and that
10d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumboth that copyright notice and this permission notice appear in
11778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsupporting documentation, and that the names of Stichting Mathematisch
12d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCentrum or CWI or Corporation for National Research Initiatives or
13d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCNRI not be used in advertising or publicity pertaining to
14d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumdistribution of the software without specific, written prior
15d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumpermission.
16d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum
17d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumWhile CWI is the initial source for this software, a modified version
18d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumis made available by the Corporation for National Research Initiatives
19d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum(CNRI) at the Internet address ftp://ftp.python.org.
20d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum
21d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPERFORMANCE OF THIS SOFTWARE.
29778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
30778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum******************************************************************/
31778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
32778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Array object implementation */
33778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
34778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* An array is a uniform list -- all items have the same type.
35778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum   The item type is restricted to simple C types like int or float */
36778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
372919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse#include "Python.h"
385817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse
390c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#ifdef STDC_HEADERS
400c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#include <stddef.h>
410c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#else
42b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum#include <sys/types.h>		/* For size_t */
430c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#endif
44778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
45778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arrayobject; /* Forward */
46778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
47778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arraydescr {
48778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int typecode;
49778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize;
502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *));
52778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
53778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
54778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypedef struct arrayobject {
552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject_VAR_HEAD
56778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *ob_item;
57778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *ob_descr;
58778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} arrayobject;
59778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestaticforward PyTypeObject Arraytype;
61778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
62778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
63778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
64b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
66a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0
672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int getarraysize Py_PROTO((PyObject *));
68a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif
692919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *getarrayitem Py_PROTO((PyObject *, int));
702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
71a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0
722919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int addarrayitem Py_PROTO((PyObject *, PyObject *));
74a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif
75778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
77778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_getitem(ap, i)
78778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
79778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
80778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
82778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
83778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
84778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
85778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_setitem(ap, i, v)
86778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
87778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
882919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
89778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
90778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
912919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "c;array item must be char", &x))
92778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
93778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
94778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
95778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
96778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
97778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
99778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_getitem(ap, i)
100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x = ((char *)ap->ob_item)[i];
104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (x >= 128)
105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		x -= 256;
1062919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyInt_FromLong(x);
107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_setitem(ap, i, v)
111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
1132919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
1162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "b;array item must be integer", &x))
117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1232919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_getitem(ap, i)
125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_setitem(ap, i, v)
133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
1352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	short x;
1382919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "h;array item must be integer", &x))
139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((short *)ap->ob_item)[i] = x;
142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1452919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
146e77a757094f68351f336044654cd91575c677896Guido van Rossumi_getitem(ap, i)
147e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
148e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
149e77a757094f68351f336044654cd91575c677896Guido van Rossum{
1502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
151e77a757094f68351f336044654cd91575c677896Guido van Rossum}
152e77a757094f68351f336044654cd91575c677896Guido van Rossum
153e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic int
154e77a757094f68351f336044654cd91575c677896Guido van Rossumi_setitem(ap, i, v)
155e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
156e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
1572919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
158e77a757094f68351f336044654cd91575c677896Guido van Rossum{
159e77a757094f68351f336044654cd91575c677896Guido van Rossum	int x;
1602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "i;array item must be integer", &x))
161e77a757094f68351f336044654cd91575c677896Guido van Rossum		return -1;
162e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (i >= 0)
163e77a757094f68351f336044654cd91575c677896Guido van Rossum		     ((int *)ap->ob_item)[i] = x;
164e77a757094f68351f336044654cd91575c677896Guido van Rossum	return 0;
165e77a757094f68351f336044654cd91575c677896Guido van Rossum}
166e77a757094f68351f336044654cd91575c677896Guido van Rossum
1672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
168778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_getitem(ap, i)
169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1722919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyInt_FromLong(((long *)ap->ob_item)[i]);
173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_setitem(ap, i, v)
177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
1792919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
180778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
181778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x;
1822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "l;array item must be integer", &x))
183778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
185778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((long *)ap->ob_item)[i] = x;
186778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
187778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
188778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1892919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
190778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_getitem(ap, i)
191778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
192778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1942919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
195778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
196778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
197778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
198778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_setitem(ap, i, v)
199778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
200778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
2012919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
202778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	float x;
2042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "f;array item must be float", &x))
205778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((float *)ap->ob_item)[i] = x;
208778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
209778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
210778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
2112919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
212778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_getitem(ap, i)
213778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
214778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
2162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
217778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
218778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
219778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
220778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_setitem(ap, i, v)
221778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
222778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
2232919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
224778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
225778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	double x;
2262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(v, "d;array item must be float", &x))
227778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
228778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
229778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((double *)ap->ob_item)[i] = x;
230778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
231778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
232778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
233778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Description of types */
234234f942aefb779efa6cfb7225e21d16a3f7e80f7Guido van Rossumstatic struct arraydescr descriptors[] = {
235778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'c', sizeof(char), c_getitem, c_setitem},
236778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'b', sizeof(char), b_getitem, b_setitem},
237778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'h', sizeof(short), h_getitem, h_setitem},
238e77a757094f68351f336044654cd91575c677896Guido van Rossum	{'i', sizeof(int), i_getitem, i_setitem},
239778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'l', sizeof(long), l_getitem, l_setitem},
240778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'f', sizeof(float), f_getitem, f_setitem},
241778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'d', sizeof(double), d_getitem, d_setitem},
242778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'\0', 0, 0, 0} /* Sentinel */
243778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
244e77a757094f68351f336044654cd91575c677896Guido van Rossum/* If we ever allow items larger than double, we must change reverse()! */
245778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
246778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
2472919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
248778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumnewarrayobject(size, descr)
249778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
250778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
251778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
252778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
253b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	size_t nbytes;
254778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size < 0) {
2552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
256778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
257778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
258778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = size * descr->itemsize;
259778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	/* Check for overflow */
260778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (nbytes / descr->itemsize != size) {
2612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		return PyErr_NoMemory();
262778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
2632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	op = PyMem_NEW(arrayobject, 1);
264778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op == NULL) {
2652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		return PyErr_NoMemory();
266778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
267778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size <= 0) {
268778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		op->ob_item = NULL;
269778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
270778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
2712919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		op->ob_item = PyMem_NEW(char, nbytes);
272778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (op->ob_item == NULL) {
2732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyMem_DEL(op);
2742919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			return PyErr_NoMemory();
275778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
276778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
277778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_type = &Arraytype;
278778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_size = size;
279778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_descr = descr;
2802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	_Py_NewReference(op);
2812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return (PyObject *) op;
282778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
283778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
284a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0
28562de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
286778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarraysize(op)
2872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *op;
288778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
289778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
2902919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
291778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
292778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
293778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ((arrayobject *)op) -> ob_size;
294778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
295a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif
296778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
2972919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
298778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarrayitem(op, i)
2992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *op;
300778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
301778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
302778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	register arrayobject *ap;
303778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
3042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
305778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
306778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
307778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	ap = (arrayobject *)op;
308778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= ap->ob_size) {
3092919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_IndexError, "array index out of range");
310778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
311778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
312778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*ap->ob_descr->getitem)(ap, i);
313778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
314778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
315778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
316778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins1(self, where, v)
317778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
318778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
3192919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
320778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
321778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *items;
322778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL) {
3232919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
324778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
325778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
326778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if ((*self->ob_descr->setitem)(self, -1, v) < 0)
327778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
328778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	items = self->ob_item;
3295817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	PyMem_RESIZE(items, char,
3305817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse		     (self->ob_size+1) * self->ob_descr->itemsize);
331778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (items == NULL) {
3322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_NoMemory();
333778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
334778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
335778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where < 0)
336778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = 0;
337778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where > self->ob_size)
338778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = self->ob_size;
339778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memmove(items + (where+1)*self->ob_descr->itemsize,
340778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		items + where*self->ob_descr->itemsize,
341778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(self->ob_size-where)*self->ob_descr->itemsize);
342778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_item = items;
343778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_size++;
344778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*self->ob_descr->setitem)(self, where, v);
345778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
346778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
347a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0
34862de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
349778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminsarrayitem(op, where, newitem)
3502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *op;
351778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
3522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *newitem;
353778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
354778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
3552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
356778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
357778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
358778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op, where, newitem);
359778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
360778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
36162de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
362778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumaddarrayitem(op, newitem)
3632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *op;
3642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *newitem;
365778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
366778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
3672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
368778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
369778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
370778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op,
371778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(int) ((arrayobject *)op)->ob_size, newitem);
372778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
373a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif
374778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
375778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Methods */
376778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic void
378778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_dealloc(op)
379778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
380778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
381778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op->ob_item != NULL)
3822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyMem_DEL(op->ob_item);
3832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyMem_DEL(op);
384778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
385778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
386778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
387778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_compare(v, w)
388778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *v, *w;
389778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
391778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
392778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len; i++) {
3932919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyObject *ai, *bi;
394778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int cmp;
3952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		ai = getarrayitem((PyObject *)v, i);
3962919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		bi = getarrayitem((PyObject *)w, i);
397778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (ai && bi)
3982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			cmp = PyObject_Compare(ai, bi);
399778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		else
400778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = -1;
4012919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		Py_XDECREF(ai);
4022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		Py_XDECREF(bi);
403778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmp != 0) {
4042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_Clear(); /* XXX Can't report errors here */
405778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return cmp;
406778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
407778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
408778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return v->ob_size - w->ob_size;
409778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
410778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
411778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
412778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_length(a)
413778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
415778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return a->ob_size;
416778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
417778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4182919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
419778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_item(a, i)
420778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
421778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
422778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
423778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
4242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_IndexError, "array index out of range");
425778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
426778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
4272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return getarrayitem((PyObject *)a, i);
428778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
429778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
431778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_slice(a, ilow, ihigh)
432778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
433778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
434778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
435778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
436778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
437778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
438778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
439778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
440778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
441778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
442778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
443778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
444778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
445778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
446778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
447778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
448778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
449778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
450778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	       (ihigh-ilow) * a->ob_descr->itemsize);
4512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return (PyObject *)np;
452778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
453778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4542919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
455778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_concat(a, bb)
456778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
4572919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *bb;
458778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
459778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
460778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
461778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(bb)) {
4622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
463778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
464778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
465778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb)
466778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr != b->ob_descr) {
4672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
468778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
469778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
470778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size + b->ob_size;
471778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
472778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL) {
473778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
474778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
475778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
476778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
47732be3a7a88fd2aae37cdd250f547c0687312c152Guido van Rossum	       b->ob_item, b->ob_size*b->ob_descr->itemsize);
4782919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return (PyObject *)np;
479778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
480778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
481778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
4822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
483778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repeat(a, n)
484778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
485778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
486778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
4873bbc62e9c25d4c006cd21d6b1314ccf0ba211382Guido van Rossum	int i;
488778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
489778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
490778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
491778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int nbytes;
492778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n < 0)
493778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
494778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size * n;
495778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
496778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
497778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
498778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	p = np->ob_item;
499778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = a->ob_size * a->ob_descr->itemsize;
500778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < n; i++) {
501778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(p, a->ob_item, nbytes);
502778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		p += nbytes;
503778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
5042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return (PyObject *) np;
505778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
506778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
507778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
508778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_slice(a, ilow, ihigh, v)
509778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
510778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
5112919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
512778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
513778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *item;
514778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n; /* Size of replacement array */
515778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int d; /* Change in size */
516778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v)
517778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
518778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
519778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (is_arrayobject(v)) {
520778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = b->ob_size;
521778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (a == b) {
522778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			/* Special case "a[i:j] = a" -- copy b first */
523778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int ret;
524778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			v = array_slice(b, 0, n);
525778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			ret = array_ass_slice(a, ilow, ihigh, v);
5262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			Py_DECREF(v);
527778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return ret;
528778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
529778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (b->ob_descr != a->ob_descr) {
5302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_BadArgument();
531778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
532778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
533778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
534778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
5352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
536778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
537778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
538778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
539778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
540778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
541778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
542778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
543778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
544778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
545778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
546778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
547778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
548778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	item = a->ob_item;
549778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	d = n - (ihigh-ilow);
550778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (d < 0) { /* Delete -d items */
551778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
552778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
553778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
554778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
5552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
556778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						/* Can't fail */
557778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
558778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
559778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (d > 0) { /* Insert d items */
5602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyMem_RESIZE(item, char,
5612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			     (a->ob_size + d)*a->ob_descr->itemsize);
562778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
5632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_NoMemory();
564778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
565778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
566778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
567778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
568778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
569778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
570778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
571778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
572778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0)
573778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
574778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		       n*b->ob_descr->itemsize);
575778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
576778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
577778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
578778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
579778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
580778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_item(a, i, v)
581778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
582778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
5832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
584778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
585778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
5862919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_IndexError,
5872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			         "array assignment index out of range");
588778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
589778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
590778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
591778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return array_ass_slice(a, i, i+1, v);
592778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*a->ob_descr->setitem)(a, i, v);
593778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
594778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
595778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
596778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsetarrayitem(a, i, v)
5972919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *a;
598778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
5992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
600778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
601778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(a)) {
6022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadInternalCall();
603778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
604778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
605778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return array_ass_item((arrayobject *)a, i, v);
606778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
607778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6082919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
609778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins(self, where, v)
610778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
611778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
6122919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
613778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
614778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ins1(self, where, v) != 0)
615778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
6162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
6172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
618778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
619778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
621778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_insert(self, args)
622778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
6232919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
624778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
625778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
6262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
6272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "(iO)", &i, &v))
628778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
629778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, i, v);
630778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
631778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
633778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_append(self, args)
634778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
6352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
636778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
6372919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
6382919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "O", &v))
639778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
640778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, (int) self->ob_size, v);
641778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
642778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
644778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_byteswap(self, args)
645778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
6462919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
647778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
648778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
649778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
650778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	switch (self->ob_descr->itemsize) {
651778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 1:
652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
653778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 2:
654778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
655778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
656778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[1];
657778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p0;
658778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
659778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
660778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 4:
661778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
662778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
663778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p1 = p[1];
664778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[3];
665778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p[2];
666778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[2] = p1;
667778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[3] = p0;
668778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
669778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
670e77a757094f68351f336044654cd91575c677896Guido van Rossum	case 8:
671e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
672e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p0 = p[0];
673e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p1 = p[1];
674e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p2 = p[2];
675e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p3 = p[3];
676e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[0] = p[7];
677e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[1] = p[6];
678e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[2] = p[5];
679e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[3] = p[4];
680e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[4] = p3;
681e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[5] = p2;
682e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[6] = p1;
683e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[7] = p0;
684e77a757094f68351f336044654cd91575c677896Guido van Rossum		}
685e77a757094f68351f336044654cd91575c677896Guido van Rossum		break;
686778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	default:
6872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_RuntimeError,
688778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "don't know how to byteswap this array type");
689778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
690778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
6912919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
6922919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
693778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
694778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
6952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
696778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_reverse(self, args)
697778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
6982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
699778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
700e77a757094f68351f336044654cd91575c677896Guido van Rossum	register int itemsize = self->ob_descr->itemsize;
701e77a757094f68351f336044654cd91575c677896Guido van Rossum	register char *p, *q;
702e77a757094f68351f336044654cd91575c677896Guido van Rossum	char tmp[sizeof(double)]; /* Assume that's the max item size */
703e77a757094f68351f336044654cd91575c677896Guido van Rossum
704778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args != NULL) {
7052919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
706778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
707778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
708778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
709778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 1) {
710e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item,
711e77a757094f68351f336044654cd91575c677896Guido van Rossum		     q = self->ob_item + (self->ob_size - 1)*itemsize;
712e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p < q;
713e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p += itemsize, q -= itemsize) {
714e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(tmp, p, itemsize);
715e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(p, q, itemsize);
716e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(q, tmp, itemsize);
717778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
718778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
719778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
7202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
7212919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
722778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
723e77a757094f68351f336044654cd91575c677896Guido van Rossum
724e77a757094f68351f336044654cd91575c677896Guido van Rossum/* The following routines were adapted from listobject.c but not converted.
725e77a757094f68351f336044654cd91575c677896Guido van Rossum   To make them work you will have to work! */
726778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
727778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
7282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
729778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_index(self, args)
730778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
7312919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
732778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
733778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
734778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
735778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
7362919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
737778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
738778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
739778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
7402919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		if (PyObject_Compare(self->ob_item[i], args) == 0)
7412919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			return PyInt_FromLong((long)i);
742778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
7432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
744778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
745778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
746778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
747778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
748778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
7492919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
750778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_count(self, args)
751778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
7522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
753778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
754778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int count = 0;
755778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
756778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
757778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
7582919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
759778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
760778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
761778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
7622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		if (PyObject_Compare(self->ob_item[i], args) == 0)
763778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			count++;
764778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
7652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyInt_FromLong((long)count);
766778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
767778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
768778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
769778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
7702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
771778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_remove(self, args)
772778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
7732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
774778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
775778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
776778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
777778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
7782919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_BadArgument();
779778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
780778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
781778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
7822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		if (PyObject_Compare(self->ob_item[i], args) == 0) {
7835817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse			if (array_ass_slice(self, i, i+1,
7845817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse					    (PyObject *)NULL) != 0)
785778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
7862919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			Py_INCREF(Py_None);
7872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			return Py_None;
788778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
789778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
790778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
7912919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
792778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
793778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
794778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
795778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
7962919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
797e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_fromfile(self, args)
798778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
7992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
800778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
8012919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *f;
802778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
803778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
8042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "(Oi)", &f, &n))
805778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
8062919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	fp = PyFile_AsFile(f);
807778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
8082919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
809778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
810778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
811778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
812778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
813778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int itemsize = self->ob_descr->itemsize;
814778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int nread;
8152919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
816778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
8172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_NoMemory();
818778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
819778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
820778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
821778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
822778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		nread = fread(item + (self->ob_size - n) * itemsize,
823778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			      itemsize, n, fp);
824778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (nread < n) {
825778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_size -= (n - nread);
8262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyMem_RESIZE(item, char, self->ob_size*itemsize);
827778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_item = item;
8282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_SetString(PyExc_EOFError,
8292919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse				         "not enough items in file");
830778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
831778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
832778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
8332919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
8342919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
835778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
836778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
8372919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
838e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_tofile(self, args)
839778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
8402919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
841778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
8422919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *f;
843778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
8442919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "O", &f))
845778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
8462919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	fp = PyFile_AsFile(f);
847778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
8482919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_TypeError, "arg must be open file");
849778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
850778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
851778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 0) {
852778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (fwrite(self->ob_item, self->ob_descr->itemsize,
853778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   self->ob_size, fp) != self->ob_size) {
8542919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_SetFromErrno(PyExc_IOError);
855778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			clearerr(fp);
856778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
857778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
858778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
8592919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
8602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
861778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
862778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
8632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
864778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromlist(self, args)
865778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
8662919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
867778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
868778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
8692919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *list;
870778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
8712919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "O", &list))
872778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
8732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyList_Check(list)) {
8742919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_TypeError, "arg must be list");
875778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
876778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
8772919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	n = PyList_Size(list);
878778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
879778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
880778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int i;
8812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
882778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
8832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_NoMemory();
884778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
885778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
886778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
887778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
888778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (i = 0; i < n; i++) {
8892919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyObject *v = PyList_GetItem(list, i);
890778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if ((*self->ob_descr->setitem)(self,
891778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					self->ob_size - n + i, v) != 0) {
892778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_size -= n;
8932919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse				PyMem_RESIZE(item, char,
8942919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse					          self->ob_size * itemsize);
895778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_item = item;
896778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
897778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
898778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
899778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
9002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
9012919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
902778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
903778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
905778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tolist(self, args)
906778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
9072919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
908778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
9092919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *list = PyList_New(self->ob_size);
910778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
911778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (list == NULL)
912778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
913778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
9142919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyObject *v = getarrayitem((PyObject *)self, i);
915778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (v == NULL) {
9162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			Py_DECREF(list);
917778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
918778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
9192919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyList_SetItem(list, i, v);
920778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
921778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return list;
922778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
923778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromstring(self, args)
926778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
9272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
928778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
929778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *str;
930778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
931778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
9322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "s#", &str, &n))
933778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
934778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n % itemsize != 0) {
9352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_SetString(PyExc_ValueError,
936778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "string length not a multiple of item size");
937778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
938778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
939778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = n / itemsize;
940778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
941778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
9422919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
943778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
9442919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_NoMemory();
945778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
946778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
947778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
948778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
9495817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse		memcpy(item + (self->ob_size - n) * itemsize,
9505817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse		       str, itemsize*n);
951778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
9522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_INCREF(Py_None);
9532919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_None;
954778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
955778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9562919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
957778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tostring(self, args)
958778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
9592919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
960778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
9612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, ""))
962778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
9632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return PyString_FromStringAndSize(self->ob_item,
964778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				    self->ob_size * self->ob_descr->itemsize);
965778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
966778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyMethodDef array_methods[] = {
9682919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"append",	(PyCFunction)array_append},
9692919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"byteswap",	(PyCFunction)array_byteswap},
970b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"count",	(method)array_count},*/
9712919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"fromfile",	(PyCFunction)array_fromfile},
9722919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"fromlist",	(PyCFunction)array_fromlist},
9732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"fromstring",	(PyCFunction)array_fromstring},
974b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"index",	(method)array_index},*/
9752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"insert",	(PyCFunction)array_insert},
9762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"read",	(PyCFunction)array_fromfile},
977b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"remove",	(method)array_remove},*/
9782919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"reverse",	(PyCFunction)array_reverse},
979b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"sort",	(method)array_sort},*/
9802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"tofile",	(PyCFunction)array_tofile},
9812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"tolist",	(PyCFunction)array_tolist},
9822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"tostring",	(PyCFunction)array_tostring},
9832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	{"write",	(PyCFunction)array_tofile},
984778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
985778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
986778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
9872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
988778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_getattr(a, name)
989778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
990778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *name;
991778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
992778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "typecode") == 0) {
993778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char tc = a->ob_descr->typecode;
9942919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		return PyString_FromStringAndSize(&tc, 1);
995778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
996778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "itemsize") == 0) {
9972919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		return PyInt_FromLong((long)a->ob_descr->itemsize);
998778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
999a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum	if (strcmp(name, "__members__") == 0) {
10002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyObject *list = PyList_New(2);
1001a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		if (list) {
10025817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse			PyList_SetItem(list, 0,
10035817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse				       PyString_FromString("typecode"));
10045817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse			PyList_SetItem(list, 1,
10055817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse				       PyString_FromString("itemsize"));
10062919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			if (PyErr_Occurred()) {
10072919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse				Py_DECREF(list);
1008a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum				list = NULL;
1009a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			}
1010a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		}
1011a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		return list;
1012a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum	}
10132919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	return Py_FindMethod(array_methods, (PyObject *)a, name);
1014778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1015778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1016778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
1017778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_print(a, fp, flags)
1018778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1019778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
1020778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int flags;
1021778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1022778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ok = 0;
1023778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
10242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *v;
1025778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1026778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1027778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('%c')", a->ob_descr->typecode);
1028778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1029778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1030778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1031778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('c', ");
10322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		v = array_tostring(a, (PyObject *)NULL);
10332919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		ok = PyObject_Print(v, fp, 0);
10342919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		Py_XDECREF(v);
1035778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, ")");
1036778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1037778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1038778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1039778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && ok == 0; i++) {
1040778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (i > 0)
1041778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			fprintf(fp, ", ");
1042778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
10432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		ok = PyObject_Print(v, fp, 0);
10442919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		Py_XDECREF(v);
1045778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1046778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "])");
1047778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ok;
1048778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1049778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
10502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
1051778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repr(a)
1052778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1053778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1054778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char buf[256];
10552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *s, *t, *comma, *v;
1056778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1057778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1058778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1059778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('%c')", a->ob_descr->typecode);
10602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		return PyString_FromString(buf);
1061778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1062778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1063778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('c', ");
10642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		s = PyString_FromString(buf);
10652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		v = array_tostring(a, (PyObject *)NULL);
10662919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		t = PyObject_Repr(v);
10672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		Py_XDECREF(v);
10682919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyString_ConcatAndDel(&s, t);
10692919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyString_ConcatAndDel(&s, PyString_FromString(")"));
1070778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return s;
1071778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1072778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sprintf(buf, "array('%c', [", a->ob_descr->typecode);
10732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	s = PyString_FromString(buf);
10742919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	comma = PyString_FromString(", ");
10752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	for (i = 0; i < len && !PyErr_Occurred(); i++) {
1076b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		if (i > 0)
10772919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyString_Concat(&s, comma);
1078778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
10792919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		t = PyObject_Repr(v);
10802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		Py_XDECREF(v);
10812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyString_ConcatAndDel(&s, t);
1082778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
10832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_XDECREF(comma);
10842919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyString_ConcatAndDel(&s, PyString_FromString("])"));
1085778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return s;
1086778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1087778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
10882919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PySequenceMethods array_as_sequence = {
10895817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	(inquiry)array_length,		        /*sq_length*/
10905817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	(binaryfunc)array_concat,               /*sq_concat*/
1091b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intargfunc)array_repeat,		/*sq_repeat*/
10925817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	(intargfunc)array_item,		        /*sq_item*/
1093b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intintargfunc)array_slice,		/*sq_slice*/
1094b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intobjargproc)array_ass_item,		/*sq_ass_item*/
1095b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intintobjargproc)array_ass_slice,	/*sq_ass_slice*/
1096778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1097778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
10982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatichere PyTypeObject Arraytype = {
10992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject_HEAD_INIT(&PyType_Type)
1100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	"array",
1102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sizeof(arrayobject),
1103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
11045817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	(destructor)array_dealloc,	/*tp_dealloc*/
1105b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(printfunc)array_print,		/*tp_print*/
11065817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	(getattrfunc)array_getattr,	/*tp_getattr*/
1107b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_setattr*/
1108b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(cmpfunc)array_compare,		/*tp_compare*/
1109b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(reprfunc)array_repr,		/*tp_repr*/
1110b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_as_number*/
1111b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	&array_as_sequence,		/*tp_as_sequence*/
1112b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_as_mapping*/
1113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
11162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *
1117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuma_array(self, args)
11182919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *self;
11192919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *args;
1120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char c;
11222919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	PyObject *initial = NULL;
1123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
11242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	if (!PyArg_Parse(args, "c", &c)) {
11252919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		PyErr_Clear();
11262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		if (!PyArg_Parse(args, "(cO)", &c, &initial))
1127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
11282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse		if (!PyList_Check(initial) && !PyString_Check(initial)) {
11292919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyErr_SetString(PyExc_TypeError,
11305817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse				 "array initializer must be list or string");
1131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (descr = descriptors; descr->typecode != '\0'; descr++) {
1135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (descr->typecode == c) {
11362919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			PyObject *a;
1137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int len;
11382919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			if (initial == NULL || !PyList_Check(initial))
1139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = 0;
1140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			else
11412919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse				len = PyList_Size(initial);
1142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			a = newarrayobject(len, descr);
1143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (a == NULL)
1144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
1145778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (len > 0) {
1146778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				int i;
1147778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				for (i = 0; i < len; i++) {
11482919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse					PyObject *v =
11492919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse					         PyList_GetItem(initial, i);
1150778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					if (setarrayitem(a, i, v) != 0) {
11512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse						Py_DECREF(a);
1152778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						return NULL;
1153778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					}
1154778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1155778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
11562919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse			if (initial != NULL && PyString_Check(initial)) {
11572919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse				PyObject *v =
1158778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				  array_fromstring((arrayobject *)a, initial);
1159778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				if (v == NULL) {
11602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse					Py_DECREF(a);
1161778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					return NULL;
1162778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
11632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse				Py_DECREF(v);
1164778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1165778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return a;
1166778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1167778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
11685817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse	PyErr_SetString(PyExc_ValueError,
11695817f8f7171c31d574e4529f6ad9a346c4332ca8Roger E. Masse			"bad typecode (must be c, b, h, l, f or d)");
1170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
1171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
11732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyMethodDef a_methods[] = {
1174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"array",	a_array},
1175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
1176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumvoid
1179778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminitarray()
1180778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
11812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse	Py_InitModule("array", a_methods);
1182778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1183