blob: b647f3b74d2aa8dd391633fec4d81778d337bc33 [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
Guido van Rossum12d12c51993-10-26 17:58:25 +0000267 return result;
268
Tim Peters0e57abf2001-05-02 07:39:38 +0000269Fail_result_it:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 Py_DECREF(result);
Tim Peters0e57abf2001-05-02 07:39:38 +0000271Fail_it:
272 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000273 return NULL;
274}
275
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000276static char filter_doc[] =
277"filter(function, sequence) -> list\n\
278\n\
279Return a list containing those items of sequence for which function(item)\n\
280is true. If function is None, return a list of items that are true.";
281
282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000284builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285{
286 long x;
287 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000288
Guido van Rossum79f25d91997-04-29 20:08:16 +0000289 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000290 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000291 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyErr_SetString(PyExc_ValueError,
293 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000294 return NULL;
295 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000296 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000298}
299
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000300static char chr_doc[] =
301"chr(i) -> character\n\
302\n\
303Return a string of one character with ordinal i; 0 <= i < 256.";
304
305
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000307builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000308{
309 long x;
310 Py_UNICODE s[1];
311
312 if (!PyArg_ParseTuple(args, "l:unichr", &x))
313 return NULL;
314 if (x < 0 || x >= 65536) {
315 PyErr_SetString(PyExc_ValueError,
316 "unichr() arg not in range(65536)");
317 return NULL;
318 }
319 s[0] = (Py_UNICODE)x;
320 return PyUnicode_FromUnicode(s, 1);
321}
322
323static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000324"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000325\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000326Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000327
328
329static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000330builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000331{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000333 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000334
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000336 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000337 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000338 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000339 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000340}
341
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000342static char cmp_doc[] =
343"cmp(x, y) -> integer\n\
344\n\
345Return negative if x<y, zero if x==y, positive if x>y.";
346
347
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000349builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000350{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000351 PyObject *v, *w;
352 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000353
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000355 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000357 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 res = Py_BuildValue("(OO)", v, w);
359 Py_DECREF(v);
360 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000361 return res;
362}
363
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000364static char coerce_doc[] =
365"coerce(x, y) -> None or (x1, y1)\n\
366\n\
367When x and y can be coerced to values of the same type, return a tuple\n\
368containing the coerced values. When they can't be coerced, return None.";
369
370
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000372builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000373{
374 char *str;
375 char *filename;
376 char *startstr;
377 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000378
Guido van Rossum79f25d91997-04-29 20:08:16 +0000379 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000380 return NULL;
381 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000382 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000383 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000384 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000385 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000386 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000387 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000388 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000389 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000390 return NULL;
391 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000392 if (PyEval_GetNestedScopes()) {
393 PyCompilerFlags cf;
394 cf.cf_nested_scopes = 1;
395 return Py_CompileStringFlags(str, filename, start, &cf);
396 } else
397 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000398}
399
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000400static char compile_doc[] =
401"compile(source, filename, mode) -> code object\n\
402\n\
403Compile the source string (a Python module, statement or expression)\n\
404into a code object that can be executed by the exec statement or eval().\n\
405The filename will be used for run-time error messages.\n\
406The mode must be 'exec' to compile a module, 'single' to compile a\n\
407single (interactive) statement, or 'eval' to compile an expression.";
408
409
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000410#ifndef WITHOUT_COMPLEX
411
Guido van Rossum79f25d91997-04-29 20:08:16 +0000412static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000413complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000414{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000415 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000416 const char *s, *start;
417 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000418 double x=0.0, y=0.0, z;
419 int got_re=0, got_im=0, done=0;
420 int digit_or_dot;
421 int sw_error=0;
422 int sign;
423 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000424 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000425 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000426
Guido van Rossum9e896b32000-04-05 20:11:21 +0000427 if (PyString_Check(v)) {
428 s = PyString_AS_STRING(v);
429 len = PyString_GET_SIZE(v);
430 }
431 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000432 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
433 PyErr_SetString(PyExc_ValueError,
434 "complex() literal too large to convert");
435 return NULL;
436 }
Guido van Rossumad991772001-01-12 16:03:05 +0000437 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000438 PyUnicode_GET_SIZE(v),
Guido van Rossumad991772001-01-12 16:03:05 +0000439 s_buffer,
Guido van Rossum9e896b32000-04-05 20:11:21 +0000440 NULL))
441 return NULL;
442 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000443 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000444 }
445 else if (PyObject_AsCharBuffer(v, &s, &len)) {
446 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000447 "complex() arg is not a string");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000448 return NULL;
449 }
Guido van Rossum11950231999-03-25 21:16:07 +0000450
451 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000452 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000453 while (*s && isspace(Py_CHARMASK(*s)))
454 s++;
455 if (s[0] == '\0') {
456 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000457 "complex() arg is an empty string");
Guido van Rossum11950231999-03-25 21:16:07 +0000458 return NULL;
459 }
460
461 z = -1.0;
462 sign = 1;
463 do {
Guido van Rossumad991772001-01-12 16:03:05 +0000464
Guido van Rossum11950231999-03-25 21:16:07 +0000465 switch (*s) {
466
467 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000468 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000469 PyErr_SetString(
470 PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000471 "complex() arg contains a null byte");
Guido van Rossum11950231999-03-25 21:16:07 +0000472 return NULL;
473 }
474 if(!done) sw_error=1;
475 break;
Guido van Rossumad991772001-01-12 16:03:05 +0000476
Guido van Rossum11950231999-03-25 21:16:07 +0000477 case '-':
478 sign = -1;
479 /* Fallthrough */
480 case '+':
481 if (done) sw_error=1;
482 s++;
483 if ( *s=='\0'||*s=='+'||*s=='-' ||
484 isspace(Py_CHARMASK(*s)) ) sw_error=1;
485 break;
486
487 case 'J':
488 case 'j':
489 if (got_im || done) {
490 sw_error = 1;
491 break;
492 }
493 if (z<0.0) {
494 y=sign;
495 }
496 else{
497 y=sign*z;
498 }
499 got_im=1;
500 s++;
501 if (*s!='+' && *s!='-' )
502 done=1;
503 break;
504
505 default:
506 if (isspace(Py_CHARMASK(*s))) {
507 while (*s && isspace(Py_CHARMASK(*s)))
508 s++;
509 if (s[0] != '\0')
510 sw_error=1;
511 else
512 done = 1;
513 break;
514 }
515 digit_or_dot =
516 (*s=='.' || isdigit(Py_CHARMASK(*s)));
517 if (done||!digit_or_dot) {
518 sw_error=1;
519 break;
520 }
521 errno = 0;
522 PyFPE_START_PROTECT("strtod", return 0)
523 z = strtod(s, &end) ;
524 PyFPE_END_PROTECT(z)
525 if (errno != 0) {
526 sprintf(buffer,
527 "float() out of range: %.150s", s);
528 PyErr_SetString(
529 PyExc_ValueError,
530 buffer);
531 return NULL;
532 }
533 s=end;
534 if (*s=='J' || *s=='j') {
Guido van Rossumad991772001-01-12 16:03:05 +0000535
Guido van Rossum11950231999-03-25 21:16:07 +0000536 break;
537 }
538 if (got_re) {
539 sw_error=1;
540 break;
541 }
542
543 /* accept a real part */
544 x=sign*z;
545 got_re=1;
546 if (got_im) done=1;
547 z = -1.0;
548 sign = 1;
549 break;
Guido van Rossumad991772001-01-12 16:03:05 +0000550
Guido van Rossum11950231999-03-25 21:16:07 +0000551 } /* end of switch */
552
553 } while (*s!='\0' && !sw_error);
554
555 if (sw_error) {
556 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000557 "complex() arg is a malformed string");
Guido van Rossum11950231999-03-25 21:16:07 +0000558 return NULL;
559 }
560
561 return PyComplex_FromDoubles(x,y);
562}
563
564static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000565builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000566{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 PyObject *r, *i, *tmp;
568 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000569 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000570 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000571
572 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000574 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000575 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000576 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000577 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000578 nbr->nb_float == NULL ||
579 (i != NULL &&
580 ((nbi = i->ob_type->tp_as_number) == NULL ||
581 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000583 "complex() arg can't be converted to complex");
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000584 return NULL;
585 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000586 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 if (PyInstance_Check(r)) {
588 static PyObject *complexstr;
589 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000590 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000591 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000592 if (complexstr == NULL)
593 return NULL;
594 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000596 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000598 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000600 if (args == NULL)
601 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 r = PyEval_CallObject(f, args);
603 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000604 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000605 if (r == NULL)
606 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000607 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000608 }
609 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 if (PyComplex_Check(r)) {
611 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000612 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000614 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000615 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000616 else {
Guido van Rossum8dabbf12001-01-19 02:11:59 +0000617 tmp = PyNumber_Float(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000618 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000620 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000621 if (tmp == NULL)
622 return NULL;
Guido van Rossum8dabbf12001-01-19 02:11:59 +0000623 if (!PyFloat_Check(tmp)) {
624 PyErr_SetString(PyExc_TypeError,
625 "float(r) didn't return a float");
626 Py_DECREF(tmp);
627 return NULL;
628 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 cr.real = PyFloat_AsDouble(tmp);
630 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000631 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000632 }
633 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000634 ci.real = 0.0;
635 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000636 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 else if (PyComplex_Check(i))
638 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000639 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000640 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000641 if (tmp == NULL)
642 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 ci.real = PyFloat_AsDouble(tmp);
644 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000645 ci.imag = 0.;
646 }
647 cr.real -= ci.imag;
648 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000650}
651
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000652static char complex_doc[] =
653"complex(real[, imag]) -> complex number\n\
654\n\
655Create a complex number from a real part and an optional imaginary part.\n\
656This is equivalent to (real + imag*1j) where imag defaults to 0.";
657
658
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000659#endif
660
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000662builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000663{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000664 static char *attrlist[] = {"__members__", "__methods__", NULL};
665 PyObject *v = NULL, *l = NULL, *m = NULL;
666 PyObject *d, *x;
667 int i;
668 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000672 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000673 x = PyEval_GetLocals();
674 if (x == NULL)
675 goto error;
676 l = PyMapping_Keys(x);
677 if (l == NULL)
678 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000679 }
680 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000682 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000683 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000684 else {
685 l = PyMapping_Keys(d);
686 if (l == NULL)
687 PyErr_Clear();
688 Py_DECREF(d);
689 }
690 if (l == NULL) {
691 l = PyList_New(0);
692 if (l == NULL)
693 goto error;
694 }
695 for (s = attrlist; *s != NULL; s++) {
696 m = PyObject_GetAttrString(v, *s);
697 if (m == NULL) {
698 PyErr_Clear();
699 continue;
700 }
701 for (i = 0; ; i++) {
702 x = PySequence_GetItem(m, i);
703 if (x == NULL) {
704 PyErr_Clear();
705 break;
706 }
707 if (PyList_Append(l, x) != 0) {
708 Py_DECREF(x);
709 Py_DECREF(m);
710 goto error;
711 }
712 Py_DECREF(x);
713 }
714 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000715 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000716 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000717 if (PyList_Sort(l) != 0)
718 goto error;
719 return l;
720 error:
721 Py_XDECREF(l);
722 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000723}
724
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000725static char dir_doc[] =
726"dir([object]) -> list of strings\n\
727\n\
728Return an alphabetized list of names comprising (some of) the attributes\n\
729of the given object. Without an argument, the names in the current scope\n\
730are listed. With an instance argument, only the instance attributes are\n\
731returned. With a class argument, attributes of the base class are not\n\
732returned. For other types or arguments, this may list members or methods.";
733
734
Guido van Rossum79f25d91997-04-29 20:08:16 +0000735static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000736builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000737{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000738 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000739
Guido van Rossum79f25d91997-04-29 20:08:16 +0000740 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000741 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000742 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000743}
744
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000745static char divmod_doc[] =
746"divmod(x, y) -> (div, mod)\n\
747\n\
748Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
749
750
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000752builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000753{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 PyObject *cmd;
755 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000757
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 &PyDict_Type, &globals,
761 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000763 if (globals == Py_None) {
764 globals = PyEval_GetGlobals();
765 if (locals == Py_None)
766 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000767 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000769 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
771 if (PyDict_SetItemString(globals, "__builtins__",
772 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000773 return NULL;
774 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if (PyCode_Check(cmd))
776 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000777 if (!PyString_Check(cmd) &&
778 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000780 "eval() arg 1 must be a string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000781 return NULL;
782 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000783 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000785 while (*str == ' ' || *str == '\t')
786 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000787 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788}
789
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000790static char eval_doc[] =
791"eval(source[, globals[, locals]]) -> value\n\
792\n\
793Evaluate the source in the context of globals and locals.\n\
794The source may be a string representing a Python expression\n\
795or a code object as returned by compile().\n\
796The globals and locals are dictionaries, defaulting to the current\n\
797globals and locals. If only globals is given, locals defaults to it.";
798
799
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000801builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000802{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 PyObject *globals = Py_None, *locals = Py_None;
805 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000806 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000809 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 &PyDict_Type, &globals,
811 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000812 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 if (globals == Py_None) {
814 globals = PyEval_GetGlobals();
815 if (locals == Py_None)
816 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000817 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000819 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
821 if (PyDict_SetItemString(globals, "__builtins__",
822 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000823 return NULL;
824 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000827 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000828 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000830 return NULL;
831 }
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000832 if (PyEval_GetNestedScopes()) {
833 PyCompilerFlags cf;
834 cf.cf_nested_scopes = 1;
Tim Peters748b8bb2001-04-28 08:20:22 +0000835 res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000836 locals, 1, &cf);
Tim Peters748b8bb2001-04-28 08:20:22 +0000837 } else
838 res = PyRun_FileEx(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000839 locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000840 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000841}
842
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000843static char execfile_doc[] =
844"execfile(filename[, globals[, locals]])\n\
845\n\
846Read and execute a Python script from a file.\n\
847The globals and locals are dictionaries, defaulting to the current\n\
848globals and locals. If only globals is given, locals defaults to it.";
849
850
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000852builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000853{
Guido van Rossum950ff291998-06-29 13:38:57 +0000854 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000857 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000858 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000859 result = PyObject_GetAttr(v, name);
860 if (result == NULL && dflt != NULL) {
861 PyErr_Clear();
862 Py_INCREF(dflt);
863 result = dflt;
864 }
865 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000866}
867
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000868static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000869"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000870\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000871Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
872When a default argument is given, it is returned when the attribute doesn't\n\
873exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000874
875
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000877builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000878{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000880
Guido van Rossum43713e52000-02-29 13:59:29 +0000881 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000882 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 d = PyEval_GetGlobals();
884 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000885 return d;
886}
887
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000888static char globals_doc[] =
889"globals() -> dictionary\n\
890\n\
891Return the dictionary containing the current scope's global variables.";
892
893
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000895builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000896{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 PyObject *v;
898 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000900 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000901 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000903 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000905 Py_INCREF(Py_False);
906 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000907 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000909 Py_INCREF(Py_True);
910 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000911}
912
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000913static char hasattr_doc[] =
914"hasattr(object, name) -> Boolean\n\
915\n\
916Return whether the object has an attribute with the given name.\n\
917(This is done by calling getattr(object, name) and catching exceptions.)";
918
919
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000921builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000922{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000926 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000927 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000928}
929
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000930static char id_doc[] =
931"id(object) -> integer\n\
932\n\
933Return the identity of an object. This is guaranteed to be unique among\n\
934simultaneously existing objects. (Hint: it's the object's memory address.)";
935
936
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000938builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000939{
940 typedef struct {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000941 PyObject *it; /* the iterator object */
942 int saw_StopIteration; /* bool: did the iterator end? */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000943 } sequence;
944
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000946 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000947 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000948 register int i, j;
949
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000951 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 PyErr_SetString(PyExc_TypeError,
953 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000954 return NULL;
955 }
956
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000958 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000959
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000960 if (func == Py_None && n == 1) {
961 /* map(None, S) is the same as list(S). */
962 return PySequence_List(PyTuple_GetItem(args, 1));
963 }
964
Tim Peters4e9afdc2001-05-03 23:54:49 +0000965 /* Get space for sequence descriptors. Must NULL out the iterator
966 * pointers so that jumping to Fail_2 later doesn't see trash.
967 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
969 PyErr_NoMemory();
Tim Peters4e9afdc2001-05-03 23:54:49 +0000970 return NULL;
971 }
972 for (i = 0; i < n; ++i) {
973 seqs[i].it = (PyObject*)NULL;
974 seqs[i].saw_StopIteration = 0;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000975 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000976
Tim Peters4e9afdc2001-05-03 23:54:49 +0000977 /* Do a first pass to obtain iterators for the arguments, and set len
978 * to the largest of their lengths.
Tim Peters748b8bb2001-04-28 08:20:22 +0000979 */
Tim Peters4e9afdc2001-05-03 23:54:49 +0000980 len = 0;
981 for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
982 PyObject *curseq;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000983 int curlen;
Guido van Rossumad991772001-01-12 16:03:05 +0000984
Tim Peters4e9afdc2001-05-03 23:54:49 +0000985 /* Get iterator. */
986 curseq = PyTuple_GetItem(args, i+1);
987 sqp->it = PyObject_GetIter(curseq);
988 if (sqp->it == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000989 static char errmsg[] =
Tim Peters4e9afdc2001-05-03 23:54:49 +0000990 "argument %d to map() must support iteration";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000991 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000992 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000994 goto Fail_2;
995 }
996
Tim Peters4e9afdc2001-05-03 23:54:49 +0000997 /* Update len. */
998 curlen = -1; /* unknown */
999 if (PySequence_Check(curseq) &&
1000 curseq->ob_type->tp_as_sequence->sq_length) {
1001 curlen = PySequence_Size(curseq);
1002 if (curlen < 0)
1003 PyErr_Clear();
1004 }
Tim Peters748b8bb2001-04-28 08:20:22 +00001005 if (curlen < 0)
Tim Peters4e9afdc2001-05-03 23:54:49 +00001006 curlen = 8; /* arbitrary */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001007 if (curlen > len)
1008 len = curlen;
1009 }
1010
Tim Peters4e9afdc2001-05-03 23:54:49 +00001011 /* Get space for the result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001013 goto Fail_2;
1014
Tim Peters4e9afdc2001-05-03 23:54:49 +00001015 /* Iterate over the sequences until all have stopped. */
Guido van Rossum2d951851994-08-29 12:52:16 +00001016 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 PyObject *alist, *item=NULL, *value;
Tim Peters4e9afdc2001-05-03 23:54:49 +00001018 int numactive = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +00001021 alist = NULL;
Tim Peters4e9afdc2001-05-03 23:54:49 +00001022 else if ((alist = PyTuple_New(n)) == NULL)
1023 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001024
1025 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Tim Peters4e9afdc2001-05-03 23:54:49 +00001026 if (sqp->saw_StopIteration) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 Py_INCREF(Py_None);
1028 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001029 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +00001031 item = PyIter_Next(sqp->it);
1032 if (item)
1033 ++numactive;
1034 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +00001035 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001036 Py_XDECREF(alist);
1037 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001038 }
Tim Peters4e9afdc2001-05-03 23:54:49 +00001039 Py_INCREF(Py_None);
1040 item = Py_None;
1041 sqp->saw_StopIteration = 1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001042 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001043 }
Tim Peters4e9afdc2001-05-03 23:54:49 +00001044 if (alist)
1045 PyTuple_SET_ITEM(alist, j, item);
1046 else
Guido van Rossum2d951851994-08-29 12:52:16 +00001047 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048 }
1049
Guido van Rossum32120311995-07-10 13:52:21 +00001050 if (!alist)
1051 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001052
Tim Peters4e9afdc2001-05-03 23:54:49 +00001053 if (numactive == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001055 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001056 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001057
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001059 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001060 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 value = PyEval_CallObject(func, alist);
1062 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001063 if (value == NULL)
1064 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001065 }
1066 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001067 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001068 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001069 if (status < 0)
1070 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001071 }
Tim Peters4e9afdc2001-05-03 23:54:49 +00001072 else if (PyList_SetItem(result, i, value) < 0)
1073 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001074 }
1075
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001076 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1077 goto Fail_1;
1078
Tim Peters4e9afdc2001-05-03 23:54:49 +00001079 goto Succeed;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001080
Guido van Rossum12d12c51993-10-26 17:58:25 +00001081Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001083Fail_2:
Tim Peters4e9afdc2001-05-03 23:54:49 +00001084 result = NULL;
1085Succeed:
1086 assert(seqs);
1087 for (i = 0; i < n; ++i)
1088 Py_XDECREF(seqs[i].it);
1089 PyMem_DEL(seqs);
1090 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001091}
1092
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001093static char map_doc[] =
1094"map(function, sequence[, sequence, ...]) -> list\n\
1095\n\
1096Return a list of the results of applying the function to the items of\n\
1097the argument sequence(s). If more than one sequence is given, the\n\
1098function is called with an argument list consisting of the corresponding\n\
1099item of each sequence, substituting None for missing values when not all\n\
1100sequences have the same length. If the function is None, return a list of\n\
1101the items of the sequence (or a list of tuples if more than one sequence).";
1102
1103
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001105builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001106{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107 PyObject *v;
1108 PyObject *name;
1109 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001110
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001111 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001112 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001114 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 Py_INCREF(Py_None);
1116 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001117}
1118
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001119static char setattr_doc[] =
1120"setattr(object, name, value)\n\
1121\n\
1122Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1123``x.y = v''.";
1124
1125
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001127builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001128{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129 PyObject *v;
1130 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001131
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001132 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001133 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001135 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 Py_INCREF(Py_None);
1137 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001138}
1139
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001140static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001141"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001142\n\
1143Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1144``del x.y''.";
1145
1146
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001148builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001149{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001151 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001154 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001156 if (x == -1)
1157 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001159}
1160
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001161static char hash_doc[] =
1162"hash(object) -> integer\n\
1163\n\
1164Return a hash value for the object. Two objects with the same value have\n\
1165the same hash value. The reverse is not necessarily true, but likely.";
1166
1167
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001169builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001170{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 PyObject *v;
1172 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001173
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00001176
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001177 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001178 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001180 "hex() argument can't be converted to hex");
1181 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001182 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001183 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001184}
1185
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001186static char hex_doc[] =
1187"hex(number) -> string\n\
1188\n\
1189Return the hexadecimal representation of an integer or long integer.";
1190
1191
Tim Petersdbd9ba62000-07-09 03:09:57 +00001192static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001193
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001195builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001198 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 PyObject *res;
1200 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001201
1202 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001203 if (line == NULL)
1204 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001205 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001206 return NULL;
1207 while (*str == ' ' || *str == '\t')
1208 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 globals = PyEval_GetGlobals();
1210 locals = PyEval_GetLocals();
1211 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1212 if (PyDict_SetItemString(globals, "__builtins__",
1213 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001214 return NULL;
1215 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001216 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001219}
1220
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001221static char input_doc[] =
1222"input([prompt]) -> value\n\
1223\n\
1224Equivalent to eval(raw_input(prompt)).";
1225
1226
Guido van Rossume8811f81997-02-14 15:48:05 +00001227static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001228builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001229{
1230 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001231 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001232 return NULL;
1233 Py_INCREF(s);
1234 PyString_InternInPlace(&s);
1235 return s;
1236}
1237
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001238static char intern_doc[] =
1239"intern(string) -> string\n\
1240\n\
1241``Intern'' the given string. This enters the string in the (global)\n\
1242table of interned strings whose purpose is to speed up dictionary lookups.\n\
1243Return the string itself or the previously interned string object with the\n\
1244same value.";
1245
1246
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001248builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001249{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001251 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001253 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001255 if (base == -909)
1256 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001257 else if (PyString_Check(v))
1258 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1259 else if (PyUnicode_Check(v))
1260 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1261 PyUnicode_GET_SIZE(v),
1262 base);
1263 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001264 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001265 "int() can't convert non-string with explicit base");
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001266 return NULL;
1267 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001268}
1269
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001270static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001271"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001272\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001273Convert a string or number to an integer, if possible. A floating point\n\
1274argument will be truncated towards zero (this does not include a string\n\
1275representation of a floating point number!) When converting a string, use\n\
1276the optional base. It is an error to supply a base when converting a\n\
1277non-string.";
1278
1279
1280static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001281builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001282{
1283 PyObject *v;
1284 int base = -909; /* unlikely! */
Guido van Rossumad991772001-01-12 16:03:05 +00001285
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001286 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1287 return NULL;
1288 if (base == -909)
1289 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001290 else if (PyString_Check(v))
1291 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1292 else if (PyUnicode_Check(v))
1293 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1294 PyUnicode_GET_SIZE(v),
1295 base);
1296 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001297 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001298 "long() can't convert non-string with explicit base");
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001299 return NULL;
1300 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001301}
1302
1303static char long_doc[] =
1304"long(x) -> long integer\n\
1305long(x, base) -> long integer\n\
1306\n\
1307Convert a string or number to a long integer, if possible. A floating\n\
1308point argument will be truncated towards zero (this does not include a\n\
1309string representation of a floating point number!) When converting a\n\
1310string, use the given base. It is an error to supply a base when\n\
1311converting a non-string.";
1312
1313
1314static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001316{
1317 PyObject *v;
1318
1319 if (!PyArg_ParseTuple(args, "O:float", &v))
1320 return NULL;
1321 if (PyString_Check(v))
1322 return PyFloat_FromString(v, NULL);
1323 return PyNumber_Float(v);
1324}
1325
1326static char float_doc[] =
1327"float(x) -> floating point number\n\
1328\n\
1329Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001330
1331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332static PyObject *
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001333builtin_iter(PyObject *self, PyObject *args)
1334{
1335 PyObject *v, *w = NULL;
1336
1337 if (!PyArg_ParseTuple(args, "O|O:iter", &v, &w))
1338 return NULL;
1339 if (w == NULL)
1340 return PyObject_GetIter(v);
1341 if (!PyCallable_Check(v)) {
1342 PyErr_SetString(PyExc_TypeError,
1343 "iter(v, w): v must be callable");
1344 return NULL;
1345 }
1346 return PyCallIter_New(v, w);
1347}
1348
1349static char iter_doc[] =
1350"iter(collection) -> iterator\n\
1351iter(callable, sentinel) -> iterator\n\
1352\n\
1353Get an iterator from an object. In the first form, the argument must\n\
1354supply its own iterator, or be a sequence.\n\
1355In the second form, the callable is called until it returns the sentinel.";
1356
1357
1358static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001359builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001360{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001362 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001363
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001365 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001366 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001367 if (res < 0 && PyErr_Occurred())
1368 return NULL;
1369 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001370}
1371
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001372static char len_doc[] =
1373"len(object) -> integer\n\
1374\n\
1375Return the number of items of a sequence or mapping.";
1376
1377
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001379builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001380{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001382
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001384 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001385 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001386}
1387
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001388static char list_doc[] =
1389"list(sequence) -> list\n\
1390\n\
1391Return a new list whose items are the same as those of the argument sequence.";
1392
Guido van Rossum8861b741996-07-30 16:49:37 +00001393
1394static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001395builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001396{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001397 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001398
Guido van Rossum09df08a1998-05-22 00:51:39 +00001399 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001400
Guido van Rossum09df08a1998-05-22 00:51:39 +00001401 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1402 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001403
Guido van Rossum09df08a1998-05-22 00:51:39 +00001404 /* This swapping of stop and start is to maintain similarity with
1405 range(). */
1406 if (stop == NULL) {
1407 stop = start;
1408 start = NULL;
1409 }
1410 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001411}
1412
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001413static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001414"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001415\n\
1416Create a slice object. This is used for slicing by the Numeric extensions.";
1417
1418
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001420builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001421{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001423
Guido van Rossum43713e52000-02-29 13:59:29 +00001424 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001425 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426 d = PyEval_GetLocals();
1427 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001428 return d;
1429}
1430
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001431static char locals_doc[] =
1432"locals() -> dictionary\n\
1433\n\
1434Return the dictionary containing the current scope's local variables.";
1435
1436
Guido van Rossum79f25d91997-04-29 20:08:16 +00001437static PyObject *
Guido van Rossum53451b32001-01-17 15:47:24 +00001438min_max(PyObject *args, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001439{
Tim Petersc3074532001-05-03 07:00:32 +00001440 PyObject *v, *w, *x, *it;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001441
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001443 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001445 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001446
1447 it = PyObject_GetIter(v);
1448 if (it == NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001449 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001450
1451 w = NULL; /* the result */
Tim Petersf4848da2001-05-05 00:14:56 +00001452 for (;;) {
Tim Petersc3074532001-05-03 07:00:32 +00001453 x = PyIter_Next(it);
Guido van Rossum2d951851994-08-29 12:52:16 +00001454 if (x == NULL) {
Tim Petersc3074532001-05-03 07:00:32 +00001455 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001456 Py_XDECREF(w);
1457 Py_DECREF(it);
1458 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001459 }
Tim Petersc3074532001-05-03 07:00:32 +00001460 break;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001461 }
Tim Petersc3074532001-05-03 07:00:32 +00001462
Guido van Rossum2d951851994-08-29 12:52:16 +00001463 if (w == NULL)
1464 w = x;
1465 else {
Guido van Rossum53451b32001-01-17 15:47:24 +00001466 int cmp = PyObject_RichCompareBool(x, w, op);
1467 if (cmp > 0) {
1468 Py_DECREF(w);
1469 w = x;
1470 }
1471 else if (cmp < 0) {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001472 Py_DECREF(x);
Tim Petersc3074532001-05-03 07:00:32 +00001473 Py_DECREF(w);
1474 Py_DECREF(it);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001475 return NULL;
1476 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001477 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001479 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001480 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001481 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001483 "min() or max() arg is an empty sequence");
Tim Petersc3074532001-05-03 07:00:32 +00001484 Py_DECREF(it);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001485 return w;
1486}
1487
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001489builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001490{
Guido van Rossum53451b32001-01-17 15:47:24 +00001491 return min_max(v, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492}
1493
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001494static char min_doc[] =
1495"min(sequence) -> value\n\
1496min(a, b, c, ...) -> value\n\
1497\n\
1498With a single sequence argument, return its smallest item.\n\
1499With two or more arguments, return the smallest argument.";
1500
1501
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001503builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001504{
Guido van Rossum53451b32001-01-17 15:47:24 +00001505 return min_max(v, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001506}
1507
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001508static char max_doc[] =
1509"max(sequence) -> value\n\
1510max(a, b, c, ...) -> value\n\
1511\n\
1512With a single sequence argument, return its largest item.\n\
1513With two or more arguments, return the largest argument.";
1514
1515
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001517builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001518{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 PyObject *v;
1520 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001524 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1525 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001526 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001527 "oct() argument can't be converted to oct");
1528 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001529 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001530 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001531}
1532
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001533static char oct_doc[] =
1534"oct(number) -> string\n\
1535\n\
1536Return the octal representation of an integer or long integer.";
1537
1538
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001540builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001541{
Mark Hammondef8b6542001-05-13 08:04:26 +00001542 char *name = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001543 char *mode = "r";
1544 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001546
Mark Hammondef8b6542001-05-13 08:04:26 +00001547 if (!PyArg_ParseTuple(args, "et|si:open", Py_FileSystemDefaultEncoding,
1548 &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 f = PyFile_FromString(name, mode);
Mark Hammondef8b6542001-05-13 08:04:26 +00001551 PyMem_Free(name); /* free the encoded string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001552 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001554 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001555}
1556
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001557static char open_doc[] =
1558"open(filename[, mode[, buffering]]) -> file object\n\
1559\n\
1560Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1561writing or appending. The file will be created if it doesn't exist\n\
1562when opened for writing or appending; it will be truncated when\n\
1563opened for writing. Add a 'b' to the mode for binary files.\n\
1564Add a '+' to the mode to allow simultaneous reading and writing.\n\
1565If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1566buffered, and larger numbers specify the buffer size.";
1567
1568
Guido van Rossum79f25d91997-04-29 20:08:16 +00001569static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001570builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001571{
Guido van Rossum09095f32000-03-10 23:00:52 +00001572 PyObject *obj;
1573 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001574 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001575
Guido van Rossum09095f32000-03-10 23:00:52 +00001576 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001577 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001578
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001579 if (PyString_Check(obj)) {
1580 size = PyString_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001581 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001582 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001583 return PyInt_FromLong(ord);
1584 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001585 } else if (PyUnicode_Check(obj)) {
1586 size = PyUnicode_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001587 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001588 ord = (long)*PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001589 return PyInt_FromLong(ord);
1590 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001591 } else {
1592 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001593 "ord() expected string of length 1, but " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001594 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001595 return NULL;
1596 }
1597
Guido van Rossumad991772001-01-12 16:03:05 +00001598 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001599 "ord() expected a character, "
1600 "but string of length %d found",
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001601 size);
1602 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001603}
1604
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001605static char ord_doc[] =
1606"ord(c) -> integer\n\
1607\n\
Guido van Rossumad991772001-01-12 16:03:05 +00001608Return the integer ordinal of a one-character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001609
1610
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001612builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001613{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001614 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001615
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001617 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001618 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001619}
1620
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001621static char pow_doc[] =
1622"pow(x, y[, z]) -> number\n\
1623\n\
1624With two arguments, equivalent to x**y. With three arguments,\n\
1625equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1626
1627
Guido van Rossum124eff01999-02-23 16:11:01 +00001628/* Return number of items in range/xrange (lo, hi, step). step > 0
1629 * required. Return a value < 0 if & only if the true value is too
1630 * large to fit in a signed long.
1631 */
1632static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001633get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001634{
1635 /* -------------------------------------------------------------
1636 If lo >= hi, the range is empty.
1637 Else if n values are in the range, the last one is
1638 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1639 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1640 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1641 the RHS is non-negative and so truncation is the same as the
1642 floor. Letting M be the largest positive long, the worst case
1643 for the RHS numerator is hi=M, lo=-M-1, and then
1644 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1645 precision to compute the RHS exactly.
1646 ---------------------------------------------------------------*/
1647 long n = 0;
1648 if (lo < hi) {
1649 unsigned long uhi = (unsigned long)hi;
1650 unsigned long ulo = (unsigned long)lo;
1651 unsigned long diff = uhi - ulo - 1;
1652 n = (long)(diff / (unsigned long)step + 1);
1653 }
1654 return n;
1655}
1656
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001658builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001660 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001661 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001662 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001663
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001665
Guido van Rossum79f25d91997-04-29 20:08:16 +00001666 if (PyTuple_Size(args) <= 1) {
1667 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001668 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 &ihigh))
1670 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001671 }
1672 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001674 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001677 }
1678 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001679 PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001680 return NULL;
1681 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001682 if (istep > 0)
1683 bign = get_len_of_range(ilow, ihigh, istep);
1684 else
1685 bign = get_len_of_range(ihigh, ilow, -istep);
1686 n = (int)bign;
1687 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001688 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001689 "range() result has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001690 return NULL;
1691 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001693 if (v == NULL)
1694 return NULL;
1695 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001697 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001699 return NULL;
1700 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001701 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001702 ilow += istep;
1703 }
1704 return v;
1705}
1706
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001707static char range_doc[] =
1708"range([start,] stop[, step]) -> list of integers\n\
1709\n\
1710Return a list containing an arithmetic progression of integers.\n\
1711range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1712When step is given, it specifies the increment (or decrement).\n\
1713For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1714These are exactly the valid indices for a list of 4 elements.";
1715
1716
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001718builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001719{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001720 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001721 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001722
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 if (PyTuple_Size(args) <= 1) {
1724 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001725 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001726 &ihigh))
1727 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001728 }
1729 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001731 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001732 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001733 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001734 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001735 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001736 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001737 return NULL;
1738 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001739 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001740 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001741 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001742 n = get_len_of_range(ihigh, ilow, -istep);
1743 if (n < 0) {
1744 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001745 "xrange() result has too many items");
Guido van Rossum124eff01999-02-23 16:11:01 +00001746 return NULL;
1747 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001748 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001749}
1750
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001751static char xrange_doc[] =
1752"xrange([start,] stop[, step]) -> xrange object\n\
1753\n\
1754Like range(), but instead of returning a list, returns an object that\n\
1755generates the numbers in the range on demand. This is slightly slower\n\
1756than range() but more memory efficient.";
1757
1758
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001760builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001761{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001762 PyObject *v = NULL;
1763 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001766 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1768 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001769 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001771 char *prompt;
1772 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001774 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001776 if (po == NULL)
1777 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001779 if (prompt == NULL)
1780 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001781 }
1782 else {
1783 po = NULL;
1784 prompt = "";
1785 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 s = PyOS_Readline(prompt);
1787 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001788 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001790 return NULL;
1791 }
1792 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001794 result = NULL;
1795 }
1796 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001797 size_t len = strlen(s);
1798 if (len > INT_MAX) {
1799 PyErr_SetString(PyExc_OverflowError, "input too long");
1800 result = NULL;
1801 }
1802 else {
1803 result = PyString_FromStringAndSize(s, (int)(len-1));
1804 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001805 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001806 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001807 return result;
1808 }
Guido van Rossum90933611991-06-07 16:10:43 +00001809 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001811 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001813 return NULL;
1814 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001815 if (Py_FlushLine() != 0 ||
1816 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001817 return NULL;
1818 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001820 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001822 return NULL;
1823 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001825}
1826
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001827static char raw_input_doc[] =
1828"raw_input([prompt]) -> string\n\
1829\n\
1830Read a string from standard input. The trailing newline is stripped.\n\
1831If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1832On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1833is printed without a trailing newline before reading.";
1834
1835
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001837builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001838{
Tim Peters15d81ef2001-05-04 04:39:21 +00001839 PyObject *seq, *func, *result = NULL, *it;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001840
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001842 return NULL;
1843 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001845
Tim Peters15d81ef2001-05-04 04:39:21 +00001846 it = PyObject_GetIter(seq);
1847 if (it == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 PyErr_SetString(PyExc_TypeError,
Tim Peters15d81ef2001-05-04 04:39:21 +00001849 "reduce() arg 2 must support iteration");
1850 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001851 return NULL;
1852 }
1853
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001855 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001856
Tim Peters15d81ef2001-05-04 04:39:21 +00001857 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001859
1860 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 Py_DECREF(args);
1862 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001863 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001864 }
1865
Tim Peters15d81ef2001-05-04 04:39:21 +00001866 op2 = PyIter_Next(it);
1867 if (op2 == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +00001868 if (PyErr_Occurred())
1869 goto Fail;
1870 break;
Guido van Rossum2d951851994-08-29 12:52:16 +00001871 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001872
Guido van Rossum2d951851994-08-29 12:52:16 +00001873 if (result == NULL)
1874 result = op2;
1875 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001876 PyTuple_SetItem(args, 0, result);
1877 PyTuple_SetItem(args, 1, op2);
1878 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001879 goto Fail;
1880 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001881 }
1882
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001884
Guido van Rossum2d951851994-08-29 12:52:16 +00001885 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001886 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001887 "reduce() of empty sequence with no initial value");
Guido van Rossum2d951851994-08-29 12:52:16 +00001888
Tim Peters15d81ef2001-05-04 04:39:21 +00001889 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001890 return result;
1891
Guido van Rossum2d951851994-08-29 12:52:16 +00001892Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 Py_XDECREF(args);
1894 Py_XDECREF(result);
Tim Peters15d81ef2001-05-04 04:39:21 +00001895 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001896 return NULL;
1897}
1898
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001899static char reduce_doc[] =
1900"reduce(function, sequence[, initial]) -> value\n\
1901\n\
1902Apply a function of two arguments cumulatively to the items of a sequence,\n\
1903from left to right, so as to reduce the sequence to a single value.\n\
1904For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1905((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1906of the sequence in the calculation, and serves as a default when the\n\
1907sequence is empty.";
1908
1909
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001911builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001912{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001916 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001918}
1919
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001920static char reload_doc[] =
1921"reload(module) -> module\n\
1922\n\
1923Reload the module. The module must have been successfully imported before.";
1924
1925
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001927builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001928{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001929 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001930
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001932 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001934}
1935
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001936static char repr_doc[] =
1937"repr(object) -> string\n\
1938\n\
1939Return the canonical string representation of the object.\n\
1940For most object types, eval(repr(object)) == object.";
1941
1942
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001944builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001945{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001946 double x;
1947 double f;
1948 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001949 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001950
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001952 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001953 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001954 i = abs(ndigits);
1955 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001956 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001957 if (ndigits < 0)
1958 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001959 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001960 x *= f;
1961 if (x >= 0.0)
1962 x = floor(x + 0.5);
1963 else
1964 x = ceil(x - 0.5);
1965 if (ndigits < 0)
1966 x *= f;
1967 else
1968 x /= f;
1969 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001970}
1971
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001972static char round_doc[] =
1973"round(number[, ndigits]) -> floating point number\n\
1974\n\
1975Round a number to a given precision in decimal digits (default 0 digits).\n\
1976This always returns a floating point number. Precision may be negative.";
1977
1978
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001980builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001981{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001983
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001985 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001987}
1988
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001989static char str_doc[] =
1990"str(object) -> string\n\
1991\n\
1992Return a nice string representation of the object.\n\
1993If the argument is a string, the return value is the same object.";
1994
1995
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001997builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001998{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001999 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002000
Guido van Rossum79f25d91997-04-29 20:08:16 +00002001 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002002 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00002003 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00002004}
2005
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002006static char tuple_doc[] =
2007"tuple(sequence) -> list\n\
2008\n\
2009Return a tuple whose items are the same as those of the argument sequence.\n\
2010If the argument is a tuple, the return value is the same object.";
2011
2012
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002014builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00002015{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002017
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00002019 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002020 v = (PyObject *)v->ob_type;
2021 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00002022 return v;
2023}
2024
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002025static char type_doc[] =
2026"type(object) -> type object\n\
2027\n\
2028Return the type of the object.";
2029
2030
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002032builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00002033{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002034 PyObject *v = NULL;
2035 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002036
Guido van Rossum79f25d91997-04-29 20:08:16 +00002037 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00002038 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00002039 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002040 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002041 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 if (!PyErr_Occurred())
2043 PyErr_SetString(PyExc_SystemError,
2044 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00002045 }
2046 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00002047 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00002048 }
2049 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00002051 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00002053 "vars() argument must have __dict__ attribute");
2054 return NULL;
2055 }
2056 }
2057 return d;
2058}
2059
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002060static char vars_doc[] =
2061"vars([object]) -> dictionary\n\
2062\n\
2063Without arguments, equivalent to locals().\n\
2064With an argument, equivalent to object.__dict__.";
2065
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002066static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002067builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002068{
2069 PyObject *inst;
2070 PyObject *cls;
Guido van Rossum823649d2001-03-21 18:40:58 +00002071 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002072
Guido van Rossum43713e52000-02-29 13:59:29 +00002073 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002074 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002075
Guido van Rossum823649d2001-03-21 18:40:58 +00002076 retval = PyObject_IsInstance(inst, cls);
2077 if (retval < 0)
Guido van Rossumad991772001-01-12 16:03:05 +00002078 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002079 return PyInt_FromLong(retval);
2080}
2081
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002082static char isinstance_doc[] =
2083"isinstance(object, class-or-type) -> Boolean\n\
2084\n\
2085Return whether an object is an instance of a class or of a subclass thereof.\n\
2086With a type as second argument, return whether that is the object's type.";
2087
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002088
2089static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002090builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002091{
2092 PyObject *derived;
2093 PyObject *cls;
2094 int retval;
2095
Guido van Rossum43713e52000-02-29 13:59:29 +00002096 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002097 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002098
Guido van Rossum823649d2001-03-21 18:40:58 +00002099 retval = PyObject_IsSubclass(derived, cls);
2100 if (retval < 0)
2101 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002102 return PyInt_FromLong(retval);
2103}
2104
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002105static char issubclass_doc[] =
2106"issubclass(C, B) -> Boolean\n\
2107\n\
2108Return whether class C is a subclass (i.e., a derived class) of class B.";
2109
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002110
Barry Warsawbd599b52000-08-03 15:45:29 +00002111static PyObject*
2112builtin_zip(PyObject *self, PyObject *args)
2113{
2114 PyObject *ret;
2115 int itemsize = PySequence_Length(args);
Tim Peters8572b4f2001-05-06 01:05:02 +00002116 int i;
2117 PyObject *itlist; /* tuple of iterators */
Barry Warsawbd599b52000-08-03 15:45:29 +00002118
2119 if (itemsize < 1) {
2120 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002121 "zip() requires at least one sequence");
Barry Warsawbd599b52000-08-03 15:45:29 +00002122 return NULL;
2123 }
2124 /* args must be a tuple */
2125 assert(PyTuple_Check(args));
2126
Tim Peters8572b4f2001-05-06 01:05:02 +00002127 /* allocate result list */
Barry Warsawbd599b52000-08-03 15:45:29 +00002128 if ((ret = PyList_New(0)) == NULL)
2129 return NULL;
2130
Tim Peters8572b4f2001-05-06 01:05:02 +00002131 /* obtain iterators */
2132 itlist = PyTuple_New(itemsize);
2133 if (itlist == NULL)
2134 goto Fail_ret;
2135 for (i = 0; i < itemsize; ++i) {
2136 PyObject *item = PyTuple_GET_ITEM(args, i);
2137 PyObject *it = PyObject_GetIter(item);
2138 if (it == NULL) {
2139 if (PyErr_ExceptionMatches(PyExc_TypeError))
2140 PyErr_Format(PyExc_TypeError,
2141 "zip argument #%d must support iteration",
2142 i+1);
2143 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00002144 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002145 PyTuple_SET_ITEM(itlist, i, it);
2146 }
Barry Warsawbd599b52000-08-03 15:45:29 +00002147
Tim Peters8572b4f2001-05-06 01:05:02 +00002148 /* build result into ret list */
2149 for (;;) {
2150 int status;
2151 PyObject *next = PyTuple_New(itemsize);
2152 if (!next)
2153 goto Fail_ret_itlist;
2154
2155 for (i = 0; i < itemsize; i++) {
2156 PyObject *it = PyTuple_GET_ITEM(itlist, i);
2157 PyObject *item = PyIter_Next(it);
Barry Warsawbd599b52000-08-03 15:45:29 +00002158 if (!item) {
Tim Peters8572b4f2001-05-06 01:05:02 +00002159 if (PyErr_Occurred()) {
2160 Py_DECREF(ret);
2161 ret = NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00002162 }
2163 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00002164 Py_DECREF(itlist);
2165 return ret;
Barry Warsawbd599b52000-08-03 15:45:29 +00002166 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002167 PyTuple_SET_ITEM(next, i, item);
Barry Warsawbd599b52000-08-03 15:45:29 +00002168 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002169
2170 status = PyList_Append(ret, next);
Barry Warsawbd599b52000-08-03 15:45:29 +00002171 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00002172 if (status < 0)
2173 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00002174 }
Tim Peters8572b4f2001-05-06 01:05:02 +00002175
2176Fail_ret_itlist:
2177 Py_DECREF(itlist);
2178Fail_ret:
2179 Py_DECREF(ret);
2180 return NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00002181}
2182
2183
2184static char zip_doc[] =
2185"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2186\n\
2187Return a list of tuples, where each tuple contains the i-th element\n\
2188from each of the argument sequences. The returned list is truncated\n\
2189in length to the length of the shortest argument sequence.";
2190
2191
Guido van Rossum79f25d91997-04-29 20:08:16 +00002192static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002193 {"__import__", builtin___import__, 1, import_doc},
2194 {"abs", builtin_abs, 1, abs_doc},
2195 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002196 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002197 {"callable", builtin_callable, 1, callable_doc},
2198 {"chr", builtin_chr, 1, chr_doc},
2199 {"cmp", builtin_cmp, 1, cmp_doc},
2200 {"coerce", builtin_coerce, 1, coerce_doc},
2201 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002202#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002203 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002204#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002205 {"delattr", builtin_delattr, 1, delattr_doc},
2206 {"dir", builtin_dir, 1, dir_doc},
2207 {"divmod", builtin_divmod, 1, divmod_doc},
2208 {"eval", builtin_eval, 1, eval_doc},
2209 {"execfile", builtin_execfile, 1, execfile_doc},
2210 {"filter", builtin_filter, 1, filter_doc},
2211 {"float", builtin_float, 1, float_doc},
2212 {"getattr", builtin_getattr, 1, getattr_doc},
2213 {"globals", builtin_globals, 1, globals_doc},
2214 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2215 {"hash", builtin_hash, 1, hash_doc},
2216 {"hex", builtin_hex, 1, hex_doc},
2217 {"id", builtin_id, 1, id_doc},
2218 {"input", builtin_input, 1, input_doc},
2219 {"intern", builtin_intern, 1, intern_doc},
2220 {"int", builtin_int, 1, int_doc},
2221 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2222 {"issubclass", builtin_issubclass, 1, issubclass_doc},
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00002223 {"iter", builtin_iter, 1, iter_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002224 {"len", builtin_len, 1, len_doc},
2225 {"list", builtin_list, 1, list_doc},
2226 {"locals", builtin_locals, 1, locals_doc},
2227 {"long", builtin_long, 1, long_doc},
2228 {"map", builtin_map, 1, map_doc},
2229 {"max", builtin_max, 1, max_doc},
2230 {"min", builtin_min, 1, min_doc},
2231 {"oct", builtin_oct, 1, oct_doc},
2232 {"open", builtin_open, 1, open_doc},
2233 {"ord", builtin_ord, 1, ord_doc},
2234 {"pow", builtin_pow, 1, pow_doc},
2235 {"range", builtin_range, 1, range_doc},
2236 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2237 {"reduce", builtin_reduce, 1, reduce_doc},
2238 {"reload", builtin_reload, 1, reload_doc},
2239 {"repr", builtin_repr, 1, repr_doc},
2240 {"round", builtin_round, 1, round_doc},
2241 {"setattr", builtin_setattr, 1, setattr_doc},
2242 {"slice", builtin_slice, 1, slice_doc},
2243 {"str", builtin_str, 1, str_doc},
2244 {"tuple", builtin_tuple, 1, tuple_doc},
2245 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002246 {"unicode", builtin_unicode, 1, unicode_doc},
2247 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002248 {"vars", builtin_vars, 1, vars_doc},
2249 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002250 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002251 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002252};
2253
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002254static char builtin_doc[] =
2255"Built-in functions, exceptions, and other objects.\n\
2256\n\
2257Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2258
Guido van Rossum25ce5661997-08-02 03:10:38 +00002259PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002260_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002261{
Fred Drake5550de32000-06-20 04:54:19 +00002262 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002263 mod = Py_InitModule4("__builtin__", builtin_methods,
2264 builtin_doc, (PyObject *)NULL,
2265 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002266 if (mod == NULL)
2267 return NULL;
2268 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002269 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2270 return NULL;
2271 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2272 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00002273 if (PyDict_SetItemString(dict, "NotImplemented",
Neil Schemenauer23ab1992001-01-04 01:48:42 +00002274 Py_NotImplemented) < 0)
2275 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002276 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2277 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2278 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002279 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002280 }
2281 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002282
Guido van Rossum25ce5661997-08-02 03:10:38 +00002283 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002284}
2285
Guido van Rossume77a7571993-11-03 15:01:26 +00002286/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002287
Guido van Rossum79f25d91997-04-29 20:08:16 +00002288static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002289filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002290{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002291 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002292 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002294
Guido van Rossumb7b45621995-08-04 04:07:45 +00002295 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002296 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002297 return tuple;
2298 }
2299
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002301 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002302
Guido van Rossum12d12c51993-10-26 17:58:25 +00002303 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002304 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002305 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002306
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002308 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002309 if (func == Py_None) {
2310 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002311 good = item;
2312 }
2313 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002315 if (arg == NULL)
2316 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002317 good = PyEval_CallObject(func, arg);
2318 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002319 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002320 goto Fail_1;
2321 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002322 ok = PyObject_IsTrue(good);
2323 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002324 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325 Py_INCREF(item);
2326 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002327 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002328 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002329 }
2330
Guido van Rossum79f25d91997-04-29 20:08:16 +00002331 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002332 return NULL;
2333
Guido van Rossum12d12c51993-10-26 17:58:25 +00002334 return result;
2335
Guido van Rossum12d12c51993-10-26 17:58:25 +00002336Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002337 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002338 return NULL;
2339}
2340
2341
Guido van Rossume77a7571993-11-03 15:01:26 +00002342/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002343
Guido van Rossum79f25d91997-04-29 20:08:16 +00002344static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002345filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002346{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002347 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002348 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002350
Guido van Rossum79f25d91997-04-29 20:08:16 +00002351 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002352 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002354 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002355 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002357 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002358
Guido van Rossum12d12c51993-10-26 17:58:25 +00002359 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002360 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002361 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002362
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002363 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2364 if (item == NULL)
2365 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 arg = Py_BuildValue("(O)", item);
Tim Peters388ed082001-04-07 20:34:48 +00002367 if (arg == NULL) {
2368 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002369 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00002370 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 good = PyEval_CallObject(func, arg);
2372 Py_DECREF(arg);
Tim Peters388ed082001-04-07 20:34:48 +00002373 if (good == NULL) {
2374 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002375 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00002376 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002377 ok = PyObject_IsTrue(good);
2378 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002379 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 PyString_AS_STRING((PyStringObject *)result)[j++] =
2381 PyString_AS_STRING((PyStringObject *)item)[0];
Tim Peters388ed082001-04-07 20:34:48 +00002382 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002383 }
2384
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002386 return NULL;
2387
Guido van Rossum12d12c51993-10-26 17:58:25 +00002388 return result;
2389
Guido van Rossum12d12c51993-10-26 17:58:25 +00002390Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002391 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002392 return NULL;
2393}