arraymodule.c revision 62de97f29c90436f967c13050c93fbd1ac1ae88f
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
7778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumPermission to use, copy, modify, and distribute this software and its
8778983b48165da25ee11fb97f6855af7c67f4ff2Guido 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
10778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumboth that copyright notice and this permission notice appear in
11778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsupporting documentation, and that the names of Stichting Mathematisch
12778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumCentrum or CWI not be used in advertising or publicity pertaining to
13778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumdistribution of the software without specific, written prior permission.
14778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
15778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
23778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum******************************************************************/
24778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
25778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Array object implementation */
26778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
27778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* An array is a uniform list -- all items have the same type.
28778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum   The item type is restricted to simple C types like int or float */
29778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
30778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "allobjects.h"
31778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "modsupport.h"
32778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "ceval.h"
330c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#ifdef STDC_HEADERS
340c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#include <stddef.h>
350c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#else
36b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum#include <sys/types.h>		/* For size_t */
370c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#endif
38778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
39778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arrayobject; /* Forward */
40778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
41778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arraydescr {
42778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int typecode;
43778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize;
44778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object * (*getitem) FPROTO((struct arrayobject *, int));
45778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int (*setitem) FPROTO((struct arrayobject *, int, object *));
46778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
47778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
48778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypedef struct arrayobject {
49778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	OB_VARHEAD
50778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *ob_item;
51778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *ob_descr;
52778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} arrayobject;
53778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
54b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossumstaticforward typeobject Arraytype;
55778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
56778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
57778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
58b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
59cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic object *newarrayobject PROTO((int, struct arraydescr *));
60cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic int getarraysize PROTO((object *));
61cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic object *getarrayitem PROTO((object *, int));
62b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossumstatic int setarrayitem PROTO((object *, int, object *));
63cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic int insarrayitem PROTO((object *, int, object *));
64cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic int addarrayitem PROTO((object *, object *));
65778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
66778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
67778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_getitem(ap, i)
68778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
69778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
70778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
71778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newsizedstringobject(&((char *)ap->ob_item)[i], 1);
72778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
73778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
74778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
75778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_setitem(ap, i, v)
76778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
77778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
78778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
79778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
80778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
81778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "c;array item must be char", &x))
82778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
83778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
84778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
85778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
86778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
87778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
88778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
89778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_getitem(ap, i)
90778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
91778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
92778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
93778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x = ((char *)ap->ob_item)[i];
94778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (x >= 128)
95778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		x -= 256;
96778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject(x);
97778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
98778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
99778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_setitem(ap, i, v)
101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "b;array item must be integer", &x))
107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_getitem(ap, i)
115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject((long) ((short *)ap->ob_item)[i]);
119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_setitem(ap, i, v)
123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	short x;
128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "h;array item must be integer", &x))
129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((short *)ap->ob_item)[i] = x;
132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
136e77a757094f68351f336044654cd91575c677896Guido van Rossumi_getitem(ap, i)
137e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
138e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
139e77a757094f68351f336044654cd91575c677896Guido van Rossum{
140e77a757094f68351f336044654cd91575c677896Guido van Rossum	return newintobject((long) ((int *)ap->ob_item)[i]);
141e77a757094f68351f336044654cd91575c677896Guido van Rossum}
142e77a757094f68351f336044654cd91575c677896Guido van Rossum
143e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic int
144e77a757094f68351f336044654cd91575c677896Guido van Rossumi_setitem(ap, i, v)
145e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
146e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
147e77a757094f68351f336044654cd91575c677896Guido van Rossum	object *v;
148e77a757094f68351f336044654cd91575c677896Guido van Rossum{
149e77a757094f68351f336044654cd91575c677896Guido van Rossum	int x;
150e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (!getargs(v, "i;array item must be integer", &x))
151e77a757094f68351f336044654cd91575c677896Guido van Rossum		return -1;
152e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (i >= 0)
153e77a757094f68351f336044654cd91575c677896Guido van Rossum		     ((int *)ap->ob_item)[i] = x;
154e77a757094f68351f336044654cd91575c677896Guido van Rossum	return 0;
155e77a757094f68351f336044654cd91575c677896Guido van Rossum}
156e77a757094f68351f336044654cd91575c677896Guido van Rossum
157e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic object *
158778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_getitem(ap, i)
159778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
160778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
161778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
162778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject(((long *)ap->ob_item)[i]);
163778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
164778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
165778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
166778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_setitem(ap, i, v)
167778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
168778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x;
172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "l;array item must be integer", &x))
173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((long *)ap->ob_item)[i] = x;
176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
179778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
180778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_getitem(ap, i)
181778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
182778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
183778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newfloatobject((double) ((float *)ap->ob_item)[i]);
185778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
186778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
187778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
188778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_setitem(ap, i, v)
189778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
190778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
191778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
192778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	float x;
194778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "f;array item must be float", &x))
195778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
196778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
197778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((float *)ap->ob_item)[i] = x;
198778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
199778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
200778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
201778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
202778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_getitem(ap, i)
203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
204778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
205778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newfloatobject(((double *)ap->ob_item)[i]);
207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
208778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
209778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
210778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_setitem(ap, i, v)
211778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
212778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
213778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
214778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	double x;
216778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "d;array item must be float", &x))
217778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
218778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
219778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((double *)ap->ob_item)[i] = x;
220778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
221778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
222778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
223778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Description of types */
224234f942aefb779efa6cfb7225e21d16a3f7e80f7Guido van Rossumstatic struct arraydescr descriptors[] = {
225778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'c', sizeof(char), c_getitem, c_setitem},
226778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'b', sizeof(char), b_getitem, b_setitem},
227778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'h', sizeof(short), h_getitem, h_setitem},
228e77a757094f68351f336044654cd91575c677896Guido van Rossum	{'i', sizeof(int), i_getitem, i_setitem},
229778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'l', sizeof(long), l_getitem, l_setitem},
230778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'f', sizeof(float), f_getitem, f_setitem},
231778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'d', sizeof(double), d_getitem, d_setitem},
232778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'\0', 0, 0, 0} /* Sentinel */
233778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
234e77a757094f68351f336044654cd91575c677896Guido van Rossum/* If we ever allow items larger than double, we must change reverse()! */
235778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
236778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
23762de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic object *
238778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumnewarrayobject(size, descr)
239778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
240778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
241778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
242778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
243b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	size_t nbytes;
244778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size < 0) {
245778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
246778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
247778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
248778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = size * descr->itemsize;
249778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	/* Check for overflow */
250778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (nbytes / descr->itemsize != size) {
251778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return err_nomem();
252778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
253e77a757094f68351f336044654cd91575c677896Guido van Rossum	op = NEW(arrayobject, 1);
254778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op == NULL) {
255778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return err_nomem();
256778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
257778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size <= 0) {
258778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		op->ob_item = NULL;
259778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
260778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
261e77a757094f68351f336044654cd91575c677896Guido van Rossum		op->ob_item = NEW(char, nbytes);
262778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (op->ob_item == NULL) {
263e77a757094f68351f336044654cd91575c677896Guido van Rossum			DEL(op);
264778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return err_nomem();
265778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
266778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
267778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_type = &Arraytype;
268778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_size = size;
269778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_descr = descr;
270a9c3c22c33762699b362e7598268442fd2df9eb6Sjoerd Mullender	NEWREF(op);
271778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *) op;
272778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
273778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
27462de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
275778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarraysize(op)
276778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
277778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
278778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
279778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
280778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
281778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
282778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ((arrayobject *)op) -> ob_size;
283778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
284778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
28562de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic object *
286778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarrayitem(op, i)
287778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
288778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
289778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
290778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	register arrayobject *ap;
291778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
292778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
293778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
294778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
295778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	ap = (arrayobject *)op;
296778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= ap->ob_size) {
297778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array index out of range");
298778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
299778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
300778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*ap->ob_descr->getitem)(ap, i);
301778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
302778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
303778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
304778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins1(self, where, v)
305778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
306778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
307778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
308778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
309778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *items;
310778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL) {
311778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
312778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
313778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
314778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if ((*self->ob_descr->setitem)(self, -1, v) < 0)
315778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
316778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	items = self->ob_item;
317778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	RESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
318778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (items == NULL) {
319778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_nomem();
320778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
321778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
322778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where < 0)
323778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = 0;
324778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where > self->ob_size)
325778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = self->ob_size;
326778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memmove(items + (where+1)*self->ob_descr->itemsize,
327778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		items + where*self->ob_descr->itemsize,
328778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(self->ob_size-where)*self->ob_descr->itemsize);
329778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_item = items;
330778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_size++;
331778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*self->ob_descr->setitem)(self, where, v);
332778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
333778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
33462de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
335778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminsarrayitem(op, where, newitem)
336778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
337778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
338778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *newitem;
339778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
340778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
341778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
342778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
343778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
344778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op, where, newitem);
345778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
346778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
34762de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
348778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumaddarrayitem(op, newitem)
349778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
350778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *newitem;
351778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
352778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
353778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
354778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
355778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
356778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op,
357778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(int) ((arrayobject *)op)->ob_size, newitem);
358778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
359778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
360778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Methods */
361778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
362778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic void
363778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_dealloc(op)
364778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
365778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
366778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op->ob_item != NULL)
367e77a757094f68351f336044654cd91575c677896Guido van Rossum		DEL(op->ob_item);
368e77a757094f68351f336044654cd91575c677896Guido van Rossum	DEL(op);
369778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
370778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
371778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
372778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_compare(v, w)
373778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *v, *w;
374778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
375778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
376778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len; i++) {
378778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		object *ai, *bi;
379778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int cmp;
380778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ai = getarrayitem((object *)v, i);
381778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		bi = getarrayitem((object *)w, i);
382778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (ai && bi)
383778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = cmpobject(ai, bi);
384778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		else
385778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = -1;
386778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(ai);
387778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(bi);
388778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmp != 0) {
389778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_clear(); /* XXX Can't report errors here */
390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return cmp;
391778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
392778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
393778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return v->ob_size - w->ob_size;
394778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
395778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
396778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
397778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_length(a)
398778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
399778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
400778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return a->ob_size;
401778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
402778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
403778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
404778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_item(a, i)
405778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
406778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
407778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
408778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
409778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array index out of range");
410778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
411778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
412778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return getarrayitem((object *)a, i);
413778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
415778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
416778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_slice(a, ilow, ihigh)
417778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
418778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
419778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
420778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
421778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
422778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
423778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
424778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
425778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
426778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
427778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
428778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
429778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
430778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
431778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
432778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
433778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
434778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
435778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	       (ihigh-ilow) * a->ob_descr->itemsize);
436778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *)np;
437778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
438778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
439778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
440778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_concat(a, bb)
441778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
442778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *bb;
443778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
444778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
445778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
446778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(bb)) {
447778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
448778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
449778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
450778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb)
451778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr != b->ob_descr) {
452778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
453778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
454778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
455778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size + b->ob_size;
456778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
457778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL) {
458778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
459778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
460778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
461778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
46232be3a7a88fd2aae37cdd250f547c0687312c152Guido van Rossum	       b->ob_item, b->ob_size*b->ob_descr->itemsize);
463778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *)np;
464778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
465778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
466778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
467778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
468778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repeat(a, n)
469778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
470778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
471778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
4723bbc62e9c25d4c006cd21d6b1314ccf0ba211382Guido van Rossum	int i;
473778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
474778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
475778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
476778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int nbytes;
477778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n < 0)
478778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
479778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size * n;
480778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
481778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
482778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
483778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	p = np->ob_item;
484778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = a->ob_size * a->ob_descr->itemsize;
485778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < n; i++) {
486778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(p, a->ob_item, nbytes);
487778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		p += nbytes;
488778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
489778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *) np;
490778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
491778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
492778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
493778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_slice(a, ilow, ihigh, v)
494778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
495778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
496778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
497778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
498778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *item;
499778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n; /* Size of replacement array */
500778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int d; /* Change in size */
501778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v)
502778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
503778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
504778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (is_arrayobject(v)) {
505778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = b->ob_size;
506778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (a == b) {
507778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			/* Special case "a[i:j] = a" -- copy b first */
508778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int ret;
509778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			v = array_slice(b, 0, n);
510778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			ret = array_ass_slice(a, ilow, ihigh, v);
511778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			DECREF(v);
512778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return ret;
513778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
514778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (b->ob_descr != a->ob_descr) {
515778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_badarg();
516778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
517778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
518778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
519778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
520778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
521778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
522778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
523778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
524778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
525778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
526778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
527778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
528778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
529778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
530778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
531778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
532778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
533778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	item = a->ob_item;
534778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	d = n - (ihigh-ilow);
535778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (d < 0) { /* Delete -d items */
536778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
537778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
538778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
539778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
540778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
541778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						/* Can't fail */
542778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
543778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
544778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (d > 0) { /* Insert d items */
545778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (a->ob_size + d)*a->ob_descr->itemsize);
546778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
547778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
548778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
549778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
550778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
551778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
552778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
553778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
554778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
555778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
556778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0)
557778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
558778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		       n*b->ob_descr->itemsize);
559778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
560778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
561778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
562778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
563778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
564778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_item(a, i, v)
565778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
566778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
567778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
568778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
569778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
570778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array assignment index out of range");
571778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
572778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
573778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
574778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return array_ass_slice(a, i, i+1, v);
575778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*a->ob_descr->setitem)(a, i, v);
576778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
577778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
578778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
579778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsetarrayitem(a, i, v)
580778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *a;
581778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
582778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
583778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
584778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(a)) {
585778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
586778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
587778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
588778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return array_ass_item((arrayobject *)a, i, v);
589778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
590778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
591778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
592778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins(self, where, v)
593778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
594778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
595778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
596778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
597778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ins1(self, where, v) != 0)
598778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
599778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
600778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
601778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
602778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
603778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
604778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_insert(self, args)
605778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
606778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
607778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
608778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
609778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
610778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "(iO)", &i, &v))
611778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
612778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, i, v);
613778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
614778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
615778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
616778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_append(self, args)
617778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
618778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
619778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
620778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
621778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &v))
622778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
623778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, (int) self->ob_size, v);
624778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
625778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
626778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
627778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_byteswap(self, args)
628778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
629778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
630778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
631778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
632778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
633778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	switch (self->ob_descr->itemsize) {
634778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 1:
635778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
636778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 2:
637778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
638778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
639778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[1];
640778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p0;
641778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
642778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
643778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 4:
644778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
645778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
646778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p1 = p[1];
647778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[3];
648778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p[2];
649778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[2] = p1;
650778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[3] = p0;
651778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
653e77a757094f68351f336044654cd91575c677896Guido van Rossum	case 8:
654e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
655e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p0 = p[0];
656e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p1 = p[1];
657e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p2 = p[2];
658e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p3 = p[3];
659e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[0] = p[7];
660e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[1] = p[6];
661e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[2] = p[5];
662e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[3] = p[4];
663e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[4] = p3;
664e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[5] = p2;
665e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[6] = p1;
666e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[7] = p0;
667e77a757094f68351f336044654cd91575c677896Guido van Rossum		}
668e77a757094f68351f336044654cd91575c677896Guido van Rossum		break;
669778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	default:
670778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(RuntimeError,
671778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "don't know how to byteswap this array type");
672778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
673778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
674778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
675778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
676778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
677778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
678778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
679778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_reverse(self, args)
680778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
681778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
682778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
683e77a757094f68351f336044654cd91575c677896Guido van Rossum	register int itemsize = self->ob_descr->itemsize;
684e77a757094f68351f336044654cd91575c677896Guido van Rossum	register char *p, *q;
685e77a757094f68351f336044654cd91575c677896Guido van Rossum	char tmp[sizeof(double)]; /* Assume that's the max item size */
686e77a757094f68351f336044654cd91575c677896Guido van Rossum
687778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args != NULL) {
688778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
689778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
690778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
691778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
692778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 1) {
693e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item,
694e77a757094f68351f336044654cd91575c677896Guido van Rossum		     q = self->ob_item + (self->ob_size - 1)*itemsize;
695e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p < q;
696e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p += itemsize, q -= itemsize) {
697e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(tmp, p, itemsize);
698e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(p, q, itemsize);
699e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(q, tmp, itemsize);
700778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
701778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
702778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
703778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
704778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
705778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
706e77a757094f68351f336044654cd91575c677896Guido van Rossum
707e77a757094f68351f336044654cd91575c677896Guido van Rossum/* The following routines were adapted from listobject.c but not converted.
708e77a757094f68351f336044654cd91575c677896Guido van Rossum   To make them work you will have to work! */
709778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
710778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
711778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
712778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_index(self, args)
713778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
714778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
715778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
716778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
717778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
718778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
719778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
720778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
721778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
722778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
723778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0)
724778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return newintobject((long)i);
725778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
726778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "array.index(x): x not in array");
727778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
728778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
729778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
730778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
731778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
732778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
733778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_count(self, args)
734778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
735778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
736778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
737778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int count = 0;
738778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
739778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
740778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
741778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
742778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
743778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
744778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
745778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0)
746778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			count++;
747778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
748778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject((long)count);
749778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
750778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
751778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
752778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
753778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
754778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_remove(self, args)
755778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
756778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
757778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
758778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
759778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
760778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
761778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
762778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
763778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
764778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
765778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0) {
766778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (array_ass_slice(self, i, i+1, (object *)NULL) != 0)
767778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
768778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			INCREF(None);
769778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return None;
770778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
771778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
772778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
773778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "array.remove(x): x not in array");
774778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
775778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
776778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
777778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
778778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
779e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_fromfile(self, args)
780778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
781778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
782778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
783778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *f;
784778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
785778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
786778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "(Oi)", &f, &n))
787778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
788778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fp = getfilefile(f);
789778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
790778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg1 must be open file");
791778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
792778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
793778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
794778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
795778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int itemsize = self->ob_descr->itemsize;
796778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int nread;
797778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
798778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
799778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
800778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
801778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
802778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
803778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
804778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		nread = fread(item + (self->ob_size - n) * itemsize,
805778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			      itemsize, n, fp);
806778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (nread < n) {
807778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_size -= (n - nread);
808778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			RESIZE(item, char, self->ob_size*itemsize);
809778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_item = item;
810778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_setstr(EOFError, "not enough items in file");
811778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
812778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
813778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
814778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
815778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
816778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
817778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
818778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
819e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_tofile(self, args)
820778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
821778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
822778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
823778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *f;
824778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
825778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &f))
826778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
827778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fp = getfilefile(f);
828778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
829778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg must be open file");
830778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
831778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
832778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 0) {
833778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (fwrite(self->ob_item, self->ob_descr->itemsize,
834778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   self->ob_size, fp) != self->ob_size) {
835778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_errno(IOError);
836778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			clearerr(fp);
837778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
838778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
839778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
840778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
841778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
842778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
843778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
844778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
845778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromlist(self, args)
846778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
847778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
848778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
849778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
850778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *list;
851778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
852778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &list))
853778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
854778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_listobject(list)) {
855778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg must be list");
856778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
857778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
858778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = getlistsize(list);
859778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
860778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
861778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int i;
862778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
863778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
864778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
865778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
866778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
867778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
868778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
869778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (i = 0; i < n; i++) {
870778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			object *v = getlistitem(list, i);
871778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if ((*self->ob_descr->setitem)(self,
872778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					self->ob_size - n + i, v) != 0) {
873778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_size -= n;
874778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				RESIZE(item, char, self->ob_size * itemsize);
875778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_item = item;
876778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
877778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
878778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
879778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
880778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
881778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
882778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
883778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
884778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
885778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tolist(self, args)
886778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
887778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
888778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
889778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *list = newlistobject(self->ob_size);
890778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
891778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (list == NULL)
892778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
893778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
894778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		object *v = getarrayitem((object *)self, i);
895778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (v == NULL) {
896778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			DECREF(list);
897778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
898778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
899778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		setlistitem(list, i, v);
900778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
901778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return list;
902778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
903778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
904778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
905778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromstring(self, args)
906778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
907778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
908778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
909778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *str;
910778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
911778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
912778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "s#", &str, &n))
913778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
914778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n % itemsize != 0) {
915778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(ValueError,
916778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "string length not a multiple of item size");
917778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
918778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
919778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = n / itemsize;
920778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
921778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
922778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
923778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
924778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
926778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
927778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
928778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
929778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + (self->ob_size - n) * itemsize, str, itemsize*n);
930778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
931778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
932778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
933778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
934778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
935778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
936778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tostring(self, args)
937778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
938778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
939778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
940778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, ""))
941778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
942778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newsizedstringobject(self->ob_item,
943778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				    self->ob_size * self->ob_descr->itemsize);
944778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
945778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
946778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic struct methodlist array_methods[] = {
947b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"append",	(method)array_append},
948b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"byteswap",	(method)array_byteswap},
949b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"count",	(method)array_count},*/
950b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"fromfile",	(method)array_fromfile},
951b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"fromlist",	(method)array_fromlist},
952b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"fromstring",	(method)array_fromstring},
953b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"index",	(method)array_index},*/
954b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"insert",	(method)array_insert},
955b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"read",	(method)array_fromfile},
956b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"remove",	(method)array_remove},*/
957b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"reverse",	(method)array_reverse},
958b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"sort",	(method)array_sort},*/
959b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"tofile",	(method)array_tofile},
960b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"tolist",	(method)array_tolist},
961b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"tostring",	(method)array_tostring},
962b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"write",	(method)array_tofile},
963778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
964778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
965778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
966778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
967778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_getattr(a, name)
968778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
969778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *name;
970778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
971778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "typecode") == 0) {
972778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char tc = a->ob_descr->typecode;
973778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newsizedstringobject(&tc, 1);
974778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
975778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "itemsize") == 0) {
976778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newintobject((long)a->ob_descr->itemsize);
977778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
978a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum	if (strcmp(name, "__members__") == 0) {
979a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		object *list = newlistobject(2);
980a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		if (list) {
981a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			setlistitem(list, 0, newstringobject("typecode"));
982a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			setlistitem(list, 1, newstringobject("itemsize"));
983a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			if (err_occurred()) {
984a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum				DECREF(list);
985a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum				list = NULL;
986a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			}
987a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		}
988a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		return list;
989a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum	}
990778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return findmethod(array_methods, (object *)a, name);
991778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
992778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
993778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
994778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_print(a, fp, flags)
995778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
996778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
997778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int flags;
998778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
999778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ok = 0;
1000778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1001778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
1002778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1003778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1004778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('%c')", a->ob_descr->typecode);
1005778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1006778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1007778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1008778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('c', ");
1009778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = array_tostring(a, (object *)NULL);
1010a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		ok = printobject(v, fp, 0);
1011778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1012778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, ")");
1013778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1014778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1015778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1016778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && ok == 0; i++) {
1017778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (i > 0)
1018778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			fprintf(fp, ", ");
1019778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
1020a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		ok = printobject(v, fp, 0);
1021778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1022778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1023778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "])");
1024778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ok;
1025778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1026778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1027778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
1028778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repr(a)
1029778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1030778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1031778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char buf[256];
1032778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *s, *t, *comma, *v;
1033778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1034778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1035778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1036778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('%c')", a->ob_descr->typecode);
1037778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newstringobject(buf);
1038778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1039778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1040778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('c', ");
1041778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		s = newstringobject(buf);
1042778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = array_tostring(a, (object *)NULL);
1043778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = reprobject(v);
1044778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1045b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		joinstring_decref(&s, t);
1046b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		joinstring_decref(&s, newstringobject(")"));
1047778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return s;
1048778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1049778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sprintf(buf, "array('%c', [", a->ob_descr->typecode);
1050778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	s = newstringobject(buf);
1051778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	comma = newstringobject(", ");
1052778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && !err_occurred(); i++) {
1053b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		if (i > 0)
1054b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum			joinstring(&s, comma);
1055778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
1056778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = reprobject(v);
1057778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1058b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		joinstring_decref(&s, t);
1059778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1060778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	XDECREF(comma);
1061b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	joinstring_decref(&s, newstringobject("])"));
1062778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return s;
1063778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1064778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1065778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic sequence_methods array_as_sequence = {
1066b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(inquiry)array_length,			/*sq_length*/
1067b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(binaryfunc)array_concat,		/*sq_concat*/
1068b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intargfunc)array_repeat,		/*sq_repeat*/
1069b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intargfunc)array_item,			/*sq_item*/
1070b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intintargfunc)array_slice,		/*sq_slice*/
1071b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intobjargproc)array_ass_item,		/*sq_ass_item*/
1072b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intintobjargproc)array_ass_slice,	/*sq_ass_slice*/
1073778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1074778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1075b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossumstatic typeobject Arraytype = {
1076778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	OB_HEAD_INIT(&Typetype)
1077778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1078778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	"array",
1079778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sizeof(arrayobject),
1080778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1081b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(destructor)array_dealloc,	/*tp_dealloc*/
1082b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(printfunc)array_print,		/*tp_print*/
1083b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(getattrfunc)array_getattr,	/*tp_getattr*/
1084b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_setattr*/
1085b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(cmpfunc)array_compare,		/*tp_compare*/
1086b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(reprfunc)array_repr,		/*tp_repr*/
1087b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_as_number*/
1088b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	&array_as_sequence,		/*tp_as_sequence*/
1089b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_as_mapping*/
1090778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1091778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1092778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1093778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
1094778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuma_array(self, args)
1095778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *self;
1096778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
1097778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1098778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char c;
1099778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *initial = NULL;
1100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
1101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "c", &c)) {
1102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_clear();
1103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (!getargs(args, "(cO)", &c, &initial))
1104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (!is_listobject(initial) && !is_stringobject(initial)) {
1106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_setstr(TypeError,
1107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				   "array initializer must be list or string");
1108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (descr = descriptors; descr->typecode != '\0'; descr++) {
1112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (descr->typecode == c) {
1113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			object *a;
1114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int len;
1115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (initial == NULL || !is_listobject(initial))
1116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = 0;
1117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			else
1118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = getlistsize(initial);
1119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			a = newarrayobject(len, descr);
1120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (a == NULL)
1121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
1122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (len > 0) {
1123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				int i;
1124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				for (i = 0; i < len; i++) {
1125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					object *v = getlistitem(initial, i);
1126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					if (setarrayitem(a, i, v) != 0) {
1127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						DECREF(a);
1128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						return NULL;
1129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					}
1130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (initial != NULL && is_stringobject(initial)) {
1133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				object *v =
1134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				  array_fromstring((arrayobject *)a, initial);
1135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				if (v == NULL) {
1136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					DECREF(a);
1137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					return NULL;
1138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				DECREF(v);
1140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return a;
1142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "bad typecode (must be c, b, h, l, f or d)");
1145778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
1146778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1147778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1148778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic struct methodlist a_methods[] = {
1149778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"array",	a_array},
1150778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
1151778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1152778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1153778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumvoid
1154778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminitarray()
1155778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1156778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	initmodule("array", a_methods);
1157778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1158