blob: cae18d9ce87a66c9a86ba4502f6df5064be11536 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* List object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
35
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000036#ifdef STDC_HEADERS
37#include <stddef.h>
38#else
39#include <sys/types.h> /* For size_t */
40#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042#define ROUNDUP(n, PyTryBlock) \
43 ((((n)+(PyTryBlock)-1)/(PyTryBlock))*(PyTryBlock))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000044
45static int
Guido van Rossuma27d1121997-08-25 18:36:23 +000046roundupsize(n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000047 int n;
48{
49 if (n < 500)
50 return ROUNDUP(n, 10);
51 else
52 return ROUNDUP(n, 100);
53}
54
Guido van Rossuma27d1121997-08-25 18:36:23 +000055#define NRESIZE(var, type, nitems) PyMem_RESIZE(var, type, roundupsize(nitems))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000056
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyObject *
58PyList_New(size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 int size;
60{
61 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000063 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return NULL;
67 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000069 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 if (nbytes / sizeof(PyObject *) != (size_t)size) {
71 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000072 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 op = (PyListObject *) malloc(sizeof(PyListObject));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 }
77 if (size <= 0) {
78 op->ob_item = NULL;
79 }
80 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 op->ob_item = (PyObject **) malloc(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 if (op->ob_item == NULL) {
83 free((ANY *)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 }
86 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 op->ob_type = &PyList_Type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 op->ob_size = size;
89 for (i = 0; i < size; i++)
90 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 _Py_NewReference(op);
92 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093}
94
95int
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096PyList_Size(op)
97 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 if (!PyList_Check(op)) {
100 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 return -1;
102 }
103 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105}
106
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000108
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109PyObject *
110PyList_GetItem(op, i)
111 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 int i;
113{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 if (!PyList_Check(op)) {
115 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return NULL;
117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000119 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 indexerr = PyString_FromString(
121 "list index out of range");
122 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123 return NULL;
124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126}
127
128int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129PyList_SetItem(op, i, newitem)
130 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 register PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 register PyObject *olditem;
135 register PyObject **p;
136 if (!PyList_Check(op)) {
137 Py_XDECREF(newitem);
138 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000139 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
142 Py_XDECREF(newitem);
143 PyErr_SetString(PyExc_IndexError,
144 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000145 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000148 olditem = *p;
149 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 return 0;
152}
153
154static int
155ins1(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159{
160 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000162 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000164 return -1;
165 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000168 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000170 return -1;
171 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 if (where < 0)
173 where = 0;
174 if (where > self->ob_size)
175 where = self->ob_size;
176 for (i = self->ob_size; --i >= where; )
177 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179 items[where] = v;
180 self->ob_item = items;
181 self->ob_size++;
182 return 0;
183}
184
185int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186PyList_Insert(op, where, newitem)
187 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 if (!PyList_Check(op)) {
192 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
194 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
198int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199PyList_Append(op, newitem)
200 PyObject *op;
201 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 if (!PyList_Check(op)) {
204 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000205 return -1;
206 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 return ins1((PyListObject *)op,
208 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209}
210
211/* Methods */
212
213static void
214list_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216{
217 int i;
Jack Jansen7874d1f1995-01-19 12:09:27 +0000218 if (op->ob_item != NULL) {
219 for (i = 0; i < op->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000221 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 free((ANY *)op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000223 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224 free((ANY *)op);
225}
226
Guido van Rossum90933611991-06-07 16:10:43 +0000227static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228list_print(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 FILE *fp;
231 int flags;
232{
233 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000234
235 i = Py_ReprEnter((PyObject*)op);
236 if (i != 0) {
237 if (i < 0)
238 return i;
239 fprintf(fp, "[...]");
240 return 0;
241 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000243 for (i = 0; i < op->ob_size; i++) {
244 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000246 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
247 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000248 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000249 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 }
251 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000252 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000253 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257list_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 PyListObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000262
263 i = Py_ReprEnter((PyObject*)v);
264 if (i != 0) {
265 if (i > 0)
266 return PyString_FromString("[...]");
267 return NULL;
268 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 s = PyString_FromString("[");
270 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 for (i = 0; i < v->ob_size && s != NULL; i++) {
272 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 PyString_Concat(&s, comma);
274 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 Py_XDECREF(comma);
277 PyString_ConcatAndDel(&s, PyString_FromString("]"));
Guido van Rossumfb376de1998-04-10 22:47:27 +0000278 Py_ReprLeave((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return s;
280}
281
282static int
283list_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyListObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 int i;
Guido van Rossumae621ff1998-05-28 20:18:46 +0000287 for (i = 0; i < v->ob_size && i < w->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000288 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000289 if (cmp != 0)
290 return cmp;
291 }
292 return v->ob_size - w->ob_size;
293}
294
295static int
296list_length(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000297 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000298{
299 return a->ob_size;
300}
301
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000302static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000303list_item(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305 int i;
306{
307 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000308 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309 indexerr = PyString_FromString(
310 "list index out of range");
311 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 return NULL;
313 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000314 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000315 return a->ob_item[i];
316}
317
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000318static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319list_slice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000320 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000321 int ilow, ihigh;
322{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000323 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000324 int i;
325 if (ilow < 0)
326 ilow = 0;
327 else if (ilow > a->ob_size)
328 ilow = a->ob_size;
329 if (ihigh < 0)
330 ihigh = 0;
331 if (ihigh < ilow)
332 ihigh = ilow;
333 else if (ihigh > a->ob_size)
334 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 if (np == NULL)
337 return NULL;
338 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000339 PyObject *v = a->ob_item[i];
340 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 np->ob_item[i - ilow] = v;
342 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000343 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000344}
345
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346PyObject *
347PyList_GetSlice(a, ilow, ihigh)
348 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000349 int ilow, ihigh;
350{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351 if (!PyList_Check(a)) {
352 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000353 return NULL;
354 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000355 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000356}
357
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000358static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000359list_concat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 PyListObject *a;
361 PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000362{
363 int size;
364 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 PyListObject *np;
366 if (!PyList_Check(bb)) {
367 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368 return NULL;
369 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000371 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000372 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000374 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000375 }
376 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 PyObject *v = a->ob_item[i];
378 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000379 np->ob_item[i] = v;
380 }
381 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 PyObject *v = b->ob_item[i];
383 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 np->ob_item[i + a->ob_size] = v;
385 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000386 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000387#undef b
388}
389
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000390static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000391list_repeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000392 PyListObject *a;
Guido van Rossumed98d481991-03-06 13:07:53 +0000393 int n;
394{
395 int i, j;
396 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 PyListObject *np;
398 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000399 if (n < 0)
400 n = 0;
401 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000403 if (np == NULL)
404 return NULL;
405 p = np->ob_item;
406 for (i = 0; i < n; i++) {
407 for (j = 0; j < a->ob_size; j++) {
408 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000409 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000410 p++;
411 }
412 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000413 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000414}
415
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000416static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417list_ass_slice(a, ilow, ihigh, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000419 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000420 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000422 /* Because [X]DECREF can recursively invoke list operations on
423 this list, we must postpone all [X]DECREF activity until
424 after the list is back in its canonical shape. Therefore
425 we must allocate an additional array, 'recycle', into which
426 we temporarily copy the items that are deleted from the
427 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000428 PyObject **recycle, **p;
429 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000430 int n; /* Size of replacement list */
431 int d; /* Change in size */
432 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000434 if (v == NULL)
435 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000436 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000437 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000438 if (a == b) {
439 /* Special case "a[i:j] = a" -- copy b first */
440 int ret;
441 v = list_slice(b, 0, n);
442 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000443 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000444 return ret;
445 }
446 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000447 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 PyErr_BadArgument();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000449 return -1;
450 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000451 if (ilow < 0)
452 ilow = 0;
453 else if (ilow > a->ob_size)
454 ilow = a->ob_size;
455 if (ihigh < 0)
456 ihigh = 0;
457 if (ihigh < ilow)
458 ihigh = ilow;
459 else if (ihigh > a->ob_size)
460 ihigh = a->ob_size;
461 item = a->ob_item;
462 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000463 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000464 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000465 else
466 p = recycle = NULL;
467 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000468 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000469 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000470 if (d < 0) {
471 for (/*k = ihigh*/; k < a->ob_size; k++)
472 item[k+d] = item[k];
473 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000474 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475 a->ob_item = item;
476 }
477 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000478 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000479 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000480 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000481 PyMem_XDEL(recycle);
482 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000483 return -1;
484 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000485 for (k = a->ob_size; --k >= ihigh; )
486 item[k+d] = item[k];
487 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000488 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000489 a->ob_item = item;
490 a->ob_size += d;
491 }
492 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000493 PyObject *w = b->ob_item[k];
494 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000495 item[ilow] = w;
496 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000497 if (recycle) {
498 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000499 Py_XDECREF(*p);
500 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000501 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000502 return 0;
503#undef b
504}
505
Guido van Rossum234f9421993-06-17 12:35:49 +0000506int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000507PyList_SetSlice(a, ilow, ihigh, v)
508 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000509 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510 PyObject *v;
Guido van Rossum234f9421993-06-17 12:35:49 +0000511{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000512 if (!PyList_Check(a)) {
513 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000514 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000515 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000517}
518
Guido van Rossum4a450d01991-04-03 19:05:18 +0000519static int
520list_ass_item(a, i, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000521 PyListObject *a;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000522 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000523 PyObject *v;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000524{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000525 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000526 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000527 PyErr_SetString(PyExc_IndexError,
528 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000529 return -1;
530 }
531 if (v == NULL)
532 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000534 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000535 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000537 return 0;
538}
539
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000540static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000541ins(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000542 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000543 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000545{
546 if (ins1(self, where, v) != 0)
547 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 Py_INCREF(Py_None);
549 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000550}
551
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000552static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553listinsert(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000554 PyListObject *self;
555 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556{
557 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000558 PyObject *v;
559 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000560 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000561 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000562}
563
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000564static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565listappend(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000566 PyListObject *self;
567 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000569 PyObject *v;
570 if (!PyArg_Parse(args, "O", &v))
Guido van Rossumbf80e541993-02-08 15:49:17 +0000571 return NULL;
572 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573}
574
Guido van Rossum3f236de1996-12-10 23:55:39 +0000575/* New quicksort implementation for arrays of object pointers.
576 Thanks to discussions with Tim Peters. */
577
578/* CMPERROR is returned by our comparison function when an error
579 occurred. This is the largest negative integer (0x80000000 on a
580 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000581#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000582
583/* Comparison function. Takes care of calling a user-supplied
584 comparison function (any callable Python object). Calls the
585 standard comparison function, cmpobject(), if the user-supplied
586 function is NULL. */
587
588static int
Guido van Rossumae621ff1998-05-28 20:18:46 +0000589docompare(x, y, compare, list)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000590 PyObject *x;
591 PyObject *y;
592 PyObject *compare;
Guido van Rossumae621ff1998-05-28 20:18:46 +0000593 PyListObject *list;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000594{
Guido van Rossumae621ff1998-05-28 20:18:46 +0000595 int size = list->ob_size; /* Number of elements to sort */
596 PyObject **array = list->ob_item; /* Start of array to sort */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000597 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000598 int i;
599
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000600 if (compare == NULL) {
601 i = PyObject_Compare(x, y);
602 if (i && PyErr_Occurred())
603 i = CMPERROR;
Guido van Rossumae621ff1998-05-28 20:18:46 +0000604 else if (size != list->ob_size || array != list->ob_item) {
605 PyErr_SetString(PyExc_SystemError,
606 "list changed size during sort");
607 i = CMPERROR;
608 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000609 return i;
610 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000611
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000613 if (args == NULL)
614 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000615 res = PyEval_CallObject(compare, args);
616 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000617 if (res == NULL)
618 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000619 if (!PyInt_Check(res)) {
620 Py_DECREF(res);
621 PyErr_SetString(PyExc_TypeError,
622 "comparison function should return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000623 return CMPERROR;
624 }
Guido van Rossumae621ff1998-05-28 20:18:46 +0000625 if (size != list->ob_size || array != list->ob_item) {
626 PyErr_SetString(PyExc_SystemError,
627 "list changed size during sort");
628 return CMPERROR;
629 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000630 i = PyInt_AsLong(res);
631 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000632 if (i < 0)
633 return -1;
634 if (i > 0)
635 return 1;
636 return 0;
637}
638
Guido van Rossumb7057641998-05-13 21:20:49 +0000639/* MINSIZE is the smallest array we care to partition; smaller arrays
Guido van Rossum9be62831998-05-26 15:06:32 +0000640 are sorted using binary insertion. It must be at least 4 for the
641 quicksort implementation to work. Binary insertion always requires
642 fewer compares than quicksort, but does O(N**2) data movement. The
643 more expensive compares, the larger MINSIZE should be. */
644#define MINSIZE 49
Guido van Rossum3f236de1996-12-10 23:55:39 +0000645
Guido van Rossum3f236de1996-12-10 23:55:39 +0000646/* STACKSIZE is the size of our work stack. A rough estimate is that
647 this allows us to sort arrays of MINSIZE * 2**STACKSIZE, or large
648 enough. (Because of the way we push the biggest partition first,
649 the worst case occurs when all subarrays are always partitioned
650 exactly in two.) */
651#define STACKSIZE 64
652
Guido van Rossum9be62831998-05-26 15:06:32 +0000653/* quicksort algorithm. Return -1 if an exception occurred; in this
Guido van Rossum3f236de1996-12-10 23:55:39 +0000654 case we leave the array partly sorted but otherwise in good health
655 (i.e. no items have been removed or duplicated). */
656
657static int
Guido van Rossumae621ff1998-05-28 20:18:46 +0000658quicksort(list, compare)
659 PyListObject *list; /* List to sort */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000660 PyObject *compare;/* Comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000661{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000662 register PyObject *tmp, *pivot;
Guido van Rossumb7057641998-05-13 21:20:49 +0000663 register PyObject **l, **r, **p;
Guido van Rossum9be62831998-05-26 15:06:32 +0000664 PyObject **lo, **hi, **notp;
665 int top, k, n, lisp, risp;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000666 PyObject **lostack[STACKSIZE];
667 PyObject **histack[STACKSIZE];
Guido van Rossum3f236de1996-12-10 23:55:39 +0000668
669 /* Start out with the whole array on the work stack */
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000670 lostack[0] = list->ob_item;
671 histack[0] = list->ob_item + list->ob_size;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000672 top = 1;
673
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000674#define SETK(X,Y) if ((k = docompare(X,Y,compare,list))==CMPERROR) goto fail
675
Guido van Rossum3f236de1996-12-10 23:55:39 +0000676 /* Repeat until the work stack is empty */
677 while (--top >= 0) {
Guido van Rossum3176bb11996-12-11 23:57:39 +0000678 lo = lostack[top];
679 hi = histack[top];
Guido van Rossum3176bb11996-12-11 23:57:39 +0000680 n = hi - lo;
Guido van Rossum9be62831998-05-26 15:06:32 +0000681
682 /* If it's a small one, use binary insertion sort */
683 if (n < MINSIZE) {
684 for (notp = lo+1; notp < hi; ++notp) {
685 /* set l to where *notp belongs */
686 l = lo;
687 r = notp;
688 pivot = *r;
689 do {
690 p = l + ((r - l) >> 1);
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000691 SETK(pivot, *p);
Guido van Rossum9be62831998-05-26 15:06:32 +0000692 if (k < 0)
693 r = p;
694 else
695 l = p + 1;
696 } while (l < r);
697 /* Pivot should go at l -- slide over to
698 make room. Caution: using memmove
699 is much slower under MSVC 5; we're
700 not usually moving many slots. */
701 for (p = notp; p > l; --p)
702 *p = *(p-1);
703 *l = pivot;
704 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000705 continue;
Guido van Rossum9be62831998-05-26 15:06:32 +0000706 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000707
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000708 /* Choose median of first, middle and last as pivot;
709 this is a simple unrolled 3-element insertion sort */
Guido van Rossum9be62831998-05-26 15:06:32 +0000710 l = lo; /* First */
Guido van Rossumb7057641998-05-13 21:20:49 +0000711 p = lo + (n>>1); /* Middle */
Guido van Rossum9be62831998-05-26 15:06:32 +0000712 r = hi - 1; /* Last */
Guido van Rossum24e62e21997-12-10 15:14:24 +0000713
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000714 pivot = *p;
715 SETK(pivot, *l);
716 if (k < 0) {
717 *p = *l;
718 *l = pivot;
719 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000720
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000721 pivot = *r;
722 SETK(pivot, *p);
723 if (k < 0) {
724 *r = *p;
725 *p = pivot; /* for consistency */
726 SETK(pivot, *l);
727 if (k < 0) {
728 *p = *l;
729 *l = pivot;
730 }
731 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000732
Guido van Rossumb7057641998-05-13 21:20:49 +0000733 pivot = *p;
Guido van Rossum9be62831998-05-26 15:06:32 +0000734 l++;
735 r--;
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000736
Guido van Rossum3f236de1996-12-10 23:55:39 +0000737 /* Partition the array */
Guido van Rossum9be62831998-05-26 15:06:32 +0000738 for (;;) {
739 lisp = risp = 1; /* presumed guilty */
Guido van Rossum24e62e21997-12-10 15:14:24 +0000740
Guido van Rossumb7057641998-05-13 21:20:49 +0000741 /* Move left index to element >= pivot */
742 while (l < p) {
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000743 SETK(*l, pivot);
Guido van Rossumb7057641998-05-13 21:20:49 +0000744 if (k < 0)
745 l++;
Guido van Rossum9be62831998-05-26 15:06:32 +0000746 else {
747 lisp = 0;
Guido van Rossumb7057641998-05-13 21:20:49 +0000748 break;
Guido van Rossum9be62831998-05-26 15:06:32 +0000749 }
Guido van Rossumb7057641998-05-13 21:20:49 +0000750 }
751 /* Move right index to element <= pivot */
752 while (r > p) {
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000753 SETK(pivot, *r);
Guido van Rossumb7057641998-05-13 21:20:49 +0000754 if (k < 0)
755 r--;
Guido van Rossum9be62831998-05-26 15:06:32 +0000756 else {
757 risp = 0;
Guido van Rossumb7057641998-05-13 21:20:49 +0000758 break;
Guido van Rossum9be62831998-05-26 15:06:32 +0000759 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000760 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000761
Guido van Rossum9be62831998-05-26 15:06:32 +0000762 if (lisp == risp) {
763 /* assert l < p < r or l == p == r
764 * This is the most common case, so we
765 * strive to get back to the top of the
766 * loop ASAP.
767 */
768 tmp = *l; *l = *r; *r = tmp;
769 l++; r--;
770 if (l < r)
771 continue;
772 break;
773 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000774
Guido van Rossum9be62831998-05-26 15:06:32 +0000775 /* One (exactly) of the pointers is at p */
776 /* assert (p == l) ^ (p == r) */
777 notp = lisp ? r : l;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000778 *p = *notp;
Guido van Rossum9be62831998-05-26 15:06:32 +0000779 k = (r - l) >> 1;
780 if (k) {
Guido van Rossum9be62831998-05-26 15:06:32 +0000781 if (lisp) {
782 p = r - k;
783 l++;
784 }
785 else {
786 p = l + k;
787 r--;
788 }
Guido van Rossum9be62831998-05-26 15:06:32 +0000789 *notp = *p;
790 *p = pivot; /* for consistency */
791 continue;
792 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000793
Guido van Rossum9be62831998-05-26 15:06:32 +0000794 /* assert l+1 == r */
Guido van Rossum9be62831998-05-26 15:06:32 +0000795 *notp = pivot;
796 p = notp;
797 break;
798 } /* end of partitioning loop */
799
800 /* assert *p == pivot
Guido van Rossumb7057641998-05-13 21:20:49 +0000801 All in [lo,p) are <= pivot
802 At p == pivot
803 All in [p+1,hi) are >= pivot
Guido van Rossumb7057641998-05-13 21:20:49 +0000804 */
Guido van Rossumb7057641998-05-13 21:20:49 +0000805
Guido van Rossum9be62831998-05-26 15:06:32 +0000806 r = p;
807 l = p + 1;
808 /* Partitions are [lo,r) and [l,hi).
809 * See whether *l == pivot; we know *l >= pivot, so
810 * they're equal iff *l <= pivot too, or not pivot < *l.
811 * This wastes a compare if it fails, but can win big
812 * when there are runs of duplicates.
813 */
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000814 SETK(pivot, *l);
Guido van Rossum9be62831998-05-26 15:06:32 +0000815 if (!(k < 0)) {
816 /* Now extend as far as possible (around p) so that:
817 All in [lo,r) are <= pivot
818 All in [r,l) are == pivot
819 All in [l,hi) are >= pivot
820 Mildly tricky: continue using only "<" -- we
821 deduce equality indirectly.
822 */
823 while (r > lo) {
824 /* because r-1 < p, *(r-1) <= pivot is known */
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000825 SETK(*(r-1), pivot);
Guido van Rossum9be62831998-05-26 15:06:32 +0000826 if (k < 0)
827 break;
828 /* <= and not < implies == */
829 r--;
830 }
831
Guido van Rossumb7057641998-05-13 21:20:49 +0000832 l++;
Guido van Rossum9be62831998-05-26 15:06:32 +0000833 while (l < hi) {
834 /* because l > p, pivot <= *l is known */
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000835 SETK(pivot, *l);
Guido van Rossum9be62831998-05-26 15:06:32 +0000836 if (k < 0)
837 break;
838 /* <= and not < implies == */
839 l++;
840 }
841
842 } /* end of checking for duplicates */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000843
844 /* Push biggest partition first */
Guido van Rossumb7057641998-05-13 21:20:49 +0000845 if (r - lo >= hi - l) {
Guido van Rossum3f236de1996-12-10 23:55:39 +0000846 /* First one is bigger */
Guido van Rossum9be62831998-05-26 15:06:32 +0000847 lostack[top] = lo;
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000848 histack[top++] = r;
Guido van Rossum9be62831998-05-26 15:06:32 +0000849 lostack[top] = l;
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000850 histack[top++] = hi;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000851 } else {
852 /* Second one is bigger */
Guido van Rossum9be62831998-05-26 15:06:32 +0000853 lostack[top] = l;
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000854 histack[top++] = hi;
Guido van Rossum9be62831998-05-26 15:06:32 +0000855 lostack[top] = lo;
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000856 histack[top++] = r;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000857 }
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000858 /* Should assert top <= STACKSIZE */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000859 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000860
Guido van Rossumb7057641998-05-13 21:20:49 +0000861 /* Success */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000862 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000863
864 fail:
865 return -1;
866
867#undef SETK
Guido van Rossum3f236de1996-12-10 23:55:39 +0000868}
869
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000870static PyObject *
Guido van Rossum3f236de1996-12-10 23:55:39 +0000871listsort(self, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872 PyListObject *self;
873 PyObject *compare;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000874{
Guido van Rossumae621ff1998-05-28 20:18:46 +0000875 if (quicksort(self, compare) < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000876 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 Py_INCREF(Py_None);
878 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000879}
880
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000881static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000882listreverse(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000883 PyListObject *self;
884 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +0000885{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000886 register PyObject **p, **q;
887 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +0000888
889 if (args != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000890 PyErr_BadArgument();
Guido van Rossumed98d481991-03-06 13:07:53 +0000891 return NULL;
892 }
893
894 if (self->ob_size > 1) {
895 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
896 p < q; p++, q--) {
897 tmp = *p;
898 *p = *q;
899 *q = tmp;
900 }
901 }
902
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903 Py_INCREF(Py_None);
904 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +0000905}
906
Guido van Rossum84c76f51990-10-30 13:32:20 +0000907int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908PyList_Reverse(v)
909 PyObject *v;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000910{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000911 if (v == NULL || !PyList_Check(v)) {
912 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000913 return -1;
914 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000915 v = listreverse((PyListObject *)v, (PyObject *)NULL);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000916 if (v == NULL)
917 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000918 Py_DECREF(v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000919 return 0;
920}
921
922int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000923PyList_Sort(v)
924 PyObject *v;
Guido van Rossum84c76f51990-10-30 13:32:20 +0000925{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000926 if (v == NULL || !PyList_Check(v)) {
927 PyErr_BadInternalCall();
Guido van Rossum84c76f51990-10-30 13:32:20 +0000928 return -1;
929 }
Guido van Rossumae621ff1998-05-28 20:18:46 +0000930 return quicksort((PyListObject *)v, (PyObject *)NULL);
Guido van Rossum84c76f51990-10-30 13:32:20 +0000931}
932
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933PyObject *
934PyList_AsTuple(v)
935 PyObject *v;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000936{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 PyObject *w;
938 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000939 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 if (v == NULL || !PyList_Check(v)) {
941 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000942 return NULL;
943 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000944 n = ((PyListObject *)v)->ob_size;
945 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000946 if (w == NULL)
947 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 p = ((PyTupleObject *)w)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000949 memcpy((ANY *)p,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000950 (ANY *)((PyListObject *)v)->ob_item,
951 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000952 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000953 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000954 p++;
955 }
956 return w;
957}
958
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000960listindex(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000961 PyListObject *self;
962 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +0000963{
964 int i;
965
966 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000967 PyErr_BadArgument();
Guido van Rossumed98d481991-03-06 13:07:53 +0000968 return NULL;
969 }
970 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000971 if (PyObject_Compare(self->ob_item[i], args) == 0)
972 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000973 if (PyErr_Occurred())
974 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +0000975 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +0000977 return NULL;
978}
979
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000980static PyObject *
Guido van Rossume6f7d181991-10-20 20:20:40 +0000981listcount(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000982 PyListObject *self;
983 PyObject *args;
Guido van Rossume6f7d181991-10-20 20:20:40 +0000984{
985 int count = 0;
986 int i;
987
988 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000989 PyErr_BadArgument();
Guido van Rossume6f7d181991-10-20 20:20:40 +0000990 return NULL;
991 }
992 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +0000994 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000995 if (PyErr_Occurred())
996 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +0000997 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000998 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +0000999}
1000
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001001static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001002listremove(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001003 PyListObject *self;
1004 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001005{
1006 int i;
1007
1008 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001009 PyErr_BadArgument();
Guido van Rossumed98d481991-03-06 13:07:53 +00001010 return NULL;
1011 }
1012 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001013 if (PyObject_Compare(self->ob_item[i], args) == 0) {
1014 if (list_ass_slice(self, i, i+1,
1015 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001016 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001017 Py_INCREF(Py_None);
1018 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001019 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001020 if (PyErr_Occurred())
1021 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001022 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001023 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001024 return NULL;
1025}
1026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027static PyMethodDef list_methods[] = {
1028 {"append", (PyCFunction)listappend},
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 {"insert", (PyCFunction)listinsert},
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001030 {"remove", (PyCFunction)listremove},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001031 {"index", (PyCFunction)listindex},
1032 {"count", (PyCFunction)listcount},
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001033 {"reverse", (PyCFunction)listreverse},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001034 {"sort", (PyCFunction)listsort, 0},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001035 {NULL, NULL} /* sentinel */
1036};
1037
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001038static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001039list_getattr(f, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001040 PyListObject *f;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001041 char *name;
1042{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 return Py_FindMethod(list_methods, (PyObject *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001044}
1045
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001046static PySequenceMethods list_as_sequence = {
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001047 (inquiry)list_length, /*sq_length*/
1048 (binaryfunc)list_concat, /*sq_concat*/
1049 (intargfunc)list_repeat, /*sq_repeat*/
1050 (intargfunc)list_item, /*sq_item*/
1051 (intintargfunc)list_slice, /*sq_slice*/
1052 (intobjargproc)list_ass_item, /*sq_ass_item*/
1053 (intintobjargproc)list_ass_slice, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001054};
1055
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056PyTypeObject PyList_Type = {
1057 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001058 0,
1059 "list",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001060 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001061 0,
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001062 (destructor)list_dealloc, /*tp_dealloc*/
1063 (printfunc)list_print, /*tp_print*/
1064 (getattrfunc)list_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001065 0, /*tp_setattr*/
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001066 (cmpfunc)list_compare, /*tp_compare*/
1067 (reprfunc)list_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001068 0, /*tp_as_number*/
1069 &list_as_sequence, /*tp_as_sequence*/
1070 0, /*tp_as_mapping*/
1071};