arraymodule.c revision d266eb460e20ded087d01a29da0a230e235afc40
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
37778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "allobjects.h"
38778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "modsupport.h"
39778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "ceval.h"
400c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#ifdef STDC_HEADERS
410c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#include <stddef.h>
420c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#else
43b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum#include <sys/types.h>		/* For size_t */
440c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#endif
45778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
46778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arrayobject; /* Forward */
47778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
48778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arraydescr {
49778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int typecode;
50778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize;
51778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object * (*getitem) FPROTO((struct arrayobject *, int));
52778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int (*setitem) FPROTO((struct arrayobject *, int, object *));
53778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
54778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
55778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypedef struct arrayobject {
56778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	OB_VARHEAD
57778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *ob_item;
58778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *ob_descr;
59778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} arrayobject;
60778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
61b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossumstaticforward typeobject Arraytype;
62778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
63778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
64778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
65b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
66cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic object *newarrayobject PROTO((int, struct arraydescr *));
67cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic int getarraysize PROTO((object *));
68cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic object *getarrayitem PROTO((object *, int));
69b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossumstatic int setarrayitem PROTO((object *, int, object *));
70cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic int insarrayitem PROTO((object *, int, object *));
71cd938fc5a1ba4a61959460787eb549ff989ca6b0Guido van Rossumstatic int addarrayitem PROTO((object *, object *));
72778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
73778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
74778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_getitem(ap, i)
75778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
76778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
77778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
78778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newsizedstringobject(&((char *)ap->ob_item)[i], 1);
79778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
80778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
81778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
82778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_setitem(ap, i, v)
83778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
84778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
85778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
86778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
87778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
88778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "c;array item must be char", &x))
89778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
90778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
91778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
92778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
93778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
94778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
95778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
96778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_getitem(ap, i)
97778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
98778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
99778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x = ((char *)ap->ob_item)[i];
101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (x >= 128)
102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		x -= 256;
103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject(x);
104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_setitem(ap, i, v)
108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "b;array item must be integer", &x))
114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_getitem(ap, i)
122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject((long) ((short *)ap->ob_item)[i]);
126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_setitem(ap, i, v)
130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	short x;
135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "h;array item must be integer", &x))
136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((short *)ap->ob_item)[i] = x;
139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
143e77a757094f68351f336044654cd91575c677896Guido van Rossumi_getitem(ap, i)
144e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
145e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
146e77a757094f68351f336044654cd91575c677896Guido van Rossum{
147e77a757094f68351f336044654cd91575c677896Guido van Rossum	return newintobject((long) ((int *)ap->ob_item)[i]);
148e77a757094f68351f336044654cd91575c677896Guido van Rossum}
149e77a757094f68351f336044654cd91575c677896Guido van Rossum
150e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic int
151e77a757094f68351f336044654cd91575c677896Guido van Rossumi_setitem(ap, i, v)
152e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
153e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
154e77a757094f68351f336044654cd91575c677896Guido van Rossum	object *v;
155e77a757094f68351f336044654cd91575c677896Guido van Rossum{
156e77a757094f68351f336044654cd91575c677896Guido van Rossum	int x;
157e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (!getargs(v, "i;array item must be integer", &x))
158e77a757094f68351f336044654cd91575c677896Guido van Rossum		return -1;
159e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (i >= 0)
160e77a757094f68351f336044654cd91575c677896Guido van Rossum		     ((int *)ap->ob_item)[i] = x;
161e77a757094f68351f336044654cd91575c677896Guido van Rossum	return 0;
162e77a757094f68351f336044654cd91575c677896Guido van Rossum}
163e77a757094f68351f336044654cd91575c677896Guido van Rossum
164e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic object *
165778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_getitem(ap, i)
166778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
167778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
168778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject(((long *)ap->ob_item)[i]);
170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_setitem(ap, i, v)
174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x;
179778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "l;array item must be integer", &x))
180778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
181778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
182778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((long *)ap->ob_item)[i] = x;
183778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
185778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
186778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
187778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_getitem(ap, i)
188778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
189778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
190778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
191778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newfloatobject((double) ((float *)ap->ob_item)[i]);
192778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
194778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
195778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_setitem(ap, i, v)
196778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
197778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
198778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
199778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
200778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	float x;
201778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "f;array item must be float", &x))
202778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
204778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((float *)ap->ob_item)[i] = x;
205778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
208778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
209778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_getitem(ap, i)
210778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
211778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
212778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
213778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newfloatobject(((double *)ap->ob_item)[i]);
214778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
216778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
217778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_setitem(ap, i, v)
218778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
219778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
220778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
221778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
222778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	double x;
223778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "d;array item must be float", &x))
224778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
225778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
226778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((double *)ap->ob_item)[i] = x;
227778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
228778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
229778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
230778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Description of types */
231234f942aefb779efa6cfb7225e21d16a3f7e80f7Guido van Rossumstatic struct arraydescr descriptors[] = {
232778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'c', sizeof(char), c_getitem, c_setitem},
233778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'b', sizeof(char), b_getitem, b_setitem},
234778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'h', sizeof(short), h_getitem, h_setitem},
235e77a757094f68351f336044654cd91575c677896Guido van Rossum	{'i', sizeof(int), i_getitem, i_setitem},
236778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'l', sizeof(long), l_getitem, l_setitem},
237778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'f', sizeof(float), f_getitem, f_setitem},
238778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'d', sizeof(double), d_getitem, d_setitem},
239778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'\0', 0, 0, 0} /* Sentinel */
240778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
241e77a757094f68351f336044654cd91575c677896Guido van Rossum/* If we ever allow items larger than double, we must change reverse()! */
242778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
243778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
24462de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic object *
245778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumnewarrayobject(size, descr)
246778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
247778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
248778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
249778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
250b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	size_t nbytes;
251778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size < 0) {
252778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
253778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
254778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
255778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = size * descr->itemsize;
256778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	/* Check for overflow */
257778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (nbytes / descr->itemsize != size) {
258778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return err_nomem();
259778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
260e77a757094f68351f336044654cd91575c677896Guido van Rossum	op = NEW(arrayobject, 1);
261778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op == NULL) {
262778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return err_nomem();
263778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
264778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size <= 0) {
265778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		op->ob_item = NULL;
266778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
267778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
268e77a757094f68351f336044654cd91575c677896Guido van Rossum		op->ob_item = NEW(char, nbytes);
269778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (op->ob_item == NULL) {
270e77a757094f68351f336044654cd91575c677896Guido van Rossum			DEL(op);
271778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return err_nomem();
272778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
273778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
274778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_type = &Arraytype;
275778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_size = size;
276778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_descr = descr;
277a9c3c22c33762699b362e7598268442fd2df9eb6Sjoerd Mullender	NEWREF(op);
278778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *) op;
279778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
280778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
28162de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
282778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarraysize(op)
283778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
284778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
285778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
286778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
287778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
288778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
289778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ((arrayobject *)op) -> ob_size;
290778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
291778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
29262de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic object *
293778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarrayitem(op, i)
294778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
295778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
296778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
297778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	register arrayobject *ap;
298778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
299778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
300778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
301778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
302778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	ap = (arrayobject *)op;
303778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= ap->ob_size) {
304778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array index out of range");
305778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
306778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
307778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*ap->ob_descr->getitem)(ap, i);
308778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
309778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
310778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
311778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins1(self, where, v)
312778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
313778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
314778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
315778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
316778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *items;
317778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL) {
318778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
319778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
320778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
321778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if ((*self->ob_descr->setitem)(self, -1, v) < 0)
322778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
323778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	items = self->ob_item;
324778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	RESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
325778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (items == NULL) {
326778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_nomem();
327778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
328778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
329778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where < 0)
330778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = 0;
331778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where > self->ob_size)
332778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = self->ob_size;
333778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memmove(items + (where+1)*self->ob_descr->itemsize,
334778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		items + where*self->ob_descr->itemsize,
335778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(self->ob_size-where)*self->ob_descr->itemsize);
336778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_item = items;
337778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_size++;
338778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*self->ob_descr->setitem)(self, where, v);
339778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
340778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
34162de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
342778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminsarrayitem(op, where, newitem)
343778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
344778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
345778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *newitem;
346778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
347778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
348778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
349778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
350778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
351778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op, where, newitem);
352778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
353778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
35462de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int
355778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumaddarrayitem(op, newitem)
356778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
357778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *newitem;
358778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
359778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
360778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
361778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
362778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
363778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op,
364778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(int) ((arrayobject *)op)->ob_size, newitem);
365778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
366778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
367778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Methods */
368778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
369778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic void
370778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_dealloc(op)
371778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
372778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
373778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op->ob_item != NULL)
374e77a757094f68351f336044654cd91575c677896Guido van Rossum		DEL(op->ob_item);
375e77a757094f68351f336044654cd91575c677896Guido van Rossum	DEL(op);
376778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
378778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
379778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_compare(v, w)
380778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *v, *w;
381778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
382778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
383778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
384778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len; i++) {
385778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		object *ai, *bi;
386778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int cmp;
387778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ai = getarrayitem((object *)v, i);
388778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		bi = getarrayitem((object *)w, i);
389778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (ai && bi)
390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = cmpobject(ai, bi);
391778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		else
392778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = -1;
393778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(ai);
394778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(bi);
395778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmp != 0) {
396778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_clear(); /* XXX Can't report errors here */
397778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return cmp;
398778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
399778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
400778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return v->ob_size - w->ob_size;
401778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
402778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
403778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
404778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_length(a)
405778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
406778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
407778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return a->ob_size;
408778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
409778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
410778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
411778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_item(a, i)
412778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
413778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
415778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
416778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array index out of range");
417778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
418778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
419778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return getarrayitem((object *)a, i);
420778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
421778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
422778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
423778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_slice(a, ilow, ihigh)
424778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
425778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
426778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
427778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
428778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
429778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
430778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
431778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
432778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
433778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
434778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
435778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
436778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
437778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
438778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
439778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
440778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
441778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
442778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	       (ihigh-ilow) * a->ob_descr->itemsize);
443778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *)np;
444778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
445778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
446778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
447778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_concat(a, bb)
448778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
449778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *bb;
450778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
451778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
452778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
453778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(bb)) {
454778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
455778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
456778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
457778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb)
458778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr != b->ob_descr) {
459778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
460778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
461778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
462778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size + b->ob_size;
463778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
464778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL) {
465778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
466778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
467778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
468778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
46932be3a7a88fd2aae37cdd250f547c0687312c152Guido van Rossum	       b->ob_item, b->ob_size*b->ob_descr->itemsize);
470778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *)np;
471778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
472778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
473778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
474778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
475778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repeat(a, n)
476778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
477778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
478778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
4793bbc62e9c25d4c006cd21d6b1314ccf0ba211382Guido van Rossum	int i;
480778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
481778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
482778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
483778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int nbytes;
484778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n < 0)
485778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
486778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size * n;
487778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
488778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
489778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
490778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	p = np->ob_item;
491778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = a->ob_size * a->ob_descr->itemsize;
492778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < n; i++) {
493778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(p, a->ob_item, nbytes);
494778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		p += nbytes;
495778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
496778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *) np;
497778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
498778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
499778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
500778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_slice(a, ilow, ihigh, v)
501778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
502778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
503778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
504778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
505778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *item;
506778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n; /* Size of replacement array */
507778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int d; /* Change in size */
508778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v)
509778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
510778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
511778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (is_arrayobject(v)) {
512778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = b->ob_size;
513778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (a == b) {
514778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			/* Special case "a[i:j] = a" -- copy b first */
515778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int ret;
516778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			v = array_slice(b, 0, n);
517778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			ret = array_ass_slice(a, ilow, ihigh, v);
518778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			DECREF(v);
519778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return ret;
520778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
521778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (b->ob_descr != a->ob_descr) {
522778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_badarg();
523778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
524778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
525778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
526778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
527778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
528778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
529778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
530778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
531778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
532778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
533778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
534778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
535778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
536778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
537778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
538778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
539778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
540778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	item = a->ob_item;
541778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	d = n - (ihigh-ilow);
542778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (d < 0) { /* Delete -d items */
543778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
544778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
545778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
546778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
547778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
548778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						/* Can't fail */
549778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
550778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
551778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (d > 0) { /* Insert d items */
552778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (a->ob_size + d)*a->ob_descr->itemsize);
553778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
554778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
555778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
556778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
557778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
558778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
559778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
560778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
561778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
562778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
563778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0)
564778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
565778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		       n*b->ob_descr->itemsize);
566778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
567778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
568778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
569778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
570778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
571778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_item(a, i, v)
572778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
573778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
574778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
575778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
576778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
577778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array assignment index out of range");
578778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
579778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
580778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
581778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return array_ass_slice(a, i, i+1, v);
582778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*a->ob_descr->setitem)(a, i, v);
583778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
584778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
585778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
586778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsetarrayitem(a, i, v)
587778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *a;
588778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
589778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
590778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
591778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(a)) {
592778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
593778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
594778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
595778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return array_ass_item((arrayobject *)a, i, v);
596778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
597778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
598778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
599778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins(self, where, v)
600778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
601778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
602778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
603778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
604778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ins1(self, where, v) != 0)
605778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
606778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
607778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
608778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
609778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
610778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
611778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_insert(self, args)
612778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
613778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
614778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
615778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
616778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
617778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "(iO)", &i, &v))
618778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
619778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, i, v);
620778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
621778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
622778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
623778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_append(self, args)
624778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
625778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
626778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
627778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
628778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &v))
629778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
630778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, (int) self->ob_size, v);
631778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
632778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
633778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
634778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_byteswap(self, args)
635778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
636778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
637778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
638778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
639778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
640778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	switch (self->ob_descr->itemsize) {
641778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 1:
642778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
643778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 2:
644778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
645778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
646778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[1];
647778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p0;
648778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
649778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
650778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 4:
651778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
653778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p1 = p[1];
654778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[3];
655778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p[2];
656778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[2] = p1;
657778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[3] = p0;
658778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
659778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
660e77a757094f68351f336044654cd91575c677896Guido van Rossum	case 8:
661e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
662e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p0 = p[0];
663e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p1 = p[1];
664e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p2 = p[2];
665e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p3 = p[3];
666e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[0] = p[7];
667e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[1] = p[6];
668e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[2] = p[5];
669e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[3] = p[4];
670e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[4] = p3;
671e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[5] = p2;
672e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[6] = p1;
673e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[7] = p0;
674e77a757094f68351f336044654cd91575c677896Guido van Rossum		}
675e77a757094f68351f336044654cd91575c677896Guido van Rossum		break;
676778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	default:
677778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(RuntimeError,
678778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "don't know how to byteswap this array type");
679778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
680778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
681778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
682778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
683778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
684778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
685778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
686778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_reverse(self, args)
687778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
688778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
689778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
690e77a757094f68351f336044654cd91575c677896Guido van Rossum	register int itemsize = self->ob_descr->itemsize;
691e77a757094f68351f336044654cd91575c677896Guido van Rossum	register char *p, *q;
692e77a757094f68351f336044654cd91575c677896Guido van Rossum	char tmp[sizeof(double)]; /* Assume that's the max item size */
693e77a757094f68351f336044654cd91575c677896Guido van Rossum
694778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args != NULL) {
695778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
696778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
697778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
698778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
699778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 1) {
700e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item,
701e77a757094f68351f336044654cd91575c677896Guido van Rossum		     q = self->ob_item + (self->ob_size - 1)*itemsize;
702e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p < q;
703e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p += itemsize, q -= itemsize) {
704e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(tmp, p, itemsize);
705e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(p, q, itemsize);
706e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(q, tmp, itemsize);
707778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
708778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
709778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
710778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
711778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
712778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
713e77a757094f68351f336044654cd91575c677896Guido van Rossum
714e77a757094f68351f336044654cd91575c677896Guido van Rossum/* The following routines were adapted from listobject.c but not converted.
715e77a757094f68351f336044654cd91575c677896Guido van Rossum   To make them work you will have to work! */
716778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
717778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
718778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
719778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_index(self, args)
720778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
721778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
722778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
723778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
724778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
725778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
726778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
727778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
728778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
729778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
730778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0)
731778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return newintobject((long)i);
732778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
733778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "array.index(x): x not in array");
734778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
735778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
736778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
737778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
738778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
739778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
740778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_count(self, args)
741778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
742778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
743778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
744778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int count = 0;
745778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
746778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
747778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
748778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
749778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
750778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
751778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
752778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0)
753778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			count++;
754778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
755778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject((long)count);
756778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
757778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
758778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
759778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
760778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
761778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_remove(self, args)
762778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
763778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
764778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
765778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
766778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
767778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
768778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
769778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
770778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
771778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
772778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0) {
773778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (array_ass_slice(self, i, i+1, (object *)NULL) != 0)
774778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
775778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			INCREF(None);
776778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return None;
777778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
778778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
779778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
780778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "array.remove(x): x not in array");
781778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
782778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
783778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
784778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
785778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
786e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_fromfile(self, args)
787778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
788778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
789778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
790778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *f;
791778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
792778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
793778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "(Oi)", &f, &n))
794778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
795778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fp = getfilefile(f);
796778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
797778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg1 must be open file");
798778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
799778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
800778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
801778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
802778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int itemsize = self->ob_descr->itemsize;
803778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int nread;
804778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
805778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
806778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
807778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
808778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
809778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
810778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
811778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		nread = fread(item + (self->ob_size - n) * itemsize,
812778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			      itemsize, n, fp);
813778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (nread < n) {
814778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_size -= (n - nread);
815778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			RESIZE(item, char, self->ob_size*itemsize);
816778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_item = item;
817778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_setstr(EOFError, "not enough items in file");
818778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
819778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
820778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
821778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
822778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
823778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
824778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
825778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
826e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_tofile(self, args)
827778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
828778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
829778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
830778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *f;
831778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
832778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &f))
833778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
834778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fp = getfilefile(f);
835778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
836778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg must be open file");
837778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
838778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
839778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 0) {
840778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (fwrite(self->ob_item, self->ob_descr->itemsize,
841778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   self->ob_size, fp) != self->ob_size) {
842778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_errno(IOError);
843778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			clearerr(fp);
844778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
845778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
846778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
847778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
848778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
849778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
850778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
851778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
852778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromlist(self, args)
853778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
854778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
855778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
856778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
857778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *list;
858778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
859778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &list))
860778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
861778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_listobject(list)) {
862778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg must be list");
863778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
864778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
865778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = getlistsize(list);
866778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
867778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
868778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int i;
869778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
870778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
871778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
872778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
873778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
874778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
875778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
876778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (i = 0; i < n; i++) {
877778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			object *v = getlistitem(list, i);
878778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if ((*self->ob_descr->setitem)(self,
879778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					self->ob_size - n + i, v) != 0) {
880778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_size -= n;
881778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				RESIZE(item, char, self->ob_size * itemsize);
882778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_item = item;
883778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
884778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
885778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
886778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
887778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
888778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
889778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
890778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
891778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
892778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tolist(self, args)
893778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
894778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
895778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
896778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *list = newlistobject(self->ob_size);
897778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
898778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (list == NULL)
899778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
900778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
901778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		object *v = getarrayitem((object *)self, i);
902778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (v == NULL) {
903778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			DECREF(list);
904778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
905778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
906778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		setlistitem(list, i, v);
907778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
908778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return list;
909778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
910778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
911778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
912778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromstring(self, args)
913778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
914778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
915778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
916778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *str;
917778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
918778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
919778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "s#", &str, &n))
920778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
921778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n % itemsize != 0) {
922778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(ValueError,
923778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "string length not a multiple of item size");
924778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
926778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = n / itemsize;
927778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
928778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
929778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
930778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
931778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
932778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
933778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
934778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
935778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
936778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + (self->ob_size - n) * itemsize, str, itemsize*n);
937778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
938778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
939778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
940778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
941778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
942778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
943778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tostring(self, args)
944778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
945778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
946778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
947778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, ""))
948778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
949778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newsizedstringobject(self->ob_item,
950778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				    self->ob_size * self->ob_descr->itemsize);
951778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
952778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
953778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic struct methodlist array_methods[] = {
954b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"append",	(method)array_append},
955b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"byteswap",	(method)array_byteswap},
956b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"count",	(method)array_count},*/
957b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"fromfile",	(method)array_fromfile},
958b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"fromlist",	(method)array_fromlist},
959b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"fromstring",	(method)array_fromstring},
960b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"index",	(method)array_index},*/
961b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"insert",	(method)array_insert},
962b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"read",	(method)array_fromfile},
963b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"remove",	(method)array_remove},*/
964b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"reverse",	(method)array_reverse},
965b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/*	{"sort",	(method)array_sort},*/
966b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"tofile",	(method)array_tofile},
967b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"tolist",	(method)array_tolist},
968b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"tostring",	(method)array_tostring},
969b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	{"write",	(method)array_tofile},
970778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
971778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
972778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
973778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
974778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_getattr(a, name)
975778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
976778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *name;
977778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
978778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "typecode") == 0) {
979778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char tc = a->ob_descr->typecode;
980778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newsizedstringobject(&tc, 1);
981778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
982778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "itemsize") == 0) {
983778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newintobject((long)a->ob_descr->itemsize);
984778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
985a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum	if (strcmp(name, "__members__") == 0) {
986a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		object *list = newlistobject(2);
987a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		if (list) {
988a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			setlistitem(list, 0, newstringobject("typecode"));
989a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			setlistitem(list, 1, newstringobject("itemsize"));
990a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			if (err_occurred()) {
991a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum				DECREF(list);
992a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum				list = NULL;
993a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum			}
994a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		}
995a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		return list;
996a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum	}
997778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return findmethod(array_methods, (object *)a, name);
998778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
999778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1000778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
1001778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_print(a, fp, flags)
1002778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1003778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
1004778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int flags;
1005778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1006778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ok = 0;
1007778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1008778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
1009778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1010778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1011778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('%c')", a->ob_descr->typecode);
1012778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1013778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1014778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1015778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('c', ");
1016778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = array_tostring(a, (object *)NULL);
1017a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		ok = printobject(v, fp, 0);
1018778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1019778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, ")");
1020778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1021778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1022778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1023778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && ok == 0; i++) {
1024778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (i > 0)
1025778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			fprintf(fp, ", ");
1026778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
1027a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum		ok = printobject(v, fp, 0);
1028778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1029778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1030778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "])");
1031778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ok;
1032778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1033778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1034778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
1035778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repr(a)
1036778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1037778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1038778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char buf[256];
1039778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *s, *t, *comma, *v;
1040778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1041778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1042778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1043778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('%c')", a->ob_descr->typecode);
1044778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newstringobject(buf);
1045778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1046778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1047778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('c', ");
1048778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		s = newstringobject(buf);
1049778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = array_tostring(a, (object *)NULL);
1050778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = reprobject(v);
1051778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1052b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		joinstring_decref(&s, t);
1053b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		joinstring_decref(&s, newstringobject(")"));
1054778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return s;
1055778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1056778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sprintf(buf, "array('%c', [", a->ob_descr->typecode);
1057778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	s = newstringobject(buf);
1058778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	comma = newstringobject(", ");
1059778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && !err_occurred(); i++) {
1060b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		if (i > 0)
1061b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum			joinstring(&s, comma);
1062778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
1063778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = reprobject(v);
1064778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1065b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum		joinstring_decref(&s, t);
1066778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1067778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	XDECREF(comma);
1068b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	joinstring_decref(&s, newstringobject("])"));
1069778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return s;
1070778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1071778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1072778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic sequence_methods array_as_sequence = {
1073b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(inquiry)array_length,			/*sq_length*/
1074b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(binaryfunc)array_concat,		/*sq_concat*/
1075b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intargfunc)array_repeat,		/*sq_repeat*/
1076b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intargfunc)array_item,			/*sq_item*/
1077b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intintargfunc)array_slice,		/*sq_slice*/
1078b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intobjargproc)array_ass_item,		/*sq_ass_item*/
1079b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(intintobjargproc)array_ass_slice,	/*sq_ass_slice*/
1080778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1081778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1082a320fd308c9c8ac4775f83d2b8edb9af90192741Guido van Rossumstatichere typeobject Arraytype = {
1083778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	OB_HEAD_INIT(&Typetype)
1084778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1085778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	"array",
1086778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sizeof(arrayobject),
1087778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1088b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(destructor)array_dealloc,	/*tp_dealloc*/
1089b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(printfunc)array_print,		/*tp_print*/
1090b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(getattrfunc)array_getattr,	/*tp_getattr*/
1091b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_setattr*/
1092b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(cmpfunc)array_compare,		/*tp_compare*/
1093b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	(reprfunc)array_repr,		/*tp_repr*/
1094b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_as_number*/
1095b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	&array_as_sequence,		/*tp_as_sequence*/
1096b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum	0,				/*tp_as_mapping*/
1097778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1098778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1099778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
1101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuma_array(self, args)
1102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *self;
1103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
1104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char c;
1106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *initial = NULL;
1107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
1108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "c", &c)) {
1109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_clear();
1110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (!getargs(args, "(cO)", &c, &initial))
1111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (!is_listobject(initial) && !is_stringobject(initial)) {
1113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_setstr(TypeError,
1114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				   "array initializer must be list or string");
1115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (descr = descriptors; descr->typecode != '\0'; descr++) {
1119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (descr->typecode == c) {
1120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			object *a;
1121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int len;
1122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (initial == NULL || !is_listobject(initial))
1123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = 0;
1124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			else
1125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = getlistsize(initial);
1126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			a = newarrayobject(len, descr);
1127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (a == NULL)
1128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
1129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (len > 0) {
1130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				int i;
1131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				for (i = 0; i < len; i++) {
1132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					object *v = getlistitem(initial, i);
1133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					if (setarrayitem(a, i, v) != 0) {
1134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						DECREF(a);
1135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						return NULL;
1136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					}
1137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (initial != NULL && is_stringobject(initial)) {
1140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				object *v =
1141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				  array_fromstring((arrayobject *)a, initial);
1142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				if (v == NULL) {
1143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					DECREF(a);
1144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					return NULL;
1145778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1146778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				DECREF(v);
1147778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1148778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return a;
1149778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1150778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1151778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "bad typecode (must be c, b, h, l, f or d)");
1152778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
1153778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1154778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1155778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic struct methodlist a_methods[] = {
1156778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"array",	a_array},
1157778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
1158778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1159778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1160778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumvoid
1161778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminitarray()
1162778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1163778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	initmodule("array", a_methods);
1164778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1165