blob: b6ae98d242eae612989cfaaeb2b92de3a6f1aaaa [file] [log] [blame]
Guido van Rossum778983b1993-02-19 15:55:02 +00001/***********************************************************
Guido van Rossum524b5881995-01-04 19:10:35 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossum778983b1993-02-19 15:55:02 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossum778983b1993-02-19 15:55:02 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossum778983b1993-02-19 15:55:02 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossum778983b1993-02-19 15:55:02 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossum778983b1993-02-19 15:55:02 +000029
30******************************************************************/
31
32/* Array object implementation */
33
34/* An array is a uniform list -- all items have the same type.
35 The item type is restricted to simple C types like int or float */
36
Roger E. Masse2919eaa1996-12-09 20:10:36 +000037#include "Python.h"
Roger E. Masse5817f8f1996-12-09 22:24:19 +000038
Guido van Rossum0c709541994-08-19 12:01:32 +000039#ifdef STDC_HEADERS
40#include <stddef.h>
41#else
Guido van Rossumb6775db1994-08-01 11:34:53 +000042#include <sys/types.h> /* For size_t */
Guido van Rossum0c709541994-08-19 12:01:32 +000043#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000044
45struct arrayobject; /* Forward */
46
47struct arraydescr {
48 int typecode;
49 int itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000050 PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
51 int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *));
Guido van Rossum778983b1993-02-19 15:55:02 +000052};
53
54typedef struct arrayobject {
Roger E. Masse2919eaa1996-12-09 20:10:36 +000055 PyObject_VAR_HEAD
Guido van Rossum778983b1993-02-19 15:55:02 +000056 char *ob_item;
57 struct arraydescr *ob_descr;
58} arrayobject;
59
Roger E. Masse2919eaa1996-12-09 20:10:36 +000060staticforward PyTypeObject Arraytype;
Guido van Rossum778983b1993-02-19 15:55:02 +000061
62#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
63
Guido van Rossumb73cc041993-11-01 16:28:59 +000064/* Forward */
Roger E. Masse2919eaa1996-12-09 20:10:36 +000065static PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000066#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000067static int getarraysize Py_PROTO((PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000068#endif
Roger E. Masse2919eaa1996-12-09 20:10:36 +000069static PyObject *getarrayitem Py_PROTO((PyObject *, int));
70static int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000071#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +000072static int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
73static int addarrayitem Py_PROTO((PyObject *, PyObject *));
Guido van Rossuma376cc51996-12-05 23:43:35 +000074#endif
Guido van Rossum778983b1993-02-19 15:55:02 +000075
Roger E. Masse2919eaa1996-12-09 20:10:36 +000076static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000077c_getitem(ap, i)
78 arrayobject *ap;
79 int i;
80{
Roger E. Masse2919eaa1996-12-09 20:10:36 +000081 return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
Guido van Rossum778983b1993-02-19 15:55:02 +000082}
83
84static int
85c_setitem(ap, i, v)
86 arrayobject *ap;
87 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000088 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +000089{
90 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +000091 if (!PyArg_Parse(v, "c;array item must be char", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +000092 return -1;
93 if (i >= 0)
94 ((char *)ap->ob_item)[i] = x;
95 return 0;
96}
97
Roger E. Masse2919eaa1996-12-09 20:10:36 +000098static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +000099b_getitem(ap, i)
100 arrayobject *ap;
101 int i;
102{
103 long x = ((char *)ap->ob_item)[i];
104 if (x >= 128)
105 x -= 256;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000106 return PyInt_FromLong(x);
Guido van Rossum778983b1993-02-19 15:55:02 +0000107}
108
109static int
110b_setitem(ap, i, v)
111 arrayobject *ap;
112 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000113 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000114{
115 char x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000116 if (!PyArg_Parse(v, "b;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000117 return -1;
118 if (i >= 0)
119 ((char *)ap->ob_item)[i] = x;
120 return 0;
121}
122
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000123static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000124BB_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000125 arrayobject *ap;
126 int i;
127{
128 long x = ((unsigned char *)ap->ob_item)[i];
129 return PyInt_FromLong(x);
130}
131
Guido van Rossum1a747f81997-05-16 16:21:38 +0000132#define BB_setitem b_setitem
Guido van Rossum549ab711997-01-03 19:09:47 +0000133
134static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000135h_getitem(ap, i)
136 arrayobject *ap;
137 int i;
138{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000139 return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000140}
141
142static int
143h_setitem(ap, i, v)
144 arrayobject *ap;
145 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000146 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000147{
148 short x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000149 if (!PyArg_Parse(v, "h;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000150 return -1;
151 if (i >= 0)
152 ((short *)ap->ob_item)[i] = x;
153 return 0;
154}
155
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000156static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000157HH_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000158 arrayobject *ap;
159 int i;
160{
161 return PyInt_FromLong((long) ((unsigned short *)ap->ob_item)[i]);
162}
163
Guido van Rossum1a747f81997-05-16 16:21:38 +0000164#define HH_setitem h_setitem
Guido van Rossum549ab711997-01-03 19:09:47 +0000165
166static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000167i_getitem(ap, i)
168 arrayobject *ap;
169 int i;
170{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000171 return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
Guido van Rossume77a7571993-11-03 15:01:26 +0000172}
173
174static int
175i_setitem(ap, i, v)
176 arrayobject *ap;
177 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000178 PyObject *v;
Guido van Rossume77a7571993-11-03 15:01:26 +0000179{
180 int x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000181 if (!PyArg_Parse(v, "i;array item must be integer", &x))
Guido van Rossume77a7571993-11-03 15:01:26 +0000182 return -1;
183 if (i >= 0)
184 ((int *)ap->ob_item)[i] = x;
185 return 0;
186}
187
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000188static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000189II_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000190 arrayobject *ap;
191 int i;
192{
193 return PyLong_FromUnsignedLong(
194 (unsigned long) ((unsigned int *)ap->ob_item)[i]);
195}
196
197static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000198II_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000199 arrayobject *ap;
200 int i;
201 PyObject *v;
202{
203 unsigned long x;
204 if (PyLong_Check(v)) {
205 x = PyLong_AsUnsignedLong(v);
206 if (x == (unsigned long) -1 && PyErr_Occurred())
207 return -1;
208 }
209 else {
210 if (!PyArg_Parse(v, "l;array item must be integer", &x))
211 return -1;
212 }
213 if (i >= 0)
214 ((unsigned int *)ap->ob_item)[i] = x;
215 return 0;
216}
217
218static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000219l_getitem(ap, i)
220 arrayobject *ap;
221 int i;
222{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000223 return PyInt_FromLong(((long *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000224}
225
226static int
227l_setitem(ap, i, v)
228 arrayobject *ap;
229 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000230 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000231{
232 long x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000233 if (!PyArg_Parse(v, "l;array item must be integer", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000234 return -1;
235 if (i >= 0)
236 ((long *)ap->ob_item)[i] = x;
237 return 0;
238}
239
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000240static PyObject *
Guido van Rossum1a747f81997-05-16 16:21:38 +0000241LL_getitem(ap, i)
Guido van Rossum549ab711997-01-03 19:09:47 +0000242 arrayobject *ap;
243 int i;
244{
245 return PyLong_FromUnsignedLong(((unsigned long *)ap->ob_item)[i]);
246}
247
248static int
Guido van Rossum1a747f81997-05-16 16:21:38 +0000249LL_setitem(ap, i, v)
Guido van Rossum549ab711997-01-03 19:09:47 +0000250 arrayobject *ap;
251 int i;
252 PyObject *v;
253{
254 unsigned long x;
255 if (PyLong_Check(v)) {
256 x = PyLong_AsUnsignedLong(v);
257 if (x == (unsigned long) -1 && PyErr_Occurred())
258 return -1;
259 }
260 else {
261 if (!PyArg_Parse(v, "l;array item must be integer", &x))
262 return -1;
263 }
264 if (i >= 0)
265 ((unsigned long *)ap->ob_item)[i] = x;
266 return 0;
267}
268
269static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000270f_getitem(ap, i)
271 arrayobject *ap;
272 int i;
273{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000274 return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000275}
276
277static int
278f_setitem(ap, i, v)
279 arrayobject *ap;
280 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000281 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000282{
283 float x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000284 if (!PyArg_Parse(v, "f;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000285 return -1;
286 if (i >= 0)
287 ((float *)ap->ob_item)[i] = x;
288 return 0;
289}
290
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000291static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000292d_getitem(ap, i)
293 arrayobject *ap;
294 int i;
295{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000296 return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
Guido van Rossum778983b1993-02-19 15:55:02 +0000297}
298
299static int
300d_setitem(ap, i, v)
301 arrayobject *ap;
302 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000303 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000304{
305 double x;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000306 if (!PyArg_Parse(v, "d;array item must be float", &x))
Guido van Rossum778983b1993-02-19 15:55:02 +0000307 return -1;
308 if (i >= 0)
309 ((double *)ap->ob_item)[i] = x;
310 return 0;
311}
312
313/* Description of types */
Guido van Rossum234f9421993-06-17 12:35:49 +0000314static struct arraydescr descriptors[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +0000315 {'c', sizeof(char), c_getitem, c_setitem},
316 {'b', sizeof(char), b_getitem, b_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000317 {'B', sizeof(char), BB_getitem, BB_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000318 {'h', sizeof(short), h_getitem, h_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000319 {'H', sizeof(short), HH_getitem, HH_setitem},
Guido van Rossume77a7571993-11-03 15:01:26 +0000320 {'i', sizeof(int), i_getitem, i_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000321 {'I', sizeof(int), II_getitem, II_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000322 {'l', sizeof(long), l_getitem, l_setitem},
Guido van Rossum1a747f81997-05-16 16:21:38 +0000323 {'L', sizeof(long), LL_getitem, LL_setitem},
Guido van Rossum778983b1993-02-19 15:55:02 +0000324 {'f', sizeof(float), f_getitem, f_setitem},
325 {'d', sizeof(double), d_getitem, d_setitem},
326 {'\0', 0, 0, 0} /* Sentinel */
327};
Guido van Rossume77a7571993-11-03 15:01:26 +0000328/* If we ever allow items larger than double, we must change reverse()! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000329
330
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000331static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000332newarrayobject(size, descr)
333 int size;
334 struct arraydescr *descr;
335{
Guido van Rossum778983b1993-02-19 15:55:02 +0000336 arrayobject *op;
Guido van Rossumb6775db1994-08-01 11:34:53 +0000337 size_t nbytes;
Guido van Rossum778983b1993-02-19 15:55:02 +0000338 if (size < 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000339 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000340 return NULL;
341 }
342 nbytes = size * descr->itemsize;
343 /* Check for overflow */
Guido van Rossum7844e381997-04-11 20:44:04 +0000344 if (nbytes / descr->itemsize != (size_t)size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000345 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000346 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000347 op = PyMem_NEW(arrayobject, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +0000348 if (op == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000349 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000350 }
351 if (size <= 0) {
352 op->ob_item = NULL;
353 }
354 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000355 op->ob_item = PyMem_NEW(char, nbytes);
Guido van Rossum778983b1993-02-19 15:55:02 +0000356 if (op->ob_item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000357 PyMem_DEL(op);
358 return PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000359 }
360 }
Guido van Rossum778983b1993-02-19 15:55:02 +0000361 op->ob_type = &Arraytype;
362 op->ob_size = size;
363 op->ob_descr = descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000364 _Py_NewReference(op);
365 return (PyObject *) op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000366}
367
Guido van Rossuma376cc51996-12-05 23:43:35 +0000368#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000369static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000370getarraysize(op)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000371 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000372{
373 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000374 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000375 return -1;
376 }
377 return ((arrayobject *)op) -> ob_size;
378}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000379#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000380
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000381static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000382getarrayitem(op, i)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000383 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000384 int i;
385{
386 register arrayobject *ap;
387 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000388 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000389 return NULL;
390 }
391 ap = (arrayobject *)op;
392 if (i < 0 || i >= ap->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000393 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000394 return NULL;
395 }
396 return (*ap->ob_descr->getitem)(ap, i);
397}
398
399static int
400ins1(self, where, v)
401 arrayobject *self;
402 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000403 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000404{
Guido van Rossum778983b1993-02-19 15:55:02 +0000405 char *items;
406 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000407 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000408 return -1;
409 }
410 if ((*self->ob_descr->setitem)(self, -1, v) < 0)
411 return -1;
412 items = self->ob_item;
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000413 PyMem_RESIZE(items, char,
414 (self->ob_size+1) * self->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000415 if (items == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000416 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000417 return -1;
418 }
419 if (where < 0)
420 where = 0;
421 if (where > self->ob_size)
422 where = self->ob_size;
423 memmove(items + (where+1)*self->ob_descr->itemsize,
424 items + where*self->ob_descr->itemsize,
425 (self->ob_size-where)*self->ob_descr->itemsize);
426 self->ob_item = items;
427 self->ob_size++;
428 return (*self->ob_descr->setitem)(self, where, v);
429}
430
Guido van Rossuma376cc51996-12-05 23:43:35 +0000431#if 0
Guido van Rossum62de97f1995-01-22 00:48:41 +0000432static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000433insarrayitem(op, where, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000434 PyObject *op;
Guido van Rossum778983b1993-02-19 15:55:02 +0000435 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000436 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000437{
438 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000439 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000440 return -1;
441 }
442 return ins1((arrayobject *)op, where, newitem);
443}
444
Guido van Rossum62de97f1995-01-22 00:48:41 +0000445static int
Guido van Rossum778983b1993-02-19 15:55:02 +0000446addarrayitem(op, newitem)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000447 PyObject *op;
448 PyObject *newitem;
Guido van Rossum778983b1993-02-19 15:55:02 +0000449{
450 if (!is_arrayobject(op)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000451 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000452 return -1;
453 }
454 return ins1((arrayobject *)op,
455 (int) ((arrayobject *)op)->ob_size, newitem);
456}
Guido van Rossuma376cc51996-12-05 23:43:35 +0000457#endif
Guido van Rossum778983b1993-02-19 15:55:02 +0000458
459/* Methods */
460
461static void
462array_dealloc(op)
463 arrayobject *op;
464{
Guido van Rossum778983b1993-02-19 15:55:02 +0000465 if (op->ob_item != NULL)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000466 PyMem_DEL(op->ob_item);
467 PyMem_DEL(op);
Guido van Rossum778983b1993-02-19 15:55:02 +0000468}
469
470static int
471array_compare(v, w)
472 arrayobject *v, *w;
473{
474 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
475 int i;
476 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000477 PyObject *ai, *bi;
Guido van Rossum778983b1993-02-19 15:55:02 +0000478 int cmp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000479 ai = getarrayitem((PyObject *)v, i);
480 bi = getarrayitem((PyObject *)w, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000481 if (ai && bi)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000482 cmp = PyObject_Compare(ai, bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000483 else
484 cmp = -1;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000485 Py_XDECREF(ai);
486 Py_XDECREF(bi);
Guido van Rossum778983b1993-02-19 15:55:02 +0000487 if (cmp != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000488 PyErr_Clear(); /* XXX Can't report errors here */
Guido van Rossum778983b1993-02-19 15:55:02 +0000489 return cmp;
490 }
491 }
492 return v->ob_size - w->ob_size;
493}
494
495static int
496array_length(a)
497 arrayobject *a;
498{
499 return a->ob_size;
500}
501
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000502static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000503array_item(a, i)
504 arrayobject *a;
505 int i;
506{
507 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000508 PyErr_SetString(PyExc_IndexError, "array index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000509 return NULL;
510 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000511 return getarrayitem((PyObject *)a, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000512}
513
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000514static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000515array_slice(a, ilow, ihigh)
516 arrayobject *a;
517 int ilow, ihigh;
518{
519 arrayobject *np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000520 if (ilow < 0)
521 ilow = 0;
522 else if (ilow > a->ob_size)
523 ilow = a->ob_size;
524 if (ihigh < 0)
525 ihigh = 0;
526 if (ihigh < ilow)
527 ihigh = ilow;
528 else if (ihigh > a->ob_size)
529 ihigh = a->ob_size;
530 np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr);
531 if (np == NULL)
532 return NULL;
533 memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
534 (ihigh-ilow) * a->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000535 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000536}
537
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000538static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000539array_concat(a, bb)
540 arrayobject *a;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000541 PyObject *bb;
Guido van Rossum778983b1993-02-19 15:55:02 +0000542{
543 int size;
Guido van Rossum778983b1993-02-19 15:55:02 +0000544 arrayobject *np;
545 if (!is_arrayobject(bb)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000546 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000547 return NULL;
548 }
549#define b ((arrayobject *)bb)
550 if (a->ob_descr != b->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000551 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000552 return NULL;
553 }
554 size = a->ob_size + b->ob_size;
555 np = (arrayobject *) newarrayobject(size, a->ob_descr);
556 if (np == NULL) {
557 return NULL;
558 }
559 memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
560 memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
Guido van Rossum32be3a71993-11-05 10:16:27 +0000561 b->ob_item, b->ob_size*b->ob_descr->itemsize);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000562 return (PyObject *)np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000563#undef b
564}
565
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000566static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000567array_repeat(a, n)
568 arrayobject *a;
569 int n;
570{
Guido van Rossum3bbc62e1995-01-02 19:30:30 +0000571 int i;
Guido van Rossum778983b1993-02-19 15:55:02 +0000572 int size;
573 arrayobject *np;
574 char *p;
575 int nbytes;
576 if (n < 0)
577 n = 0;
578 size = a->ob_size * n;
579 np = (arrayobject *) newarrayobject(size, a->ob_descr);
580 if (np == NULL)
581 return NULL;
582 p = np->ob_item;
583 nbytes = a->ob_size * a->ob_descr->itemsize;
584 for (i = 0; i < n; i++) {
585 memcpy(p, a->ob_item, nbytes);
586 p += nbytes;
587 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000588 return (PyObject *) np;
Guido van Rossum778983b1993-02-19 15:55:02 +0000589}
590
591static int
592array_ass_slice(a, ilow, ihigh, v)
593 arrayobject *a;
594 int ilow, ihigh;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000595 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000596{
597 char *item;
598 int n; /* Size of replacement array */
599 int d; /* Change in size */
Guido van Rossum778983b1993-02-19 15:55:02 +0000600#define b ((arrayobject *)v)
601 if (v == NULL)
602 n = 0;
603 else if (is_arrayobject(v)) {
604 n = b->ob_size;
605 if (a == b) {
606 /* Special case "a[i:j] = a" -- copy b first */
607 int ret;
608 v = array_slice(b, 0, n);
609 ret = array_ass_slice(a, ilow, ihigh, v);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000610 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +0000611 return ret;
612 }
613 if (b->ob_descr != a->ob_descr) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000614 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000615 return -1;
616 }
617 }
618 else {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000619 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000620 return -1;
621 }
622 if (ilow < 0)
623 ilow = 0;
624 else if (ilow > a->ob_size)
625 ilow = a->ob_size;
626 if (ihigh < 0)
627 ihigh = 0;
628 if (ihigh < ilow)
629 ihigh = ilow;
630 else if (ihigh > a->ob_size)
631 ihigh = a->ob_size;
632 item = a->ob_item;
633 d = n - (ihigh-ilow);
634 if (d < 0) { /* Delete -d items */
635 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
636 item + ihigh*a->ob_descr->itemsize,
637 (a->ob_size-ihigh)*a->ob_descr->itemsize);
638 a->ob_size += d;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000639 PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000640 /* Can't fail */
641 a->ob_item = item;
642 }
643 else if (d > 0) { /* Insert d items */
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000644 PyMem_RESIZE(item, char,
645 (a->ob_size + d)*a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000646 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000647 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000648 return -1;
649 }
650 memmove(item + (ihigh+d)*a->ob_descr->itemsize,
651 item + ihigh*a->ob_descr->itemsize,
652 (a->ob_size-ihigh)*a->ob_descr->itemsize);
653 a->ob_item = item;
654 a->ob_size += d;
655 }
656 if (n > 0)
657 memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item,
658 n*b->ob_descr->itemsize);
659 return 0;
660#undef b
661}
662
663static int
664array_ass_item(a, i, v)
665 arrayobject *a;
666 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000667 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000668{
669 if (i < 0 || i >= a->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000670 PyErr_SetString(PyExc_IndexError,
671 "array assignment index out of range");
Guido van Rossum778983b1993-02-19 15:55:02 +0000672 return -1;
673 }
674 if (v == NULL)
675 return array_ass_slice(a, i, i+1, v);
676 return (*a->ob_descr->setitem)(a, i, v);
677}
678
679static int
680setarrayitem(a, i, v)
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000681 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +0000682 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000683 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000684{
685 if (!is_arrayobject(a)) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000686 PyErr_BadInternalCall();
Guido van Rossum778983b1993-02-19 15:55:02 +0000687 return -1;
688 }
689 return array_ass_item((arrayobject *)a, i, v);
690}
691
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000692static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000693ins(self, where, v)
694 arrayobject *self;
695 int where;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000696 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +0000697{
698 if (ins1(self, where, v) != 0)
699 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000700 Py_INCREF(Py_None);
701 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000702}
703
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000704static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000705array_insert(self, args)
706 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000707 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000708{
709 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000710 PyObject *v;
711 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000712 return NULL;
713 return ins(self, i, v);
714}
715
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000716static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000717array_append(self, args)
718 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000719 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000720{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000721 PyObject *v;
722 if (!PyArg_Parse(args, "O", &v))
Guido van Rossum778983b1993-02-19 15:55:02 +0000723 return NULL;
724 return ins(self, (int) self->ob_size, v);
725}
726
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000727static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000728array_byteswap(self, args)
729 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000730 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000731{
732 char *p;
733 int i;
734 switch (self->ob_descr->itemsize) {
735 case 1:
736 break;
737 case 2:
738 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) {
739 char p0 = p[0];
740 p[0] = p[1];
741 p[1] = p0;
742 }
743 break;
744 case 4:
745 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) {
746 char p0 = p[0];
747 char p1 = p[1];
748 p[0] = p[3];
749 p[1] = p[2];
750 p[2] = p1;
751 p[3] = p0;
752 }
753 break;
Guido van Rossume77a7571993-11-03 15:01:26 +0000754 case 8:
755 for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) {
756 char p0 = p[0];
757 char p1 = p[1];
758 char p2 = p[2];
759 char p3 = p[3];
760 p[0] = p[7];
761 p[1] = p[6];
762 p[2] = p[5];
763 p[3] = p[4];
764 p[4] = p3;
765 p[5] = p2;
766 p[6] = p1;
767 p[7] = p0;
768 }
769 break;
Guido van Rossum778983b1993-02-19 15:55:02 +0000770 default:
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000771 PyErr_SetString(PyExc_RuntimeError,
Guido van Rossum778983b1993-02-19 15:55:02 +0000772 "don't know how to byteswap this array type");
773 return NULL;
774 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000775 Py_INCREF(Py_None);
776 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000777}
778
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000779static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000780array_reverse(self, args)
781 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000782 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000783{
Guido van Rossume77a7571993-11-03 15:01:26 +0000784 register int itemsize = self->ob_descr->itemsize;
785 register char *p, *q;
786 char tmp[sizeof(double)]; /* Assume that's the max item size */
787
Guido van Rossum778983b1993-02-19 15:55:02 +0000788 if (args != NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000789 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000790 return NULL;
791 }
792
793 if (self->ob_size > 1) {
Guido van Rossume77a7571993-11-03 15:01:26 +0000794 for (p = self->ob_item,
795 q = self->ob_item + (self->ob_size - 1)*itemsize;
796 p < q;
797 p += itemsize, q -= itemsize) {
798 memmove(tmp, p, itemsize);
799 memmove(p, q, itemsize);
800 memmove(q, tmp, itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000801 }
802 }
803
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000804 Py_INCREF(Py_None);
805 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000806}
Guido van Rossume77a7571993-11-03 15:01:26 +0000807
808/* The following routines were adapted from listobject.c but not converted.
809 To make them work you will have to work! */
Guido van Rossum778983b1993-02-19 15:55:02 +0000810
811#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000812static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000813array_index(self, args)
814 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000815 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000816{
817 int i;
818
819 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000820 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000821 return NULL;
822 }
823 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000824 if (PyObject_Compare(self->ob_item[i], args) == 0)
825 return PyInt_FromLong((long)i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000826 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000827 PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000828 return NULL;
829}
830#endif
831
832#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000833static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000834array_count(self, args)
835 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000836 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000837{
838 int count = 0;
839 int i;
840
841 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000842 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000843 return NULL;
844 }
845 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000846 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000847 count++;
848 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000849 return PyInt_FromLong((long)count);
Guido van Rossum778983b1993-02-19 15:55:02 +0000850}
851#endif
852
853#if 0
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000854static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000855array_remove(self, args)
856 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000857 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000858{
859 int i;
860
861 if (args == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000862 PyErr_BadArgument();
Guido van Rossum778983b1993-02-19 15:55:02 +0000863 return NULL;
864 }
865 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000866 if (PyObject_Compare(self->ob_item[i], args) == 0) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +0000867 if (array_ass_slice(self, i, i+1,
868 (PyObject *)NULL) != 0)
Guido van Rossum778983b1993-02-19 15:55:02 +0000869 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000870 Py_INCREF(Py_None);
871 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000872 }
873
874 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000875 PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
Guido van Rossum778983b1993-02-19 15:55:02 +0000876 return NULL;
877}
878#endif
879
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000880static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000881array_fromfile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000882 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000883 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000884{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000885 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000886 int n;
887 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000888 if (!PyArg_Parse(args, "(Oi)", &f, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +0000889 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000890 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000891 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000892 PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000893 return NULL;
894 }
895 if (n > 0) {
896 char *item = self->ob_item;
897 int itemsize = self->ob_descr->itemsize;
898 int nread;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000899 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000900 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000901 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000902 return NULL;
903 }
904 self->ob_item = item;
905 self->ob_size += n;
906 nread = fread(item + (self->ob_size - n) * itemsize,
907 itemsize, n, fp);
908 if (nread < n) {
909 self->ob_size -= (n - nread);
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000910 PyMem_RESIZE(item, char, self->ob_size*itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000911 self->ob_item = item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000912 PyErr_SetString(PyExc_EOFError,
913 "not enough items in file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000914 return NULL;
915 }
916 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000917 Py_INCREF(Py_None);
918 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000919}
920
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000921static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000922array_tofile(self, args)
Guido van Rossum778983b1993-02-19 15:55:02 +0000923 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000924 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000925{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000926 PyObject *f;
Guido van Rossum778983b1993-02-19 15:55:02 +0000927 FILE *fp;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000928 if (!PyArg_Parse(args, "O", &f))
Guido van Rossum778983b1993-02-19 15:55:02 +0000929 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000930 fp = PyFile_AsFile(f);
Guido van Rossum778983b1993-02-19 15:55:02 +0000931 if (fp == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000932 PyErr_SetString(PyExc_TypeError, "arg must be open file");
Guido van Rossum778983b1993-02-19 15:55:02 +0000933 return NULL;
934 }
935 if (self->ob_size > 0) {
Guido van Rossum7844e381997-04-11 20:44:04 +0000936 if ((int)fwrite(self->ob_item, self->ob_descr->itemsize,
Guido van Rossum778983b1993-02-19 15:55:02 +0000937 self->ob_size, fp) != self->ob_size) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000938 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum778983b1993-02-19 15:55:02 +0000939 clearerr(fp);
940 return NULL;
941 }
942 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000943 Py_INCREF(Py_None);
944 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000945}
946
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000947static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000948array_fromlist(self, args)
949 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000950 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000951{
952 int n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000953 PyObject *list;
Guido van Rossum778983b1993-02-19 15:55:02 +0000954 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000955 if (!PyArg_Parse(args, "O", &list))
Guido van Rossum778983b1993-02-19 15:55:02 +0000956 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000957 if (!PyList_Check(list)) {
958 PyErr_SetString(PyExc_TypeError, "arg must be list");
Guido van Rossum778983b1993-02-19 15:55:02 +0000959 return NULL;
960 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000961 n = PyList_Size(list);
Guido van Rossum778983b1993-02-19 15:55:02 +0000962 if (n > 0) {
963 char *item = self->ob_item;
964 int i;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000965 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000966 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000967 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +0000968 return NULL;
969 }
970 self->ob_item = item;
971 self->ob_size += n;
972 for (i = 0; i < n; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000973 PyObject *v = PyList_GetItem(list, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000974 if ((*self->ob_descr->setitem)(self,
975 self->ob_size - n + i, v) != 0) {
976 self->ob_size -= n;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000977 PyMem_RESIZE(item, char,
978 self->ob_size * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +0000979 self->ob_item = item;
980 return NULL;
981 }
982 }
983 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000984 Py_INCREF(Py_None);
985 return Py_None;
Guido van Rossum778983b1993-02-19 15:55:02 +0000986}
987
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000988static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +0000989array_tolist(self, args)
990 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000991 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +0000992{
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000993 PyObject *list = PyList_New(self->ob_size);
Guido van Rossum778983b1993-02-19 15:55:02 +0000994 int i;
995 if (list == NULL)
996 return NULL;
997 for (i = 0; i < self->ob_size; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +0000998 PyObject *v = getarrayitem((PyObject *)self, i);
Guido van Rossum778983b1993-02-19 15:55:02 +0000999 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001000 Py_DECREF(list);
Guido van Rossum778983b1993-02-19 15:55:02 +00001001 return NULL;
1002 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001003 PyList_SetItem(list, i, v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001004 }
1005 return list;
1006}
1007
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001008static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001009array_fromstring(self, args)
1010 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001011 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001012{
1013 char *str;
1014 int n;
1015 int itemsize = self->ob_descr->itemsize;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001016 if (!PyArg_Parse(args, "s#", &str, &n))
Guido van Rossum778983b1993-02-19 15:55:02 +00001017 return NULL;
1018 if (n % itemsize != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001019 PyErr_SetString(PyExc_ValueError,
Guido van Rossum778983b1993-02-19 15:55:02 +00001020 "string length not a multiple of item size");
1021 return NULL;
1022 }
1023 n = n / itemsize;
1024 if (n > 0) {
1025 char *item = self->ob_item;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001026 PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001027 if (item == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001028 PyErr_NoMemory();
Guido van Rossum778983b1993-02-19 15:55:02 +00001029 return NULL;
1030 }
1031 self->ob_item = item;
1032 self->ob_size += n;
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001033 memcpy(item + (self->ob_size - n) * itemsize,
1034 str, itemsize*n);
Guido van Rossum778983b1993-02-19 15:55:02 +00001035 }
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
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001040static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001041array_tostring(self, args)
1042 arrayobject *self;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001043 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001044{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001045 if (!PyArg_Parse(args, ""))
Guido van Rossum778983b1993-02-19 15:55:02 +00001046 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001047 return PyString_FromStringAndSize(self->ob_item,
Guido van Rossum778983b1993-02-19 15:55:02 +00001048 self->ob_size * self->ob_descr->itemsize);
1049}
1050
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001051static PyMethodDef array_methods[] = {
1052 {"append", (PyCFunction)array_append},
1053 {"byteswap", (PyCFunction)array_byteswap},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001054/* {"count", (method)array_count},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001055 {"fromfile", (PyCFunction)array_fromfile},
1056 {"fromlist", (PyCFunction)array_fromlist},
1057 {"fromstring", (PyCFunction)array_fromstring},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001058/* {"index", (method)array_index},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001059 {"insert", (PyCFunction)array_insert},
1060 {"read", (PyCFunction)array_fromfile},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001061/* {"remove", (method)array_remove},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001062 {"reverse", (PyCFunction)array_reverse},
Guido van Rossumb6775db1994-08-01 11:34:53 +00001063/* {"sort", (method)array_sort},*/
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001064 {"tofile", (PyCFunction)array_tofile},
1065 {"tolist", (PyCFunction)array_tolist},
1066 {"tostring", (PyCFunction)array_tostring},
1067 {"write", (PyCFunction)array_tofile},
Guido van Rossum778983b1993-02-19 15:55:02 +00001068 {NULL, NULL} /* sentinel */
1069};
1070
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001071static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001072array_getattr(a, name)
1073 arrayobject *a;
1074 char *name;
1075{
1076 if (strcmp(name, "typecode") == 0) {
1077 char tc = a->ob_descr->typecode;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001078 return PyString_FromStringAndSize(&tc, 1);
Guido van Rossum778983b1993-02-19 15:55:02 +00001079 }
1080 if (strcmp(name, "itemsize") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001081 return PyInt_FromLong((long)a->ob_descr->itemsize);
Guido van Rossum778983b1993-02-19 15:55:02 +00001082 }
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001083 if (strcmp(name, "__members__") == 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001084 PyObject *list = PyList_New(2);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001085 if (list) {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001086 PyList_SetItem(list, 0,
1087 PyString_FromString("typecode"));
1088 PyList_SetItem(list, 1,
1089 PyString_FromString("itemsize"));
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001090 if (PyErr_Occurred()) {
1091 Py_DECREF(list);
Guido van Rossuma3d78fb1993-11-10 09:23:53 +00001092 list = NULL;
1093 }
1094 }
1095 return list;
1096 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001097 return Py_FindMethod(array_methods, (PyObject *)a, name);
Guido van Rossum778983b1993-02-19 15:55:02 +00001098}
1099
1100static int
1101array_print(a, fp, flags)
1102 arrayobject *a;
1103 FILE *fp;
1104 int flags;
1105{
1106 int ok = 0;
1107 int i, len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001108 PyObject *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001109 len = a->ob_size;
1110 if (len == 0) {
1111 fprintf(fp, "array('%c')", a->ob_descr->typecode);
1112 return ok;
1113 }
1114 if (a->ob_descr->typecode == 'c') {
1115 fprintf(fp, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001116 v = array_tostring(a, (PyObject *)NULL);
1117 ok = PyObject_Print(v, fp, 0);
1118 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001119 fprintf(fp, ")");
1120 return ok;
1121 }
1122 fprintf(fp, "array('%c', [", a->ob_descr->typecode);
1123 for (i = 0; i < len && ok == 0; i++) {
1124 if (i > 0)
1125 fprintf(fp, ", ");
1126 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001127 ok = PyObject_Print(v, fp, 0);
1128 Py_XDECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001129 }
1130 fprintf(fp, "])");
1131 return ok;
1132}
1133
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001134static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001135array_repr(a)
1136 arrayobject *a;
1137{
1138 char buf[256];
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001139 PyObject *s, *t, *comma, *v;
Guido van Rossum778983b1993-02-19 15:55:02 +00001140 int i, len;
1141 len = a->ob_size;
1142 if (len == 0) {
1143 sprintf(buf, "array('%c')", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001144 return PyString_FromString(buf);
Guido van Rossum778983b1993-02-19 15:55:02 +00001145 }
1146 if (a->ob_descr->typecode == 'c') {
1147 sprintf(buf, "array('c', ");
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001148 s = PyString_FromString(buf);
1149 v = array_tostring(a, (PyObject *)NULL);
1150 t = PyObject_Repr(v);
1151 Py_XDECREF(v);
1152 PyString_ConcatAndDel(&s, t);
1153 PyString_ConcatAndDel(&s, PyString_FromString(")"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001154 return s;
1155 }
1156 sprintf(buf, "array('%c', [", a->ob_descr->typecode);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001157 s = PyString_FromString(buf);
1158 comma = PyString_FromString(", ");
1159 for (i = 0; i < len && !PyErr_Occurred(); i++) {
Guido van Rossumb6775db1994-08-01 11:34:53 +00001160 if (i > 0)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001161 PyString_Concat(&s, comma);
Guido van Rossum778983b1993-02-19 15:55:02 +00001162 v = (a->ob_descr->getitem)(a, i);
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001163 t = PyObject_Repr(v);
1164 Py_XDECREF(v);
1165 PyString_ConcatAndDel(&s, t);
Guido van Rossum778983b1993-02-19 15:55:02 +00001166 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001167 Py_XDECREF(comma);
1168 PyString_ConcatAndDel(&s, PyString_FromString("])"));
Guido van Rossum778983b1993-02-19 15:55:02 +00001169 return s;
1170}
1171
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001172static int
1173array_buffer_getreadbuf(self, index, ptr)
1174 arrayobject *self;
1175 int index;
1176 const void **ptr;
1177{
1178 if ( index != 0 ) {
1179 PyErr_SetString(PyExc_SystemError, "Accessing non-existent array segment");
1180 return -1;
1181 }
1182 *ptr = (void *)self->ob_item;
1183 return self->ob_size*self->ob_descr->itemsize;
1184}
1185
1186static int
1187array_buffer_getwritebuf(self, index, ptr)
1188 arrayobject *self;
1189 int index;
1190 const void **ptr;
1191{
1192 if ( index != 0 ) {
1193 PyErr_SetString(PyExc_SystemError, "Accessing non-existent array segment");
1194 return -1;
1195 }
1196 *ptr = (void *)self->ob_item;
1197 return self->ob_size*self->ob_descr->itemsize;
1198}
1199
1200static int
1201array_buffer_getsegcount(self, lenp)
1202 arrayobject *self;
1203 int *lenp;
1204{
1205 if ( lenp )
1206 *lenp = self->ob_size*self->ob_descr->itemsize;
1207 return 1;
1208}
1209
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001210static PySequenceMethods array_as_sequence = {
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001211 (inquiry)array_length, /*sq_length*/
1212 (binaryfunc)array_concat, /*sq_concat*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001213 (intargfunc)array_repeat, /*sq_repeat*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001214 (intargfunc)array_item, /*sq_item*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001215 (intintargfunc)array_slice, /*sq_slice*/
1216 (intobjargproc)array_ass_item, /*sq_ass_item*/
1217 (intintobjargproc)array_ass_slice, /*sq_ass_slice*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001218};
1219
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001220static PyBufferProcs array_as_buffer = {
1221 (getreadbufferproc)array_buffer_getreadbuf,
1222 (getwritebufferproc)array_buffer_getwritebuf,
1223 (getsegcountproc)array_buffer_getsegcount,
1224};
1225
1226
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001227statichere PyTypeObject Arraytype = {
1228 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum778983b1993-02-19 15:55:02 +00001229 0,
1230 "array",
1231 sizeof(arrayobject),
1232 0,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001233 (destructor)array_dealloc, /*tp_dealloc*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001234 (printfunc)array_print, /*tp_print*/
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001235 (getattrfunc)array_getattr, /*tp_getattr*/
Guido van Rossumb6775db1994-08-01 11:34:53 +00001236 0, /*tp_setattr*/
1237 (cmpfunc)array_compare, /*tp_compare*/
1238 (reprfunc)array_repr, /*tp_repr*/
1239 0, /*tp_as_number*/
1240 &array_as_sequence, /*tp_as_sequence*/
1241 0, /*tp_as_mapping*/
Guido van Rossumfdf95dd1997-05-05 22:15:02 +00001242 0, /*tp_hash*/
1243 0, /*tp_call*/
1244 0, /*tp_str*/
1245 0, /*tp_getattro*/
1246 0, /*tp_setattro*/
1247 &array_as_buffer, /*tp_as_buffer*/
1248 0, /*tp_xxx4*/
1249 0, /*tp_doc*/
Guido van Rossum778983b1993-02-19 15:55:02 +00001250};
1251
1252
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001253static PyObject *
Guido van Rossum778983b1993-02-19 15:55:02 +00001254a_array(self, args)
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001255 PyObject *self;
1256 PyObject *args;
Guido van Rossum778983b1993-02-19 15:55:02 +00001257{
1258 char c;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001259 PyObject *initial = NULL;
Guido van Rossum778983b1993-02-19 15:55:02 +00001260 struct arraydescr *descr;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001261 if (!PyArg_Parse(args, "c", &c)) {
1262 PyErr_Clear();
1263 if (!PyArg_Parse(args, "(cO)", &c, &initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001264 return NULL;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001265 if (!PyList_Check(initial) && !PyString_Check(initial)) {
1266 PyErr_SetString(PyExc_TypeError,
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001267 "array initializer must be list or string");
Guido van Rossum778983b1993-02-19 15:55:02 +00001268 return NULL;
1269 }
1270 }
1271 for (descr = descriptors; descr->typecode != '\0'; descr++) {
1272 if (descr->typecode == c) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001273 PyObject *a;
Guido van Rossum778983b1993-02-19 15:55:02 +00001274 int len;
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001275 if (initial == NULL || !PyList_Check(initial))
Guido van Rossum778983b1993-02-19 15:55:02 +00001276 len = 0;
1277 else
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001278 len = PyList_Size(initial);
Guido van Rossum778983b1993-02-19 15:55:02 +00001279 a = newarrayobject(len, descr);
1280 if (a == NULL)
1281 return NULL;
1282 if (len > 0) {
1283 int i;
1284 for (i = 0; i < len; i++) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001285 PyObject *v =
1286 PyList_GetItem(initial, i);
Guido van Rossum778983b1993-02-19 15:55:02 +00001287 if (setarrayitem(a, i, v) != 0) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001288 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001289 return NULL;
1290 }
1291 }
1292 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001293 if (initial != NULL && PyString_Check(initial)) {
1294 PyObject *v =
Guido van Rossum778983b1993-02-19 15:55:02 +00001295 array_fromstring((arrayobject *)a, initial);
1296 if (v == NULL) {
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001297 Py_DECREF(a);
Guido van Rossum778983b1993-02-19 15:55:02 +00001298 return NULL;
1299 }
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001300 Py_DECREF(v);
Guido van Rossum778983b1993-02-19 15:55:02 +00001301 }
1302 return a;
1303 }
1304 }
Roger E. Masse5817f8f1996-12-09 22:24:19 +00001305 PyErr_SetString(PyExc_ValueError,
Guido van Rossum549ab711997-01-03 19:09:47 +00001306 "bad typecode (must be c, b, B, h, H, i, I, l, L, f or d)");
Guido van Rossum778983b1993-02-19 15:55:02 +00001307 return NULL;
1308}
1309
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001310static PyMethodDef a_methods[] = {
Guido van Rossum778983b1993-02-19 15:55:02 +00001311 {"array", a_array},
1312 {NULL, NULL} /* sentinel */
1313};
1314
1315void
1316initarray()
1317{
Roger E. Masse2919eaa1996-12-09 20:10:36 +00001318 Py_InitModule("array", a_methods);
Guido van Rossum778983b1993-02-19 15:55:02 +00001319}