blob: f5ce74975c10f2119c0ac0063b8e1b1fbf059066 [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
Guido van Rossume2ae77b2001-10-24 20:42:55 +000016#ifdef RISCOS
17#include "unixstuff.h"
18#endif
19
Mark Hammond26cffde42001-05-14 12:17:34 +000020/* The default encoding used by the platform file system APIs
21 Can remain NULL for all platforms that don't have such a concept
22*/
Fredrik Lundh5b979352001-06-26 17:46:10 +000023#if defined(MS_WIN32) && defined(HAVE_USABLE_WCHAR_T)
Mark Hammond26cffde42001-05-14 12:17:34 +000024const char *Py_FileSystemDefaultEncoding = "mbcs";
25#else
26const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
27#endif
Mark Hammondef8b6542001-05-13 08:04:26 +000028
Guido van Rossum12d12c51993-10-26 17:58:25 +000029/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000030static PyObject *filterstring(PyObject *, PyObject *);
31static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000032
Guido van Rossum79f25d91997-04-29 20:08:16 +000033static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000034builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000035{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000036 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000037 PyObject *globals = NULL;
38 PyObject *locals = NULL;
39 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000040
Guido van Rossum79f25d91997-04-29 20:08:16 +000041 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000042 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000043 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000044 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045}
46
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000047static char import_doc[] =
48"__import__(name, globals, locals, fromlist) -> module\n\
49\n\
50Import a module. The globals are only used to determine the context;\n\
51they are not modified. The locals are currently unused. The fromlist\n\
52should be a list of names to emulate ``from name import ...'', or an\n\
53empty list to emulate ``import name''.\n\
54When importing a module from a package, note that __import__('A.B', ...)\n\
55returns package A when fromlist is empty, but its submodule B when\n\
56fromlist is not empty.";
57
Guido van Rossum1ae940a1995-01-02 19:04:15 +000058
Guido van Rossum79f25d91997-04-29 20:08:16 +000059static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000060builtin_abs(PyObject *self, PyObject *v)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061{
Guido van Rossum09df08a1998-05-22 00:51:39 +000062 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000063}
64
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000065static char abs_doc[] =
66"abs(number) -> number\n\
67\n\
68Return the absolute value of the argument.";
69
70
Guido van Rossum79f25d91997-04-29 20:08:16 +000071static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000072builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000073{
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000075 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000076
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000078 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000079 if (alist != NULL) {
80 if (!PyTuple_Check(alist)) {
81 if (!PySequence_Check(alist)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000082 PyErr_Format(PyExc_TypeError,
83 "apply() arg 2 expect sequence, found %s",
84 alist->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000085 return NULL;
86 }
87 t = PySequence_Tuple(alist);
88 if (t == NULL)
89 return NULL;
90 alist = t;
91 }
Guido van Rossum2d951851994-08-29 12:52:16 +000092 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000093 if (kwdict != NULL && !PyDict_Check(kwdict)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000094 PyErr_Format(PyExc_TypeError,
95 "apply() arg 3 expected dictionary, found %s",
96 kwdict->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000097 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000098 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +000099 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
100 finally:
101 Py_XDECREF(t);
102 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000103}
104
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000105static char apply_doc[] =
Fred Drakef1fbc622001-01-12 17:05:05 +0000106"apply(object[, args[, kwargs]]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000107\n\
Fred Drake7b912121999-12-23 14:16:55 +0000108Call a callable object with positional arguments taken from the tuple args,\n\
109and keyword arguments taken from the optional dictionary kwargs.\n\
110Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000111
112
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000114builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000115{
116 PyObject *ob;
117 int offset = 0;
118 int size = Py_END_OF_BUFFER;
119
120 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
121 return NULL;
122 return PyBuffer_FromObject(ob, offset, size);
123}
124
125static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000126"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000127\n\
Guido van Rossumad991772001-01-12 16:03:05 +0000128Create a new buffer object which references the given object.\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000129The buffer will reference a slice of the target object from the\n\
130start of the object (or at the specified offset). The slice will\n\
131extend to the end of the target object (or with the specified size).";
132
133
134static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000135builtin_callable(PyObject *self, PyObject *v)
Guido van Rossum2d951851994-08-29 12:52:16 +0000136{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000138}
139
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000140static char callable_doc[] =
141"callable(object) -> Boolean\n\
142\n\
143Return whether the object is callable (i.e., some kind of function).\n\
144Note that classes are callable, as are instances with a __call__() method.";
145
146
Guido van Rossum79f25d91997-04-29 20:08:16 +0000147static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000148builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149{
Tim Peters0e57abf2001-05-02 07:39:38 +0000150 PyObject *func, *seq, *result, *it;
151 int len; /* guess for result list size */
Tim Petersf4848da2001-05-05 00:14:56 +0000152 register int j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000153
Guido van Rossum79f25d91997-04-29 20:08:16 +0000154 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000155 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156
Tim Peters0e57abf2001-05-02 07:39:38 +0000157 /* Strings and tuples return a result of the same type. */
158 if (PyString_Check(seq))
159 return filterstring(func, seq);
160 if (PyTuple_Check(seq))
161 return filtertuple(func, seq);
162
163 /* Get iterator. */
164 it = PyObject_GetIter(seq);
165 if (it == NULL)
166 return NULL;
167
168 /* Guess a result list size. */
169 len = -1; /* unknown */
170 if (PySequence_Check(seq) &&
171 seq->ob_type->tp_as_sequence->sq_length) {
172 len = PySequence_Size(seq);
173 if (len < 0)
174 PyErr_Clear();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000175 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000176 if (len < 0)
177 len = 8; /* arbitrary */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000178
Tim Peters0e57abf2001-05-02 07:39:38 +0000179 /* Get a result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000181 /* Eww - can modify the list in-place. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000183 result = seq;
184 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000185 else {
Tim Peters0e57abf2001-05-02 07:39:38 +0000186 result = PyList_New(len);
187 if (result == NULL)
188 goto Fail_it;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000189 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000190
Tim Peters0e57abf2001-05-02 07:39:38 +0000191 /* Build the result list. */
Tim Petersf4848da2001-05-05 00:14:56 +0000192 j = 0;
193 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000195 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196
Tim Peters0e57abf2001-05-02 07:39:38 +0000197 item = PyIter_Next(it);
198 if (item == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +0000199 if (PyErr_Occurred())
200 goto Fail_result_it;
Tim Peters0e57abf2001-05-02 07:39:38 +0000201 break;
Guido van Rossum2d951851994-08-29 12:52:16 +0000202 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000203
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000205 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000207 }
208 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyObject *arg = Py_BuildValue("(O)", item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000210 if (arg == NULL) {
211 Py_DECREF(item);
212 goto Fail_result_it;
213 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 good = PyEval_CallObject(func, arg);
215 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000216 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 Py_DECREF(item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000218 goto Fail_result_it;
Guido van Rossum58b68731995-01-10 17:40:55 +0000219 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000221 ok = PyObject_IsTrue(good);
222 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000223 if (ok) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000224 if (j < len)
225 PyList_SET_ITEM(result, j, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000226 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000227 int status = PyList_Append(result, item);
Barry Warsawfa77e091999-01-28 18:49:12 +0000228 Py_DECREF(item);
229 if (status < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000230 goto Fail_result_it;
Guido van Rossum2d951851994-08-29 12:52:16 +0000231 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000232 ++j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000233 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000234 else
235 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000236 }
237
Guido van Rossum12d12c51993-10-26 17:58:25 +0000238
Tim Peters0e57abf2001-05-02 07:39:38 +0000239 /* Cut back result list if len is too big. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000241 goto Fail_result_it;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000242
Tim Peters3c6b1482001-05-21 08:07:05 +0000243 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000244 return result;
245
Tim Peters0e57abf2001-05-02 07:39:38 +0000246Fail_result_it:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 Py_DECREF(result);
Tim Peters0e57abf2001-05-02 07:39:38 +0000248Fail_it:
249 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000250 return NULL;
251}
252
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000253static char filter_doc[] =
254"filter(function, sequence) -> list\n\
255\n\
256Return a list containing those items of sequence for which function(item)\n\
257is true. If function is None, return a list of items that are true.";
258
259
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000261builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000262{
263 long x;
264 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000265
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000267 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000268 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 PyErr_SetString(PyExc_ValueError,
270 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271 return NULL;
272 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000273 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275}
276
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000277static char chr_doc[] =
278"chr(i) -> character\n\
279\n\
280Return a string of one character with ordinal i; 0 <= i < 256.";
281
282
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000283#ifdef Py_USING_UNICODE
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000285builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000286{
287 long x;
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000288 Py_UNICODE s[2];
Guido van Rossum09095f32000-03-10 23:00:52 +0000289
290 if (!PyArg_ParseTuple(args, "l:unichr", &x))
291 return NULL;
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000292
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000293#ifdef Py_UNICODE_WIDE
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000294 if (x < 0 || x > 0x10ffff) {
Guido van Rossum09095f32000-03-10 23:00:52 +0000295 PyErr_SetString(PyExc_ValueError,
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000296 "unichr() arg not in range(0x110000) "
297 "(wide Python build)");
Guido van Rossum09095f32000-03-10 23:00:52 +0000298 return NULL;
299 }
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000300#else
301 if (x < 0 || x > 0xffff) {
302 PyErr_SetString(PyExc_ValueError,
303 "unichr() arg not in range(0x10000) "
304 "(narrow Python build)");
305 return NULL;
306 }
307#endif
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000308
309 if (x <= 0xffff) {
310 /* UCS-2 character */
311 s[0] = (Py_UNICODE) x;
312 return PyUnicode_FromUnicode(s, 1);
Guido van Rossum236d8b72001-06-26 23:12:25 +0000313 }
314 else {
Fredrik Lundh8f455852001-06-27 18:59:43 +0000315#ifndef Py_UNICODE_WIDE
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000316 /* UCS-4 character. store as two surrogate characters */
317 x -= 0x10000L;
318 s[0] = 0xD800 + (Py_UNICODE) (x >> 10);
319 s[1] = 0xDC00 + (Py_UNICODE) (x & 0x03FF);
320 return PyUnicode_FromUnicode(s, 2);
Guido van Rossum236d8b72001-06-26 23:12:25 +0000321#else
322 s[0] = (Py_UNICODE)x;
323 return PyUnicode_FromUnicode(s, 1);
Martin v. Löwis0ba70cc2001-06-26 22:22:37 +0000324#endif
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000325 }
Guido van Rossum09095f32000-03-10 23:00:52 +0000326}
327
328static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000329"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000330\n\
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000331Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.";
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000332#endif
Guido van Rossum09095f32000-03-10 23:00:52 +0000333
334
335static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000336builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000337{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000339 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000340
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000342 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000343 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000344 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000345 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000346}
347
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000348static char cmp_doc[] =
349"cmp(x, y) -> integer\n\
350\n\
351Return negative if x<y, zero if x==y, positive if x>y.";
352
353
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000355builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000356{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 PyObject *v, *w;
358 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000359
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000361 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000362 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000363 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 res = Py_BuildValue("(OO)", v, w);
365 Py_DECREF(v);
366 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000367 return res;
368}
369
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000370static char coerce_doc[] =
371"coerce(x, y) -> None or (x1, y1)\n\
372\n\
373When x and y can be coerced to values of the same type, return a tuple\n\
374containing the coerced values. When they can't be coerced, return None.";
375
376
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000378builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000379{
380 char *str;
381 char *filename;
382 char *startstr;
383 int start;
Tim Peters6cd6a822001-08-17 22:11:27 +0000384 int dont_inherit = 0;
385 int supplied_flags = 0;
Tim Peters5ba58662001-07-16 02:29:45 +0000386 PyCompilerFlags cf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000387
Tim Peters6cd6a822001-08-17 22:11:27 +0000388 if (!PyArg_ParseTuple(args, "sss|ii:compile", &str, &filename,
389 &startstr, &supplied_flags, &dont_inherit))
Guido van Rossum5b722181993-03-30 17:46:03 +0000390 return NULL;
Tim Peters6cd6a822001-08-17 22:11:27 +0000391
Guido van Rossum5b722181993-03-30 17:46:03 +0000392 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000393 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000394 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000395 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000396 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000397 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000398 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000400 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000401 return NULL;
402 }
Tim Peters6cd6a822001-08-17 22:11:27 +0000403
404 if (supplied_flags & ~(PyCF_MASK | PyCF_MASK_OBSOLETE)) {
405 PyErr_SetString(PyExc_ValueError,
406 "compile(): unrecognised flags");
407 return NULL;
408 }
409 /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
410
411 cf.cf_flags = supplied_flags;
412 if (!dont_inherit) {
413 PyEval_MergeCompilerFlags(&cf);
414 }
415 return Py_CompileStringFlags(str, filename, start, &cf);
Guido van Rossum5b722181993-03-30 17:46:03 +0000416}
417
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000418static char compile_doc[] =
Tim Peters6cd6a822001-08-17 22:11:27 +0000419"compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000420\n\
421Compile the source string (a Python module, statement or expression)\n\
422into a code object that can be executed by the exec statement or eval().\n\
423The filename will be used for run-time error messages.\n\
424The mode must be 'exec' to compile a module, 'single' to compile a\n\
Tim Peters6cd6a822001-08-17 22:11:27 +0000425single (interactive) statement, or 'eval' to compile an expression.\n\
426The flags argument, if present, controls which future statements influence\n\
427the compilation of the code.\n\
428The dont_inherit argument, if non-zero, stops the compilation inheriting\n\
429the effects of any future statements in effect in the code calling\n\
430compile; if absent or zero these statements do influence the compilation,\n\
431in addition to any features explicitly specified.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000432
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000434builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000435{
Tim Peters5d2b77c2001-09-03 05:47:38 +0000436 PyObject *arg = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000437
Tim Peters5d2b77c2001-09-03 05:47:38 +0000438 if (!PyArg_ParseTuple(args, "|O:dir", &arg))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000439 return NULL;
Tim Peters7eea37e2001-09-04 22:08:56 +0000440 return PyObject_Dir(arg);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441}
442
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000443static char dir_doc[] =
Tim Peters5d2b77c2001-09-03 05:47:38 +0000444"dir([object]) -> list of strings\n"
445"\n"
446"Return an alphabetized list of names comprising (some of) the attributes\n"
447"of the given object, and of attributes reachable from it:\n"
448"\n"
449"No argument: the names in the current scope.\n"
450"Module object: the module attributes.\n"
Tim Peters37a309d2001-09-04 01:20:04 +0000451"Type or class object: its attributes, and recursively the attributes of\n"
452" its bases.\n"
Tim Peters5d2b77c2001-09-03 05:47:38 +0000453"Otherwise: its attributes, its class's attributes, and recursively the\n"
454" attributes of its class's base classes.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000455
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000457builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000458{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000460
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000462 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000463 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464}
465
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000466static char divmod_doc[] =
467"divmod(x, y) -> (div, mod)\n\
468\n\
469Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
470
471
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000473builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000474{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 PyObject *cmd;
476 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000477 char *str;
Tim Peters9fa96be2001-08-17 23:04:59 +0000478 PyCompilerFlags cf;
Guido van Rossum590baa41993-11-30 13:40:46 +0000479
Guido van Rossum79f25d91997-04-29 20:08:16 +0000480 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000481 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 &PyDict_Type, &globals,
483 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485 if (globals == Py_None) {
486 globals = PyEval_GetGlobals();
487 if (locals == Py_None)
488 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000489 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000491 locals = globals;
Tim Peters9fa96be2001-08-17 23:04:59 +0000492
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
494 if (PyDict_SetItemString(globals, "__builtins__",
495 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000496 return NULL;
497 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000498
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000499 if (PyCode_Check(cmd)) {
Jeremy Hylton733c8932001-12-13 19:51:56 +0000500 if (PyCode_GetNumFree((PyCodeObject *)cmd) > 0) {
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000501 PyErr_SetString(PyExc_TypeError,
502 "code object passed to eval() may not contain free variables");
503 return NULL;
504 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000506 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000507
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000508 if (!PyString_Check(cmd) &&
509 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000511 "eval() arg 1 must be a string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000512 return NULL;
513 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000514 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000515 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 while (*str == ' ' || *str == '\t')
517 str++;
Tim Peters9fa96be2001-08-17 23:04:59 +0000518
519 cf.cf_flags = 0;
520 (void)PyEval_MergeCompilerFlags(&cf);
521 return PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000522}
523
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000524static char eval_doc[] =
525"eval(source[, globals[, locals]]) -> value\n\
526\n\
527Evaluate the source in the context of globals and locals.\n\
528The source may be a string representing a Python expression\n\
529or a code object as returned by compile().\n\
530The globals and locals are dictionaries, defaulting to the current\n\
531globals and locals. If only globals is given, locals defaults to it.";
532
533
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000535builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000536{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 PyObject *globals = Py_None, *locals = Py_None;
539 PyObject *res;
Guido van Rossumb3a639e2001-09-05 13:37:47 +0000540 FILE* fp = NULL;
Tim Peters5ba58662001-07-16 02:29:45 +0000541 PyCompilerFlags cf;
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000542 int exists;
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000543#ifndef RISCOS
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000544 struct stat s;
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000545#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000546
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000548 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 &PyDict_Type, &globals,
550 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000551 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (globals == Py_None) {
553 globals = PyEval_GetGlobals();
554 if (locals == Py_None)
555 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000558 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
560 if (PyDict_SetItemString(globals, "__builtins__",
561 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000562 return NULL;
563 }
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000564
565 exists = 0;
566 /* Test for existence or directory. */
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000567#ifndef RISCOS
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000568 if (!stat(filename, &s)) {
Martin v. Löwisf9836ba2001-08-08 10:28:06 +0000569 if (S_ISDIR(s.st_mode))
Tim Peters603c6832001-11-05 02:45:59 +0000570#if defined(PYOS_OS2) && defined(PYCC_VACPP)
571 errno = EOS2ERR;
572#else
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000573 errno = EISDIR;
Tim Peters603c6832001-11-05 02:45:59 +0000574#endif
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000575 else
576 exists = 1;
577 }
Guido van Rossume2ae77b2001-10-24 20:42:55 +0000578#else
579 if (object_exists(filename)) {
580 if (isdir(filename))
581 errno = EISDIR;
582 else
583 exists = 1;
584 }
585#endif /* RISCOS */
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000586
587 if (exists) {
588 Py_BEGIN_ALLOW_THREADS
589 fp = fopen(filename, "r");
590 Py_END_ALLOW_THREADS
591
592 if (fp == NULL) {
593 exists = 0;
594 }
595 }
596
597 if (!exists) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000599 return NULL;
600 }
Tim Peters5ba58662001-07-16 02:29:45 +0000601 cf.cf_flags = 0;
602 if (PyEval_MergeCompilerFlags(&cf))
Tim Peters748b8bb2001-04-28 08:20:22 +0000603 res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000604 locals, 1, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +0000605 else
Tim Peters748b8bb2001-04-28 08:20:22 +0000606 res = PyRun_FileEx(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000607 locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000608 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000609}
610
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000611static char execfile_doc[] =
612"execfile(filename[, globals[, locals]])\n\
613\n\
614Read and execute a Python script from a file.\n\
615The globals and locals are dictionaries, defaulting to the current\n\
616globals and locals. If only globals is given, locals defaults to it.";
617
618
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000620builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000621{
Guido van Rossum950ff291998-06-29 13:38:57 +0000622 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000624
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000625 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000626 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000627#ifdef Py_USING_UNICODE
Jeremy Hylton0eb11152001-07-30 22:39:31 +0000628 if (PyUnicode_Check(name)) {
629 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
630 if (name == NULL)
631 return NULL;
632 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000633#endif
Jeremy Hylton0eb11152001-07-30 22:39:31 +0000634
635 if (!PyString_Check(name)) {
636 PyErr_SetString(PyExc_TypeError,
637 "attribute name must be string");
638 return NULL;
639 }
Guido van Rossum950ff291998-06-29 13:38:57 +0000640 result = PyObject_GetAttr(v, name);
Guido van Rossumd8923572001-10-16 21:31:32 +0000641 if (result == NULL && dflt != NULL &&
642 PyErr_ExceptionMatches(PyExc_AttributeError))
643 {
Guido van Rossum950ff291998-06-29 13:38:57 +0000644 PyErr_Clear();
645 Py_INCREF(dflt);
646 result = dflt;
647 }
648 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000649}
650
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000651static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000652"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000653\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000654Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
655When a default argument is given, it is returned when the attribute doesn't\n\
656exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000657
658
Guido van Rossum79f25d91997-04-29 20:08:16 +0000659static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000660builtin_globals(PyObject *self)
Guido van Rossum872537c1995-07-07 22:43:42 +0000661{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000663
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 d = PyEval_GetGlobals();
665 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000666 return d;
667}
668
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000669static char globals_doc[] =
670"globals() -> dictionary\n\
671\n\
672Return the dictionary containing the current scope's global variables.";
673
674
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000676builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000677{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 PyObject *v;
679 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000680
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000681 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000682 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000683#ifdef Py_USING_UNICODE
Jeremy Hylton302b54a2001-07-30 22:45:19 +0000684 if (PyUnicode_Check(name)) {
685 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
686 if (name == NULL)
687 return NULL;
688 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000689#endif
Jeremy Hylton302b54a2001-07-30 22:45:19 +0000690
691 if (!PyString_Check(name)) {
692 PyErr_SetString(PyExc_TypeError,
693 "attribute name must be string");
694 return NULL;
695 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000696 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000697 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000698 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000699 Py_INCREF(Py_False);
700 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000701 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000702 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000703 Py_INCREF(Py_True);
704 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000705}
706
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000707static char hasattr_doc[] =
708"hasattr(object, name) -> Boolean\n\
709\n\
710Return whether the object has an attribute with the given name.\n\
711(This is done by calling getattr(object, name) and catching exceptions.)";
712
713
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000715builtin_id(PyObject *self, PyObject *v)
Guido van Rossum5b722181993-03-30 17:46:03 +0000716{
Guido van Rossum106f2da2000-06-28 21:12:25 +0000717 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000718}
719
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000720static char id_doc[] =
721"id(object) -> integer\n\
722\n\
723Return the identity of an object. This is guaranteed to be unique among\n\
724simultaneously existing objects. (Hint: it's the object's memory address.)";
725
726
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000728builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000729{
730 typedef struct {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000731 PyObject *it; /* the iterator object */
732 int saw_StopIteration; /* bool: did the iterator end? */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000733 } sequence;
734
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000736 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000737 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000738 register int i, j;
739
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 PyErr_SetString(PyExc_TypeError,
743 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000744 return NULL;
745 }
746
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000748 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000749
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000750 if (func == Py_None && n == 1) {
751 /* map(None, S) is the same as list(S). */
752 return PySequence_List(PyTuple_GetItem(args, 1));
753 }
754
Tim Peters4e9afdc2001-05-03 23:54:49 +0000755 /* Get space for sequence descriptors. Must NULL out the iterator
756 * pointers so that jumping to Fail_2 later doesn't see trash.
757 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
759 PyErr_NoMemory();
Tim Peters4e9afdc2001-05-03 23:54:49 +0000760 return NULL;
761 }
762 for (i = 0; i < n; ++i) {
763 seqs[i].it = (PyObject*)NULL;
764 seqs[i].saw_StopIteration = 0;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000765 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000766
Tim Peters4e9afdc2001-05-03 23:54:49 +0000767 /* Do a first pass to obtain iterators for the arguments, and set len
768 * to the largest of their lengths.
Tim Peters748b8bb2001-04-28 08:20:22 +0000769 */
Tim Peters4e9afdc2001-05-03 23:54:49 +0000770 len = 0;
771 for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
772 PyObject *curseq;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000773 int curlen;
Guido van Rossumad991772001-01-12 16:03:05 +0000774
Tim Peters4e9afdc2001-05-03 23:54:49 +0000775 /* Get iterator. */
776 curseq = PyTuple_GetItem(args, i+1);
777 sqp->it = PyObject_GetIter(curseq);
778 if (sqp->it == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000779 static char errmsg[] =
Tim Peters4e9afdc2001-05-03 23:54:49 +0000780 "argument %d to map() must support iteration";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000781 char errbuf[sizeof(errmsg) + 25];
Jeremy Hylton518ab1c2001-11-28 20:42:20 +0000782 PyOS_snprintf(errbuf, sizeof(errbuf), errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000784 goto Fail_2;
785 }
786
Tim Peters4e9afdc2001-05-03 23:54:49 +0000787 /* Update len. */
788 curlen = -1; /* unknown */
789 if (PySequence_Check(curseq) &&
790 curseq->ob_type->tp_as_sequence->sq_length) {
791 curlen = PySequence_Size(curseq);
792 if (curlen < 0)
793 PyErr_Clear();
794 }
Tim Peters748b8bb2001-04-28 08:20:22 +0000795 if (curlen < 0)
Tim Peters4e9afdc2001-05-03 23:54:49 +0000796 curlen = 8; /* arbitrary */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000797 if (curlen > len)
798 len = curlen;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000799 }
800
Tim Peters4e9afdc2001-05-03 23:54:49 +0000801 /* Get space for the result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000803 goto Fail_2;
804
Tim Peters4e9afdc2001-05-03 23:54:49 +0000805 /* Iterate over the sequences until all have stopped. */
Guido van Rossum2d951851994-08-29 12:52:16 +0000806 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 PyObject *alist, *item=NULL, *value;
Tim Peters4e9afdc2001-05-03 23:54:49 +0000808 int numactive = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000809
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000811 alist = NULL;
Tim Peters4e9afdc2001-05-03 23:54:49 +0000812 else if ((alist = PyTuple_New(n)) == NULL)
813 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000814
815 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000816 if (sqp->saw_StopIteration) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 Py_INCREF(Py_None);
818 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000819 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000820 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000821 item = PyIter_Next(sqp->it);
822 if (item)
823 ++numactive;
824 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000825 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +0000826 Py_XDECREF(alist);
827 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000828 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000829 Py_INCREF(Py_None);
830 item = Py_None;
831 sqp->saw_StopIteration = 1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000832 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000833 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000834 if (alist)
835 PyTuple_SET_ITEM(alist, j, item);
836 else
Guido van Rossum2d951851994-08-29 12:52:16 +0000837 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000838 }
839
Guido van Rossum32120311995-07-10 13:52:21 +0000840 if (!alist)
841 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000842
Tim Peters4e9afdc2001-05-03 23:54:49 +0000843 if (numactive == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000845 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000846 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000847
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000849 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000850 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 value = PyEval_CallObject(func, alist);
852 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000853 if (value == NULL)
854 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000855 }
856 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +0000857 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +0000858 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +0000859 if (status < 0)
860 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000861 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000862 else if (PyList_SetItem(result, i, value) < 0)
863 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000864 }
865
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000866 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
867 goto Fail_1;
868
Tim Peters4e9afdc2001-05-03 23:54:49 +0000869 goto Succeed;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000870
Guido van Rossum12d12c51993-10-26 17:58:25 +0000871Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000873Fail_2:
Tim Peters4e9afdc2001-05-03 23:54:49 +0000874 result = NULL;
875Succeed:
876 assert(seqs);
877 for (i = 0; i < n; ++i)
878 Py_XDECREF(seqs[i].it);
879 PyMem_DEL(seqs);
880 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000881}
882
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000883static char map_doc[] =
884"map(function, sequence[, sequence, ...]) -> list\n\
885\n\
886Return a list of the results of applying the function to the items of\n\
887the argument sequence(s). If more than one sequence is given, the\n\
888function is called with an argument list consisting of the corresponding\n\
889item of each sequence, substituting None for missing values when not all\n\
890sequences have the same length. If the function is None, return a list of\n\
891the items of the sequence (or a list of tuples if more than one sequence).";
892
893
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000895builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000896{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 PyObject *v;
898 PyObject *name;
899 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000901 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000902 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000904 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 Py_INCREF(Py_None);
906 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000907}
908
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000909static char setattr_doc[] =
910"setattr(object, name, value)\n\
911\n\
912Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
913``x.y = v''.";
914
915
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000917builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000918{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 PyObject *v;
920 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000922 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000923 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000925 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 Py_INCREF(Py_None);
927 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000928}
929
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000930static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +0000931"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000932\n\
933Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
934``del x.y''.";
935
936
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000938builtin_hash(PyObject *self, PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000939{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000940 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000941
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000943 if (x == -1)
944 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000946}
947
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000948static char hash_doc[] =
949"hash(object) -> integer\n\
950\n\
951Return a hash value for the object. Two objects with the same value have\n\
952the same hash value. The reverse is not necessarily true, but likely.";
953
954
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000956builtin_hex(PyObject *self, PyObject *v)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000957{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000961 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000963 "hex() argument can't be converted to hex");
964 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000965 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000966 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000967}
968
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000969static char hex_doc[] =
970"hex(number) -> string\n\
971\n\
972Return the hexadecimal representation of an integer or long integer.";
973
974
Tim Petersdbd9ba62000-07-09 03:09:57 +0000975static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000976
Guido van Rossum79f25d91997-04-29 20:08:16 +0000977static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000978builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000979{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000981 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *res;
983 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000984
985 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000986 if (line == NULL)
987 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000989 return NULL;
990 while (*str == ' ' || *str == '\t')
991 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000992 globals = PyEval_GetGlobals();
993 locals = PyEval_GetLocals();
994 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
995 if (PyDict_SetItemString(globals, "__builtins__",
996 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000997 return NULL;
998 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000999 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001001 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001002}
1003
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001004static char input_doc[] =
1005"input([prompt]) -> value\n\
1006\n\
1007Equivalent to eval(raw_input(prompt)).";
1008
1009
Guido van Rossume8811f81997-02-14 15:48:05 +00001010static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001011builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001012{
1013 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001014 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001015 return NULL;
1016 Py_INCREF(s);
1017 PyString_InternInPlace(&s);
1018 return s;
1019}
1020
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001021static char intern_doc[] =
1022"intern(string) -> string\n\
1023\n\
1024``Intern'' the given string. This enters the string in the (global)\n\
1025table of interned strings whose purpose is to speed up dictionary lookups.\n\
1026Return the string itself or the previously interned string object with the\n\
1027same value.";
1028
1029
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030static PyObject *
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001031builtin_iter(PyObject *self, PyObject *args)
1032{
1033 PyObject *v, *w = NULL;
1034
1035 if (!PyArg_ParseTuple(args, "O|O:iter", &v, &w))
1036 return NULL;
1037 if (w == NULL)
1038 return PyObject_GetIter(v);
1039 if (!PyCallable_Check(v)) {
1040 PyErr_SetString(PyExc_TypeError,
1041 "iter(v, w): v must be callable");
1042 return NULL;
1043 }
1044 return PyCallIter_New(v, w);
1045}
1046
1047static char iter_doc[] =
1048"iter(collection) -> iterator\n\
1049iter(callable, sentinel) -> iterator\n\
1050\n\
1051Get an iterator from an object. In the first form, the argument must\n\
1052supply its own iterator, or be a sequence.\n\
1053In the second form, the callable is called until it returns the sentinel.";
1054
1055
1056static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001057builtin_len(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058{
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001059 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001061 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001062 if (res < 0 && PyErr_Occurred())
1063 return NULL;
1064 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065}
1066
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001067static char len_doc[] =
1068"len(object) -> integer\n\
1069\n\
1070Return the number of items of a sequence or mapping.";
1071
1072
Guido van Rossum79f25d91997-04-29 20:08:16 +00001073static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001074builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001075{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001076 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001077
Guido van Rossum09df08a1998-05-22 00:51:39 +00001078 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001079
Guido van Rossum09df08a1998-05-22 00:51:39 +00001080 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1081 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001082
Guido van Rossum09df08a1998-05-22 00:51:39 +00001083 /* This swapping of stop and start is to maintain similarity with
1084 range(). */
1085 if (stop == NULL) {
1086 stop = start;
1087 start = NULL;
1088 }
1089 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001090}
1091
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001092static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001093"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001094\n\
1095Create a slice object. This is used for slicing by the Numeric extensions.";
1096
1097
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001099builtin_locals(PyObject *self)
Guido van Rossum872537c1995-07-07 22:43:42 +00001100{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001102
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 d = PyEval_GetLocals();
1104 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001105 return d;
1106}
1107
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001108static char locals_doc[] =
1109"locals() -> dictionary\n\
1110\n\
1111Return the dictionary containing the current scope's local variables.";
1112
1113
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114static PyObject *
Guido van Rossum53451b32001-01-17 15:47:24 +00001115min_max(PyObject *args, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001116{
Tim Petersc3074532001-05-03 07:00:32 +00001117 PyObject *v, *w, *x, *it;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001118
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001120 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001122 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001123
1124 it = PyObject_GetIter(v);
1125 if (it == NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001126 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001127
1128 w = NULL; /* the result */
Tim Petersf4848da2001-05-05 00:14:56 +00001129 for (;;) {
Tim Petersc3074532001-05-03 07:00:32 +00001130 x = PyIter_Next(it);
Guido van Rossum2d951851994-08-29 12:52:16 +00001131 if (x == NULL) {
Tim Petersc3074532001-05-03 07:00:32 +00001132 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001133 Py_XDECREF(w);
1134 Py_DECREF(it);
1135 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001136 }
Tim Petersc3074532001-05-03 07:00:32 +00001137 break;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001138 }
Tim Petersc3074532001-05-03 07:00:32 +00001139
Guido van Rossum2d951851994-08-29 12:52:16 +00001140 if (w == NULL)
1141 w = x;
1142 else {
Guido van Rossum53451b32001-01-17 15:47:24 +00001143 int cmp = PyObject_RichCompareBool(x, w, op);
1144 if (cmp > 0) {
1145 Py_DECREF(w);
1146 w = x;
1147 }
1148 else if (cmp < 0) {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001149 Py_DECREF(x);
Tim Petersc3074532001-05-03 07:00:32 +00001150 Py_DECREF(w);
1151 Py_DECREF(it);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001152 return NULL;
1153 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001154 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001156 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001158 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001160 "min() or max() arg is an empty sequence");
Tim Petersc3074532001-05-03 07:00:32 +00001161 Py_DECREF(it);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162 return w;
1163}
1164
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001166builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001167{
Guido van Rossum53451b32001-01-17 15:47:24 +00001168 return min_max(v, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001169}
1170
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001171static char min_doc[] =
1172"min(sequence) -> value\n\
1173min(a, b, c, ...) -> value\n\
1174\n\
1175With a single sequence argument, return its smallest item.\n\
1176With two or more arguments, return the smallest argument.";
1177
1178
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001180builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181{
Guido van Rossum53451b32001-01-17 15:47:24 +00001182 return min_max(v, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001183}
1184
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001185static char max_doc[] =
1186"max(sequence) -> value\n\
1187max(a, b, c, ...) -> value\n\
1188\n\
1189With a single sequence argument, return its largest item.\n\
1190With two or more arguments, return the largest argument.";
1191
1192
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001194builtin_oct(PyObject *self, PyObject *v)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001195{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001197
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001198 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1199 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001201 "oct() argument can't be converted to oct");
1202 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001203 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001204 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001205}
1206
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001207static char oct_doc[] =
1208"oct(number) -> string\n\
1209\n\
1210Return the octal representation of an integer or long integer.";
1211
1212
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001214builtin_ord(PyObject *self, PyObject* obj)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001215{
Guido van Rossum09095f32000-03-10 23:00:52 +00001216 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001217 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001219 if (PyString_Check(obj)) {
1220 size = PyString_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001221 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001222 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001223 return PyInt_FromLong(ord);
1224 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001225#ifdef Py_USING_UNICODE
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001226 } else if (PyUnicode_Check(obj)) {
1227 size = PyUnicode_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001228 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001229 ord = (long)*PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001230 return PyInt_FromLong(ord);
1231 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001232#endif
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001233 } else {
1234 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001235 "ord() expected string of length 1, but " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001236 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001237 return NULL;
1238 }
1239
Guido van Rossumad991772001-01-12 16:03:05 +00001240 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001241 "ord() expected a character, "
1242 "but string of length %d found",
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001243 size);
1244 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001245}
1246
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001247static char ord_doc[] =
1248"ord(c) -> integer\n\
1249\n\
Guido van Rossumad991772001-01-12 16:03:05 +00001250Return the integer ordinal of a one-character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001251
1252
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001254builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001255{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001256 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001257
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001259 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001260 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001261}
1262
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001263static char pow_doc[] =
1264"pow(x, y[, z]) -> number\n\
1265\n\
1266With two arguments, equivalent to x**y. With three arguments,\n\
1267equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1268
1269
Guido van Rossum124eff01999-02-23 16:11:01 +00001270/* Return number of items in range/xrange (lo, hi, step). step > 0
1271 * required. Return a value < 0 if & only if the true value is too
1272 * large to fit in a signed long.
1273 */
1274static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001275get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001276{
1277 /* -------------------------------------------------------------
1278 If lo >= hi, the range is empty.
1279 Else if n values are in the range, the last one is
1280 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1281 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1282 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1283 the RHS is non-negative and so truncation is the same as the
1284 floor. Letting M be the largest positive long, the worst case
1285 for the RHS numerator is hi=M, lo=-M-1, and then
1286 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1287 precision to compute the RHS exactly.
1288 ---------------------------------------------------------------*/
1289 long n = 0;
1290 if (lo < hi) {
1291 unsigned long uhi = (unsigned long)hi;
1292 unsigned long ulo = (unsigned long)lo;
1293 unsigned long diff = uhi - ulo - 1;
1294 n = (long)(diff / (unsigned long)step + 1);
1295 }
1296 return n;
1297}
1298
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001300builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001303 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001305
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001307
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308 if (PyTuple_Size(args) <= 1) {
1309 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001310 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 &ihigh))
1312 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001313 }
1314 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001316 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001317 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319 }
1320 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001321 PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001322 return NULL;
1323 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001324 if (istep > 0)
1325 bign = get_len_of_range(ilow, ihigh, istep);
1326 else
1327 bign = get_len_of_range(ihigh, ilow, -istep);
1328 n = (int)bign;
1329 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001330 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001331 "range() result has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001332 return NULL;
1333 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001335 if (v == NULL)
1336 return NULL;
1337 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001339 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001341 return NULL;
1342 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001343 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001344 ilow += istep;
1345 }
1346 return v;
1347}
1348
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001349static char range_doc[] =
1350"range([start,] stop[, step]) -> list of integers\n\
1351\n\
1352Return a list containing an arithmetic progression of integers.\n\
1353range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1354When step is given, it specifies the increment (or decrement).\n\
1355For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1356These are exactly the valid indices for a list of 4 elements.";
1357
1358
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001360builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001361{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001363 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001364
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 if (PyTuple_Size(args) <= 1) {
1366 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001367 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 &ihigh))
1369 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001370 }
1371 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001373 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001375 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001376 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001377 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001378 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001379 return NULL;
1380 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001381 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001382 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001383 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001384 n = get_len_of_range(ihigh, ilow, -istep);
1385 if (n < 0) {
1386 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001387 "xrange() result has too many items");
Guido van Rossum124eff01999-02-23 16:11:01 +00001388 return NULL;
1389 }
Thomas Woutersefafcea2001-07-09 12:30:54 +00001390 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001391}
1392
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001393static char xrange_doc[] =
1394"xrange([start,] stop[, step]) -> xrange object\n\
1395\n\
1396Like range(), but instead of returning a list, returns an object that\n\
1397generates the numbers in the range on demand. This is slightly slower\n\
1398than range() but more memory efficient.";
1399
1400
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001402builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 PyObject *v = NULL;
1405 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001406
Guido van Rossum79f25d91997-04-29 20:08:16 +00001407 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001408 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1410 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001411 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001413 char *prompt;
1414 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001415 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001416 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001418 if (po == NULL)
1419 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001421 if (prompt == NULL)
1422 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001423 }
1424 else {
1425 po = NULL;
1426 prompt = "";
1427 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 s = PyOS_Readline(prompt);
1429 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001430 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001431 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001432 return NULL;
1433 }
1434 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001436 result = NULL;
1437 }
1438 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001439 size_t len = strlen(s);
1440 if (len > INT_MAX) {
1441 PyErr_SetString(PyExc_OverflowError, "input too long");
1442 result = NULL;
1443 }
1444 else {
1445 result = PyString_FromStringAndSize(s, (int)(len-1));
1446 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001447 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001448 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001449 return result;
1450 }
Guido van Rossum90933611991-06-07 16:10:43 +00001451 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455 return NULL;
1456 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001457 if (Py_FlushLine() != 0 ||
1458 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001459 return NULL;
1460 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001464 return NULL;
1465 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001467}
1468
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001469static char raw_input_doc[] =
1470"raw_input([prompt]) -> string\n\
1471\n\
1472Read a string from standard input. The trailing newline is stripped.\n\
1473If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1474On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1475is printed without a trailing newline before reading.";
1476
1477
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001479builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001480{
Tim Peters15d81ef2001-05-04 04:39:21 +00001481 PyObject *seq, *func, *result = NULL, *it;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001482
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001484 return NULL;
1485 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001487
Tim Peters15d81ef2001-05-04 04:39:21 +00001488 it = PyObject_GetIter(seq);
1489 if (it == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490 PyErr_SetString(PyExc_TypeError,
Tim Peters15d81ef2001-05-04 04:39:21 +00001491 "reduce() arg 2 must support iteration");
1492 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001493 return NULL;
1494 }
1495
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001497 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001498
Tim Peters15d81ef2001-05-04 04:39:21 +00001499 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001500 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001501
1502 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 Py_DECREF(args);
1504 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001505 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001506 }
1507
Tim Peters15d81ef2001-05-04 04:39:21 +00001508 op2 = PyIter_Next(it);
1509 if (op2 == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +00001510 if (PyErr_Occurred())
1511 goto Fail;
1512 break;
Guido van Rossum2d951851994-08-29 12:52:16 +00001513 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001514
Guido van Rossum2d951851994-08-29 12:52:16 +00001515 if (result == NULL)
1516 result = op2;
1517 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 PyTuple_SetItem(args, 0, result);
1519 PyTuple_SetItem(args, 1, op2);
1520 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001521 goto Fail;
1522 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001523 }
1524
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001526
Guido van Rossum2d951851994-08-29 12:52:16 +00001527 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001529 "reduce() of empty sequence with no initial value");
Guido van Rossum2d951851994-08-29 12:52:16 +00001530
Tim Peters15d81ef2001-05-04 04:39:21 +00001531 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001532 return result;
1533
Guido van Rossum2d951851994-08-29 12:52:16 +00001534Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 Py_XDECREF(args);
1536 Py_XDECREF(result);
Tim Peters15d81ef2001-05-04 04:39:21 +00001537 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001538 return NULL;
1539}
1540
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001541static char reduce_doc[] =
1542"reduce(function, sequence[, initial]) -> value\n\
1543\n\
1544Apply a function of two arguments cumulatively to the items of a sequence,\n\
1545from left to right, so as to reduce the sequence to a single value.\n\
1546For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1547((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1548of the sequence in the calculation, and serves as a default when the\n\
1549sequence is empty.";
1550
1551
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001553builtin_reload(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001554{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001556}
1557
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001558static char reload_doc[] =
1559"reload(module) -> module\n\
1560\n\
1561Reload the module. The module must have been successfully imported before.";
1562
1563
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001565builtin_repr(PyObject *self, PyObject *v)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001566{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001568}
1569
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001570static char repr_doc[] =
1571"repr(object) -> string\n\
1572\n\
1573Return the canonical string representation of the object.\n\
1574For most object types, eval(repr(object)) == object.";
1575
1576
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001578builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001579{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001580 double x;
1581 double f;
1582 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001583 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001584
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001586 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001587 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001588 i = abs(ndigits);
1589 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001590 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001591 if (ndigits < 0)
1592 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001593 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001594 x *= f;
1595 if (x >= 0.0)
1596 x = floor(x + 0.5);
1597 else
1598 x = ceil(x - 0.5);
1599 if (ndigits < 0)
1600 x *= f;
1601 else
1602 x /= f;
1603 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001604}
1605
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001606static char round_doc[] =
1607"round(number[, ndigits]) -> floating point number\n\
1608\n\
1609Round a number to a given precision in decimal digits (default 0 digits).\n\
1610This always returns a floating point number. Precision may be negative.";
1611
1612
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001614builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001615{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 PyObject *v = NULL;
1617 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001618
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001620 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001621 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001622 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001623 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001624 if (!PyErr_Occurred())
1625 PyErr_SetString(PyExc_SystemError,
1626 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001627 }
1628 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001630 }
1631 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001632 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001633 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001635 "vars() argument must have __dict__ attribute");
1636 return NULL;
1637 }
1638 }
1639 return d;
1640}
1641
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001642static char vars_doc[] =
1643"vars([object]) -> dictionary\n\
1644\n\
1645Without arguments, equivalent to locals().\n\
1646With an argument, equivalent to object.__dict__.";
1647
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001648static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001649builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001650{
1651 PyObject *inst;
1652 PyObject *cls;
Guido van Rossum823649d2001-03-21 18:40:58 +00001653 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001654
Guido van Rossum43713e52000-02-29 13:59:29 +00001655 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001656 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001657
Guido van Rossum823649d2001-03-21 18:40:58 +00001658 retval = PyObject_IsInstance(inst, cls);
1659 if (retval < 0)
Guido van Rossumad991772001-01-12 16:03:05 +00001660 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001661 return PyInt_FromLong(retval);
1662}
1663
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001664static char isinstance_doc[] =
Guido van Rossum03290ec2001-10-07 20:54:12 +00001665"isinstance(object, class-or-type-or-tuple) -> Boolean\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001666\n\
1667Return whether an object is an instance of a class or of a subclass thereof.\n\
Guido van Rossum03290ec2001-10-07 20:54:12 +00001668With a type as second argument, return whether that is the object's type.\n\
1669The form using a tuple, isinstance(x, (A, B, ...)), is a shortcut for\n\
1670isinstance(x, A) or isinstance(x, B) or ... (etc.).";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001671
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001672
1673static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001674builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001675{
1676 PyObject *derived;
1677 PyObject *cls;
1678 int retval;
1679
Guido van Rossum43713e52000-02-29 13:59:29 +00001680 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001681 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00001682
Guido van Rossum823649d2001-03-21 18:40:58 +00001683 retval = PyObject_IsSubclass(derived, cls);
1684 if (retval < 0)
1685 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001686 return PyInt_FromLong(retval);
1687}
1688
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001689static char issubclass_doc[] =
1690"issubclass(C, B) -> Boolean\n\
1691\n\
1692Return whether class C is a subclass (i.e., a derived class) of class B.";
1693
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001694
Barry Warsawbd599b52000-08-03 15:45:29 +00001695static PyObject*
1696builtin_zip(PyObject *self, PyObject *args)
1697{
1698 PyObject *ret;
1699 int itemsize = PySequence_Length(args);
Tim Peters8572b4f2001-05-06 01:05:02 +00001700 int i;
1701 PyObject *itlist; /* tuple of iterators */
Barry Warsawbd599b52000-08-03 15:45:29 +00001702
1703 if (itemsize < 1) {
1704 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001705 "zip() requires at least one sequence");
Barry Warsawbd599b52000-08-03 15:45:29 +00001706 return NULL;
1707 }
1708 /* args must be a tuple */
1709 assert(PyTuple_Check(args));
1710
Tim Peters8572b4f2001-05-06 01:05:02 +00001711 /* allocate result list */
Barry Warsawbd599b52000-08-03 15:45:29 +00001712 if ((ret = PyList_New(0)) == NULL)
1713 return NULL;
1714
Tim Peters8572b4f2001-05-06 01:05:02 +00001715 /* obtain iterators */
1716 itlist = PyTuple_New(itemsize);
1717 if (itlist == NULL)
1718 goto Fail_ret;
1719 for (i = 0; i < itemsize; ++i) {
1720 PyObject *item = PyTuple_GET_ITEM(args, i);
1721 PyObject *it = PyObject_GetIter(item);
1722 if (it == NULL) {
1723 if (PyErr_ExceptionMatches(PyExc_TypeError))
1724 PyErr_Format(PyExc_TypeError,
1725 "zip argument #%d must support iteration",
1726 i+1);
1727 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00001728 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001729 PyTuple_SET_ITEM(itlist, i, it);
1730 }
Barry Warsawbd599b52000-08-03 15:45:29 +00001731
Tim Peters8572b4f2001-05-06 01:05:02 +00001732 /* build result into ret list */
1733 for (;;) {
1734 int status;
1735 PyObject *next = PyTuple_New(itemsize);
1736 if (!next)
1737 goto Fail_ret_itlist;
1738
1739 for (i = 0; i < itemsize; i++) {
1740 PyObject *it = PyTuple_GET_ITEM(itlist, i);
1741 PyObject *item = PyIter_Next(it);
Barry Warsawbd599b52000-08-03 15:45:29 +00001742 if (!item) {
Tim Peters8572b4f2001-05-06 01:05:02 +00001743 if (PyErr_Occurred()) {
1744 Py_DECREF(ret);
1745 ret = NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00001746 }
1747 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00001748 Py_DECREF(itlist);
1749 return ret;
Barry Warsawbd599b52000-08-03 15:45:29 +00001750 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001751 PyTuple_SET_ITEM(next, i, item);
Barry Warsawbd599b52000-08-03 15:45:29 +00001752 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001753
1754 status = PyList_Append(ret, next);
Barry Warsawbd599b52000-08-03 15:45:29 +00001755 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00001756 if (status < 0)
1757 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00001758 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001759
1760Fail_ret_itlist:
1761 Py_DECREF(itlist);
1762Fail_ret:
1763 Py_DECREF(ret);
1764 return NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00001765}
1766
1767
1768static char zip_doc[] =
1769"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
1770\n\
1771Return a list of tuples, where each tuple contains the i-th element\n\
1772from each of the argument sequences. The returned list is truncated\n\
1773in length to the length of the shortest argument sequence.";
1774
1775
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776static PyMethodDef builtin_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001777 {"__import__", builtin___import__, METH_VARARGS, import_doc},
1778 {"abs", builtin_abs, METH_O, abs_doc},
1779 {"apply", builtin_apply, METH_VARARGS, apply_doc},
1780 {"buffer", builtin_buffer, METH_VARARGS, buffer_doc},
1781 {"callable", builtin_callable, METH_O, callable_doc},
1782 {"chr", builtin_chr, METH_VARARGS, chr_doc},
1783 {"cmp", builtin_cmp, METH_VARARGS, cmp_doc},
1784 {"coerce", builtin_coerce, METH_VARARGS, coerce_doc},
1785 {"compile", builtin_compile, METH_VARARGS, compile_doc},
1786 {"delattr", builtin_delattr, METH_VARARGS, delattr_doc},
1787 {"dir", builtin_dir, METH_VARARGS, dir_doc},
1788 {"divmod", builtin_divmod, METH_VARARGS, divmod_doc},
1789 {"eval", builtin_eval, METH_VARARGS, eval_doc},
1790 {"execfile", builtin_execfile, METH_VARARGS, execfile_doc},
1791 {"filter", builtin_filter, METH_VARARGS, filter_doc},
1792 {"getattr", builtin_getattr, METH_VARARGS, getattr_doc},
1793 {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc},
1794 {"hasattr", builtin_hasattr, METH_VARARGS, hasattr_doc},
1795 {"hash", builtin_hash, METH_O, hash_doc},
1796 {"hex", builtin_hex, METH_O, hex_doc},
1797 {"id", builtin_id, METH_O, id_doc},
1798 {"input", builtin_input, METH_VARARGS, input_doc},
1799 {"intern", builtin_intern, METH_VARARGS, intern_doc},
1800 {"isinstance", builtin_isinstance, METH_VARARGS, isinstance_doc},
1801 {"issubclass", builtin_issubclass, METH_VARARGS, issubclass_doc},
1802 {"iter", builtin_iter, METH_VARARGS, iter_doc},
1803 {"len", builtin_len, METH_O, len_doc},
1804 {"locals", (PyCFunction)builtin_locals, METH_NOARGS, locals_doc},
1805 {"map", builtin_map, METH_VARARGS, map_doc},
1806 {"max", builtin_max, METH_VARARGS, max_doc},
1807 {"min", builtin_min, METH_VARARGS, min_doc},
1808 {"oct", builtin_oct, METH_O, oct_doc},
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001809 {"ord", builtin_ord, METH_O, ord_doc},
1810 {"pow", builtin_pow, METH_VARARGS, pow_doc},
1811 {"range", builtin_range, METH_VARARGS, range_doc},
1812 {"raw_input", builtin_raw_input, METH_VARARGS, raw_input_doc},
1813 {"reduce", builtin_reduce, METH_VARARGS, reduce_doc},
1814 {"reload", builtin_reload, METH_O, reload_doc},
1815 {"repr", builtin_repr, METH_O, repr_doc},
1816 {"round", builtin_round, METH_VARARGS, round_doc},
1817 {"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
1818 {"slice", builtin_slice, METH_VARARGS, slice_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001819#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001820 {"unichr", builtin_unichr, METH_VARARGS, unichr_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001821#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001822 {"vars", builtin_vars, METH_VARARGS, vars_doc},
1823 {"xrange", builtin_xrange, METH_VARARGS, xrange_doc},
1824 {"zip", builtin_zip, METH_VARARGS, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001825 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826};
1827
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001828static char builtin_doc[] =
1829"Built-in functions, exceptions, and other objects.\n\
1830\n\
1831Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
1832
Guido van Rossum25ce5661997-08-02 03:10:38 +00001833PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001834_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001835{
Fred Drake5550de32000-06-20 04:54:19 +00001836 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001837 mod = Py_InitModule4("__builtin__", builtin_methods,
1838 builtin_doc, (PyObject *)NULL,
1839 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001840 if (mod == NULL)
1841 return NULL;
1842 dict = PyModule_GetDict(mod);
Tim Peters4b7625e2001-09-13 21:37:17 +00001843
1844#define SETBUILTIN(NAME, OBJECT) \
1845 if (PyDict_SetItemString(dict, NAME, (PyObject *)OBJECT) < 0) \
1846 return NULL
1847
1848 SETBUILTIN("None", Py_None);
1849 SETBUILTIN("Ellipsis", Py_Ellipsis);
1850 SETBUILTIN("NotImplemented", Py_NotImplemented);
1851 SETBUILTIN("classmethod", &PyClassMethod_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001852#ifndef WITHOUT_COMPLEX
Tim Peters4b7625e2001-09-13 21:37:17 +00001853 SETBUILTIN("complex", &PyComplex_Type);
Tim Peters6d6c1a32001-08-02 04:15:00 +00001854#endif
Tim Petersa427a2b2001-10-29 22:25:45 +00001855 SETBUILTIN("dict", &PyDict_Type);
Tim Peters4b7625e2001-09-13 21:37:17 +00001856 SETBUILTIN("float", &PyFloat_Type);
1857 SETBUILTIN("property", &PyProperty_Type);
1858 SETBUILTIN("int", &PyInt_Type);
1859 SETBUILTIN("list", &PyList_Type);
1860 SETBUILTIN("long", &PyLong_Type);
1861 SETBUILTIN("object", &PyBaseObject_Type);
1862 SETBUILTIN("staticmethod", &PyStaticMethod_Type);
1863 SETBUILTIN("str", &PyString_Type);
1864 SETBUILTIN("super", &PySuper_Type);
1865 SETBUILTIN("tuple", &PyTuple_Type);
1866 SETBUILTIN("type", &PyType_Type);
Tim Peters742dfd62001-09-13 21:49:44 +00001867
1868 /* Note that open() is just an alias of file(). */
1869 SETBUILTIN("open", &PyFile_Type);
Tim Peters4b7625e2001-09-13 21:37:17 +00001870 SETBUILTIN("file", &PyFile_Type);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001871#ifdef Py_USING_UNICODE
Tim Peters4b7625e2001-09-13 21:37:17 +00001872 SETBUILTIN("unicode", &PyUnicode_Type);
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001873#endif
Fred Drake5550de32000-06-20 04:54:19 +00001874 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
1875 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
1876 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001877 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00001878 }
1879 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001880
Guido van Rossum25ce5661997-08-02 03:10:38 +00001881 return mod;
Tim Peters4b7625e2001-09-13 21:37:17 +00001882#undef SETBUILTIN
Guido van Rossum3f5da241990-12-20 15:06:42 +00001883}
1884
Guido van Rossume77a7571993-11-03 15:01:26 +00001885/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001888filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001889{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001890 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001891 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001892 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001893
Guido van Rossumb7b45621995-08-04 04:07:45 +00001894 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001895 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001896 return tuple;
1897 }
1898
Guido van Rossum79f25d91997-04-29 20:08:16 +00001899 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001900 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001901
Guido van Rossum12d12c51993-10-26 17:58:25 +00001902 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001904 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001905
Guido van Rossum79f25d91997-04-29 20:08:16 +00001906 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001907 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001908 if (func == Py_None) {
1909 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001910 good = item;
1911 }
1912 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001914 if (arg == NULL)
1915 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 good = PyEval_CallObject(func, arg);
1917 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001918 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001919 goto Fail_1;
1920 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 ok = PyObject_IsTrue(good);
1922 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001923 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 Py_INCREF(item);
1925 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001926 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001927 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001928 }
1929
Tim Peters4324aa32001-05-28 22:30:08 +00001930 if (_PyTuple_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001931 return NULL;
1932
Guido van Rossum12d12c51993-10-26 17:58:25 +00001933 return result;
1934
Guido van Rossum12d12c51993-10-26 17:58:25 +00001935Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001937 return NULL;
1938}
1939
1940
Guido van Rossume77a7571993-11-03 15:01:26 +00001941/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001942
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001944filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001945{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001946 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001947 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001948 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001949
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001951 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001953 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001954 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001956 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001957
Guido van Rossum12d12c51993-10-26 17:58:25 +00001958 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001960 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001961
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001962 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1963 if (item == NULL)
1964 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 arg = Py_BuildValue("(O)", item);
Tim Peters388ed082001-04-07 20:34:48 +00001966 if (arg == NULL) {
1967 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001968 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00001969 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001970 good = PyEval_CallObject(func, arg);
1971 Py_DECREF(arg);
Tim Peters388ed082001-04-07 20:34:48 +00001972 if (good == NULL) {
1973 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001974 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00001975 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 ok = PyObject_IsTrue(good);
1977 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001978 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 PyString_AS_STRING((PyStringObject *)result)[j++] =
1980 PyString_AS_STRING((PyStringObject *)item)[0];
Tim Peters388ed082001-04-07 20:34:48 +00001981 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001982 }
1983
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001985 return NULL;
1986
Guido van Rossum12d12c51993-10-26 17:58:25 +00001987 return result;
1988
Guido van Rossum12d12c51993-10-26 17:58:25 +00001989Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001991 return NULL;
1992}