blob: 144a62f920c99f640c5bd949e8552bfee3196e01 [file] [log] [blame]
Andrew M. Kuchling9bcc68c2000-12-20 15:07:34 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Built-in functions */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005
6#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +00007#include "compile.h"
8#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00009
Guido van Rossum6bf62da1997-04-11 20:37:35 +000010#include <ctype.h>
11
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000012#ifdef HAVE_UNISTD_H
13#include <unistd.h>
14#endif
15
Mark Hammond26cffde42001-05-14 12:17:34 +000016/* The default encoding used by the platform file system APIs
17 Can remain NULL for all platforms that don't have such a concept
18*/
Fredrik Lundh5b979352001-06-26 17:46:10 +000019#if defined(MS_WIN32) && defined(HAVE_USABLE_WCHAR_T)
Mark Hammond26cffde42001-05-14 12:17:34 +000020const char *Py_FileSystemDefaultEncoding = "mbcs";
21#else
22const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
23#endif
Mark Hammondef8b6542001-05-13 08:04:26 +000024
Guido van Rossum12d12c51993-10-26 17:58:25 +000025/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000026static PyObject *filterstring(PyObject *, PyObject *);
27static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000028
Guido van Rossum79f25d91997-04-29 20:08:16 +000029static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000030builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000031{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000033 PyObject *globals = NULL;
34 PyObject *locals = NULL;
35 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000036
Guido van Rossum79f25d91997-04-29 20:08:16 +000037 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000038 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000040 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041}
42
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000043static char import_doc[] =
44"__import__(name, globals, locals, fromlist) -> module\n\
45\n\
46Import a module. The globals are only used to determine the context;\n\
47they are not modified. The locals are currently unused. The fromlist\n\
48should be a list of names to emulate ``from name import ...'', or an\n\
49empty list to emulate ``import name''.\n\
50When importing a module from a package, note that __import__('A.B', ...)\n\
51returns package A when fromlist is empty, but its submodule B when\n\
52fromlist is not empty.";
53
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054
Guido van Rossum79f25d91997-04-29 20:08:16 +000055static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000056builtin_abs(PyObject *self, PyObject *v)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057{
Guido van Rossum09df08a1998-05-22 00:51:39 +000058 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000059}
60
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000061static char abs_doc[] =
62"abs(number) -> number\n\
63\n\
64Return the absolute value of the argument.";
65
66
Guido van Rossum79f25d91997-04-29 20:08:16 +000067static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000069{
Guido van Rossum79f25d91997-04-29 20:08:16 +000070 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000071 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072
Guido van Rossum79f25d91997-04-29 20:08:16 +000073 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000074 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000075 if (alist != NULL) {
76 if (!PyTuple_Check(alist)) {
77 if (!PySequence_Check(alist)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000078 PyErr_Format(PyExc_TypeError,
79 "apply() arg 2 expect sequence, found %s",
80 alist->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000081 return NULL;
82 }
83 t = PySequence_Tuple(alist);
84 if (t == NULL)
85 return NULL;
86 alist = t;
87 }
Guido van Rossum2d951851994-08-29 12:52:16 +000088 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000089 if (kwdict != NULL && !PyDict_Check(kwdict)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000090 PyErr_Format(PyExc_TypeError,
91 "apply() arg 3 expected dictionary, found %s",
92 kwdict->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000093 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000094 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +000095 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
96 finally:
97 Py_XDECREF(t);
98 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000099}
100
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000101static char apply_doc[] =
Fred Drakef1fbc622001-01-12 17:05:05 +0000102"apply(object[, args[, kwargs]]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000103\n\
Fred Drake7b912121999-12-23 14:16:55 +0000104Call a callable object with positional arguments taken from the tuple args,\n\
105and keyword arguments taken from the optional dictionary kwargs.\n\
106Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000107
108
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000110builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000111{
112 PyObject *ob;
113 int offset = 0;
114 int size = Py_END_OF_BUFFER;
115
116 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
117 return NULL;
118 return PyBuffer_FromObject(ob, offset, size);
119}
120
121static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000122"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000123\n\
Guido van Rossumad991772001-01-12 16:03:05 +0000124Create a new buffer object which references the given object.\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000125The buffer will reference a slice of the target object from the\n\
126start of the object (or at the specified offset). The slice will\n\
127extend to the end of the target object (or with the specified size).";
128
129
130static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000131builtin_callable(PyObject *self, PyObject *v)
Guido van Rossum2d951851994-08-29 12:52:16 +0000132{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000134}
135
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000136static char callable_doc[] =
137"callable(object) -> Boolean\n\
138\n\
139Return whether the object is callable (i.e., some kind of function).\n\
140Note that classes are callable, as are instances with a __call__() method.";
141
142
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000144builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145{
Tim Peters0e57abf2001-05-02 07:39:38 +0000146 PyObject *func, *seq, *result, *it;
147 int len; /* guess for result list size */
Tim Petersf4848da2001-05-05 00:14:56 +0000148 register int j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152
Tim Peters0e57abf2001-05-02 07:39:38 +0000153 /* Strings and tuples return a result of the same type. */
154 if (PyString_Check(seq))
155 return filterstring(func, seq);
156 if (PyTuple_Check(seq))
157 return filtertuple(func, seq);
158
159 /* Get iterator. */
160 it = PyObject_GetIter(seq);
161 if (it == NULL)
162 return NULL;
163
164 /* Guess a result list size. */
165 len = -1; /* unknown */
166 if (PySequence_Check(seq) &&
167 seq->ob_type->tp_as_sequence->sq_length) {
168 len = PySequence_Size(seq);
169 if (len < 0)
170 PyErr_Clear();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000171 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000172 if (len < 0)
173 len = 8; /* arbitrary */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000174
Tim Peters0e57abf2001-05-02 07:39:38 +0000175 /* Get a result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000177 /* Eww - can modify the list in-place. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000179 result = seq;
180 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000181 else {
Tim Peters0e57abf2001-05-02 07:39:38 +0000182 result = PyList_New(len);
183 if (result == NULL)
184 goto Fail_it;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000185 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000186
Tim Peters0e57abf2001-05-02 07:39:38 +0000187 /* Build the result list. */
Tim Petersf4848da2001-05-05 00:14:56 +0000188 j = 0;
189 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000191 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192
Tim Peters0e57abf2001-05-02 07:39:38 +0000193 item = PyIter_Next(it);
194 if (item == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +0000195 if (PyErr_Occurred())
196 goto Fail_result_it;
Tim Peters0e57abf2001-05-02 07:39:38 +0000197 break;
Guido van Rossum2d951851994-08-29 12:52:16 +0000198 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000199
Guido van Rossum79f25d91997-04-29 20:08:16 +0000200 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000201 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000203 }
204 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 PyObject *arg = Py_BuildValue("(O)", item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000206 if (arg == NULL) {
207 Py_DECREF(item);
208 goto Fail_result_it;
209 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 good = PyEval_CallObject(func, arg);
211 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000212 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 Py_DECREF(item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000214 goto Fail_result_it;
Guido van Rossum58b68731995-01-10 17:40:55 +0000215 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 ok = PyObject_IsTrue(good);
218 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000219 if (ok) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000220 if (j < len)
221 PyList_SET_ITEM(result, j, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000222 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000223 int status = PyList_Append(result, item);
Barry Warsawfa77e091999-01-28 18:49:12 +0000224 Py_DECREF(item);
225 if (status < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000226 goto Fail_result_it;
Guido van Rossum2d951851994-08-29 12:52:16 +0000227 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000228 ++j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000229 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000230 else
231 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000232 }
233
Guido van Rossum12d12c51993-10-26 17:58:25 +0000234
Tim Peters0e57abf2001-05-02 07:39:38 +0000235 /* Cut back result list if len is too big. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000237 goto Fail_result_it;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000238
Tim Peters3c6b1482001-05-21 08:07:05 +0000239 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000240 return result;
241
Tim Peters0e57abf2001-05-02 07:39:38 +0000242Fail_result_it:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 Py_DECREF(result);
Tim Peters0e57abf2001-05-02 07:39:38 +0000244Fail_it:
245 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000246 return NULL;
247}
248
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000249static char filter_doc[] =
250"filter(function, sequence) -> list\n\
251\n\
252Return a list containing those items of sequence for which function(item)\n\
253is true. If function is None, return a list of items that are true.";
254
255
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000257builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258{
259 long x;
260 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000261
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 PyErr_SetString(PyExc_ValueError,
266 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000267 return NULL;
268 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000269 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271}
272
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000273static char chr_doc[] =
274"chr(i) -> character\n\
275\n\
276Return a string of one character with ordinal i; 0 <= i < 256.";
277
278
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000279#ifdef Py_USING_UNICODE
Guido van Rossum79f25d91997-04-29 20:08:16 +0000280static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000282{
283 long x;
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000284 Py_UNICODE s[2];
Guido van Rossum09095f32000-03-10 23:00:52 +0000285
286 if (!PyArg_ParseTuple(args, "l:unichr", &x))
287 return NULL;
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000288
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000289#ifdef Py_UNICODE_WIDE
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000290 if (x < 0 || x > 0x10ffff) {
Guido van Rossum09095f32000-03-10 23:00:52 +0000291 PyErr_SetString(PyExc_ValueError,
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000292 "unichr() arg not in range(0x110000) "
293 "(wide Python build)");
Guido van Rossum09095f32000-03-10 23:00:52 +0000294 return NULL;
295 }
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000296#else
297 if (x < 0 || x > 0xffff) {
298 PyErr_SetString(PyExc_ValueError,
299 "unichr() arg not in range(0x10000) "
300 "(narrow Python build)");
301 return NULL;
302 }
303#endif
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000304
305 if (x <= 0xffff) {
306 /* UCS-2 character */
307 s[0] = (Py_UNICODE) x;
308 return PyUnicode_FromUnicode(s, 1);
Guido van Rossum236d8b72001-06-26 23:12:25 +0000309 }
310 else {
Fredrik Lundh8f455852001-06-27 18:59:43 +0000311#ifndef Py_UNICODE_WIDE
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000312 /* UCS-4 character. store as two surrogate characters */
313 x -= 0x10000L;
314 s[0] = 0xD800 + (Py_UNICODE) (x >> 10);
315 s[1] = 0xDC00 + (Py_UNICODE) (x & 0x03FF);
316 return PyUnicode_FromUnicode(s, 2);
Guido van Rossum236d8b72001-06-26 23:12:25 +0000317#else
318 s[0] = (Py_UNICODE)x;
319 return PyUnicode_FromUnicode(s, 1);
Martin v. Löwis0ba70cc2001-06-26 22:22:37 +0000320#endif
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000321 }
Guido van Rossum09095f32000-03-10 23:00:52 +0000322}
323
324static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000325"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000326\n\
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000327Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.";
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000328#endif
Guido van Rossum09095f32000-03-10 23:00:52 +0000329
330
331static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000333{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000335 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000338 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000339 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000340 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000341 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000342}
343
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000344static char cmp_doc[] =
345"cmp(x, y) -> integer\n\
346\n\
347Return negative if x<y, zero if x==y, positive if x>y.";
348
349
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000351builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000352{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 PyObject *v, *w;
354 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000355
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000357 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000359 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 res = Py_BuildValue("(OO)", v, w);
361 Py_DECREF(v);
362 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000363 return res;
364}
365
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000366static char coerce_doc[] =
367"coerce(x, y) -> None or (x1, y1)\n\
368\n\
369When x and y can be coerced to values of the same type, return a tuple\n\
370containing the coerced values. When they can't be coerced, return None.";
371
372
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000375{
376 char *str;
377 char *filename;
378 char *startstr;
379 int start;
Tim Peters6cd6a822001-08-17 22:11:27 +0000380 int dont_inherit = 0;
381 int supplied_flags = 0;
Tim Peters5ba58662001-07-16 02:29:45 +0000382 PyCompilerFlags cf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383
Tim Peters6cd6a822001-08-17 22:11:27 +0000384 if (!PyArg_ParseTuple(args, "sss|ii:compile", &str, &filename,
385 &startstr, &supplied_flags, &dont_inherit))
Guido van Rossum5b722181993-03-30 17:46:03 +0000386 return NULL;
Tim Peters6cd6a822001-08-17 22:11:27 +0000387
Guido van Rossum5b722181993-03-30 17:46:03 +0000388 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000389 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000390 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000391 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000392 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000393 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000394 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000396 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000397 return NULL;
398 }
Tim Peters6cd6a822001-08-17 22:11:27 +0000399
400 if (supplied_flags & ~(PyCF_MASK | PyCF_MASK_OBSOLETE)) {
401 PyErr_SetString(PyExc_ValueError,
402 "compile(): unrecognised flags");
403 return NULL;
404 }
405 /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
406
407 cf.cf_flags = supplied_flags;
408 if (!dont_inherit) {
409 PyEval_MergeCompilerFlags(&cf);
410 }
411 return Py_CompileStringFlags(str, filename, start, &cf);
Guido van Rossum5b722181993-03-30 17:46:03 +0000412}
413
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000414static char compile_doc[] =
Tim Peters6cd6a822001-08-17 22:11:27 +0000415"compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000416\n\
417Compile the source string (a Python module, statement or expression)\n\
418into a code object that can be executed by the exec statement or eval().\n\
419The filename will be used for run-time error messages.\n\
420The mode must be 'exec' to compile a module, 'single' to compile a\n\
Tim Peters6cd6a822001-08-17 22:11:27 +0000421single (interactive) statement, or 'eval' to compile an expression.\n\
422The flags argument, if present, controls which future statements influence\n\
423the compilation of the code.\n\
424The dont_inherit argument, if non-zero, stops the compilation inheriting\n\
425the effects of any future statements in effect in the code calling\n\
426compile; if absent or zero these statements do influence the compilation,\n\
427in addition to any features explicitly specified.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000428
Guido van Rossum79f25d91997-04-29 20:08:16 +0000429static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000430builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000431{
Tim Peters5d2b77c2001-09-03 05:47:38 +0000432 PyObject *arg = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000433
Tim Peters5d2b77c2001-09-03 05:47:38 +0000434 if (!PyArg_ParseTuple(args, "|O:dir", &arg))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000435 return NULL;
Tim Peters7eea37e2001-09-04 22:08:56 +0000436 return PyObject_Dir(arg);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000437}
438
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000439static char dir_doc[] =
Tim Peters5d2b77c2001-09-03 05:47:38 +0000440"dir([object]) -> list of strings\n"
441"\n"
442"Return an alphabetized list of names comprising (some of) the attributes\n"
443"of the given object, and of attributes reachable from it:\n"
444"\n"
445"No argument: the names in the current scope.\n"
446"Module object: the module attributes.\n"
Tim Peters37a309d2001-09-04 01:20:04 +0000447"Type or class object: its attributes, and recursively the attributes of\n"
448" its bases.\n"
Tim Peters5d2b77c2001-09-03 05:47:38 +0000449"Otherwise: its attributes, its class's attributes, and recursively the\n"
450" attributes of its class's base classes.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000451
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000453builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000454{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000458 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000459 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000460}
461
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000462static char divmod_doc[] =
463"divmod(x, y) -> (div, mod)\n\
464\n\
465Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
466
467
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000469builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000470{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 PyObject *cmd;
472 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000473 char *str;
Tim Peters9fa96be2001-08-17 23:04:59 +0000474 PyCompilerFlags cf;
Guido van Rossum590baa41993-11-30 13:40:46 +0000475
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 &PyDict_Type, &globals,
479 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000480 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 if (globals == Py_None) {
482 globals = PyEval_GetGlobals();
483 if (locals == Py_None)
484 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000485 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000487 locals = globals;
Tim Peters9fa96be2001-08-17 23:04:59 +0000488
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
490 if (PyDict_SetItemString(globals, "__builtins__",
491 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000492 return NULL;
493 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000494
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000495 if (PyCode_Check(cmd)) {
496 if (PyTuple_GET_SIZE(((PyCodeObject *)cmd)->co_freevars) > 0) {
497 PyErr_SetString(PyExc_TypeError,
498 "code object passed to eval() may not contain free variables");
499 return NULL;
500 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000502 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000503
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000504 if (!PyString_Check(cmd) &&
505 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000507 "eval() arg 1 must be a string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000508 return NULL;
509 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000510 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000512 while (*str == ' ' || *str == '\t')
513 str++;
Tim Peters9fa96be2001-08-17 23:04:59 +0000514
515 cf.cf_flags = 0;
516 (void)PyEval_MergeCompilerFlags(&cf);
517 return PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000518}
519
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000520static char eval_doc[] =
521"eval(source[, globals[, locals]]) -> value\n\
522\n\
523Evaluate the source in the context of globals and locals.\n\
524The source may be a string representing a Python expression\n\
525or a code object as returned by compile().\n\
526The globals and locals are dictionaries, defaulting to the current\n\
527globals and locals. If only globals is given, locals defaults to it.";
528
529
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000531builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000532{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 PyObject *globals = Py_None, *locals = Py_None;
535 PyObject *res;
Guido van Rossumb3a639e2001-09-05 13:37:47 +0000536 FILE* fp = NULL;
Tim Peters5ba58662001-07-16 02:29:45 +0000537 PyCompilerFlags cf;
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000538 int exists;
539 struct stat s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000540
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 &PyDict_Type, &globals,
544 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000545 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 if (globals == Py_None) {
547 globals = PyEval_GetGlobals();
548 if (locals == Py_None)
549 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000550 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000551 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000552 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
554 if (PyDict_SetItemString(globals, "__builtins__",
555 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000556 return NULL;
557 }
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000558
559 exists = 0;
560 /* Test for existence or directory. */
561 if (!stat(filename, &s)) {
Martin v. Löwisf9836ba2001-08-08 10:28:06 +0000562 if (S_ISDIR(s.st_mode))
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000563 errno = EISDIR;
564 else
565 exists = 1;
566 }
567
568 if (exists) {
569 Py_BEGIN_ALLOW_THREADS
570 fp = fopen(filename, "r");
571 Py_END_ALLOW_THREADS
572
573 if (fp == NULL) {
574 exists = 0;
575 }
576 }
577
578 if (!exists) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000580 return NULL;
581 }
Tim Peters5ba58662001-07-16 02:29:45 +0000582 cf.cf_flags = 0;
583 if (PyEval_MergeCompilerFlags(&cf))
Tim Peters748b8bb2001-04-28 08:20:22 +0000584 res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000585 locals, 1, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +0000586 else
Tim Peters748b8bb2001-04-28 08:20:22 +0000587 res = PyRun_FileEx(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000588 locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000589 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000590}
591
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000592static char execfile_doc[] =
593"execfile(filename[, globals[, locals]])\n\
594\n\
595Read and execute a Python script from a file.\n\
596The globals and locals are dictionaries, defaulting to the current\n\
597globals and locals. If only globals is given, locals defaults to it.";
598
599
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000601builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000602{
Guido van Rossum950ff291998-06-29 13:38:57 +0000603 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000605
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000606 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000607 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000608#ifdef Py_USING_UNICODE
Jeremy Hylton0eb11152001-07-30 22:39:31 +0000609 if (PyUnicode_Check(name)) {
610 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
611 if (name == NULL)
612 return NULL;
613 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000614#endif
Jeremy Hylton0eb11152001-07-30 22:39:31 +0000615
616 if (!PyString_Check(name)) {
617 PyErr_SetString(PyExc_TypeError,
618 "attribute name must be string");
619 return NULL;
620 }
Guido van Rossum950ff291998-06-29 13:38:57 +0000621 result = PyObject_GetAttr(v, name);
Guido van Rossumd8923572001-10-16 21:31:32 +0000622 if (result == NULL && dflt != NULL &&
623 PyErr_ExceptionMatches(PyExc_AttributeError))
624 {
Guido van Rossum950ff291998-06-29 13:38:57 +0000625 PyErr_Clear();
626 Py_INCREF(dflt);
627 result = dflt;
628 }
629 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630}
631
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000632static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000633"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000634\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000635Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
636When a default argument is given, it is returned when the attribute doesn't\n\
637exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000638
639
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000641builtin_globals(PyObject *self)
Guido van Rossum872537c1995-07-07 22:43:42 +0000642{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000644
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 d = PyEval_GetGlobals();
646 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000647 return d;
648}
649
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000650static char globals_doc[] =
651"globals() -> dictionary\n\
652\n\
653Return the dictionary containing the current scope's global variables.";
654
655
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000657builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000658{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659 PyObject *v;
660 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000661
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000662 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000663 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000664#ifdef Py_USING_UNICODE
Jeremy Hylton302b54a2001-07-30 22:45:19 +0000665 if (PyUnicode_Check(name)) {
666 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
667 if (name == NULL)
668 return NULL;
669 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000670#endif
Jeremy Hylton302b54a2001-07-30 22:45:19 +0000671
672 if (!PyString_Check(name)) {
673 PyErr_SetString(PyExc_TypeError,
674 "attribute name must be string");
675 return NULL;
676 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000678 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000679 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000680 Py_INCREF(Py_False);
681 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000682 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000684 Py_INCREF(Py_True);
685 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000686}
687
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000688static char hasattr_doc[] =
689"hasattr(object, name) -> Boolean\n\
690\n\
691Return whether the object has an attribute with the given name.\n\
692(This is done by calling getattr(object, name) and catching exceptions.)";
693
694
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000696builtin_id(PyObject *self, PyObject *v)
Guido van Rossum5b722181993-03-30 17:46:03 +0000697{
Guido van Rossum106f2da2000-06-28 21:12:25 +0000698 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000699}
700
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000701static char id_doc[] =
702"id(object) -> integer\n\
703\n\
704Return the identity of an object. This is guaranteed to be unique among\n\
705simultaneously existing objects. (Hint: it's the object's memory address.)";
706
707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000709builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000710{
711 typedef struct {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000712 PyObject *it; /* the iterator object */
713 int saw_StopIteration; /* bool: did the iterator end? */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000714 } sequence;
715
Guido van Rossum79f25d91997-04-29 20:08:16 +0000716 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000717 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000718 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000719 register int i, j;
720
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000722 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 PyErr_SetString(PyExc_TypeError,
724 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000725 return NULL;
726 }
727
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000729 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000730
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000731 if (func == Py_None && n == 1) {
732 /* map(None, S) is the same as list(S). */
733 return PySequence_List(PyTuple_GetItem(args, 1));
734 }
735
Tim Peters4e9afdc2001-05-03 23:54:49 +0000736 /* Get space for sequence descriptors. Must NULL out the iterator
737 * pointers so that jumping to Fail_2 later doesn't see trash.
738 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
740 PyErr_NoMemory();
Tim Peters4e9afdc2001-05-03 23:54:49 +0000741 return NULL;
742 }
743 for (i = 0; i < n; ++i) {
744 seqs[i].it = (PyObject*)NULL;
745 seqs[i].saw_StopIteration = 0;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000746 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000747
Tim Peters4e9afdc2001-05-03 23:54:49 +0000748 /* Do a first pass to obtain iterators for the arguments, and set len
749 * to the largest of their lengths.
Tim Peters748b8bb2001-04-28 08:20:22 +0000750 */
Tim Peters4e9afdc2001-05-03 23:54:49 +0000751 len = 0;
752 for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
753 PyObject *curseq;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000754 int curlen;
Guido van Rossumad991772001-01-12 16:03:05 +0000755
Tim Peters4e9afdc2001-05-03 23:54:49 +0000756 /* Get iterator. */
757 curseq = PyTuple_GetItem(args, i+1);
758 sqp->it = PyObject_GetIter(curseq);
759 if (sqp->it == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000760 static char errmsg[] =
Tim Peters4e9afdc2001-05-03 23:54:49 +0000761 "argument %d to map() must support iteration";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000762 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000763 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000765 goto Fail_2;
766 }
767
Tim Peters4e9afdc2001-05-03 23:54:49 +0000768 /* Update len. */
769 curlen = -1; /* unknown */
770 if (PySequence_Check(curseq) &&
771 curseq->ob_type->tp_as_sequence->sq_length) {
772 curlen = PySequence_Size(curseq);
773 if (curlen < 0)
774 PyErr_Clear();
775 }
Tim Peters748b8bb2001-04-28 08:20:22 +0000776 if (curlen < 0)
Tim Peters4e9afdc2001-05-03 23:54:49 +0000777 curlen = 8; /* arbitrary */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000778 if (curlen > len)
779 len = curlen;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000780 }
781
Tim Peters4e9afdc2001-05-03 23:54:49 +0000782 /* Get space for the result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000784 goto Fail_2;
785
Tim Peters4e9afdc2001-05-03 23:54:49 +0000786 /* Iterate over the sequences until all have stopped. */
Guido van Rossum2d951851994-08-29 12:52:16 +0000787 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 PyObject *alist, *item=NULL, *value;
Tim Peters4e9afdc2001-05-03 23:54:49 +0000789 int numactive = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000790
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000792 alist = NULL;
Tim Peters4e9afdc2001-05-03 23:54:49 +0000793 else if ((alist = PyTuple_New(n)) == NULL)
794 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000795
796 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000797 if (sqp->saw_StopIteration) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 Py_INCREF(Py_None);
799 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000800 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000801 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000802 item = PyIter_Next(sqp->it);
803 if (item)
804 ++numactive;
805 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000806 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +0000807 Py_XDECREF(alist);
808 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000809 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000810 Py_INCREF(Py_None);
811 item = Py_None;
812 sqp->saw_StopIteration = 1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000813 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000814 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000815 if (alist)
816 PyTuple_SET_ITEM(alist, j, item);
817 else
Guido van Rossum2d951851994-08-29 12:52:16 +0000818 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000819 }
820
Guido van Rossum32120311995-07-10 13:52:21 +0000821 if (!alist)
822 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000823
Tim Peters4e9afdc2001-05-03 23:54:49 +0000824 if (numactive == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000826 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000827 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000828
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000830 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000831 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 value = PyEval_CallObject(func, alist);
833 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000834 if (value == NULL)
835 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000836 }
837 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +0000838 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +0000839 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +0000840 if (status < 0)
841 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000842 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000843 else if (PyList_SetItem(result, i, value) < 0)
844 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000845 }
846
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000847 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
848 goto Fail_1;
849
Tim Peters4e9afdc2001-05-03 23:54:49 +0000850 goto Succeed;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000851
Guido van Rossum12d12c51993-10-26 17:58:25 +0000852Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000854Fail_2:
Tim Peters4e9afdc2001-05-03 23:54:49 +0000855 result = NULL;
856Succeed:
857 assert(seqs);
858 for (i = 0; i < n; ++i)
859 Py_XDECREF(seqs[i].it);
860 PyMem_DEL(seqs);
861 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000862}
863
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000864static char map_doc[] =
865"map(function, sequence[, sequence, ...]) -> list\n\
866\n\
867Return a list of the results of applying the function to the items of\n\
868the argument sequence(s). If more than one sequence is given, the\n\
869function is called with an argument list consisting of the corresponding\n\
870item of each sequence, substituting None for missing values when not all\n\
871sequences have the same length. If the function is None, return a list of\n\
872the items of the sequence (or a list of tuples if more than one sequence).";
873
874
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000876builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000877{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 PyObject *v;
879 PyObject *name;
880 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000882 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000883 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000885 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000886 Py_INCREF(Py_None);
887 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000888}
889
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000890static char setattr_doc[] =
891"setattr(object, name, value)\n\
892\n\
893Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
894``x.y = v''.";
895
896
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000898builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000899{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 PyObject *v;
901 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000902
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000903 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000904 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000906 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 Py_INCREF(Py_None);
908 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000909}
910
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000911static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +0000912"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000913\n\
914Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
915``del x.y''.";
916
917
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000919builtin_hash(PyObject *self, PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000920{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000921 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000924 if (x == -1)
925 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000927}
928
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000929static char hash_doc[] =
930"hash(object) -> integer\n\
931\n\
932Return a hash value for the object. Two objects with the same value have\n\
933the same hash value. The reverse is not necessarily true, but likely.";
934
935
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000937builtin_hex(PyObject *self, PyObject *v)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000938{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000940
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000942 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000944 "hex() argument can't be converted to hex");
945 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000946 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000947 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000948}
949
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000950static char hex_doc[] =
951"hex(number) -> string\n\
952\n\
953Return the hexadecimal representation of an integer or long integer.";
954
955
Tim Petersdbd9ba62000-07-09 03:09:57 +0000956static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000957
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000959builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000960{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000962 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *res;
964 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000965
966 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000967 if (line == NULL)
968 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 return NULL;
971 while (*str == ' ' || *str == '\t')
972 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 globals = PyEval_GetGlobals();
974 locals = PyEval_GetLocals();
975 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
976 if (PyDict_SetItemString(globals, "__builtins__",
977 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000978 return NULL;
979 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000980 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000982 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000983}
984
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000985static char input_doc[] =
986"input([prompt]) -> value\n\
987\n\
988Equivalent to eval(raw_input(prompt)).";
989
990
Guido van Rossume8811f81997-02-14 15:48:05 +0000991static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000992builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +0000993{
994 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +0000995 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +0000996 return NULL;
997 Py_INCREF(s);
998 PyString_InternInPlace(&s);
999 return s;
1000}
1001
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001002static char intern_doc[] =
1003"intern(string) -> string\n\
1004\n\
1005``Intern'' the given string. This enters the string in the (global)\n\
1006table of interned strings whose purpose is to speed up dictionary lookups.\n\
1007Return the string itself or the previously interned string object with the\n\
1008same value.";
1009
1010
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011static PyObject *
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001012builtin_iter(PyObject *self, PyObject *args)
1013{
1014 PyObject *v, *w = NULL;
1015
1016 if (!PyArg_ParseTuple(args, "O|O:iter", &v, &w))
1017 return NULL;
1018 if (w == NULL)
1019 return PyObject_GetIter(v);
1020 if (!PyCallable_Check(v)) {
1021 PyErr_SetString(PyExc_TypeError,
1022 "iter(v, w): v must be callable");
1023 return NULL;
1024 }
1025 return PyCallIter_New(v, w);
1026}
1027
1028static char iter_doc[] =
1029"iter(collection) -> iterator\n\
1030iter(callable, sentinel) -> iterator\n\
1031\n\
1032Get an iterator from an object. In the first form, the argument must\n\
1033supply its own iterator, or be a sequence.\n\
1034In the second form, the callable is called until it returns the sentinel.";
1035
1036
1037static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001038builtin_len(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001039{
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001040 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001041
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001042 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001043 if (res < 0 && PyErr_Occurred())
1044 return NULL;
1045 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001046}
1047
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001048static char len_doc[] =
1049"len(object) -> integer\n\
1050\n\
1051Return the number of items of a sequence or mapping.";
1052
1053
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001055builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001056{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001057 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001058
Guido van Rossum09df08a1998-05-22 00:51:39 +00001059 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001060
Guido van Rossum09df08a1998-05-22 00:51:39 +00001061 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1062 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001063
Guido van Rossum09df08a1998-05-22 00:51:39 +00001064 /* This swapping of stop and start is to maintain similarity with
1065 range(). */
1066 if (stop == NULL) {
1067 stop = start;
1068 start = NULL;
1069 }
1070 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001071}
1072
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001073static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001074"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001075\n\
1076Create a slice object. This is used for slicing by the Numeric extensions.";
1077
1078
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001080builtin_locals(PyObject *self)
Guido van Rossum872537c1995-07-07 22:43:42 +00001081{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001083
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 d = PyEval_GetLocals();
1085 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001086 return d;
1087}
1088
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001089static char locals_doc[] =
1090"locals() -> dictionary\n\
1091\n\
1092Return the dictionary containing the current scope's local variables.";
1093
1094
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095static PyObject *
Guido van Rossum53451b32001-01-17 15:47:24 +00001096min_max(PyObject *args, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001097{
Tim Petersc3074532001-05-03 07:00:32 +00001098 PyObject *v, *w, *x, *it;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001099
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001103 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001104
1105 it = PyObject_GetIter(v);
1106 if (it == NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001107 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001108
1109 w = NULL; /* the result */
Tim Petersf4848da2001-05-05 00:14:56 +00001110 for (;;) {
Tim Petersc3074532001-05-03 07:00:32 +00001111 x = PyIter_Next(it);
Guido van Rossum2d951851994-08-29 12:52:16 +00001112 if (x == NULL) {
Tim Petersc3074532001-05-03 07:00:32 +00001113 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001114 Py_XDECREF(w);
1115 Py_DECREF(it);
1116 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001117 }
Tim Petersc3074532001-05-03 07:00:32 +00001118 break;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001119 }
Tim Petersc3074532001-05-03 07:00:32 +00001120
Guido van Rossum2d951851994-08-29 12:52:16 +00001121 if (w == NULL)
1122 w = x;
1123 else {
Guido van Rossum53451b32001-01-17 15:47:24 +00001124 int cmp = PyObject_RichCompareBool(x, w, op);
1125 if (cmp > 0) {
1126 Py_DECREF(w);
1127 w = x;
1128 }
1129 else if (cmp < 0) {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001130 Py_DECREF(x);
Tim Petersc3074532001-05-03 07:00:32 +00001131 Py_DECREF(w);
1132 Py_DECREF(it);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001133 return NULL;
1134 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001135 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001137 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001138 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001139 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001140 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001141 "min() or max() arg is an empty sequence");
Tim Petersc3074532001-05-03 07:00:32 +00001142 Py_DECREF(it);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001143 return w;
1144}
1145
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001147builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148{
Guido van Rossum53451b32001-01-17 15:47:24 +00001149 return min_max(v, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001150}
1151
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001152static char min_doc[] =
1153"min(sequence) -> value\n\
1154min(a, b, c, ...) -> value\n\
1155\n\
1156With a single sequence argument, return its smallest item.\n\
1157With two or more arguments, return the smallest argument.";
1158
1159
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001161builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162{
Guido van Rossum53451b32001-01-17 15:47:24 +00001163 return min_max(v, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001164}
1165
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001166static char max_doc[] =
1167"max(sequence) -> value\n\
1168max(a, b, c, ...) -> value\n\
1169\n\
1170With a single sequence argument, return its largest item.\n\
1171With two or more arguments, return the largest argument.";
1172
1173
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001175builtin_oct(PyObject *self, PyObject *v)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001176{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001179 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1180 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001182 "oct() argument can't be converted to oct");
1183 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001184 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001185 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001186}
1187
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001188static char oct_doc[] =
1189"oct(number) -> string\n\
1190\n\
1191Return the octal representation of an integer or long integer.";
1192
1193
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001195builtin_ord(PyObject *self, PyObject* obj)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196{
Guido van Rossum09095f32000-03-10 23:00:52 +00001197 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001198 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001200 if (PyString_Check(obj)) {
1201 size = PyString_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001202 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001203 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001204 return PyInt_FromLong(ord);
1205 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001206#ifdef Py_USING_UNICODE
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001207 } else if (PyUnicode_Check(obj)) {
1208 size = PyUnicode_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001209 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001210 ord = (long)*PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001211 return PyInt_FromLong(ord);
1212 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001213#endif
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001214 } else {
1215 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001216 "ord() expected string of length 1, but " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001217 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001218 return NULL;
1219 }
1220
Guido van Rossumad991772001-01-12 16:03:05 +00001221 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001222 "ord() expected a character, "
1223 "but string of length %d found",
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001224 size);
1225 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001226}
1227
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001228static char ord_doc[] =
1229"ord(c) -> integer\n\
1230\n\
Guido van Rossumad991772001-01-12 16:03:05 +00001231Return the integer ordinal of a one-character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001232
1233
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001235builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001236{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001237 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001238
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001240 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001241 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001242}
1243
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001244static char pow_doc[] =
1245"pow(x, y[, z]) -> number\n\
1246\n\
1247With two arguments, equivalent to x**y. With three arguments,\n\
1248equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1249
1250
Guido van Rossum124eff01999-02-23 16:11:01 +00001251/* Return number of items in range/xrange (lo, hi, step). step > 0
1252 * required. Return a value < 0 if & only if the true value is too
1253 * large to fit in a signed long.
1254 */
1255static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001256get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001257{
1258 /* -------------------------------------------------------------
1259 If lo >= hi, the range is empty.
1260 Else if n values are in the range, the last one is
1261 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1262 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1263 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1264 the RHS is non-negative and so truncation is the same as the
1265 floor. Letting M be the largest positive long, the worst case
1266 for the RHS numerator is hi=M, lo=-M-1, and then
1267 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1268 precision to compute the RHS exactly.
1269 ---------------------------------------------------------------*/
1270 long n = 0;
1271 if (lo < hi) {
1272 unsigned long uhi = (unsigned long)hi;
1273 unsigned long ulo = (unsigned long)lo;
1274 unsigned long diff = uhi - ulo - 1;
1275 n = (long)(diff / (unsigned long)step + 1);
1276 }
1277 return n;
1278}
1279
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001281builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001282{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001284 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001285 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001286
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001288
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 if (PyTuple_Size(args) <= 1) {
1290 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001291 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292 &ihigh))
1293 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001294 }
1295 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001297 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001300 }
1301 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001302 PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001303 return NULL;
1304 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001305 if (istep > 0)
1306 bign = get_len_of_range(ilow, ihigh, istep);
1307 else
1308 bign = get_len_of_range(ihigh, ilow, -istep);
1309 n = (int)bign;
1310 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001311 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001312 "range() result has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001313 return NULL;
1314 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001316 if (v == NULL)
1317 return NULL;
1318 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001320 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001322 return NULL;
1323 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001324 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001325 ilow += istep;
1326 }
1327 return v;
1328}
1329
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001330static char range_doc[] =
1331"range([start,] stop[, step]) -> list of integers\n\
1332\n\
1333Return a list containing an arithmetic progression of integers.\n\
1334range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1335When step is given, it specifies the increment (or decrement).\n\
1336For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1337These are exactly the valid indices for a list of 4 elements.";
1338
1339
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001341builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001342{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001343 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001344 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001345
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 if (PyTuple_Size(args) <= 1) {
1347 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001348 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001349 &ihigh))
1350 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001351 }
1352 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001353 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001354 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001355 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001356 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001357 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001358 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001359 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001360 return NULL;
1361 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001363 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001365 n = get_len_of_range(ihigh, ilow, -istep);
1366 if (n < 0) {
1367 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001368 "xrange() result has too many items");
Guido van Rossum124eff01999-02-23 16:11:01 +00001369 return NULL;
1370 }
Thomas Woutersefafcea2001-07-09 12:30:54 +00001371 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001372}
1373
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001374static char xrange_doc[] =
1375"xrange([start,] stop[, step]) -> xrange object\n\
1376\n\
1377Like range(), but instead of returning a list, returns an object that\n\
1378generates the numbers in the range on demand. This is slightly slower\n\
1379than range() but more memory efficient.";
1380
1381
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001383builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001384{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 PyObject *v = NULL;
1386 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001389 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1391 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001392 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001394 char *prompt;
1395 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001397 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001399 if (po == NULL)
1400 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001402 if (prompt == NULL)
1403 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001404 }
1405 else {
1406 po = NULL;
1407 prompt = "";
1408 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 s = PyOS_Readline(prompt);
1410 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001411 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001413 return NULL;
1414 }
1415 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001417 result = NULL;
1418 }
1419 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001420 size_t len = strlen(s);
1421 if (len > INT_MAX) {
1422 PyErr_SetString(PyExc_OverflowError, "input too long");
1423 result = NULL;
1424 }
1425 else {
1426 result = PyString_FromStringAndSize(s, (int)(len-1));
1427 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001428 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001429 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001430 return result;
1431 }
Guido van Rossum90933611991-06-07 16:10:43 +00001432 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001433 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001434 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001436 return NULL;
1437 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001438 if (Py_FlushLine() != 0 ||
1439 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001440 return NULL;
1441 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001443 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001445 return NULL;
1446 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001448}
1449
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001450static char raw_input_doc[] =
1451"raw_input([prompt]) -> string\n\
1452\n\
1453Read a string from standard input. The trailing newline is stripped.\n\
1454If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1455On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1456is printed without a trailing newline before reading.";
1457
1458
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001460builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001461{
Tim Peters15d81ef2001-05-04 04:39:21 +00001462 PyObject *seq, *func, *result = NULL, *it;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001463
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465 return NULL;
1466 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001468
Tim Peters15d81ef2001-05-04 04:39:21 +00001469 it = PyObject_GetIter(seq);
1470 if (it == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 PyErr_SetString(PyExc_TypeError,
Tim Peters15d81ef2001-05-04 04:39:21 +00001472 "reduce() arg 2 must support iteration");
1473 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001474 return NULL;
1475 }
1476
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001478 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001479
Tim Peters15d81ef2001-05-04 04:39:21 +00001480 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001482
1483 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 Py_DECREF(args);
1485 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001486 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001487 }
1488
Tim Peters15d81ef2001-05-04 04:39:21 +00001489 op2 = PyIter_Next(it);
1490 if (op2 == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +00001491 if (PyErr_Occurred())
1492 goto Fail;
1493 break;
Guido van Rossum2d951851994-08-29 12:52:16 +00001494 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001495
Guido van Rossum2d951851994-08-29 12:52:16 +00001496 if (result == NULL)
1497 result = op2;
1498 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 PyTuple_SetItem(args, 0, result);
1500 PyTuple_SetItem(args, 1, op2);
1501 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001502 goto Fail;
1503 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001504 }
1505
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001507
Guido van Rossum2d951851994-08-29 12:52:16 +00001508 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001510 "reduce() of empty sequence with no initial value");
Guido van Rossum2d951851994-08-29 12:52:16 +00001511
Tim Peters15d81ef2001-05-04 04:39:21 +00001512 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001513 return result;
1514
Guido van Rossum2d951851994-08-29 12:52:16 +00001515Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516 Py_XDECREF(args);
1517 Py_XDECREF(result);
Tim Peters15d81ef2001-05-04 04:39:21 +00001518 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001519 return NULL;
1520}
1521
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001522static char reduce_doc[] =
1523"reduce(function, sequence[, initial]) -> value\n\
1524\n\
1525Apply a function of two arguments cumulatively to the items of a sequence,\n\
1526from left to right, so as to reduce the sequence to a single value.\n\
1527For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1528((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1529of the sequence in the calculation, and serves as a default when the\n\
1530sequence is empty.";
1531
1532
Guido van Rossum79f25d91997-04-29 20:08:16 +00001533static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001534builtin_reload(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537}
1538
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001539static char reload_doc[] =
1540"reload(module) -> module\n\
1541\n\
1542Reload the module. The module must have been successfully imported before.";
1543
1544
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001546builtin_repr(PyObject *self, PyObject *v)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001547{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001549}
1550
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001551static char repr_doc[] =
1552"repr(object) -> string\n\
1553\n\
1554Return the canonical string representation of the object.\n\
1555For most object types, eval(repr(object)) == object.";
1556
1557
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001559builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001560{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001561 double x;
1562 double f;
1563 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001564 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001565
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001567 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001568 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001569 i = abs(ndigits);
1570 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001571 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001572 if (ndigits < 0)
1573 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001574 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001575 x *= f;
1576 if (x >= 0.0)
1577 x = floor(x + 0.5);
1578 else
1579 x = ceil(x - 0.5);
1580 if (ndigits < 0)
1581 x *= f;
1582 else
1583 x /= f;
1584 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001585}
1586
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001587static char round_doc[] =
1588"round(number[, ndigits]) -> floating point number\n\
1589\n\
1590Round a number to a given precision in decimal digits (default 0 digits).\n\
1591This always returns a floating point number. Precision may be negative.";
1592
1593
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001596{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 PyObject *v = NULL;
1598 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001599
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001601 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001602 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001604 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001605 if (!PyErr_Occurred())
1606 PyErr_SetString(PyExc_SystemError,
1607 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001608 }
1609 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001611 }
1612 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001614 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001616 "vars() argument must have __dict__ attribute");
1617 return NULL;
1618 }
1619 }
1620 return d;
1621}
1622
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001623static char vars_doc[] =
1624"vars([object]) -> dictionary\n\
1625\n\
1626Without arguments, equivalent to locals().\n\
1627With an argument, equivalent to object.__dict__.";
1628
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001629static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001630builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001631{
1632 PyObject *inst;
1633 PyObject *cls;
Guido van Rossum823649d2001-03-21 18:40:58 +00001634 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001635
Guido van Rossum43713e52000-02-29 13:59:29 +00001636 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001637 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001638
Guido van Rossum823649d2001-03-21 18:40:58 +00001639 retval = PyObject_IsInstance(inst, cls);
1640 if (retval < 0)
Guido van Rossumad991772001-01-12 16:03:05 +00001641 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001642 return PyInt_FromLong(retval);
1643}
1644
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001645static char isinstance_doc[] =
Guido van Rossum03290ec2001-10-07 20:54:12 +00001646"isinstance(object, class-or-type-or-tuple) -> Boolean\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001647\n\
1648Return whether an object is an instance of a class or of a subclass thereof.\n\
Guido van Rossum03290ec2001-10-07 20:54:12 +00001649With a type as second argument, return whether that is the object's type.\n\
1650The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\
1651isinstance(x, A) or isinstance(x, B) or ... (etc.).";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001652
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001653
1654static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001655builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001656{
1657 PyObject *derived;
1658 PyObject *cls;
1659 int retval;
1660
Guido van Rossum43713e52000-02-29 13:59:29 +00001661 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001662 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00001663
Guido van Rossum823649d2001-03-21 18:40:58 +00001664 retval = PyObject_IsSubclass(derived, cls);
1665 if (retval < 0)
1666 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001667 return PyInt_FromLong(retval);
1668}
1669
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001670static char issubclass_doc[] =
1671"issubclass(C, B) -> Boolean\n\
1672\n\
1673Return whether class C is a subclass (i.e., a derived class) of class B.";
1674
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001675
Barry Warsawbd599b52000-08-03 15:45:29 +00001676static PyObject*
1677builtin_zip(PyObject *self, PyObject *args)
1678{
1679 PyObject *ret;
1680 int itemsize = PySequence_Length(args);
Tim Peters8572b4f2001-05-06 01:05:02 +00001681 int i;
1682 PyObject *itlist; /* tuple of iterators */
Barry Warsawbd599b52000-08-03 15:45:29 +00001683
1684 if (itemsize < 1) {
1685 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001686 "zip() requires at least one sequence");
Barry Warsawbd599b52000-08-03 15:45:29 +00001687 return NULL;
1688 }
1689 /* args must be a tuple */
1690 assert(PyTuple_Check(args));
1691
Tim Peters8572b4f2001-05-06 01:05:02 +00001692 /* allocate result list */
Barry Warsawbd599b52000-08-03 15:45:29 +00001693 if ((ret = PyList_New(0)) == NULL)
1694 return NULL;
1695
Tim Peters8572b4f2001-05-06 01:05:02 +00001696 /* obtain iterators */
1697 itlist = PyTuple_New(itemsize);
1698 if (itlist == NULL)
1699 goto Fail_ret;
1700 for (i = 0; i < itemsize; ++i) {
1701 PyObject *item = PyTuple_GET_ITEM(args, i);
1702 PyObject *it = PyObject_GetIter(item);
1703 if (it == NULL) {
1704 if (PyErr_ExceptionMatches(PyExc_TypeError))
1705 PyErr_Format(PyExc_TypeError,
1706 "zip argument #%d must support iteration",
1707 i+1);
1708 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00001709 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001710 PyTuple_SET_ITEM(itlist, i, it);
1711 }
Barry Warsawbd599b52000-08-03 15:45:29 +00001712
Tim Peters8572b4f2001-05-06 01:05:02 +00001713 /* build result into ret list */
1714 for (;;) {
1715 int status;
1716 PyObject *next = PyTuple_New(itemsize);
1717 if (!next)
1718 goto Fail_ret_itlist;
1719
1720 for (i = 0; i < itemsize; i++) {
1721 PyObject *it = PyTuple_GET_ITEM(itlist, i);
1722 PyObject *item = PyIter_Next(it);
Barry Warsawbd599b52000-08-03 15:45:29 +00001723 if (!item) {
Tim Peters8572b4f2001-05-06 01:05:02 +00001724 if (PyErr_Occurred()) {
1725 Py_DECREF(ret);
1726 ret = NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00001727 }
1728 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00001729 Py_DECREF(itlist);
1730 return ret;
Barry Warsawbd599b52000-08-03 15:45:29 +00001731 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001732 PyTuple_SET_ITEM(next, i, item);
Barry Warsawbd599b52000-08-03 15:45:29 +00001733 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001734
1735 status = PyList_Append(ret, next);
Barry Warsawbd599b52000-08-03 15:45:29 +00001736 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00001737 if (status < 0)
1738 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00001739 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001740
1741Fail_ret_itlist:
1742 Py_DECREF(itlist);
1743Fail_ret:
1744 Py_DECREF(ret);
1745 return NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00001746}
1747
1748
1749static char zip_doc[] =
1750"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
1751\n\
1752Return a list of tuples, where each tuple contains the i-th element\n\
1753from each of the argument sequences. The returned list is truncated\n\
1754in length to the length of the shortest argument sequence.";
1755
1756
Guido van Rossum79f25d91997-04-29 20:08:16 +00001757static PyMethodDef builtin_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001758 {"__import__", builtin___import__, METH_VARARGS, import_doc},
1759 {"abs", builtin_abs, METH_O, abs_doc},
1760 {"apply", builtin_apply, METH_VARARGS, apply_doc},
1761 {"buffer", builtin_buffer, METH_VARARGS, buffer_doc},
1762 {"callable", builtin_callable, METH_O, callable_doc},
1763 {"chr", builtin_chr, METH_VARARGS, chr_doc},
1764 {"cmp", builtin_cmp, METH_VARARGS, cmp_doc},
1765 {"coerce", builtin_coerce, METH_VARARGS, coerce_doc},
1766 {"compile", builtin_compile, METH_VARARGS, compile_doc},
1767 {"delattr", builtin_delattr, METH_VARARGS, delattr_doc},
1768 {"dir", builtin_dir, METH_VARARGS, dir_doc},
1769 {"divmod", builtin_divmod, METH_VARARGS, divmod_doc},
1770 {"eval", builtin_eval, METH_VARARGS, eval_doc},
1771 {"execfile", builtin_execfile, METH_VARARGS, execfile_doc},
1772 {"filter", builtin_filter, METH_VARARGS, filter_doc},
1773 {"getattr", builtin_getattr, METH_VARARGS, getattr_doc},
1774 {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc},
1775 {"hasattr", builtin_hasattr, METH_VARARGS, hasattr_doc},
1776 {"hash", builtin_hash, METH_O, hash_doc},
1777 {"hex", builtin_hex, METH_O, hex_doc},
1778 {"id", builtin_id, METH_O, id_doc},
1779 {"input", builtin_input, METH_VARARGS, input_doc},
1780 {"intern", builtin_intern, METH_VARARGS, intern_doc},
1781 {"isinstance", builtin_isinstance, METH_VARARGS, isinstance_doc},
1782 {"issubclass", builtin_issubclass, METH_VARARGS, issubclass_doc},
1783 {"iter", builtin_iter, METH_VARARGS, iter_doc},
1784 {"len", builtin_len, METH_O, len_doc},
1785 {"locals", (PyCFunction)builtin_locals, METH_NOARGS, locals_doc},
1786 {"map", builtin_map, METH_VARARGS, map_doc},
1787 {"max", builtin_max, METH_VARARGS, max_doc},
1788 {"min", builtin_min, METH_VARARGS, min_doc},
1789 {"oct", builtin_oct, METH_O, oct_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001790 {"ord", builtin_ord, METH_O, ord_doc},
1791 {"pow", builtin_pow, METH_VARARGS, pow_doc},
1792 {"range", builtin_range, METH_VARARGS, range_doc},
1793 {"raw_input", builtin_raw_input, METH_VARARGS, raw_input_doc},
1794 {"reduce", builtin_reduce, METH_VARARGS, reduce_doc},
1795 {"reload", builtin_reload, METH_O, reload_doc},
1796 {"repr", builtin_repr, METH_O, repr_doc},
1797 {"round", builtin_round, METH_VARARGS, round_doc},
1798 {"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
1799 {"slice", builtin_slice, METH_VARARGS, slice_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001800#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001801 {"unichr", builtin_unichr, METH_VARARGS, unichr_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001802#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001803 {"vars", builtin_vars, METH_VARARGS, vars_doc},
1804 {"xrange", builtin_xrange, METH_VARARGS, xrange_doc},
1805 {"zip", builtin_zip, METH_VARARGS, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001806 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001807};
1808
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001809static char builtin_doc[] =
1810"Built-in functions, exceptions, and other objects.\n\
1811\n\
1812Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
1813
Guido van Rossum25ce5661997-08-02 03:10:38 +00001814PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001815_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001816{
Fred Drake5550de32000-06-20 04:54:19 +00001817 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001818 mod = Py_InitModule4("__builtin__", builtin_methods,
1819 builtin_doc, (PyObject *)NULL,
1820 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001821 if (mod == NULL)
1822 return NULL;
1823 dict = PyModule_GetDict(mod);
Tim Peters4b7625e2001-09-13 21:37:17 +00001824
1825#define SETBUILTIN(NAME, OBJECT) \
1826 if (PyDict_SetItemString(dict, NAME, (PyObject *)OBJECT) < 0) \
1827 return NULL
1828
1829 SETBUILTIN("None", Py_None);
1830 SETBUILTIN("Ellipsis", Py_Ellipsis);
1831 SETBUILTIN("NotImplemented", Py_NotImplemented);
1832 SETBUILTIN("classmethod", &PyClassMethod_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001833#ifndef WITHOUT_COMPLEX
Tim Peters4b7625e2001-09-13 21:37:17 +00001834 SETBUILTIN("complex", &PyComplex_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001835#endif
Tim Peters4b7625e2001-09-13 21:37:17 +00001836 SETBUILTIN("dictionary", &PyDict_Type);
1837 SETBUILTIN("float", &PyFloat_Type);
1838 SETBUILTIN("property", &PyProperty_Type);
1839 SETBUILTIN("int", &PyInt_Type);
1840 SETBUILTIN("list", &PyList_Type);
1841 SETBUILTIN("long", &PyLong_Type);
1842 SETBUILTIN("object", &PyBaseObject_Type);
1843 SETBUILTIN("staticmethod", &PyStaticMethod_Type);
1844 SETBUILTIN("str", &PyString_Type);
1845 SETBUILTIN("super", &PySuper_Type);
1846 SETBUILTIN("tuple", &PyTuple_Type);
1847 SETBUILTIN("type", &PyType_Type);
Tim Peters742dfd62001-09-13 21:49:44 +00001848
1849 /* Note that open() is just an alias of file(). */
1850 SETBUILTIN("open", &PyFile_Type);
Tim Peters4b7625e2001-09-13 21:37:17 +00001851 SETBUILTIN("file", &PyFile_Type);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001852#ifdef Py_USING_UNICODE
Tim Peters4b7625e2001-09-13 21:37:17 +00001853 SETBUILTIN("unicode", &PyUnicode_Type);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001854#endif
Fred Drake5550de32000-06-20 04:54:19 +00001855 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
1856 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
1857 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001858 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00001859 }
1860 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001861
Guido van Rossum25ce5661997-08-02 03:10:38 +00001862 return mod;
Tim Peters4b7625e2001-09-13 21:37:17 +00001863#undef SETBUILTIN
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864}
1865
Guido van Rossume77a7571993-11-03 15:01:26 +00001866/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001869filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001870{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001872 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001874
Guido van Rossumb7b45621995-08-04 04:07:45 +00001875 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001876 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001877 return tuple;
1878 }
1879
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001881 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001882
Guido van Rossum12d12c51993-10-26 17:58:25 +00001883 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001885 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001888 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889 if (func == Py_None) {
1890 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001891 good = item;
1892 }
1893 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001895 if (arg == NULL)
1896 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 good = PyEval_CallObject(func, arg);
1898 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001899 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001900 goto Fail_1;
1901 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001902 ok = PyObject_IsTrue(good);
1903 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001904 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 Py_INCREF(item);
1906 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001907 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001908 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001909 }
1910
Tim Peters4324aa32001-05-28 22:30:08 +00001911 if (_PyTuple_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001912 return NULL;
1913
Guido van Rossum12d12c51993-10-26 17:58:25 +00001914 return result;
1915
Guido van Rossum12d12c51993-10-26 17:58:25 +00001916Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001918 return NULL;
1919}
1920
1921
Guido van Rossume77a7571993-11-03 15:01:26 +00001922/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001923
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001925filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001926{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001928 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001930
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001932 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001934 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001935 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001937 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001938
Guido van Rossum12d12c51993-10-26 17:58:25 +00001939 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001940 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001941 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001942
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001943 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1944 if (item == NULL)
1945 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 arg = Py_BuildValue("(O)", item);
Tim Peters388ed082001-04-07 20:34:48 +00001947 if (arg == NULL) {
1948 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001949 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00001950 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951 good = PyEval_CallObject(func, arg);
1952 Py_DECREF(arg);
Tim Peters388ed082001-04-07 20:34:48 +00001953 if (good == NULL) {
1954 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001955 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00001956 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 ok = PyObject_IsTrue(good);
1958 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001959 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 PyString_AS_STRING((PyStringObject *)result)[j++] =
1961 PyString_AS_STRING((PyStringObject *)item)[0];
Tim Peters388ed082001-04-07 20:34:48 +00001962 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001963 }
1964
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001966 return NULL;
1967
Guido van Rossum12d12c51993-10-26 17:58:25 +00001968 return result;
1969
Guido van Rossum12d12c51993-10-26 17:58:25 +00001970Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001972 return NULL;
1973}