blob: 1e9868af14fd03d680fe39f01e42b86f141cf6ab [file] [log] [blame]
Andrew M. Kuchling9bcc68c2000-12-20 15:07:34 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Built-in functions */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005
6#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +00007#include "compile.h"
8#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00009
Guido van Rossum6bf62da1997-04-11 20:37:35 +000010#include <ctype.h>
11
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000012#ifdef HAVE_UNISTD_H
13#include <unistd.h>
14#endif
15
Mark Hammond26cffde42001-05-14 12:17:34 +000016/* The default encoding used by the platform file system APIs
17 Can remain NULL for all platforms that don't have such a concept
18*/
19#ifdef MS_WIN32
20const char *Py_FileSystemDefaultEncoding = "mbcs";
21#else
22const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
23#endif
Mark Hammondef8b6542001-05-13 08:04:26 +000024
Guido van Rossum12d12c51993-10-26 17:58:25 +000025/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000026static PyObject *filterstring(PyObject *, PyObject *);
27static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000028
Guido van Rossum79f25d91997-04-29 20:08:16 +000029static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000030builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000031{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000033 PyObject *globals = NULL;
34 PyObject *locals = NULL;
35 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000036
Guido van Rossum79f25d91997-04-29 20:08:16 +000037 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000038 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000040 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041}
42
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000043static char import_doc[] =
44"__import__(name, globals, locals, fromlist) -> module\n\
45\n\
46Import a module. The globals are only used to determine the context;\n\
47they are not modified. The locals are currently unused. The fromlist\n\
48should be a list of names to emulate ``from name import ...'', or an\n\
49empty list to emulate ``import name''.\n\
50When importing a module from a package, note that __import__('A.B', ...)\n\
51returns package A when fromlist is empty, but its submodule B when\n\
52fromlist is not empty.";
53
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054
Guido van Rossum79f25d91997-04-29 20:08:16 +000055static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000056builtin_abs(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057{
Guido van Rossum79f25d91997-04-29 20:08:16 +000058 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000059
Guido van Rossum79f25d91997-04-29 20:08:16 +000060 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061 return NULL;
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 *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000135builtin_unicode(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000136{
Guido van Rossum3afba762000-04-11 15:38:23 +0000137 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000138 char *encoding = NULL;
139 char *errors = NULL;
140
Guido van Rossum3afba762000-04-11 15:38:23 +0000141 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000142 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000143 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000144}
145
146static char unicode_doc[] =
147"unicode(string [, encoding[, errors]]) -> object\n\
148\n\
Guido van Rossumad991772001-01-12 16:03:05 +0000149Create a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000150encoding defaults to the current default string encoding and \n\
151errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000152
153
154static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000155builtin_callable(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +0000156{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000158
Guido van Rossum79f25d91997-04-29 20:08:16 +0000159 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000160 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000162}
163
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000164static char callable_doc[] =
165"callable(object) -> Boolean\n\
166\n\
167Return whether the object is callable (i.e., some kind of function).\n\
168Note that classes are callable, as are instances with a __call__() method.";
169
170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000172builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000173{
Tim Peters0e57abf2001-05-02 07:39:38 +0000174 PyObject *func, *seq, *result, *it;
175 int len; /* guess for result list size */
Tim Petersf4848da2001-05-05 00:14:56 +0000176 register int j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000177
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000179 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000180
Tim Peters0e57abf2001-05-02 07:39:38 +0000181 /* Strings and tuples return a result of the same type. */
182 if (PyString_Check(seq))
183 return filterstring(func, seq);
184 if (PyTuple_Check(seq))
185 return filtertuple(func, seq);
186
187 /* Get iterator. */
188 it = PyObject_GetIter(seq);
189 if (it == NULL)
190 return NULL;
191
192 /* Guess a result list size. */
193 len = -1; /* unknown */
194 if (PySequence_Check(seq) &&
195 seq->ob_type->tp_as_sequence->sq_length) {
196 len = PySequence_Size(seq);
197 if (len < 0)
198 PyErr_Clear();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000200 if (len < 0)
201 len = 8; /* arbitrary */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000202
Tim Peters0e57abf2001-05-02 07:39:38 +0000203 /* Get a result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000205 /* Eww - can modify the list in-place. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000207 result = seq;
208 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000209 else {
Tim Peters0e57abf2001-05-02 07:39:38 +0000210 result = PyList_New(len);
211 if (result == NULL)
212 goto Fail_it;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000213 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000214
Tim Peters0e57abf2001-05-02 07:39:38 +0000215 /* Build the result list. */
Tim Petersf4848da2001-05-05 00:14:56 +0000216 j = 0;
217 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000219 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220
Tim Peters0e57abf2001-05-02 07:39:38 +0000221 item = PyIter_Next(it);
222 if (item == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +0000223 if (PyErr_Occurred())
224 goto Fail_result_it;
Tim Peters0e57abf2001-05-02 07:39:38 +0000225 break;
Guido van Rossum2d951851994-08-29 12:52:16 +0000226 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000227
Guido van Rossum79f25d91997-04-29 20:08:16 +0000228 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000229 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000231 }
232 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 PyObject *arg = Py_BuildValue("(O)", item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000234 if (arg == NULL) {
235 Py_DECREF(item);
236 goto Fail_result_it;
237 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000238 good = PyEval_CallObject(func, arg);
239 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000240 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000241 Py_DECREF(item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000242 goto Fail_result_it;
Guido van Rossum58b68731995-01-10 17:40:55 +0000243 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000244 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 ok = PyObject_IsTrue(good);
246 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000247 if (ok) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000248 if (j < len)
249 PyList_SET_ITEM(result, j, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000250 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000251 int status = PyList_Append(result, item);
Barry Warsawfa77e091999-01-28 18:49:12 +0000252 Py_DECREF(item);
253 if (status < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000254 goto Fail_result_it;
Guido van Rossum2d951851994-08-29 12:52:16 +0000255 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000256 ++j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000257 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000258 else
259 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000260 }
261
Guido van Rossum12d12c51993-10-26 17:58:25 +0000262
Tim Peters0e57abf2001-05-02 07:39:38 +0000263 /* Cut back result list if len is too big. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000265 goto Fail_result_it;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000266
Tim Peters3c6b1482001-05-21 08:07:05 +0000267 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000268 return result;
269
Tim Peters0e57abf2001-05-02 07:39:38 +0000270Fail_result_it:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 Py_DECREF(result);
Tim Peters0e57abf2001-05-02 07:39:38 +0000272Fail_it:
273 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000274 return NULL;
275}
276
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000277static char filter_doc[] =
278"filter(function, sequence) -> list\n\
279\n\
280Return a list containing those items of sequence for which function(item)\n\
281is true. If function is None, return a list of items that are true.";
282
283
Guido van Rossum79f25d91997-04-29 20:08:16 +0000284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000285builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000286{
287 long x;
288 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000289
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000293 PyErr_SetString(PyExc_ValueError,
294 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000295 return NULL;
296 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000297 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000298 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000299}
300
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000301static char chr_doc[] =
302"chr(i) -> character\n\
303\n\
304Return a string of one character with ordinal i; 0 <= i < 256.";
305
306
Guido van Rossum79f25d91997-04-29 20:08:16 +0000307static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000308builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000309{
310 long x;
311 Py_UNICODE s[1];
312
313 if (!PyArg_ParseTuple(args, "l:unichr", &x))
314 return NULL;
315 if (x < 0 || x >= 65536) {
316 PyErr_SetString(PyExc_ValueError,
317 "unichr() arg not in range(65536)");
318 return NULL;
319 }
320 s[0] = (Py_UNICODE)x;
321 return PyUnicode_FromUnicode(s, 1);
322}
323
324static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000325"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000326\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000327Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000328
329
330static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000334 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000335
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000337 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000338 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000339 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000340 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000341}
342
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000343static char cmp_doc[] =
344"cmp(x, y) -> integer\n\
345\n\
346Return negative if x<y, zero if x==y, positive if x>y.";
347
348
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000350builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000351{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 PyObject *v, *w;
353 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000354
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000356 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000358 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000359 res = Py_BuildValue("(OO)", v, w);
360 Py_DECREF(v);
361 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000362 return res;
363}
364
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000365static char coerce_doc[] =
366"coerce(x, y) -> None or (x1, y1)\n\
367\n\
368When x and y can be coerced to values of the same type, return a tuple\n\
369containing the coerced values. When they can't be coerced, return None.";
370
371
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000373builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000374{
375 char *str;
376 char *filename;
377 char *startstr;
378 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000381 return NULL;
382 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000383 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000384 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000385 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000386 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000387 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000388 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000390 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000391 return NULL;
392 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000393 if (PyEval_GetNestedScopes()) {
394 PyCompilerFlags cf;
395 cf.cf_nested_scopes = 1;
396 return Py_CompileStringFlags(str, filename, start, &cf);
397 } else
398 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000399}
400
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000401static char compile_doc[] =
402"compile(source, filename, mode) -> code object\n\
403\n\
404Compile the source string (a Python module, statement or expression)\n\
405into a code object that can be executed by the exec statement or eval().\n\
406The filename will be used for run-time error messages.\n\
407The mode must be 'exec' to compile a module, 'single' to compile a\n\
408single (interactive) statement, or 'eval' to compile an expression.";
409
410
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000411#ifndef WITHOUT_COMPLEX
412
Guido van Rossum79f25d91997-04-29 20:08:16 +0000413static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000414complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000415{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000416 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000417 const char *s, *start;
418 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000419 double x=0.0, y=0.0, z;
420 int got_re=0, got_im=0, done=0;
421 int digit_or_dot;
422 int sw_error=0;
423 int sign;
424 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000425 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000426 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000427
Guido van Rossum9e896b32000-04-05 20:11:21 +0000428 if (PyString_Check(v)) {
429 s = PyString_AS_STRING(v);
430 len = PyString_GET_SIZE(v);
431 }
432 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000433 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
434 PyErr_SetString(PyExc_ValueError,
435 "complex() literal too large to convert");
436 return NULL;
437 }
Guido van Rossumad991772001-01-12 16:03:05 +0000438 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000439 PyUnicode_GET_SIZE(v),
Guido van Rossumad991772001-01-12 16:03:05 +0000440 s_buffer,
Guido van Rossum9e896b32000-04-05 20:11:21 +0000441 NULL))
442 return NULL;
443 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000444 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000445 }
446 else if (PyObject_AsCharBuffer(v, &s, &len)) {
447 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000448 "complex() arg is not a string");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000449 return NULL;
450 }
Guido van Rossum11950231999-03-25 21:16:07 +0000451
452 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000453 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000454 while (*s && isspace(Py_CHARMASK(*s)))
455 s++;
456 if (s[0] == '\0') {
457 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000458 "complex() arg is an empty string");
Guido van Rossum11950231999-03-25 21:16:07 +0000459 return NULL;
460 }
461
462 z = -1.0;
463 sign = 1;
464 do {
Guido van Rossumad991772001-01-12 16:03:05 +0000465
Guido van Rossum11950231999-03-25 21:16:07 +0000466 switch (*s) {
467
468 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000469 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000470 PyErr_SetString(
471 PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000472 "complex() arg contains a null byte");
Guido van Rossum11950231999-03-25 21:16:07 +0000473 return NULL;
474 }
475 if(!done) sw_error=1;
476 break;
Guido van Rossumad991772001-01-12 16:03:05 +0000477
Guido van Rossum11950231999-03-25 21:16:07 +0000478 case '-':
479 sign = -1;
480 /* Fallthrough */
481 case '+':
482 if (done) sw_error=1;
483 s++;
484 if ( *s=='\0'||*s=='+'||*s=='-' ||
485 isspace(Py_CHARMASK(*s)) ) sw_error=1;
486 break;
487
488 case 'J':
489 case 'j':
490 if (got_im || done) {
491 sw_error = 1;
492 break;
493 }
494 if (z<0.0) {
495 y=sign;
496 }
497 else{
498 y=sign*z;
499 }
500 got_im=1;
501 s++;
502 if (*s!='+' && *s!='-' )
503 done=1;
504 break;
505
506 default:
507 if (isspace(Py_CHARMASK(*s))) {
508 while (*s && isspace(Py_CHARMASK(*s)))
509 s++;
510 if (s[0] != '\0')
511 sw_error=1;
512 else
513 done = 1;
514 break;
515 }
516 digit_or_dot =
517 (*s=='.' || isdigit(Py_CHARMASK(*s)));
518 if (done||!digit_or_dot) {
519 sw_error=1;
520 break;
521 }
522 errno = 0;
523 PyFPE_START_PROTECT("strtod", return 0)
524 z = strtod(s, &end) ;
525 PyFPE_END_PROTECT(z)
526 if (errno != 0) {
527 sprintf(buffer,
528 "float() out of range: %.150s", s);
529 PyErr_SetString(
530 PyExc_ValueError,
531 buffer);
532 return NULL;
533 }
534 s=end;
535 if (*s=='J' || *s=='j') {
Guido van Rossumad991772001-01-12 16:03:05 +0000536
Guido van Rossum11950231999-03-25 21:16:07 +0000537 break;
538 }
539 if (got_re) {
540 sw_error=1;
541 break;
542 }
543
544 /* accept a real part */
545 x=sign*z;
546 got_re=1;
547 if (got_im) done=1;
548 z = -1.0;
549 sign = 1;
550 break;
Guido van Rossumad991772001-01-12 16:03:05 +0000551
Guido van Rossum11950231999-03-25 21:16:07 +0000552 } /* end of switch */
553
554 } while (*s!='\0' && !sw_error);
555
556 if (sw_error) {
557 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000558 "complex() arg is a malformed string");
Guido van Rossum11950231999-03-25 21:16:07 +0000559 return NULL;
560 }
561
562 return PyComplex_FromDoubles(x,y);
563}
564
565static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000566builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000567{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *r, *i, *tmp;
569 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000570 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000571 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000572
573 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000575 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000576 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000577 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000578 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000579 nbr->nb_float == NULL ||
580 (i != NULL &&
581 ((nbi = i->ob_type->tp_as_number) == NULL ||
582 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000584 "complex() arg can't be converted to complex");
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000585 return NULL;
586 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000587 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if (PyInstance_Check(r)) {
589 static PyObject *complexstr;
590 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000591 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000592 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000593 if (complexstr == NULL)
594 return NULL;
595 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000597 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000599 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000601 if (args == NULL)
602 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 r = PyEval_CallObject(f, args);
604 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000605 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000606 if (r == NULL)
607 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000608 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000609 }
610 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 if (PyComplex_Check(r)) {
612 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000613 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000615 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000616 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000617 else {
Guido van Rossum8dabbf12001-01-19 02:11:59 +0000618 tmp = PyNumber_Float(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000619 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000621 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000622 if (tmp == NULL)
623 return NULL;
Guido van Rossum8dabbf12001-01-19 02:11:59 +0000624 if (!PyFloat_Check(tmp)) {
625 PyErr_SetString(PyExc_TypeError,
626 "float(r) didn't return a float");
627 Py_DECREF(tmp);
628 return NULL;
629 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 cr.real = PyFloat_AsDouble(tmp);
631 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000632 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000633 }
634 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000635 ci.real = 0.0;
636 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000637 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638 else if (PyComplex_Check(i))
639 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000640 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000641 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000642 if (tmp == NULL)
643 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 ci.real = PyFloat_AsDouble(tmp);
645 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000646 ci.imag = 0.;
647 }
648 cr.real -= ci.imag;
649 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000651}
652
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000653static char complex_doc[] =
654"complex(real[, imag]) -> complex number\n\
655\n\
656Create a complex number from a real part and an optional imaginary part.\n\
657This is equivalent to (real + imag*1j) where imag defaults to 0.";
658
659
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000660#endif
661
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000663builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000664{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000665 static char *attrlist[] = {"__members__", "__methods__", NULL};
666 PyObject *v = NULL, *l = NULL, *m = NULL;
667 PyObject *d, *x;
668 int i;
669 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000670
Guido van Rossum79f25d91997-04-29 20:08:16 +0000671 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000672 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000673 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000674 x = PyEval_GetLocals();
675 if (x == NULL)
676 goto error;
677 l = PyMapping_Keys(x);
678 if (l == NULL)
679 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000680 }
681 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000682 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000683 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000684 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000685 else {
686 l = PyMapping_Keys(d);
687 if (l == NULL)
688 PyErr_Clear();
689 Py_DECREF(d);
690 }
691 if (l == NULL) {
692 l = PyList_New(0);
693 if (l == NULL)
694 goto error;
695 }
696 for (s = attrlist; *s != NULL; s++) {
697 m = PyObject_GetAttrString(v, *s);
698 if (m == NULL) {
699 PyErr_Clear();
700 continue;
701 }
702 for (i = 0; ; i++) {
703 x = PySequence_GetItem(m, i);
704 if (x == NULL) {
705 PyErr_Clear();
706 break;
707 }
708 if (PyList_Append(l, x) != 0) {
709 Py_DECREF(x);
710 Py_DECREF(m);
711 goto error;
712 }
713 Py_DECREF(x);
714 }
715 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000716 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000717 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000718 if (PyList_Sort(l) != 0)
719 goto error;
720 return l;
721 error:
722 Py_XDECREF(l);
723 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000724}
725
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000726static char dir_doc[] =
727"dir([object]) -> list of strings\n\
728\n\
729Return an alphabetized list of names comprising (some of) the attributes\n\
730of the given object. Without an argument, the names in the current scope\n\
731are listed. With an instance argument, only the instance attributes are\n\
732returned. With a class argument, attributes of the base class are not\n\
733returned. For other types or arguments, this may list members or methods.";
734
735
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000737builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000738{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000740
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000742 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000743 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000744}
745
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000746static char divmod_doc[] =
747"divmod(x, y) -> (div, mod)\n\
748\n\
749Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
750
751
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000753builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000754{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000755 PyObject *cmd;
756 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000757 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000758
Guido van Rossum79f25d91997-04-29 20:08:16 +0000759 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000760 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 &PyDict_Type, &globals,
762 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 if (globals == Py_None) {
765 globals = PyEval_GetGlobals();
766 if (locals == Py_None)
767 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000768 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000770 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
772 if (PyDict_SetItemString(globals, "__builtins__",
773 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000774 return NULL;
775 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000776 if (PyCode_Check(cmd))
777 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000778 if (!PyString_Check(cmd) &&
779 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000781 "eval() arg 1 must be a string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000782 return NULL;
783 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000784 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786 while (*str == ' ' || *str == '\t')
787 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000788 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000789}
790
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000791static char eval_doc[] =
792"eval(source[, globals[, locals]]) -> value\n\
793\n\
794Evaluate the source in the context of globals and locals.\n\
795The source may be a string representing a Python expression\n\
796or a code object as returned by compile().\n\
797The globals and locals are dictionaries, defaulting to the current\n\
798globals and locals. If only globals is given, locals defaults to it.";
799
800
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000802builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000803{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 PyObject *globals = Py_None, *locals = Py_None;
806 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000807 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000808
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 &PyDict_Type, &globals,
812 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000813 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 if (globals == Py_None) {
815 globals = PyEval_GetGlobals();
816 if (locals == Py_None)
817 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000818 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000820 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
822 if (PyDict_SetItemString(globals, "__builtins__",
823 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000824 return NULL;
825 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000827 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000829 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000831 return NULL;
832 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000833 if (PyEval_GetNestedScopes()) {
834 PyCompilerFlags cf;
835 cf.cf_nested_scopes = 1;
Tim Peters748b8bb2001-04-28 08:20:22 +0000836 res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000837 locals, 1, &cf);
Tim Peters748b8bb2001-04-28 08:20:22 +0000838 } else
839 res = PyRun_FileEx(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000840 locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000842}
843
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000844static char execfile_doc[] =
845"execfile(filename[, globals[, locals]])\n\
846\n\
847Read and execute a Python script from a file.\n\
848The globals and locals are dictionaries, defaulting to the current\n\
849globals and locals. If only globals is given, locals defaults to it.";
850
851
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000853builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000854{
Guido van Rossum950ff291998-06-29 13:38:57 +0000855 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000857
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000858 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000859 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000860 result = PyObject_GetAttr(v, name);
861 if (result == NULL && dflt != NULL) {
862 PyErr_Clear();
863 Py_INCREF(dflt);
864 result = dflt;
865 }
866 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000867}
868
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000869static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000870"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000871\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000872Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
873When a default argument is given, it is returned when the attribute doesn't\n\
874exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000875
876
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000878builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000879{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000881
Guido van Rossum43713e52000-02-29 13:59:29 +0000882 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000883 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 d = PyEval_GetGlobals();
885 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000886 return d;
887}
888
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000889static char globals_doc[] =
890"globals() -> dictionary\n\
891\n\
892Return the dictionary containing the current scope's global variables.";
893
894
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000896builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000897{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898 PyObject *v;
899 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000900
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000901 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000902 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000904 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000906 Py_INCREF(Py_False);
907 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000908 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000910 Py_INCREF(Py_True);
911 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000912}
913
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000914static char hasattr_doc[] =
915"hasattr(object, name) -> Boolean\n\
916\n\
917Return whether the object has an attribute with the given name.\n\
918(This is done by calling getattr(object, name) and catching exceptions.)";
919
920
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000922builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000923{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000927 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000928 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000929}
930
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000931static char id_doc[] =
932"id(object) -> integer\n\
933\n\
934Return the identity of an object. This is guaranteed to be unique among\n\
935simultaneously existing objects. (Hint: it's the object's memory address.)";
936
937
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000939builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000940{
941 typedef struct {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000942 PyObject *it; /* the iterator object */
943 int saw_StopIteration; /* bool: did the iterator end? */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000944 } sequence;
945
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000947 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000948 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000949 register int i, j;
950
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 PyErr_SetString(PyExc_TypeError,
954 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000955 return NULL;
956 }
957
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000959 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000960
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000961 if (func == Py_None && n == 1) {
962 /* map(None, S) is the same as list(S). */
963 return PySequence_List(PyTuple_GetItem(args, 1));
964 }
965
Tim Peters4e9afdc2001-05-03 23:54:49 +0000966 /* Get space for sequence descriptors. Must NULL out the iterator
967 * pointers so that jumping to Fail_2 later doesn't see trash.
968 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
970 PyErr_NoMemory();
Tim Peters4e9afdc2001-05-03 23:54:49 +0000971 return NULL;
972 }
973 for (i = 0; i < n; ++i) {
974 seqs[i].it = (PyObject*)NULL;
975 seqs[i].saw_StopIteration = 0;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000976 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000977
Tim Peters4e9afdc2001-05-03 23:54:49 +0000978 /* Do a first pass to obtain iterators for the arguments, and set len
979 * to the largest of their lengths.
Tim Peters748b8bb2001-04-28 08:20:22 +0000980 */
Tim Peters4e9afdc2001-05-03 23:54:49 +0000981 len = 0;
982 for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
983 PyObject *curseq;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000984 int curlen;
Guido van Rossumad991772001-01-12 16:03:05 +0000985
Tim Peters4e9afdc2001-05-03 23:54:49 +0000986 /* Get iterator. */
987 curseq = PyTuple_GetItem(args, i+1);
988 sqp->it = PyObject_GetIter(curseq);
989 if (sqp->it == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000990 static char errmsg[] =
Tim Peters4e9afdc2001-05-03 23:54:49 +0000991 "argument %d to map() must support iteration";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000992 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000993 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000995 goto Fail_2;
996 }
997
Tim Peters4e9afdc2001-05-03 23:54:49 +0000998 /* Update len. */
999 curlen = -1; /* unknown */
1000 if (PySequence_Check(curseq) &&
1001 curseq->ob_type->tp_as_sequence->sq_length) {
1002 curlen = PySequence_Size(curseq);
1003 if (curlen < 0)
1004 PyErr_Clear();
1005 }
Tim Peters748b8bb2001-04-28 08:20:22 +00001006 if (curlen < 0)
Tim Peters4e9afdc2001-05-03 23:54:49 +00001007 curlen = 8; /* arbitrary */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001008 if (curlen > len)
1009 len = curlen;
1010 }
1011
Tim Peters4e9afdc2001-05-03 23:54:49 +00001012 /* Get space for the result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001014 goto Fail_2;
1015
Tim Peters4e9afdc2001-05-03 23:54:49 +00001016 /* Iterate over the sequences until all have stopped. */
Guido van Rossum2d951851994-08-29 12:52:16 +00001017 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 PyObject *alist, *item=NULL, *value;
Tim Peters4e9afdc2001-05-03 23:54:49 +00001019 int numactive = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001020
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +00001022 alist = NULL;
Tim Peters4e9afdc2001-05-03 23:54:49 +00001023 else if ((alist = PyTuple_New(n)) == NULL)
1024 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001025
1026 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Tim Peters4e9afdc2001-05-03 23:54:49 +00001027 if (sqp->saw_StopIteration) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 Py_INCREF(Py_None);
1029 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001031 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +00001032 item = PyIter_Next(sqp->it);
1033 if (item)
1034 ++numactive;
1035 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +00001036 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001037 Py_XDECREF(alist);
1038 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001039 }
Tim Peters4e9afdc2001-05-03 23:54:49 +00001040 Py_INCREF(Py_None);
1041 item = Py_None;
1042 sqp->saw_StopIteration = 1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001043 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001044 }
Tim Peters4e9afdc2001-05-03 23:54:49 +00001045 if (alist)
1046 PyTuple_SET_ITEM(alist, j, item);
1047 else
Guido van Rossum2d951851994-08-29 12:52:16 +00001048 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001049 }
1050
Guido van Rossum32120311995-07-10 13:52:21 +00001051 if (!alist)
1052 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001053
Tim Peters4e9afdc2001-05-03 23:54:49 +00001054 if (numactive == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001056 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001057 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001058
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001060 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001061 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 value = PyEval_CallObject(func, alist);
1063 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001064 if (value == NULL)
1065 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001066 }
1067 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001068 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001069 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001070 if (status < 0)
1071 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 }
Tim Peters4e9afdc2001-05-03 23:54:49 +00001073 else if (PyList_SetItem(result, i, value) < 0)
1074 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001075 }
1076
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001077 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1078 goto Fail_1;
1079
Tim Peters4e9afdc2001-05-03 23:54:49 +00001080 goto Succeed;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001081
Guido van Rossum12d12c51993-10-26 17:58:25 +00001082Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001084Fail_2:
Tim Peters4e9afdc2001-05-03 23:54:49 +00001085 result = NULL;
1086Succeed:
1087 assert(seqs);
1088 for (i = 0; i < n; ++i)
1089 Py_XDECREF(seqs[i].it);
1090 PyMem_DEL(seqs);
1091 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001092}
1093
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001094static char map_doc[] =
1095"map(function, sequence[, sequence, ...]) -> list\n\
1096\n\
1097Return a list of the results of applying the function to the items of\n\
1098the argument sequence(s). If more than one sequence is given, the\n\
1099function is called with an argument list consisting of the corresponding\n\
1100item of each sequence, substituting None for missing values when not all\n\
1101sequences have the same length. If the function is None, return a list of\n\
1102the items of the sequence (or a list of tuples if more than one sequence).";
1103
1104
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001106builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001107{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 PyObject *v;
1109 PyObject *name;
1110 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001111
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001112 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001113 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001115 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116 Py_INCREF(Py_None);
1117 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001118}
1119
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001120static char setattr_doc[] =
1121"setattr(object, name, value)\n\
1122\n\
1123Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1124``x.y = v''.";
1125
1126
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001128builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001129{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130 PyObject *v;
1131 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001132
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001133 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001134 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001136 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 Py_INCREF(Py_None);
1138 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001139}
1140
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001141static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001142"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001143\n\
1144Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1145``del x.y''.";
1146
1147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001149builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001150{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001152 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001155 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001157 if (x == -1)
1158 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001160}
1161
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001162static char hash_doc[] =
1163"hash(object) -> integer\n\
1164\n\
1165Return a hash value for the object. Two objects with the same value have\n\
1166the same hash value. The reverse is not necessarily true, but likely.";
1167
1168
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001170builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001171{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyObject *v;
1173 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00001177
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001179 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001181 "hex() argument can't be converted to hex");
1182 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001183 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001184 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001185}
1186
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001187static char hex_doc[] =
1188"hex(number) -> string\n\
1189\n\
1190Return the hexadecimal representation of an integer or long integer.";
1191
1192
Tim Petersdbd9ba62000-07-09 03:09:57 +00001193static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001194
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001196builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001197{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001199 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 PyObject *res;
1201 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001202
1203 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001204 if (line == NULL)
1205 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207 return NULL;
1208 while (*str == ' ' || *str == '\t')
1209 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 globals = PyEval_GetGlobals();
1211 locals = PyEval_GetLocals();
1212 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1213 if (PyDict_SetItemString(globals, "__builtins__",
1214 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001215 return NULL;
1216 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001217 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001220}
1221
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001222static char input_doc[] =
1223"input([prompt]) -> value\n\
1224\n\
1225Equivalent to eval(raw_input(prompt)).";
1226
1227
Guido van Rossume8811f81997-02-14 15:48:05 +00001228static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001229builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001230{
1231 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001232 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001233 return NULL;
1234 Py_INCREF(s);
1235 PyString_InternInPlace(&s);
1236 return s;
1237}
1238
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001239static char intern_doc[] =
1240"intern(string) -> string\n\
1241\n\
1242``Intern'' the given string. This enters the string in the (global)\n\
1243table of interned strings whose purpose is to speed up dictionary lookups.\n\
1244Return the string itself or the previously interned string object with the\n\
1245same value.";
1246
1247
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001249builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001250{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001252 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001253
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001254 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001255 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001256 if (base == -909)
1257 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001258 else if (PyString_Check(v))
1259 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1260 else if (PyUnicode_Check(v))
1261 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1262 PyUnicode_GET_SIZE(v),
1263 base);
1264 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001265 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001266 "int() can't convert non-string with explicit base");
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001267 return NULL;
1268 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001269}
1270
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001271static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001272"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001273\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001274Convert a string or number to an integer, if possible. A floating point\n\
1275argument will be truncated towards zero (this does not include a string\n\
1276representation of a floating point number!) When converting a string, use\n\
1277the optional base. It is an error to supply a base when converting a\n\
1278non-string.";
1279
1280
1281static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001282builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001283{
1284 PyObject *v;
1285 int base = -909; /* unlikely! */
Guido van Rossumad991772001-01-12 16:03:05 +00001286
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001287 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1288 return NULL;
1289 if (base == -909)
1290 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001291 else if (PyString_Check(v))
1292 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1293 else if (PyUnicode_Check(v))
1294 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1295 PyUnicode_GET_SIZE(v),
1296 base);
1297 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001298 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001299 "long() can't convert non-string with explicit base");
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001300 return NULL;
1301 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001302}
1303
1304static char long_doc[] =
1305"long(x) -> long integer\n\
1306long(x, base) -> long integer\n\
1307\n\
1308Convert a string or number to a long integer, if possible. A floating\n\
1309point argument will be truncated towards zero (this does not include a\n\
1310string representation of a floating point number!) When converting a\n\
1311string, use the given base. It is an error to supply a base when\n\
1312converting a non-string.";
1313
1314
1315static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001316builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001317{
1318 PyObject *v;
1319
1320 if (!PyArg_ParseTuple(args, "O:float", &v))
1321 return NULL;
1322 if (PyString_Check(v))
1323 return PyFloat_FromString(v, NULL);
1324 return PyNumber_Float(v);
1325}
1326
1327static char float_doc[] =
1328"float(x) -> floating point number\n\
1329\n\
1330Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001331
1332
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333static PyObject *
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001334builtin_iter(PyObject *self, PyObject *args)
1335{
1336 PyObject *v, *w = NULL;
1337
1338 if (!PyArg_ParseTuple(args, "O|O:iter", &v, &w))
1339 return NULL;
1340 if (w == NULL)
1341 return PyObject_GetIter(v);
1342 if (!PyCallable_Check(v)) {
1343 PyErr_SetString(PyExc_TypeError,
1344 "iter(v, w): v must be callable");
1345 return NULL;
1346 }
1347 return PyCallIter_New(v, w);
1348}
1349
1350static char iter_doc[] =
1351"iter(collection) -> iterator\n\
1352iter(callable, sentinel) -> iterator\n\
1353\n\
1354Get an iterator from an object. In the first form, the argument must\n\
1355supply its own iterator, or be a sequence.\n\
1356In the second form, the callable is called until it returns the sentinel.";
1357
1358
1359static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001360builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001361{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001363 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001364
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001366 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001367 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001368 if (res < 0 && PyErr_Occurred())
1369 return NULL;
1370 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001371}
1372
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001373static char len_doc[] =
1374"len(object) -> integer\n\
1375\n\
1376Return the number of items of a sequence or mapping.";
1377
1378
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001380builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001381{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001383
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001385 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001386 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001387}
1388
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001389static char list_doc[] =
1390"list(sequence) -> list\n\
1391\n\
1392Return a new list whose items are the same as those of the argument sequence.";
1393
Guido van Rossum8861b741996-07-30 16:49:37 +00001394
1395static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001396builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001397{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001398 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001399
Guido van Rossum09df08a1998-05-22 00:51:39 +00001400 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001401
Guido van Rossum09df08a1998-05-22 00:51:39 +00001402 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1403 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001404
Guido van Rossum09df08a1998-05-22 00:51:39 +00001405 /* This swapping of stop and start is to maintain similarity with
1406 range(). */
1407 if (stop == NULL) {
1408 stop = start;
1409 start = NULL;
1410 }
1411 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001412}
1413
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001414static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001415"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001416\n\
1417Create a slice object. This is used for slicing by the Numeric extensions.";
1418
1419
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001421builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001422{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001424
Guido van Rossum43713e52000-02-29 13:59:29 +00001425 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001426 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 d = PyEval_GetLocals();
1428 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001429 return d;
1430}
1431
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001432static char locals_doc[] =
1433"locals() -> dictionary\n\
1434\n\
1435Return the dictionary containing the current scope's local variables.";
1436
1437
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438static PyObject *
Guido van Rossum53451b32001-01-17 15:47:24 +00001439min_max(PyObject *args, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440{
Tim Petersc3074532001-05-03 07:00:32 +00001441 PyObject *v, *w, *x, *it;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001442
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001444 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001445 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001446 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001447
1448 it = PyObject_GetIter(v);
1449 if (it == NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001451
1452 w = NULL; /* the result */
Tim Petersf4848da2001-05-05 00:14:56 +00001453 for (;;) {
Tim Petersc3074532001-05-03 07:00:32 +00001454 x = PyIter_Next(it);
Guido van Rossum2d951851994-08-29 12:52:16 +00001455 if (x == NULL) {
Tim Petersc3074532001-05-03 07:00:32 +00001456 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001457 Py_XDECREF(w);
1458 Py_DECREF(it);
1459 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001460 }
Tim Petersc3074532001-05-03 07:00:32 +00001461 break;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001462 }
Tim Petersc3074532001-05-03 07:00:32 +00001463
Guido van Rossum2d951851994-08-29 12:52:16 +00001464 if (w == NULL)
1465 w = x;
1466 else {
Guido van Rossum53451b32001-01-17 15:47:24 +00001467 int cmp = PyObject_RichCompareBool(x, w, op);
1468 if (cmp > 0) {
1469 Py_DECREF(w);
1470 w = x;
1471 }
1472 else if (cmp < 0) {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001473 Py_DECREF(x);
Tim Petersc3074532001-05-03 07:00:32 +00001474 Py_DECREF(w);
1475 Py_DECREF(it);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001476 return NULL;
1477 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001478 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001479 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001480 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001481 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001482 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001484 "min() or max() arg is an empty sequence");
Tim Petersc3074532001-05-03 07:00:32 +00001485 Py_DECREF(it);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001486 return w;
1487}
1488
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001490builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001491{
Guido van Rossum53451b32001-01-17 15:47:24 +00001492 return min_max(v, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001493}
1494
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001495static char min_doc[] =
1496"min(sequence) -> value\n\
1497min(a, b, c, ...) -> value\n\
1498\n\
1499With a single sequence argument, return its smallest item.\n\
1500With two or more arguments, return the smallest argument.";
1501
1502
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001504builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001505{
Guido van Rossum53451b32001-01-17 15:47:24 +00001506 return min_max(v, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001507}
1508
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001509static char max_doc[] =
1510"max(sequence) -> value\n\
1511max(a, b, c, ...) -> value\n\
1512\n\
1513With a single sequence argument, return its largest item.\n\
1514With two or more arguments, return the largest argument.";
1515
1516
Guido van Rossum79f25d91997-04-29 20:08:16 +00001517static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001518builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001519{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 PyObject *v;
1521 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001522
Guido van Rossum79f25d91997-04-29 20:08:16 +00001523 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001524 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001525 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1526 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001527 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001528 "oct() argument can't be converted to oct");
1529 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001530 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001531 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001532}
1533
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001534static char oct_doc[] =
1535"oct(number) -> string\n\
1536\n\
1537Return the octal representation of an integer or long integer.";
1538
1539
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001541builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001542{
Mark Hammondef8b6542001-05-13 08:04:26 +00001543 char *name = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001544 char *mode = "r";
1545 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001547
Mark Hammondef8b6542001-05-13 08:04:26 +00001548 if (!PyArg_ParseTuple(args, "et|si:open", Py_FileSystemDefaultEncoding,
1549 &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001550 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 f = PyFile_FromString(name, mode);
Mark Hammondef8b6542001-05-13 08:04:26 +00001552 PyMem_Free(name); /* free the encoded string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001553 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001555 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001556}
1557
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001558static char open_doc[] =
1559"open(filename[, mode[, buffering]]) -> file object\n\
1560\n\
1561Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1562writing or appending. The file will be created if it doesn't exist\n\
1563when opened for writing or appending; it will be truncated when\n\
1564opened for writing. Add a 'b' to the mode for binary files.\n\
1565Add a '+' to the mode to allow simultaneous reading and writing.\n\
1566If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1567buffered, and larger numbers specify the buffer size.";
1568
1569
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001571builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572{
Guido van Rossum09095f32000-03-10 23:00:52 +00001573 PyObject *obj;
1574 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001575 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001576
Guido van Rossum09095f32000-03-10 23:00:52 +00001577 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001578 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001579
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001580 if (PyString_Check(obj)) {
1581 size = PyString_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001582 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001583 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001584 return PyInt_FromLong(ord);
1585 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001586 } else if (PyUnicode_Check(obj)) {
1587 size = PyUnicode_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001588 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001589 ord = (long)*PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001590 return PyInt_FromLong(ord);
1591 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001592 } else {
1593 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001594 "ord() expected string of length 1, but " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001595 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001596 return NULL;
1597 }
1598
Guido van Rossumad991772001-01-12 16:03:05 +00001599 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001600 "ord() expected a character, "
1601 "but string of length %d found",
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001602 size);
1603 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604}
1605
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001606static char ord_doc[] =
1607"ord(c) -> integer\n\
1608\n\
Guido van Rossumad991772001-01-12 16:03:05 +00001609Return the integer ordinal of a one-character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001610
1611
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001613builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001614{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001615 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001616
Guido van Rossum79f25d91997-04-29 20:08:16 +00001617 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001618 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001619 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001620}
1621
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001622static char pow_doc[] =
1623"pow(x, y[, z]) -> number\n\
1624\n\
1625With two arguments, equivalent to x**y. With three arguments,\n\
1626equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1627
1628
Guido van Rossum124eff01999-02-23 16:11:01 +00001629/* Return number of items in range/xrange (lo, hi, step). step > 0
1630 * required. Return a value < 0 if & only if the true value is too
1631 * large to fit in a signed long.
1632 */
1633static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001634get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001635{
1636 /* -------------------------------------------------------------
1637 If lo >= hi, the range is empty.
1638 Else if n values are in the range, the last one is
1639 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1640 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1641 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1642 the RHS is non-negative and so truncation is the same as the
1643 floor. Letting M be the largest positive long, the worst case
1644 for the RHS numerator is hi=M, lo=-M-1, and then
1645 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1646 precision to compute the RHS exactly.
1647 ---------------------------------------------------------------*/
1648 long n = 0;
1649 if (lo < hi) {
1650 unsigned long uhi = (unsigned long)hi;
1651 unsigned long ulo = (unsigned long)lo;
1652 unsigned long diff = uhi - ulo - 1;
1653 n = (long)(diff / (unsigned long)step + 1);
1654 }
1655 return n;
1656}
1657
Guido van Rossum79f25d91997-04-29 20:08:16 +00001658static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001659builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001660{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001661 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001662 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001664
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666
Guido van Rossum79f25d91997-04-29 20:08:16 +00001667 if (PyTuple_Size(args) <= 1) {
1668 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001669 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670 &ihigh))
1671 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001672 }
1673 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001675 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001676 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001677 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001678 }
1679 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001680 PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 return NULL;
1682 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001683 if (istep > 0)
1684 bign = get_len_of_range(ilow, ihigh, istep);
1685 else
1686 bign = get_len_of_range(ihigh, ilow, -istep);
1687 n = (int)bign;
1688 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001689 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001690 "range() result has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001691 return NULL;
1692 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001694 if (v == NULL)
1695 return NULL;
1696 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001697 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001700 return NULL;
1701 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001702 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703 ilow += istep;
1704 }
1705 return v;
1706}
1707
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001708static char range_doc[] =
1709"range([start,] stop[, step]) -> list of integers\n\
1710\n\
1711Return a list containing an arithmetic progression of integers.\n\
1712range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1713When step is given, it specifies the increment (or decrement).\n\
1714For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1715These are exactly the valid indices for a list of 4 elements.";
1716
1717
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001719builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001720{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001721 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001722 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001723
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 if (PyTuple_Size(args) <= 1) {
1725 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001726 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001727 &ihigh))
1728 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001729 }
1730 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001731 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001732 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001733 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001734 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001735 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001736 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001737 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001738 return NULL;
1739 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001740 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001741 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001742 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001743 n = get_len_of_range(ihigh, ilow, -istep);
1744 if (n < 0) {
1745 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001746 "xrange() result has too many items");
Guido van Rossum124eff01999-02-23 16:11:01 +00001747 return NULL;
1748 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001750}
1751
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001752static char xrange_doc[] =
1753"xrange([start,] stop[, step]) -> xrange object\n\
1754\n\
1755Like range(), but instead of returning a list, returns an object that\n\
1756generates the numbers in the range on demand. This is slightly slower\n\
1757than range() but more memory efficient.";
1758
1759
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001761builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 PyObject *v = NULL;
1764 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001765
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001767 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1769 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001770 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001772 char *prompt;
1773 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001775 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001777 if (po == NULL)
1778 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001780 if (prompt == NULL)
1781 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001782 }
1783 else {
1784 po = NULL;
1785 prompt = "";
1786 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787 s = PyOS_Readline(prompt);
1788 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001789 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001791 return NULL;
1792 }
1793 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001794 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001795 result = NULL;
1796 }
1797 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001798 size_t len = strlen(s);
1799 if (len > INT_MAX) {
1800 PyErr_SetString(PyExc_OverflowError, "input too long");
1801 result = NULL;
1802 }
1803 else {
1804 result = PyString_FromStringAndSize(s, (int)(len-1));
1805 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001806 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001807 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001808 return result;
1809 }
Guido van Rossum90933611991-06-07 16:10:43 +00001810 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001812 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001814 return NULL;
1815 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001816 if (Py_FlushLine() != 0 ||
1817 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001818 return NULL;
1819 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001821 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001823 return NULL;
1824 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001826}
1827
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001828static char raw_input_doc[] =
1829"raw_input([prompt]) -> string\n\
1830\n\
1831Read a string from standard input. The trailing newline is stripped.\n\
1832If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1833On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1834is printed without a trailing newline before reading.";
1835
1836
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001838builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001839{
Tim Peters15d81ef2001-05-04 04:39:21 +00001840 PyObject *seq, *func, *result = NULL, *it;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001841
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001843 return NULL;
1844 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001846
Tim Peters15d81ef2001-05-04 04:39:21 +00001847 it = PyObject_GetIter(seq);
1848 if (it == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 PyErr_SetString(PyExc_TypeError,
Tim Peters15d81ef2001-05-04 04:39:21 +00001850 "reduce() arg 2 must support iteration");
1851 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001852 return NULL;
1853 }
1854
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001856 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001857
Tim Peters15d81ef2001-05-04 04:39:21 +00001858 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001860
1861 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 Py_DECREF(args);
1863 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001864 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001865 }
1866
Tim Peters15d81ef2001-05-04 04:39:21 +00001867 op2 = PyIter_Next(it);
1868 if (op2 == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +00001869 if (PyErr_Occurred())
1870 goto Fail;
1871 break;
Guido van Rossum2d951851994-08-29 12:52:16 +00001872 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001873
Guido van Rossum2d951851994-08-29 12:52:16 +00001874 if (result == NULL)
1875 result = op2;
1876 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 PyTuple_SetItem(args, 0, result);
1878 PyTuple_SetItem(args, 1, op2);
1879 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001880 goto Fail;
1881 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001882 }
1883
Guido van Rossum79f25d91997-04-29 20:08:16 +00001884 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001885
Guido van Rossum2d951851994-08-29 12:52:16 +00001886 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001888 "reduce() of empty sequence with no initial value");
Guido van Rossum2d951851994-08-29 12:52:16 +00001889
Tim Peters15d81ef2001-05-04 04:39:21 +00001890 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001891 return result;
1892
Guido van Rossum2d951851994-08-29 12:52:16 +00001893Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001894 Py_XDECREF(args);
1895 Py_XDECREF(result);
Tim Peters15d81ef2001-05-04 04:39:21 +00001896 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001897 return NULL;
1898}
1899
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001900static char reduce_doc[] =
1901"reduce(function, sequence[, initial]) -> value\n\
1902\n\
1903Apply a function of two arguments cumulatively to the items of a sequence,\n\
1904from left to right, so as to reduce the sequence to a single value.\n\
1905For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1906((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1907of the sequence in the calculation, and serves as a default when the\n\
1908sequence is empty.";
1909
1910
Guido van Rossum79f25d91997-04-29 20:08:16 +00001911static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001912builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001913{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001915
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001919}
1920
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001921static char reload_doc[] =
1922"reload(module) -> module\n\
1923\n\
1924Reload the module. The module must have been successfully imported before.";
1925
1926
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001929{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001933 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001934 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001935}
1936
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001937static char repr_doc[] =
1938"repr(object) -> string\n\
1939\n\
1940Return the canonical string representation of the object.\n\
1941For most object types, eval(repr(object)) == object.";
1942
1943
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001946{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001947 double x;
1948 double f;
1949 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001950 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001953 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001954 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001955 i = abs(ndigits);
1956 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001957 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001958 if (ndigits < 0)
1959 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001960 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001961 x *= f;
1962 if (x >= 0.0)
1963 x = floor(x + 0.5);
1964 else
1965 x = ceil(x - 0.5);
1966 if (ndigits < 0)
1967 x *= f;
1968 else
1969 x /= f;
1970 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001971}
1972
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001973static char round_doc[] =
1974"round(number[, ndigits]) -> floating point number\n\
1975\n\
1976Round a number to a given precision in decimal digits (default 0 digits).\n\
1977This always returns a floating point number. Precision may be negative.";
1978
1979
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001981builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001982{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984
Guido van Rossum79f25d91997-04-29 20:08:16 +00001985 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001986 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001988}
1989
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001990static char str_doc[] =
1991"str(object) -> string\n\
1992\n\
1993Return a nice string representation of the object.\n\
1994If the argument is a string, the return value is the same object.";
1995
1996
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001999{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002000 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002001
Guido van Rossum79f25d91997-04-29 20:08:16 +00002002 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002003 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00002004 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00002005}
2006
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002007static char tuple_doc[] =
2008"tuple(sequence) -> list\n\
2009\n\
2010Return a tuple whose items are the same as those of the argument sequence.\n\
2011If the argument is a tuple, the return value is the same object.";
2012
2013
Guido van Rossum79f25d91997-04-29 20:08:16 +00002014static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002015builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002016{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002018
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002020 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 v = (PyObject *)v->ob_type;
2022 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002023 return v;
2024}
2025
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002026static char type_doc[] =
2027"type(object) -> type object\n\
2028\n\
2029Return the type of the object.";
2030
2031
Guido van Rossum79f25d91997-04-29 20:08:16 +00002032static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002033builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00002034{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 PyObject *v = NULL;
2036 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002037
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002039 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00002040 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002042 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 if (!PyErr_Occurred())
2044 PyErr_SetString(PyExc_SystemError,
2045 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002046 }
2047 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00002049 }
2050 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002051 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00002052 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00002054 "vars() argument must have __dict__ attribute");
2055 return NULL;
2056 }
2057 }
2058 return d;
2059}
2060
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002061static char vars_doc[] =
2062"vars([object]) -> dictionary\n\
2063\n\
2064Without arguments, equivalent to locals().\n\
2065With an argument, equivalent to object.__dict__.";
2066
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002067static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002068builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002069{
2070 PyObject *inst;
2071 PyObject *cls;
Guido van Rossum823649d2001-03-21 18:40:58 +00002072 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002073
Guido van Rossum43713e52000-02-29 13:59:29 +00002074 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002075 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002076
Guido van Rossum823649d2001-03-21 18:40:58 +00002077 retval = PyObject_IsInstance(inst, cls);
2078 if (retval < 0)
Guido van Rossumad991772001-01-12 16:03:05 +00002079 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002080 return PyInt_FromLong(retval);
2081}
2082
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002083static char isinstance_doc[] =
2084"isinstance(object, class-or-type) -> Boolean\n\
2085\n\
2086Return whether an object is an instance of a class or of a subclass thereof.\n\
2087With a type as second argument, return whether that is the object's type.";
2088
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002089
2090static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002091builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002092{
2093 PyObject *derived;
2094 PyObject *cls;
2095 int retval;
2096
Guido van Rossum43713e52000-02-29 13:59:29 +00002097 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002098 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002099
Guido van Rossum823649d2001-03-21 18:40:58 +00002100 retval = PyObject_IsSubclass(derived, cls);
2101 if (retval < 0)
2102 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002103 return PyInt_FromLong(retval);
2104}
2105
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002106static char issubclass_doc[] =
2107"issubclass(C, B) -> Boolean\n\
2108\n\
2109Return whether class C is a subclass (i.e., a derived class) of class B.";
2110
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002111
Barry Warsawbd599b52000-08-03 15:45:29 +00002112static PyObject*
2113builtin_zip(PyObject *self, PyObject *args)
2114{
2115 PyObject *ret;
2116 int itemsize = PySequence_Length(args);
Tim Peters8572b4f2001-05-06 01:05:02 +00002117 int i;
2118 PyObject *itlist; /* tuple of iterators */
Barry Warsawbd599b52000-08-03 15:45:29 +00002119
2120 if (itemsize < 1) {
2121 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002122 "zip() requires at least one sequence");
Barry Warsawbd599b52000-08-03 15:45:29 +00002123 return NULL;
2124 }
2125 /* args must be a tuple */
2126 assert(PyTuple_Check(args));
2127
Tim Peters8572b4f2001-05-06 01:05:02 +00002128 /* allocate result list */
Barry Warsawbd599b52000-08-03 15:45:29 +00002129 if ((ret = PyList_New(0)) == NULL)
2130 return NULL;
2131
Tim Peters8572b4f2001-05-06 01:05:02 +00002132 /* obtain iterators */
2133 itlist = PyTuple_New(itemsize);
2134 if (itlist == NULL)
2135 goto Fail_ret;
2136 for (i = 0; i < itemsize; ++i) {
2137 PyObject *item = PyTuple_GET_ITEM(args, i);
2138 PyObject *it = PyObject_GetIter(item);
2139 if (it == NULL) {
2140 if (PyErr_ExceptionMatches(PyExc_TypeError))
2141 PyErr_Format(PyExc_TypeError,
2142 "zip argument #%d must support iteration",
2143 i+1);
2144 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00002145 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002146 PyTuple_SET_ITEM(itlist, i, it);
2147 }
Barry Warsawbd599b52000-08-03 15:45:29 +00002148
Tim Peters8572b4f2001-05-06 01:05:02 +00002149 /* build result into ret list */
2150 for (;;) {
2151 int status;
2152 PyObject *next = PyTuple_New(itemsize);
2153 if (!next)
2154 goto Fail_ret_itlist;
2155
2156 for (i = 0; i < itemsize; i++) {
2157 PyObject *it = PyTuple_GET_ITEM(itlist, i);
2158 PyObject *item = PyIter_Next(it);
Barry Warsawbd599b52000-08-03 15:45:29 +00002159 if (!item) {
Tim Peters8572b4f2001-05-06 01:05:02 +00002160 if (PyErr_Occurred()) {
2161 Py_DECREF(ret);
2162 ret = NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00002163 }
2164 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00002165 Py_DECREF(itlist);
2166 return ret;
Barry Warsawbd599b52000-08-03 15:45:29 +00002167 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002168 PyTuple_SET_ITEM(next, i, item);
Barry Warsawbd599b52000-08-03 15:45:29 +00002169 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002170
2171 status = PyList_Append(ret, next);
Barry Warsawbd599b52000-08-03 15:45:29 +00002172 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00002173 if (status < 0)
2174 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00002175 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002176
2177Fail_ret_itlist:
2178 Py_DECREF(itlist);
2179Fail_ret:
2180 Py_DECREF(ret);
2181 return NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00002182}
2183
2184
2185static char zip_doc[] =
2186"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2187\n\
2188Return a list of tuples, where each tuple contains the i-th element\n\
2189from each of the argument sequences. The returned list is truncated\n\
2190in length to the length of the shortest argument sequence.";
2191
2192
Guido van Rossum79f25d91997-04-29 20:08:16 +00002193static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002194 {"__import__", builtin___import__, 1, import_doc},
2195 {"abs", builtin_abs, 1, abs_doc},
2196 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002197 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002198 {"callable", builtin_callable, 1, callable_doc},
2199 {"chr", builtin_chr, 1, chr_doc},
2200 {"cmp", builtin_cmp, 1, cmp_doc},
2201 {"coerce", builtin_coerce, 1, coerce_doc},
2202 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002203#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002204 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002205#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002206 {"delattr", builtin_delattr, 1, delattr_doc},
2207 {"dir", builtin_dir, 1, dir_doc},
2208 {"divmod", builtin_divmod, 1, divmod_doc},
2209 {"eval", builtin_eval, 1, eval_doc},
2210 {"execfile", builtin_execfile, 1, execfile_doc},
2211 {"filter", builtin_filter, 1, filter_doc},
2212 {"float", builtin_float, 1, float_doc},
2213 {"getattr", builtin_getattr, 1, getattr_doc},
2214 {"globals", builtin_globals, 1, globals_doc},
2215 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2216 {"hash", builtin_hash, 1, hash_doc},
2217 {"hex", builtin_hex, 1, hex_doc},
2218 {"id", builtin_id, 1, id_doc},
2219 {"input", builtin_input, 1, input_doc},
2220 {"intern", builtin_intern, 1, intern_doc},
2221 {"int", builtin_int, 1, int_doc},
2222 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2223 {"issubclass", builtin_issubclass, 1, issubclass_doc},
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002224 {"iter", builtin_iter, 1, iter_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002225 {"len", builtin_len, 1, len_doc},
2226 {"list", builtin_list, 1, list_doc},
2227 {"locals", builtin_locals, 1, locals_doc},
2228 {"long", builtin_long, 1, long_doc},
2229 {"map", builtin_map, 1, map_doc},
2230 {"max", builtin_max, 1, max_doc},
2231 {"min", builtin_min, 1, min_doc},
2232 {"oct", builtin_oct, 1, oct_doc},
2233 {"open", builtin_open, 1, open_doc},
2234 {"ord", builtin_ord, 1, ord_doc},
2235 {"pow", builtin_pow, 1, pow_doc},
2236 {"range", builtin_range, 1, range_doc},
2237 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2238 {"reduce", builtin_reduce, 1, reduce_doc},
2239 {"reload", builtin_reload, 1, reload_doc},
2240 {"repr", builtin_repr, 1, repr_doc},
2241 {"round", builtin_round, 1, round_doc},
2242 {"setattr", builtin_setattr, 1, setattr_doc},
2243 {"slice", builtin_slice, 1, slice_doc},
2244 {"str", builtin_str, 1, str_doc},
2245 {"tuple", builtin_tuple, 1, tuple_doc},
2246 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002247 {"unicode", builtin_unicode, 1, unicode_doc},
2248 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002249 {"vars", builtin_vars, 1, vars_doc},
2250 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002251 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002252 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002253};
2254
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002255static char builtin_doc[] =
2256"Built-in functions, exceptions, and other objects.\n\
2257\n\
2258Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2259
Guido van Rossum25ce5661997-08-02 03:10:38 +00002260PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002261_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002262{
Fred Drake5550de32000-06-20 04:54:19 +00002263 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002264 mod = Py_InitModule4("__builtin__", builtin_methods,
2265 builtin_doc, (PyObject *)NULL,
2266 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002267 if (mod == NULL)
2268 return NULL;
2269 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002270 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2271 return NULL;
2272 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2273 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00002274 if (PyDict_SetItemString(dict, "NotImplemented",
Neil Schemenauer23ab1992001-01-04 01:48:42 +00002275 Py_NotImplemented) < 0)
2276 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002277 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2278 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2279 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002280 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002281 }
2282 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002283
Guido van Rossum25ce5661997-08-02 03:10:38 +00002284 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002285}
2286
Guido van Rossume77a7571993-11-03 15:01:26 +00002287/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002288
Guido van Rossum79f25d91997-04-29 20:08:16 +00002289static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002290filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002291{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002293 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002294 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002295
Guido van Rossumb7b45621995-08-04 04:07:45 +00002296 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002297 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002298 return tuple;
2299 }
2300
Guido van Rossum79f25d91997-04-29 20:08:16 +00002301 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002302 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002303
Guido van Rossum12d12c51993-10-26 17:58:25 +00002304 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002305 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002306 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002307
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002309 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 if (func == Py_None) {
2311 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002312 good = item;
2313 }
2314 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002316 if (arg == NULL)
2317 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 good = PyEval_CallObject(func, arg);
2319 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002320 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002321 goto Fail_1;
2322 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002323 ok = PyObject_IsTrue(good);
2324 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002325 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002326 Py_INCREF(item);
2327 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002328 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002329 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002330 }
2331
Tim Peters4324aa32001-05-28 22:30:08 +00002332 if (_PyTuple_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002333 return NULL;
2334
Guido van Rossum12d12c51993-10-26 17:58:25 +00002335 return result;
2336
Guido van Rossum12d12c51993-10-26 17:58:25 +00002337Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002338 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002339 return NULL;
2340}
2341
2342
Guido van Rossume77a7571993-11-03 15:01:26 +00002343/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002344
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002346filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002347{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002349 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002351
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002353 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002355 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002356 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002357 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002358 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002359
Guido van Rossum12d12c51993-10-26 17:58:25 +00002360 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002362 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002363
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002364 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2365 if (item == NULL)
2366 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 arg = Py_BuildValue("(O)", item);
Tim Peters388ed082001-04-07 20:34:48 +00002368 if (arg == NULL) {
2369 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002370 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00002371 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002372 good = PyEval_CallObject(func, arg);
2373 Py_DECREF(arg);
Tim Peters388ed082001-04-07 20:34:48 +00002374 if (good == NULL) {
2375 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002376 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00002377 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002378 ok = PyObject_IsTrue(good);
2379 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002380 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002381 PyString_AS_STRING((PyStringObject *)result)[j++] =
2382 PyString_AS_STRING((PyStringObject *)item)[0];
Tim Peters388ed082001-04-07 20:34:48 +00002383 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002384 }
2385
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002387 return NULL;
2388
Guido van Rossum12d12c51993-10-26 17:58:25 +00002389 return result;
2390
Guido van Rossum12d12c51993-10-26 17:58:25 +00002391Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002393 return NULL;
2394}