blob: 88656ca630f09cec1d8f2e5589b365b1b97206f1 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +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
Jack Jansen41aa8e52000-07-03 21:39:47 +000015#ifdef HAVE_LIMITS_H
16#include <limits.h>
17#endif
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000018
Guido van Rossum12d12c51993-10-26 17:58:25 +000019/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000020static PyObject *filterstring(PyObject *, PyObject *);
21static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000022
Guido van Rossum79f25d91997-04-29 20:08:16 +000023static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000024builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000025{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000026 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000027 PyObject *globals = NULL;
28 PyObject *locals = NULL;
29 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000030
Guido van Rossum79f25d91997-04-29 20:08:16 +000031 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000032 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000033 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000034 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035}
36
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000037static char import_doc[] =
38"__import__(name, globals, locals, fromlist) -> module\n\
39\n\
40Import a module. The globals are only used to determine the context;\n\
41they are not modified. The locals are currently unused. The fromlist\n\
42should be a list of names to emulate ``from name import ...'', or an\n\
43empty list to emulate ``import name''.\n\
44When importing a module from a package, note that __import__('A.B', ...)\n\
45returns package A when fromlist is empty, but its submodule B when\n\
46fromlist is not empty.";
47
Guido van Rossum1ae940a1995-01-02 19:04:15 +000048
Guido van Rossum79f25d91997-04-29 20:08:16 +000049static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000050builtin_abs(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000051{
Guido van Rossum79f25d91997-04-29 20:08:16 +000052 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053
Guido van Rossum79f25d91997-04-29 20:08:16 +000054 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000055 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000056 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000057}
58
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000059static char abs_doc[] =
60"abs(number) -> number\n\
61\n\
62Return the absolute value of the argument.";
63
64
Guido van Rossum79f25d91997-04-29 20:08:16 +000065static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000066builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000067{
Guido van Rossum79f25d91997-04-29 20:08:16 +000068 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000069 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070
Guido van Rossum79f25d91997-04-29 20:08:16 +000071 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000072 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000073 if (alist != NULL) {
74 if (!PyTuple_Check(alist)) {
75 if (!PySequence_Check(alist)) {
76 PyErr_SetString(PyExc_TypeError,
77 "apply() 2nd argument must be a sequence");
78 return NULL;
79 }
80 t = PySequence_Tuple(alist);
81 if (t == NULL)
82 return NULL;
83 alist = t;
84 }
Guido van Rossum2d951851994-08-29 12:52:16 +000085 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000086 if (kwdict != NULL && !PyDict_Check(kwdict)) {
87 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +000088 "apply() 3rd argument must be dictionary");
Barry Warsaw968f8cb1998-10-01 15:33:12 +000089 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000090 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +000091 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
92 finally:
93 Py_XDECREF(t);
94 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000095}
96
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000097static char apply_doc[] =
Fred Drake7b912121999-12-23 14:16:55 +000098"apply(object, args[, kwargs]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000099\n\
Fred Drake7b912121999-12-23 14:16:55 +0000100Call a callable object with positional arguments taken from the tuple args,\n\
101and keyword arguments taken from the optional dictionary kwargs.\n\
102Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000103
104
Guido van Rossum79f25d91997-04-29 20:08:16 +0000105static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000106builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000107{
108 PyObject *ob;
109 int offset = 0;
110 int size = Py_END_OF_BUFFER;
111
112 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
113 return NULL;
114 return PyBuffer_FromObject(ob, offset, size);
115}
116
117static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000118"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000119\n\
120Creates a new buffer object which references the given object.\n\
121The buffer will reference a slice of the target object from the\n\
122start of the object (or at the specified offset). The slice will\n\
123extend to the end of the target object (or with the specified size).";
124
125
126static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000127builtin_unicode(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000128{
Guido van Rossum3afba762000-04-11 15:38:23 +0000129 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000130 char *encoding = NULL;
131 char *errors = NULL;
132
Guido van Rossum3afba762000-04-11 15:38:23 +0000133 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000134 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000135 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000136}
137
138static char unicode_doc[] =
139"unicode(string [, encoding[, errors]]) -> object\n\
140\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000141Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000142encoding defaults to the current default string encoding and \n\
143errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000144
145
146static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000147builtin_callable(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +0000148{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000150
Guido van Rossum79f25d91997-04-29 20:08:16 +0000151 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000152 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000154}
155
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000156static char callable_doc[] =
157"callable(object) -> Boolean\n\
158\n\
159Return whether the object is callable (i.e., some kind of function).\n\
160Note that classes are callable, as are instances with a __call__() method.";
161
162
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000164builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000165{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 PyObject *func, *seq, *result;
167 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 int len;
169 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000173
Guido van Rossum79f25d91997-04-29 20:08:16 +0000174 if (PyString_Check(seq)) {
175 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000176 return r;
177 }
178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 if (PyTuple_Check(seq)) {
180 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000181 return r;
182 }
183
Guido van Rossum09df08a1998-05-22 00:51:39 +0000184 sqf = seq->ob_type->tp_as_sequence;
185 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000187 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000188 goto Fail_2;
189 }
190
191 if ((len = (*sqf->sq_length)(seq)) < 0)
192 goto Fail_2;
193
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
195 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000196 result = seq;
197 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000198 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000200 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000201 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000202
Guido van Rossum2d951851994-08-29 12:52:16 +0000203 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000205 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000206
Guido van Rossum2d951851994-08-29 12:52:16 +0000207 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000208 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000209 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000210 break;
211 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000212 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000213 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000214
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000216 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000218 }
219 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000221 if (arg == NULL)
222 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 good = PyEval_CallObject(func, arg);
224 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000225 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000227 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000228 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000229 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000230 ok = PyObject_IsTrue(good);
231 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000232 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000233 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000235 goto Fail_1;
236 }
237 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000238 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000239 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000240 Py_DECREF(item);
241 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000242 goto Fail_1;
243 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000244 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000246 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000247 }
248
Guido van Rossum12d12c51993-10-26 17:58:25 +0000249
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000251 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000252
Guido van Rossum12d12c51993-10-26 17:58:25 +0000253 return result;
254
Guido van Rossum12d12c51993-10-26 17:58:25 +0000255Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000257Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000258 return NULL;
259}
260
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000261static char filter_doc[] =
262"filter(function, sequence) -> list\n\
263\n\
264Return a list containing those items of sequence for which function(item)\n\
265is true. If function is None, return a list of items that are true.";
266
267
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000269builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000270{
271 long x;
272 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000273
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000276 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 PyErr_SetString(PyExc_ValueError,
278 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279 return NULL;
280 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000281 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000283}
284
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000285static char chr_doc[] =
286"chr(i) -> character\n\
287\n\
288Return a string of one character with ordinal i; 0 <= i < 256.";
289
290
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000292builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000293{
294 long x;
295 Py_UNICODE s[1];
296
297 if (!PyArg_ParseTuple(args, "l:unichr", &x))
298 return NULL;
299 if (x < 0 || x >= 65536) {
300 PyErr_SetString(PyExc_ValueError,
301 "unichr() arg not in range(65536)");
302 return NULL;
303 }
304 s[0] = (Py_UNICODE)x;
305 return PyUnicode_FromUnicode(s, 1);
306}
307
308static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000309"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000310\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000311Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000312
313
314static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000315builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000316{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000318 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000319
Guido van Rossum79f25d91997-04-29 20:08:16 +0000320 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000321 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000322 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000323 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000324 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000325}
326
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000327static char cmp_doc[] =
328"cmp(x, y) -> integer\n\
329\n\
330Return negative if x<y, zero if x==y, positive if x>y.";
331
332
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000334builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000335{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 PyObject *v, *w;
337 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000338
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000340 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000341 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000342 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 res = Py_BuildValue("(OO)", v, w);
344 Py_DECREF(v);
345 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000346 return res;
347}
348
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000349static char coerce_doc[] =
350"coerce(x, y) -> None or (x1, y1)\n\
351\n\
352When x and y can be coerced to values of the same type, return a tuple\n\
353containing the coerced values. When they can't be coerced, return None.";
354
355
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000357builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000358{
359 char *str;
360 char *filename;
361 char *startstr;
362 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000363
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000365 return NULL;
366 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000367 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000368 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000369 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000370 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000371 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000372 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000374 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000375 return NULL;
376 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000378}
379
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000380static char compile_doc[] =
381"compile(source, filename, mode) -> code object\n\
382\n\
383Compile the source string (a Python module, statement or expression)\n\
384into a code object that can be executed by the exec statement or eval().\n\
385The filename will be used for run-time error messages.\n\
386The mode must be 'exec' to compile a module, 'single' to compile a\n\
387single (interactive) statement, or 'eval' to compile an expression.";
388
389
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000390#ifndef WITHOUT_COMPLEX
391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000393complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000394{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000395 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000396 const char *s, *start;
397 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000398 double x=0.0, y=0.0, z;
399 int got_re=0, got_im=0, done=0;
400 int digit_or_dot;
401 int sw_error=0;
402 int sign;
403 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000404 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000405 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000406
Guido van Rossum9e896b32000-04-05 20:11:21 +0000407 if (PyString_Check(v)) {
408 s = PyString_AS_STRING(v);
409 len = PyString_GET_SIZE(v);
410 }
411 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000412 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
413 PyErr_SetString(PyExc_ValueError,
414 "complex() literal too large to convert");
415 return NULL;
416 }
417 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
418 PyUnicode_GET_SIZE(v),
419 s_buffer,
420 NULL))
421 return NULL;
422 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000423 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000424 }
425 else if (PyObject_AsCharBuffer(v, &s, &len)) {
426 PyErr_SetString(PyExc_TypeError,
427 "complex() needs a string first argument");
428 return NULL;
429 }
Guido van Rossum11950231999-03-25 21:16:07 +0000430
431 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000432 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000433 while (*s && isspace(Py_CHARMASK(*s)))
434 s++;
435 if (s[0] == '\0') {
436 PyErr_SetString(PyExc_ValueError,
437 "empty string for complex()");
438 return NULL;
439 }
440
441 z = -1.0;
442 sign = 1;
443 do {
444
445 switch (*s) {
446
447 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000448 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000449 PyErr_SetString(
450 PyExc_ValueError,
451 "null byte in argument for complex()");
452 return NULL;
453 }
454 if(!done) sw_error=1;
455 break;
456
457 case '-':
458 sign = -1;
459 /* Fallthrough */
460 case '+':
461 if (done) sw_error=1;
462 s++;
463 if ( *s=='\0'||*s=='+'||*s=='-' ||
464 isspace(Py_CHARMASK(*s)) ) sw_error=1;
465 break;
466
467 case 'J':
468 case 'j':
469 if (got_im || done) {
470 sw_error = 1;
471 break;
472 }
473 if (z<0.0) {
474 y=sign;
475 }
476 else{
477 y=sign*z;
478 }
479 got_im=1;
480 s++;
481 if (*s!='+' && *s!='-' )
482 done=1;
483 break;
484
485 default:
486 if (isspace(Py_CHARMASK(*s))) {
487 while (*s && isspace(Py_CHARMASK(*s)))
488 s++;
489 if (s[0] != '\0')
490 sw_error=1;
491 else
492 done = 1;
493 break;
494 }
495 digit_or_dot =
496 (*s=='.' || isdigit(Py_CHARMASK(*s)));
497 if (done||!digit_or_dot) {
498 sw_error=1;
499 break;
500 }
501 errno = 0;
502 PyFPE_START_PROTECT("strtod", return 0)
503 z = strtod(s, &end) ;
504 PyFPE_END_PROTECT(z)
505 if (errno != 0) {
506 sprintf(buffer,
507 "float() out of range: %.150s", s);
508 PyErr_SetString(
509 PyExc_ValueError,
510 buffer);
511 return NULL;
512 }
513 s=end;
514 if (*s=='J' || *s=='j') {
515
516 break;
517 }
518 if (got_re) {
519 sw_error=1;
520 break;
521 }
522
523 /* accept a real part */
524 x=sign*z;
525 got_re=1;
526 if (got_im) done=1;
527 z = -1.0;
528 sign = 1;
529 break;
530
531 } /* end of switch */
532
533 } while (*s!='\0' && !sw_error);
534
535 if (sw_error) {
536 PyErr_SetString(PyExc_ValueError,
537 "malformed string for complex()");
538 return NULL;
539 }
540
541 return PyComplex_FromDoubles(x,y);
542}
543
544static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000545builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000546{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 PyObject *r, *i, *tmp;
548 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000549 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000550 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000551
552 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000554 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000555 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000556 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000557 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000558 nbr->nb_float == NULL ||
559 (i != NULL &&
560 ((nbi = i->ob_type->tp_as_number) == NULL ||
561 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000563 "complex() argument can't be converted to complex");
564 return NULL;
565 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000566 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 if (PyInstance_Check(r)) {
568 static PyObject *complexstr;
569 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000570 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000571 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000572 if (complexstr == NULL)
573 return NULL;
574 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000576 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000578 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000580 if (args == NULL)
581 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 r = PyEval_CallObject(f, args);
583 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000584 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000585 if (r == NULL)
586 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000587 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000588 }
589 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 if (PyComplex_Check(r)) {
591 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000592 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000594 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000595 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000596 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000597 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000598 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000600 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000601 if (tmp == NULL)
602 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 cr.real = PyFloat_AsDouble(tmp);
604 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000605 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000606 }
607 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000608 ci.real = 0.0;
609 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000610 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 else if (PyComplex_Check(i))
612 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000613 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000614 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000615 if (tmp == NULL)
616 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 ci.real = PyFloat_AsDouble(tmp);
618 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000619 ci.imag = 0.;
620 }
621 cr.real -= ci.imag;
622 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000624}
625
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000626static char complex_doc[] =
627"complex(real[, imag]) -> complex number\n\
628\n\
629Create a complex number from a real part and an optional imaginary part.\n\
630This is equivalent to (real + imag*1j) where imag defaults to 0.";
631
632
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000633#endif
634
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000636builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000637{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000638 static char *attrlist[] = {"__members__", "__methods__", NULL};
639 PyObject *v = NULL, *l = NULL, *m = NULL;
640 PyObject *d, *x;
641 int i;
642 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000643
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000646 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000647 x = PyEval_GetLocals();
648 if (x == NULL)
649 goto error;
650 l = PyMapping_Keys(x);
651 if (l == NULL)
652 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000653 }
654 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000656 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000657 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000658 else {
659 l = PyMapping_Keys(d);
660 if (l == NULL)
661 PyErr_Clear();
662 Py_DECREF(d);
663 }
664 if (l == NULL) {
665 l = PyList_New(0);
666 if (l == NULL)
667 goto error;
668 }
669 for (s = attrlist; *s != NULL; s++) {
670 m = PyObject_GetAttrString(v, *s);
671 if (m == NULL) {
672 PyErr_Clear();
673 continue;
674 }
675 for (i = 0; ; i++) {
676 x = PySequence_GetItem(m, i);
677 if (x == NULL) {
678 PyErr_Clear();
679 break;
680 }
681 if (PyList_Append(l, x) != 0) {
682 Py_DECREF(x);
683 Py_DECREF(m);
684 goto error;
685 }
686 Py_DECREF(x);
687 }
688 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000689 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000690 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000691 if (PyList_Sort(l) != 0)
692 goto error;
693 return l;
694 error:
695 Py_XDECREF(l);
696 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000697}
698
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000699static char dir_doc[] =
700"dir([object]) -> list of strings\n\
701\n\
702Return an alphabetized list of names comprising (some of) the attributes\n\
703of the given object. Without an argument, the names in the current scope\n\
704are listed. With an instance argument, only the instance attributes are\n\
705returned. With a class argument, attributes of the base class are not\n\
706returned. For other types or arguments, this may list members or methods.";
707
708
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000710builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000711{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000713
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000715 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000716 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000717}
718
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000719static char divmod_doc[] =
720"divmod(x, y) -> (div, mod)\n\
721\n\
722Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
723
724
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000726builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000727{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000728 PyObject *cmd;
729 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000730 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000731
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000733 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 &PyDict_Type, &globals,
735 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000736 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 if (globals == Py_None) {
738 globals = PyEval_GetGlobals();
739 if (locals == Py_None)
740 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000741 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000743 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000744 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
745 if (PyDict_SetItemString(globals, "__builtins__",
746 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000747 return NULL;
748 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (PyCode_Check(cmd))
750 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000751 if (!PyString_Check(cmd) &&
752 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000754 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000755 return NULL;
756 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000757 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000758 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 while (*str == ' ' || *str == '\t')
760 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000761 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000762}
763
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000764static char eval_doc[] =
765"eval(source[, globals[, locals]]) -> value\n\
766\n\
767Evaluate the source in the context of globals and locals.\n\
768The source may be a string representing a Python expression\n\
769or a code object as returned by compile().\n\
770The globals and locals are dictionaries, defaulting to the current\n\
771globals and locals. If only globals is given, locals defaults to it.";
772
773
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000775builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000776{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000777 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000778 PyObject *globals = Py_None, *locals = Py_None;
779 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000780 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000781
Guido van Rossum79f25d91997-04-29 20:08:16 +0000782 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000783 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 &PyDict_Type, &globals,
785 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000786 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 if (globals == Py_None) {
788 globals = PyEval_GetGlobals();
789 if (locals == Py_None)
790 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000791 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000793 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
795 if (PyDict_SetItemString(globals, "__builtins__",
796 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000797 return NULL;
798 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000800 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000802 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000804 return NULL;
805 }
Guido van Rossum0df002c2000-08-27 19:21:52 +0000806 res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000807 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000808}
809
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000810static char execfile_doc[] =
811"execfile(filename[, globals[, locals]])\n\
812\n\
813Read and execute a Python script from a file.\n\
814The globals and locals are dictionaries, defaulting to the current\n\
815globals and locals. If only globals is given, locals defaults to it.";
816
817
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000819builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000820{
Guido van Rossum950ff291998-06-29 13:38:57 +0000821 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000823
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000824 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000825 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000826 result = PyObject_GetAttr(v, name);
827 if (result == NULL && dflt != NULL) {
828 PyErr_Clear();
829 Py_INCREF(dflt);
830 result = dflt;
831 }
832 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833}
834
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000835static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000836"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000837\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000838Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
839When a default argument is given, it is returned when the attribute doesn't\n\
840exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000841
842
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000844builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000845{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000847
Guido van Rossum43713e52000-02-29 13:59:29 +0000848 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000849 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 d = PyEval_GetGlobals();
851 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000852 return d;
853}
854
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000855static char globals_doc[] =
856"globals() -> dictionary\n\
857\n\
858Return the dictionary containing the current scope's global variables.";
859
860
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000862builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000863{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864 PyObject *v;
865 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000867 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000868 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000870 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000872 Py_INCREF(Py_False);
873 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000874 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000876 Py_INCREF(Py_True);
877 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000878}
879
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000880static char hasattr_doc[] =
881"hasattr(object, name) -> Boolean\n\
882\n\
883Return whether the object has an attribute with the given name.\n\
884(This is done by calling getattr(object, name) and catching exceptions.)";
885
886
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000888builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000889{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000893 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000894 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000895}
896
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000897static char id_doc[] =
898"id(object) -> integer\n\
899\n\
900Return the identity of an object. This is guaranteed to be unique among\n\
901simultaneously existing objects. (Hint: it's the object's memory address.)";
902
903
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000905builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000906{
907 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 PyObject *seq;
909 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000910 int len;
911 } sequence;
912
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000914 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000916 register int i, j;
917
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 PyErr_SetString(PyExc_TypeError,
921 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000922 return NULL;
923 }
924
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000926 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000927
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000928 if (func == Py_None && n == 1) {
929 /* map(None, S) is the same as list(S). */
930 return PySequence_List(PyTuple_GetItem(args, 1));
931 }
932
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
934 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000935 goto Fail_2;
936 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000937
Guido van Rossum2d951851994-08-29 12:52:16 +0000938 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000939 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000940 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000941
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000943 goto Fail_2;
944
Guido van Rossum09df08a1998-05-22 00:51:39 +0000945 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
946 if (sqf == NULL ||
947 sqf->sq_length == NULL ||
948 sqf->sq_item == NULL)
949 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000950 static char errmsg[] =
951 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000952 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000953
954 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000956 goto Fail_2;
957 }
958
959 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
960 goto Fail_2;
961
962 if (curlen > len)
963 len = curlen;
964 }
965
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000967 goto Fail_2;
968
Guido van Rossum2d951851994-08-29 12:52:16 +0000969 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000971 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000972
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000974 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000975 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000977 goto Fail_1;
978 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000979
980 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000981 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 Py_INCREF(Py_None);
983 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000984 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000985 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000986 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000987 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000988 if (PyErr_ExceptionMatches(
989 PyExc_IndexError))
990 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000991 PyErr_Clear();
992 Py_INCREF(Py_None);
993 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000994 sqp->len = -1;
995 }
996 else {
997 goto Fail_0;
998 }
999 }
1000 else
1001 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001002
Guido van Rossum12d12c51993-10-26 17:58:25 +00001003 }
Guido van Rossum32120311995-07-10 13:52:21 +00001004 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001005 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001006 if (PyTuple_SetItem(alist, j, item) < 0) {
1007 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001008 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001009 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001010 continue;
1011
1012 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001014 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001015 }
1016
Guido van Rossum32120311995-07-10 13:52:21 +00001017 if (!alist)
1018 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001019
1020 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001022 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001023 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001024
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001026 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001027 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 value = PyEval_CallObject(func, alist);
1029 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001030 if (value == NULL)
1031 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001032 }
1033 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001034 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001035 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001036 if (status < 0)
1037 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001038 }
1039 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001041 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001042 }
1043 }
1044
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001045 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1046 goto Fail_1;
1047
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001049 return result;
1050
Guido van Rossum12d12c51993-10-26 17:58:25 +00001051Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001053Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001055 return NULL;
1056}
1057
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001058static char map_doc[] =
1059"map(function, sequence[, sequence, ...]) -> list\n\
1060\n\
1061Return a list of the results of applying the function to the items of\n\
1062the argument sequence(s). If more than one sequence is given, the\n\
1063function is called with an argument list consisting of the corresponding\n\
1064item of each sequence, substituting None for missing values when not all\n\
1065sequences have the same length. If the function is None, return a list of\n\
1066the items of the sequence (or a list of tuples if more than one sequence).";
1067
1068
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001070builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001071{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 PyObject *v;
1073 PyObject *name;
1074 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001075
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001076 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001077 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001079 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 Py_INCREF(Py_None);
1081 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001082}
1083
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001084static char setattr_doc[] =
1085"setattr(object, name, value)\n\
1086\n\
1087Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1088``x.y = v''.";
1089
1090
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001092builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001093{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094 PyObject *v;
1095 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001096
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001097 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001098 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001100 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 Py_INCREF(Py_None);
1102 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001103}
1104
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001105static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001106"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001107\n\
1108Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1109``del x.y''.";
1110
1111
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001113builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001114{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001116 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001117
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001121 if (x == -1)
1122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124}
1125
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001126static char hash_doc[] =
1127"hash(object) -> integer\n\
1128\n\
1129Return a hash value for the object. Two objects with the same value have\n\
1130the same hash value. The reverse is not necessarily true, but likely.";
1131
1132
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001134builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001135{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 PyObject *v;
1137 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001138
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001140 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001141
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001143 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001145 "hex() argument can't be converted to hex");
1146 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001147 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001148 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001149}
1150
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001151static char hex_doc[] =
1152"hex(number) -> string\n\
1153\n\
1154Return the hexadecimal representation of an integer or long integer.";
1155
1156
Tim Petersdbd9ba62000-07-09 03:09:57 +00001157static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001158
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001160builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001161{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001163 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 PyObject *res;
1165 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166
1167 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001168 if (line == NULL)
1169 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171 return NULL;
1172 while (*str == ' ' || *str == '\t')
1173 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 globals = PyEval_GetGlobals();
1175 locals = PyEval_GetLocals();
1176 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1177 if (PyDict_SetItemString(globals, "__builtins__",
1178 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001179 return NULL;
1180 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001181 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001184}
1185
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001186static char input_doc[] =
1187"input([prompt]) -> value\n\
1188\n\
1189Equivalent to eval(raw_input(prompt)).";
1190
1191
Guido van Rossume8811f81997-02-14 15:48:05 +00001192static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001193builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001194{
1195 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001196 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001197 return NULL;
1198 Py_INCREF(s);
1199 PyString_InternInPlace(&s);
1200 return s;
1201}
1202
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001203static char intern_doc[] =
1204"intern(string) -> string\n\
1205\n\
1206``Intern'' the given string. This enters the string in the (global)\n\
1207table of interned strings whose purpose is to speed up dictionary lookups.\n\
1208Return the string itself or the previously interned string object with the\n\
1209same value.";
1210
1211
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001213builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001214{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001216 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001217
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001218 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001220 if (base == -909)
1221 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001222 else if (PyString_Check(v))
1223 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1224 else if (PyUnicode_Check(v))
1225 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1226 PyUnicode_GET_SIZE(v),
1227 base);
1228 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001229 PyErr_SetString(PyExc_TypeError,
1230 "can't convert non-string with explicit base");
1231 return NULL;
1232 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001233}
1234
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001235static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001236"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001237\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001238Convert a string or number to an integer, if possible. A floating point\n\
1239argument will be truncated towards zero (this does not include a string\n\
1240representation of a floating point number!) When converting a string, use\n\
1241the optional base. It is an error to supply a base when converting a\n\
1242non-string.";
1243
1244
1245static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001246builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001247{
1248 PyObject *v;
1249 int base = -909; /* unlikely! */
1250
1251 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1252 return NULL;
1253 if (base == -909)
1254 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001255 else if (PyString_Check(v))
1256 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1257 else if (PyUnicode_Check(v))
1258 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1259 PyUnicode_GET_SIZE(v),
1260 base);
1261 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001262 PyErr_SetString(PyExc_TypeError,
1263 "can't convert non-string with explicit base");
1264 return NULL;
1265 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001266}
1267
1268static char long_doc[] =
1269"long(x) -> long integer\n\
1270long(x, base) -> long integer\n\
1271\n\
1272Convert a string or number to a long integer, if possible. A floating\n\
1273point argument will be truncated towards zero (this does not include a\n\
1274string representation of a floating point number!) When converting a\n\
1275string, use the given base. It is an error to supply a base when\n\
1276converting a non-string.";
1277
1278
1279static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001280builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001281{
1282 PyObject *v;
1283
1284 if (!PyArg_ParseTuple(args, "O:float", &v))
1285 return NULL;
1286 if (PyString_Check(v))
1287 return PyFloat_FromString(v, NULL);
1288 return PyNumber_Float(v);
1289}
1290
1291static char float_doc[] =
1292"float(x) -> floating point number\n\
1293\n\
1294Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001295
1296
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001298builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001299{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001301 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001305 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001306 if (res < 0 && PyErr_Occurred())
1307 return NULL;
1308 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001309}
1310
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001311static char len_doc[] =
1312"len(object) -> integer\n\
1313\n\
1314Return the number of items of a sequence or mapping.";
1315
1316
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001318builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001319{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001321
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001323 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001324 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001325}
1326
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001327static char list_doc[] =
1328"list(sequence) -> list\n\
1329\n\
1330Return a new list whose items are the same as those of the argument sequence.";
1331
Guido van Rossum8861b741996-07-30 16:49:37 +00001332
1333static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001334builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001335{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001336 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001337
Guido van Rossum09df08a1998-05-22 00:51:39 +00001338 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001339
Guido van Rossum09df08a1998-05-22 00:51:39 +00001340 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1341 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001342
Guido van Rossum09df08a1998-05-22 00:51:39 +00001343 /* This swapping of stop and start is to maintain similarity with
1344 range(). */
1345 if (stop == NULL) {
1346 stop = start;
1347 start = NULL;
1348 }
1349 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001350}
1351
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001352static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001353"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001354\n\
1355Create a slice object. This is used for slicing by the Numeric extensions.";
1356
1357
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001359builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001360{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001362
Guido van Rossum43713e52000-02-29 13:59:29 +00001363 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001364 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 d = PyEval_GetLocals();
1366 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001367 return d;
1368}
1369
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001370static char locals_doc[] =
1371"locals() -> dictionary\n\
1372\n\
1373Return the dictionary containing the current scope's local variables.";
1374
1375
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001377min_max(PyObject *args, int sign)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001378{
Guido van Rossum2d951851994-08-29 12:52:16 +00001379 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *v, *w, *x;
1381 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001382
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001384 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001386 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001387 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001388 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001389 PyErr_SetString(PyExc_TypeError,
1390 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001391 return NULL;
1392 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001393 w = NULL;
1394 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001395 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001396 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001397 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001399 break;
1400 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001402 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001404 if (w == NULL)
1405 w = x;
1406 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001407 int c = PyObject_Compare(x, w);
1408 if (c && PyErr_Occurred()) {
1409 Py_DECREF(x);
1410 Py_XDECREF(w);
1411 return NULL;
1412 }
1413 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001415 w = x;
1416 }
1417 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001418 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001419 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001420 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001421 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001422 PyErr_SetString(PyExc_ValueError,
1423 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001424 return w;
1425}
1426
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001428builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429{
1430 return min_max(v, -1);
1431}
1432
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001433static char min_doc[] =
1434"min(sequence) -> value\n\
1435min(a, b, c, ...) -> value\n\
1436\n\
1437With a single sequence argument, return its smallest item.\n\
1438With two or more arguments, return the smallest argument.";
1439
1440
Guido van Rossum79f25d91997-04-29 20:08:16 +00001441static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001442builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001443{
1444 return min_max(v, 1);
1445}
1446
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001447static char max_doc[] =
1448"max(sequence) -> value\n\
1449max(a, b, c, ...) -> value\n\
1450\n\
1451With a single sequence argument, return its largest item.\n\
1452With two or more arguments, return the largest argument.";
1453
1454
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001456builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001457{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 PyObject *v;
1459 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001460
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001463 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1464 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001466 "oct() argument can't be converted to oct");
1467 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001468 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001469 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001470}
1471
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001472static char oct_doc[] =
1473"oct(number) -> string\n\
1474\n\
1475Return the octal representation of an integer or long integer.";
1476
1477
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001479builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001480{
Guido van Rossum2d951851994-08-29 12:52:16 +00001481 char *name;
1482 char *mode = "r";
1483 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001485
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001487 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001489 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001491 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492}
1493
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001494static char open_doc[] =
1495"open(filename[, mode[, buffering]]) -> file object\n\
1496\n\
1497Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1498writing or appending. The file will be created if it doesn't exist\n\
1499when opened for writing or appending; it will be truncated when\n\
1500opened for writing. Add a 'b' to the mode for binary files.\n\
1501Add a '+' to the mode to allow simultaneous reading and writing.\n\
1502If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1503buffered, and larger numbers specify the buffer size.";
1504
1505
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001507builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001508{
Guido van Rossum09095f32000-03-10 23:00:52 +00001509 PyObject *obj;
1510 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001511 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512
Guido van Rossum09095f32000-03-10 23:00:52 +00001513 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001514 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001515
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001516 if (PyString_Check(obj)) {
1517 size = PyString_GET_SIZE(obj);
1518 if (size == 1)
1519 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1520 } else if (PyUnicode_Check(obj)) {
1521 size = PyUnicode_GET_SIZE(obj);
1522 if (size == 1)
1523 ord = (long)*PyUnicode_AS_UNICODE(obj);
1524 } else {
1525 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001526 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001527 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001528 return NULL;
1529 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001530 if (size == 1)
1531 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001532
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001533 PyErr_Format(PyExc_TypeError,
1534 "expected a character, length-%d string found",
1535 size);
1536 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537}
1538
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001539static char ord_doc[] =
1540"ord(c) -> integer\n\
1541\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001542Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001543
1544
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001546builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001547{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001548 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001549
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001551 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001552 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001553}
1554
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001555static char pow_doc[] =
1556"pow(x, y[, z]) -> number\n\
1557\n\
1558With two arguments, equivalent to x**y. With three arguments,\n\
1559equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1560
1561
Guido van Rossum124eff01999-02-23 16:11:01 +00001562/* Return number of items in range/xrange (lo, hi, step). step > 0
1563 * required. Return a value < 0 if & only if the true value is too
1564 * large to fit in a signed long.
1565 */
1566static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001567get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001568{
1569 /* -------------------------------------------------------------
1570 If lo >= hi, the range is empty.
1571 Else if n values are in the range, the last one is
1572 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1573 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1574 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1575 the RHS is non-negative and so truncation is the same as the
1576 floor. Letting M be the largest positive long, the worst case
1577 for the RHS numerator is hi=M, lo=-M-1, and then
1578 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1579 precision to compute the RHS exactly.
1580 ---------------------------------------------------------------*/
1581 long n = 0;
1582 if (lo < hi) {
1583 unsigned long uhi = (unsigned long)hi;
1584 unsigned long ulo = (unsigned long)lo;
1585 unsigned long diff = uhi - ulo - 1;
1586 n = (long)(diff / (unsigned long)step + 1);
1587 }
1588 return n;
1589}
1590
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001592builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001594 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001595 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001597
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001599
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 if (PyTuple_Size(args) <= 1) {
1601 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001602 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001603 &ihigh))
1604 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605 }
1606 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001608 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001609 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001610 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611 }
1612 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 return NULL;
1615 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001616 if (istep > 0)
1617 bign = get_len_of_range(ilow, ihigh, istep);
1618 else
1619 bign = get_len_of_range(ihigh, ilow, -istep);
1620 n = (int)bign;
1621 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001622 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001623 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001624 return NULL;
1625 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001626 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001627 if (v == NULL)
1628 return NULL;
1629 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001630 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001631 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001632 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633 return NULL;
1634 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001635 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001636 ilow += istep;
1637 }
1638 return v;
1639}
1640
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001641static char range_doc[] =
1642"range([start,] stop[, step]) -> list of integers\n\
1643\n\
1644Return a list containing an arithmetic progression of integers.\n\
1645range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1646When step is given, it specifies the increment (or decrement).\n\
1647For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1648These are exactly the valid indices for a list of 4 elements.";
1649
1650
Guido van Rossum79f25d91997-04-29 20:08:16 +00001651static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001652builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001653{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001654 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001655 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001656
Guido van Rossum79f25d91997-04-29 20:08:16 +00001657 if (PyTuple_Size(args) <= 1) {
1658 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001659 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001660 &ihigh))
1661 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001662 }
1663 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001665 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001667 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001668 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001671 return NULL;
1672 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001673 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001674 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001675 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001676 n = get_len_of_range(ihigh, ilow, -istep);
1677 if (n < 0) {
1678 PyErr_SetString(PyExc_OverflowError,
1679 "xrange() has more than sys.maxint items");
1680 return NULL;
1681 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001683}
1684
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001685static char xrange_doc[] =
1686"xrange([start,] stop[, step]) -> xrange object\n\
1687\n\
1688Like range(), but instead of returning a list, returns an object that\n\
1689generates the numbers in the range on demand. This is slightly slower\n\
1690than range() but more memory efficient.";
1691
1692
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001694builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001695{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696 PyObject *v = NULL;
1697 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001698
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001700 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1702 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001703 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001705 char *prompt;
1706 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001708 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001709 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001710 if (po == NULL)
1711 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001713 if (prompt == NULL)
1714 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001715 }
1716 else {
1717 po = NULL;
1718 prompt = "";
1719 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001720 s = PyOS_Readline(prompt);
1721 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001722 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001724 return NULL;
1725 }
1726 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001728 result = NULL;
1729 }
1730 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001731 size_t len = strlen(s);
1732 if (len > INT_MAX) {
1733 PyErr_SetString(PyExc_OverflowError, "input too long");
1734 result = NULL;
1735 }
1736 else {
1737 result = PyString_FromStringAndSize(s, (int)(len-1));
1738 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001739 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001740 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001741 return result;
1742 }
Guido van Rossum90933611991-06-07 16:10:43 +00001743 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001744 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001745 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001746 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001747 return NULL;
1748 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001749 if (Py_FlushLine() != 0 ||
1750 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001751 return NULL;
1752 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001754 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001756 return NULL;
1757 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001759}
1760
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001761static char raw_input_doc[] =
1762"raw_input([prompt]) -> string\n\
1763\n\
1764Read a string from standard input. The trailing newline is stripped.\n\
1765If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1766On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1767is printed without a trailing newline before reading.";
1768
1769
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001771builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001772{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 PyObject *seq, *func, *result = NULL;
1774 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001775 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001776
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001778 return NULL;
1779 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001781
Guido van Rossum09df08a1998-05-22 00:51:39 +00001782 sqf = seq->ob_type->tp_as_sequence;
1783 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001785 "2nd argument to reduce() must be a sequence object");
1786 return NULL;
1787 }
1788
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001790 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001791
Guido van Rossum2d951851994-08-29 12:52:16 +00001792 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001794
1795 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 Py_DECREF(args);
1797 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001798 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001799 }
1800
Guido van Rossum2d951851994-08-29 12:52:16 +00001801 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001802 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001803 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001804 break;
1805 }
1806 goto Fail;
1807 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001808
Guido van Rossum2d951851994-08-29 12:52:16 +00001809 if (result == NULL)
1810 result = op2;
1811 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 PyTuple_SetItem(args, 0, result);
1813 PyTuple_SetItem(args, 1, op2);
1814 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001815 goto Fail;
1816 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001817 }
1818
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001820
Guido van Rossum2d951851994-08-29 12:52:16 +00001821 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001823 "reduce of empty sequence with no initial value");
1824
Guido van Rossum12d12c51993-10-26 17:58:25 +00001825 return result;
1826
Guido van Rossum2d951851994-08-29 12:52:16 +00001827Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001828 Py_XDECREF(args);
1829 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001830 return NULL;
1831}
1832
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001833static char reduce_doc[] =
1834"reduce(function, sequence[, initial]) -> value\n\
1835\n\
1836Apply a function of two arguments cumulatively to the items of a sequence,\n\
1837from left to right, so as to reduce the sequence to a single value.\n\
1838For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1839((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1840of the sequence in the calculation, and serves as a default when the\n\
1841sequence is empty.";
1842
1843
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001845builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001846{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001848
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001850 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001852}
1853
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001854static char reload_doc[] =
1855"reload(module) -> module\n\
1856\n\
1857Reload the module. The module must have been successfully imported before.";
1858
1859
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001861builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001862{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001864
Guido van Rossum79f25d91997-04-29 20:08:16 +00001865 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001866 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001867 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001868}
1869
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001870static char repr_doc[] =
1871"repr(object) -> string\n\
1872\n\
1873Return the canonical string representation of the object.\n\
1874For most object types, eval(repr(object)) == object.";
1875
1876
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001878builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001879{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001880 double x;
1881 double f;
1882 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001883 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001884
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001886 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001887 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001888 i = abs(ndigits);
1889 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001890 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001891 if (ndigits < 0)
1892 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001893 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001894 x *= f;
1895 if (x >= 0.0)
1896 x = floor(x + 0.5);
1897 else
1898 x = ceil(x - 0.5);
1899 if (ndigits < 0)
1900 x *= f;
1901 else
1902 x /= f;
1903 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001904}
1905
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001906static char round_doc[] =
1907"round(number[, ndigits]) -> floating point number\n\
1908\n\
1909Round a number to a given precision in decimal digits (default 0 digits).\n\
1910This always returns a floating point number. Precision may be negative.";
1911
1912
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001914builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001915{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001917
Guido van Rossum79f25d91997-04-29 20:08:16 +00001918 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001919 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001921}
1922
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001923static char str_doc[] =
1924"str(object) -> string\n\
1925\n\
1926Return a nice string representation of the object.\n\
1927If the argument is a string, the return value is the same object.";
1928
1929
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001931builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001932{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001934
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001936 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001937 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001938}
1939
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001940static char tuple_doc[] =
1941"tuple(sequence) -> list\n\
1942\n\
1943Return a tuple whose items are the same as those of the argument sequence.\n\
1944If the argument is a tuple, the return value is the same object.";
1945
1946
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001948builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001949{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001951
Guido van Rossum79f25d91997-04-29 20:08:16 +00001952 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001954 v = (PyObject *)v->ob_type;
1955 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956 return v;
1957}
1958
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001959static char type_doc[] =
1960"type(object) -> type object\n\
1961\n\
1962Return the type of the object.";
1963
1964
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001966builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001967{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyObject *v = NULL;
1969 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001970
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001972 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001973 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001974 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001975 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 if (!PyErr_Occurred())
1977 PyErr_SetString(PyExc_SystemError,
1978 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001979 }
1980 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001982 }
1983 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001985 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001987 "vars() argument must have __dict__ attribute");
1988 return NULL;
1989 }
1990 }
1991 return d;
1992}
1993
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001994static char vars_doc[] =
1995"vars([object]) -> dictionary\n\
1996\n\
1997Without arguments, equivalent to locals().\n\
1998With an argument, equivalent to object.__dict__.";
1999
Guido van Rossum668213d1999-06-16 17:28:37 +00002000static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002001abstract_issubclass(PyObject *derived, PyObject *cls, char *err, int first)
Guido van Rossum668213d1999-06-16 17:28:37 +00002002{
2003 static PyObject *__bases__ = NULL;
2004 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002005 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002006 int r = 0;
2007
2008 if (__bases__ == NULL) {
2009 __bases__ = PyString_FromString("__bases__");
2010 if (__bases__ == NULL)
2011 return -1;
2012 }
2013
2014 if (first) {
2015 bases = PyObject_GetAttr(cls, __bases__);
2016 if (bases == NULL || !PyTuple_Check(bases)) {
2017 Py_XDECREF(bases);
2018 PyErr_SetString(PyExc_TypeError, err);
2019 return -1;
2020 }
2021 Py_DECREF(bases);
2022 }
2023
2024 if (derived == cls)
2025 return 1;
2026
2027 bases = PyObject_GetAttr(derived, __bases__);
2028 if (bases == NULL || !PyTuple_Check(bases)) {
2029 Py_XDECREF(bases);
2030 PyErr_SetString(PyExc_TypeError, err);
2031 return -1;
2032 }
2033
2034 n = PyTuple_GET_SIZE(bases);
2035 for (i = 0; i < n; i++) {
2036 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2037 cls, err, 0);
2038 if (r != 0)
2039 break;
2040 }
2041
2042 Py_DECREF(bases);
2043
2044 return r;
2045}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002046
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002047static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002048builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002049{
2050 PyObject *inst;
2051 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002052 PyObject *icls;
2053 static PyObject *__class__ = NULL;
2054 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002055
Guido van Rossum43713e52000-02-29 13:59:29 +00002056 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002057 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002058
Guido van Rossum668213d1999-06-16 17:28:37 +00002059 if (PyClass_Check(cls)) {
2060 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002061 PyObject *inclass =
2062 (PyObject*)((PyInstanceObject*)inst)->in_class;
2063 retval = PyClass_IsSubclass(inclass, cls);
2064 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002065 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002066 else if (PyType_Check(cls)) {
2067 retval = ((PyObject *)(inst->ob_type) == cls);
2068 }
2069 else if (!PyInstance_Check(inst)) {
2070 if (__class__ == NULL) {
2071 __class__ = PyString_FromString("__class__");
2072 if (__class__ == NULL)
2073 return NULL;
2074 }
2075 icls = PyObject_GetAttr(inst, __class__);
2076 if (icls != NULL) {
2077 retval = abstract_issubclass(
2078 icls, cls,
2079 "second argument must be a class",
2080 1);
2081 Py_DECREF(icls);
2082 if (retval < 0)
2083 return NULL;
2084 }
2085 else {
2086 PyErr_SetString(PyExc_TypeError,
2087 "second argument must be a class");
2088 return NULL;
2089 }
2090 }
2091 else {
2092 PyErr_SetString(PyExc_TypeError,
2093 "second argument must be a class");
2094 return NULL;
2095 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002096 return PyInt_FromLong(retval);
2097}
2098
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002099static char isinstance_doc[] =
2100"isinstance(object, class-or-type) -> Boolean\n\
2101\n\
2102Return whether an object is an instance of a class or of a subclass thereof.\n\
2103With a type as second argument, return whether that is the object's type.";
2104
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002105
2106static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002107builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002108{
2109 PyObject *derived;
2110 PyObject *cls;
2111 int retval;
2112
Guido van Rossum43713e52000-02-29 13:59:29 +00002113 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002114 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002115
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002116 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002117 retval = abstract_issubclass(
2118 derived, cls, "arguments must be classes", 1);
2119 if (retval < 0)
2120 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002121 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002122 else {
2123 /* shortcut */
2124 if (!(retval = (derived == cls)))
2125 retval = PyClass_IsSubclass(derived, cls);
2126 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002127
2128 return PyInt_FromLong(retval);
2129}
2130
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002131static char issubclass_doc[] =
2132"issubclass(C, B) -> Boolean\n\
2133\n\
2134Return whether class C is a subclass (i.e., a derived class) of class B.";
2135
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002136
Barry Warsawbd599b52000-08-03 15:45:29 +00002137static PyObject*
2138builtin_zip(PyObject *self, PyObject *args)
2139{
2140 PyObject *ret;
2141 int itemsize = PySequence_Length(args);
2142 int i, j;
2143
2144 if (itemsize < 1) {
2145 PyErr_SetString(PyExc_TypeError,
2146 "at least one sequence is required");
2147 return NULL;
2148 }
2149 /* args must be a tuple */
2150 assert(PyTuple_Check(args));
2151
2152 if ((ret = PyList_New(0)) == NULL)
2153 return NULL;
2154
2155 for (i = 0;; i++) {
2156 PyObject *next = PyTuple_New(itemsize);
2157 if (!next) {
2158 Py_DECREF(ret);
2159 return NULL;
2160 }
2161 for (j = 0; j < itemsize; j++) {
2162 PyObject *seq = PyTuple_GET_ITEM(args, j);
2163 PyObject *item = PySequence_GetItem(seq, i);
2164
2165 if (!item) {
2166 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2167 PyErr_Clear();
2168 Py_DECREF(next);
2169 return ret;
2170 }
2171 Py_DECREF(next);
2172 Py_DECREF(ret);
2173 return NULL;
2174 }
2175 PyTuple_SET_ITEM(next, j, item);
2176 }
2177 PyList_Append(ret, next);
2178 Py_DECREF(next);
2179 }
2180 /* no return */
2181}
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},
2223 {"len", builtin_len, 1, len_doc},
2224 {"list", builtin_list, 1, list_doc},
2225 {"locals", builtin_locals, 1, locals_doc},
2226 {"long", builtin_long, 1, long_doc},
2227 {"map", builtin_map, 1, map_doc},
2228 {"max", builtin_max, 1, max_doc},
2229 {"min", builtin_min, 1, min_doc},
2230 {"oct", builtin_oct, 1, oct_doc},
2231 {"open", builtin_open, 1, open_doc},
2232 {"ord", builtin_ord, 1, ord_doc},
2233 {"pow", builtin_pow, 1, pow_doc},
2234 {"range", builtin_range, 1, range_doc},
2235 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2236 {"reduce", builtin_reduce, 1, reduce_doc},
2237 {"reload", builtin_reload, 1, reload_doc},
2238 {"repr", builtin_repr, 1, repr_doc},
2239 {"round", builtin_round, 1, round_doc},
2240 {"setattr", builtin_setattr, 1, setattr_doc},
2241 {"slice", builtin_slice, 1, slice_doc},
2242 {"str", builtin_str, 1, str_doc},
2243 {"tuple", builtin_tuple, 1, tuple_doc},
2244 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002245 {"unicode", builtin_unicode, 1, unicode_doc},
2246 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002247 {"vars", builtin_vars, 1, vars_doc},
2248 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002249 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002250 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002251};
2252
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002253static char builtin_doc[] =
2254"Built-in functions, exceptions, and other objects.\n\
2255\n\
2256Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2257
Guido van Rossum25ce5661997-08-02 03:10:38 +00002258PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002259_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002260{
Fred Drake5550de32000-06-20 04:54:19 +00002261 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002262 mod = Py_InitModule4("__builtin__", builtin_methods,
2263 builtin_doc, (PyObject *)NULL,
2264 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002265 if (mod == NULL)
2266 return NULL;
2267 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002268 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2269 return NULL;
2270 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2271 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002272 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2273 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2274 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002275 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002276 }
2277 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002278
Guido van Rossum25ce5661997-08-02 03:10:38 +00002279 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002280}
2281
Guido van Rossume77a7571993-11-03 15:01:26 +00002282/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002283
Guido van Rossum79f25d91997-04-29 20:08:16 +00002284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002285filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002286{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002288 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002289 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002290
Guido van Rossumb7b45621995-08-04 04:07:45 +00002291 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002293 return tuple;
2294 }
2295
Guido van Rossum79f25d91997-04-29 20:08:16 +00002296 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002297 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002298
Guido van Rossum12d12c51993-10-26 17:58:25 +00002299 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002301 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002302
Guido van Rossum79f25d91997-04-29 20:08:16 +00002303 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002304 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002305 if (func == Py_None) {
2306 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002307 good = item;
2308 }
2309 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002311 if (arg == NULL)
2312 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002313 good = PyEval_CallObject(func, arg);
2314 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002315 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002316 goto Fail_1;
2317 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 ok = PyObject_IsTrue(good);
2319 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002320 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 Py_INCREF(item);
2322 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002323 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002324 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002325 }
2326
Guido van Rossum79f25d91997-04-29 20:08:16 +00002327 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002328 return NULL;
2329
Guido van Rossum12d12c51993-10-26 17:58:25 +00002330 return result;
2331
Guido van Rossum12d12c51993-10-26 17:58:25 +00002332Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002334 return NULL;
2335}
2336
2337
Guido van Rossume77a7571993-11-03 15:01:26 +00002338/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002339
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002341filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002342{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002343 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002344 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002346
Guido van Rossum79f25d91997-04-29 20:08:16 +00002347 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002348 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002350 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002351 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002353 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002354
Guido van Rossum12d12c51993-10-26 17:58:25 +00002355 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002357 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002358
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002359 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2360 if (item == NULL)
2361 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002362 arg = Py_BuildValue("(O)", item);
2363 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002364 if (arg == NULL)
2365 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002366 good = PyEval_CallObject(func, arg);
2367 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002368 if (good == NULL)
2369 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 ok = PyObject_IsTrue(good);
2371 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002372 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 PyString_AS_STRING((PyStringObject *)result)[j++] =
2374 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002375 }
2376
Guido van Rossum79f25d91997-04-29 20:08:16 +00002377 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002378 return NULL;
2379
Guido van Rossum12d12c51993-10-26 17:58:25 +00002380 return result;
2381
Guido van Rossum12d12c51993-10-26 17:58:25 +00002382Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002383 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002384 return NULL;
2385}