blob: f70d19bdf1157bd1415cbbcfd619823cafcf3d8b [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 Rossumb18618d2000-05-03 23:44:39 +000073 /* PyObject_NewVar is inlined */
74 op = (PyListObject *) PyObject_MALLOC(sizeof(PyListObject));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000075 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000076 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000077 }
78 if (size <= 0) {
79 op->ob_item = NULL;
80 }
81 else {
Guido van Rossumb18618d2000-05-03 23:44:39 +000082 op->ob_item = (PyObject **) PyMem_MALLOC(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000083 if (op->ob_item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +000084 PyObject_FREE(op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000085 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000086 }
87 }
Guido van Rossumb18618d2000-05-03 23:44:39 +000088 PyObject_INIT_VAR(op, &PyList_Type, size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000089 for (i = 0; i < size; i++)
90 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000092}
93
94int
Guido van Rossumc0b618a1997-05-02 03:12:38 +000095PyList_Size(op)
96 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000097{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000098 if (!PyList_Check(op)) {
99 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000100 return -1;
101 }
102 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000103 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000104}
105
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000106static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000107
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000108PyObject *
109PyList_GetItem(op, i)
110 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000111 int i;
112{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000113 if (!PyList_Check(op)) {
114 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000115 return NULL;
116 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000117 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000118 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000119 indexerr = PyString_FromString(
120 "list index out of range");
121 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000122 return NULL;
123 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000124 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000125}
126
127int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000128PyList_SetItem(op, i, newitem)
129 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000130 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000131 register PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000132{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000133 register PyObject *olditem;
134 register PyObject **p;
135 if (!PyList_Check(op)) {
136 Py_XDECREF(newitem);
137 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000138 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000139 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000140 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
141 Py_XDECREF(newitem);
142 PyErr_SetString(PyExc_IndexError,
143 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000144 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000145 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000146 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000147 olditem = *p;
148 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000149 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000150 return 0;
151}
152
153static int
154ins1(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000155 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000156 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000157 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000158{
159 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000160 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000161 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000162 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000163 return -1;
164 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000165 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000166 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000167 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000168 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000169 return -1;
170 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000171 if (where < 0)
172 where = 0;
173 if (where > self->ob_size)
174 where = self->ob_size;
175 for (i = self->ob_size; --i >= where; )
176 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000177 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000178 items[where] = v;
179 self->ob_item = items;
180 self->ob_size++;
181 return 0;
182}
183
184int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000185PyList_Insert(op, where, newitem)
186 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000187 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000188 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000189{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000190 if (!PyList_Check(op)) {
191 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000192 return -1;
193 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000194 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000195}
196
197int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000198PyList_Append(op, newitem)
199 PyObject *op;
200 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000201{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000202 if (!PyList_Check(op)) {
203 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000204 return -1;
205 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000206 return ins1((PyListObject *)op,
207 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000208}
209
210/* Methods */
211
212static void
213list_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000214 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000215{
216 int i;
Guido van Rossumd724b232000-03-13 16:01:29 +0000217 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000218 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000219 /* Do it backwards, for Christian Tismer.
220 There's a simple test case where somehow this reduces
221 thrashing when a *very* large list is created and
222 immediately deleted. */
223 i = op->ob_size;
224 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000225 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000226 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000227 PyMem_FREE(op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000228 }
Guido van Rossumb18618d2000-05-03 23:44:39 +0000229 PyObject_DEL(op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000230 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000231}
232
Guido van Rossum90933611991-06-07 16:10:43 +0000233static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000234list_print(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000235 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000236 FILE *fp;
237 int flags;
238{
239 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000240
241 i = Py_ReprEnter((PyObject*)op);
242 if (i != 0) {
243 if (i < 0)
244 return i;
245 fprintf(fp, "[...]");
246 return 0;
247 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000248 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000249 for (i = 0; i < op->ob_size; i++) {
250 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000251 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000252 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
253 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000254 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000255 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000256 }
257 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000258 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000259 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000260}
261
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000262static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000263list_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000264 PyListObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000265{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000266 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000267 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000268
269 i = Py_ReprEnter((PyObject*)v);
270 if (i != 0) {
271 if (i > 0)
272 return PyString_FromString("[...]");
273 return NULL;
274 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000275 s = PyString_FromString("[");
276 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000277 for (i = 0; i < v->ob_size && s != NULL; i++) {
278 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000279 PyString_Concat(&s, comma);
280 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000281 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000282 Py_XDECREF(comma);
283 PyString_ConcatAndDel(&s, PyString_FromString("]"));
Guido van Rossumfb376de1998-04-10 22:47:27 +0000284 Py_ReprLeave((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285 return s;
286}
287
288static int
289list_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000290 PyListObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000291{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292 int i;
Guido van Rossumae621ff1998-05-28 20:18:46 +0000293 for (i = 0; i < v->ob_size && i < w->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000294 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000295 if (cmp != 0)
296 return cmp;
297 }
298 return v->ob_size - w->ob_size;
299}
300
301static int
302list_length(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304{
305 return a->ob_size;
306}
307
Jeremy Hylton37b1a262000-04-27 21:41:03 +0000308
309
310static int
311list_contains(a, el)
312 PyListObject *a;
313 PyObject *el;
314{
315 int i, cmp;
316
317 for (i = 0; i < a->ob_size; ++i) {
318 cmp = PyObject_Compare(el, PyList_GET_ITEM(a, i));
319 if (cmp == 0)
320 return 1;
321 if (PyErr_Occurred())
322 return -1;
323 }
324 return 0;
325}
326
327
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000328static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000329list_item(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 int i;
332{
333 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000334 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000335 indexerr = PyString_FromString(
336 "list index out of range");
337 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000338 return NULL;
339 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 return a->ob_item[i];
342}
343
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345list_slice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000346 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000347 int ilow, ihigh;
348{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000349 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000350 int i;
351 if (ilow < 0)
352 ilow = 0;
353 else if (ilow > a->ob_size)
354 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000355 if (ihigh < ilow)
356 ihigh = ilow;
357 else if (ihigh > a->ob_size)
358 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360 if (np == NULL)
361 return NULL;
362 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363 PyObject *v = a->ob_item[i];
364 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000365 np->ob_item[i - ilow] = v;
366 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000367 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000368}
369
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370PyObject *
371PyList_GetSlice(a, ilow, ihigh)
372 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000373 int ilow, ihigh;
374{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375 if (!PyList_Check(a)) {
376 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000377 return NULL;
378 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000379 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000380}
381
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000383list_concat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000384 PyListObject *a;
385 PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000386{
387 int size;
388 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000389 PyListObject *np;
390 if (!PyList_Check(bb)) {
391 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392 return NULL;
393 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000394#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000395 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000396 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000397 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000398 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000399 }
400 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000401 PyObject *v = a->ob_item[i];
402 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000403 np->ob_item[i] = v;
404 }
405 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000406 PyObject *v = b->ob_item[i];
407 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000408 np->ob_item[i + a->ob_size] = v;
409 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000411#undef b
412}
413
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000415list_repeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000416 PyListObject *a;
Guido van Rossumed98d481991-03-06 13:07:53 +0000417 int n;
418{
419 int i, j;
420 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 PyListObject *np;
422 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000423 if (n < 0)
424 n = 0;
425 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000426 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000427 if (np == NULL)
428 return NULL;
429 p = np->ob_item;
430 for (i = 0; i < n; i++) {
431 for (j = 0; j < a->ob_size; j++) {
432 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000434 p++;
435 }
436 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000438}
439
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000440static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000441list_ass_slice(a, ilow, ihigh, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000442 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000443 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000445{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000446 /* Because [X]DECREF can recursively invoke list operations on
447 this list, we must postpone all [X]DECREF activity until
448 after the list is back in its canonical shape. Therefore
449 we must allocate an additional array, 'recycle', into which
450 we temporarily copy the items that are deleted from the
451 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000452 PyObject **recycle, **p;
453 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000454 int n; /* Size of replacement list */
455 int d; /* Change in size */
456 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000457#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000458 if (v == NULL)
459 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000460 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000461 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000462 if (a == b) {
463 /* Special case "a[i:j] = a" -- copy b first */
464 int ret;
465 v = list_slice(b, 0, n);
466 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000468 return ret;
469 }
470 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000471 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000472 PyErr_BadArgument();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000473 return -1;
474 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000475 if (ilow < 0)
476 ilow = 0;
477 else if (ilow > a->ob_size)
478 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000479 if (ihigh < ilow)
480 ihigh = ilow;
481 else if (ihigh > a->ob_size)
482 ihigh = a->ob_size;
483 item = a->ob_item;
484 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000485 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000486 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000487 else
488 p = recycle = NULL;
489 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000491 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492 if (d < 0) {
493 for (/*k = ihigh*/; k < a->ob_size; k++)
494 item[k+d] = item[k];
495 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000497 a->ob_item = item;
498 }
499 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000500 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000501 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000502 if (item == NULL) {
Guido van Rossumb18618d2000-05-03 23:44:39 +0000503 if (recycle != NULL)
504 PyMem_DEL(recycle);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000505 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000506 return -1;
507 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000508 for (k = a->ob_size; --k >= ihigh; )
509 item[k+d] = item[k];
510 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000511 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000512 a->ob_item = item;
513 a->ob_size += d;
514 }
515 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000516 PyObject *w = b->ob_item[k];
517 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000518 item[ilow] = w;
519 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000520 if (recycle) {
521 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 Py_XDECREF(*p);
523 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000524 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000525 return 0;
526#undef b
527}
528
Guido van Rossum234f9421993-06-17 12:35:49 +0000529int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530PyList_SetSlice(a, ilow, ihigh, v)
531 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000532 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000533 PyObject *v;
Guido van Rossum234f9421993-06-17 12:35:49 +0000534{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000535 if (!PyList_Check(a)) {
536 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000537 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000538 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000540}
541
Guido van Rossum4a450d01991-04-03 19:05:18 +0000542static int
543list_ass_item(a, i, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000544 PyListObject *a;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000545 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000546 PyObject *v;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000547{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000548 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000549 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000550 PyErr_SetString(PyExc_IndexError,
551 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000552 return -1;
553 }
554 if (v == NULL)
555 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000556 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000557 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000558 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000560 return 0;
561}
562
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000563static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000564ins(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000568{
569 if (ins1(self, where, v) != 0)
570 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000571 Py_INCREF(Py_None);
572 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000573}
574
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000575static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000576listinsert(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000577 PyListObject *self;
578 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000579{
580 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000582 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000583 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000584 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585}
586
Guido van Rossumef93b872000-03-13 15:41:59 +0000587/* Define NO_STRICT_LIST_APPEND to enable multi-argument append() */
588
589#ifndef NO_STRICT_LIST_APPEND
590#define PyArg_ParseTuple_Compat1 PyArg_ParseTuple
591#else
592#define PyArg_ParseTuple_Compat1(args, format, ret) \
593( \
594 PyTuple_GET_SIZE(args) > 1 ? (*ret = args, 1) : \
595 PyTuple_GET_SIZE(args) == 1 ? (*ret = PyTuple_GET_ITEM(args, 0), 1) : \
596 PyArg_ParseTuple(args, format, ret) \
597)
598#endif
599
600
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000601static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000602listappend(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000603 PyListObject *self;
604 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000605{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000606 PyObject *v;
Guido van Rossumef93b872000-03-13 15:41:59 +0000607 if (!PyArg_ParseTuple_Compat1(args, "O:append", &v))
Guido van Rossumbf80e541993-02-08 15:49:17 +0000608 return NULL;
609 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000610}
611
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000612static PyObject *
Barry Warsawdedf6d61998-10-09 16:37:25 +0000613listextend(self, args)
614 PyListObject *self;
615 PyObject *args;
616{
617 PyObject *b = NULL, *res = NULL;
618 PyObject **items;
619 int selflen = PyList_GET_SIZE(self);
620 int blen;
621 register int i;
622
Guido van Rossumc00a9382000-02-24 21:48:29 +0000623 if (!PyArg_ParseTuple(args, "O:extend", &b))
Barry Warsawdedf6d61998-10-09 16:37:25 +0000624 return NULL;
625
626 if (!PyList_Check(b)) {
627 PyErr_SetString(PyExc_TypeError,
628 "list.extend() argument must be a list");
629 return NULL;
630 }
631 if (PyList_GET_SIZE(b) == 0) {
632 /* short circuit when b is empty */
633 Py_INCREF(Py_None);
634 return Py_None;
635 }
636 if (self == (PyListObject*)b) {
637 /* as in list_ass_slice() we must special case the
638 * situation: a.extend(a)
639 *
640 * XXX: I think this way ought to be faster than using
641 * list_slice() the way list_ass_slice() does.
642 */
643 b = PyList_New(selflen);
644 if (!b)
645 return NULL;
646 for (i = 0; i < selflen; i++) {
647 PyObject *o = PyList_GET_ITEM(self, i);
648 Py_INCREF(o);
649 PyList_SET_ITEM(b, i, o);
650 }
651 }
652 else
653 /* we want b to have the same refcount semantics for the
654 * Py_XDECREF() in the finally clause regardless of which
655 * branch in the above conditional we took.
656 */
657 Py_INCREF(b);
658
659 blen = PyList_GET_SIZE(b);
660 /* resize a using idiom */
661 items = self->ob_item;
662 NRESIZE(items, PyObject*, selflen + blen);
663 if (items == NULL ) {
664 PyErr_NoMemory();
665 goto finally;
666 }
667 self->ob_item = items;
668
669 /* populate the end self with b's items */
670 for (i = 0; i < blen; i++) {
671 PyObject *o = PyList_GET_ITEM(b, i);
672 Py_INCREF(o);
673 PyList_SET_ITEM(self, self->ob_size++, o);
674 }
675 res = Py_None;
676 Py_INCREF(res);
677 finally:
678 Py_XDECREF(b);
679 return res;
680}
681
682
683static PyObject *
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000684listpop(self, args)
685 PyListObject *self;
686 PyObject *args;
687{
688 int i = -1;
689 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000690 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000691 return NULL;
692 if (self->ob_size == 0) {
693 /* Special-case most common failure cause */
694 PyErr_SetString(PyExc_IndexError, "pop from empty list");
695 return NULL;
696 }
697 if (i < 0)
698 i += self->ob_size;
699 if (i < 0 || i >= self->ob_size) {
700 PyErr_SetString(PyExc_IndexError, "pop index out of range");
701 return NULL;
702 }
703 v = self->ob_item[i];
704 Py_INCREF(v);
705 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
706 Py_DECREF(v);
707 return NULL;
708 }
709 return v;
710}
711
Guido van Rossum3f236de1996-12-10 23:55:39 +0000712/* New quicksort implementation for arrays of object pointers.
713 Thanks to discussions with Tim Peters. */
714
715/* CMPERROR is returned by our comparison function when an error
716 occurred. This is the largest negative integer (0x80000000 on a
717 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000718#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000719
720/* Comparison function. Takes care of calling a user-supplied
721 comparison function (any callable Python object). Calls the
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000722 standard comparison function, PyObject_Compare(), if the user-
723 supplied function is NULL. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000724
725static int
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000726docompare(x, y, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000727 PyObject *x;
728 PyObject *y;
729 PyObject *compare;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000730{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000731 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000732 int i;
733
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000734 if (compare == NULL) {
735 i = PyObject_Compare(x, y);
736 if (i && PyErr_Occurred())
737 i = CMPERROR;
738 return i;
739 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000740
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000741 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000742 if (args == NULL)
743 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000744 res = PyEval_CallObject(compare, args);
745 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000746 if (res == NULL)
747 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000748 if (!PyInt_Check(res)) {
749 Py_DECREF(res);
750 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000751 "comparison function must return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000752 return CMPERROR;
753 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000754 i = PyInt_AsLong(res);
755 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000756 if (i < 0)
757 return -1;
758 if (i > 0)
759 return 1;
760 return 0;
761}
762
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000763/* MINSIZE is the smallest array that will get a full-blown samplesort
764 treatment; smaller arrays are sorted using binary insertion. It must
765 be at least 7 for the samplesort implementation to work. Binary
766 insertion does fewer compares, but can suffer O(N**2) data movement.
767 The more expensive compares, the larger MINSIZE should be. */
768#define MINSIZE 100
769
770/* MINPARTITIONSIZE is the smallest array slice samplesort will bother to
771 partition; smaller slices are passed to binarysort. It must be at
772 least 2, and no larger than MINSIZE. Setting it higher reduces the #
773 of compares slowly, but increases the amount of data movement quickly.
774 The value here was chosen assuming a compare costs ~25x more than
775 swapping a pair of memory-resident pointers -- but under that assumption,
776 changing the value by a few dozen more or less has aggregate effect
777 under 1%. So the value is crucial, but not touchy <wink>. */
778#define MINPARTITIONSIZE 40
779
780/* MAXMERGE is the largest number of elements we'll always merge into
781 a known-to-be sorted chunk via binary insertion, regardless of the
782 size of that chunk. Given a chunk of N sorted elements, and a group
783 of K unknowns, the largest K for which it's better to do insertion
784 (than a full-blown sort) is a complicated function of N and K mostly
785 involving the expected number of compares and data moves under each
786 approach, and the relative cost of those operations on a specific
787 architecure. The fixed value here is conservative, and should be a
788 clear win regardless of architecture or N. */
789#define MAXMERGE 15
Guido van Rossum3f236de1996-12-10 23:55:39 +0000790
Guido van Rossum3f236de1996-12-10 23:55:39 +0000791/* STACKSIZE is the size of our work stack. A rough estimate is that
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000792 this allows us to sort arrays of size N where
793 N / ln(N) = MINPARTITIONSIZE * 2**STACKSIZE, so 60 is more than enough
794 for arrays of size 2**64. Because we push the biggest partition
795 first, the worst case occurs when all subarrays are always partitioned
796 exactly in two. */
797#define STACKSIZE 60
Guido van Rossum3f236de1996-12-10 23:55:39 +0000798
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000799
800#define SETK(X,Y) if ((k = docompare(X,Y,compare))==CMPERROR) goto fail
801
802/* binarysort is the best method for sorting small arrays: it does
803 few compares, but can do data movement quadratic in the number of
804 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000805 [lo, hi) is a contiguous slice of a list, and is sorted via
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000806 binary insertion.
807 On entry, must have lo <= start <= hi, and that [lo, start) is already
808 sorted (pass start == lo if you don't know!).
809 If docompare complains (returns CMPERROR) return -1, else 0.
810 Even in case of error, the output slice will be some permutation of
811 the input (nothing is lost or duplicated).
812*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000813
814static int
Guido van Rossum42812581998-06-17 14:15:44 +0000815binarysort(lo, hi, start, compare)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000816 PyObject **lo;
817 PyObject **hi;
818 PyObject **start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819 PyObject *compare;/* Comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000820{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000821 /* assert lo <= start <= hi
822 assert [lo, start) is sorted */
823 register int k;
824 register PyObject **l, **p, **r;
825 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000826
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000827 if (lo == start)
828 ++start;
829 for (; start < hi; ++start) {
830 /* set l to where *start belongs */
831 l = lo;
832 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000833 pivot = *r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000834 do {
835 p = l + ((r - l) >> 1);
836 SETK(pivot, *p);
837 if (k < 0)
838 r = p;
839 else
840 l = p + 1;
841 } while (l < r);
842 /* Pivot should go at l -- slide over to make room.
843 Caution: using memmove is much slower under MSVC 5;
844 we're not usually moving many slots. */
845 for (p = start; p > l; --p)
846 *p = *(p-1);
847 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000848 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000849 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000850
851 fail:
852 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000853}
854
855/* samplesortslice is the sorting workhorse.
Guido van Rossum42812581998-06-17 14:15:44 +0000856 [lo, hi) is a contiguous slice of a list, to be sorted in place.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000857 On entry, must have lo <= hi,
858 If docompare complains (returns CMPERROR) return -1, else 0.
859 Even in case of error, the output slice will be some permutation of
860 the input (nothing is lost or duplicated).
861
862 samplesort is basically quicksort on steroids: a power of 2 close
863 to n/ln(n) is computed, and that many elements (less 1) are picked at
864 random from the array and sorted. These 2**k - 1 elements are then
865 used as preselected pivots for an equal number of quicksort
866 partitioning steps, partitioning the slice into 2**k chunks each of
867 size about ln(n). These small final chunks are then usually handled
868 by binarysort. Note that when k=1, this is roughly the same as an
869 ordinary quicksort using a random pivot, and when k=2 this is roughly
870 a median-of-3 quicksort. From that view, using k ~= lg(n/ln(n)) makes
871 this a "median of n/ln(n)" quicksort. You can also view it as a kind
872 of bucket sort, where 2**k-1 bucket boundaries are picked dynamically.
873
874 The large number of samples makes a quadratic-time case almost
875 impossible, and asymptotically drives the average-case number of
876 compares from quicksort's 2 N ln N (or 12/7 N ln N for the median-of-
877 3 variant) down to N lg N.
878
879 We also play lots of low-level tricks to cut the number of compares.
880
881 Very obscure: To avoid using extra memory, the PPs are stored in the
882 array and shuffled around as partitioning proceeds. At the start of a
883 partitioning step, we'll have 2**m-1 (for some m) PPs in sorted order,
884 adjacent (either on the left or the right!) to a chunk of X elements
885 that are to be partitioned: P X or X P. In either case we need to
886 shuffle things *in place* so that the 2**(m-1) smaller PPs are on the
887 left, followed by the PP to be used for this step (that's the middle
888 of the PPs), followed by X, followed by the 2**(m-1) larger PPs:
889 P X or X P -> Psmall pivot X Plarge
890 and the order of the PPs must not be altered. It can take a while
891 to realize this isn't trivial! It can take even longer <wink> to
892 understand why the simple code below works, using only 2**(m-1) swaps.
893 The key is that the order of the X elements isn't necessarily
894 preserved: X can end up as some cyclic permutation of its original
895 order. That's OK, because X is unsorted anyway. If the order of X
896 had to be preserved too, the simplest method I know of using O(1)
897 scratch storage requires len(X) + 2**(m-1) swaps, spread over 2 passes.
898 Since len(X) is typically several times larger than 2**(m-1), that
899 would slow things down.
900*/
901
902struct SamplesortStackNode {
903 /* Represents a slice of the array, from (& including) lo up
904 to (but excluding) hi. "extra" additional & adjacent elements
905 are pre-selected pivots (PPs), spanning [lo-extra, lo) if
906 extra > 0, or [hi, hi-extra) if extra < 0. The PPs are
907 already sorted, but nothing is known about the other elements
908 in [lo, hi). |extra| is always one less than a power of 2.
909 When extra is 0, we're out of PPs, and the slice must be
910 sorted by some other means. */
911 PyObject **lo;
912 PyObject **hi;
913 int extra;
914};
915
916/* The number of PPs we want is 2**k - 1, where 2**k is as close to
Guido van Rossum42812581998-06-17 14:15:44 +0000917 N / ln(N) as possible. So k ~= lg(N / ln(N)). Calling libm routines
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000918 is undesirable, so cutoff values are canned in the "cutoff" table
919 below: cutoff[i] is the smallest N such that k == CUTOFFBASE + i. */
920#define CUTOFFBASE 4
Guido van Rossum3aa23fd1999-01-14 19:01:53 +0000921static long cutoff[] = {
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000922 43, /* smallest N such that k == 4 */
923 106, /* etc */
924 250,
925 576,
926 1298,
927 2885,
928 6339,
929 13805,
930 29843,
931 64116,
932 137030,
933 291554,
934 617916,
935 1305130,
936 2748295,
937 5771662,
938 12091672,
939 25276798,
940 52734615,
941 109820537,
942 228324027,
943 473977813,
944 982548444, /* smallest N such that k == 26 */
945 2034159050 /* largest N that fits in signed 32-bit; k == 27 */
946};
947
948static int
Guido van Rossum42812581998-06-17 14:15:44 +0000949samplesortslice(lo, hi, compare)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000950 PyObject **lo;
951 PyObject **hi;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000952 PyObject *compare;/* Comparison function object, or NULL for default */
953{
954 register PyObject **l, **r;
955 register PyObject *tmp, *pivot;
956 register int k;
957 int n, extra, top, extraOnRight;
958 struct SamplesortStackNode stack[STACKSIZE];
959
960 /* assert lo <= hi */
961 n = hi - lo;
962
963 /* ----------------------------------------------------------
964 * Special cases
965 * --------------------------------------------------------*/
966 if (n < 2)
967 return 0;
968
969 /* Set r to the largest value such that [lo,r) is sorted.
970 This catches the already-sorted case, the all-the-same
971 case, and the appended-a-few-elements-to-a-sorted-list case.
972 If the array is unsorted, we're very likely to get out of
973 the loop fast, so the test is cheap if it doesn't pay off.
974 */
975 /* assert lo < hi */
976 for (r = lo+1; r < hi; ++r) {
977 SETK(*r, *(r-1));
978 if (k < 0)
979 break;
980 }
981 /* [lo,r) is sorted, [r,hi) unknown. Get out cheap if there are
982 few unknowns, or few elements in total. */
983 if (hi - r <= MAXMERGE || n < MINSIZE)
Guido van Rossum42812581998-06-17 14:15:44 +0000984 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000985
986 /* Check for the array already being reverse-sorted. Typical
987 benchmark-driven silliness <wink>. */
988 /* assert lo < hi */
989 for (r = lo+1; r < hi; ++r) {
990 SETK(*(r-1), *r);
991 if (k < 0)
992 break;
993 }
994 if (hi - r <= MAXMERGE) {
995 /* Reverse the reversed prefix, then insert the tail */
996 PyObject **originalr = r;
997 l = lo;
998 do {
999 --r;
1000 tmp = *l; *l = *r; *r = tmp;
1001 ++l;
1002 } while (l < r);
Guido van Rossum42812581998-06-17 14:15:44 +00001003 return binarysort(lo, hi, originalr, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001004 }
1005
1006 /* ----------------------------------------------------------
1007 * Normal case setup: a large array without obvious pattern.
1008 * --------------------------------------------------------*/
1009
1010 /* extra := a power of 2 ~= n/ln(n), less 1.
1011 First find the smallest extra s.t. n < cutoff[extra] */
1012 for (extra = 0;
1013 extra < sizeof(cutoff) / sizeof(cutoff[0]);
1014 ++extra) {
1015 if (n < cutoff[extra])
1016 break;
1017 /* note that if we fall out of the loop, the value of
1018 extra still makes *sense*, but may be smaller than
1019 we would like (but the array has more than ~= 2**31
1020 elements in this case!) */
1021 }
1022 /* Now k == extra - 1 + CUTOFFBASE. The smallest value k can
1023 have is CUTOFFBASE-1, so
1024 assert MINSIZE >= 2**(CUTOFFBASE-1) - 1 */
1025 extra = (1 << (extra - 1 + CUTOFFBASE)) - 1;
1026 /* assert extra > 0 and n >= extra */
1027
1028 /* Swap that many values to the start of the array. The
1029 selection of elements is pseudo-random, but the same on
1030 every run (this is intentional! timing algorithm changes is
1031 a pain if timing varies across runs). */
1032 {
1033 unsigned int seed = n / extra; /* arbitrary */
1034 unsigned int i;
1035 for (i = 0; i < (unsigned)extra; ++i) {
1036 /* j := random int in [i, n) */
1037 unsigned int j;
1038 seed = seed * 69069 + 7;
1039 j = i + seed % (n - i);
1040 tmp = lo[i]; lo[i] = lo[j]; lo[j] = tmp;
1041 }
1042 }
1043
1044 /* Recursively sort the preselected pivots. */
Guido van Rossum42812581998-06-17 14:15:44 +00001045 if (samplesortslice(lo, lo + extra, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001046 goto fail;
1047
1048 top = 0; /* index of available stack slot */
1049 lo += extra; /* point to first unknown */
1050 extraOnRight = 0; /* the PPs are at the left end */
1051
1052 /* ----------------------------------------------------------
1053 * Partition [lo, hi), and repeat until out of work.
1054 * --------------------------------------------------------*/
1055 for (;;) {
1056 /* assert lo <= hi, so n >= 0 */
1057 n = hi - lo;
1058
1059 /* We may not want, or may not be able, to partition:
1060 If n is small, it's quicker to insert.
1061 If extra is 0, we're out of pivots, and *must* use
1062 another method.
1063 */
1064 if (n < MINPARTITIONSIZE || extra == 0) {
1065 if (n >= MINSIZE) {
1066 /* assert extra == 0
1067 This is rare, since the average size
1068 of a final block is only about
1069 ln(original n). */
Guido van Rossum42812581998-06-17 14:15:44 +00001070 if (samplesortslice(lo, hi, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001071 goto fail;
1072 }
1073 else {
1074 /* Binary insertion should be quicker,
1075 and we can take advantage of the PPs
1076 already being sorted. */
1077 if (extraOnRight && extra) {
1078 /* swap the PPs to the left end */
1079 k = extra;
1080 do {
1081 tmp = *lo;
1082 *lo = *hi;
1083 *hi = tmp;
1084 ++lo; ++hi;
1085 } while (--k);
1086 }
1087 if (binarysort(lo - extra, hi, lo,
Guido van Rossum42812581998-06-17 14:15:44 +00001088 compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001089 goto fail;
1090 }
1091
1092 /* Find another slice to work on. */
1093 if (--top < 0)
1094 break; /* no more -- done! */
1095 lo = stack[top].lo;
1096 hi = stack[top].hi;
1097 extra = stack[top].extra;
1098 extraOnRight = 0;
1099 if (extra < 0) {
1100 extraOnRight = 1;
1101 extra = -extra;
1102 }
1103 continue;
1104 }
1105
1106 /* Pretend the PPs are indexed 0, 1, ..., extra-1.
1107 Then our preselected pivot is at (extra-1)/2, and we
1108 want to move the PPs before that to the left end of
1109 the slice, and the PPs after that to the right end.
1110 The following section changes extra, lo, hi, and the
1111 slice such that:
1112 [lo-extra, lo) contains the smaller PPs.
1113 *lo == our PP.
1114 (lo, hi) contains the unknown elements.
1115 [hi, hi+extra) contains the larger PPs.
1116 */
1117 k = extra >>= 1; /* num PPs to move */
1118 if (extraOnRight) {
1119 /* Swap the smaller PPs to the left end.
1120 Note that this loop actually moves k+1 items:
1121 the last is our PP */
1122 do {
1123 tmp = *lo; *lo = *hi; *hi = tmp;
1124 ++lo; ++hi;
1125 } while (k--);
1126 }
1127 else {
1128 /* Swap the larger PPs to the right end. */
1129 while (k--) {
1130 --lo; --hi;
1131 tmp = *lo; *lo = *hi; *hi = tmp;
1132 }
1133 }
1134 --lo; /* *lo is now our PP */
1135 pivot = *lo;
1136
1137 /* Now an almost-ordinary quicksort partition step.
1138 Note that most of the time is spent here!
1139 Only odd thing is that we partition into < and >=,
1140 instead of the usual <= and >=. This helps when
1141 there are lots of duplicates of different values,
1142 because it eventually tends to make subfiles
1143 "pure" (all duplicates), and we special-case for
1144 duplicates later. */
1145 l = lo + 1;
1146 r = hi - 1;
1147 /* assert lo < l < r < hi (small n weeded out above) */
1148
1149 do {
1150 /* slide l right, looking for key >= pivot */
1151 do {
1152 SETK(*l, pivot);
1153 if (k < 0)
1154 ++l;
1155 else
1156 break;
1157 } while (l < r);
1158
1159 /* slide r left, looking for key < pivot */
1160 while (l < r) {
Guido van Rossum42812581998-06-17 14:15:44 +00001161 register PyObject *rval = *r--;
1162 SETK(rval, pivot);
1163 if (k < 0) {
1164 /* swap and advance */
1165 r[1] = *l;
1166 *l++ = rval;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001167 break;
Guido van Rossum42812581998-06-17 14:15:44 +00001168 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001169 }
1170
1171 } while (l < r);
1172
1173 /* assert lo < r <= l < hi
1174 assert r == l or r+1 == l
1175 everything to the left of l is < pivot, and
1176 everything to the right of r is >= pivot */
1177
1178 if (l == r) {
1179 SETK(*r, pivot);
1180 if (k < 0)
1181 ++l;
1182 else
1183 --r;
1184 }
1185 /* assert lo <= r and r+1 == l and l <= hi
1186 assert r == lo or a[r] < pivot
1187 assert a[lo] is pivot
1188 assert l == hi or a[l] >= pivot
1189 Swap the pivot into "the middle", so we can henceforth
1190 ignore it.
1191 */
1192 *lo = *r;
1193 *r = pivot;
1194
1195 /* The following is true now, & will be preserved:
1196 All in [lo,r) are < pivot
1197 All in [r,l) == pivot (& so can be ignored)
1198 All in [l,hi) are >= pivot */
1199
1200 /* Check for duplicates of the pivot. One compare is
1201 wasted if there are no duplicates, but can win big
1202 when there are.
1203 Tricky: we're sticking to "<" compares, so deduce
1204 equality indirectly. We know pivot <= *l, so they're
1205 equal iff not pivot < *l.
1206 */
1207 while (l < hi) {
1208 /* pivot <= *l known */
1209 SETK(pivot, *l);
1210 if (k < 0)
1211 break;
1212 else
1213 /* <= and not < implies == */
1214 ++l;
1215 }
1216
1217 /* assert lo <= r < l <= hi
1218 Partitions are [lo, r) and [l, hi) */
1219
1220 /* push fattest first; remember we still have extra PPs
1221 to the left of the left chunk and to the right of
1222 the right chunk! */
1223 /* assert top < STACKSIZE */
1224 if (r - lo <= hi - l) {
1225 /* second is bigger */
1226 stack[top].lo = l;
1227 stack[top].hi = hi;
1228 stack[top].extra = -extra;
1229 hi = r;
1230 extraOnRight = 0;
1231 }
1232 else {
1233 /* first is bigger */
1234 stack[top].lo = lo;
1235 stack[top].hi = r;
1236 stack[top].extra = extra;
1237 lo = l;
1238 extraOnRight = 1;
1239 }
1240 ++top;
1241
1242 } /* end of partitioning loop */
1243
1244 return 0;
1245
1246 fail:
1247 return -1;
1248}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001249
1250#undef SETK
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001251
1252staticforward PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001253
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001254static PyObject *
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001255listsort(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001256 PyListObject *self;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001257 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001258{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001259 int err;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001260 PyObject *compare = NULL;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001261
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001262 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001263 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001264 return NULL;
1265 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001266 self->ob_type = &immutable_list_type;
1267 err = samplesortslice(self->ob_item,
1268 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001269 compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001270 self->ob_type = &PyList_Type;
1271 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001272 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001273 Py_INCREF(Py_None);
1274 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001275}
1276
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001277int
1278PyList_Sort(v)
1279 PyObject *v;
1280{
1281 if (v == NULL || !PyList_Check(v)) {
1282 PyErr_BadInternalCall();
1283 return -1;
1284 }
1285 v = listsort((PyListObject *)v, (PyObject *)NULL);
1286 if (v == NULL)
1287 return -1;
1288 Py_DECREF(v);
1289 return 0;
1290}
1291
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001293listreverse(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001294 PyListObject *self;
1295 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001296{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297 register PyObject **p, **q;
1298 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +00001299
Guido van Rossumc00a9382000-02-24 21:48:29 +00001300 if (!PyArg_ParseTuple(args, ":reverse"))
Guido van Rossumed98d481991-03-06 13:07:53 +00001301 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001302
1303 if (self->ob_size > 1) {
1304 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
1305 p < q; p++, q--) {
1306 tmp = *p;
1307 *p = *q;
1308 *q = tmp;
1309 }
1310 }
1311
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001312 Py_INCREF(Py_None);
1313 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001314}
1315
Guido van Rossum84c76f51990-10-30 13:32:20 +00001316int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001317PyList_Reverse(v)
1318 PyObject *v;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001319{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001320 if (v == NULL || !PyList_Check(v)) {
1321 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001322 return -1;
1323 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001324 v = listreverse((PyListObject *)v, (PyObject *)NULL);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001325 if (v == NULL)
1326 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001327 Py_DECREF(v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001328 return 0;
1329}
1330
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331PyObject *
1332PyList_AsTuple(v)
1333 PyObject *v;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001334{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001335 PyObject *w;
1336 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001337 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001338 if (v == NULL || !PyList_Check(v)) {
1339 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001340 return NULL;
1341 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001342 n = ((PyListObject *)v)->ob_size;
1343 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001344 if (w == NULL)
1345 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001346 p = ((PyTupleObject *)w)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001347 memcpy((ANY *)p,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001348 (ANY *)((PyListObject *)v)->ob_item,
1349 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001350 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001351 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001352 p++;
1353 }
1354 return w;
1355}
1356
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001358listindex(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyListObject *self;
1360 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001361{
1362 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001363 PyObject *v;
1364
Guido van Rossumef93b872000-03-13 15:41:59 +00001365 if (!PyArg_ParseTuple_Compat1(args, "O:index", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001366 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001367 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001368 if (PyObject_Compare(self->ob_item[i], v) == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001369 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001370 if (PyErr_Occurred())
1371 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001372 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001373 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001374 return NULL;
1375}
1376
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377static PyObject *
Guido van Rossume6f7d181991-10-20 20:20:40 +00001378listcount(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 PyListObject *self;
1380 PyObject *args;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001381{
1382 int count = 0;
1383 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001384 PyObject *v;
1385
Guido van Rossumef93b872000-03-13 15:41:59 +00001386 if (!PyArg_ParseTuple_Compat1(args, "O:count", &v))
Guido van Rossume6f7d181991-10-20 20:20:40 +00001387 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001388 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001389 if (PyObject_Compare(self->ob_item[i], v) == 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001390 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001391 if (PyErr_Occurred())
1392 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001393 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001394 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001395}
1396
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001397static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001398listremove(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001399 PyListObject *self;
1400 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001401{
1402 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001403 PyObject *v;
1404
Guido van Rossumef93b872000-03-13 15:41:59 +00001405 if (!PyArg_ParseTuple_Compat1(args, "O:remove", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001406 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001407 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001408 if (PyObject_Compare(self->ob_item[i], v) == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001409 if (list_ass_slice(self, i, i+1,
1410 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001411 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001412 Py_INCREF(Py_None);
1413 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001414 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001415 if (PyErr_Occurred())
1416 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001417 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001418 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001419 return NULL;
1420}
1421
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001422static char append_doc[] =
1423"L.append(object) -- append object to end";
Barry Warsawdedf6d61998-10-09 16:37:25 +00001424static char extend_doc[] =
1425"L.extend(list) -- extend list by appending list elements";
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001426static char insert_doc[] =
1427"L.insert(index, object) -- insert object before index";
1428static char pop_doc[] =
1429"L.pop([index]) -> item -- remove and return item at index (default last)";
1430static char remove_doc[] =
1431"L.remove(value) -- remove first occurrence of value";
1432static char index_doc[] =
1433"L.index(value) -> integer -- return index of first occurrence of value";
1434static char count_doc[] =
1435"L.count(value) -> integer -- return number of occurrences of value";
1436static char reverse_doc[] =
1437"L.reverse() -- reverse *IN PLACE*";
1438static char sort_doc[] =
1439"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1";
1440
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001441static PyMethodDef list_methods[] = {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001442 {"append", (PyCFunction)listappend, 1, append_doc},
1443 {"insert", (PyCFunction)listinsert, 1, insert_doc},
Barry Warsawdedf6d61998-10-09 16:37:25 +00001444 {"extend", (PyCFunction)listextend, 1, extend_doc},
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001445 {"pop", (PyCFunction)listpop, 1, pop_doc},
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001446 {"remove", (PyCFunction)listremove, 1, remove_doc},
1447 {"index", (PyCFunction)listindex, 1, index_doc},
1448 {"count", (PyCFunction)listcount, 1, count_doc},
1449 {"reverse", (PyCFunction)listreverse, 1, reverse_doc},
1450 {"sort", (PyCFunction)listsort, 1, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001451 {NULL, NULL} /* sentinel */
1452};
1453
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001454static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001455list_getattr(f, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456 PyListObject *f;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001457 char *name;
1458{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001459 return Py_FindMethod(list_methods, (PyObject *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001460}
1461
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001462static PySequenceMethods list_as_sequence = {
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001463 (inquiry)list_length, /*sq_length*/
1464 (binaryfunc)list_concat, /*sq_concat*/
1465 (intargfunc)list_repeat, /*sq_repeat*/
1466 (intargfunc)list_item, /*sq_item*/
1467 (intintargfunc)list_slice, /*sq_slice*/
1468 (intobjargproc)list_ass_item, /*sq_ass_item*/
1469 (intintobjargproc)list_ass_slice, /*sq_ass_slice*/
Jeremy Hylton37b1a262000-04-27 21:41:03 +00001470 (objobjproc)list_contains, /*sq_contains*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001471};
1472
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001473PyTypeObject PyList_Type = {
1474 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001475 0,
1476 "list",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001477 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001478 0,
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001479 (destructor)list_dealloc, /*tp_dealloc*/
1480 (printfunc)list_print, /*tp_print*/
1481 (getattrfunc)list_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001482 0, /*tp_setattr*/
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001483 (cmpfunc)list_compare, /*tp_compare*/
1484 (reprfunc)list_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001485 0, /*tp_as_number*/
1486 &list_as_sequence, /*tp_as_sequence*/
1487 0, /*tp_as_mapping*/
1488};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001489
1490
1491/* During a sort, we really can't have anyone modifying the list; it could
1492 cause core dumps. Thus, we substitute a dummy type that raises an
1493 explanatory exception when a modifying operation is used. Caveat:
1494 comparisons may behave differently; but I guess it's a bad idea anyway to
1495 compare a list that's being sorted... */
1496
1497static PyObject *
1498immutable_list_op(/*No args!*/)
1499{
1500 PyErr_SetString(PyExc_TypeError,
1501 "a list cannot be modified while it is being sorted");
1502 return NULL;
1503}
1504
1505static PyMethodDef immutable_list_methods[] = {
1506 {"append", (PyCFunction)immutable_list_op},
1507 {"insert", (PyCFunction)immutable_list_op},
1508 {"remove", (PyCFunction)immutable_list_op},
1509 {"index", (PyCFunction)listindex},
1510 {"count", (PyCFunction)listcount},
1511 {"reverse", (PyCFunction)immutable_list_op},
1512 {"sort", (PyCFunction)immutable_list_op},
1513 {NULL, NULL} /* sentinel */
1514};
1515
1516static PyObject *
1517immutable_list_getattr(f, name)
1518 PyListObject *f;
1519 char *name;
1520{
1521 return Py_FindMethod(immutable_list_methods, (PyObject *)f, name);
1522}
1523
1524static int
1525immutable_list_ass(/*No args!*/)
1526{
1527 immutable_list_op();
1528 return -1;
1529}
1530
1531static PySequenceMethods immutable_list_as_sequence = {
1532 (inquiry)list_length, /*sq_length*/
1533 (binaryfunc)list_concat, /*sq_concat*/
1534 (intargfunc)list_repeat, /*sq_repeat*/
1535 (intargfunc)list_item, /*sq_item*/
1536 (intintargfunc)list_slice, /*sq_slice*/
1537 (intobjargproc)immutable_list_ass, /*sq_ass_item*/
1538 (intintobjargproc)immutable_list_ass, /*sq_ass_slice*/
1539};
1540
1541static PyTypeObject immutable_list_type = {
1542 PyObject_HEAD_INIT(&PyType_Type)
1543 0,
1544 "list (immutable, during sort)",
1545 sizeof(PyListObject),
1546 0,
1547 0, /*tp_dealloc*/ /* Cannot happen */
1548 (printfunc)list_print, /*tp_print*/
1549 (getattrfunc)immutable_list_getattr, /*tp_getattr*/
1550 0, /*tp_setattr*/
1551 0, /*tp_compare*/ /* Won't be called */
1552 (reprfunc)list_repr, /*tp_repr*/
1553 0, /*tp_as_number*/
1554 &immutable_list_as_sequence, /*tp_as_sequence*/
1555 0, /*tp_as_mapping*/
1556};
Guido van Rossum42812581998-06-17 14:15:44 +00001557