blob: 7bc7e738bd7008a5e2da2a2a349229bc9e5b2add [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossum778983b1993-02-19 15:55:02 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossum778983b1993-02-19 15:55:02 +00009******************************************************************/
10
11/* Array object implementation */
12
13/* An array is a uniform list -- all items have the same type.
14 The item type is restricted to simple C types like int or float */
15
Roger E. Masse2919eaa1996-12-09 20:10:36 +000016#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +000017
Guido van Rossum0c709541994-08-19 12:01:32 +000018#ifdef STDC_HEADERS
19#include <stddef.h>
Guido van Rossum7f1de831999-08-27 20:33:52 +000020#else /* !STDC_HEADERS */
21#ifndef DONT_HAVE_SYS_TYPES_H
Guido van Rossumb6775db1994-08-01 11:34:53 +000022#include <sys/types.h> /* For size_t */
Guido van Rossum7f1de831999-08-27 20:33:52 +000023#endif /* DONT_HAVE_SYS_TYPES_H */
24#endif /* !STDC_HEADERS */
Guido van Rossum778983b1993-02-19 15:55:02 +000025
26struct arrayobject; /* Forward */
27
28struct arraydescr {
29 int typecode;
30 int itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000031 PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
32 int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *));
Guido van Rossum778983b1993-02-19 15:55:02 +000033};
34
35typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000036 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000037 char *ob_item;
38 struct arraydescr *ob_descr;
39} arrayobject;
40
Roger E. Masse2919eaa1996-12-09 20:10:36 +000041staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000042
43#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
44
Guido van Rossumb73cc041993-11-01 16:28:59 +000045/* Forward */
Roger E. Masse2919eaa1996-12-09 20:10:36 +000046static PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000047#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000048static int getarraysize Py_PROTO((PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000049#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +000050static PyObject *getarrayitem Py_PROTO((PyObject *, int));
51static int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000052#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000053static int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
54static int addarrayitem Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000055#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000056
Roger E. Masse2919eaa1996-12-09 20:10:36 +000057static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000058c_getitem(ap, i)
59 arrayobject *ap;
60 int i;
61{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000062 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000063}
64
65static int
66c_setitem(ap, i, v)
67 arrayobject *ap;
68 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000069 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000070{
71 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000072 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000073 return -1;
74 if (i >= 0)
75 ((char *)ap->ob_item)[i] = x;
76 return 0;
77}
78
Roger E. Masse2919eaa1996-12-09 20:10:36 +000079static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000080b_getitem(ap, i)
81 arrayobject *ap;
82 int i;
83{
84 long x = ((char *)ap->ob_item)[i];
85 if (x >= 128)
86 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000087 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +000088}
89
90static int
91b_setitem(ap, i, v)
92 arrayobject *ap;
93 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000094 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000095{
Fred Drake541dc3b2000-06-28 17:49:30 +000096 short x;
97 /* PyArg_Parse's 'b' formatter is for an unsigned char, therefore
98 must use the next size up that is signed ('h') and manually do
99 the overflow checking */
100 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000101 return -1;
Guido van Rossum9f754e02000-07-01 00:38:19 +0000102 else if (x < -128) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000103 PyErr_SetString(PyExc_OverflowError,
104 "signed char is less than minimum");
105 return -1;
106 }
Guido van Rossum9f754e02000-07-01 00:38:19 +0000107 else if (x > 127) {
Fred Drake541dc3b2000-06-28 17:49:30 +0000108 PyErr_SetString(PyExc_OverflowError,
109 "signed char is greater than maximum");
110 return -1;
111 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000112 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000113 ((char *)ap->ob_item)[i] = (char)x;
Guido van Rossum778983b1993-02-19 15:55:02 +0000114 return 0;
115}
116
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000117static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000118BB_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000119 arrayobject *ap;
120 int i;
121{
122 long x = ((unsigned char *)ap->ob_item)[i];
123 return PyInt_FromLong(x);
124}
125
Fred Drake541dc3b2000-06-28 17:49:30 +0000126static int
127BB_setitem(ap, i, v)
128 arrayobject *ap;
129 int i;
130 PyObject *v;
131{
132 unsigned char x;
133 /* 'B' == unsigned char, maps to PyArg_Parse's 'b' formatter */
134 if (!PyArg_Parse(v, "b;array item must be integer", &x))
135 return -1;
136 if (i >= 0)
137 ((char *)ap->ob_item)[i] = x;
138 return 0;
139}
Guido van Rossum549ab711997-01-03 19:09:47 +0000140
141static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000142h_getitem(ap, i)
143 arrayobject *ap;
144 int i;
145{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000146 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000147}
148
149static int
150h_setitem(ap, i, v)
151 arrayobject *ap;
152 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000153 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000154{
155 short x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000156 /* 'h' == signed short, maps to PyArg_Parse's 'h' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000157 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000158 return -1;
159 if (i >= 0)
160 ((short *)ap->ob_item)[i] = x;
161 return 0;
162}
163
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000164static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000165HH_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000166 arrayobject *ap;
167 int i;
168{
169 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
170}
171
Fred Drake541dc3b2000-06-28 17:49:30 +0000172static int
173HH_setitem(ap, i, v)
174 arrayobject *ap;
175 int i;
176 PyObject *v;
177{
178 int x;
179 /* PyArg_Parse's 'h' formatter is for a signed short, therefore
180 must use the next size up and manually do the overflow checking */
181 if (!PyArg_Parse(v, "i;array item must be integer", &x))
182 return -1;
183 else if (x < 0) {
184 PyErr_SetString(PyExc_OverflowError,
185 "unsigned short is less than minimum");
186 return -1;
187 }
188 else if (x > USHRT_MAX) {
189 PyErr_SetString(PyExc_OverflowError,
190 "unsigned short is greater than maximum");
191 return -1;
192 }
193 if (i >= 0)
194 ((short *)ap->ob_item)[i] = (short)x;
195 return 0;
196}
Guido van Rossum549ab711997-01-03 19:09:47 +0000197
198static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000199i_getitem(ap, i)
200 arrayobject *ap;
201 int i;
202{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000203 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000204}
205
206static int
207i_setitem(ap, i, v)
208 arrayobject *ap;
209 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000210 PyObject *v;
Guido van Rossume77a7571993-11-03 15:01:26 +0000211{
212 int x;
Fred Drake541dc3b2000-06-28 17:49:30 +0000213 /* 'i' == signed int, maps to PyArg_Parse's 'i' formatter */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000214 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000215 return -1;
216 if (i >= 0)
217 ((int *)ap->ob_item)[i] = x;
218 return 0;
219}
220
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000221static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000222II_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000223 arrayobject *ap;
224 int i;
225{
226 return PyLong_FromUnsignedLong(
227 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
228}
229
230static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000231II_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000232 arrayobject *ap;
233 int i;
234 PyObject *v;
235{
236 unsigned long x;
237 if (PyLong_Check(v)) {
238 x = PyLong_AsUnsignedLong(v);
239 if (x == (unsigned long) -1 && PyErr_Occurred())
240 return -1;
241 }
242 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000243 long y;
244 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000245 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000246 if (y < 0) {
247 PyErr_SetString(PyExc_OverflowError,
248 "unsigned int is less than minimum");
249 return -1;
250 }
251 x = (unsigned long)y;
252
Guido van Rossum549ab711997-01-03 19:09:47 +0000253 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000254 if (x > UINT_MAX) {
255 PyErr_SetString(PyExc_OverflowError,
256 "unsigned int is greater than maximum");
257 return -1;
258 }
259
Guido van Rossum549ab711997-01-03 19:09:47 +0000260 if (i >= 0)
Fred Drake541dc3b2000-06-28 17:49:30 +0000261 ((unsigned int *)ap->ob_item)[i] = (unsigned int)x;
Guido van Rossum549ab711997-01-03 19:09:47 +0000262 return 0;
263}
264
265static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000266l_getitem(ap, i)
267 arrayobject *ap;
268 int i;
269{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000270 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000271}
272
273static int
274l_setitem(ap, i, v)
275 arrayobject *ap;
276 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000277 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000278{
279 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000280 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000281 return -1;
282 if (i >= 0)
283 ((long *)ap->ob_item)[i] = x;
284 return 0;
285}
286
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000287static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000288LL_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000289 arrayobject *ap;
290 int i;
291{
292 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
293}
294
295static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000296LL_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000297 arrayobject *ap;
298 int i;
299 PyObject *v;
300{
301 unsigned long x;
302 if (PyLong_Check(v)) {
303 x = PyLong_AsUnsignedLong(v);
304 if (x == (unsigned long) -1 && PyErr_Occurred())
305 return -1;
306 }
307 else {
Fred Drake541dc3b2000-06-28 17:49:30 +0000308 long y;
309 if (!PyArg_Parse(v, "l;array item must be integer", &y))
Guido van Rossum549ab711997-01-03 19:09:47 +0000310 return -1;
Fred Drake541dc3b2000-06-28 17:49:30 +0000311 if (y < 0) {
312 PyErr_SetString(PyExc_OverflowError,
313 "unsigned long is less than minimum");
314 return -1;
315 }
316 x = (unsigned long)y;
317
Guido van Rossum549ab711997-01-03 19:09:47 +0000318 }
Fred Drake541dc3b2000-06-28 17:49:30 +0000319 if (x > ULONG_MAX) {
320 PyErr_SetString(PyExc_OverflowError,
321 "unsigned long is greater than maximum");
322 return -1;
323 }
324
Guido van Rossum549ab711997-01-03 19:09:47 +0000325 if (i >= 0)
326 ((unsigned long *)ap->ob_item)[i] = x;
327 return 0;
328}
329
330static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000331f_getitem(ap, i)
332 arrayobject *ap;
333 int i;
334{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000335 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000336}
337
338static int
339f_setitem(ap, i, v)
340 arrayobject *ap;
341 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000342 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000343{
344 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000345 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000346 return -1;
347 if (i >= 0)
348 ((float *)ap->ob_item)[i] = x;
349 return 0;
350}
351
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000352static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000353d_getitem(ap, i)
354 arrayobject *ap;
355 int i;
356{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000357 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000358}
359
360static int
361d_setitem(ap, i, v)
362 arrayobject *ap;
363 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000364 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000365{
366 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000367 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000368 return -1;
369 if (i >= 0)
370 ((double *)ap->ob_item)[i] = x;
371 return 0;
372}
373
374/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000375static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000376 {'c', sizeof(char), c_getitem, c_setitem},
377 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000378 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000379 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000380 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000381 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000382 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000383 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000384 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000385 {'f', sizeof(float), f_getitem, f_setitem},
386 {'d', sizeof(double), d_getitem, d_setitem},
387 {'\0', 0, 0, 0} /* Sentinel */
388};
Guido van Rossume77a7571993-11-03 15:01:26 +0000389/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000390
391
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000392static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000393newarrayobject(size, descr)
394 int size;
395 struct arraydescr *descr;
396{
Guido van Rossum778983b1993-02-19 15:55:02 +0000397 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000398 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000399 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000400 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000401 return NULL;
402 }
403 nbytes = size * descr->itemsize;
404 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000405 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000406 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000407 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000408 op = PyObject_NewVar(arrayobject, &Arraytype, size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000409 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000410 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000411 }
412 if (size <= 0) {
413 op->ob_item = NULL;
414 }
415 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000416 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000418 PyObject_Del(op);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000419 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000420 }
421 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000422 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000423 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000424}
425
Guido van Rossuma376cc51996-12-05 23:43:35 +0000426#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000427static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000428getarraysize(op)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000429 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000430{
431 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000432 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000433 return -1;
434 }
435 return ((arrayobject *)op) -> ob_size;
436}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000437#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000438
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000440getarrayitem(op, i)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000441 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000442 int i;
443{
444 register arrayobject *ap;
445 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000446 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000447 return NULL;
448 }
449 ap = (arrayobject *)op;
450 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000451 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000452 return NULL;
453 }
454 return (*ap->ob_descr->getitem)(ap, i);
455}
456
457static int
458ins1(self, where, v)
459 arrayobject *self;
460 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000461 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000462{
Guido van Rossum778983b1993-02-19 15:55:02 +0000463 char *items;
464 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000465 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000466 return -1;
467 }
468 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
469 return -1;
470 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000471 PyMem_RESIZE(items, char,
472 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000473 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000474 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000475 return -1;
476 }
477 if (where < 0)
478 where = 0;
479 if (where > self->ob_size)
480 where = self->ob_size;
481 memmove(items + (where+1)*self->ob_descr->itemsize,
482 items + where*self->ob_descr->itemsize,
483 (self->ob_size-where)*self->ob_descr->itemsize);
484 self->ob_item = items;
485 self->ob_size++;
486 return (*self->ob_descr->setitem)(self, where, v);
487}
488
Guido van Rossuma376cc51996-12-05 23:43:35 +0000489#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000490static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000491insarrayitem(op, where, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000492 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000493 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000494 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000495{
496 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000497 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000498 return -1;
499 }
500 return ins1((arrayobject *)op, where, newitem);
501}
502
Guido van Rossum62de97f1995-01-22 00:48:41 +0000503static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000504addarrayitem(op, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000505 PyObject *op;
506 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000507{
508 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000509 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000510 return -1;
511 }
512 return ins1((arrayobject *)op,
513 (int) ((arrayobject *)op)->ob_size, newitem);
514}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000515#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000516
517/* Methods */
518
519static void
520array_dealloc(op)
521 arrayobject *op;
522{
Guido van Rossum778983b1993-02-19 15:55:02 +0000523 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000524 PyMem_DEL(op->ob_item);
Guido van Rossumb18618d2000-05-03 23:44:39 +0000525 PyObject_Del(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000526}
527
528static int
529array_compare(v, w)
530 arrayobject *v, *w;
531{
532 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
533 int i;
534 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000535 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000536 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000537 ai = getarrayitem((PyObject *)v, i);
538 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000539 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000540 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000541 else
542 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000543 Py_XDECREF(ai);
544 Py_XDECREF(bi);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000545 if (cmp != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000546 return cmp;
Guido van Rossum778983b1993-02-19 15:55:02 +0000547 }
548 return v->ob_size - w->ob_size;
549}
550
551static int
552array_length(a)
553 arrayobject *a;
554{
555 return a->ob_size;
556}
557
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000558static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000559array_item(a, i)
560 arrayobject *a;
561 int i;
562{
563 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000564 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000565 return NULL;
566 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000567 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000568}
569
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000570static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000571array_slice(a, ilow, ihigh)
572 arrayobject *a;
573 int ilow, ihigh;
574{
575 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000576 if (ilow < 0)
577 ilow = 0;
578 else if (ilow > a->ob_size)
579 ilow = a->ob_size;
580 if (ihigh < 0)
581 ihigh = 0;
582 if (ihigh < ilow)
583 ihigh = ilow;
584 else if (ihigh > a->ob_size)
585 ihigh = a->ob_size;
586 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
587 if (np == NULL)
588 return NULL;
589 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
590 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000591 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000592}
593
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000594static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000595array_concat(a, bb)
596 arrayobject *a;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000597 PyObject *bb;
Guido van Rossum778983b1993-02-19 15:55:02 +0000598{
599 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000600 arrayobject *np;
601 if (!is_arrayobject(bb)) {
Fred Drake137507e2000-06-01 02:02:46 +0000602 PyErr_Format(PyExc_TypeError,
603 "can only append array (not \"%.200s\") to array",
604 bb->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000605 return NULL;
606 }
607#define b ((arrayobject *)bb)
608 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000609 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000610 return NULL;
611 }
612 size = a->ob_size + b->ob_size;
613 np = (arrayobject *) newarrayobject(size, a->ob_descr);
614 if (np == NULL) {
615 return NULL;
616 }
617 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
618 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000619 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000620 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000621#undef b
622}
623
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000624static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000625array_repeat(a, n)
626 arrayobject *a;
627 int n;
628{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000629 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000630 int size;
631 arrayobject *np;
632 char *p;
633 int nbytes;
634 if (n < 0)
635 n = 0;
636 size = a->ob_size * n;
637 np = (arrayobject *) newarrayobject(size, a->ob_descr);
638 if (np == NULL)
639 return NULL;
640 p = np->ob_item;
641 nbytes = a->ob_size * a->ob_descr->itemsize;
642 for (i = 0; i < n; i++) {
643 memcpy(p, a->ob_item, nbytes);
644 p += nbytes;
645 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000646 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000647}
648
649static int
650array_ass_slice(a, ilow, ihigh, v)
651 arrayobject *a;
652 int ilow, ihigh;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000653 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000654{
655 char *item;
656 int n; /* Size of replacement array */
657 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000658#define b ((arrayobject *)v)
659 if (v == NULL)
660 n = 0;
661 else if (is_arrayobject(v)) {
662 n = b->ob_size;
663 if (a == b) {
664 /* Special case "a[i:j] = a" -- copy b first */
665 int ret;
666 v = array_slice(b, 0, n);
667 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000668 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000669 return ret;
670 }
671 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000672 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000673 return -1;
674 }
675 }
676 else {
Fred Drake137507e2000-06-01 02:02:46 +0000677 PyErr_Format(PyExc_TypeError,
678 "can only assign array (not \"%.200s\") to array slice",
679 v->ob_type->tp_name);
Guido van Rossum778983b1993-02-19 15:55:02 +0000680 return -1;
681 }
682 if (ilow < 0)
683 ilow = 0;
684 else if (ilow > a->ob_size)
685 ilow = a->ob_size;
686 if (ihigh < 0)
687 ihigh = 0;
688 if (ihigh < ilow)
689 ihigh = ilow;
690 else if (ihigh > a->ob_size)
691 ihigh = a->ob_size;
692 item = a->ob_item;
693 d = n - (ihigh-ilow);
694 if (d < 0) { /* Delete -d items */
695 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
696 item + ihigh*a->ob_descr->itemsize,
697 (a->ob_size-ihigh)*a->ob_descr->itemsize);
698 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000699 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000700 /* Can't fail */
701 a->ob_item = item;
702 }
703 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000704 PyMem_RESIZE(item, char,
705 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000706 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000707 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000708 return -1;
709 }
710 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
711 item + ihigh*a->ob_descr->itemsize,
712 (a->ob_size-ihigh)*a->ob_descr->itemsize);
713 a->ob_item = item;
714 a->ob_size += d;
715 }
716 if (n > 0)
717 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
718 n*b->ob_descr->itemsize);
719 return 0;
720#undef b
721}
722
723static int
724array_ass_item(a, i, v)
725 arrayobject *a;
726 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000727 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000728{
729 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000730 PyErr_SetString(PyExc_IndexError,
731 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000732 return -1;
733 }
734 if (v == NULL)
735 return array_ass_slice(a, i, i+1, v);
736 return (*a->ob_descr->setitem)(a, i, v);
737}
738
739static int
740setarrayitem(a, i, v)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000741 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +0000742 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000743 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000744{
745 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000746 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000747 return -1;
748 }
749 return array_ass_item((arrayobject *)a, i, v);
750}
751
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000752static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000753ins(self, where, v)
754 arrayobject *self;
755 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000756 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000757{
758 if (ins1(self, where, v) != 0)
759 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000760 Py_INCREF(Py_None);
761 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000762}
763
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000764static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000765array_insert(self, args)
766 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000767 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000768{
769 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000770 PyObject *v;
771 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000772 return NULL;
773 return ins(self, i, v);
774}
775
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000776static char insert_doc [] =
777"insert (i,x)\n\
778\n\
779Insert a new item x into the array before position i.";
780
781
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000782static PyObject *
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000783array_buffer_info(self, args)
784 arrayobject *self;
785 PyObject *args;
786{
Fred Drake541dc3b2000-06-28 17:49:30 +0000787 PyObject* retval = PyTuple_New(2);
788 if (!retval) return NULL;
789
790 PyTuple_SET_ITEM(retval, 0, PyLong_FromVoidPtr(self->ob_item));
791 PyTuple_SET_ITEM(retval, 1, PyInt_FromLong((long)(self->ob_size)));
792
793 return retval;
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000794}
795
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000796static char buffer_info_doc [] =
797"buffer_info -> (address, length)\n\
798\n\
799Return a tuple (address, length) giving the current memory address and\n\
800the length in bytes of the buffer used to hold array's contents.";
801
802
Guido van Rossumde4a4ca1997-08-12 14:55:56 +0000803static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000804array_append(self, args)
805 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000806 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000807{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000808 PyObject *v;
809 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000810 return NULL;
811 return ins(self, (int) self->ob_size, v);
812}
813
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000814static char append_doc [] =
815"append(x)\n\
816\n\
817Append new value x to the end of the array.";
818
819
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000820static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000821array_byteswap(self, args)
822 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000823 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000824{
825 char *p;
826 int i;
Fred Drakebf272981999-12-03 17:15:30 +0000827
828 if (!PyArg_ParseTuple(args, ":byteswap"))
829 return NULL;
830
Guido van Rossum778983b1993-02-19 15:55:02 +0000831 switch (self->ob_descr->itemsize) {
832 case 1:
833 break;
834 case 2:
835 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
836 char p0 = p[0];
837 p[0] = p[1];
838 p[1] = p0;
839 }
840 break;
841 case 4:
842 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
843 char p0 = p[0];
844 char p1 = p[1];
845 p[0] = p[3];
846 p[1] = p[2];
847 p[2] = p1;
848 p[3] = p0;
849 }
850 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000851 case 8:
852 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
853 char p0 = p[0];
854 char p1 = p[1];
855 char p2 = p[2];
856 char p3 = p[3];
857 p[0] = p[7];
858 p[1] = p[6];
859 p[2] = p[5];
860 p[3] = p[4];
861 p[4] = p3;
862 p[5] = p2;
863 p[6] = p1;
864 p[7] = p0;
865 }
866 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000867 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000868 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000869 "don't know how to byteswap this array type");
870 return NULL;
871 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000872 Py_INCREF(Py_None);
873 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000874}
875
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000876static char byteswap_doc [] =
Fred Drakebf272981999-12-03 17:15:30 +0000877"byteswap()\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000878\n\
Fred Drakebf272981999-12-03 17:15:30 +0000879Byteswap all items of the array. If the items in the array are not 1, 2,\n\
8804, or 8 bytes in size, RuntimeError is raised.";
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000881
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000882static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000883array_reverse(self, args)
884 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000885 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000886{
Guido van Rossume77a7571993-11-03 15:01:26 +0000887 register int itemsize = self->ob_descr->itemsize;
888 register char *p, *q;
889 char tmp[sizeof(double)]; /* Assume that's the max item size */
890
Guido van Rossum778983b1993-02-19 15:55:02 +0000891 if (args != NULL) {
Fred Drake137507e2000-06-01 02:02:46 +0000892 PyErr_SetString(PyExc_TypeError,
893 "<array>.reverse requires exactly 0 arguments");
Guido van Rossum778983b1993-02-19 15:55:02 +0000894 return NULL;
895 }
896
897 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000898 for (p = self->ob_item,
899 q = self->ob_item + (self->ob_size - 1)*itemsize;
900 p < q;
901 p += itemsize, q -= itemsize) {
902 memmove(tmp, p, itemsize);
903 memmove(p, q, itemsize);
904 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000905 }
906 }
907
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000908 Py_INCREF(Py_None);
909 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000910}
Guido van Rossume77a7571993-11-03 15:01:26 +0000911
Guido van Rossumb39b90d1998-10-13 14:27:22 +0000912static char reverse_doc [] =
913"reverse()\n\
914\n\
915Reverse the order of the items in the array.";
916
Guido van Rossume77a7571993-11-03 15:01:26 +0000917/* The following routines were adapted from listobject.c but not converted.
918 To make them work you will have to work! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000919
920#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000921static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000922array_index(self, args)
923 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000924 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000925{
926 int i;
927
928 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000929 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000930 return NULL;
931 }
932 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000933 if (PyObject_Compare(self->ob_item[i], args) == 0)
934 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000935 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000936 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000937 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000938 return NULL;
939}
940#endif
941
942#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000943static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000944array_count(self, args)
945 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000946 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000947{
948 int count = 0;
949 int i;
950
951 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000952 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000953 return NULL;
954 }
955 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000956 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000957 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000958 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000959 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000960 return PyInt_FromLong((long)count);
Guido van Rossum778983b1993-02-19 15:55:02 +0000961}
962#endif
963
964#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000965static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000966array_remove(self, args)
967 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000968 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000969{
970 int i;
971
972 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000973 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000974 return NULL;
975 }
976 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000977 if (PyObject_Compare(self->ob_item[i], args) == 0) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000978 if (array_ass_slice(self, i, i+1,
979 (PyObject *)NULL) != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000980 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000981 Py_INCREF(Py_None);
982 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000983 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000984 /* XXX PyErr_Occurred */
Guido van Rossum778983b1993-02-19 15:55:02 +0000985 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000986 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000987 return NULL;
988}
989#endif
990
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000991static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000992array_fromfile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000993 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000994 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000995{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000996 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000997 int n;
998 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000999 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001000 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001001 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001002 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001003 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001004 return NULL;
1005 }
1006 if (n > 0) {
1007 char *item = self->ob_item;
1008 int itemsize = self->ob_descr->itemsize;
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001009 size_t nread;
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001010 int newlength;
1011 size_t newbytes;
1012 /* Be careful here about overflow */
1013 if ((newlength = self->ob_size + n) <= 0 ||
Guido van Rossum481ac881999-03-19 21:50:11 +00001014 (newbytes = newlength * itemsize) / itemsize !=
1015 (size_t)newlength)
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001016 goto nomem;
1017 PyMem_RESIZE(item, char, newbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +00001018 if (item == NULL) {
Guido van Rossum3791b0d1999-02-23 18:05:22 +00001019 nomem:
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001020 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001021 return NULL;
1022 }
1023 self->ob_item = item;
1024 self->ob_size += n;
1025 nread = fread(item + (self->ob_size - n) * itemsize,
1026 itemsize, n, fp);
Guido van Rossum7d0ae5e2000-06-28 21:27:21 +00001027 if (nread < (size_t)n) {
Guido van Rossum778983b1993-02-19 15:55:02 +00001028 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001029 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001030 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001031 PyErr_SetString(PyExc_EOFError,
1032 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001033 return NULL;
1034 }
1035 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001036 Py_INCREF(Py_None);
1037 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001038}
1039
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001040static char fromfile_doc [] =
1041"fromfile(f, n)\n\
1042\n\
1043Read n objects from the file object f and append them to the end of the\n\
1044array. Also called as read.";
1045
1046
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001047static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +00001048array_tofile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +00001049 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001050 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001051{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001052 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +00001053 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001054 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +00001055 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001056 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +00001057 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001058 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +00001059 return NULL;
1060 }
1061 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +00001062 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +00001063 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001064 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +00001065 clearerr(fp);
1066 return NULL;
1067 }
1068 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001069 Py_INCREF(Py_None);
1070 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001071}
1072
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001073static char tofile_doc [] =
1074"tofile(f)\n\
1075\n\
1076Write all items (as machine values) to the file object f. Also called as\n\
1077write.";
1078
1079
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001080static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001081array_fromlist(self, args)
1082 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001083 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001084{
1085 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001086 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +00001087 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001088 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +00001089 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001090 if (!PyList_Check(list)) {
1091 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +00001092 return NULL;
1093 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001094 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001095 if (n > 0) {
1096 char *item = self->ob_item;
1097 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001098 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001099 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001100 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001101 return NULL;
1102 }
1103 self->ob_item = item;
1104 self->ob_size += n;
1105 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001106 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001107 if ((*self->ob_descr->setitem)(self,
1108 self->ob_size - n + i, v) != 0) {
1109 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001110 PyMem_RESIZE(item, char,
1111 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001112 self->ob_item = item;
1113 return NULL;
1114 }
1115 }
1116 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001117 Py_INCREF(Py_None);
1118 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001119}
1120
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001121static char fromlist_doc [] =
1122"fromlist(list)\n\
1123\n\
1124Append items to array from list.";
1125
1126
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001128array_tolist(self, args)
1129 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001130 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001131{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001132 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +00001133 int i;
1134 if (list == NULL)
1135 return NULL;
1136 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001137 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001138 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001140 return NULL;
1141 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001142 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001143 }
1144 return list;
1145}
1146
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001147static char tolist_doc [] =
Guido van Rossumfc6aba51998-10-14 02:52:31 +00001148"tolist() -> list\n\
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001149\n\
1150Convert array to an ordinary list with the same items.";
1151
1152
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001153static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001154array_fromstring(self, args)
1155 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001156 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001157{
1158 char *str;
1159 int n;
1160 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001161 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001162 return NULL;
1163 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001164 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001165 "string length not a multiple of item size");
1166 return NULL;
1167 }
1168 n = n / itemsize;
1169 if (n > 0) {
1170 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001171 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001172 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001173 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001174 return NULL;
1175 }
1176 self->ob_item = item;
1177 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001178 memcpy(item + (self->ob_size - n) * itemsize,
1179 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001180 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001181 Py_INCREF(Py_None);
1182 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +00001183}
1184
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001185static char fromstring_doc [] =
1186"fromstring(string)\n\
1187\n\
1188Appends items from the string, interpreting it as an array of machine\n\
1189values,as if it had been read from a file using the fromfile() method).";
1190
1191
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001192static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001193array_tostring(self, args)
1194 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001195 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001196{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001197 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001198 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001199 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001200 self->ob_size * self->ob_descr->itemsize);
1201}
1202
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001203static char tostring_doc [] =
1204"tostring() -> string\n\
1205\n\
1206Convert the array to an array of machine values and return the string\n\
1207representation.";
1208
1209PyMethodDef array_methods[] = {
1210 {"append", (PyCFunction)array_append, 0, append_doc},
1211 {"buffer_info", (PyCFunction)array_buffer_info, 0, buffer_info_doc},
Fred Drakebf272981999-12-03 17:15:30 +00001212 {"byteswap", (PyCFunction)array_byteswap, METH_VARARGS,
1213 byteswap_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001214/* {"count", (method)array_count},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001215 {"fromfile", (PyCFunction)array_fromfile, 0, fromfile_doc},
1216 {"fromlist", (PyCFunction)array_fromlist, 0, fromlist_doc},
1217 {"fromstring", (PyCFunction)array_fromstring, 0, fromstring_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001218/* {"index", (method)array_index},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001219 {"insert", (PyCFunction)array_insert, 0, insert_doc},
1220 {"read", (PyCFunction)array_fromfile, 0, fromfile_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001221/* {"remove", (method)array_remove},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001222 {"reverse", (PyCFunction)array_reverse, 0, reverse_doc},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001223/* {"sort", (method)array_sort},*/
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001224 {"tofile", (PyCFunction)array_tofile, 0, tofile_doc},
1225 {"tolist", (PyCFunction)array_tolist, 0, tolist_doc},
1226 {"tostring", (PyCFunction)array_tostring, 0, tostring_doc},
1227 {"write", (PyCFunction)array_tofile, 0, tofile_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001228 {NULL, NULL} /* sentinel */
1229};
1230
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001231static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001232array_getattr(a, name)
1233 arrayobject *a;
1234 char *name;
1235{
1236 if (strcmp(name, "typecode") == 0) {
1237 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001238 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001239 }
1240 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001241 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001242 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001243 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001244 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001245 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001246 PyList_SetItem(list, 0,
1247 PyString_FromString("typecode"));
1248 PyList_SetItem(list, 1,
1249 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001250 if (PyErr_Occurred()) {
1251 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001252 list = NULL;
1253 }
1254 }
1255 return list;
1256 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001257 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001258}
1259
1260static int
1261array_print(a, fp, flags)
1262 arrayobject *a;
1263 FILE *fp;
1264 int flags;
1265{
1266 int ok = 0;
1267 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001268 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001269 len = a->ob_size;
1270 if (len == 0) {
1271 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1272 return ok;
1273 }
1274 if (a->ob_descr->typecode == 'c') {
1275 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001276 v = array_tostring(a, (PyObject *)NULL);
1277 ok = PyObject_Print(v, fp, 0);
1278 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001279 fprintf(fp, ")");
1280 return ok;
1281 }
1282 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1283 for (i = 0; i < len && ok == 0; i++) {
1284 if (i > 0)
1285 fprintf(fp, ", ");
1286 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001287 ok = PyObject_Print(v, fp, 0);
1288 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001289 }
1290 fprintf(fp, "])");
1291 return ok;
1292}
1293
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001294static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001295array_repr(a)
1296 arrayobject *a;
1297{
1298 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001299 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001300 int i, len;
1301 len = a->ob_size;
1302 if (len == 0) {
1303 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001304 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001305 }
1306 if (a->ob_descr->typecode == 'c') {
1307 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001308 s = PyString_FromString(buf);
1309 v = array_tostring(a, (PyObject *)NULL);
1310 t = PyObject_Repr(v);
1311 Py_XDECREF(v);
1312 PyString_ConcatAndDel(&s, t);
1313 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001314 return s;
1315 }
1316 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001317 s = PyString_FromString(buf);
1318 comma = PyString_FromString(", ");
1319 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001320 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001321 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001322 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001323 t = PyObject_Repr(v);
1324 Py_XDECREF(v);
1325 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001326 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001327 Py_XDECREF(comma);
1328 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001329 return s;
1330}
1331
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001332static int
1333array_buffer_getreadbuf(self, index, ptr)
1334 arrayobject *self;
1335 int index;
1336 const void **ptr;
1337{
1338 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001339 PyErr_SetString(PyExc_SystemError,
1340 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001341 return -1;
1342 }
1343 *ptr = (void *)self->ob_item;
1344 return self->ob_size*self->ob_descr->itemsize;
1345}
1346
1347static int
1348array_buffer_getwritebuf(self, index, ptr)
1349 arrayobject *self;
1350 int index;
1351 const void **ptr;
1352{
1353 if ( index != 0 ) {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001354 PyErr_SetString(PyExc_SystemError,
1355 "Accessing non-existent array segment");
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001356 return -1;
1357 }
1358 *ptr = (void *)self->ob_item;
1359 return self->ob_size*self->ob_descr->itemsize;
1360}
1361
1362static int
1363array_buffer_getsegcount(self, lenp)
1364 arrayobject *self;
1365 int *lenp;
1366{
1367 if ( lenp )
1368 *lenp = self->ob_size*self->ob_descr->itemsize;
1369 return 1;
1370}
1371
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001372static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001373 (inquiry)array_length, /*sq_length*/
1374 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001375 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001376 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001377 (intintargfunc)array_slice, /*sq_slice*/
1378 (intobjargproc)array_ass_item, /*sq_ass_item*/
1379 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001380};
1381
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001382static PyBufferProcs array_as_buffer = {
1383 (getreadbufferproc)array_buffer_getreadbuf,
1384 (getwritebufferproc)array_buffer_getwritebuf,
1385 (getsegcountproc)array_buffer_getsegcount,
1386};
1387
1388
Guido van Rossum778983b1993-02-19 15:55:02 +00001389
1390
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001391static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001392a_array(self, args)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001393 PyObject *self;
1394 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001395{
1396 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001397 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001398 struct arraydescr *descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001399 if (!PyArg_Parse(args, "c", &c)) {
1400 PyErr_Clear();
1401 if (!PyArg_Parse(args, "(cO)", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001402 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001403 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1404 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001405 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001406 return NULL;
1407 }
1408 }
1409 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1410 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001411 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001412 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001413 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001414 len = 0;
1415 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001416 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001417 a = newarrayobject(len, descr);
1418 if (a == NULL)
1419 return NULL;
1420 if (len > 0) {
1421 int i;
1422 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001423 PyObject *v =
1424 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001425 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001426 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001427 return NULL;
1428 }
1429 }
1430 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001431 if (initial != NULL && PyString_Check(initial)) {
1432 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001433 array_fromstring((arrayobject *)a, initial);
1434 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001435 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001436 return NULL;
1437 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001438 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001439 }
1440 return a;
1441 }
1442 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001443 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001444 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001445 return NULL;
1446}
1447
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001448static char a_array_doc [] =
1449"array(typecode [, initializer]) -> array\n\
1450\n\
1451Return a new array whose items are restricted by typecode, and\n\
1452initialized from the optional initializer value, which must be a list\n\
1453or a string.";
1454
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001455static PyMethodDef a_methods[] = {
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001456 {"array", a_array, 0, a_array_doc},
Guido van Rossum778983b1993-02-19 15:55:02 +00001457 {NULL, NULL} /* sentinel */
1458};
1459
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001460static char module_doc [] =
1461"This module defines a new object type which can efficiently represent\n\
1462an array of basic values: characters, integers, floating point\n\
1463numbers. Arrays are sequence types and behave very much like lists,\n\
1464except that the type of objects stored in them is constrained. The\n\
1465type is specified at object creation time by using a type code, which\n\
1466is a single character. The following type codes are defined:\n\
1467\n\
1468 Type code C Type Minimum size in bytes \n\
1469 'c' character 1 \n\
1470 'b' signed integer 1 \n\
1471 'B' unsigned integer 1 \n\
1472 'h' signed integer 2 \n\
1473 'H' unsigned integer 2 \n\
1474 'i' signed integer 2 \n\
1475 'I' unsigned integer 2 \n\
1476 'l' signed integer 4 \n\
1477 'L' unsigned integer 4 \n\
1478 'f' floating point 4 \n\
1479 'd' floating point 8 \n\
1480\n\
1481Functions:\n\
1482\n\
1483array(typecode [, initializer]) -- create a new array\n\
1484\n\
1485Special Objects:\n\
1486\n\
1487ArrayType -- type object for array objects\n\
1488";
1489
1490static char arraytype_doc [] =
1491"An array represents basic values and behave very much like lists, except\n\
1492the type of objects stored in them is constrained.\n\
1493\n\
1494Methods:\n\
1495\n\
1496append() -- append a new item to the end of the array\n\
1497buffer_info() -- return information giving the current memory info\n\
1498byteswap() -- byteswap all the items of the array\n\
1499fromfile() -- read items from a file object\n\
1500fromlist() -- append items from the list\n\
1501fromstring() -- append items from the string\n\
1502insert() -- insert a new item into the array at a provided position\n\
1503read() -- DEPRECATED, use fromfile()\n\
1504reverse() -- reverse the order of the items in the array\n\
1505tofile() -- write all items to a file object\n\
1506tolist() -- return the array converted to an ordinary list\n\
1507tostring() -- return the array converted to a string\n\
1508write() -- DEPRECATED, use tofile()\n\
1509\n\
1510Variables:\n\
1511\n\
1512typecode -- the typecode character used to create the array\n\
1513itemsize -- the length in bytes of one array item\n\
1514";
1515
1516statichere PyTypeObject Arraytype = {
Fred Drake0d40ba42000-02-04 20:33:49 +00001517 PyObject_HEAD_INIT(NULL)
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001518 0,
1519 "array",
1520 sizeof(arrayobject),
1521 0,
1522 (destructor)array_dealloc, /*tp_dealloc*/
1523 (printfunc)array_print, /*tp_print*/
1524 (getattrfunc)array_getattr, /*tp_getattr*/
1525 0, /*tp_setattr*/
1526 (cmpfunc)array_compare, /*tp_compare*/
1527 (reprfunc)array_repr, /*tp_repr*/
1528 0, /*tp_as_number*/
1529 &array_as_sequence, /*tp_as_sequence*/
1530 0, /*tp_as_mapping*/
1531 0, /*tp_hash*/
1532 0, /*tp_call*/
1533 0, /*tp_str*/
1534 0, /*tp_getattro*/
1535 0, /*tp_setattro*/
1536 &array_as_buffer, /*tp_as_buffer*/
1537 0, /*tp_xxx4*/
1538 arraytype_doc, /*tp_doc*/
1539};
1540
Guido van Rossum3886bb61998-12-04 18:50:17 +00001541DL_EXPORT(void)
Guido van Rossum778983b1993-02-19 15:55:02 +00001542initarray()
1543{
Guido van Rossumb6190d31997-05-22 14:56:36 +00001544 PyObject *m, *d;
Fred Drake0d40ba42000-02-04 20:33:49 +00001545
1546 Arraytype.ob_type = &PyType_Type;
Guido van Rossumb39b90d1998-10-13 14:27:22 +00001547 m = Py_InitModule3("array", a_methods, module_doc);
Guido van Rossumb6190d31997-05-22 14:56:36 +00001548 d = PyModule_GetDict(m);
Guido van Rossuma0deb641998-10-14 13:45:06 +00001549 PyDict_SetItemString(d, "ArrayType", (PyObject *)&Arraytype);
1550 /* No need to check the error here, the caller will do that */
Guido van Rossum778983b1993-02-19 15:55:02 +00001551}