summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Modules/arraymodule.c535
1 files changed, 270 insertions, 265 deletions
diff --git a/Modules/arraymodule.c b/Modules/arraymodule.c
index 19ffe47..194d76b 100644
--- a/Modules/arraymodule.c
+++ b/Modules/arraymodule.c
@@ -34,7 +34,7 @@ PERFORMANCE OF THIS SOFTWARE.
/* An array is a uniform list -- all items have the same type.
The item type is restricted to simple C types like int or float */
-#include "allobjects.h"
+#include "Python.h"
#include "modsupport.h"
#include "ceval.h"
#ifdef STDC_HEADERS
@@ -48,55 +48,55 @@ struct arrayobject; /* Forward */
struct arraydescr {
int typecode;
int itemsize;
- object * (*getitem) FPROTO((struct arrayobject *, int));
- int (*setitem) FPROTO((struct arrayobject *, int, object *));
+ PyObject * (*getitem) Py_FPROTO((struct arrayobject *, int));
+ int (*setitem) Py_FPROTO((struct arrayobject *, int, PyObject *));
};
typedef struct arrayobject {
- OB_VARHEAD
+ PyObject_VAR_HEAD
char *ob_item;
struct arraydescr *ob_descr;
} arrayobject;
-staticforward typeobject Arraytype;
+staticforward PyTypeObject Arraytype;
#define is_arrayobject(op) ((op)->ob_type == &Arraytype)
/* Forward */
-static object *newarrayobject PROTO((int, struct arraydescr *));
+static PyObject *newarrayobject Py_PROTO((int, struct arraydescr *));
#if 0
-static int getarraysize PROTO((object *));
+static int getarraysize Py_PROTO((PyObject *));
#endif
-static object *getarrayitem PROTO((object *, int));
-static int setarrayitem PROTO((object *, int, object *));
+static PyObject *getarrayitem Py_PROTO((PyObject *, int));
+static int setarrayitem Py_PROTO((PyObject *, int, PyObject *));
#if 0
-static int insarrayitem PROTO((object *, int, object *));
-static int addarrayitem PROTO((object *, object *));
+static int insarrayitem Py_PROTO((PyObject *, int, PyObject *));
+static int addarrayitem Py_PROTO((PyObject *, PyObject *));
#endif
-static object *
+static PyObject *
c_getitem(ap, i)
arrayobject *ap;
int i;
{
- return newsizedstringobject(&((char *)ap->ob_item)[i], 1);
+ return PyString_FromStringAndSize(&((char *)ap->ob_item)[i], 1);
}
static int
c_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
char x;
- if (!getargs(v, "c;array item must be char", &x))
+ if (!PyArg_Parse(v, "c;array item must be char", &x))
return -1;
if (i >= 0)
((char *)ap->ob_item)[i] = x;
return 0;
}
-static object *
+static PyObject *
b_getitem(ap, i)
arrayobject *ap;
int i;
@@ -104,127 +104,127 @@ b_getitem(ap, i)
long x = ((char *)ap->ob_item)[i];
if (x >= 128)
x -= 256;
- return newintobject(x);
+ return PyInt_FromLong(x);
}
static int
b_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
char x;
- if (!getargs(v, "b;array item must be integer", &x))
+ if (!PyArg_Parse(v, "b;array item must be integer", &x))
return -1;
if (i >= 0)
((char *)ap->ob_item)[i] = x;
return 0;
}
-static object *
+static PyObject *
h_getitem(ap, i)
arrayobject *ap;
int i;
{
- return newintobject((long) ((short *)ap->ob_item)[i]);
+ return PyInt_FromLong((long) ((short *)ap->ob_item)[i]);
}
static int
h_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
short x;
- if (!getargs(v, "h;array item must be integer", &x))
+ if (!PyArg_Parse(v, "h;array item must be integer", &x))
return -1;
if (i >= 0)
((short *)ap->ob_item)[i] = x;
return 0;
}
-static object *
+static PyObject *
i_getitem(ap, i)
arrayobject *ap;
int i;
{
- return newintobject((long) ((int *)ap->ob_item)[i]);
+ return PyInt_FromLong((long) ((int *)ap->ob_item)[i]);
}
static int
i_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
int x;
- if (!getargs(v, "i;array item must be integer", &x))
+ if (!PyArg_Parse(v, "i;array item must be integer", &x))
return -1;
if (i >= 0)
((int *)ap->ob_item)[i] = x;
return 0;
}
-static object *
+static PyObject *
l_getitem(ap, i)
arrayobject *ap;
int i;
{
- return newintobject(((long *)ap->ob_item)[i]);
+ return PyInt_FromLong(((long *)ap->ob_item)[i]);
}
static int
l_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
long x;
- if (!getargs(v, "l;array item must be integer", &x))
+ if (!PyArg_Parse(v, "l;array item must be integer", &x))
return -1;
if (i >= 0)
((long *)ap->ob_item)[i] = x;
return 0;
}
-static object *
+static PyObject *
f_getitem(ap, i)
arrayobject *ap;
int i;
{
- return newfloatobject((double) ((float *)ap->ob_item)[i]);
+ return PyFloat_FromDouble((double) ((float *)ap->ob_item)[i]);
}
static int
f_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
float x;
- if (!getargs(v, "f;array item must be float", &x))
+ if (!PyArg_Parse(v, "f;array item must be float", &x))
return -1;
if (i >= 0)
((float *)ap->ob_item)[i] = x;
return 0;
}
-static object *
+static PyObject *
d_getitem(ap, i)
arrayobject *ap;
int i;
{
- return newfloatobject(((double *)ap->ob_item)[i]);
+ return PyFloat_FromDouble(((double *)ap->ob_item)[i]);
}
static int
d_setitem(ap, i, v)
arrayobject *ap;
int i;
- object *v;
+ PyObject *v;
{
double x;
- if (!getargs(v, "d;array item must be float", &x))
+ if (!PyArg_Parse(v, "d;array item must be float", &x))
return -1;
if (i >= 0)
((double *)ap->ob_item)[i] = x;
@@ -245,7 +245,7 @@ static struct arraydescr descriptors[] = {
/* If we ever allow items larger than double, we must change reverse()! */
-static object *
+static PyObject *
newarrayobject(size, descr)
int size;
struct arraydescr *descr;
@@ -253,61 +253,61 @@ newarrayobject(size, descr)
arrayobject *op;
size_t nbytes;
if (size < 0) {
- err_badcall();
+ PyErr_BadInternalCall();
return NULL;
}
nbytes = size * descr->itemsize;
/* Check for overflow */
if (nbytes / descr->itemsize != size) {
- return err_nomem();
+ return PyErr_NoMemory();
}
- op = NEW(arrayobject, 1);
+ op = PyMem_NEW(arrayobject, 1);
if (op == NULL) {
- return err_nomem();
+ return PyErr_NoMemory();
}
if (size <= 0) {
op->ob_item = NULL;
}
else {
- op->ob_item = NEW(char, nbytes);
+ op->ob_item = PyMem_NEW(char, nbytes);
if (op->ob_item == NULL) {
- DEL(op);
- return err_nomem();
+ PyMem_DEL(op);
+ return PyErr_NoMemory();
}
}
op->ob_type = &Arraytype;
op->ob_size = size;
op->ob_descr = descr;
- NEWREF(op);
- return (object *) op;
+ _Py_NewReference(op);
+ return (PyObject *) op;
}
#if 0
static int
getarraysize(op)
- object *op;
+ PyObject *op;
{
if (!is_arrayobject(op)) {
- err_badcall();
+ PyErr_BadInternalCall();
return -1;
}
return ((arrayobject *)op) -> ob_size;
}
#endif
-static object *
+static PyObject *
getarrayitem(op, i)
- object *op;
+ PyObject *op;
int i;
{
register arrayobject *ap;
if (!is_arrayobject(op)) {
- err_badcall();
+ PyErr_BadInternalCall();
return NULL;
}
ap = (arrayobject *)op;
if (i < 0 || i >= ap->ob_size) {
- err_setstr(IndexError, "array index out of range");
+ PyErr_SetString(PyExc_IndexError, "array index out of range");
return NULL;
}
return (*ap->ob_descr->getitem)(ap, i);
@@ -317,19 +317,19 @@ static int
ins1(self, where, v)
arrayobject *self;
int where;
- object *v;
+ PyObject *v;
{
char *items;
if (v == NULL) {
- err_badcall();
+ PyErr_BadInternalCall();
return -1;
}
if ((*self->ob_descr->setitem)(self, -1, v) < 0)
return -1;
items = self->ob_item;
- RESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
+ PyMem_RESIZE(items, char, (self->ob_size+1) * self->ob_descr->itemsize);
if (items == NULL) {
- err_nomem();
+ PyErr_NoMemory();
return -1;
}
if (where < 0)
@@ -347,12 +347,12 @@ ins1(self, where, v)
#if 0
static int
insarrayitem(op, where, newitem)
- object *op;
+ PyObject *op;
int where;
- object *newitem;
+ PyObject *newitem;
{
if (!is_arrayobject(op)) {
- err_badcall();
+ PyErr_BadInternalCall();
return -1;
}
return ins1((arrayobject *)op, where, newitem);
@@ -360,11 +360,11 @@ insarrayitem(op, where, newitem)
static int
addarrayitem(op, newitem)
- object *op;
- object *newitem;
+ PyObject *op;
+ PyObject *newitem;
{
if (!is_arrayobject(op)) {
- err_badcall();
+ PyErr_BadInternalCall();
return -1;
}
return ins1((arrayobject *)op,
@@ -379,8 +379,8 @@ array_dealloc(op)
arrayobject *op;
{
if (op->ob_item != NULL)
- DEL(op->ob_item);
- DEL(op);
+ PyMem_DEL(op->ob_item);
+ PyMem_DEL(op);
}
static int
@@ -390,18 +390,18 @@ array_compare(v, w)
int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
int i;
for (i = 0; i < len; i++) {
- object *ai, *bi;
+ PyObject *ai, *bi;
int cmp;
- ai = getarrayitem((object *)v, i);
- bi = getarrayitem((object *)w, i);
+ ai = getarrayitem((PyObject *)v, i);
+ bi = getarrayitem((PyObject *)w, i);
if (ai && bi)
- cmp = cmpobject(ai, bi);
+ cmp = PyObject_Compare(ai, bi);
else
cmp = -1;
- XDECREF(ai);
- XDECREF(bi);
+ Py_XDECREF(ai);
+ Py_XDECREF(bi);
if (cmp != 0) {
- err_clear(); /* XXX Can't report errors here */
+ PyErr_Clear(); /* XXX Can't report errors here */
return cmp;
}
}
@@ -415,19 +415,19 @@ array_length(a)
return a->ob_size;
}
-static object *
+static PyObject *
array_item(a, i)
arrayobject *a;
int i;
{
if (i < 0 || i >= a->ob_size) {
- err_setstr(IndexError, "array index out of range");
+ PyErr_SetString(PyExc_IndexError, "array index out of range");
return NULL;
}
- return getarrayitem((object *)a, i);
+ return getarrayitem((PyObject *)a, i);
}
-static object *
+static PyObject *
array_slice(a, ilow, ihigh)
arrayobject *a;
int ilow, ihigh;
@@ -448,23 +448,23 @@ array_slice(a, ilow, ihigh)
return NULL;
memcpy(np->ob_item, a->ob_item + ilow * a->ob_descr->itemsize,
(ihigh-ilow) * a->ob_descr->itemsize);
- return (object *)np;
+ return (PyObject *)np;
}
-static object *
+static PyObject *
array_concat(a, bb)
arrayobject *a;
- object *bb;
+ PyObject *bb;
{
int size;
arrayobject *np;
if (!is_arrayobject(bb)) {
- err_badarg();
+ PyErr_BadArgument();
return NULL;
}
#define b ((arrayobject *)bb)
if (a->ob_descr != b->ob_descr) {
- err_badarg();
+ PyErr_BadArgument();
return NULL;
}
size = a->ob_size + b->ob_size;
@@ -475,11 +475,11 @@ array_concat(a, bb)
memcpy(np->ob_item, a->ob_item, a->ob_size*a->ob_descr->itemsize);
memcpy(np->ob_item + a->ob_size*a->ob_descr->itemsize,
b->ob_item, b->ob_size*b->ob_descr->itemsize);
- return (object *)np;
+ return (PyObject *)np;
#undef b
}
-static object *
+static PyObject *
array_repeat(a, n)
arrayobject *a;
int n;
@@ -501,14 +501,14 @@ array_repeat(a, n)
memcpy(p, a->ob_item, nbytes);
p += nbytes;
}
- return (object *) np;
+ return (PyObject *) np;
}
static int
array_ass_slice(a, ilow, ihigh, v)
arrayobject *a;
int ilow, ihigh;
- object *v;
+ PyObject *v;
{
char *item;
int n; /* Size of replacement array */
@@ -523,16 +523,16 @@ array_ass_slice(a, ilow, ihigh, v)
int ret;
v = array_slice(b, 0, n);
ret = array_ass_slice(a, ilow, ihigh, v);
- DECREF(v);
+ Py_DECREF(v);
return ret;
}
if (b->ob_descr != a->ob_descr) {
- err_badarg();
+ PyErr_BadArgument();
return -1;
}
}
else {
- err_badarg();
+ PyErr_BadArgument();
return -1;
}
if (ilow < 0)
@@ -552,14 +552,15 @@ array_ass_slice(a, ilow, ihigh, v)
item + ihigh*a->ob_descr->itemsize,
(a->ob_size-ihigh)*a->ob_descr->itemsize);
a->ob_size += d;
- RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
+ PyMem_RESIZE(item, char, a->ob_size*a->ob_descr->itemsize);
/* Can't fail */
a->ob_item = item;
}
else if (d > 0) { /* Insert d items */
- RESIZE(item, char, (a->ob_size + d)*a->ob_descr->itemsize);
+ PyMem_RESIZE(item, char,
+ (a->ob_size + d)*a->ob_descr->itemsize);
if (item == NULL) {
- err_nomem();
+ PyErr_NoMemory();
return -1;
}
memmove(item + (ihigh+d)*a->ob_descr->itemsize,
@@ -579,10 +580,11 @@ static int
array_ass_item(a, i, v)
arrayobject *a;
int i;
- object *v;
+ PyObject *v;
{
if (i < 0 || i >= a->ob_size) {
- err_setstr(IndexError, "array assignment index out of range");
+ PyErr_SetString(PyExc_IndexError,
+ "array assignment index out of range");
return -1;
}
if (v == NULL)
@@ -592,56 +594,56 @@ array_ass_item(a, i, v)
static int
setarrayitem(a, i, v)
- object *a;
+ PyObject *a;
int i;
- object *v;
+ PyObject *v;
{
if (!is_arrayobject(a)) {
- err_badcall();
+ PyErr_BadInternalCall();
return -1;
}
return array_ass_item((arrayobject *)a, i, v);
}
-static object *
+static PyObject *
ins(self, where, v)
arrayobject *self;
int where;
- object *v;
+ PyObject *v;
{
if (ins1(self, where, v) != 0)
return NULL;
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-static object *
+static PyObject *
array_insert(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
int i;
- object *v;
- if (!getargs(args, "(iO)", &i, &v))
+ PyObject *v;
+ if (!PyArg_Parse(args, "(iO)", &i, &v))
return NULL;
return ins(self, i, v);
}
-static object *
+static PyObject *
array_append(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
- object *v;
- if (!getargs(args, "O", &v))
+ PyObject *v;
+ if (!PyArg_Parse(args, "O", &v))
return NULL;
return ins(self, (int) self->ob_size, v);
}
-static object *
+static PyObject *
array_byteswap(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
char *p;
int i;
@@ -682,25 +684,25 @@ array_byteswap(self, args)
}
break;
default:
- err_setstr(RuntimeError,
+ PyErr_SetString(PyExc_RuntimeError,
"don't know how to byteswap this array type");
return NULL;
}
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-static object *
+static PyObject *
array_reverse(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
register int itemsize = self->ob_descr->itemsize;
register char *p, *q;
char tmp[sizeof(double)]; /* Assume that's the max item size */
if (args != NULL) {
- err_badarg();
+ PyErr_BadArgument();
return NULL;
}
@@ -715,103 +717,103 @@ array_reverse(self, args)
}
}
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
/* The following routines were adapted from listobject.c but not converted.
To make them work you will have to work! */
#if 0
-static object *
+static PyObject *
array_index(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
int i;
if (args == NULL) {
- err_badarg();
+ PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
- if (cmpobject(self->ob_item[i], args) == 0)
- return newintobject((long)i);
+ if (PyObject_Compare(self->ob_item[i], args) == 0)
+ return PyInt_FromLong((long)i);
}
- err_setstr(ValueError, "array.index(x): x not in array");
+ PyErr_SetString(PyExc_ValueError, "array.index(x): x not in array");
return NULL;
}
#endif
#if 0
-static object *
+static PyObject *
array_count(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
int count = 0;
int i;
if (args == NULL) {
- err_badarg();
+ PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
- if (cmpobject(self->ob_item[i], args) == 0)
+ if (PyObject_Compare(self->ob_item[i], args) == 0)
count++;
}
- return newintobject((long)count);
+ return PyInt_FromLong((long)count);
}
#endif
#if 0
-static object *
+static PyObject *
array_remove(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
int i;
if (args == NULL) {
- err_badarg();
+ PyErr_BadArgument();
return NULL;
}
for (i = 0; i < self->ob_size; i++) {
- if (cmpobject(self->ob_item[i], args) == 0) {
- if (array_ass_slice(self, i, i+1, (object *)NULL) != 0)
+ if (PyObject_Compare(self->ob_item[i], args) == 0) {
+ if (array_ass_slice(self, i, i+1, (PyObject *)NULL) != 0)
return NULL;
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
}
- err_setstr(ValueError, "array.remove(x): x not in array");
+ PyErr_SetString(PyExc_ValueError, "array.remove(x): x not in array");
return NULL;
}
#endif
-static object *
+static PyObject *
array_fromfile(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
- object *f;
+ PyObject *f;
int n;
FILE *fp;
- if (!getargs(args, "(Oi)", &f, &n))
+ if (!PyArg_Parse(args, "(Oi)", &f, &n))
return NULL;
- fp = getfilefile(f);
+ fp = PyFile_AsFile(f);
if (fp == NULL) {
- err_setstr(TypeError, "arg1 must be open file");
+ PyErr_SetString(PyExc_TypeError, "arg1 must be open file");
return NULL;
}
if (n > 0) {
char *item = self->ob_item;
int itemsize = self->ob_descr->itemsize;
int nread;
- RESIZE(item, char, (self->ob_size + n) * itemsize);
+ PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
if (item == NULL) {
- err_nomem();
+ PyErr_NoMemory();
return NULL;
}
self->ob_item = item;
@@ -820,189 +822,191 @@ array_fromfile(self, args)
itemsize, n, fp);
if (nread < n) {
self->ob_size -= (n - nread);
- RESIZE(item, char, self->ob_size*itemsize);
+ PyMem_RESIZE(item, char, self->ob_size*itemsize);
self->ob_item = item;
- err_setstr(EOFError, "not enough items in file");
+ PyErr_SetString(PyExc_EOFError,
+ "not enough items in file");
return NULL;
}
}
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-static object *
+static PyObject *
array_tofile(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
- object *f;
+ PyObject *f;
FILE *fp;
- if (!getargs(args, "O", &f))
+ if (!PyArg_Parse(args, "O", &f))
return NULL;
- fp = getfilefile(f);
+ fp = PyFile_AsFile(f);
if (fp == NULL) {
- err_setstr(TypeError, "arg must be open file");
+ PyErr_SetString(PyExc_TypeError, "arg must be open file");
return NULL;
}
if (self->ob_size > 0) {
if (fwrite(self->ob_item, self->ob_descr->itemsize,
self->ob_size, fp) != self->ob_size) {
- err_errno(IOError);
+ PyErr_SetFromErrno(PyExc_IOError);
clearerr(fp);
return NULL;
}
}
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-static object *
+static PyObject *
array_fromlist(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
int n;
- object *list;
+ PyObject *list;
int itemsize = self->ob_descr->itemsize;
- if (!getargs(args, "O", &list))
+ if (!PyArg_Parse(args, "O", &list))
return NULL;
- if (!is_listobject(list)) {
- err_setstr(TypeError, "arg must be list");
+ if (!PyList_Check(list)) {
+ PyErr_SetString(PyExc_TypeError, "arg must be list");
return NULL;
}
- n = getlistsize(list);
+ n = PyList_Size(list);
if (n > 0) {
char *item = self->ob_item;
int i;
- RESIZE(item, char, (self->ob_size + n) * itemsize);
+ PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
if (item == NULL) {
- err_nomem();
+ PyErr_NoMemory();
return NULL;
}
self->ob_item = item;
self->ob_size += n;
for (i = 0; i < n; i++) {
- object *v = getlistitem(list, i);
+ PyObject *v = PyList_GetItem(list, i);
if ((*self->ob_descr->setitem)(self,
self->ob_size - n + i, v) != 0) {
self->ob_size -= n;
- RESIZE(item, char, self->ob_size * itemsize);
+ PyMem_RESIZE(item, char,
+ self->ob_size * itemsize);
self->ob_item = item;
return NULL;
}
}
}
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-static object *
+static PyObject *
array_tolist(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
- object *list = newlistobject(self->ob_size);
+ PyObject *list = PyList_New(self->ob_size);
int i;
if (list == NULL)
return NULL;
for (i = 0; i < self->ob_size; i++) {
- object *v = getarrayitem((object *)self, i);
+ PyObject *v = getarrayitem((PyObject *)self, i);
if (v == NULL) {
- DECREF(list);
+ Py_DECREF(list);
return NULL;
}
- setlistitem(list, i, v);
+ PyList_SetItem(list, i, v);
}
return list;
}
-static object *
+static PyObject *
array_fromstring(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
char *str;
int n;
int itemsize = self->ob_descr->itemsize;
- if (!getargs(args, "s#", &str, &n))
+ if (!PyArg_Parse(args, "s#", &str, &n))
return NULL;
if (n % itemsize != 0) {
- err_setstr(ValueError,
+ PyErr_SetString(PyExc_ValueError,
"string length not a multiple of item size");
return NULL;
}
n = n / itemsize;
if (n > 0) {
char *item = self->ob_item;
- RESIZE(item, char, (self->ob_size + n) * itemsize);
+ PyMem_RESIZE(item, char, (self->ob_size + n) * itemsize);
if (item == NULL) {
- err_nomem();
+ PyErr_NoMemory();
return NULL;
}
self->ob_item = item;
self->ob_size += n;
memcpy(item + (self->ob_size - n) * itemsize, str, itemsize*n);
}
- INCREF(None);
- return None;
+ Py_INCREF(Py_None);
+ return Py_None;
}
-static object *
+static PyObject *
array_tostring(self, args)
arrayobject *self;
- object *args;
+ PyObject *args;
{
- if (!getargs(args, ""))
+ if (!PyArg_Parse(args, ""))
return NULL;
- return newsizedstringobject(self->ob_item,
+ return PyString_FromStringAndSize(self->ob_item,
self->ob_size * self->ob_descr->itemsize);
}
-static struct methodlist array_methods[] = {
- {"append", (method)array_append},
- {"byteswap", (method)array_byteswap},
+static PyMethodDef array_methods[] = {
+ {"append", (PyCFunction)array_append},
+ {"byteswap", (PyCFunction)array_byteswap},
/* {"count", (method)array_count},*/
- {"fromfile", (method)array_fromfile},
- {"fromlist", (method)array_fromlist},
- {"fromstring", (method)array_fromstring},
+ {"fromfile", (PyCFunction)array_fromfile},
+ {"fromlist", (PyCFunction)array_fromlist},
+ {"fromstring", (PyCFunction)array_fromstring},
/* {"index", (method)array_index},*/
- {"insert", (method)array_insert},
- {"read", (method)array_fromfile},
+ {"insert", (PyCFunction)array_insert},
+ {"read", (PyCFunction)array_fromfile},
/* {"remove", (method)array_remove},*/
- {"reverse", (method)array_reverse},
+ {"reverse", (PyCFunction)array_reverse},
/* {"sort", (method)array_sort},*/
- {"tofile", (method)array_tofile},
- {"tolist", (method)array_tolist},
- {"tostring", (method)array_tostring},
- {"write", (method)array_tofile},
+ {"tofile", (PyCFunction)array_tofile},
+ {"tolist", (PyCFunction)array_tolist},
+ {"tostring", (PyCFunction)array_tostring},
+ {"write", (PyCFunction)array_tofile},
{NULL, NULL} /* sentinel */
};
-static object *
+static PyObject *
array_getattr(a, name)
arrayobject *a;
char *name;
{
if (strcmp(name, "typecode") == 0) {
char tc = a->ob_descr->typecode;
- return newsizedstringobject(&tc, 1);
+ return PyString_FromStringAndSize(&tc, 1);
}
if (strcmp(name, "itemsize") == 0) {
- return newintobject((long)a->ob_descr->itemsize);
+ return PyInt_FromLong((long)a->ob_descr->itemsize);
}
if (strcmp(name, "__members__") == 0) {
- object *list = newlistobject(2);
+ PyObject *list = PyList_New(2);
if (list) {
- setlistitem(list, 0, newstringobject("typecode"));
- setlistitem(list, 1, newstringobject("itemsize"));
- if (err_occurred()) {
- DECREF(list);
+ PyList_SetItem(list, 0, PyString_FromString("typecode"));
+ PyList_SetItem(list, 1, PyString_FromString("itemsize"));
+ if (PyErr_Occurred()) {
+ Py_DECREF(list);
list = NULL;
}
}
return list;
}
- return findmethod(array_methods, (object *)a, name);
+ return Py_FindMethod(array_methods, (PyObject *)a, name);
}
static int
@@ -1013,7 +1017,7 @@ array_print(a, fp, flags)
{
int ok = 0;
int i, len;
- object *v;
+ PyObject *v;
len = a->ob_size;
if (len == 0) {
fprintf(fp, "array('%c')", a->ob_descr->typecode);
@@ -1021,9 +1025,9 @@ array_print(a, fp, flags)
}
if (a->ob_descr->typecode == 'c') {
fprintf(fp, "array('c', ");
- v = array_tostring(a, (object *)NULL);
- ok = printobject(v, fp, 0);
- XDECREF(v);
+ v = array_tostring(a, (PyObject *)NULL);
+ ok = PyObject_Print(v, fp, 0);
+ Py_XDECREF(v);
fprintf(fp, ")");
return ok;
}
@@ -1032,70 +1036,70 @@ array_print(a, fp, flags)
if (i > 0)
fprintf(fp, ", ");
v = (a->ob_descr->getitem)(a, i);
- ok = printobject(v, fp, 0);
- XDECREF(v);
+ ok = PyObject_Print(v, fp, 0);
+ Py_XDECREF(v);
}
fprintf(fp, "])");
return ok;
}
-static object *
+static PyObject *
array_repr(a)
arrayobject *a;
{
char buf[256];
- object *s, *t, *comma, *v;
+ PyObject *s, *t, *comma, *v;
int i, len;
len = a->ob_size;
if (len == 0) {
sprintf(buf, "array('%c')", a->ob_descr->typecode);
- return newstringobject(buf);
+ return PyString_FromString(buf);
}
if (a->ob_descr->typecode == 'c') {
sprintf(buf, "array('c', ");
- s = newstringobject(buf);
- v = array_tostring(a, (object *)NULL);
- t = reprobject(v);
- XDECREF(v);
- joinstring_decref(&s, t);
- joinstring_decref(&s, newstringobject(")"));
+ s = PyString_FromString(buf);
+ v = array_tostring(a, (PyObject *)NULL);
+ t = PyObject_Repr(v);
+ Py_XDECREF(v);
+ PyString_ConcatAndDel(&s, t);
+ PyString_ConcatAndDel(&s, PyString_FromString(")"));
return s;
}
sprintf(buf, "array('%c', [", a->ob_descr->typecode);
- s = newstringobject(buf);
- comma = newstringobject(", ");
- for (i = 0; i < len && !err_occurred(); i++) {
+ s = PyString_FromString(buf);
+ comma = PyString_FromString(", ");
+ for (i = 0; i < len && !PyErr_Occurred(); i++) {
if (i > 0)
- joinstring(&s, comma);
+ PyString_Concat(&s, comma);
v = (a->ob_descr->getitem)(a, i);
- t = reprobject(v);
- XDECREF(v);
- joinstring_decref(&s, t);
+ t = PyObject_Repr(v);
+ Py_XDECREF(v);
+ PyString_ConcatAndDel(&s, t);
}
- XDECREF(comma);
- joinstring_decref(&s, newstringobject("])"));
+ Py_XDECREF(comma);
+ PyString_ConcatAndDel(&s, PyString_FromString("])"));
return s;
}
-static sequence_methods array_as_sequence = {
- (inquiry)array_length, /*sq_length*/
+static PySequenceMethods array_as_sequence = {
+ (inquiry)array_length, /*sq_length*/
(binaryfunc)array_concat, /*sq_concat*/
(intargfunc)array_repeat, /*sq_repeat*/
- (intargfunc)array_item, /*sq_item*/
+ (intargfunc)array_item, /*sq_item*/
(intintargfunc)array_slice, /*sq_slice*/
(intobjargproc)array_ass_item, /*sq_ass_item*/
(intintobjargproc)array_ass_slice, /*sq_ass_slice*/
};
-statichere typeobject Arraytype = {
- OB_HEAD_INIT(&Typetype)
+statichere PyTypeObject Arraytype = {
+ PyObject_HEAD_INIT(&PyType_Type)
0,
"array",
sizeof(arrayobject),
0,
- (destructor)array_dealloc, /*tp_dealloc*/
+ (destructor)array_dealloc, /*tp_dealloc*/
(printfunc)array_print, /*tp_print*/
- (getattrfunc)array_getattr, /*tp_getattr*/
+ (getattrfunc)array_getattr, /*tp_getattr*/
0, /*tp_setattr*/
(cmpfunc)array_compare, /*tp_compare*/
(reprfunc)array_repr, /*tp_repr*/
@@ -1105,62 +1109,63 @@ statichere typeobject Arraytype = {
};
-static object *
+static PyObject *
a_array(self, args)
- object *self;
- object *args;
+ PyObject *self;
+ PyObject *args;
{
char c;
- object *initial = NULL;
+ PyObject *initial = NULL;
struct arraydescr *descr;
- if (!getargs(args, "c", &c)) {
- err_clear();
- if (!getargs(args, "(cO)", &c, &initial))
+ if (!PyArg_Parse(args, "c", &c)) {
+ PyErr_Clear();
+ if (!PyArg_Parse(args, "(cO)", &c, &initial))
return NULL;
- if (!is_listobject(initial) && !is_stringobject(initial)) {
- err_setstr(TypeError,
+ if (!PyList_Check(initial) && !PyString_Check(initial)) {
+ PyErr_SetString(PyExc_TypeError,
"array initializer must be list or string");
return NULL;
}
}
for (descr = descriptors; descr->typecode != '\0'; descr++) {
if (descr->typecode == c) {
- object *a;
+ PyObject *a;
int len;
- if (initial == NULL || !is_listobject(initial))
+ if (initial == NULL || !PyList_Check(initial))
len = 0;
else
- len = getlistsize(initial);
+ len = PyList_Size(initial);
a = newarrayobject(len, descr);
if (a == NULL)
return NULL;
if (len > 0) {
int i;
for (i = 0; i < len; i++) {
- object *v = getlistitem(initial, i);
+ PyObject *v =
+ PyList_GetItem(initial, i);
if (setarrayitem(a, i, v) != 0) {
- DECREF(a);
+ Py_DECREF(a);
return NULL;
}
}
}
- if (initial != NULL && is_stringobject(initial)) {
- object *v =
+ if (initial != NULL && PyString_Check(initial)) {
+ PyObject *v =
array_fromstring((arrayobject *)a, initial);
if (v == NULL) {
- DECREF(a);
+ Py_DECREF(a);
return NULL;
}
- DECREF(v);
+ Py_DECREF(v);
}
return a;
}
}
- err_setstr(ValueError, "bad typecode (must be c, b, h, l, f or d)");
+ PyErr_SetString(PyExc_ValueError, "bad typecode (must be c, b, h, l, f or d)");
return NULL;
}
-static struct methodlist a_methods[] = {
+static PyMethodDef a_methods[] = {
{"array", a_array},
{NULL, NULL} /* sentinel */
};
@@ -1168,5 +1173,5 @@ static struct methodlist a_methods[] = {
void
initarray()
{
- initmodule("array", a_methods);
+ Py_InitModule("array", a_methods);
}