blob: 673028f31bb18b7522b5a2c74538ec4f44c977cd [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 Rossumbffd6832000-01-20 22:32:56 +000091 _Py_NewReference((PyObject *)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000092 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;
Guido van Rossumd724b232000-03-13 16:01:29 +0000218 Py_TRASHCAN_SAFE_BEGIN(op)
Jack Jansen7874d1f1995-01-19 12:09:27 +0000219 if (op->ob_item != NULL) {
Guido van Rossumfa717011999-06-09 15:19:34 +0000220 /* Do it backwards, for Christian Tismer.
221 There's a simple test case where somehow this reduces
222 thrashing when a *very* large list is created and
223 immediately deleted. */
224 i = op->ob_size;
225 while (--i >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000226 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000227 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228 free((ANY *)op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000229 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 free((ANY *)op);
Guido van Rossumd724b232000-03-13 16:01:29 +0000231 Py_TRASHCAN_SAFE_END(op)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000232}
233
Guido van Rossum90933611991-06-07 16:10:43 +0000234static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000235list_print(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000236 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000237 FILE *fp;
238 int flags;
239{
240 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000241
242 i = Py_ReprEnter((PyObject*)op);
243 if (i != 0) {
244 if (i < 0)
245 return i;
246 fprintf(fp, "[...]");
247 return 0;
248 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000249 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000250 for (i = 0; i < op->ob_size; i++) {
251 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000252 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000253 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
254 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000255 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000256 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257 }
258 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000259 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000260 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261}
262
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000263static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000264list_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000265 PyListObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000266{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000267 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000268 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000269
270 i = Py_ReprEnter((PyObject*)v);
271 if (i != 0) {
272 if (i > 0)
273 return PyString_FromString("[...]");
274 return NULL;
275 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 s = PyString_FromString("[");
277 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000278 for (i = 0; i < v->ob_size && s != NULL; i++) {
279 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000280 PyString_Concat(&s, comma);
281 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000282 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000283 Py_XDECREF(comma);
284 PyString_ConcatAndDel(&s, PyString_FromString("]"));
Guido van Rossumfb376de1998-04-10 22:47:27 +0000285 Py_ReprLeave((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000286 return s;
287}
288
289static int
290list_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000291 PyListObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000292{
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000293 int i;
Guido van Rossumae621ff1998-05-28 20:18:46 +0000294 for (i = 0; i < v->ob_size && i < w->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000295 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000296 if (cmp != 0)
297 return cmp;
298 }
299 return v->ob_size - w->ob_size;
300}
301
302static int
303list_length(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000304 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000305{
306 return a->ob_size;
307}
308
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000309static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000310list_item(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000311 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000312 int i;
313{
314 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000315 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000316 indexerr = PyString_FromString(
317 "list index out of range");
318 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000319 return NULL;
320 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 return a->ob_item[i];
323}
324
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000325static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000326list_slice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000327 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000328 int ilow, ihigh;
329{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000330 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000331 int i;
332 if (ilow < 0)
333 ilow = 0;
334 else if (ilow > a->ob_size)
335 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000336 if (ihigh < ilow)
337 ihigh = ilow;
338 else if (ihigh > a->ob_size)
339 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000341 if (np == NULL)
342 return NULL;
343 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 PyObject *v = a->ob_item[i];
345 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000346 np->ob_item[i - ilow] = v;
347 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000348 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000349}
350
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000351PyObject *
352PyList_GetSlice(a, ilow, ihigh)
353 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000354 int ilow, ihigh;
355{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 if (!PyList_Check(a)) {
357 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000358 return NULL;
359 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000360 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000361}
362
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000363static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000364list_concat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000365 PyListObject *a;
366 PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000367{
368 int size;
369 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000370 PyListObject *np;
371 if (!PyList_Check(bb)) {
372 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000373 return NULL;
374 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000375#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000377 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000378 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000379 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380 }
381 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000382 PyObject *v = a->ob_item[i];
383 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000384 np->ob_item[i] = v;
385 }
386 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 PyObject *v = b->ob_item[i];
388 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000389 np->ob_item[i + a->ob_size] = v;
390 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000392#undef b
393}
394
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000395static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000396list_repeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000397 PyListObject *a;
Guido van Rossumed98d481991-03-06 13:07:53 +0000398 int n;
399{
400 int i, j;
401 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000402 PyListObject *np;
403 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000404 if (n < 0)
405 n = 0;
406 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000407 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000408 if (np == NULL)
409 return NULL;
410 p = np->ob_item;
411 for (i = 0; i < n; i++) {
412 for (j = 0; j < a->ob_size; j++) {
413 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000415 p++;
416 }
417 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000418 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000419}
420
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000421static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422list_ass_slice(a, ilow, ihigh, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000423 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000424 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000425 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000426{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000427 /* Because [X]DECREF can recursively invoke list operations on
428 this list, we must postpone all [X]DECREF activity until
429 after the list is back in its canonical shape. Therefore
430 we must allocate an additional array, 'recycle', into which
431 we temporarily copy the items that are deleted from the
432 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000433 PyObject **recycle, **p;
434 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435 int n; /* Size of replacement list */
436 int d; /* Change in size */
437 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000438#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000439 if (v == NULL)
440 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000441 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000442 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000443 if (a == b) {
444 /* Special case "a[i:j] = a" -- copy b first */
445 int ret;
446 v = list_slice(b, 0, n);
447 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000448 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000449 return ret;
450 }
451 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000452 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000453 PyErr_BadArgument();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000454 return -1;
455 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000456 if (ilow < 0)
457 ilow = 0;
458 else if (ilow > a->ob_size)
459 ilow = a->ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000460 if (ihigh < ilow)
461 ihigh = ilow;
462 else if (ihigh > a->ob_size)
463 ihigh = a->ob_size;
464 item = a->ob_item;
465 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000466 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000467 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000468 else
469 p = recycle = NULL;
470 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000472 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000473 if (d < 0) {
474 for (/*k = ihigh*/; k < a->ob_size; k++)
475 item[k+d] = item[k];
476 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000477 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000478 a->ob_item = item;
479 }
480 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000481 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000483 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000484 PyMem_XDEL(recycle);
485 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000486 return -1;
487 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000488 for (k = a->ob_size; --k >= ihigh; )
489 item[k+d] = item[k];
490 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000491 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000492 a->ob_item = item;
493 a->ob_size += d;
494 }
495 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000496 PyObject *w = b->ob_item[k];
497 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000498 item[ilow] = w;
499 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000500 if (recycle) {
501 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000502 Py_XDECREF(*p);
503 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000504 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000505 return 0;
506#undef b
507}
508
Guido van Rossum234f9421993-06-17 12:35:49 +0000509int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000510PyList_SetSlice(a, ilow, ihigh, v)
511 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000512 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 PyObject *v;
Guido van Rossum234f9421993-06-17 12:35:49 +0000514{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000515 if (!PyList_Check(a)) {
516 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000517 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000518 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000519 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000520}
521
Guido van Rossum4a450d01991-04-03 19:05:18 +0000522static int
523list_ass_item(a, i, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 PyListObject *a;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000525 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 PyObject *v;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000527{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000529 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000530 PyErr_SetString(PyExc_IndexError,
531 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000532 return -1;
533 }
534 if (v == NULL)
535 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000536 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000537 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000538 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000539 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000540 return 0;
541}
542
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544ins(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000546 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000547 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000548{
549 if (ins1(self, where, v) != 0)
550 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000551 Py_INCREF(Py_None);
552 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000553}
554
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000556listinsert(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000557 PyListObject *self;
558 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000559{
560 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000561 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000562 if (!PyArg_ParseTuple(args, "iO:insert", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000564 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000565}
566
Guido van Rossumef93b872000-03-13 15:41:59 +0000567/* Define NO_STRICT_LIST_APPEND to enable multi-argument append() */
568
569#ifndef NO_STRICT_LIST_APPEND
570#define PyArg_ParseTuple_Compat1 PyArg_ParseTuple
571#else
572#define PyArg_ParseTuple_Compat1(args, format, ret) \
573( \
574 PyTuple_GET_SIZE(args) > 1 ? (*ret = args, 1) : \
575 PyTuple_GET_SIZE(args) == 1 ? (*ret = PyTuple_GET_ITEM(args, 0), 1) : \
576 PyArg_ParseTuple(args, format, ret) \
577)
578#endif
579
580
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000581static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000582listappend(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000583 PyListObject *self;
584 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000585{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000586 PyObject *v;
Guido van Rossumef93b872000-03-13 15:41:59 +0000587 if (!PyArg_ParseTuple_Compat1(args, "O:append", &v))
Guido van Rossumbf80e541993-02-08 15:49:17 +0000588 return NULL;
589 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000590}
591
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000592static PyObject *
Barry Warsawdedf6d61998-10-09 16:37:25 +0000593listextend(self, args)
594 PyListObject *self;
595 PyObject *args;
596{
597 PyObject *b = NULL, *res = NULL;
598 PyObject **items;
599 int selflen = PyList_GET_SIZE(self);
600 int blen;
601 register int i;
602
Guido van Rossumc00a9382000-02-24 21:48:29 +0000603 if (!PyArg_ParseTuple(args, "O:extend", &b))
Barry Warsawdedf6d61998-10-09 16:37:25 +0000604 return NULL;
605
606 if (!PyList_Check(b)) {
607 PyErr_SetString(PyExc_TypeError,
608 "list.extend() argument must be a list");
609 return NULL;
610 }
611 if (PyList_GET_SIZE(b) == 0) {
612 /* short circuit when b is empty */
613 Py_INCREF(Py_None);
614 return Py_None;
615 }
616 if (self == (PyListObject*)b) {
617 /* as in list_ass_slice() we must special case the
618 * situation: a.extend(a)
619 *
620 * XXX: I think this way ought to be faster than using
621 * list_slice() the way list_ass_slice() does.
622 */
623 b = PyList_New(selflen);
624 if (!b)
625 return NULL;
626 for (i = 0; i < selflen; i++) {
627 PyObject *o = PyList_GET_ITEM(self, i);
628 Py_INCREF(o);
629 PyList_SET_ITEM(b, i, o);
630 }
631 }
632 else
633 /* we want b to have the same refcount semantics for the
634 * Py_XDECREF() in the finally clause regardless of which
635 * branch in the above conditional we took.
636 */
637 Py_INCREF(b);
638
639 blen = PyList_GET_SIZE(b);
640 /* resize a using idiom */
641 items = self->ob_item;
642 NRESIZE(items, PyObject*, selflen + blen);
643 if (items == NULL ) {
644 PyErr_NoMemory();
645 goto finally;
646 }
647 self->ob_item = items;
648
649 /* populate the end self with b's items */
650 for (i = 0; i < blen; i++) {
651 PyObject *o = PyList_GET_ITEM(b, i);
652 Py_INCREF(o);
653 PyList_SET_ITEM(self, self->ob_size++, o);
654 }
655 res = Py_None;
656 Py_INCREF(res);
657 finally:
658 Py_XDECREF(b);
659 return res;
660}
661
662
663static PyObject *
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000664listpop(self, args)
665 PyListObject *self;
666 PyObject *args;
667{
668 int i = -1;
669 PyObject *v;
Guido van Rossumc00a9382000-02-24 21:48:29 +0000670 if (!PyArg_ParseTuple(args, "|i:pop", &i))
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +0000671 return NULL;
672 if (self->ob_size == 0) {
673 /* Special-case most common failure cause */
674 PyErr_SetString(PyExc_IndexError, "pop from empty list");
675 return NULL;
676 }
677 if (i < 0)
678 i += self->ob_size;
679 if (i < 0 || i >= self->ob_size) {
680 PyErr_SetString(PyExc_IndexError, "pop index out of range");
681 return NULL;
682 }
683 v = self->ob_item[i];
684 Py_INCREF(v);
685 if (list_ass_slice(self, i, i+1, (PyObject *)NULL) != 0) {
686 Py_DECREF(v);
687 return NULL;
688 }
689 return v;
690}
691
Guido van Rossum3f236de1996-12-10 23:55:39 +0000692/* New quicksort implementation for arrays of object pointers.
693 Thanks to discussions with Tim Peters. */
694
695/* CMPERROR is returned by our comparison function when an error
696 occurred. This is the largest negative integer (0x80000000 on a
697 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000698#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000699
700/* Comparison function. Takes care of calling a user-supplied
701 comparison function (any callable Python object). Calls the
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000702 standard comparison function, PyObject_Compare(), if the user-
703 supplied function is NULL. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000704
705static int
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000706docompare(x, y, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000707 PyObject *x;
708 PyObject *y;
709 PyObject *compare;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000710{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000711 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000712 int i;
713
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000714 if (compare == NULL) {
715 i = PyObject_Compare(x, y);
716 if (i && PyErr_Occurred())
717 i = CMPERROR;
718 return i;
719 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000720
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000721 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000722 if (args == NULL)
723 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000724 res = PyEval_CallObject(compare, args);
725 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000726 if (res == NULL)
727 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000728 if (!PyInt_Check(res)) {
729 Py_DECREF(res);
730 PyErr_SetString(PyExc_TypeError,
Guido van Rossum9bcd1d71999-04-19 17:44:39 +0000731 "comparison function must return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000732 return CMPERROR;
733 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000734 i = PyInt_AsLong(res);
735 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000736 if (i < 0)
737 return -1;
738 if (i > 0)
739 return 1;
740 return 0;
741}
742
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000743/* MINSIZE is the smallest array that will get a full-blown samplesort
744 treatment; smaller arrays are sorted using binary insertion. It must
745 be at least 7 for the samplesort implementation to work. Binary
746 insertion does fewer compares, but can suffer O(N**2) data movement.
747 The more expensive compares, the larger MINSIZE should be. */
748#define MINSIZE 100
749
750/* MINPARTITIONSIZE is the smallest array slice samplesort will bother to
751 partition; smaller slices are passed to binarysort. It must be at
752 least 2, and no larger than MINSIZE. Setting it higher reduces the #
753 of compares slowly, but increases the amount of data movement quickly.
754 The value here was chosen assuming a compare costs ~25x more than
755 swapping a pair of memory-resident pointers -- but under that assumption,
756 changing the value by a few dozen more or less has aggregate effect
757 under 1%. So the value is crucial, but not touchy <wink>. */
758#define MINPARTITIONSIZE 40
759
760/* MAXMERGE is the largest number of elements we'll always merge into
761 a known-to-be sorted chunk via binary insertion, regardless of the
762 size of that chunk. Given a chunk of N sorted elements, and a group
763 of K unknowns, the largest K for which it's better to do insertion
764 (than a full-blown sort) is a complicated function of N and K mostly
765 involving the expected number of compares and data moves under each
766 approach, and the relative cost of those operations on a specific
767 architecure. The fixed value here is conservative, and should be a
768 clear win regardless of architecture or N. */
769#define MAXMERGE 15
Guido van Rossum3f236de1996-12-10 23:55:39 +0000770
Guido van Rossum3f236de1996-12-10 23:55:39 +0000771/* STACKSIZE is the size of our work stack. A rough estimate is that
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000772 this allows us to sort arrays of size N where
773 N / ln(N) = MINPARTITIONSIZE * 2**STACKSIZE, so 60 is more than enough
774 for arrays of size 2**64. Because we push the biggest partition
775 first, the worst case occurs when all subarrays are always partitioned
776 exactly in two. */
777#define STACKSIZE 60
Guido van Rossum3f236de1996-12-10 23:55:39 +0000778
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000779
780#define SETK(X,Y) if ((k = docompare(X,Y,compare))==CMPERROR) goto fail
781
782/* binarysort is the best method for sorting small arrays: it does
783 few compares, but can do data movement quadratic in the number of
784 elements.
Guido van Rossum42812581998-06-17 14:15:44 +0000785 [lo, hi) is a contiguous slice of a list, and is sorted via
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000786 binary insertion.
787 On entry, must have lo <= start <= hi, and that [lo, start) is already
788 sorted (pass start == lo if you don't know!).
789 If docompare complains (returns CMPERROR) return -1, else 0.
790 Even in case of error, the output slice will be some permutation of
791 the input (nothing is lost or duplicated).
792*/
Guido van Rossum3f236de1996-12-10 23:55:39 +0000793
794static int
Guido van Rossum42812581998-06-17 14:15:44 +0000795binarysort(lo, hi, start, compare)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000796 PyObject **lo;
797 PyObject **hi;
798 PyObject **start;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000799 PyObject *compare;/* Comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000800{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000801 /* assert lo <= start <= hi
802 assert [lo, start) is sorted */
803 register int k;
804 register PyObject **l, **p, **r;
805 register PyObject *pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000806
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000807 if (lo == start)
808 ++start;
809 for (; start < hi; ++start) {
810 /* set l to where *start belongs */
811 l = lo;
812 r = start;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000813 pivot = *r;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000814 do {
815 p = l + ((r - l) >> 1);
816 SETK(pivot, *p);
817 if (k < 0)
818 r = p;
819 else
820 l = p + 1;
821 } while (l < r);
822 /* Pivot should go at l -- slide over to make room.
823 Caution: using memmove is much slower under MSVC 5;
824 we're not usually moving many slots. */
825 for (p = start; p > l; --p)
826 *p = *(p-1);
827 *l = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000828 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000829 return 0;
Guido van Rossuma119c0d1998-05-29 17:56:32 +0000830
831 fail:
832 return -1;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000833}
834
835/* samplesortslice is the sorting workhorse.
Guido van Rossum42812581998-06-17 14:15:44 +0000836 [lo, hi) is a contiguous slice of a list, to be sorted in place.
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000837 On entry, must have lo <= hi,
838 If docompare complains (returns CMPERROR) return -1, else 0.
839 Even in case of error, the output slice will be some permutation of
840 the input (nothing is lost or duplicated).
841
842 samplesort is basically quicksort on steroids: a power of 2 close
843 to n/ln(n) is computed, and that many elements (less 1) are picked at
844 random from the array and sorted. These 2**k - 1 elements are then
845 used as preselected pivots for an equal number of quicksort
846 partitioning steps, partitioning the slice into 2**k chunks each of
847 size about ln(n). These small final chunks are then usually handled
848 by binarysort. Note that when k=1, this is roughly the same as an
849 ordinary quicksort using a random pivot, and when k=2 this is roughly
850 a median-of-3 quicksort. From that view, using k ~= lg(n/ln(n)) makes
851 this a "median of n/ln(n)" quicksort. You can also view it as a kind
852 of bucket sort, where 2**k-1 bucket boundaries are picked dynamically.
853
854 The large number of samples makes a quadratic-time case almost
855 impossible, and asymptotically drives the average-case number of
856 compares from quicksort's 2 N ln N (or 12/7 N ln N for the median-of-
857 3 variant) down to N lg N.
858
859 We also play lots of low-level tricks to cut the number of compares.
860
861 Very obscure: To avoid using extra memory, the PPs are stored in the
862 array and shuffled around as partitioning proceeds. At the start of a
863 partitioning step, we'll have 2**m-1 (for some m) PPs in sorted order,
864 adjacent (either on the left or the right!) to a chunk of X elements
865 that are to be partitioned: P X or X P. In either case we need to
866 shuffle things *in place* so that the 2**(m-1) smaller PPs are on the
867 left, followed by the PP to be used for this step (that's the middle
868 of the PPs), followed by X, followed by the 2**(m-1) larger PPs:
869 P X or X P -> Psmall pivot X Plarge
870 and the order of the PPs must not be altered. It can take a while
871 to realize this isn't trivial! It can take even longer <wink> to
872 understand why the simple code below works, using only 2**(m-1) swaps.
873 The key is that the order of the X elements isn't necessarily
874 preserved: X can end up as some cyclic permutation of its original
875 order. That's OK, because X is unsorted anyway. If the order of X
876 had to be preserved too, the simplest method I know of using O(1)
877 scratch storage requires len(X) + 2**(m-1) swaps, spread over 2 passes.
878 Since len(X) is typically several times larger than 2**(m-1), that
879 would slow things down.
880*/
881
882struct SamplesortStackNode {
883 /* Represents a slice of the array, from (& including) lo up
884 to (but excluding) hi. "extra" additional & adjacent elements
885 are pre-selected pivots (PPs), spanning [lo-extra, lo) if
886 extra > 0, or [hi, hi-extra) if extra < 0. The PPs are
887 already sorted, but nothing is known about the other elements
888 in [lo, hi). |extra| is always one less than a power of 2.
889 When extra is 0, we're out of PPs, and the slice must be
890 sorted by some other means. */
891 PyObject **lo;
892 PyObject **hi;
893 int extra;
894};
895
896/* 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 +0000897 N / ln(N) as possible. So k ~= lg(N / ln(N)). Calling libm routines
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000898 is undesirable, so cutoff values are canned in the "cutoff" table
899 below: cutoff[i] is the smallest N such that k == CUTOFFBASE + i. */
900#define CUTOFFBASE 4
Guido van Rossum3aa23fd1999-01-14 19:01:53 +0000901static long cutoff[] = {
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000902 43, /* smallest N such that k == 4 */
903 106, /* etc */
904 250,
905 576,
906 1298,
907 2885,
908 6339,
909 13805,
910 29843,
911 64116,
912 137030,
913 291554,
914 617916,
915 1305130,
916 2748295,
917 5771662,
918 12091672,
919 25276798,
920 52734615,
921 109820537,
922 228324027,
923 473977813,
924 982548444, /* smallest N such that k == 26 */
925 2034159050 /* largest N that fits in signed 32-bit; k == 27 */
926};
927
928static int
Guido van Rossum42812581998-06-17 14:15:44 +0000929samplesortslice(lo, hi, compare)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000930 PyObject **lo;
931 PyObject **hi;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000932 PyObject *compare;/* Comparison function object, or NULL for default */
933{
934 register PyObject **l, **r;
935 register PyObject *tmp, *pivot;
936 register int k;
937 int n, extra, top, extraOnRight;
938 struct SamplesortStackNode stack[STACKSIZE];
939
940 /* assert lo <= hi */
941 n = hi - lo;
942
943 /* ----------------------------------------------------------
944 * Special cases
945 * --------------------------------------------------------*/
946 if (n < 2)
947 return 0;
948
949 /* Set r to the largest value such that [lo,r) is sorted.
950 This catches the already-sorted case, the all-the-same
951 case, and the appended-a-few-elements-to-a-sorted-list case.
952 If the array is unsorted, we're very likely to get out of
953 the loop fast, so the test is cheap if it doesn't pay off.
954 */
955 /* assert lo < hi */
956 for (r = lo+1; r < hi; ++r) {
957 SETK(*r, *(r-1));
958 if (k < 0)
959 break;
960 }
961 /* [lo,r) is sorted, [r,hi) unknown. Get out cheap if there are
962 few unknowns, or few elements in total. */
963 if (hi - r <= MAXMERGE || n < MINSIZE)
Guido van Rossum42812581998-06-17 14:15:44 +0000964 return binarysort(lo, hi, r, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000965
966 /* Check for the array already being reverse-sorted. Typical
967 benchmark-driven silliness <wink>. */
968 /* assert lo < hi */
969 for (r = lo+1; r < hi; ++r) {
970 SETK(*(r-1), *r);
971 if (k < 0)
972 break;
973 }
974 if (hi - r <= MAXMERGE) {
975 /* Reverse the reversed prefix, then insert the tail */
976 PyObject **originalr = r;
977 l = lo;
978 do {
979 --r;
980 tmp = *l; *l = *r; *r = tmp;
981 ++l;
982 } while (l < r);
Guido van Rossum42812581998-06-17 14:15:44 +0000983 return binarysort(lo, hi, originalr, compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +0000984 }
985
986 /* ----------------------------------------------------------
987 * Normal case setup: a large array without obvious pattern.
988 * --------------------------------------------------------*/
989
990 /* extra := a power of 2 ~= n/ln(n), less 1.
991 First find the smallest extra s.t. n < cutoff[extra] */
992 for (extra = 0;
993 extra < sizeof(cutoff) / sizeof(cutoff[0]);
994 ++extra) {
995 if (n < cutoff[extra])
996 break;
997 /* note that if we fall out of the loop, the value of
998 extra still makes *sense*, but may be smaller than
999 we would like (but the array has more than ~= 2**31
1000 elements in this case!) */
1001 }
1002 /* Now k == extra - 1 + CUTOFFBASE. The smallest value k can
1003 have is CUTOFFBASE-1, so
1004 assert MINSIZE >= 2**(CUTOFFBASE-1) - 1 */
1005 extra = (1 << (extra - 1 + CUTOFFBASE)) - 1;
1006 /* assert extra > 0 and n >= extra */
1007
1008 /* Swap that many values to the start of the array. The
1009 selection of elements is pseudo-random, but the same on
1010 every run (this is intentional! timing algorithm changes is
1011 a pain if timing varies across runs). */
1012 {
1013 unsigned int seed = n / extra; /* arbitrary */
1014 unsigned int i;
1015 for (i = 0; i < (unsigned)extra; ++i) {
1016 /* j := random int in [i, n) */
1017 unsigned int j;
1018 seed = seed * 69069 + 7;
1019 j = i + seed % (n - i);
1020 tmp = lo[i]; lo[i] = lo[j]; lo[j] = tmp;
1021 }
1022 }
1023
1024 /* Recursively sort the preselected pivots. */
Guido van Rossum42812581998-06-17 14:15:44 +00001025 if (samplesortslice(lo, lo + extra, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001026 goto fail;
1027
1028 top = 0; /* index of available stack slot */
1029 lo += extra; /* point to first unknown */
1030 extraOnRight = 0; /* the PPs are at the left end */
1031
1032 /* ----------------------------------------------------------
1033 * Partition [lo, hi), and repeat until out of work.
1034 * --------------------------------------------------------*/
1035 for (;;) {
1036 /* assert lo <= hi, so n >= 0 */
1037 n = hi - lo;
1038
1039 /* We may not want, or may not be able, to partition:
1040 If n is small, it's quicker to insert.
1041 If extra is 0, we're out of pivots, and *must* use
1042 another method.
1043 */
1044 if (n < MINPARTITIONSIZE || extra == 0) {
1045 if (n >= MINSIZE) {
1046 /* assert extra == 0
1047 This is rare, since the average size
1048 of a final block is only about
1049 ln(original n). */
Guido van Rossum42812581998-06-17 14:15:44 +00001050 if (samplesortslice(lo, hi, compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001051 goto fail;
1052 }
1053 else {
1054 /* Binary insertion should be quicker,
1055 and we can take advantage of the PPs
1056 already being sorted. */
1057 if (extraOnRight && extra) {
1058 /* swap the PPs to the left end */
1059 k = extra;
1060 do {
1061 tmp = *lo;
1062 *lo = *hi;
1063 *hi = tmp;
1064 ++lo; ++hi;
1065 } while (--k);
1066 }
1067 if (binarysort(lo - extra, hi, lo,
Guido van Rossum42812581998-06-17 14:15:44 +00001068 compare) < 0)
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001069 goto fail;
1070 }
1071
1072 /* Find another slice to work on. */
1073 if (--top < 0)
1074 break; /* no more -- done! */
1075 lo = stack[top].lo;
1076 hi = stack[top].hi;
1077 extra = stack[top].extra;
1078 extraOnRight = 0;
1079 if (extra < 0) {
1080 extraOnRight = 1;
1081 extra = -extra;
1082 }
1083 continue;
1084 }
1085
1086 /* Pretend the PPs are indexed 0, 1, ..., extra-1.
1087 Then our preselected pivot is at (extra-1)/2, and we
1088 want to move the PPs before that to the left end of
1089 the slice, and the PPs after that to the right end.
1090 The following section changes extra, lo, hi, and the
1091 slice such that:
1092 [lo-extra, lo) contains the smaller PPs.
1093 *lo == our PP.
1094 (lo, hi) contains the unknown elements.
1095 [hi, hi+extra) contains the larger PPs.
1096 */
1097 k = extra >>= 1; /* num PPs to move */
1098 if (extraOnRight) {
1099 /* Swap the smaller PPs to the left end.
1100 Note that this loop actually moves k+1 items:
1101 the last is our PP */
1102 do {
1103 tmp = *lo; *lo = *hi; *hi = tmp;
1104 ++lo; ++hi;
1105 } while (k--);
1106 }
1107 else {
1108 /* Swap the larger PPs to the right end. */
1109 while (k--) {
1110 --lo; --hi;
1111 tmp = *lo; *lo = *hi; *hi = tmp;
1112 }
1113 }
1114 --lo; /* *lo is now our PP */
1115 pivot = *lo;
1116
1117 /* Now an almost-ordinary quicksort partition step.
1118 Note that most of the time is spent here!
1119 Only odd thing is that we partition into < and >=,
1120 instead of the usual <= and >=. This helps when
1121 there are lots of duplicates of different values,
1122 because it eventually tends to make subfiles
1123 "pure" (all duplicates), and we special-case for
1124 duplicates later. */
1125 l = lo + 1;
1126 r = hi - 1;
1127 /* assert lo < l < r < hi (small n weeded out above) */
1128
1129 do {
1130 /* slide l right, looking for key >= pivot */
1131 do {
1132 SETK(*l, pivot);
1133 if (k < 0)
1134 ++l;
1135 else
1136 break;
1137 } while (l < r);
1138
1139 /* slide r left, looking for key < pivot */
1140 while (l < r) {
Guido van Rossum42812581998-06-17 14:15:44 +00001141 register PyObject *rval = *r--;
1142 SETK(rval, pivot);
1143 if (k < 0) {
1144 /* swap and advance */
1145 r[1] = *l;
1146 *l++ = rval;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001147 break;
Guido van Rossum42812581998-06-17 14:15:44 +00001148 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001149 }
1150
1151 } while (l < r);
1152
1153 /* assert lo < r <= l < hi
1154 assert r == l or r+1 == l
1155 everything to the left of l is < pivot, and
1156 everything to the right of r is >= pivot */
1157
1158 if (l == r) {
1159 SETK(*r, pivot);
1160 if (k < 0)
1161 ++l;
1162 else
1163 --r;
1164 }
1165 /* assert lo <= r and r+1 == l and l <= hi
1166 assert r == lo or a[r] < pivot
1167 assert a[lo] is pivot
1168 assert l == hi or a[l] >= pivot
1169 Swap the pivot into "the middle", so we can henceforth
1170 ignore it.
1171 */
1172 *lo = *r;
1173 *r = pivot;
1174
1175 /* The following is true now, & will be preserved:
1176 All in [lo,r) are < pivot
1177 All in [r,l) == pivot (& so can be ignored)
1178 All in [l,hi) are >= pivot */
1179
1180 /* Check for duplicates of the pivot. One compare is
1181 wasted if there are no duplicates, but can win big
1182 when there are.
1183 Tricky: we're sticking to "<" compares, so deduce
1184 equality indirectly. We know pivot <= *l, so they're
1185 equal iff not pivot < *l.
1186 */
1187 while (l < hi) {
1188 /* pivot <= *l known */
1189 SETK(pivot, *l);
1190 if (k < 0)
1191 break;
1192 else
1193 /* <= and not < implies == */
1194 ++l;
1195 }
1196
1197 /* assert lo <= r < l <= hi
1198 Partitions are [lo, r) and [l, hi) */
1199
1200 /* push fattest first; remember we still have extra PPs
1201 to the left of the left chunk and to the right of
1202 the right chunk! */
1203 /* assert top < STACKSIZE */
1204 if (r - lo <= hi - l) {
1205 /* second is bigger */
1206 stack[top].lo = l;
1207 stack[top].hi = hi;
1208 stack[top].extra = -extra;
1209 hi = r;
1210 extraOnRight = 0;
1211 }
1212 else {
1213 /* first is bigger */
1214 stack[top].lo = lo;
1215 stack[top].hi = r;
1216 stack[top].extra = extra;
1217 lo = l;
1218 extraOnRight = 1;
1219 }
1220 ++top;
1221
1222 } /* end of partitioning loop */
1223
1224 return 0;
1225
1226 fail:
1227 return -1;
1228}
Guido van Rossuma119c0d1998-05-29 17:56:32 +00001229
1230#undef SETK
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001231
1232staticforward PyTypeObject immutable_list_type;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001233
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001234static PyObject *
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001235listsort(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001236 PyListObject *self;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001237 PyObject *args;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001238{
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001239 int err;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001240 PyObject *compare = NULL;
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001241
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001242 if (args != NULL) {
Guido van Rossumc00a9382000-02-24 21:48:29 +00001243 if (!PyArg_ParseTuple(args, "|O:sort", &compare))
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001244 return NULL;
1245 }
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001246 self->ob_type = &immutable_list_type;
1247 err = samplesortslice(self->ob_item,
1248 self->ob_item + self->ob_size,
Guido van Rossum42812581998-06-17 14:15:44 +00001249 compare);
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001250 self->ob_type = &PyList_Type;
1251 if (err < 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +00001252 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001253 Py_INCREF(Py_None);
1254 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +00001255}
1256
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001257int
1258PyList_Sort(v)
1259 PyObject *v;
1260{
1261 if (v == NULL || !PyList_Check(v)) {
1262 PyErr_BadInternalCall();
1263 return -1;
1264 }
1265 v = listsort((PyListObject *)v, (PyObject *)NULL);
1266 if (v == NULL)
1267 return -1;
1268 Py_DECREF(v);
1269 return 0;
1270}
1271
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001272static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001273listreverse(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001274 PyListObject *self;
1275 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001276{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001277 register PyObject **p, **q;
1278 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +00001279
Guido van Rossumc00a9382000-02-24 21:48:29 +00001280 if (!PyArg_ParseTuple(args, ":reverse"))
Guido van Rossumed98d481991-03-06 13:07:53 +00001281 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001282
1283 if (self->ob_size > 1) {
1284 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
1285 p < q; p++, q--) {
1286 tmp = *p;
1287 *p = *q;
1288 *q = tmp;
1289 }
1290 }
1291
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001292 Py_INCREF(Py_None);
1293 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001294}
1295
Guido van Rossum84c76f51990-10-30 13:32:20 +00001296int
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001297PyList_Reverse(v)
1298 PyObject *v;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001299{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001300 if (v == NULL || !PyList_Check(v)) {
1301 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001302 return -1;
1303 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001304 v = listreverse((PyListObject *)v, (PyObject *)NULL);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001305 if (v == NULL)
1306 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001307 Py_DECREF(v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +00001308 return 0;
1309}
1310
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001311PyObject *
1312PyList_AsTuple(v)
1313 PyObject *v;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001314{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001315 PyObject *w;
1316 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001317 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001318 if (v == NULL || !PyList_Check(v)) {
1319 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001320 return NULL;
1321 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001322 n = ((PyListObject *)v)->ob_size;
1323 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001324 if (w == NULL)
1325 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001326 p = ((PyTupleObject *)w)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001327 memcpy((ANY *)p,
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001328 (ANY *)((PyListObject *)v)->ob_item,
1329 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001330 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001331 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001332 p++;
1333 }
1334 return w;
1335}
1336
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001337static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001338listindex(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001339 PyListObject *self;
1340 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001341{
1342 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001343 PyObject *v;
1344
Guido van Rossumef93b872000-03-13 15:41:59 +00001345 if (!PyArg_ParseTuple_Compat1(args, "O:index", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001346 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001347 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001348 if (PyObject_Compare(self->ob_item[i], v) == 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001349 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001350 if (PyErr_Occurred())
1351 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001352 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001353 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001354 return NULL;
1355}
1356
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001357static PyObject *
Guido van Rossume6f7d181991-10-20 20:20:40 +00001358listcount(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001359 PyListObject *self;
1360 PyObject *args;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001361{
1362 int count = 0;
1363 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001364 PyObject *v;
1365
Guido van Rossumef93b872000-03-13 15:41:59 +00001366 if (!PyArg_ParseTuple_Compat1(args, "O:count", &v))
Guido van Rossume6f7d181991-10-20 20:20:40 +00001367 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001368 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001369 if (PyObject_Compare(self->ob_item[i], v) == 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001370 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001371 if (PyErr_Occurred())
1372 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001373 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001374 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001375}
1376
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001377static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001378listremove(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001379 PyListObject *self;
1380 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001381{
1382 int i;
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001383 PyObject *v;
1384
Guido van Rossumef93b872000-03-13 15:41:59 +00001385 if (!PyArg_ParseTuple_Compat1(args, "O:remove", &v))
Guido van Rossumed98d481991-03-06 13:07:53 +00001386 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001387 for (i = 0; i < self->ob_size; i++) {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001388 if (PyObject_Compare(self->ob_item[i], v) == 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001389 if (list_ass_slice(self, i, i+1,
1390 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001391 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001392 Py_INCREF(Py_None);
1393 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001394 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001395 if (PyErr_Occurred())
1396 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001397 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001398 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001399 return NULL;
1400}
1401
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001402static char append_doc[] =
1403"L.append(object) -- append object to end";
Barry Warsawdedf6d61998-10-09 16:37:25 +00001404static char extend_doc[] =
1405"L.extend(list) -- extend list by appending list elements";
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001406static char insert_doc[] =
1407"L.insert(index, object) -- insert object before index";
1408static char pop_doc[] =
1409"L.pop([index]) -> item -- remove and return item at index (default last)";
1410static char remove_doc[] =
1411"L.remove(value) -- remove first occurrence of value";
1412static char index_doc[] =
1413"L.index(value) -> integer -- return index of first occurrence of value";
1414static char count_doc[] =
1415"L.count(value) -> integer -- return number of occurrences of value";
1416static char reverse_doc[] =
1417"L.reverse() -- reverse *IN PLACE*";
1418static char sort_doc[] =
1419"L.sort([cmpfunc]) -- sort *IN PLACE*; if given, cmpfunc(x, y) -> -1, 0, 1";
1420
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001421static PyMethodDef list_methods[] = {
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001422 {"append", (PyCFunction)listappend, 1, append_doc},
1423 {"insert", (PyCFunction)listinsert, 1, insert_doc},
Barry Warsawdedf6d61998-10-09 16:37:25 +00001424 {"extend", (PyCFunction)listextend, 1, extend_doc},
Guido van Rossum3dd7f3f1998-06-30 15:36:32 +00001425 {"pop", (PyCFunction)listpop, 1, pop_doc},
Guido van Rossum4aa24f92000-02-24 15:23:03 +00001426 {"remove", (PyCFunction)listremove, 1, remove_doc},
1427 {"index", (PyCFunction)listindex, 1, index_doc},
1428 {"count", (PyCFunction)listcount, 1, count_doc},
1429 {"reverse", (PyCFunction)listreverse, 1, reverse_doc},
1430 {"sort", (PyCFunction)listsort, 1, sort_doc},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001431 {NULL, NULL} /* sentinel */
1432};
1433
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001434static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001435list_getattr(f, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001436 PyListObject *f;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001437 char *name;
1438{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001439 return Py_FindMethod(list_methods, (PyObject *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001440}
1441
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001442static PySequenceMethods list_as_sequence = {
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001443 (inquiry)list_length, /*sq_length*/
1444 (binaryfunc)list_concat, /*sq_concat*/
1445 (intargfunc)list_repeat, /*sq_repeat*/
1446 (intargfunc)list_item, /*sq_item*/
1447 (intintargfunc)list_slice, /*sq_slice*/
1448 (intobjargproc)list_ass_item, /*sq_ass_item*/
1449 (intintobjargproc)list_ass_slice, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001450};
1451
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001452PyTypeObject PyList_Type = {
1453 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001454 0,
1455 "list",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001456 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001457 0,
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001458 (destructor)list_dealloc, /*tp_dealloc*/
1459 (printfunc)list_print, /*tp_print*/
1460 (getattrfunc)list_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001461 0, /*tp_setattr*/
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001462 (cmpfunc)list_compare, /*tp_compare*/
1463 (reprfunc)list_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001464 0, /*tp_as_number*/
1465 &list_as_sequence, /*tp_as_sequence*/
1466 0, /*tp_as_mapping*/
1467};
Guido van Rossum4c4e7df1998-06-16 15:18:28 +00001468
1469
1470/* During a sort, we really can't have anyone modifying the list; it could
1471 cause core dumps. Thus, we substitute a dummy type that raises an
1472 explanatory exception when a modifying operation is used. Caveat:
1473 comparisons may behave differently; but I guess it's a bad idea anyway to
1474 compare a list that's being sorted... */
1475
1476static PyObject *
1477immutable_list_op(/*No args!*/)
1478{
1479 PyErr_SetString(PyExc_TypeError,
1480 "a list cannot be modified while it is being sorted");
1481 return NULL;
1482}
1483
1484static PyMethodDef immutable_list_methods[] = {
1485 {"append", (PyCFunction)immutable_list_op},
1486 {"insert", (PyCFunction)immutable_list_op},
1487 {"remove", (PyCFunction)immutable_list_op},
1488 {"index", (PyCFunction)listindex},
1489 {"count", (PyCFunction)listcount},
1490 {"reverse", (PyCFunction)immutable_list_op},
1491 {"sort", (PyCFunction)immutable_list_op},
1492 {NULL, NULL} /* sentinel */
1493};
1494
1495static PyObject *
1496immutable_list_getattr(f, name)
1497 PyListObject *f;
1498 char *name;
1499{
1500 return Py_FindMethod(immutable_list_methods, (PyObject *)f, name);
1501}
1502
1503static int
1504immutable_list_ass(/*No args!*/)
1505{
1506 immutable_list_op();
1507 return -1;
1508}
1509
1510static PySequenceMethods immutable_list_as_sequence = {
1511 (inquiry)list_length, /*sq_length*/
1512 (binaryfunc)list_concat, /*sq_concat*/
1513 (intargfunc)list_repeat, /*sq_repeat*/
1514 (intargfunc)list_item, /*sq_item*/
1515 (intintargfunc)list_slice, /*sq_slice*/
1516 (intobjargproc)immutable_list_ass, /*sq_ass_item*/
1517 (intintobjargproc)immutable_list_ass, /*sq_ass_slice*/
1518};
1519
1520static PyTypeObject immutable_list_type = {
1521 PyObject_HEAD_INIT(&PyType_Type)
1522 0,
1523 "list (immutable, during sort)",
1524 sizeof(PyListObject),
1525 0,
1526 0, /*tp_dealloc*/ /* Cannot happen */
1527 (printfunc)list_print, /*tp_print*/
1528 (getattrfunc)immutable_list_getattr, /*tp_getattr*/
1529 0, /*tp_setattr*/
1530 0, /*tp_compare*/ /* Won't be called */
1531 (reprfunc)list_repr, /*tp_repr*/
1532 0, /*tp_as_number*/
1533 &immutable_list_as_sequence, /*tp_as_sequence*/
1534 0, /*tp_as_mapping*/
1535};
Guido van Rossum42812581998-06-17 14:15:44 +00001536