[Python-checkins] CVS: python/dist/src/Objects rangeobject.c,2.21,2.22
Fred L. Drake
python-dev@python.org
Wed, 8 Nov 2000 11:42:46 -0800
Update of /cvsroot/python/python/dist/src/Objects
In directory slayer.i.sourceforge.net:/tmp/cvs-serv8961/Objects
Modified Files:
rangeobject.c
Log Message:
Fixed support for containment test when a negative step is used; this
*really* closes bug #121965.
Added three attributes to the xrange object: start, stop, and step. These
are the same as for the slice objects.
Index: rangeobject.c
===================================================================
RCS file: /cvsroot/python/python/dist/src/Objects/rangeobject.c,v
retrieving revision 2.21
retrieving revision 2.22
diff -C2 -r2.21 -r2.22
*** rangeobject.c 2000/11/08 18:37:05 2.21
--- rangeobject.c 2000/11/08 19:42:43 2.22
***************
*** 3,6 ****
--- 3,8 ----
#include "Python.h"
+ #include "structmember.h"
+ #include <string.h>
typedef struct {
***************
*** 176,179 ****
--- 178,183 ----
range_getattr(rangeobject *r, char *name)
{
+ PyObject *result;
+
static PyMethodDef range_methods[] = {
{"tolist", (PyCFunction)range_tolist, METH_VARARGS,
***************
*** 182,187 ****
{NULL, NULL}
};
! return Py_FindMethod(range_methods, (PyObject *) r, name);
}
--- 186,205 ----
{NULL, NULL}
};
+ static struct memberlist range_members[] = {
+ {"step", T_LONG, offsetof(rangeobject, step), RO},
+ {"start", T_LONG, offsetof(rangeobject, start), RO},
+ {"stop", T_LONG, 0, RO},
+ {NULL, 0, 0, 0}
+ };
! result = Py_FindMethod(range_methods, (PyObject *) r, name);
! if (result == NULL) {
! PyErr_Clear();
! if (strcmp("stop", name) == 0)
! result = PyInt_FromLong(r->start + (r->len * r->step));
! else
! result = PyMember_Get((char *)r, range_members, name);
! }
! return result;
}
***************
*** 194,212 ****
return -1;
! if ((num < r->start) || ((num - r->start) % r->step))
! return 0;
! if (num >= (r->start + (r->len * r->step)))
! return 0;
return 1;
}
static PySequenceMethods range_as_sequence = {
! (inquiry)range_length, /*sq_length*/
(binaryfunc)range_concat, /*sq_concat*/
(intargfunc)range_repeat, /*sq_repeat*/
(intargfunc)range_item, /*sq_item*/
(intintargfunc)range_slice, /*sq_slice*/
! 0, /*sq_ass_item*/
! 0, /*sq_ass_slice*/
(objobjproc)range_contains, /*sq_contains*/
};
--- 212,238 ----
return -1;
! if (r->step > 0) {
! if ((num < r->start) || ((num - r->start) % r->step))
! return 0;
! if (num >= (r->start + (r->len * r->step)))
! return 0;
! }
! else {
! if ((num > r->start) || ((num - r->start) % r->step))
! return 0;
! if (num <= (r->start + (r->len * r->step)))
! return 0;
! }
return 1;
}
static PySequenceMethods range_as_sequence = {
! (inquiry)range_length, /*sq_length*/
(binaryfunc)range_concat, /*sq_concat*/
(intargfunc)range_repeat, /*sq_repeat*/
(intargfunc)range_item, /*sq_item*/
(intintargfunc)range_slice, /*sq_slice*/
! 0, /*sq_ass_item*/
! 0, /*sq_ass_slice*/
(objobjproc)range_contains, /*sq_contains*/
};