arraymodule.c revision 2919eaaf081564461a3d751929b2d9fcc924231e
1778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/*********************************************************** 2524b588553afb0759c5be590a7aa41db92dcd2aeGuido van RossumCopyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam, 3524b588553afb0759c5be590a7aa41db92dcd2aeGuido van RossumThe Netherlands. 4778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 5778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum All Rights Reserved 6778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 7d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPermission to use, copy, modify, and distribute this software and its 8d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumdocumentation for any purpose and without fee is hereby granted, 9778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumprovided that the above copyright notice appear in all copies and that 10d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumboth that copyright notice and this permission notice appear in 11778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsupporting documentation, and that the names of Stichting Mathematisch 12d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCentrum or CWI or Corporation for National Research Initiatives or 13d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCNRI not be used in advertising or publicity pertaining to 14d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumdistribution of the software without specific, written prior 15d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumpermission. 16d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum 17d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumWhile CWI is the initial source for this software, a modified version 18d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossumis made available by the Corporation for National Research Initiatives 19d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum(CNRI) at the Internet address ftp://ftp.python.org. 20d266eb460e20ded087d01a29da0a230e235afc40Guido van Rossum 21d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumSTICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH 22d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumREGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF 23d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumMERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH 24d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumCENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL 25d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumDAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR 26d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER 27d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumTORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 28d266eb460e20ded087d01a29da0a230e235afc40Guido van RossumPERFORMANCE OF THIS SOFTWARE. 29778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 30778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum******************************************************************/ 31778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 32778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Array object implementation */ 33778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 34778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* An array is a uniform list -- all items have the same type. 35778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum The item type is restricted to simple C types like int or float */ 36778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 372919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse#include "Python.h" 38778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "modsupport.h" 39778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#include "ceval.h" 400c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#ifdef STDC_HEADERS 410c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#include <stddef.h> 420c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#else 43b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum#include <sys/types.h> /* For size_t */ 440c7095484ee84253d00fd064512a5b203c3bae6fGuido van Rossum#endif 45778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 46778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arrayobject; /* Forward */ 47778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 48778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstruct arraydescr { 49778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int typecode; 50778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int itemsize; 512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int)); 522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *)); 53778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}; 54778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 55778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumtypedef struct arrayobject { 562919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject_VAR_HEAD 57778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *ob_item; 58778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum struct arraydescr *ob_descr; 59778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} arrayobject; 60778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestaticforward PyTypeObject Arraytype; 62778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 63778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define is_arrayobject(op) ((op)->ob_type == &Arraytype) 64778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 65b73cc04e625511f41c63b880b418338af70dc8bdGuido van Rossum/* Forward */ 662919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *newarrayobject Py_PROTO((int, struct arraydescr *)); 67a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0 682919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int getarraysize Py_PROTO((PyObject *)); 69a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif 702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject *getarrayitem Py_PROTO((PyObject *, int)); 712919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int setarrayitem Py_PROTO((PyObject *, int, PyObject *)); 72a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0 732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int insarrayitem Py_PROTO((PyObject *, int, PyObject *)); 742919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic int addarrayitem Py_PROTO((PyObject *, PyObject *)); 75a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif 76778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 772919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 78778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_getitem(ap, i) 79778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 80778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 81778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1); 83778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 84778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 85778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 86778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumc_setitem(ap, i, v) 87778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 88778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 892919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 90778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 91778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char x; 922919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "c;array item must be char", &x)) 93778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 94778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i >= 0) 95778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ((char *)ap->ob_item)[i] = x; 96778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 97778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 98778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 100778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_getitem(ap, i) 101778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 102778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 103778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 104778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum long x = ((char *)ap->ob_item)[i]; 105778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (x >= 128) 106778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum x -= 256; 1072919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong(x); 108778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumb_setitem(ap, i, v) 112778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 1142919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 115778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char x; 1172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "b;array item must be integer", &x)) 118778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i >= 0) 120778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ((char *)ap->ob_item)[i] = x; 121778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 122778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 1242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 125778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_getitem(ap, i) 126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 1292919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong((long) ((short *)ap->ob_item)[i]); 130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 132778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumh_setitem(ap, i, v) 134778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 1362919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 137778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum short x; 1392919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "h;array item must be integer", &x)) 140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i >= 0) 142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ((short *)ap->ob_item)[i] = x; 143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 144778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 145778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 1462919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 147e77a757094f68351f336044654cd91575c677896Guido van Rossumi_getitem(ap, i) 148e77a757094f68351f336044654cd91575c677896Guido van Rossum arrayobject *ap; 149e77a757094f68351f336044654cd91575c677896Guido van Rossum int i; 150e77a757094f68351f336044654cd91575c677896Guido van Rossum{ 1512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong((long) ((int *)ap->ob_item)[i]); 152e77a757094f68351f336044654cd91575c677896Guido van Rossum} 153e77a757094f68351f336044654cd91575c677896Guido van Rossum 154e77a757094f68351f336044654cd91575c677896Guido van Rossumstatic int 155e77a757094f68351f336044654cd91575c677896Guido van Rossumi_setitem(ap, i, v) 156e77a757094f68351f336044654cd91575c677896Guido van Rossum arrayobject *ap; 157e77a757094f68351f336044654cd91575c677896Guido van Rossum int i; 1582919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 159e77a757094f68351f336044654cd91575c677896Guido van Rossum{ 160e77a757094f68351f336044654cd91575c677896Guido van Rossum int x; 1612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "i;array item must be integer", &x)) 162e77a757094f68351f336044654cd91575c677896Guido van Rossum return -1; 163e77a757094f68351f336044654cd91575c677896Guido van Rossum if (i >= 0) 164e77a757094f68351f336044654cd91575c677896Guido van Rossum ((int *)ap->ob_item)[i] = x; 165e77a757094f68351f336044654cd91575c677896Guido van Rossum return 0; 166e77a757094f68351f336044654cd91575c677896Guido van Rossum} 167e77a757094f68351f336044654cd91575c677896Guido van Rossum 1682919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_getitem(ap, i) 170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 1732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong(((long *)ap->ob_item)[i]); 174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 176778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuml_setitem(ap, i, v) 178778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 179778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 1802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 181778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 182778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum long x; 1832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "l;array item must be integer", &x)) 184778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 185778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i >= 0) 186778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ((long *)ap->ob_item)[i] = x; 187778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 188778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 189778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 1902919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 191778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_getitem(ap, i) 192778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 193778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 194778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 1952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]); 196778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 197778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 198778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 199778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumf_setitem(ap, i, v) 200778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 201778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 2022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 203778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 204778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum float x; 2052919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "f;array item must be float", &x)) 206778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 207778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i >= 0) 208778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ((float *)ap->ob_item)[i] = x; 209778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 210778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 211778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 2122919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 213778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_getitem(ap, i) 214778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 215778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 216778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 2172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyFloat_FromDouble(((double *)ap->ob_item)[i]); 218778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 219778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 220778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 221778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumd_setitem(ap, i, v) 222778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *ap; 223778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 2242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 225778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 226778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum double x; 2272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(v, "d;array item must be float", &x)) 228778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 229778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i >= 0) 230778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ((double *)ap->ob_item)[i] = x; 231778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 232778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 233778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 234778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Description of types */ 235234f942aefb779efa6cfb7225e21d16a3f7e80f7Guido van Rossumstatic struct arraydescr descriptors[] = { 236778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'c', sizeof(char), c_getitem, c_setitem}, 237778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'b', sizeof(char), b_getitem, b_setitem}, 238778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'h', sizeof(short), h_getitem, h_setitem}, 239e77a757094f68351f336044654cd91575c677896Guido van Rossum {'i', sizeof(int), i_getitem, i_setitem}, 240778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'l', sizeof(long), l_getitem, l_setitem}, 241778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'f', sizeof(float), f_getitem, f_setitem}, 242778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'d', sizeof(double), d_getitem, d_setitem}, 243778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {'\0', 0, 0, 0} /* Sentinel */ 244778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}; 245e77a757094f68351f336044654cd91575c677896Guido van Rossum/* If we ever allow items larger than double, we must change reverse()! */ 246778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 247778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 2482919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 249778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumnewarrayobject(size, descr) 250778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int size; 251778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum struct arraydescr *descr; 252778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 253778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *op; 254b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum size_t nbytes; 255778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (size < 0) { 2562919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 257778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 258778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 259778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum nbytes = size * descr->itemsize; 260778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum /* Check for overflow */ 261778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (nbytes / descr->itemsize != size) { 2622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyErr_NoMemory(); 263778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 2642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse op = PyMem_NEW(arrayobject, 1); 265778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (op == NULL) { 2662919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyErr_NoMemory(); 267778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 268778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (size <= 0) { 269778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum op->ob_item = NULL; 270778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 271778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else { 2722919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse op->ob_item = PyMem_NEW(char, nbytes); 273778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (op->ob_item == NULL) { 2742919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_DEL(op); 2752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyErr_NoMemory(); 276778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 277778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 278778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum op->ob_type = &Arraytype; 279778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum op->ob_size = size; 280778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum op->ob_descr = descr; 2812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse _Py_NewReference(op); 2822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return (PyObject *) op; 283778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 284778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 285a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0 28662de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int 287778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarraysize(op) 2882919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *op; 289778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 290778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (!is_arrayobject(op)) { 2912919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 292778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 293778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 294778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ((arrayobject *)op) -> ob_size; 295778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 296a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif 297778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 2982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 299778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumgetarrayitem(op, i) 3002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *op; 301778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 302778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 303778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum register arrayobject *ap; 304778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (!is_arrayobject(op)) { 3052919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 306778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 307778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 308778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ap = (arrayobject *)op; 309778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i < 0 || i >= ap->ob_size) { 3102919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_IndexError, "array index out of range"); 311778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 312778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 313778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return (*ap->ob_descr->getitem)(ap, i); 314778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 315778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 316778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 317778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins1(self, where, v) 318778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 319778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int where; 3202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 321778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 322778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *items; 323778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (v == NULL) { 3242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 325778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 326778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 327778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if ((*self->ob_descr->setitem)(self, -1, v) < 0) 328778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 329778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum items = self->ob_item; 3302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize); 331778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (items == NULL) { 3322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_NoMemory(); 333778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 334778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 335778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (where < 0) 336778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum where = 0; 337778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (where > self->ob_size) 338778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum where = self->ob_size; 339778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memmove(items + (where+1)*self->ob_descr->itemsize, 340778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum items + where*self->ob_descr->itemsize, 341778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum (self->ob_size-where)*self->ob_descr->itemsize); 342778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_item = items; 343778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size++; 344778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return (*self->ob_descr->setitem)(self, where, v); 345778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 346778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 347a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#if 0 34862de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int 349778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminsarrayitem(op, where, newitem) 3502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *op; 351778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int where; 3522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *newitem; 353778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 354778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (!is_arrayobject(op)) { 3552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 356778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 357778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 358778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ins1((arrayobject *)op, where, newitem); 359778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 360778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 36162de97f29c90436f967c13050c93fbd1ac1ae88fGuido van Rossumstatic int 362778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumaddarrayitem(op, newitem) 3632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *op; 3642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *newitem; 365778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 366778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (!is_arrayobject(op)) { 3672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 368778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 369778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 370778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ins1((arrayobject *)op, 371778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum (int) ((arrayobject *)op)->ob_size, newitem); 372778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 373a376cc5cc86c62f912886c4002ed1a9b3b213b88Guido van Rossum#endif 374778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 375778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum/* Methods */ 376778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 377778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic void 378778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_dealloc(op) 379778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *op; 380778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 381778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (op->ob_item != NULL) 3822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_DEL(op->ob_item); 3832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_DEL(op); 384778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 385778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 386778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 387778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_compare(v, w) 388778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *v, *w; 389778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 390778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size; 391778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 392778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < len; i++) { 3932919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *ai, *bi; 394778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int cmp; 3952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse ai = getarrayitem((PyObject *)v, i); 3962919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse bi = getarrayitem((PyObject *)w, i); 397778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ai && bi) 3982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse cmp = PyObject_Compare(ai, bi); 399778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else 400778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum cmp = -1; 4012919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(ai); 4022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(bi); 403778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (cmp != 0) { 4042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_Clear(); /* XXX Can't report errors here */ 405778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return cmp; 406778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 407778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 408778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return v->ob_size - w->ob_size; 409778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 410778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 411778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 412778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_length(a) 413778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 414778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 415778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return a->ob_size; 416778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 417778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 4182919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 419778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_item(a, i) 420778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 421778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 422778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 423778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i < 0 || i >= a->ob_size) { 4242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_IndexError, "array index out of range"); 425778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 426778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 4272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return getarrayitem((PyObject *)a, i); 428778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 429778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 4302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 431778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_slice(a, ilow, ihigh) 432778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 433778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int ilow, ihigh; 434778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 435778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *np; 436778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ilow < 0) 437778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ilow = 0; 438778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else if (ilow > a->ob_size) 439778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ilow = a->ob_size; 440778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ihigh < 0) 441778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ihigh = 0; 442778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ihigh < ilow) 443778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ihigh = ilow; 444778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else if (ihigh > a->ob_size) 445778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ihigh = a->ob_size; 446778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum np = (arrayobject *) newarrayobject(ihigh - ilow, a->ob_descr); 447778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (np == NULL) 448778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 449778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize, 450778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum (ihigh-ilow) * a->ob_descr->itemsize); 4512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return (PyObject *)np; 452778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 453778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 4542919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 455778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_concat(a, bb) 456778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 4572919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *bb; 458778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 459778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int size; 460778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *np; 461778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (!is_arrayobject(bb)) { 4622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 463778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 464778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 465778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)bb) 466778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (a->ob_descr != b->ob_descr) { 4672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 468778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 469778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 470778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum size = a->ob_size + b->ob_size; 471778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum np = (arrayobject *) newarrayobject(size, a->ob_descr); 472778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (np == NULL) { 473778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 474778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 475778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize); 476778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize, 47732be3a7a88fd2aae37cdd250f547c0687312c152Guido van Rossum b->ob_item, b->ob_size*b->ob_descr->itemsize); 4782919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return (PyObject *)np; 479778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b 480778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 481778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 4822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 483778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repeat(a, n) 484778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 485778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int n; 486778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 4873bbc62e9c25d4c006cd21d6b1314ccf0ba211382Guido van Rossum int i; 488778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int size; 489778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *np; 490778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *p; 491778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int nbytes; 492778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (n < 0) 493778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum n = 0; 494778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum size = a->ob_size * n; 495778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum np = (arrayobject *) newarrayobject(size, a->ob_descr); 496778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (np == NULL) 497778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 498778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p = np->ob_item; 499778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum nbytes = a->ob_size * a->ob_descr->itemsize; 500778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < n; i++) { 501778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memcpy(p, a->ob_item, nbytes); 502778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p += nbytes; 503778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 5042919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return (PyObject *) np; 505778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 506778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 507778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 508778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_slice(a, ilow, ihigh, v) 509778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 510778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int ilow, ihigh; 5112919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 512778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 513778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *item; 514778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int n; /* Size of replacement array */ 515778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int d; /* Change in size */ 516778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#define b ((arrayobject *)v) 517778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (v == NULL) 518778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum n = 0; 519778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else if (is_arrayobject(v)) { 520778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum n = b->ob_size; 521778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (a == b) { 522778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum /* Special case "a[i:j] = a" -- copy b first */ 523778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int ret; 524778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum v = array_slice(b, 0, n); 525778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ret = array_ass_slice(a, ilow, ihigh, v); 5262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_DECREF(v); 527778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ret; 528778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 529778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (b->ob_descr != a->ob_descr) { 5302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 531778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 532778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 533778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 534778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else { 5352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 536778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 537778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 538778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ilow < 0) 539778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ilow = 0; 540778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else if (ilow > a->ob_size) 541778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ilow = a->ob_size; 542778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ihigh < 0) 543778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ihigh = 0; 544778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ihigh < ilow) 545778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ihigh = ilow; 546778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else if (ihigh > a->ob_size) 547778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum ihigh = a->ob_size; 548778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum item = a->ob_item; 549778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum d = n - (ihigh-ilow); 550778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (d < 0) { /* Delete -d items */ 551778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memmove(item + (ihigh+d)*a->ob_descr->itemsize, 552778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum item + ihigh*a->ob_descr->itemsize, 553778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum (a->ob_size-ihigh)*a->ob_descr->itemsize); 554778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum a->ob_size += d; 5552919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize); 556778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum /* Can't fail */ 557778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum a->ob_item = item; 558778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 559778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else if (d > 0) { /* Insert d items */ 5602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, 5612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse (a->ob_size + d)*a->ob_descr->itemsize); 562778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (item == NULL) { 5632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_NoMemory(); 564778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 565778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 566778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memmove(item + (ihigh+d)*a->ob_descr->itemsize, 567778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum item + ihigh*a->ob_descr->itemsize, 568778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum (a->ob_size-ihigh)*a->ob_descr->itemsize); 569778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum a->ob_item = item; 570778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum a->ob_size += d; 571778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 572778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (n > 0) 573778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memcpy(item + ilow*a->ob_descr->itemsize, b->ob_item, 574778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum n*b->ob_descr->itemsize); 575778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return 0; 576778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#undef b 577778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 578778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 579778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 580778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_ass_item(a, i, v) 581778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 582778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 5832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 584778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 585778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i < 0 || i >= a->ob_size) { 5862919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_IndexError, 5872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse "array assignment index out of range"); 588778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 589778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 590778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (v == NULL) 591778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return array_ass_slice(a, i, i+1, v); 592778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return (*a->ob_descr->setitem)(a, i, v); 593778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 594778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 595778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 596778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumsetarrayitem(a, i, v) 5972919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *a; 598778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 5992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 600778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 601778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (!is_arrayobject(a)) { 6022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadInternalCall(); 603778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return -1; 604778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 605778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return array_ass_item((arrayobject *)a, i, v); 606778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 607778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 6082919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 609778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumins(self, where, v) 610778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 611778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int where; 6122919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 613778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 614778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (ins1(self, where, v) != 0) 615778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 6162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 6172919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 618778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 619778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 6202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 621778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_insert(self, args) 622778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 6232919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 624778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 625778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 6262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 6272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "(iO)", &i, &v)) 628778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 629778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ins(self, i, v); 630778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 631778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 6322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 633778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_append(self, args) 634778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 6352919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 636778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 6372919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 6382919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "O", &v)) 639778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 640778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ins(self, (int) self->ob_size, v); 641778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 642778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 6432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 644778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_byteswap(self, args) 645778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 6462919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 647778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 648778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *p; 649778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 650778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum switch (self->ob_descr->itemsize) { 651778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum case 1: 652778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum break; 653778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum case 2: 654778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 2) { 655778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char p0 = p[0]; 656778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p[0] = p[1]; 657778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p[1] = p0; 658778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 659778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum break; 660778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum case 4: 661778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 4) { 662778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char p0 = p[0]; 663778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char p1 = p[1]; 664778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p[0] = p[3]; 665778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p[1] = p[2]; 666778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p[2] = p1; 667778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum p[3] = p0; 668778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 669778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum break; 670e77a757094f68351f336044654cd91575c677896Guido van Rossum case 8: 671e77a757094f68351f336044654cd91575c677896Guido van Rossum for (p = self->ob_item, i = self->ob_size; --i >= 0; p += 8) { 672e77a757094f68351f336044654cd91575c677896Guido van Rossum char p0 = p[0]; 673e77a757094f68351f336044654cd91575c677896Guido van Rossum char p1 = p[1]; 674e77a757094f68351f336044654cd91575c677896Guido van Rossum char p2 = p[2]; 675e77a757094f68351f336044654cd91575c677896Guido van Rossum char p3 = p[3]; 676e77a757094f68351f336044654cd91575c677896Guido van Rossum p[0] = p[7]; 677e77a757094f68351f336044654cd91575c677896Guido van Rossum p[1] = p[6]; 678e77a757094f68351f336044654cd91575c677896Guido van Rossum p[2] = p[5]; 679e77a757094f68351f336044654cd91575c677896Guido van Rossum p[3] = p[4]; 680e77a757094f68351f336044654cd91575c677896Guido van Rossum p[4] = p3; 681e77a757094f68351f336044654cd91575c677896Guido van Rossum p[5] = p2; 682e77a757094f68351f336044654cd91575c677896Guido van Rossum p[6] = p1; 683e77a757094f68351f336044654cd91575c677896Guido van Rossum p[7] = p0; 684e77a757094f68351f336044654cd91575c677896Guido van Rossum } 685e77a757094f68351f336044654cd91575c677896Guido van Rossum break; 686778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum default: 6872919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_RuntimeError, 688778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum "don't know how to byteswap this array type"); 689778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 690778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 6912919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 6922919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 693778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 694778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 6952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 696778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_reverse(self, args) 697778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 6982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 699778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 700e77a757094f68351f336044654cd91575c677896Guido van Rossum register int itemsize = self->ob_descr->itemsize; 701e77a757094f68351f336044654cd91575c677896Guido van Rossum register char *p, *q; 702e77a757094f68351f336044654cd91575c677896Guido van Rossum char tmp[sizeof(double)]; /* Assume that's the max item size */ 703e77a757094f68351f336044654cd91575c677896Guido van Rossum 704778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (args != NULL) { 7052919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 706778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 707778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 708778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 709778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (self->ob_size > 1) { 710e77a757094f68351f336044654cd91575c677896Guido van Rossum for (p = self->ob_item, 711e77a757094f68351f336044654cd91575c677896Guido van Rossum q = self->ob_item + (self->ob_size - 1)*itemsize; 712e77a757094f68351f336044654cd91575c677896Guido van Rossum p < q; 713e77a757094f68351f336044654cd91575c677896Guido van Rossum p += itemsize, q -= itemsize) { 714e77a757094f68351f336044654cd91575c677896Guido van Rossum memmove(tmp, p, itemsize); 715e77a757094f68351f336044654cd91575c677896Guido van Rossum memmove(p, q, itemsize); 716e77a757094f68351f336044654cd91575c677896Guido van Rossum memmove(q, tmp, itemsize); 717778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 718778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 719778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 7202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 7212919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 722778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 723e77a757094f68351f336044654cd91575c677896Guido van Rossum 724e77a757094f68351f336044654cd91575c677896Guido van Rossum/* The following routines were adapted from listobject.c but not converted. 725e77a757094f68351f336044654cd91575c677896Guido van Rossum To make them work you will have to work! */ 726778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 727778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0 7282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 729778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_index(self, args) 730778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 7312919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 732778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 733778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 734778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 735778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (args == NULL) { 7362919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 737778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 738778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 739778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < self->ob_size; i++) { 7402919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (PyObject_Compare(self->ob_item[i], args) == 0) 7412919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong((long)i); 742778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 7432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array"); 744778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 745778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 746778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif 747778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 748778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0 7492919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 750778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_count(self, args) 751778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 7522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 753778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 754778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int count = 0; 755778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 756778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 757778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (args == NULL) { 7582919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 759778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 760778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 761778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < self->ob_size; i++) { 7622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (PyObject_Compare(self->ob_item[i], args) == 0) 763778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum count++; 764778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 7652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong((long)count); 766778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 767778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif 768778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 769778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#if 0 7702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 771778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_remove(self, args) 772778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 7732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 774778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 775778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 776778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 777778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (args == NULL) { 7782919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_BadArgument(); 779778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 780778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 781778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < self->ob_size; i++) { 7822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (PyObject_Compare(self->ob_item[i], args) == 0) { 7832919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) 784778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 7852919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 7862919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 787778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 788778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 789778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 7902919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array"); 791778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 792778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 793778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum#endif 794778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 7952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 796e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_fromfile(self, args) 797778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 7982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 799778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 8002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *f; 801778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int n; 802778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum FILE *fp; 8032919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "(Oi)", &f, &n)) 804778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 8052919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse fp = PyFile_AsFile(f); 806778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (fp == NULL) { 8072919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_TypeError, "arg1 must be open file"); 808778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 809778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 810778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (n > 0) { 811778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *item = self->ob_item; 812778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int itemsize = self->ob_descr->itemsize; 813778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int nread; 8142919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize); 815778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (item == NULL) { 8162919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_NoMemory(); 817778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 818778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 819778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_item = item; 820778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size += n; 821778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum nread = fread(item + (self->ob_size - n) * itemsize, 822778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum itemsize, n, fp); 823778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (nread < n) { 824778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size -= (n - nread); 8252919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, self->ob_size*itemsize); 826778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_item = item; 8272919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_EOFError, 8282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse "not enough items in file"); 829778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 830778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 831778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 8322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 8332919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 834778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 835778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 8362919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 837e77a757094f68351f336044654cd91575c677896Guido van Rossumarray_tofile(self, args) 838778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 8392919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 840778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 8412919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *f; 842778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum FILE *fp; 8432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "O", &f)) 844778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 8452919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse fp = PyFile_AsFile(f); 846778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (fp == NULL) { 8472919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_TypeError, "arg must be open file"); 848778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 849778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 850778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (self->ob_size > 0) { 851778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (fwrite(self->ob_item, self->ob_descr->itemsize, 852778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size, fp) != self->ob_size) { 8532919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetFromErrno(PyExc_IOError); 854778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum clearerr(fp); 855778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 856778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 857778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 8582919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 8592919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 860778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 861778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 8622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 863778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromlist(self, args) 864778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 8652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 866778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 867778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int n; 8682919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *list; 869778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int itemsize = self->ob_descr->itemsize; 8702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "O", &list)) 871778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 8722919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyList_Check(list)) { 8732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_TypeError, "arg must be list"); 874778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 875778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 8762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse n = PyList_Size(list); 877778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (n > 0) { 878778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *item = self->ob_item; 879778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 8802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize); 881778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (item == NULL) { 8822919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_NoMemory(); 883778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 884778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 885778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_item = item; 886778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size += n; 887778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < n; i++) { 8882919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v = PyList_GetItem(list, i); 889778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if ((*self->ob_descr->setitem)(self, 890778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size - n + i, v) != 0) { 891778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size -= n; 8922919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, 8932919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse self->ob_size * itemsize); 894778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_item = item; 895778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 896778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 897778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 898778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 8992919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 9002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 901778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 902778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 9032919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 904778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tolist(self, args) 905778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 9062919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 907778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 9082919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *list = PyList_New(self->ob_size); 909778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 910778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (list == NULL) 911778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 912778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < self->ob_size; i++) { 9132919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v = getarrayitem((PyObject *)self, i); 914778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (v == NULL) { 9152919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_DECREF(list); 916778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 917778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 9182919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyList_SetItem(list, i, v); 919778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 920778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return list; 921778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 922778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 9232919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 924778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_fromstring(self, args) 925778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 9262919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 927778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 928778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *str; 929778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int n; 930778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int itemsize = self->ob_descr->itemsize; 9312919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "s#", &str, &n)) 932778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 933778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (n % itemsize != 0) { 9342919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_ValueError, 935778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum "string length not a multiple of item size"); 936778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 937778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 938778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum n = n / itemsize; 939778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (n > 0) { 940778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *item = self->ob_item; 9412919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize); 942778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (item == NULL) { 9432919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_NoMemory(); 944778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 945778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 946778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_item = item; 947778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size += n; 948778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum memcpy(item + (self->ob_size - n) * itemsize, str, itemsize*n); 949778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 9502919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_INCREF(Py_None); 9512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_None; 952778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 953778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 9542919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 955778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_tostring(self, args) 956778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *self; 9572919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 958778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 9592919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "")) 960778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 9612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyString_FromStringAndSize(self->ob_item, 962778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum self->ob_size * self->ob_descr->itemsize); 963778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 964778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 9652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyMethodDef array_methods[] = { 9662919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"append", (PyCFunction)array_append}, 9672919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"byteswap", (PyCFunction)array_byteswap}, 968b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/* {"count", (method)array_count},*/ 9692919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"fromfile", (PyCFunction)array_fromfile}, 9702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"fromlist", (PyCFunction)array_fromlist}, 9712919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"fromstring", (PyCFunction)array_fromstring}, 972b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/* {"index", (method)array_index},*/ 9732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"insert", (PyCFunction)array_insert}, 9742919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"read", (PyCFunction)array_fromfile}, 975b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/* {"remove", (method)array_remove},*/ 9762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"reverse", (PyCFunction)array_reverse}, 977b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum/* {"sort", (method)array_sort},*/ 9782919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"tofile", (PyCFunction)array_tofile}, 9792919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"tolist", (PyCFunction)array_tolist}, 9802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"tostring", (PyCFunction)array_tostring}, 9812919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse {"write", (PyCFunction)array_tofile}, 982778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {NULL, NULL} /* sentinel */ 983778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}; 984778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 9852919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 986778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_getattr(a, name) 987778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 988778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char *name; 989778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 990778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (strcmp(name, "typecode") == 0) { 991778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char tc = a->ob_descr->typecode; 9922919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyString_FromStringAndSize(&tc, 1); 993778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 994778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (strcmp(name, "itemsize") == 0) { 9952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyInt_FromLong((long)a->ob_descr->itemsize); 996778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 997a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum if (strcmp(name, "__members__") == 0) { 9982919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *list = PyList_New(2); 999a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum if (list) { 10002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyList_SetItem(list, 0, PyString_FromString("typecode")); 10012919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyList_SetItem(list, 1, PyString_FromString("itemsize")); 10022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (PyErr_Occurred()) { 10032919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_DECREF(list); 1004a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum list = NULL; 1005a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum } 1006a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum } 1007a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum return list; 1008a3d78fb268da5cf7cd4d990cf118bfc01650a8d9Guido van Rossum } 10092919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return Py_FindMethod(array_methods, (PyObject *)a, name); 1010778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 1011778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 1012778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumstatic int 1013778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_print(a, fp, flags) 1014778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 1015778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum FILE *fp; 1016778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int flags; 1017778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 1018778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int ok = 0; 1019778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i, len; 10202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v; 1021778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum len = a->ob_size; 1022778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (len == 0) { 1023778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum fprintf(fp, "array('%c')", a->ob_descr->typecode); 1024778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ok; 1025778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1026778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (a->ob_descr->typecode == 'c') { 1027778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum fprintf(fp, "array('c', "); 10282919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse v = array_tostring(a, (PyObject *)NULL); 10292919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse ok = PyObject_Print(v, fp, 0); 10302919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(v); 1031778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum fprintf(fp, ")"); 1032778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ok; 1033778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1034778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum fprintf(fp, "array('%c', [", a->ob_descr->typecode); 1035778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < len && ok == 0; i++) { 1036778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (i > 0) 1037778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum fprintf(fp, ", "); 1038778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum v = (a->ob_descr->getitem)(a, i); 10392919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse ok = PyObject_Print(v, fp, 0); 10402919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(v); 1041778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1042778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum fprintf(fp, "])"); 1043778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return ok; 1044778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 1045778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 10462919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 1047778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumarray_repr(a) 1048778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum arrayobject *a; 1049778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 1050778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char buf[256]; 10512919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *s, *t, *comma, *v; 1052778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i, len; 1053778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum len = a->ob_size; 1054778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (len == 0) { 1055778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum sprintf(buf, "array('%c')", a->ob_descr->typecode); 10562919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse return PyString_FromString(buf); 1057778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1058778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (a->ob_descr->typecode == 'c') { 1059778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum sprintf(buf, "array('c', "); 10602919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse s = PyString_FromString(buf); 10612919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse v = array_tostring(a, (PyObject *)NULL); 10622919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse t = PyObject_Repr(v); 10632919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(v); 10642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyString_ConcatAndDel(&s, t); 10652919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyString_ConcatAndDel(&s, PyString_FromString(")")); 1066778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return s; 1067778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1068778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum sprintf(buf, "array('%c', [", a->ob_descr->typecode); 10692919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse s = PyString_FromString(buf); 10702919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse comma = PyString_FromString(", "); 10712919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse for (i = 0; i < len && !PyErr_Occurred(); i++) { 1072b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum if (i > 0) 10732919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyString_Concat(&s, comma); 1074778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum v = (a->ob_descr->getitem)(a, i); 10752919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse t = PyObject_Repr(v); 10762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(v); 10772919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyString_ConcatAndDel(&s, t); 1078778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 10792919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_XDECREF(comma); 10802919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyString_ConcatAndDel(&s, PyString_FromString("])")); 1081778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return s; 1082778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 1083778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 10842919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PySequenceMethods array_as_sequence = { 10852919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse (inquiry)array_length, /*sq_length*/ 1086b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (binaryfunc)array_concat, /*sq_concat*/ 1087b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (intargfunc)array_repeat, /*sq_repeat*/ 10882919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse (intargfunc)array_item, /*sq_item*/ 1089b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (intintargfunc)array_slice, /*sq_slice*/ 1090b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (intobjargproc)array_ass_item, /*sq_ass_item*/ 1091b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (intintobjargproc)array_ass_slice, /*sq_ass_slice*/ 1092778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}; 1093778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 10942919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatichere PyTypeObject Arraytype = { 10952919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject_HEAD_INIT(&PyType_Type) 1096778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 0, 1097778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum "array", 1098778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum sizeof(arrayobject), 1099778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 0, 11002919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse (destructor)array_dealloc, /*tp_dealloc*/ 1101b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (printfunc)array_print, /*tp_print*/ 11022919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse (getattrfunc)array_getattr, /*tp_getattr*/ 1103b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum 0, /*tp_setattr*/ 1104b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (cmpfunc)array_compare, /*tp_compare*/ 1105b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum (reprfunc)array_repr, /*tp_repr*/ 1106b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum 0, /*tp_as_number*/ 1107b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum &array_as_sequence, /*tp_as_sequence*/ 1108b6775db241f5fe5e3dc2ca09fc6c9e6164d4b2afGuido van Rossum 0, /*tp_as_mapping*/ 1109778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}; 1110778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 1111778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 11122919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyObject * 1113778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuma_array(self, args) 11142919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *self; 11152919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *args; 1116778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 1117778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum char c; 11182919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *initial = NULL; 1119778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum struct arraydescr *descr; 11202919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "c", &c)) { 11212919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_Clear(); 11222919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyArg_Parse(args, "(cO)", &c, &initial)) 1123778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 11242919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (!PyList_Check(initial) && !PyString_Check(initial)) { 11252919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_TypeError, 1126778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum "array initializer must be list or string"); 1127778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 1128778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1129778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1130778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (descr = descriptors; descr->typecode != '\0'; descr++) { 1131778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (descr->typecode == c) { 11322919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *a; 1133778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int len; 11342919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (initial == NULL || !PyList_Check(initial)) 1135778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum len = 0; 1136778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum else 11372919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse len = PyList_Size(initial); 1138778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum a = newarrayobject(len, descr); 1139778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (a == NULL) 1140778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 1141778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (len > 0) { 1142778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum int i; 1143778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum for (i = 0; i < len; i++) { 11442919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v = 11452919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyList_GetItem(initial, i); 1146778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (setarrayitem(a, i, v) != 0) { 11472919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_DECREF(a); 1148778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 1149778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1150778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1151778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 11522919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse if (initial != NULL && PyString_Check(initial)) { 11532919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyObject *v = 1154778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum array_fromstring((arrayobject *)a, initial); 1155778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum if (v == NULL) { 11562919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_DECREF(a); 1157778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 1158778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 11592919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_DECREF(v); 1160778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1161778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return a; 1162778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 1163778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum } 11642919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse PyErr_SetString(PyExc_ValueError, "bad typecode (must be c, b, h, l, f or d)"); 1165778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum return NULL; 1166778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 1167778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 11682919eaaf081564461a3d751929b2d9fcc924231eRoger E. Massestatic PyMethodDef a_methods[] = { 1169778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {"array", a_array}, 1170778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum {NULL, NULL} /* sentinel */ 1171778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum}; 1172778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum 1173778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossumvoid 1174778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossuminitarray() 1175778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum{ 11762919eaaf081564461a3d751929b2d9fcc924231eRoger E. Masse Py_InitModule("array", a_methods); 1177778983b48165da25ee11fb97f6855af7c67f4ff2Guido van Rossum} 1178