blob: 47c8af3e7c2e3f2d7325069600b29ec193a26678 [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);
751 if (!PyString_Check(cmd)) {
752 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000753 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000754 return NULL;
755 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 str = PyString_AsString(cmd);
Guido van Rossum106f2da2000-06-28 21:12:25 +0000757 if (strlen(str) != (size_t)PyString_Size(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000759 "embedded '\\0' in string arg");
760 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000761 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 while (*str == ' ' || *str == '\t')
763 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000764 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000765}
766
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000767static char eval_doc[] =
768"eval(source[, globals[, locals]]) -> value\n\
769\n\
770Evaluate the source in the context of globals and locals.\n\
771The source may be a string representing a Python expression\n\
772or a code object as returned by compile().\n\
773The globals and locals are dictionaries, defaulting to the current\n\
774globals and locals. If only globals is given, locals defaults to it.";
775
776
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000778builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000779{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 PyObject *globals = Py_None, *locals = Py_None;
782 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000783 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000784
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 &PyDict_Type, &globals,
788 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000789 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 if (globals == Py_None) {
791 globals = PyEval_GetGlobals();
792 if (locals == Py_None)
793 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000794 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000796 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
798 if (PyDict_SetItemString(globals, "__builtins__",
799 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000800 return NULL;
801 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000803 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000805 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000807 return NULL;
808 }
Guido van Rossum0df002c2000-08-27 19:21:52 +0000809 res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000810 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000811}
812
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000813static char execfile_doc[] =
814"execfile(filename[, globals[, locals]])\n\
815\n\
816Read and execute a Python script from a file.\n\
817The globals and locals are dictionaries, defaulting to the current\n\
818globals and locals. If only globals is given, locals defaults to it.";
819
820
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000822builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000823{
Guido van Rossum950ff291998-06-29 13:38:57 +0000824 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000826
Guido van Rossum950ff291998-06-29 13:38:57 +0000827 if (!PyArg_ParseTuple(args, "OS|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000828 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000829 result = PyObject_GetAttr(v, name);
830 if (result == NULL && dflt != NULL) {
831 PyErr_Clear();
832 Py_INCREF(dflt);
833 result = dflt;
834 }
835 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000836}
837
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000838static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000839"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000840\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000841Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
842When a default argument is given, it is returned when the attribute doesn't\n\
843exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000844
845
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000847builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000848{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000849 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000850
Guido van Rossum43713e52000-02-29 13:59:29 +0000851 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000852 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 d = PyEval_GetGlobals();
854 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000855 return d;
856}
857
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000858static char globals_doc[] =
859"globals() -> dictionary\n\
860\n\
861Return the dictionary containing the current scope's global variables.";
862
863
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000865builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000866{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 PyObject *v;
868 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000871 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000875 Py_INCREF(Py_False);
876 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000877 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000879 Py_INCREF(Py_True);
880 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000881}
882
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000883static char hasattr_doc[] =
884"hasattr(object, name) -> Boolean\n\
885\n\
886Return whether the object has an attribute with the given name.\n\
887(This is done by calling getattr(object, name) and catching exceptions.)";
888
889
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000891builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000892{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000894
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000896 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000897 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000898}
899
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000900static char id_doc[] =
901"id(object) -> integer\n\
902\n\
903Return the identity of an object. This is guaranteed to be unique among\n\
904simultaneously existing objects. (Hint: it's the object's memory address.)";
905
906
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000908builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000909{
910 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 PyObject *seq;
912 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000913 int len;
914 } sequence;
915
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000917 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000919 register int i, j;
920
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000922 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyErr_SetString(PyExc_TypeError,
924 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000925 return NULL;
926 }
927
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000930
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000931 if (func == Py_None && n == 1) {
932 /* map(None, S) is the same as list(S). */
933 return PySequence_List(PyTuple_GetItem(args, 1));
934 }
935
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
937 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000938 goto Fail_2;
939 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000940
Guido van Rossum2d951851994-08-29 12:52:16 +0000941 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000942 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000943 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000944
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000946 goto Fail_2;
947
Guido van Rossum09df08a1998-05-22 00:51:39 +0000948 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
949 if (sqf == NULL ||
950 sqf->sq_length == NULL ||
951 sqf->sq_item == NULL)
952 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000953 static char errmsg[] =
954 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000955 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000956
957 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000959 goto Fail_2;
960 }
961
962 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
963 goto Fail_2;
964
965 if (curlen > len)
966 len = curlen;
967 }
968
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000970 goto Fail_2;
971
Guido van Rossum2d951851994-08-29 12:52:16 +0000972 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000974 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000975
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000977 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000978 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000980 goto Fail_1;
981 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000982
983 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000984 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 Py_INCREF(Py_None);
986 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000987 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000988 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000989 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000990 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000991 if (PyErr_ExceptionMatches(
992 PyExc_IndexError))
993 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 PyErr_Clear();
995 Py_INCREF(Py_None);
996 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000997 sqp->len = -1;
998 }
999 else {
1000 goto Fail_0;
1001 }
1002 }
1003 else
1004 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001005
Guido van Rossum12d12c51993-10-26 17:58:25 +00001006 }
Guido van Rossum32120311995-07-10 13:52:21 +00001007 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001008 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009 if (PyTuple_SetItem(alist, j, item) < 0) {
1010 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001011 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001012 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001013 continue;
1014
1015 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001017 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001018 }
1019
Guido van Rossum32120311995-07-10 13:52:21 +00001020 if (!alist)
1021 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001022
1023 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001025 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001026 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001027
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001029 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001030 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 value = PyEval_CallObject(func, alist);
1032 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001033 if (value == NULL)
1034 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001035 }
1036 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001037 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001038 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001039 if (status < 0)
1040 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001041 }
1042 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001044 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001045 }
1046 }
1047
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001048 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1049 goto Fail_1;
1050
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001052 return result;
1053
Guido van Rossum12d12c51993-10-26 17:58:25 +00001054Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001056Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001058 return NULL;
1059}
1060
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001061static char map_doc[] =
1062"map(function, sequence[, sequence, ...]) -> list\n\
1063\n\
1064Return a list of the results of applying the function to the items of\n\
1065the argument sequence(s). If more than one sequence is given, the\n\
1066function is called with an argument list consisting of the corresponding\n\
1067item of each sequence, substituting None for missing values when not all\n\
1068sequences have the same length. If the function is None, return a list of\n\
1069the items of the sequence (or a list of tuples if more than one sequence).";
1070
1071
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001073builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001074{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 PyObject *v;
1076 PyObject *name;
1077 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001078
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001080 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001082 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 Py_INCREF(Py_None);
1084 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001085}
1086
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001087static char setattr_doc[] =
1088"setattr(object, name, value)\n\
1089\n\
1090Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1091``x.y = v''.";
1092
1093
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001095builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001096{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 PyObject *v;
1098 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001099
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001101 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001103 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 Py_INCREF(Py_None);
1105 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001106}
1107
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001108static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001109"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001110\n\
1111Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1112``del x.y''.";
1113
1114
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001116builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001117{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001120
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001122 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124 if (x == -1)
1125 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001127}
1128
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001129static char hash_doc[] =
1130"hash(object) -> integer\n\
1131\n\
1132Return a hash value for the object. Two objects with the same value have\n\
1133the same hash value. The reverse is not necessarily true, but likely.";
1134
1135
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001137builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001138{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyObject *v;
1140 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001141
Guido van Rossum79f25d91997-04-29 20:08:16 +00001142 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001143 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001144
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001146 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001148 "hex() argument can't be converted to hex");
1149 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001150 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001151 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001152}
1153
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001154static char hex_doc[] =
1155"hex(number) -> string\n\
1156\n\
1157Return the hexadecimal representation of an integer or long integer.";
1158
1159
Tim Petersdbd9ba62000-07-09 03:09:57 +00001160static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001161
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001163builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001164{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001166 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 PyObject *res;
1168 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001169
1170 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001171 if (line == NULL)
1172 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174 return NULL;
1175 while (*str == ' ' || *str == '\t')
1176 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 globals = PyEval_GetGlobals();
1178 locals = PyEval_GetLocals();
1179 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1180 if (PyDict_SetItemString(globals, "__builtins__",
1181 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001182 return NULL;
1183 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001184 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001186 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001187}
1188
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001189static char input_doc[] =
1190"input([prompt]) -> value\n\
1191\n\
1192Equivalent to eval(raw_input(prompt)).";
1193
1194
Guido van Rossume8811f81997-02-14 15:48:05 +00001195static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001196builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001197{
1198 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001199 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001200 return NULL;
1201 Py_INCREF(s);
1202 PyString_InternInPlace(&s);
1203 return s;
1204}
1205
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001206static char intern_doc[] =
1207"intern(string) -> string\n\
1208\n\
1209``Intern'' the given string. This enters the string in the (global)\n\
1210table of interned strings whose purpose is to speed up dictionary lookups.\n\
1211Return the string itself or the previously interned string object with the\n\
1212same value.";
1213
1214
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001216builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001217{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001219 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001220
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001221 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001223 if (base == -909)
1224 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001225 else if (PyString_Check(v))
1226 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1227 else if (PyUnicode_Check(v))
1228 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1229 PyUnicode_GET_SIZE(v),
1230 base);
1231 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001232 PyErr_SetString(PyExc_TypeError,
1233 "can't convert non-string with explicit base");
1234 return NULL;
1235 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001236}
1237
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001238static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001239"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001240\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001241Convert a string or number to an integer, if possible. A floating point\n\
1242argument will be truncated towards zero (this does not include a string\n\
1243representation of a floating point number!) When converting a string, use\n\
1244the optional base. It is an error to supply a base when converting a\n\
1245non-string.";
1246
1247
1248static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001249builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001250{
1251 PyObject *v;
1252 int base = -909; /* unlikely! */
1253
1254 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1255 return NULL;
1256 if (base == -909)
1257 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001258 else if (PyString_Check(v))
1259 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1260 else if (PyUnicode_Check(v))
1261 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1262 PyUnicode_GET_SIZE(v),
1263 base);
1264 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001265 PyErr_SetString(PyExc_TypeError,
1266 "can't convert non-string with explicit base");
1267 return NULL;
1268 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001269}
1270
1271static char long_doc[] =
1272"long(x) -> long integer\n\
1273long(x, base) -> long integer\n\
1274\n\
1275Convert a string or number to a long integer, if possible. A floating\n\
1276point argument will be truncated towards zero (this does not include a\n\
1277string representation of a floating point number!) When converting a\n\
1278string, use the given base. It is an error to supply a base when\n\
1279converting a non-string.";
1280
1281
1282static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001283builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001284{
1285 PyObject *v;
1286
1287 if (!PyArg_ParseTuple(args, "O:float", &v))
1288 return NULL;
1289 if (PyString_Check(v))
1290 return PyFloat_FromString(v, NULL);
1291 return PyNumber_Float(v);
1292}
1293
1294static char float_doc[] =
1295"float(x) -> floating point number\n\
1296\n\
1297Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001298
1299
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001301builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001302{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001304 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001305
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001307 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001308 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001309 if (res < 0 && PyErr_Occurred())
1310 return NULL;
1311 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001312}
1313
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001314static char len_doc[] =
1315"len(object) -> integer\n\
1316\n\
1317Return the number of items of a sequence or mapping.";
1318
1319
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001321builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001322{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001324
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001326 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001327 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001328}
1329
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001330static char list_doc[] =
1331"list(sequence) -> list\n\
1332\n\
1333Return a new list whose items are the same as those of the argument sequence.";
1334
Guido van Rossum8861b741996-07-30 16:49:37 +00001335
1336static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001337builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001338{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001339 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001340
Guido van Rossum09df08a1998-05-22 00:51:39 +00001341 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001342
Guido van Rossum09df08a1998-05-22 00:51:39 +00001343 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1344 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001345
Guido van Rossum09df08a1998-05-22 00:51:39 +00001346 /* This swapping of stop and start is to maintain similarity with
1347 range(). */
1348 if (stop == NULL) {
1349 stop = start;
1350 start = NULL;
1351 }
1352 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001353}
1354
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001355static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001356"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001357\n\
1358Create a slice object. This is used for slicing by the Numeric extensions.";
1359
1360
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001362builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001363{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001365
Guido van Rossum43713e52000-02-29 13:59:29 +00001366 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001367 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 d = PyEval_GetLocals();
1369 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001370 return d;
1371}
1372
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001373static char locals_doc[] =
1374"locals() -> dictionary\n\
1375\n\
1376Return the dictionary containing the current scope's local variables.";
1377
1378
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001380min_max(PyObject *args, int sign)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001381{
Guido van Rossum2d951851994-08-29 12:52:16 +00001382 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 PyObject *v, *w, *x;
1384 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001391 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 PyErr_SetString(PyExc_TypeError,
1393 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001394 return NULL;
1395 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001396 w = NULL;
1397 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001399 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001400 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001402 break;
1403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001405 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001406 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001407 if (w == NULL)
1408 w = x;
1409 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001410 int c = PyObject_Compare(x, w);
1411 if (c && PyErr_Occurred()) {
1412 Py_DECREF(x);
1413 Py_XDECREF(w);
1414 return NULL;
1415 }
1416 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001418 w = x;
1419 }
1420 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001422 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001423 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001424 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001425 PyErr_SetString(PyExc_ValueError,
1426 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001427 return w;
1428}
1429
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001431builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001432{
1433 return min_max(v, -1);
1434}
1435
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001436static char min_doc[] =
1437"min(sequence) -> value\n\
1438min(a, b, c, ...) -> value\n\
1439\n\
1440With a single sequence argument, return its smallest item.\n\
1441With two or more arguments, return the smallest argument.";
1442
1443
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001445builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001446{
1447 return min_max(v, 1);
1448}
1449
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001450static char max_doc[] =
1451"max(sequence) -> value\n\
1452max(a, b, c, ...) -> value\n\
1453\n\
1454With a single sequence argument, return its largest item.\n\
1455With two or more arguments, return the largest argument.";
1456
1457
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001459builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001460{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 PyObject *v;
1462 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001466 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1467 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001469 "oct() argument can't be converted to oct");
1470 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001471 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001472 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001473}
1474
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001475static char oct_doc[] =
1476"oct(number) -> string\n\
1477\n\
1478Return the octal representation of an integer or long integer.";
1479
1480
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001482builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001483{
Guido van Rossum2d951851994-08-29 12:52:16 +00001484 char *name;
1485 char *mode = "r";
1486 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001487 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001490 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001492 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001494 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001495}
1496
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001497static char open_doc[] =
1498"open(filename[, mode[, buffering]]) -> file object\n\
1499\n\
1500Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1501writing or appending. The file will be created if it doesn't exist\n\
1502when opened for writing or appending; it will be truncated when\n\
1503opened for writing. Add a 'b' to the mode for binary files.\n\
1504Add a '+' to the mode to allow simultaneous reading and writing.\n\
1505If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1506buffered, and larger numbers specify the buffer size.";
1507
1508
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001510builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001511{
Guido van Rossum09095f32000-03-10 23:00:52 +00001512 PyObject *obj;
1513 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001514 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515
Guido van Rossum09095f32000-03-10 23:00:52 +00001516 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001517 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001518
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001519 if (PyString_Check(obj)) {
1520 size = PyString_GET_SIZE(obj);
1521 if (size == 1)
1522 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1523 } else if (PyUnicode_Check(obj)) {
1524 size = PyUnicode_GET_SIZE(obj);
1525 if (size == 1)
1526 ord = (long)*PyUnicode_AS_UNICODE(obj);
1527 } else {
1528 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001529 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001530 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001531 return NULL;
1532 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001533 if (size == 1)
1534 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001535
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001536 PyErr_Format(PyExc_TypeError,
1537 "expected a character, length-%d string found",
1538 size);
1539 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001540}
1541
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001542static char ord_doc[] =
1543"ord(c) -> integer\n\
1544\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001545Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001546
1547
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001549builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001550{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001551 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001552
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001554 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001555 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001556}
1557
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001558static char pow_doc[] =
1559"pow(x, y[, z]) -> number\n\
1560\n\
1561With two arguments, equivalent to x**y. With three arguments,\n\
1562equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1563
1564
Guido van Rossum124eff01999-02-23 16:11:01 +00001565/* Return number of items in range/xrange (lo, hi, step). step > 0
1566 * required. Return a value < 0 if & only if the true value is too
1567 * large to fit in a signed long.
1568 */
1569static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001570get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001571{
1572 /* -------------------------------------------------------------
1573 If lo >= hi, the range is empty.
1574 Else if n values are in the range, the last one is
1575 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1576 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1577 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1578 the RHS is non-negative and so truncation is the same as the
1579 floor. Letting M be the largest positive long, the worst case
1580 for the RHS numerator is hi=M, lo=-M-1, and then
1581 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1582 precision to compute the RHS exactly.
1583 ---------------------------------------------------------------*/
1584 long n = 0;
1585 if (lo < hi) {
1586 unsigned long uhi = (unsigned long)hi;
1587 unsigned long ulo = (unsigned long)lo;
1588 unsigned long diff = uhi - ulo - 1;
1589 n = (long)(diff / (unsigned long)step + 1);
1590 }
1591 return n;
1592}
1593
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001595builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001596{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001597 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001598 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001599 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001600
Guido van Rossum79f25d91997-04-29 20:08:16 +00001601 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001602
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 if (PyTuple_Size(args) <= 1) {
1604 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001605 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 &ihigh))
1607 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608 }
1609 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001611 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001612 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001614 }
1615 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617 return NULL;
1618 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001619 if (istep > 0)
1620 bign = get_len_of_range(ilow, ihigh, istep);
1621 else
1622 bign = get_len_of_range(ihigh, ilow, -istep);
1623 n = (int)bign;
1624 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001625 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001626 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001627 return NULL;
1628 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630 if (v == NULL)
1631 return NULL;
1632 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001633 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001635 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001636 return NULL;
1637 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001638 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 ilow += istep;
1640 }
1641 return v;
1642}
1643
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001644static char range_doc[] =
1645"range([start,] stop[, step]) -> list of integers\n\
1646\n\
1647Return a list containing an arithmetic progression of integers.\n\
1648range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1649When step is given, it specifies the increment (or decrement).\n\
1650For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1651These are exactly the valid indices for a list of 4 elements.";
1652
1653
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001655builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001656{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001657 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001658 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001659
Guido van Rossum79f25d91997-04-29 20:08:16 +00001660 if (PyTuple_Size(args) <= 1) {
1661 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001662 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 &ihigh))
1664 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001665 }
1666 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001667 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001668 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001670 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001671 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001672 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001674 return NULL;
1675 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001676 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001677 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001678 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001679 n = get_len_of_range(ihigh, ilow, -istep);
1680 if (n < 0) {
1681 PyErr_SetString(PyExc_OverflowError,
1682 "xrange() has more than sys.maxint items");
1683 return NULL;
1684 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001686}
1687
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001688static char xrange_doc[] =
1689"xrange([start,] stop[, step]) -> xrange object\n\
1690\n\
1691Like range(), but instead of returning a list, returns an object that\n\
1692generates the numbers in the range on demand. This is slightly slower\n\
1693than range() but more memory efficient.";
1694
1695
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001697builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 PyObject *v = NULL;
1700 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001701
Guido van Rossum79f25d91997-04-29 20:08:16 +00001702 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001703 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1705 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001706 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001708 char *prompt;
1709 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001711 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001713 if (po == NULL)
1714 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001716 if (prompt == NULL)
1717 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001718 }
1719 else {
1720 po = NULL;
1721 prompt = "";
1722 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001723 s = PyOS_Readline(prompt);
1724 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001725 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001726 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001727 return NULL;
1728 }
1729 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001731 result = NULL;
1732 }
1733 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001734 size_t len = strlen(s);
1735 if (len > INT_MAX) {
1736 PyErr_SetString(PyExc_OverflowError, "input too long");
1737 result = NULL;
1738 }
1739 else {
1740 result = PyString_FromStringAndSize(s, (int)(len-1));
1741 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001742 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001743 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001744 return result;
1745 }
Guido van Rossum90933611991-06-07 16:10:43 +00001746 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001747 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001748 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001750 return NULL;
1751 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001752 if (Py_FlushLine() != 0 ||
1753 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001754 return NULL;
1755 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001757 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001759 return NULL;
1760 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762}
1763
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001764static char raw_input_doc[] =
1765"raw_input([prompt]) -> string\n\
1766\n\
1767Read a string from standard input. The trailing newline is stripped.\n\
1768If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1769On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1770is printed without a trailing newline before reading.";
1771
1772
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001774builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001775{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 PyObject *seq, *func, *result = NULL;
1777 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001778 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001779
Guido van Rossum79f25d91997-04-29 20:08:16 +00001780 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001781 return NULL;
1782 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001783 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001784
Guido van Rossum09df08a1998-05-22 00:51:39 +00001785 sqf = seq->ob_type->tp_as_sequence;
1786 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001787 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788 "2nd argument to reduce() must be a sequence object");
1789 return NULL;
1790 }
1791
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001793 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001794
Guido van Rossum2d951851994-08-29 12:52:16 +00001795 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001797
1798 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001799 Py_DECREF(args);
1800 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001801 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001802 }
1803
Guido van Rossum2d951851994-08-29 12:52:16 +00001804 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001805 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001807 break;
1808 }
1809 goto Fail;
1810 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001811
Guido van Rossum2d951851994-08-29 12:52:16 +00001812 if (result == NULL)
1813 result = op2;
1814 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 PyTuple_SetItem(args, 0, result);
1816 PyTuple_SetItem(args, 1, op2);
1817 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001818 goto Fail;
1819 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001820 }
1821
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001823
Guido van Rossum2d951851994-08-29 12:52:16 +00001824 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001826 "reduce of empty sequence with no initial value");
1827
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828 return result;
1829
Guido van Rossum2d951851994-08-29 12:52:16 +00001830Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 Py_XDECREF(args);
1832 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001833 return NULL;
1834}
1835
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001836static char reduce_doc[] =
1837"reduce(function, sequence[, initial]) -> value\n\
1838\n\
1839Apply a function of two arguments cumulatively to the items of a sequence,\n\
1840from left to right, so as to reduce the sequence to a single value.\n\
1841For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1842((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1843of the sequence in the calculation, and serves as a default when the\n\
1844sequence is empty.";
1845
1846
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001848builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001851
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001853 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001854 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001855}
1856
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001857static char reload_doc[] =
1858"reload(module) -> module\n\
1859\n\
1860Reload the module. The module must have been successfully imported before.";
1861
1862
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001864builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001865{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001869 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001871}
1872
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001873static char repr_doc[] =
1874"repr(object) -> string\n\
1875\n\
1876Return the canonical string representation of the object.\n\
1877For most object types, eval(repr(object)) == object.";
1878
1879
Guido van Rossum79f25d91997-04-29 20:08:16 +00001880static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001881builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001882{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001883 double x;
1884 double f;
1885 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001886 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001887
Guido van Rossum79f25d91997-04-29 20:08:16 +00001888 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001889 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001890 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001891 i = abs(ndigits);
1892 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001893 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001894 if (ndigits < 0)
1895 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001896 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001897 x *= f;
1898 if (x >= 0.0)
1899 x = floor(x + 0.5);
1900 else
1901 x = ceil(x - 0.5);
1902 if (ndigits < 0)
1903 x *= f;
1904 else
1905 x /= f;
1906 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001907}
1908
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001909static char round_doc[] =
1910"round(number[, ndigits]) -> floating point number\n\
1911\n\
1912Round a number to a given precision in decimal digits (default 0 digits).\n\
1913This always returns a floating point number. Precision may be negative.";
1914
1915
Guido van Rossum79f25d91997-04-29 20:08:16 +00001916static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001917builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001918{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001919 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001920
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001922 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001923 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001924}
1925
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001926static char str_doc[] =
1927"str(object) -> string\n\
1928\n\
1929Return a nice string representation of the object.\n\
1930If the argument is a string, the return value is the same object.";
1931
1932
Guido van Rossum79f25d91997-04-29 20:08:16 +00001933static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001934builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001935{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001936 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001937
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001939 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001940 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001941}
1942
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001943static char tuple_doc[] =
1944"tuple(sequence) -> list\n\
1945\n\
1946Return a tuple whose items are the same as those of the argument sequence.\n\
1947If the argument is a tuple, the return value is the same object.";
1948
1949
Guido van Rossum79f25d91997-04-29 20:08:16 +00001950static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001951builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001952{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001953 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001954
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001957 v = (PyObject *)v->ob_type;
1958 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959 return v;
1960}
1961
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001962static char type_doc[] =
1963"type(object) -> type object\n\
1964\n\
1965Return the type of the object.";
1966
1967
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001969builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001970{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 PyObject *v = NULL;
1972 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001973
Guido van Rossum79f25d91997-04-29 20:08:16 +00001974 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001975 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001976 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001978 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 if (!PyErr_Occurred())
1980 PyErr_SetString(PyExc_SystemError,
1981 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001982 }
1983 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001985 }
1986 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001988 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001990 "vars() argument must have __dict__ attribute");
1991 return NULL;
1992 }
1993 }
1994 return d;
1995}
1996
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001997static char vars_doc[] =
1998"vars([object]) -> dictionary\n\
1999\n\
2000Without arguments, equivalent to locals().\n\
2001With an argument, equivalent to object.__dict__.";
2002
Guido van Rossum668213d1999-06-16 17:28:37 +00002003static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002004abstract_issubclass(PyObject *derived, PyObject *cls, char *err, int first)
Guido van Rossum668213d1999-06-16 17:28:37 +00002005{
2006 static PyObject *__bases__ = NULL;
2007 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002008 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002009 int r = 0;
2010
2011 if (__bases__ == NULL) {
2012 __bases__ = PyString_FromString("__bases__");
2013 if (__bases__ == NULL)
2014 return -1;
2015 }
2016
2017 if (first) {
2018 bases = PyObject_GetAttr(cls, __bases__);
2019 if (bases == NULL || !PyTuple_Check(bases)) {
2020 Py_XDECREF(bases);
2021 PyErr_SetString(PyExc_TypeError, err);
2022 return -1;
2023 }
2024 Py_DECREF(bases);
2025 }
2026
2027 if (derived == cls)
2028 return 1;
2029
2030 bases = PyObject_GetAttr(derived, __bases__);
2031 if (bases == NULL || !PyTuple_Check(bases)) {
2032 Py_XDECREF(bases);
2033 PyErr_SetString(PyExc_TypeError, err);
2034 return -1;
2035 }
2036
2037 n = PyTuple_GET_SIZE(bases);
2038 for (i = 0; i < n; i++) {
2039 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2040 cls, err, 0);
2041 if (r != 0)
2042 break;
2043 }
2044
2045 Py_DECREF(bases);
2046
2047 return r;
2048}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002049
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002050static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002051builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002052{
2053 PyObject *inst;
2054 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002055 PyObject *icls;
2056 static PyObject *__class__ = NULL;
2057 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002058
Guido van Rossum43713e52000-02-29 13:59:29 +00002059 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002060 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002061
Guido van Rossum668213d1999-06-16 17:28:37 +00002062 if (PyClass_Check(cls)) {
2063 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002064 PyObject *inclass =
2065 (PyObject*)((PyInstanceObject*)inst)->in_class;
2066 retval = PyClass_IsSubclass(inclass, cls);
2067 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002068 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002069 else if (PyType_Check(cls)) {
2070 retval = ((PyObject *)(inst->ob_type) == cls);
2071 }
2072 else if (!PyInstance_Check(inst)) {
2073 if (__class__ == NULL) {
2074 __class__ = PyString_FromString("__class__");
2075 if (__class__ == NULL)
2076 return NULL;
2077 }
2078 icls = PyObject_GetAttr(inst, __class__);
2079 if (icls != NULL) {
2080 retval = abstract_issubclass(
2081 icls, cls,
2082 "second argument must be a class",
2083 1);
2084 Py_DECREF(icls);
2085 if (retval < 0)
2086 return NULL;
2087 }
2088 else {
2089 PyErr_SetString(PyExc_TypeError,
2090 "second argument must be a class");
2091 return NULL;
2092 }
2093 }
2094 else {
2095 PyErr_SetString(PyExc_TypeError,
2096 "second argument must be a class");
2097 return NULL;
2098 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002099 return PyInt_FromLong(retval);
2100}
2101
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002102static char isinstance_doc[] =
2103"isinstance(object, class-or-type) -> Boolean\n\
2104\n\
2105Return whether an object is an instance of a class or of a subclass thereof.\n\
2106With a type as second argument, return whether that is the object's type.";
2107
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002108
2109static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002110builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002111{
2112 PyObject *derived;
2113 PyObject *cls;
2114 int retval;
2115
Guido van Rossum43713e52000-02-29 13:59:29 +00002116 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002117 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002118
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002119 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002120 retval = abstract_issubclass(
2121 derived, cls, "arguments must be classes", 1);
2122 if (retval < 0)
2123 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002124 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002125 else {
2126 /* shortcut */
2127 if (!(retval = (derived == cls)))
2128 retval = PyClass_IsSubclass(derived, cls);
2129 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002130
2131 return PyInt_FromLong(retval);
2132}
2133
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002134static char issubclass_doc[] =
2135"issubclass(C, B) -> Boolean\n\
2136\n\
2137Return whether class C is a subclass (i.e., a derived class) of class B.";
2138
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002139
Barry Warsawbd599b52000-08-03 15:45:29 +00002140static PyObject*
2141builtin_zip(PyObject *self, PyObject *args)
2142{
2143 PyObject *ret;
2144 int itemsize = PySequence_Length(args);
2145 int i, j;
2146
2147 if (itemsize < 1) {
2148 PyErr_SetString(PyExc_TypeError,
2149 "at least one sequence is required");
2150 return NULL;
2151 }
2152 /* args must be a tuple */
2153 assert(PyTuple_Check(args));
2154
2155 if ((ret = PyList_New(0)) == NULL)
2156 return NULL;
2157
2158 for (i = 0;; i++) {
2159 PyObject *next = PyTuple_New(itemsize);
2160 if (!next) {
2161 Py_DECREF(ret);
2162 return NULL;
2163 }
2164 for (j = 0; j < itemsize; j++) {
2165 PyObject *seq = PyTuple_GET_ITEM(args, j);
2166 PyObject *item = PySequence_GetItem(seq, i);
2167
2168 if (!item) {
2169 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2170 PyErr_Clear();
2171 Py_DECREF(next);
2172 return ret;
2173 }
2174 Py_DECREF(next);
2175 Py_DECREF(ret);
2176 return NULL;
2177 }
2178 PyTuple_SET_ITEM(next, j, item);
2179 }
2180 PyList_Append(ret, next);
2181 Py_DECREF(next);
2182 }
2183 /* no return */
2184}
2185
2186
2187static char zip_doc[] =
2188"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2189\n\
2190Return a list of tuples, where each tuple contains the i-th element\n\
2191from each of the argument sequences. The returned list is truncated\n\
2192in length to the length of the shortest argument sequence.";
2193
2194
Guido van Rossum79f25d91997-04-29 20:08:16 +00002195static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002196 {"__import__", builtin___import__, 1, import_doc},
2197 {"abs", builtin_abs, 1, abs_doc},
2198 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002199 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002200 {"callable", builtin_callable, 1, callable_doc},
2201 {"chr", builtin_chr, 1, chr_doc},
2202 {"cmp", builtin_cmp, 1, cmp_doc},
2203 {"coerce", builtin_coerce, 1, coerce_doc},
2204 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002205#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002206 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002207#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002208 {"delattr", builtin_delattr, 1, delattr_doc},
2209 {"dir", builtin_dir, 1, dir_doc},
2210 {"divmod", builtin_divmod, 1, divmod_doc},
2211 {"eval", builtin_eval, 1, eval_doc},
2212 {"execfile", builtin_execfile, 1, execfile_doc},
2213 {"filter", builtin_filter, 1, filter_doc},
2214 {"float", builtin_float, 1, float_doc},
2215 {"getattr", builtin_getattr, 1, getattr_doc},
2216 {"globals", builtin_globals, 1, globals_doc},
2217 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2218 {"hash", builtin_hash, 1, hash_doc},
2219 {"hex", builtin_hex, 1, hex_doc},
2220 {"id", builtin_id, 1, id_doc},
2221 {"input", builtin_input, 1, input_doc},
2222 {"intern", builtin_intern, 1, intern_doc},
2223 {"int", builtin_int, 1, int_doc},
2224 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2225 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2226 {"len", builtin_len, 1, len_doc},
2227 {"list", builtin_list, 1, list_doc},
2228 {"locals", builtin_locals, 1, locals_doc},
2229 {"long", builtin_long, 1, long_doc},
2230 {"map", builtin_map, 1, map_doc},
2231 {"max", builtin_max, 1, max_doc},
2232 {"min", builtin_min, 1, min_doc},
2233 {"oct", builtin_oct, 1, oct_doc},
2234 {"open", builtin_open, 1, open_doc},
2235 {"ord", builtin_ord, 1, ord_doc},
2236 {"pow", builtin_pow, 1, pow_doc},
2237 {"range", builtin_range, 1, range_doc},
2238 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2239 {"reduce", builtin_reduce, 1, reduce_doc},
2240 {"reload", builtin_reload, 1, reload_doc},
2241 {"repr", builtin_repr, 1, repr_doc},
2242 {"round", builtin_round, 1, round_doc},
2243 {"setattr", builtin_setattr, 1, setattr_doc},
2244 {"slice", builtin_slice, 1, slice_doc},
2245 {"str", builtin_str, 1, str_doc},
2246 {"tuple", builtin_tuple, 1, tuple_doc},
2247 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002248 {"unicode", builtin_unicode, 1, unicode_doc},
2249 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002250 {"vars", builtin_vars, 1, vars_doc},
2251 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002252 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002253 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002254};
2255
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002256static char builtin_doc[] =
2257"Built-in functions, exceptions, and other objects.\n\
2258\n\
2259Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2260
Guido van Rossum25ce5661997-08-02 03:10:38 +00002261PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002262_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002263{
Fred Drake5550de32000-06-20 04:54:19 +00002264 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002265 mod = Py_InitModule4("__builtin__", builtin_methods,
2266 builtin_doc, (PyObject *)NULL,
2267 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002268 if (mod == NULL)
2269 return NULL;
2270 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002271 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2272 return NULL;
2273 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2274 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002275 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2276 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2277 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002278 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002279 }
2280 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002281
Guido van Rossum25ce5661997-08-02 03:10:38 +00002282 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002283}
2284
Guido van Rossume77a7571993-11-03 15:01:26 +00002285/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002286
Guido van Rossum79f25d91997-04-29 20:08:16 +00002287static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002288filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002289{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002290 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002291 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002292 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002293
Guido van Rossumb7b45621995-08-04 04:07:45 +00002294 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002295 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002296 return tuple;
2297 }
2298
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002300 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002301
Guido van Rossum12d12c51993-10-26 17:58:25 +00002302 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002303 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002304 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002305
Guido van Rossum79f25d91997-04-29 20:08:16 +00002306 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002307 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 if (func == Py_None) {
2309 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002310 good = item;
2311 }
2312 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002313 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002314 if (arg == NULL)
2315 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002316 good = PyEval_CallObject(func, arg);
2317 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002318 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002319 goto Fail_1;
2320 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002321 ok = PyObject_IsTrue(good);
2322 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002323 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 Py_INCREF(item);
2325 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002326 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002327 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002328 }
2329
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002331 return NULL;
2332
Guido van Rossum12d12c51993-10-26 17:58:25 +00002333 return result;
2334
Guido van Rossum12d12c51993-10-26 17:58:25 +00002335Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002337 return NULL;
2338}
2339
2340
Guido van Rossume77a7571993-11-03 15:01:26 +00002341/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002342
Guido van Rossum79f25d91997-04-29 20:08:16 +00002343static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002344filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002345{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002347 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002348 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002349
Guido van Rossum79f25d91997-04-29 20:08:16 +00002350 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002351 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002353 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002354 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002355 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002356 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002357
Guido van Rossum12d12c51993-10-26 17:58:25 +00002358 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002360 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002361
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002362 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2363 if (item == NULL)
2364 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002365 arg = Py_BuildValue("(O)", item);
2366 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002367 if (arg == NULL)
2368 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002369 good = PyEval_CallObject(func, arg);
2370 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002371 if (good == NULL)
2372 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002373 ok = PyObject_IsTrue(good);
2374 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002375 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002376 PyString_AS_STRING((PyStringObject *)result)[j++] =
2377 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002378 }
2379
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002381 return NULL;
2382
Guido van Rossum12d12c51993-10-26 17:58:25 +00002383 return result;
2384
Guido van Rossum12d12c51993-10-26 17:58:25 +00002385Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002387 return NULL;
2388}