arraymodule.c revision 32be3a7a88fd2aae37cdd250f547c0687312c152
1778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/***********************************************************
2778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumCopyright 1991, 1992, 1993 by Stichting Mathematisch Centrum,
3778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumAmsterdam, The Netherlands.
4778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
5778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum                        All Rights Reserved
6778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
7778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumPermission to use, copy, modify, and distribute this software and its
8778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumdocumentation for any purpose and without fee is hereby granted,
9778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumprovided that the above copyright notice appear in all copies and that
10778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumboth that copyright notice and this permission notice appear in
11778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsupporting documentation, and that the names of Stichting Mathematisch
12778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumCentrum or CWI not be used in advertising or publicity pertaining to
13778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumdistribution of the software without specific, written prior permission.
14778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
15778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumSTICHTING MATHEMATISCH CENTRUM DISCLAIMS ALL WARRANTIES WITH REGARD TO
16778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumTHIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND
17778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumFITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH CENTRUM BE LIABLE
18778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumFOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
19778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumWHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
20778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
21778983b48165da25ee11fb97f6855af7c67f4ff2Guido van RossumOF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
22778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
23778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum******************************************************************/
24778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
25778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Array object implementation */
26778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
27778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* An array is a uniform list -- all items have the same type.
28778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum   The item type is restricted to simple C types like int or float */
29778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
30778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "allobjects.h"
31778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "modsupport.h"
32778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "ceval.h"
33778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
349575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossum#ifdef i860
359575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossum/* Cray APP doesn't have memmove */
369575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossum#define NEED_MEMMOVE
379575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossumextern char *memcpy();
389575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossum#endif
399575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossum
40778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#ifdef sun
419575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossum/* SunOS doesn't have memmove */
42778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define NEED_MEMMOVE
439575a4457559ed280bdd66e600fbd9f1b54d86d2Guido van Rossumextern char *memcpy();
44778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
45778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
46778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#ifdef NEED_MEMMOVE
47778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern char *memmove();
48778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
49778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
50778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arrayobject; /* Forward */
51778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
52778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arraydescr {
53778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int typecode;
54778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize;
55778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object * (*getitem) FPROTO((struct arrayobject *, int));
56778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int (*setitem) FPROTO((struct arrayobject *, int, object *));
57778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
58778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
59778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypedef struct arrayobject {
60778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	OB_VARHEAD
61778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *ob_item;
62778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *ob_descr;
63778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} arrayobject;
64778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
65778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern typeobject Arraytype;
66778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
67778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
68778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
69b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */
70778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern object *newarrayobject PROTO((int, struct arraydescr *));
71778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern int getarraysize PROTO((object *));
72778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern object *getarrayitem PROTO((object *, int));
73b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossumstatic int setarrayitem PROTO((object *, int, object *));
74778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern int insarrayitem PROTO((object *, int, object *));
75778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumextern int addarrayitem PROTO((object *, object *));
76778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
77778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
78778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_getitem(ap, i)
79778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
80778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
81778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
82778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newsizedstringobject(&((char *)ap->ob_item)[i], 1);
83778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
84778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
85778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
86778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_setitem(ap, i, v)
87778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
88778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
89778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
90778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
91778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
92778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "c;array item must be char", &x))
93778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
94778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
95778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
96778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
97778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
98778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
99778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_getitem(ap, i)
101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x = ((char *)ap->ob_item)[i];
105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (x >= 128)
106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		x -= 256;
107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject(x);
108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_setitem(ap, i, v)
112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char x;
117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "b;array item must be integer", &x))
118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((char *)ap->ob_item)[i] = x;
121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_getitem(ap, i)
126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject((long) ((short *)ap->ob_item)[i]);
130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_setitem(ap, i, v)
134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	short x;
139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "h;array item must be integer", &x))
140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((short *)ap->ob_item)[i] = x;
143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
145778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
146778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
147e77a757094f68351f336044654cd91575c677896Guido van Rossumi_getitem(ap, i)
148e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
149e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
150e77a757094f68351f336044654cd91575c677896Guido van Rossum{
151e77a757094f68351f336044654cd91575c677896Guido van Rossum	return newintobject((long) ((int *)ap->ob_item)[i]);
152e77a757094f68351f336044654cd91575c677896Guido van Rossum}
153e77a757094f68351f336044654cd91575c677896Guido van Rossum
154e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic int
155e77a757094f68351f336044654cd91575c677896Guido van Rossumi_setitem(ap, i, v)
156e77a757094f68351f336044654cd91575c677896Guido van Rossum	arrayobject *ap;
157e77a757094f68351f336044654cd91575c677896Guido van Rossum	int i;
158e77a757094f68351f336044654cd91575c677896Guido van Rossum	object *v;
159e77a757094f68351f336044654cd91575c677896Guido van Rossum{
160e77a757094f68351f336044654cd91575c677896Guido van Rossum	int x;
161e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (!getargs(v, "i;array item must be integer", &x))
162e77a757094f68351f336044654cd91575c677896Guido van Rossum		return -1;
163e77a757094f68351f336044654cd91575c677896Guido van Rossum	if (i >= 0)
164e77a757094f68351f336044654cd91575c677896Guido van Rossum		     ((int *)ap->ob_item)[i] = x;
165e77a757094f68351f336044654cd91575c677896Guido van Rossum	return 0;
166e77a757094f68351f336044654cd91575c677896Guido van Rossum}
167e77a757094f68351f336044654cd91575c677896Guido van Rossum
168e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic object *
169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_getitem(ap, i)
170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject(((long *)ap->ob_item)[i]);
174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_setitem(ap, i, v)
178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
179778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
180778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
181778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
182778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	long x;
183778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "l;array item must be integer", &x))
184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
185778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
186778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((long *)ap->ob_item)[i] = x;
187778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
188778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
189778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
190778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
191778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_getitem(ap, i)
192778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
194778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
195778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newfloatobject((double) ((float *)ap->ob_item)[i]);
196778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
197778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
198778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
199778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_setitem(ap, i, v)
200778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
201778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
202778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
204778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	float x;
205778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "f;array item must be float", &x))
206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
208778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((float *)ap->ob_item)[i] = x;
209778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
210778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
211778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
212778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
213778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_getitem(ap, i)
214778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
216778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
217778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newfloatobject(((double *)ap->ob_item)[i]);
218778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
219778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
220778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
221778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_setitem(ap, i, v)
222778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *ap;
223778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
224778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
225778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
226778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	double x;
227778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(v, "d;array item must be float", &x))
228778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
229778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i >= 0)
230778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		     ((double *)ap->ob_item)[i] = x;
231778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
232778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
233778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
234778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Description of types */
235234f942aefb779efa6cfb7225e21d16a3f7e80f7Guido van Rossumstatic struct arraydescr descriptors[] = {
236778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'c', sizeof(char), c_getitem, c_setitem},
237778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'b', sizeof(char), b_getitem, b_setitem},
238778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'h', sizeof(short), h_getitem, h_setitem},
239e77a757094f68351f336044654cd91575c677896Guido van Rossum	{'i', sizeof(int), i_getitem, i_setitem},
240778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'l', sizeof(long), l_getitem, l_setitem},
241778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'f', sizeof(float), f_getitem, f_setitem},
242778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'d', sizeof(double), d_getitem, d_setitem},
243778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{'\0', 0, 0, 0} /* Sentinel */
244778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
245e77a757094f68351f336044654cd91575c677896Guido van Rossum/* If we ever allow items larger than double, we must change reverse()! */
246778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
247778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
248778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumobject *
249778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumnewarrayobject(size, descr)
250778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
251778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
252778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
253778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
254778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
255778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	MALLARG nbytes;
256778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize;
257778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size < 0) {
258778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
259778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
260778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
261778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = size * descr->itemsize;
262778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	/* Check for overflow */
263778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (nbytes / descr->itemsize != size) {
264778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return err_nomem();
265778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
266e77a757094f68351f336044654cd91575c677896Guido van Rossum	op = NEW(arrayobject, 1);
267778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op == NULL) {
268778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return err_nomem();
269778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
270778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (size <= 0) {
271778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		op->ob_item = NULL;
272778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
273778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
274e77a757094f68351f336044654cd91575c677896Guido van Rossum		op->ob_item = NEW(char, nbytes);
275778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (op->ob_item == NULL) {
276e77a757094f68351f336044654cd91575c677896Guido van Rossum			DEL(op);
277778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return err_nomem();
278778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
279778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
280778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_type = &Arraytype;
281778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_size = size;
282778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	op->ob_descr = descr;
283a9c3c22c33762699b362e7598268442fd2df9eb6Sjoerd Mullender	NEWREF(op);
284778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *) op;
285778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
286778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
287778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumint
288778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarraysize(op)
289778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
290778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
291778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
292778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
293778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
294778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
295778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ((arrayobject *)op) -> ob_size;
296778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
297778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
298778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumobject *
299778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarrayitem(op, i)
300778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
301778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
302778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
303778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	register arrayobject *ap;
304778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
305778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
306778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
307778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
308778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	ap = (arrayobject *)op;
309778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= ap->ob_size) {
310778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array index out of range");
311778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
312778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
313778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*ap->ob_descr->getitem)(ap, i);
314778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
315778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
316778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
317778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins1(self, where, v)
318778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
319778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
320778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
321778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
322778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
323778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *items;
324778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL) {
325778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
326778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
327778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
328778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if ((*self->ob_descr->setitem)(self, -1, v) < 0)
329778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
330778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	items = self->ob_item;
331778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	RESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
332778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (items == NULL) {
333778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_nomem();
334778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
335778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
336778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where < 0)
337778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = 0;
338778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (where > self->ob_size)
339778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		where = self->ob_size;
340778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memmove(items + (where+1)*self->ob_descr->itemsize,
341778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		items + where*self->ob_descr->itemsize,
342778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(self->ob_size-where)*self->ob_descr->itemsize);
343778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_item = items;
344778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	self->ob_size++;
345778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*self->ob_descr->setitem)(self, where, v);
346778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
347778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
348778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumint
349778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminsarrayitem(op, where, newitem)
350778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
351778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
352778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *newitem;
353778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
354778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
355778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
356778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
357778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
358778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op, where, newitem);
359778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
360778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
361778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumint
362778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumaddarrayitem(op, newitem)
363778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *op;
364778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *newitem;
365778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
366778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(op)) {
367778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
368778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
369778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
370778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins1((arrayobject *)op,
371778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		(int) ((arrayobject *)op)->ob_size, newitem);
372778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
373778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
374778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Methods */
375778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
376778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic void
377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_dealloc(op)
378778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *op;
379778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
380778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
381778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (op->ob_item != NULL)
382e77a757094f68351f336044654cd91575c677896Guido van Rossum		DEL(op->ob_item);
383e77a757094f68351f336044654cd91575c677896Guido van Rossum	DEL(op);
384778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
385778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
386778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
387778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_compare(v, w)
388778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *v, *w;
389778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
391778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
392778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len; i++) {
393778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		object *ai, *bi;
394778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int cmp;
395778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ai = getarrayitem((object *)v, i);
396778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		bi = getarrayitem((object *)w, i);
397778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (ai && bi)
398778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = cmpobject(ai, bi);
399778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		else
400778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			cmp = -1;
401778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(ai);
402778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(bi);
403778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmp != 0) {
404778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_clear(); /* XXX Can't report errors here */
405778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return cmp;
406778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
407778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
408778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return v->ob_size - w->ob_size;
409778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
410778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
411778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
412778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_length(a)
413778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
415778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return a->ob_size;
416778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
417778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
418778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
419778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_item(a, i)
420778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
421778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
422778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
423778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
424778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array index out of range");
425778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
426778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
427778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return getarrayitem((object *)a, i);
428778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
429778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
430778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
431778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_slice(a, ilow, ihigh)
432778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
433778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
434778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
435778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
436778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
437778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
438778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
439778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
440778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
441778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
442778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
443778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
444778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
445778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
446778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
447778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
448778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
449778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
450778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
451778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	       (ihigh-ilow) * a->ob_descr->itemsize);
452778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *)np;
453778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
454778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
455778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
456778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_concat(a, bb)
457778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
458778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *bb;
459778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
460778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
461778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
462778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
463778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(bb)) {
464778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
465778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
466778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
467778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb)
468778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr != b->ob_descr) {
469778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
470778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
471778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
472778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size + b->ob_size;
473778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
474778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL) {
475778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
476778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
477778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
478778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
47932be3a7a88fd2aae37cdd250f547c0687312c152Guido van Rossum	       b->ob_item, b->ob_size*b->ob_descr->itemsize);
480778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *)np;
481778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
482778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
483778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
484778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
485778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repeat(a, n)
486778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
487778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
488778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
489778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, j;
490778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int size;
491778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *np;
492778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
493778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int nbytes;
494778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n < 0)
495778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
496778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	size = a->ob_size * n;
497778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	np = (arrayobject *) newarrayobject(size, a->ob_descr);
498778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (np == NULL)
499778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
500778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	p = np->ob_item;
501778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	nbytes = a->ob_size * a->ob_descr->itemsize;
502778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < n; i++) {
503778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(p, a->ob_item, nbytes);
504778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		p += nbytes;
505778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
506778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (object *) np;
507778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
508778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
509778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
510778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_slice(a, ilow, ihigh, v)
511778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
512778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ilow, ihigh;
513778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
514778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
515778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *item;
516778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n; /* Size of replacement array */
517778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int d; /* Change in size */
518778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int k; /* Loop index */
519778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v)
520778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
521778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = 0;
522778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (is_arrayobject(v)) {
523778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		n = b->ob_size;
524778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (a == b) {
525778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			/* Special case "a[i:j] = a" -- copy b first */
526778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int ret;
527778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			v = array_slice(b, 0, n);
528778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			ret = array_ass_slice(a, ilow, ihigh, v);
529778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			DECREF(v);
530778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return ret;
531778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
532778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (b->ob_descr != a->ob_descr) {
533778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_badarg();
534778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
535778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
536778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
537778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else {
538778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
539778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
540778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
541778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ilow < 0)
542778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = 0;
543778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ilow > a->ob_size)
544778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ilow = a->ob_size;
545778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < 0)
546778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = 0;
547778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ihigh < ilow)
548778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = ilow;
549778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (ihigh > a->ob_size)
550778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ihigh = a->ob_size;
551778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	item = a->ob_item;
552778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	d = n - (ihigh-ilow);
553778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (d < 0) { /* Delete -d items */
554778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
555778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
556778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
557778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
558778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
559778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						/* Can't fail */
560778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
561778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
562778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (d > 0) { /* Insert d items */
563778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (a->ob_size + d)*a->ob_descr->itemsize);
564778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
565778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
566778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return -1;
567778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
568778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memmove(item + (ihigh+d)*a->ob_descr->itemsize,
569778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			item + ihigh*a->ob_descr->itemsize,
570778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			(a->ob_size-ihigh)*a->ob_descr->itemsize);
571778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_item = item;
572778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		a->ob_size += d;
573778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
574778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0)
575778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
576778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		       n*b->ob_descr->itemsize);
577778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return 0;
578778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b
579778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
580778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
581778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
582778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_item(a, i, v)
583778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
584778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
585778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
586778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
587778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (i < 0 || i >= a->ob_size) {
588778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(IndexError, "array assignment index out of range");
589778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
590778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
591778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (v == NULL)
592778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return array_ass_slice(a, i, i+1, v);
593778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return (*a->ob_descr->setitem)(a, i, v);
594778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
595778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
596778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
597778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsetarrayitem(a, i, v)
598778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *a;
599778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
600778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
601778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
602778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_arrayobject(a)) {
603778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badcall();
604778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return -1;
605778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
606778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return array_ass_item((arrayobject *)a, i, v);
607778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
608778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
609778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
610778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins(self, where, v)
611778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
612778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int where;
613778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
614778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
615778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (ins1(self, where, v) != 0)
616778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
617778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
618778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
619778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
620778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
621778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
622778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_insert(self, args)
623778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
624778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
625778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
626778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
627778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
628778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "(iO)", &i, &v))
629778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
630778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, i, v);
631778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
632778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
633778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
634778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_append(self, args)
635778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
636778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
637778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
638778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
639778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &v))
640778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
641778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ins(self, (int) self->ob_size, v);
642778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
643778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
644778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
645778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_byteswap(self, args)
646778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
647778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
648778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
649778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *p;
650778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
651778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	switch (self->ob_descr->itemsize) {
652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 1:
653778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
654778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 2:
655778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
656778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
657778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[1];
658778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p0;
659778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
660778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
661778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	case 4:
662778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
663778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p0 = p[0];
664778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			char p1 = p[1];
665778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[0] = p[3];
666778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[1] = p[2];
667778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[2] = p1;
668778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			p[3] = p0;
669778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
670778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		break;
671e77a757094f68351f336044654cd91575c677896Guido van Rossum	case 8:
672e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
673e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p0 = p[0];
674e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p1 = p[1];
675e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p2 = p[2];
676e77a757094f68351f336044654cd91575c677896Guido van Rossum			char p3 = p[3];
677e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[0] = p[7];
678e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[1] = p[6];
679e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[2] = p[5];
680e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[3] = p[4];
681e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[4] = p3;
682e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[5] = p2;
683e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[6] = p1;
684e77a757094f68351f336044654cd91575c677896Guido van Rossum			p[7] = p0;
685e77a757094f68351f336044654cd91575c677896Guido van Rossum		}
686e77a757094f68351f336044654cd91575c677896Guido van Rossum		break;
687778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	default:
688778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(RuntimeError,
689778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "don't know how to byteswap this array type");
690778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
691778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
692778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
693778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
694778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
695778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
696778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
697778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_reverse(self, args)
698778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
699778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
700778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
701e77a757094f68351f336044654cd91575c677896Guido van Rossum	register int itemsize = self->ob_descr->itemsize;
702e77a757094f68351f336044654cd91575c677896Guido van Rossum	register char *p, *q;
703e77a757094f68351f336044654cd91575c677896Guido van Rossum	char tmp[sizeof(double)]; /* Assume that's the max item size */
704e77a757094f68351f336044654cd91575c677896Guido van Rossum
705778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args != NULL) {
706778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
707778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
708778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
709778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
710778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 1) {
711e77a757094f68351f336044654cd91575c677896Guido van Rossum		for (p = self->ob_item,
712e77a757094f68351f336044654cd91575c677896Guido van Rossum		     q = self->ob_item + (self->ob_size - 1)*itemsize;
713e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p < q;
714e77a757094f68351f336044654cd91575c677896Guido van Rossum		     p += itemsize, q -= itemsize) {
715e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(tmp, p, itemsize);
716e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(p, q, itemsize);
717e77a757094f68351f336044654cd91575c677896Guido van Rossum			memmove(q, tmp, itemsize);
718778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
719778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
720778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
721778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
722778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
723778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
724e77a757094f68351f336044654cd91575c677896Guido van Rossum
725e77a757094f68351f336044654cd91575c677896Guido van Rossum/* The following routines were adapted from listobject.c but not converted.
726e77a757094f68351f336044654cd91575c677896Guido van Rossum   To make them work you will have to work! */
727778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
728778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
729778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
730778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_index(self, args)
731778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
732778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
733778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
734778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
735778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
736778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
737778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
738778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
739778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
740778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
741778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0)
742778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return newintobject((long)i);
743778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
744778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "array.index(x): x not in array");
745778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
746778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
747778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
748778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
749778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
750778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
751778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_count(self, args)
752778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
753778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
754778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
755778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int count = 0;
756778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
757778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
758778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
759778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
760778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
761778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
762778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
763778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0)
764778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			count++;
765778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
766778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newintobject((long)count);
767778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
768778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
769778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
770778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0
771778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
772778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_remove(self, args)
773778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
774778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
775778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
776778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
777778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
778778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (args == NULL) {
779778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_badarg();
780778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
781778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
782778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
783778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (cmpobject(self->ob_item[i], args) == 0) {
784778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (array_ass_slice(self, i, i+1, (object *)NULL) != 0)
785778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
786778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			INCREF(None);
787778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return None;
788778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
789778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
790778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
791778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "array.remove(x): x not in array");
792778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
793778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
794778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
795778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
796778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
797e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_fromfile(self, args)
798778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
799778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
800778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
801778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *f;
802778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
803778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
804778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "(Oi)", &f, &n))
805778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
806778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fp = getfilefile(f);
807778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
808778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg1 must be open file");
809778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
810778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
811778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
812778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
813778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int itemsize = self->ob_descr->itemsize;
814778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int nread;
815778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
816778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
817778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
818778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
819778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
820778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
821778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
822778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		nread = fread(item + (self->ob_size - n) * itemsize,
823778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			      itemsize, n, fp);
824778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (nread < n) {
825778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_size -= (n - nread);
826778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			RESIZE(item, char, self->ob_size*itemsize);
827778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			self->ob_item = item;
828778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_setstr(EOFError, "not enough items in file");
829778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
830778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
831778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
832778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
833778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
834778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
835778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
836778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
837e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_tofile(self, args)
838778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
839778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
840778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
841778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *f;
842778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
843778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &f))
844778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
845778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fp = getfilefile(f);
846778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (fp == NULL) {
847778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg must be open file");
848778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
849778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
850778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (self->ob_size > 0) {
851778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (fwrite(self->ob_item, self->ob_descr->itemsize,
852778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   self->ob_size, fp) != self->ob_size) {
853778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_errno(IOError);
854778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			clearerr(fp);
855778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
856778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
857778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
858778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
859778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
860778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
861778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
862778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
863778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromlist(self, args)
864778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
865778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
866778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
867778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
868778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *list;
869778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
870778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "O", &list))
871778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
872778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!is_listobject(list)) {
873778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(TypeError, "arg must be list");
874778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
875778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
876778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = getlistsize(list);
877778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
878778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
879778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		int i;
880778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
881778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
882778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
883778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
884778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
885778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
886778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
887778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		for (i = 0; i < n; i++) {
888778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			object *v = getlistitem(list, i);
889778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if ((*self->ob_descr->setitem)(self,
890778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					self->ob_size - n + i, v) != 0) {
891778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_size -= n;
892778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				RESIZE(item, char, self->ob_size * itemsize);
893778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				self->ob_item = item;
894778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
895778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
896778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
897778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
898778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
899778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
900778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
901778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
902778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
903778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tolist(self, args)
904778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
905778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
906778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
907778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *list = newlistobject(self->ob_size);
908778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i;
909778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (list == NULL)
910778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
911778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < self->ob_size; i++) {
912778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		object *v = getarrayitem((object *)self, i);
913778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (v == NULL) {
914778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			DECREF(list);
915778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
916778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
917778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		setlistitem(list, i, v);
918778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
919778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return list;
920778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
921778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
922778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
923778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromstring(self, args)
924778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
926778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
927778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *str;
928778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
929778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int itemsize = self->ob_descr->itemsize;
930778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "s#", &str, &n))
931778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
932778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n % itemsize != 0) {
933778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_setstr(ValueError,
934778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			   "string length not a multiple of item size");
935778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
936778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
937778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	n = n / itemsize;
938778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n > 0) {
939778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char *item = self->ob_item;
940778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		RESIZE(item, char, (self->ob_size + n) * itemsize);
941778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (item == NULL) {
942778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_nomem();
943778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
944778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
945778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_item = item;
946778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		self->ob_size += n;
947778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		memcpy(item + (self->ob_size - n) * itemsize, str, itemsize*n);
948778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
949778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	INCREF(None);
950778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return None;
951778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
952778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
953778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
954778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tostring(self, args)
955778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *self;
956778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
957778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
958778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, ""))
959778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return NULL;
960778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return newsizedstringobject(self->ob_item,
961778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				    self->ob_size * self->ob_descr->itemsize);
962778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
963778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
964778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic struct methodlist array_methods[] = {
965778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"append",	array_append},
966778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"byteswap",	array_byteswap},
967778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/*	{"count",	array_count},*/
968e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"fromfile",	array_fromfile},
969e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"fromlist",	array_fromlist},
970e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"fromstring",	array_fromstring},
971778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/*	{"index",	array_index},*/
972778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"insert",	array_insert},
973e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"read",	array_fromfile},
974778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/*	{"remove",	array_remove},*/
975e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"reverse",	array_reverse},
976e77a757094f68351f336044654cd91575c677896Guido van Rossum/*	{"sort",	array_sort},*/
977e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"tofile",	array_tofile},
978778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"tolist",	array_tolist},
979778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"tostring",	array_tostring},
980e77a757094f68351f336044654cd91575c677896Guido van Rossum	{"write",	array_tofile},
981778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
982778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
983778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
984778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
985778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_getattr(a, name)
986778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
987778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *name;
988778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
989778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "typecode") == 0) {
990778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		char tc = a->ob_descr->typecode;
991778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newsizedstringobject(&tc, 1);
992778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
993778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (strcmp(name, "itemsize") == 0) {
994778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newintobject((long)a->ob_descr->itemsize);
995778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
996778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return findmethod(array_methods, (object *)a, name);
997778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
998778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
999778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int
1000778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_print(a, fp, flags)
1001778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1002778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	FILE *fp;
1003778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int flags;
1004778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1005778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int ok = 0;
1006778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1007778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *v;
1008778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1009778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1010778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('%c')", a->ob_descr->typecode);
1011778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1012778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1013778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1014778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, "array('c', ");
1015778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = array_tostring(a, (object *)NULL);
1016778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ok = printobject(v, fp, flags);
1017778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1018778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		fprintf(fp, ")");
1019778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return ok;
1020778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1021778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1022778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && ok == 0; i++) {
1023778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (i > 0)
1024778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			fprintf(fp, ", ");
1025778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
1026778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		ok = printobject(v, fp, flags);
1027778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1028778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1029778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	fprintf(fp, "])");
1030778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return ok;
1031778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1032778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1033778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
1034778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repr(a)
1035778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	arrayobject *a;
1036778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1037778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char buf[256];
1038778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *s, *t, *comma, *v;
1039778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int i, len;
1040778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	len = a->ob_size;
1041778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (len == 0) {
1042778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('%c')", a->ob_descr->typecode);
1043778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return newstringobject(buf);
1044778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1045778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (a->ob_descr->typecode == 'c') {
1046778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		sprintf(buf, "array('c', ");
1047778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		s = newstringobject(buf);
1048778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = array_tostring(a, (object *)NULL);
1049778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = reprobject(v);
1050778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1051778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		joinstring(&s, t);
1052778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(t);
1053778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = newstringobject(")");
1054778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		joinstring(&s, t);
1055778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(t);
1056778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (err_occurred()) {
1057778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			XDECREF(s);
1058778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			s = NULL;
1059778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1060778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return s;
1061778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1062778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sprintf(buf, "array('%c', [", a->ob_descr->typecode);
1063778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	s = newstringobject(buf);
1064778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	comma = newstringobject(", ");
1065778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (i = 0; i < len && !err_occurred(); i++) {
1066778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		v = (a->ob_descr->getitem)(a, i);
1067778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		t = reprobject(v);
1068778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(v);
1069778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (i > 0)
1070778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			joinstring(&s, comma);
1071778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		joinstring(&s, t);
1072778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(t);
1073778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1074778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	XDECREF(comma);
1075778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	t = newstringobject("])");
1076778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	joinstring(&s, t);
1077778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	XDECREF(t);
1078778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (err_occurred()) {
1079778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		XDECREF(s);
1080778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		s = NULL;
1081778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1082778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return s;
1083778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1084778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1085778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic sequence_methods array_as_sequence = {
1086778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_length,	/*sq_length*/
1087778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_concat,	/*sq_concat*/
1088778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_repeat,	/*sq_repeat*/
1089778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_item,	/*sq_item*/
1090778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_slice,	/*sq_slice*/
1091778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_ass_item,	/*sq_ass_item*/
1092778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_ass_slice, /*sq_ass_slice*/
1093778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1094778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1095778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypeobject Arraytype = {
1096778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	OB_HEAD_INIT(&Typetype)
1097778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1098778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	"array",
1099778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	sizeof(arrayobject),
1100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,
1101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_dealloc,	/*tp_dealloc*/
1102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_print,	/*tp_print*/
1103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_getattr,	/*tp_getattr*/
1104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,		/*tp_setattr*/
1105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_compare,	/*tp_compare*/
1106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	array_repr,	/*tp_repr*/
1107778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,		/*tp_as_number*/
1108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	&array_as_sequence,	/*tp_as_sequence*/
1109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	0,		/*tp_as_mapping*/
1110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic object *
1114778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuma_array(self, args)
1115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *self;
1116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *args;
1117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char c;
1119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	object *initial = NULL;
1120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	struct arraydescr *descr;
1121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (!getargs(args, "c", &c)) {
1122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		err_clear();
1123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (!getargs(args, "(cO)", &c, &initial))
1124778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (!is_listobject(initial) && !is_stringobject(initial)) {
1126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			err_setstr(TypeError,
1127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				   "array initializer must be list or string");
1128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return NULL;
1129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	for (descr = descriptors; descr->typecode != '\0'; descr++) {
1132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		if (descr->typecode == c) {
1133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			object *a;
1134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			int len;
1135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (initial == NULL || !is_listobject(initial))
1136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = 0;
1137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			else
1138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				len = getlistsize(initial);
1139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			a = newarrayobject(len, descr);
1140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (a == NULL)
1141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				return NULL;
1142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (len > 0) {
1143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				int i;
1144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				for (i = 0; i < len; i++) {
1145778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					object *v = getlistitem(initial, i);
1146778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					if (setarrayitem(a, i, v) != 0) {
1147778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						DECREF(a);
1148778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum						return NULL;
1149778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					}
1150778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1151778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1152778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			if (initial != NULL && is_stringobject(initial)) {
1153778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				object *v =
1154778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				  array_fromstring((arrayobject *)a, initial);
1155778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				if (v == NULL) {
1156778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					DECREF(a);
1157778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum					return NULL;
1158778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				}
1159778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum				DECREF(v);
1160778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			}
1161778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			return a;
1162778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		}
1163778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1164778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	err_setstr(ValueError, "bad typecode (must be c, b, h, l, f or d)");
1165778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return NULL;
1166778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1167778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1168778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic struct methodlist a_methods[] = {
1169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{"array",	a_array},
1170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	{NULL,		NULL}		/* sentinel */
1171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum};
1172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumvoid
1174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminitarray()
1175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	initmodule("array", a_methods);
1177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1179778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1180778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#ifdef NEED_MEMMOVE
1181778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1182778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* A perhaps slow but I hope correct implementation of memmove */
1183778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumchar *memmove(dst, src, n)
1185778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *dst;
1186778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *src;
1187778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	int n;
1188778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{
1189778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	char *realdst = dst;
1190778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (n <= 0)
1191778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return dst;
1192778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (src >= dst+n || dst >= src+n)
1193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		return memcpy(dst, src, n);
1194778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	if (src > dst) {
1195778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		while (--n >= 0)
1196778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			*dst++ = *src++;
1197778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1198778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	else if (src < dst) {
1199778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		src += n;
1200778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		dst += n;
1201778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum		while (--n >= 0)
1202778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum			*--dst = *--src;
1203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	}
1204778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum	return realdst;
1205778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}
1206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum
1207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif
1208