blob: 661982854d3cad766e6e7c1d423d824cc5c86a49 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6610ad91995-01-04 19:07:38 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000032/* List object implementation */
33
Guido van Rossumc0b618a1997-05-02 03:12:38 +000034#include "Python.h"
35
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000036#ifdef STDC_HEADERS
37#include <stddef.h>
38#else
39#include <sys/types.h> /* For size_t */
40#endif
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000041
Guido van Rossumc0b618a1997-05-02 03:12:38 +000042#define ROUNDUP(n, PyTryBlock) \
43 ((((n)+(PyTryBlock)-1)/(PyTryBlock))*(PyTryBlock))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000044
45static int
Guido van Rossuma27d1121997-08-25 18:36:23 +000046roundupsize(n)
Guido van Rossuma46d51d1995-01-26 22:59:43 +000047 int n;
48{
49 if (n < 500)
50 return ROUNDUP(n, 10);
51 else
52 return ROUNDUP(n, 100);
53}
54
Guido van Rossuma27d1121997-08-25 18:36:23 +000055#define NRESIZE(var, type, nitems) PyMem_RESIZE(var, type, roundupsize(nitems))
Guido van Rossuma46d51d1995-01-26 22:59:43 +000056
Guido van Rossumc0b618a1997-05-02 03:12:38 +000057PyObject *
58PyList_New(size)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000059 int size;
60{
61 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000062 PyListObject *op;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +000063 size_t nbytes;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000064 if (size < 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000065 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000066 return NULL;
67 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000068 nbytes = size * sizeof(PyObject *);
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000069 /* Check for overflow */
Guido van Rossumc0b618a1997-05-02 03:12:38 +000070 if (nbytes / sizeof(PyObject *) != (size_t)size) {
71 return PyErr_NoMemory();
Guido van Rossum1e28e5e1992-08-19 16:46:30 +000072 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000073 op = (PyListObject *) malloc(sizeof(PyListObject));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000074 if (op == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000075 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000076 }
77 if (size <= 0) {
78 op->ob_item = NULL;
79 }
80 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +000081 op->ob_item = (PyObject **) malloc(nbytes);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000082 if (op->ob_item == NULL) {
83 free((ANY *)op);
Guido van Rossumc0b618a1997-05-02 03:12:38 +000084 return PyErr_NoMemory();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000085 }
86 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +000087 op->ob_type = &PyList_Type;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000088 op->ob_size = size;
89 for (i = 0; i < size; i++)
90 op->ob_item[i] = NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +000091 _Py_NewReference(op);
92 return (PyObject *) op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000093}
94
95int
Guido van Rossumc0b618a1997-05-02 03:12:38 +000096PyList_Size(op)
97 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +000098{
Guido van Rossumc0b618a1997-05-02 03:12:38 +000099 if (!PyList_Check(op)) {
100 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000101 return -1;
102 }
103 else
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000104 return ((PyListObject *)op) -> ob_size;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000105}
106
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000107static PyObject *indexerr;
Guido van Rossum929f1b81996-08-09 20:51:27 +0000108
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000109PyObject *
110PyList_GetItem(op, i)
111 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000112 int i;
113{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000114 if (!PyList_Check(op)) {
115 PyErr_BadInternalCall();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000116 return NULL;
117 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000118 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000119 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000120 indexerr = PyString_FromString(
121 "list index out of range");
122 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000123 return NULL;
124 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000125 return ((PyListObject *)op) -> ob_item[i];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000126}
127
128int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000129PyList_SetItem(op, i, newitem)
130 register PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000131 register int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000132 register PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000133{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000134 register PyObject *olditem;
135 register PyObject **p;
136 if (!PyList_Check(op)) {
137 Py_XDECREF(newitem);
138 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000139 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000140 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000141 if (i < 0 || i >= ((PyListObject *)op) -> ob_size) {
142 Py_XDECREF(newitem);
143 PyErr_SetString(PyExc_IndexError,
144 "list assignment index out of range");
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000145 return -1;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000146 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000147 p = ((PyListObject *)op) -> ob_item + i;
Guido van Rossum5fe60581995-03-09 12:12:50 +0000148 olditem = *p;
149 *p = newitem;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000150 Py_XDECREF(olditem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000151 return 0;
152}
153
154static int
155ins1(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000156 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000157 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000158 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000159{
160 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000161 PyObject **items;
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000162 if (v == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000163 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000164 return -1;
165 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000166 items = self->ob_item;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000167 NRESIZE(items, PyObject *, self->ob_size+1);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000168 if (items == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000169 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000170 return -1;
171 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000172 if (where < 0)
173 where = 0;
174 if (where > self->ob_size)
175 where = self->ob_size;
176 for (i = self->ob_size; --i >= where; )
177 items[i+1] = items[i];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000178 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000179 items[where] = v;
180 self->ob_item = items;
181 self->ob_size++;
182 return 0;
183}
184
185int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000186PyList_Insert(op, where, newitem)
187 PyObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000188 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000189 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000190{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000191 if (!PyList_Check(op)) {
192 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000193 return -1;
194 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000195 return ins1((PyListObject *)op, where, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000196}
197
198int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000199PyList_Append(op, newitem)
200 PyObject *op;
201 PyObject *newitem;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000202{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000203 if (!PyList_Check(op)) {
204 PyErr_BadInternalCall();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000205 return -1;
206 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000207 return ins1((PyListObject *)op,
208 (int) ((PyListObject *)op)->ob_size, newitem);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000209}
210
211/* Methods */
212
213static void
214list_dealloc(op)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000215 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000216{
217 int i;
Jack Jansen7874d1f1995-01-19 12:09:27 +0000218 if (op->ob_item != NULL) {
219 for (i = 0; i < op->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000220 Py_XDECREF(op->ob_item[i]);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000221 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000222 free((ANY *)op->ob_item);
Jack Jansen7874d1f1995-01-19 12:09:27 +0000223 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000224 free((ANY *)op);
225}
226
Guido van Rossum90933611991-06-07 16:10:43 +0000227static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000228list_print(op, fp, flags)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000229 PyListObject *op;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000230 FILE *fp;
231 int flags;
232{
233 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000234
235 i = Py_ReprEnter((PyObject*)op);
236 if (i != 0) {
237 if (i < 0)
238 return i;
239 fprintf(fp, "[...]");
240 return 0;
241 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000242 fprintf(fp, "[");
Guido van Rossum90933611991-06-07 16:10:43 +0000243 for (i = 0; i < op->ob_size; i++) {
244 if (i > 0)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000245 fprintf(fp, ", ");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000246 if (PyObject_Print(op->ob_item[i], fp, 0) != 0) {
247 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000248 return -1;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000249 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000250 }
251 fprintf(fp, "]");
Guido van Rossumfb376de1998-04-10 22:47:27 +0000252 Py_ReprLeave((PyObject *)op);
Guido van Rossum90933611991-06-07 16:10:43 +0000253 return 0;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000254}
255
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000256static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000257list_repr(v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000258 PyListObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000259{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000260 PyObject *s, *comma;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000261 int i;
Guido van Rossumfb376de1998-04-10 22:47:27 +0000262
263 i = Py_ReprEnter((PyObject*)v);
264 if (i != 0) {
265 if (i > 0)
266 return PyString_FromString("[...]");
267 return NULL;
268 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000269 s = PyString_FromString("[");
270 comma = PyString_FromString(", ");
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000271 for (i = 0; i < v->ob_size && s != NULL; i++) {
272 if (i > 0)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000273 PyString_Concat(&s, comma);
274 PyString_ConcatAndDel(&s, PyObject_Repr(v->ob_item[i]));
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000275 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000276 Py_XDECREF(comma);
277 PyString_ConcatAndDel(&s, PyString_FromString("]"));
Guido van Rossumfb376de1998-04-10 22:47:27 +0000278 Py_ReprLeave((PyObject *)v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000279 return s;
280}
281
282static int
283list_compare(v, w)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000284 PyListObject *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000285{
286 int len = (v->ob_size < w->ob_size) ? v->ob_size : w->ob_size;
287 int i;
288 for (i = 0; i < len; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000289 int cmp = PyObject_Compare(v->ob_item[i], w->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000290 if (cmp != 0)
291 return cmp;
292 }
293 return v->ob_size - w->ob_size;
294}
295
296static int
297list_length(a)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000298 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000299{
300 return a->ob_size;
301}
302
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000303static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000304list_item(a, i)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000305 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000306 int i;
307{
308 if (i < 0 || i >= a->ob_size) {
Guido van Rossum929f1b81996-08-09 20:51:27 +0000309 if (indexerr == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000310 indexerr = PyString_FromString(
311 "list index out of range");
312 PyErr_SetObject(PyExc_IndexError, indexerr);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000313 return NULL;
314 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000315 Py_INCREF(a->ob_item[i]);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000316 return a->ob_item[i];
317}
318
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000319static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000320list_slice(a, ilow, ihigh)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000321 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000322 int ilow, ihigh;
323{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000324 PyListObject *np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000325 int i;
326 if (ilow < 0)
327 ilow = 0;
328 else if (ilow > a->ob_size)
329 ilow = a->ob_size;
330 if (ihigh < 0)
331 ihigh = 0;
332 if (ihigh < ilow)
333 ihigh = ilow;
334 else if (ihigh > a->ob_size)
335 ihigh = a->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000336 np = (PyListObject *) PyList_New(ihigh - ilow);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000337 if (np == NULL)
338 return NULL;
339 for (i = ilow; i < ihigh; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000340 PyObject *v = a->ob_item[i];
341 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000342 np->ob_item[i - ilow] = v;
343 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000344 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000345}
346
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000347PyObject *
348PyList_GetSlice(a, ilow, ihigh)
349 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000350 int ilow, ihigh;
351{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000352 if (!PyList_Check(a)) {
353 PyErr_BadInternalCall();
Guido van Rossum234f9421993-06-17 12:35:49 +0000354 return NULL;
355 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000356 return list_slice((PyListObject *)a, ilow, ihigh);
Guido van Rossum234f9421993-06-17 12:35:49 +0000357}
358
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000359static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000360list_concat(a, bb)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000361 PyListObject *a;
362 PyObject *bb;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000363{
364 int size;
365 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000366 PyListObject *np;
367 if (!PyList_Check(bb)) {
368 PyErr_BadArgument();
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000369 return NULL;
370 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000371#define b ((PyListObject *)bb)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000372 size = a->ob_size + b->ob_size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000373 np = (PyListObject *) PyList_New(size);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000374 if (np == NULL) {
Guido van Rossum90933611991-06-07 16:10:43 +0000375 return NULL;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000376 }
377 for (i = 0; i < a->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000378 PyObject *v = a->ob_item[i];
379 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000380 np->ob_item[i] = v;
381 }
382 for (i = 0; i < b->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000383 PyObject *v = b->ob_item[i];
384 Py_INCREF(v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000385 np->ob_item[i + a->ob_size] = v;
386 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000387 return (PyObject *)np;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000388#undef b
389}
390
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000391static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000392list_repeat(a, n)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000393 PyListObject *a;
Guido van Rossumed98d481991-03-06 13:07:53 +0000394 int n;
395{
396 int i, j;
397 int size;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000398 PyListObject *np;
399 PyObject **p;
Guido van Rossumed98d481991-03-06 13:07:53 +0000400 if (n < 0)
401 n = 0;
402 size = a->ob_size * n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000403 np = (PyListObject *) PyList_New(size);
Guido van Rossumed98d481991-03-06 13:07:53 +0000404 if (np == NULL)
405 return NULL;
406 p = np->ob_item;
407 for (i = 0; i < n; i++) {
408 for (j = 0; j < a->ob_size; j++) {
409 *p = a->ob_item[j];
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000410 Py_INCREF(*p);
Guido van Rossumed98d481991-03-06 13:07:53 +0000411 p++;
412 }
413 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000414 return (PyObject *) np;
Guido van Rossumed98d481991-03-06 13:07:53 +0000415}
416
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000417static int
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000418list_ass_slice(a, ilow, ihigh, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000419 PyListObject *a;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000420 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000421 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000422{
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000423 /* Because [X]DECREF can recursively invoke list operations on
424 this list, we must postpone all [X]DECREF activity until
425 after the list is back in its canonical shape. Therefore
426 we must allocate an additional array, 'recycle', into which
427 we temporarily copy the items that are deleted from the
428 list. :-( */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000429 PyObject **recycle, **p;
430 PyObject **item;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000431 int n; /* Size of replacement list */
432 int d; /* Change in size */
433 int k; /* Loop index */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000434#define b ((PyListObject *)v)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000435 if (v == NULL)
436 n = 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000437 else if (PyList_Check(v)) {
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000438 n = b->ob_size;
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000439 if (a == b) {
440 /* Special case "a[i:j] = a" -- copy b first */
441 int ret;
442 v = list_slice(b, 0, n);
443 ret = list_ass_slice(a, ilow, ihigh, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000444 Py_DECREF(v);
Guido van Rossum32dffaa1991-12-24 13:27:34 +0000445 return ret;
446 }
447 }
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000448 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000449 PyErr_BadArgument();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000450 return -1;
451 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000452 if (ilow < 0)
453 ilow = 0;
454 else if (ilow > a->ob_size)
455 ilow = a->ob_size;
456 if (ihigh < 0)
457 ihigh = 0;
458 if (ihigh < ilow)
459 ihigh = ilow;
460 else if (ihigh > a->ob_size)
461 ihigh = a->ob_size;
462 item = a->ob_item;
463 d = n - (ihigh-ilow);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000464 if (ihigh > ilow)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000465 p = recycle = PyMem_NEW(PyObject *, (ihigh-ilow));
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000466 else
467 p = recycle = NULL;
468 if (d <= 0) { /* Delete -d items; recycle ihigh-ilow items */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000469 for (k = ilow; k < ihigh; k++)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000470 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000471 if (d < 0) {
472 for (/*k = ihigh*/; k < a->ob_size; k++)
473 item[k+d] = item[k];
474 a->ob_size += d;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000475 NRESIZE(item, PyObject *, a->ob_size); /* Can't fail */
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000476 a->ob_item = item;
477 }
478 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000479 else { /* Insert d items; recycle ihigh-ilow items */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000480 NRESIZE(item, PyObject *, a->ob_size + d);
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000481 if (item == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000482 PyMem_XDEL(recycle);
483 PyErr_NoMemory();
Guido van Rossum2a9096b1990-10-21 22:15:08 +0000484 return -1;
485 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000486 for (k = a->ob_size; --k >= ihigh; )
487 item[k+d] = item[k];
488 for (/*k = ihigh-1*/; k >= ilow; --k)
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000489 *p++ = item[k];
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000490 a->ob_item = item;
491 a->ob_size += d;
492 }
493 for (k = 0; k < n; k++, ilow++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000494 PyObject *w = b->ob_item[k];
495 Py_XINCREF(w);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000496 item[ilow] = w;
497 }
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000498 if (recycle) {
499 while (--p >= recycle)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000500 Py_XDECREF(*p);
501 PyMem_DEL(recycle);
Guido van Rossumae7bf1a1995-01-17 10:21:11 +0000502 }
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000503 return 0;
504#undef b
505}
506
Guido van Rossum234f9421993-06-17 12:35:49 +0000507int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000508PyList_SetSlice(a, ilow, ihigh, v)
509 PyObject *a;
Guido van Rossum234f9421993-06-17 12:35:49 +0000510 int ilow, ihigh;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000511 PyObject *v;
Guido van Rossum234f9421993-06-17 12:35:49 +0000512{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000513 if (!PyList_Check(a)) {
514 PyErr_BadInternalCall();
Guido van Rossum1fc238a1993-07-29 08:25:09 +0000515 return -1;
Guido van Rossum234f9421993-06-17 12:35:49 +0000516 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000517 return list_ass_slice((PyListObject *)a, ilow, ihigh, v);
Guido van Rossum234f9421993-06-17 12:35:49 +0000518}
519
Guido van Rossum4a450d01991-04-03 19:05:18 +0000520static int
521list_ass_item(a, i, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000522 PyListObject *a;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000523 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000524 PyObject *v;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000525{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000526 PyObject *old_value;
Guido van Rossum4a450d01991-04-03 19:05:18 +0000527 if (i < 0 || i >= a->ob_size) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000528 PyErr_SetString(PyExc_IndexError,
529 "list assignment index out of range");
Guido van Rossum4a450d01991-04-03 19:05:18 +0000530 return -1;
531 }
532 if (v == NULL)
533 return list_ass_slice(a, i, i+1, v);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000534 Py_INCREF(v);
Guido van Rossumd7047b31995-01-02 19:07:15 +0000535 old_value = a->ob_item[i];
Guido van Rossum4a450d01991-04-03 19:05:18 +0000536 a->ob_item[i] = v;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000537 Py_DECREF(old_value);
Guido van Rossum4a450d01991-04-03 19:05:18 +0000538 return 0;
539}
540
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000541static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000542ins(self, where, v)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000543 PyListObject *self;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000544 int where;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000545 PyObject *v;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000546{
547 if (ins1(self, where, v) != 0)
548 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000549 Py_INCREF(Py_None);
550 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000551}
552
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000553static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000554listinsert(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000555 PyListObject *self;
556 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000557{
558 int i;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000559 PyObject *v;
560 if (!PyArg_Parse(args, "(iO)", &i, &v))
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000561 return NULL;
Guido van Rossumbf80e541993-02-08 15:49:17 +0000562 return ins(self, i, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000563}
564
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000565static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000566listappend(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000567 PyListObject *self;
568 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000569{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000570 PyObject *v;
571 if (!PyArg_Parse(args, "O", &v))
Guido van Rossumbf80e541993-02-08 15:49:17 +0000572 return NULL;
573 return ins(self, (int) self->ob_size, v);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000574}
575
Guido van Rossum3f236de1996-12-10 23:55:39 +0000576#define NEWSORT
577
578#ifdef NEWSORT
579
580/* New quicksort implementation for arrays of object pointers.
581 Thanks to discussions with Tim Peters. */
582
583/* CMPERROR is returned by our comparison function when an error
584 occurred. This is the largest negative integer (0x80000000 on a
585 32-bit system). */
Guido van Rossum19700b61997-03-05 00:45:43 +0000586#define CMPERROR ( (int) ((unsigned int)1 << (8*sizeof(int) - 1)) )
Guido van Rossum3f236de1996-12-10 23:55:39 +0000587
588/* Comparison function. Takes care of calling a user-supplied
589 comparison function (any callable Python object). Calls the
590 standard comparison function, cmpobject(), if the user-supplied
591 function is NULL. */
592
593static int
594docompare(x, y, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000595 PyObject *x;
596 PyObject *y;
597 PyObject *compare;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000598{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000599 PyObject *args, *res;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000600 int i;
601
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000602 if (compare == NULL) {
603 i = PyObject_Compare(x, y);
604 if (i && PyErr_Occurred())
605 i = CMPERROR;
606 return i;
607 }
Guido van Rossum3f236de1996-12-10 23:55:39 +0000608
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000609 args = Py_BuildValue("(OO)", x, y);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000610 if (args == NULL)
611 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000612 res = PyEval_CallObject(compare, args);
613 Py_DECREF(args);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000614 if (res == NULL)
615 return CMPERROR;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000616 if (!PyInt_Check(res)) {
617 Py_DECREF(res);
618 PyErr_SetString(PyExc_TypeError,
619 "comparison function should return int");
Guido van Rossum3f236de1996-12-10 23:55:39 +0000620 return CMPERROR;
621 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000622 i = PyInt_AsLong(res);
623 Py_DECREF(res);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000624 if (i < 0)
625 return -1;
626 if (i > 0)
627 return 1;
628 return 0;
629}
630
631/* Straight insertion sort. More efficient for sorting small arrays. */
632
633static int
634insertionsort(array, size, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000635 PyObject **array; /* Start of array to sort */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000636 int size; /* Number of elements to sort */
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000637 PyObject *compare;/* Comparison function object, or NULL => default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000638{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000639 register PyObject **a = array;
640 register PyObject **end = array+size;
641 register PyObject **p;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000642
Guido van Rossum3176bb11996-12-11 23:57:39 +0000643 for (p = a+1; p < end; p++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000644 register PyObject *key = *p;
645 register PyObject **q = p;
Guido van Rossum3176bb11996-12-11 23:57:39 +0000646 while (--q >= a) {
647 register int k = docompare(*q, key, compare);
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000648 /* if (p-q >= MINSIZE)
649 fprintf(stderr, "OUCH! %d\n", p-q); */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000650 if (k == CMPERROR)
651 return -1;
652 if (k <= 0)
653 break;
Guido van Rossum3176bb11996-12-11 23:57:39 +0000654 *(q+1) = *q;
655 *q = key; /* For consistency */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000656 }
657 }
658
659 return 0;
660}
661
662/* MINSIZE is the smallest array we care to partition; smaller arrays
Guido van Rossumcc15b421996-12-16 03:32:39 +0000663 are sorted using a straight insertion sort (above). It must be at
664 least 2 for the quicksort implementation to work. Assuming that
665 comparisons are more expensive than everything else (and this is a
666 good assumption for Python), it should be 10, which is the cutoff
667 point: quicksort requires more comparisons than insertion sort for
668 smaller arrays. */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000669#define MINSIZE 10
670
671/* STACKSIZE is the size of our work stack. A rough estimate is that
672 this allows us to sort arrays of MINSIZE * 2**STACKSIZE, or large
673 enough. (Because of the way we push the biggest partition first,
674 the worst case occurs when all subarrays are always partitioned
675 exactly in two.) */
676#define STACKSIZE 64
677
678/* Quicksort algorithm. Return -1 if an exception occurred; in this
679 case we leave the array partly sorted but otherwise in good health
680 (i.e. no items have been removed or duplicated). */
681
682static int
683quicksort(array, size, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000684 PyObject **array; /* Start of array to sort */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000685 int size; /* Number of elements to sort */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000686 PyObject *compare;/* Comparison function object, or NULL for default */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000687{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000688 register PyObject *tmp, *pivot;
689 register PyObject **lo, **hi, **l, **r;
Guido van Rossum3176bb11996-12-11 23:57:39 +0000690 int top, k, n, n2;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000691 PyObject **lostack[STACKSIZE];
692 PyObject **histack[STACKSIZE];
Guido van Rossum3f236de1996-12-10 23:55:39 +0000693
694 /* Start out with the whole array on the work stack */
Guido van Rossum3176bb11996-12-11 23:57:39 +0000695 lostack[0] = array;
696 histack[0] = array+size;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000697 top = 1;
698
699 /* Repeat until the work stack is empty */
700 while (--top >= 0) {
Guido van Rossum3176bb11996-12-11 23:57:39 +0000701 lo = lostack[top];
702 hi = histack[top];
Guido van Rossum3f236de1996-12-10 23:55:39 +0000703
704 /* If it's a small one, use straight insertion sort */
Guido van Rossum3176bb11996-12-11 23:57:39 +0000705 n = hi - lo;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000706 if (n < MINSIZE) {
Guido van Rossum24e62e21997-12-10 15:14:24 +0000707 /*
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000708 * skip it. The insertion sort at the end will
Guido van Rossum24e62e21997-12-10 15:14:24 +0000709 * catch these
710 */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000711 continue;
712 }
713
Guido van Rossum3176bb11996-12-11 23:57:39 +0000714 /* Choose median of first, middle and last item as pivot */
715
716 l = lo + (n>>1); /* Middle */
717 r = hi - 1; /* Last */
Guido van Rossum24e62e21997-12-10 15:14:24 +0000718
719 k = docompare(*l, *lo, compare);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000720 if (k == CMPERROR)
721 return -1;
722 if (k < 0)
Guido van Rossum3176bb11996-12-11 23:57:39 +0000723 { tmp = *lo; *lo = *l; *l = tmp; }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000724
Guido van Rossum3176bb11996-12-11 23:57:39 +0000725 k = docompare(*r, *l, compare);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000726 if (k == CMPERROR)
727 return -1;
728 if (k < 0)
Guido van Rossum3176bb11996-12-11 23:57:39 +0000729 { tmp = *r; *r = *l; *l = tmp; }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000730
731 k = docompare(*l, *lo, compare);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000732 if (k == CMPERROR)
733 return -1;
734 if (k < 0)
Guido van Rossum24e62e21997-12-10 15:14:24 +0000735 { tmp = *l; *l = *lo; *lo = tmp; }
736 pivot = *l;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000737
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000738 /* Move pivot off to the side (swap with lo+1) */
739 *l = *(lo+1); *(lo+1) = pivot;
740
Guido van Rossum3f236de1996-12-10 23:55:39 +0000741 /* Partition the array */
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000742 l = lo+2;
Guido van Rossum24e62e21997-12-10 15:14:24 +0000743 r = hi-2;
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000744 do {
745 /* Move left index to element >= pivot */
Guido van Rossum044b9dc1998-02-25 17:50:03 +0000746 while (l < hi) {
Guido van Rossum24e62e21997-12-10 15:14:24 +0000747 k = docompare(*l, pivot, compare);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000748 if (k == CMPERROR)
749 return -1;
Guido van Rossum24e62e21997-12-10 15:14:24 +0000750 if (k >= 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000751 break;
Guido van Rossum24e62e21997-12-10 15:14:24 +0000752 l++;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000753 }
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000754 /* Move right index to element <= pivot */
755 while (r > lo) {
Guido van Rossum24e62e21997-12-10 15:14:24 +0000756 k = docompare(pivot, *r, compare);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000757 if (k == CMPERROR)
758 return -1;
Guido van Rossum24e62e21997-12-10 15:14:24 +0000759 if (k >= 0)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000760 break;
Guido van Rossum24e62e21997-12-10 15:14:24 +0000761 r--;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000762 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000763
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000764 /* If they crossed, we're through */
765 if (l <= r) {
Guido van Rossum24e62e21997-12-10 15:14:24 +0000766 /* Swap elements and continue */
767 tmp = *l; *l = *r; *r = tmp;
768 l++; r--;
769 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000770
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000771 } while (l <= r);
Guido van Rossum3f236de1996-12-10 23:55:39 +0000772
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000773 /* Swap pivot back into place; *r <= pivot */
774 *(lo+1) = *r; *r = pivot;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000775
776 /* We have now reached the following conditions:
Guido van Rossum3176bb11996-12-11 23:57:39 +0000777 lo <= r < l <= hi
778 all x in [lo,r) are <= pivot
779 all x in [r,l) are == pivot
780 all x in [l,hi) are >= pivot
781 The partitions are [lo,r) and [l,hi)
Guido van Rossum3f236de1996-12-10 23:55:39 +0000782 */
783
784 /* Push biggest partition first */
Guido van Rossum3176bb11996-12-11 23:57:39 +0000785 n = r - lo;
786 n2 = hi - l;
787 if (n > n2) {
Guido van Rossum3f236de1996-12-10 23:55:39 +0000788 /* First one is bigger */
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000789 lostack[top] = lo;
790 histack[top++] = r;
791 lostack[top] = l;
792 histack[top++] = hi;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000793 } else {
794 /* Second one is bigger */
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000795 lostack[top] = l;
796 histack[top++] = hi;
797 lostack[top] = lo;
798 histack[top++] = r;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000799 }
800
Guido van Rossum82e6a8f1998-04-28 13:17:56 +0000801 /* Should assert top <= STACKSIZE */
Guido van Rossum3f236de1996-12-10 23:55:39 +0000802 }
Guido van Rossum24e62e21997-12-10 15:14:24 +0000803
804 /*
805 * Ouch - even if I screwed up the quicksort above, the
806 * insertionsort below will cover up the problem - just a
807 * performance hit would be noticable.
808 */
809
810 /* insertionsort is pretty fast on the partially sorted list */
811
812 if (insertionsort(array, size, compare) < 0)
813 return -1;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000814
815 /* Succes */
816 return 0;
817}
818
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000819static PyObject *
Guido van Rossum3f236de1996-12-10 23:55:39 +0000820listsort(self, compare)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000821 PyListObject *self;
822 PyObject *compare;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000823{
824 /* XXX Don't you *dare* changing the list's length in compare()! */
825 if (quicksort(self->ob_item, self->ob_size, compare) < 0)
826 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000827 Py_INCREF(Py_None);
828 return Py_None;
Guido van Rossum3f236de1996-12-10 23:55:39 +0000829}
830
831#else /* !NEWSORT */
832
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000833static PyObject *comparefunc;
Guido van Rossume10a19e1992-08-03 19:05:37 +0000834
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000835static int
836cmp(v, w)
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000837 const ANY *v, *w;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000838{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000839 PyObject *t, *res;
Guido van Rossume10a19e1992-08-03 19:05:37 +0000840 long i;
841
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000842 if (PyErr_Occurred())
Guido van Rossume10a19e1992-08-03 19:05:37 +0000843 return 0;
844
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000845 if (comparefunc == NULL)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000846 return PyObject_Compare(* (PyObject **) v, * (PyObject **) w);
Guido van Rossume10a19e1992-08-03 19:05:37 +0000847
848 /* Call the user-supplied comparison function */
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000849 t = Py_BuildValue("(OO)", * (PyObject **) v, * (PyObject **) w);
Guido van Rossume10a19e1992-08-03 19:05:37 +0000850 if (t == NULL)
851 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000852 res = PyEval_CallObject(comparefunc, t);
853 Py_DECREF(t);
Guido van Rossume10a19e1992-08-03 19:05:37 +0000854 if (res == NULL)
855 return 0;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000856 if (!PyInt_Check(res)) {
857 PyErr_SetString(PyExc_TypeError,
858 "comparison function should return int");
Guido van Rossume10a19e1992-08-03 19:05:37 +0000859 i = 0;
860 }
861 else {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000862 i = PyInt_AsLong(res);
Guido van Rossume10a19e1992-08-03 19:05:37 +0000863 if (i < 0)
864 i = -1;
865 else if (i > 0)
866 i = 1;
867 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000868 Py_DECREF(res);
Guido van Rossume10a19e1992-08-03 19:05:37 +0000869 return (int) i;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000870}
871
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000872static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000873listsort(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000874 PyListObject *self;
875 PyObject *args;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000876{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000877 PyObject *save_comparefunc;
Guido van Rossume10a19e1992-08-03 19:05:37 +0000878 if (self->ob_size <= 1) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000879 Py_INCREF(Py_None);
880 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000881 }
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000882 save_comparefunc = comparefunc;
883 comparefunc = args;
884 if (comparefunc != NULL) {
Guido van Rossume10a19e1992-08-03 19:05:37 +0000885 /* Test the comparison function for obvious errors */
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000886 (void) cmp((ANY *)&self->ob_item[0], (ANY *)&self->ob_item[1]);
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000887 if (PyErr_Occurred()) {
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000888 comparefunc = save_comparefunc;
Guido van Rossume10a19e1992-08-03 19:05:37 +0000889 return NULL;
890 }
891 }
892 qsort((char *)self->ob_item,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000893 (int) self->ob_size, sizeof(PyObject *), cmp);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000894 comparefunc = save_comparefunc;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000895 if (PyErr_Occurred())
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000896 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000897 Py_INCREF(Py_None);
898 return Py_None;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +0000899}
900
Guido van Rossum3f236de1996-12-10 23:55:39 +0000901#endif
902
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000903static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000904listreverse(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000905 PyListObject *self;
906 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +0000907{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000908 register PyObject **p, **q;
909 register PyObject *tmp;
Guido van Rossumed98d481991-03-06 13:07:53 +0000910
911 if (args != NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000912 PyErr_BadArgument();
Guido van Rossumed98d481991-03-06 13:07:53 +0000913 return NULL;
914 }
915
916 if (self->ob_size > 1) {
917 for (p = self->ob_item, q = self->ob_item + self->ob_size - 1;
918 p < q; p++, q--) {
919 tmp = *p;
920 *p = *q;
921 *q = tmp;
922 }
923 }
924
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000925 Py_INCREF(Py_None);
926 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +0000927}
928
Guido van Rossum84c76f51990-10-30 13:32:20 +0000929int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000930PyList_Reverse(v)
931 PyObject *v;
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000932{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000933 if (v == NULL || !PyList_Check(v)) {
934 PyErr_BadInternalCall();
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000935 return -1;
936 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000937 v = listreverse((PyListObject *)v, (PyObject *)NULL);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000938 if (v == NULL)
939 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000940 Py_DECREF(v);
Guido van Rossumb0fe3a91995-01-17 16:34:45 +0000941 return 0;
942}
943
944int
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000945PyList_Sort(v)
946 PyObject *v;
Guido van Rossum84c76f51990-10-30 13:32:20 +0000947{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000948 if (v == NULL || !PyList_Check(v)) {
949 PyErr_BadInternalCall();
Guido van Rossum84c76f51990-10-30 13:32:20 +0000950 return -1;
951 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000952 v = listsort((PyListObject *)v, (PyObject *)NULL);
Guido van Rossum84c76f51990-10-30 13:32:20 +0000953 if (v == NULL)
954 return -1;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000955 Py_DECREF(v);
Guido van Rossum84c76f51990-10-30 13:32:20 +0000956 return 0;
957}
958
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000959PyObject *
960PyList_AsTuple(v)
961 PyObject *v;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000962{
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000963 PyObject *w;
964 PyObject **p;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000965 int n;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000966 if (v == NULL || !PyList_Check(v)) {
967 PyErr_BadInternalCall();
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000968 return NULL;
969 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000970 n = ((PyListObject *)v)->ob_size;
971 w = PyTuple_New(n);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000972 if (w == NULL)
973 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000974 p = ((PyTupleObject *)w)->ob_item;
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000975 memcpy((ANY *)p,
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000976 (ANY *)((PyListObject *)v)->ob_item,
977 n*sizeof(PyObject *));
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000978 while (--n >= 0) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000979 Py_INCREF(*p);
Guido van Rossum6cd2fe01994-08-29 12:45:32 +0000980 p++;
981 }
982 return w;
983}
984
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000985static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +0000986listindex(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000987 PyListObject *self;
988 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +0000989{
990 int i;
991
992 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000993 PyErr_BadArgument();
Guido van Rossumed98d481991-03-06 13:07:53 +0000994 return NULL;
995 }
996 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +0000997 if (PyObject_Compare(self->ob_item[i], args) == 0)
998 return PyInt_FromLong((long)i);
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000999 if (PyErr_Occurred())
1000 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001001 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001002 PyErr_SetString(PyExc_ValueError, "list.index(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001003 return NULL;
1004}
1005
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001006static PyObject *
Guido van Rossume6f7d181991-10-20 20:20:40 +00001007listcount(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001008 PyListObject *self;
1009 PyObject *args;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001010{
1011 int count = 0;
1012 int i;
1013
1014 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001015 PyErr_BadArgument();
Guido van Rossume6f7d181991-10-20 20:20:40 +00001016 return NULL;
1017 }
1018 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001019 if (PyObject_Compare(self->ob_item[i], args) == 0)
Guido van Rossume6f7d181991-10-20 20:20:40 +00001020 count++;
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001021 if (PyErr_Occurred())
1022 return NULL;
Guido van Rossume6f7d181991-10-20 20:20:40 +00001023 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001024 return PyInt_FromLong((long)count);
Guido van Rossume6f7d181991-10-20 20:20:40 +00001025}
1026
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001027static PyObject *
Guido van Rossumed98d481991-03-06 13:07:53 +00001028listremove(self, args)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001029 PyListObject *self;
1030 PyObject *args;
Guido van Rossumed98d481991-03-06 13:07:53 +00001031{
1032 int i;
1033
1034 if (args == NULL) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001035 PyErr_BadArgument();
Guido van Rossumed98d481991-03-06 13:07:53 +00001036 return NULL;
1037 }
1038 for (i = 0; i < self->ob_size; i++) {
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001039 if (PyObject_Compare(self->ob_item[i], args) == 0) {
1040 if (list_ass_slice(self, i, i+1,
1041 (PyObject *)NULL) != 0)
Guido van Rossumed98d481991-03-06 13:07:53 +00001042 return NULL;
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001043 Py_INCREF(Py_None);
1044 return Py_None;
Guido van Rossumed98d481991-03-06 13:07:53 +00001045 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001046 if (PyErr_Occurred())
1047 return NULL;
Guido van Rossumed98d481991-03-06 13:07:53 +00001048 }
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001049 PyErr_SetString(PyExc_ValueError, "list.remove(x): x not in list");
Guido van Rossumed98d481991-03-06 13:07:53 +00001050 return NULL;
1051}
1052
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001053static PyMethodDef list_methods[] = {
1054 {"append", (PyCFunction)listappend},
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001055 {"insert", (PyCFunction)listinsert},
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001056 {"remove", (PyCFunction)listremove},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001057 {"index", (PyCFunction)listindex},
1058 {"count", (PyCFunction)listcount},
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001059 {"reverse", (PyCFunction)listreverse},
Guido van Rossum5d8123f1997-07-13 03:58:01 +00001060 {"sort", (PyCFunction)listsort, 0},
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001061 {NULL, NULL} /* sentinel */
1062};
1063
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001064static PyObject *
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001065list_getattr(f, name)
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001066 PyListObject *f;
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001067 char *name;
1068{
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001069 return Py_FindMethod(list_methods, (PyObject *)f, name);
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001070}
1071
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001072static PySequenceMethods list_as_sequence = {
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001073 (inquiry)list_length, /*sq_length*/
1074 (binaryfunc)list_concat, /*sq_concat*/
1075 (intargfunc)list_repeat, /*sq_repeat*/
1076 (intargfunc)list_item, /*sq_item*/
1077 (intintargfunc)list_slice, /*sq_slice*/
1078 (intobjargproc)list_ass_item, /*sq_ass_item*/
1079 (intintobjargproc)list_ass_slice, /*sq_ass_slice*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001080};
1081
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001082PyTypeObject PyList_Type = {
1083 PyObject_HEAD_INIT(&PyType_Type)
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001084 0,
1085 "list",
Guido van Rossumc0b618a1997-05-02 03:12:38 +00001086 sizeof(PyListObject),
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001087 0,
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001088 (destructor)list_dealloc, /*tp_dealloc*/
1089 (printfunc)list_print, /*tp_print*/
1090 (getattrfunc)list_getattr, /*tp_getattr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001091 0, /*tp_setattr*/
Guido van Rossum6cd2fe01994-08-29 12:45:32 +00001092 (cmpfunc)list_compare, /*tp_compare*/
1093 (reprfunc)list_repr, /*tp_repr*/
Guido van Rossum85a5fbb1990-10-14 12:07:46 +00001094 0, /*tp_as_number*/
1095 &list_as_sequence, /*tp_as_sequence*/
1096 0, /*tp_as_mapping*/
1097};