blob: 9a6f5e411a475535ed1aca2f2383b5e2d37f0859 [file] [log] [blame]
Andrew M. Kuchling9bcc68c2000-12-20 15:07:34 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Built-in functions */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005
6#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +00007#include "compile.h"
8#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00009
Guido van Rossum6bf62da1997-04-11 20:37:35 +000010#include <ctype.h>
11
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000012#ifdef HAVE_UNISTD_H
13#include <unistd.h>
14#endif
15
Mark Hammond26cffde42001-05-14 12:17:34 +000016/* The default encoding used by the platform file system APIs
17 Can remain NULL for all platforms that don't have such a concept
18*/
Fredrik Lundh5b979352001-06-26 17:46:10 +000019#if defined(MS_WIN32) && defined(HAVE_USABLE_WCHAR_T)
Mark Hammond26cffde42001-05-14 12:17:34 +000020const char *Py_FileSystemDefaultEncoding = "mbcs";
21#else
22const char *Py_FileSystemDefaultEncoding = NULL; /* use default */
23#endif
Mark Hammondef8b6542001-05-13 08:04:26 +000024
Guido van Rossum12d12c51993-10-26 17:58:25 +000025/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000026static PyObject *filterstring(PyObject *, PyObject *);
27static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000028
Guido van Rossum79f25d91997-04-29 20:08:16 +000029static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000030builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000031{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000033 PyObject *globals = NULL;
34 PyObject *locals = NULL;
35 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000036
Guido van Rossum79f25d91997-04-29 20:08:16 +000037 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000038 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000040 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000041}
42
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000043static char import_doc[] =
44"__import__(name, globals, locals, fromlist) -> module\n\
45\n\
46Import a module. The globals are only used to determine the context;\n\
47they are not modified. The locals are currently unused. The fromlist\n\
48should be a list of names to emulate ``from name import ...'', or an\n\
49empty list to emulate ``import name''.\n\
50When importing a module from a package, note that __import__('A.B', ...)\n\
51returns package A when fromlist is empty, but its submodule B when\n\
52fromlist is not empty.";
53
Guido van Rossum1ae940a1995-01-02 19:04:15 +000054
Guido van Rossum79f25d91997-04-29 20:08:16 +000055static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +000056builtin_abs(PyObject *self, PyObject *v)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057{
Guido van Rossum09df08a1998-05-22 00:51:39 +000058 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000059}
60
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000061static char abs_doc[] =
62"abs(number) -> number\n\
63\n\
64Return the absolute value of the argument.";
65
66
Guido van Rossum79f25d91997-04-29 20:08:16 +000067static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000068builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000069{
Guido van Rossum79f25d91997-04-29 20:08:16 +000070 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000071 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000072
Guido van Rossum79f25d91997-04-29 20:08:16 +000073 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000074 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000075 if (alist != NULL) {
76 if (!PyTuple_Check(alist)) {
77 if (!PySequence_Check(alist)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000078 PyErr_Format(PyExc_TypeError,
79 "apply() arg 2 expect sequence, found %s",
80 alist->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000081 return NULL;
82 }
83 t = PySequence_Tuple(alist);
84 if (t == NULL)
85 return NULL;
86 alist = t;
87 }
Guido van Rossum2d951851994-08-29 12:52:16 +000088 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000089 if (kwdict != NULL && !PyDict_Check(kwdict)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000090 PyErr_Format(PyExc_TypeError,
91 "apply() arg 3 expected dictionary, found %s",
92 kwdict->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000093 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000094 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +000095 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
96 finally:
97 Py_XDECREF(t);
98 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000099}
100
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000101static char apply_doc[] =
Fred Drakef1fbc622001-01-12 17:05:05 +0000102"apply(object[, args[, kwargs]]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000103\n\
Fred Drake7b912121999-12-23 14:16:55 +0000104Call a callable object with positional arguments taken from the tuple args,\n\
105and keyword arguments taken from the optional dictionary kwargs.\n\
106Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000107
108
Guido van Rossum79f25d91997-04-29 20:08:16 +0000109static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000110builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000111{
112 PyObject *ob;
113 int offset = 0;
114 int size = Py_END_OF_BUFFER;
115
116 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
117 return NULL;
118 return PyBuffer_FromObject(ob, offset, size);
119}
120
121static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000122"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000123\n\
Guido van Rossumad991772001-01-12 16:03:05 +0000124Create a new buffer object which references the given object.\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000125The buffer will reference a slice of the target object from the\n\
126start of the object (or at the specified offset). The slice will\n\
127extend to the end of the target object (or with the specified size).";
128
129
130static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000131builtin_callable(PyObject *self, PyObject *v)
Guido van Rossum2d951851994-08-29 12:52:16 +0000132{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000134}
135
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000136static char callable_doc[] =
137"callable(object) -> Boolean\n\
138\n\
139Return whether the object is callable (i.e., some kind of function).\n\
140Note that classes are callable, as are instances with a __call__() method.";
141
142
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000144builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145{
Tim Peters0e57abf2001-05-02 07:39:38 +0000146 PyObject *func, *seq, *result, *it;
147 int len; /* guess for result list size */
Tim Petersf4848da2001-05-05 00:14:56 +0000148 register int j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000149
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000152
Tim Peters0e57abf2001-05-02 07:39:38 +0000153 /* Strings and tuples return a result of the same type. */
154 if (PyString_Check(seq))
155 return filterstring(func, seq);
156 if (PyTuple_Check(seq))
157 return filtertuple(func, seq);
158
159 /* Get iterator. */
160 it = PyObject_GetIter(seq);
161 if (it == NULL)
162 return NULL;
163
164 /* Guess a result list size. */
165 len = -1; /* unknown */
166 if (PySequence_Check(seq) &&
167 seq->ob_type->tp_as_sequence->sq_length) {
168 len = PySequence_Size(seq);
169 if (len < 0)
170 PyErr_Clear();
Guido van Rossum12d12c51993-10-26 17:58:25 +0000171 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000172 if (len < 0)
173 len = 8; /* arbitrary */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000174
Tim Peters0e57abf2001-05-02 07:39:38 +0000175 /* Get a result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000177 /* Eww - can modify the list in-place. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000179 result = seq;
180 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000181 else {
Tim Peters0e57abf2001-05-02 07:39:38 +0000182 result = PyList_New(len);
183 if (result == NULL)
184 goto Fail_it;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000185 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000186
Tim Peters0e57abf2001-05-02 07:39:38 +0000187 /* Build the result list. */
Tim Petersf4848da2001-05-05 00:14:56 +0000188 j = 0;
189 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000191 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192
Tim Peters0e57abf2001-05-02 07:39:38 +0000193 item = PyIter_Next(it);
194 if (item == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +0000195 if (PyErr_Occurred())
196 goto Fail_result_it;
Tim Peters0e57abf2001-05-02 07:39:38 +0000197 break;
Guido van Rossum2d951851994-08-29 12:52:16 +0000198 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000199
Guido van Rossum79f25d91997-04-29 20:08:16 +0000200 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000201 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000202 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000203 }
204 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000205 PyObject *arg = Py_BuildValue("(O)", item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000206 if (arg == NULL) {
207 Py_DECREF(item);
208 goto Fail_result_it;
209 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 good = PyEval_CallObject(func, arg);
211 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000212 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 Py_DECREF(item);
Tim Peters0e57abf2001-05-02 07:39:38 +0000214 goto Fail_result_it;
Guido van Rossum58b68731995-01-10 17:40:55 +0000215 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 ok = PyObject_IsTrue(good);
218 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000219 if (ok) {
Tim Peters0e57abf2001-05-02 07:39:38 +0000220 if (j < len)
221 PyList_SET_ITEM(result, j, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000222 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000223 int status = PyList_Append(result, item);
Barry Warsawfa77e091999-01-28 18:49:12 +0000224 Py_DECREF(item);
225 if (status < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000226 goto Fail_result_it;
Guido van Rossum2d951851994-08-29 12:52:16 +0000227 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000228 ++j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000229 }
Tim Peters0e57abf2001-05-02 07:39:38 +0000230 else
231 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000232 }
233
Guido van Rossum12d12c51993-10-26 17:58:25 +0000234
Tim Peters0e57abf2001-05-02 07:39:38 +0000235 /* Cut back result list if len is too big. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Tim Peters0e57abf2001-05-02 07:39:38 +0000237 goto Fail_result_it;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000238
Tim Peters3c6b1482001-05-21 08:07:05 +0000239 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000240 return result;
241
Tim Peters0e57abf2001-05-02 07:39:38 +0000242Fail_result_it:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 Py_DECREF(result);
Tim Peters0e57abf2001-05-02 07:39:38 +0000244Fail_it:
245 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000246 return NULL;
247}
248
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000249static char filter_doc[] =
250"filter(function, sequence) -> list\n\
251\n\
252Return a list containing those items of sequence for which function(item)\n\
253is true. If function is None, return a list of items that are true.";
254
255
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000257builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000258{
259 long x;
260 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000261
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000263 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000264 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 PyErr_SetString(PyExc_ValueError,
266 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000267 return NULL;
268 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000269 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000271}
272
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000273static char chr_doc[] =
274"chr(i) -> character\n\
275\n\
276Return a string of one character with ordinal i; 0 <= i < 256.";
277
278
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000279#ifdef Py_USING_UNICODE
Guido van Rossum79f25d91997-04-29 20:08:16 +0000280static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000281builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000282{
283 long x;
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000284 Py_UNICODE s[2];
Guido van Rossum09095f32000-03-10 23:00:52 +0000285
286 if (!PyArg_ParseTuple(args, "l:unichr", &x))
287 return NULL;
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000288
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000289#ifdef Py_UNICODE_WIDE
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000290 if (x < 0 || x > 0x10ffff) {
Guido van Rossum09095f32000-03-10 23:00:52 +0000291 PyErr_SetString(PyExc_ValueError,
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000292 "unichr() arg not in range(0x110000) "
293 "(wide Python build)");
Guido van Rossum09095f32000-03-10 23:00:52 +0000294 return NULL;
295 }
Marc-André Lemburgae21df52001-07-26 16:29:25 +0000296#else
297 if (x < 0 || x > 0xffff) {
298 PyErr_SetString(PyExc_ValueError,
299 "unichr() arg not in range(0x10000) "
300 "(narrow Python build)");
301 return NULL;
302 }
303#endif
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000304
305 if (x <= 0xffff) {
306 /* UCS-2 character */
307 s[0] = (Py_UNICODE) x;
308 return PyUnicode_FromUnicode(s, 1);
Guido van Rossum236d8b72001-06-26 23:12:25 +0000309 }
310 else {
Fredrik Lundh8f455852001-06-27 18:59:43 +0000311#ifndef Py_UNICODE_WIDE
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000312 /* UCS-4 character. store as two surrogate characters */
313 x -= 0x10000L;
314 s[0] = 0xD800 + (Py_UNICODE) (x >> 10);
315 s[1] = 0xDC00 + (Py_UNICODE) (x & 0x03FF);
316 return PyUnicode_FromUnicode(s, 2);
Guido van Rossum236d8b72001-06-26 23:12:25 +0000317#else
318 s[0] = (Py_UNICODE)x;
319 return PyUnicode_FromUnicode(s, 1);
Martin v. Löwis0ba70cc2001-06-26 22:22:37 +0000320#endif
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000321 }
Guido van Rossum09095f32000-03-10 23:00:52 +0000322}
323
324static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000325"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000326\n\
Fredrik Lundh0dcf67e2001-06-26 20:01:56 +0000327Return a Unicode string of one character with ordinal i; 0 <= i <= 0x10ffff.";
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000328#endif
Guido van Rossum09095f32000-03-10 23:00:52 +0000329
330
331static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000332builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000333{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000335 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000336
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000338 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000339 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000340 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000341 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000342}
343
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000344static char cmp_doc[] =
345"cmp(x, y) -> integer\n\
346\n\
347Return negative if x<y, zero if x==y, positive if x>y.";
348
349
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000351builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000352{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 PyObject *v, *w;
354 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000355
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000357 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000359 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 res = Py_BuildValue("(OO)", v, w);
361 Py_DECREF(v);
362 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000363 return res;
364}
365
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000366static char coerce_doc[] =
367"coerce(x, y) -> None or (x1, y1)\n\
368\n\
369When x and y can be coerced to values of the same type, return a tuple\n\
370containing the coerced values. When they can't be coerced, return None.";
371
372
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000374builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000375{
376 char *str;
377 char *filename;
378 char *startstr;
379 int start;
Tim Peters6cd6a822001-08-17 22:11:27 +0000380 int dont_inherit = 0;
381 int supplied_flags = 0;
Tim Peters5ba58662001-07-16 02:29:45 +0000382 PyCompilerFlags cf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383
Tim Peters6cd6a822001-08-17 22:11:27 +0000384 if (!PyArg_ParseTuple(args, "sss|ii:compile", &str, &filename,
385 &startstr, &supplied_flags, &dont_inherit))
Guido van Rossum5b722181993-03-30 17:46:03 +0000386 return NULL;
Tim Peters6cd6a822001-08-17 22:11:27 +0000387
Guido van Rossum5b722181993-03-30 17:46:03 +0000388 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000389 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000390 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000391 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000392 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000393 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000394 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000395 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000396 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000397 return NULL;
398 }
Tim Peters6cd6a822001-08-17 22:11:27 +0000399
400 if (supplied_flags & ~(PyCF_MASK | PyCF_MASK_OBSOLETE)) {
401 PyErr_SetString(PyExc_ValueError,
402 "compile(): unrecognised flags");
403 return NULL;
404 }
405 /* XXX Warn if (supplied_flags & PyCF_MASK_OBSOLETE) != 0? */
406
407 cf.cf_flags = supplied_flags;
408 if (!dont_inherit) {
409 PyEval_MergeCompilerFlags(&cf);
410 }
411 return Py_CompileStringFlags(str, filename, start, &cf);
Guido van Rossum5b722181993-03-30 17:46:03 +0000412}
413
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000414static char compile_doc[] =
Tim Peters6cd6a822001-08-17 22:11:27 +0000415"compile(source, filename, mode[, flags[, dont_inherit]]) -> code object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000416\n\
417Compile the source string (a Python module, statement or expression)\n\
418into a code object that can be executed by the exec statement or eval().\n\
419The filename will be used for run-time error messages.\n\
420The mode must be 'exec' to compile a module, 'single' to compile a\n\
Tim Peters6cd6a822001-08-17 22:11:27 +0000421single (interactive) statement, or 'eval' to compile an expression.\n\
422The flags argument, if present, controls which future statements influence\n\
423the compilation of the code.\n\
424The dont_inherit argument, if non-zero, stops the compilation inheriting\n\
425the effects of any future statements in effect in the code calling\n\
426compile; if absent or zero these statements do influence the compilation,\n\
427in addition to any features explicitly specified.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000428
429
Guido van Rossum79f25d91997-04-29 20:08:16 +0000430static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000431builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000432{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000433 static char *attrlist[] = {"__members__", "__methods__", NULL};
434 PyObject *v = NULL, *l = NULL, *m = NULL;
435 PyObject *d, *x;
436 int i;
437 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000438
Guido van Rossum79f25d91997-04-29 20:08:16 +0000439 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000440 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000441 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000442 x = PyEval_GetLocals();
443 if (x == NULL)
444 goto error;
445 l = PyMapping_Keys(x);
446 if (l == NULL)
447 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000448 }
449 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000451 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000452 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000453 else {
454 l = PyMapping_Keys(d);
455 if (l == NULL)
456 PyErr_Clear();
457 Py_DECREF(d);
458 }
459 if (l == NULL) {
460 l = PyList_New(0);
461 if (l == NULL)
462 goto error;
463 }
464 for (s = attrlist; *s != NULL; s++) {
465 m = PyObject_GetAttrString(v, *s);
466 if (m == NULL) {
467 PyErr_Clear();
468 continue;
469 }
470 for (i = 0; ; i++) {
471 x = PySequence_GetItem(m, i);
472 if (x == NULL) {
473 PyErr_Clear();
474 break;
475 }
476 if (PyList_Append(l, x) != 0) {
477 Py_DECREF(x);
478 Py_DECREF(m);
479 goto error;
480 }
481 Py_DECREF(x);
482 }
483 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000484 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000485 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000486 if (PyList_Sort(l) != 0)
487 goto error;
488 return l;
489 error:
490 Py_XDECREF(l);
491 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000492}
493
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000494static char dir_doc[] =
495"dir([object]) -> list of strings\n\
496\n\
497Return an alphabetized list of names comprising (some of) the attributes\n\
498of the given object. Without an argument, the names in the current scope\n\
499are listed. With an instance argument, only the instance attributes are\n\
500returned. With a class argument, attributes of the base class are not\n\
501returned. For other types or arguments, this may list members or methods.";
502
503
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000505builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000506{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000508
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000510 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000511 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000512}
513
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000514static char divmod_doc[] =
515"divmod(x, y) -> (div, mod)\n\
516\n\
517Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
518
519
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000521builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000522{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 PyObject *cmd;
524 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 char *str;
Tim Peters9fa96be2001-08-17 23:04:59 +0000526 PyCompilerFlags cf;
Guido van Rossum590baa41993-11-30 13:40:46 +0000527
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 &PyDict_Type, &globals,
531 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 if (globals == Py_None) {
534 globals = PyEval_GetGlobals();
535 if (locals == Py_None)
536 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000537 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000539 locals = globals;
Tim Peters9fa96be2001-08-17 23:04:59 +0000540
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
542 if (PyDict_SetItemString(globals, "__builtins__",
543 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000544 return NULL;
545 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000546
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000547 if (PyCode_Check(cmd)) {
548 if (PyTuple_GET_SIZE(((PyCodeObject *)cmd)->co_freevars) > 0) {
549 PyErr_SetString(PyExc_TypeError,
550 "code object passed to eval() may not contain free variables");
551 return NULL;
552 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Jeremy Hylton15c1c4f2001-07-30 21:50:55 +0000554 }
Tim Peters9fa96be2001-08-17 23:04:59 +0000555
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000556 if (!PyString_Check(cmd) &&
557 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000559 "eval() arg 1 must be a string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000560 return NULL;
561 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000562 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000563 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 while (*str == ' ' || *str == '\t')
565 str++;
Tim Peters9fa96be2001-08-17 23:04:59 +0000566
567 cf.cf_flags = 0;
568 (void)PyEval_MergeCompilerFlags(&cf);
569 return PyRun_StringFlags(str, Py_eval_input, globals, locals, &cf);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000570}
571
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000572static char eval_doc[] =
573"eval(source[, globals[, locals]]) -> value\n\
574\n\
575Evaluate the source in the context of globals and locals.\n\
576The source may be a string representing a Python expression\n\
577or a code object as returned by compile().\n\
578The globals and locals are dictionaries, defaulting to the current\n\
579globals and locals. If only globals is given, locals defaults to it.";
580
581
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000583builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000584{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 PyObject *globals = Py_None, *locals = Py_None;
587 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000588 FILE* fp;
Tim Peters5ba58662001-07-16 02:29:45 +0000589 PyCompilerFlags cf;
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000590 int exists;
591 struct stat s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000592
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000594 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 &PyDict_Type, &globals,
596 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000597 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 if (globals == Py_None) {
599 globals = PyEval_GetGlobals();
600 if (locals == Py_None)
601 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000602 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000604 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
606 if (PyDict_SetItemString(globals, "__builtins__",
607 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000608 return NULL;
609 }
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000610
611 exists = 0;
612 /* Test for existence or directory. */
613 if (!stat(filename, &s)) {
Martin v. Löwisf9836ba2001-08-08 10:28:06 +0000614 if (S_ISDIR(s.st_mode))
Martin v. Löwis6b3a2c42001-08-08 05:30:36 +0000615 errno = EISDIR;
616 else
617 exists = 1;
618 }
619
620 if (exists) {
621 Py_BEGIN_ALLOW_THREADS
622 fp = fopen(filename, "r");
623 Py_END_ALLOW_THREADS
624
625 if (fp == NULL) {
626 exists = 0;
627 }
628 }
629
630 if (!exists) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000632 return NULL;
633 }
Tim Peters5ba58662001-07-16 02:29:45 +0000634 cf.cf_flags = 0;
635 if (PyEval_MergeCompilerFlags(&cf))
Tim Peters748b8bb2001-04-28 08:20:22 +0000636 res = PyRun_FileExFlags(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000637 locals, 1, &cf);
Tim Peters5ba58662001-07-16 02:29:45 +0000638 else
Tim Peters748b8bb2001-04-28 08:20:22 +0000639 res = PyRun_FileEx(fp, filename, Py_file_input, globals,
Jeremy Hyltonbc320242001-03-22 02:47:58 +0000640 locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000642}
643
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000644static char execfile_doc[] =
645"execfile(filename[, globals[, locals]])\n\
646\n\
647Read and execute a Python script from a file.\n\
648The globals and locals are dictionaries, defaulting to the current\n\
649globals and locals. If only globals is given, locals defaults to it.";
650
651
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000653builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000654{
Guido van Rossum950ff291998-06-29 13:38:57 +0000655 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000657
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000658 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000659 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000660#ifdef Py_USING_UNICODE
Jeremy Hylton0eb11152001-07-30 22:39:31 +0000661 if (PyUnicode_Check(name)) {
662 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
663 if (name == NULL)
664 return NULL;
665 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000666#endif
Jeremy Hylton0eb11152001-07-30 22:39:31 +0000667
668 if (!PyString_Check(name)) {
669 PyErr_SetString(PyExc_TypeError,
670 "attribute name must be string");
671 return NULL;
672 }
Guido van Rossum950ff291998-06-29 13:38:57 +0000673 result = PyObject_GetAttr(v, name);
674 if (result == NULL && dflt != NULL) {
675 PyErr_Clear();
676 Py_INCREF(dflt);
677 result = dflt;
678 }
679 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000680}
681
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000682static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000683"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000684\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000685Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
686When a default argument is given, it is returned when the attribute doesn't\n\
687exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000688
689
Guido van Rossum79f25d91997-04-29 20:08:16 +0000690static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000691builtin_globals(PyObject *self)
Guido van Rossum872537c1995-07-07 22:43:42 +0000692{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000694
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 d = PyEval_GetGlobals();
696 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000697 return d;
698}
699
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000700static char globals_doc[] =
701"globals() -> dictionary\n\
702\n\
703Return the dictionary containing the current scope's global variables.";
704
705
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000708{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 PyObject *v;
710 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000711
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000712 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000713 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000714#ifdef Py_USING_UNICODE
Jeremy Hylton302b54a2001-07-30 22:45:19 +0000715 if (PyUnicode_Check(name)) {
716 name = _PyUnicode_AsDefaultEncodedString(name, NULL);
717 if (name == NULL)
718 return NULL;
719 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +0000720#endif
Jeremy Hylton302b54a2001-07-30 22:45:19 +0000721
722 if (!PyString_Check(name)) {
723 PyErr_SetString(PyExc_TypeError,
724 "attribute name must be string");
725 return NULL;
726 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000727 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000728 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000730 Py_INCREF(Py_False);
731 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000732 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000733 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000734 Py_INCREF(Py_True);
735 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000736}
737
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000738static char hasattr_doc[] =
739"hasattr(object, name) -> Boolean\n\
740\n\
741Return whether the object has an attribute with the given name.\n\
742(This is done by calling getattr(object, name) and catching exceptions.)";
743
744
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000746builtin_id(PyObject *self, PyObject *v)
Guido van Rossum5b722181993-03-30 17:46:03 +0000747{
Guido van Rossum106f2da2000-06-28 21:12:25 +0000748 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000749}
750
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000751static char id_doc[] =
752"id(object) -> integer\n\
753\n\
754Return the identity of an object. This is guaranteed to be unique among\n\
755simultaneously existing objects. (Hint: it's the object's memory address.)";
756
757
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000759builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000760{
761 typedef struct {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000762 PyObject *it; /* the iterator object */
763 int saw_StopIteration; /* bool: did the iterator end? */
Guido van Rossum12d12c51993-10-26 17:58:25 +0000764 } sequence;
765
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000767 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000769 register int i, j;
770
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 PyErr_SetString(PyExc_TypeError,
774 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000775 return NULL;
776 }
777
Guido van Rossum79f25d91997-04-29 20:08:16 +0000778 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000779 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000780
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000781 if (func == Py_None && n == 1) {
782 /* map(None, S) is the same as list(S). */
783 return PySequence_List(PyTuple_GetItem(args, 1));
784 }
785
Tim Peters4e9afdc2001-05-03 23:54:49 +0000786 /* Get space for sequence descriptors. Must NULL out the iterator
787 * pointers so that jumping to Fail_2 later doesn't see trash.
788 */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
790 PyErr_NoMemory();
Tim Peters4e9afdc2001-05-03 23:54:49 +0000791 return NULL;
792 }
793 for (i = 0; i < n; ++i) {
794 seqs[i].it = (PyObject*)NULL;
795 seqs[i].saw_StopIteration = 0;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000796 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000797
Tim Peters4e9afdc2001-05-03 23:54:49 +0000798 /* Do a first pass to obtain iterators for the arguments, and set len
799 * to the largest of their lengths.
Tim Peters748b8bb2001-04-28 08:20:22 +0000800 */
Tim Peters4e9afdc2001-05-03 23:54:49 +0000801 len = 0;
802 for (i = 0, sqp = seqs; i < n; ++i, ++sqp) {
803 PyObject *curseq;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000804 int curlen;
Guido van Rossumad991772001-01-12 16:03:05 +0000805
Tim Peters4e9afdc2001-05-03 23:54:49 +0000806 /* Get iterator. */
807 curseq = PyTuple_GetItem(args, i+1);
808 sqp->it = PyObject_GetIter(curseq);
809 if (sqp->it == NULL) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000810 static char errmsg[] =
Tim Peters4e9afdc2001-05-03 23:54:49 +0000811 "argument %d to map() must support iteration";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000812 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000813 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000815 goto Fail_2;
816 }
817
Tim Peters4e9afdc2001-05-03 23:54:49 +0000818 /* Update len. */
819 curlen = -1; /* unknown */
820 if (PySequence_Check(curseq) &&
821 curseq->ob_type->tp_as_sequence->sq_length) {
822 curlen = PySequence_Size(curseq);
823 if (curlen < 0)
824 PyErr_Clear();
825 }
Tim Peters748b8bb2001-04-28 08:20:22 +0000826 if (curlen < 0)
Tim Peters4e9afdc2001-05-03 23:54:49 +0000827 curlen = 8; /* arbitrary */
Tim Peters6d6c1a32001-08-02 04:15:00 +0000828 if (curlen > len)
829 len = curlen;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000830 }
831
Tim Peters4e9afdc2001-05-03 23:54:49 +0000832 /* Get space for the result list. */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000834 goto Fail_2;
835
Tim Peters4e9afdc2001-05-03 23:54:49 +0000836 /* Iterate over the sequences until all have stopped. */
Guido van Rossum2d951851994-08-29 12:52:16 +0000837 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 PyObject *alist, *item=NULL, *value;
Tim Peters4e9afdc2001-05-03 23:54:49 +0000839 int numactive = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000840
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000842 alist = NULL;
Tim Peters4e9afdc2001-05-03 23:54:49 +0000843 else if ((alist = PyTuple_New(n)) == NULL)
844 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000845
846 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000847 if (sqp->saw_StopIteration) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 Py_INCREF(Py_None);
849 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000850 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000851 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000852 item = PyIter_Next(sqp->it);
853 if (item)
854 ++numactive;
855 else {
Tim Peters4e9afdc2001-05-03 23:54:49 +0000856 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +0000857 Py_XDECREF(alist);
858 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000859 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000860 Py_INCREF(Py_None);
861 item = Py_None;
862 sqp->saw_StopIteration = 1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000863 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000864 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000865 if (alist)
866 PyTuple_SET_ITEM(alist, j, item);
867 else
Guido van Rossum2d951851994-08-29 12:52:16 +0000868 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000869 }
870
Guido van Rossum32120311995-07-10 13:52:21 +0000871 if (!alist)
872 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000873
Tim Peters4e9afdc2001-05-03 23:54:49 +0000874 if (numactive == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000876 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000877 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000878
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000880 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000881 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 value = PyEval_CallObject(func, alist);
883 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000884 if (value == NULL)
885 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000886 }
887 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +0000888 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +0000889 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +0000890 if (status < 0)
891 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000892 }
Tim Peters4e9afdc2001-05-03 23:54:49 +0000893 else if (PyList_SetItem(result, i, value) < 0)
894 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000895 }
896
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000897 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
898 goto Fail_1;
899
Tim Peters4e9afdc2001-05-03 23:54:49 +0000900 goto Succeed;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000901
Guido van Rossum12d12c51993-10-26 17:58:25 +0000902Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000904Fail_2:
Tim Peters4e9afdc2001-05-03 23:54:49 +0000905 result = NULL;
906Succeed:
907 assert(seqs);
908 for (i = 0; i < n; ++i)
909 Py_XDECREF(seqs[i].it);
910 PyMem_DEL(seqs);
911 return result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000912}
913
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000914static char map_doc[] =
915"map(function, sequence[, sequence, ...]) -> list\n\
916\n\
917Return a list of the results of applying the function to the items of\n\
918the argument sequence(s). If more than one sequence is given, the\n\
919function is called with an argument list consisting of the corresponding\n\
920item of each sequence, substituting None for missing values when not all\n\
921sequences have the same length. If the function is None, return a list of\n\
922the items of the sequence (or a list of tuples if more than one sequence).";
923
924
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000926builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000927{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 PyObject *v;
929 PyObject *name;
930 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000932 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000933 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000935 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 Py_INCREF(Py_None);
937 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000938}
939
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000940static char setattr_doc[] =
941"setattr(object, name, value)\n\
942\n\
943Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
944``x.y = v''.";
945
946
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000948builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000949{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 PyObject *v;
951 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000952
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000953 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000954 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000956 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 Py_INCREF(Py_None);
958 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000959}
960
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000961static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +0000962"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000963\n\
964Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
965``del x.y''.";
966
967
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000969builtin_hash(PyObject *self, PyObject *v)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000970{
Guido van Rossum9bfef441993-03-29 10:43:31 +0000971 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000972
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000974 if (x == -1)
975 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000977}
978
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000979static char hash_doc[] =
980"hash(object) -> integer\n\
981\n\
982Return a hash value for the object. Two objects with the same value have\n\
983the same hash value. The reverse is not necessarily true, but likely.";
984
985
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +0000987builtin_hex(PyObject *self, PyObject *v)
Guido van Rossum006bcd41991-10-24 14:54:44 +0000988{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000990
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000991 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000992 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000993 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000994 "hex() argument can't be converted to hex");
995 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000996 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000997 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000998}
999
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001000static char hex_doc[] =
1001"hex(number) -> string\n\
1002\n\
1003Return the hexadecimal representation of an integer or long integer.";
1004
1005
Tim Petersdbd9ba62000-07-09 03:09:57 +00001006static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001007
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001009builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001010{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001012 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 PyObject *res;
1014 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001015
1016 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001017 if (line == NULL)
1018 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001020 return NULL;
1021 while (*str == ' ' || *str == '\t')
1022 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 globals = PyEval_GetGlobals();
1024 locals = PyEval_GetLocals();
1025 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1026 if (PyDict_SetItemString(globals, "__builtins__",
1027 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001028 return NULL;
1029 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001030 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001033}
1034
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001035static char input_doc[] =
1036"input([prompt]) -> value\n\
1037\n\
1038Equivalent to eval(raw_input(prompt)).";
1039
1040
Guido van Rossume8811f81997-02-14 15:48:05 +00001041static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001042builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001043{
1044 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001045 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001046 return NULL;
1047 Py_INCREF(s);
1048 PyString_InternInPlace(&s);
1049 return s;
1050}
1051
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001052static char intern_doc[] =
1053"intern(string) -> string\n\
1054\n\
1055``Intern'' the given string. This enters the string in the (global)\n\
1056table of interned strings whose purpose is to speed up dictionary lookups.\n\
1057Return the string itself or the previously interned string object with the\n\
1058same value.";
1059
1060
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061static PyObject *
Guido van Rossum59d1d2b2001-04-20 19:13:02 +00001062builtin_iter(PyObject *self, PyObject *args)
1063{
1064 PyObject *v, *w = NULL;
1065
1066 if (!PyArg_ParseTuple(args, "O|O:iter", &v, &w))
1067 return NULL;
1068 if (w == NULL)
1069 return PyObject_GetIter(v);
1070 if (!PyCallable_Check(v)) {
1071 PyErr_SetString(PyExc_TypeError,
1072 "iter(v, w): v must be callable");
1073 return NULL;
1074 }
1075 return PyCallIter_New(v, w);
1076}
1077
1078static char iter_doc[] =
1079"iter(collection) -> iterator\n\
1080iter(callable, sentinel) -> iterator\n\
1081\n\
1082Get an iterator from an object. In the first form, the argument must\n\
1083supply its own iterator, or be a sequence.\n\
1084In the second form, the callable is called until it returns the sentinel.";
1085
1086
1087static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001088builtin_len(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001089{
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001090 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001091
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001092 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001093 if (res < 0 && PyErr_Occurred())
1094 return NULL;
1095 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001096}
1097
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001098static char len_doc[] =
1099"len(object) -> integer\n\
1100\n\
1101Return the number of items of a sequence or mapping.";
1102
1103
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001105builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001106{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001107 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001108
Guido van Rossum09df08a1998-05-22 00:51:39 +00001109 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001110
Guido van Rossum09df08a1998-05-22 00:51:39 +00001111 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1112 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001113
Guido van Rossum09df08a1998-05-22 00:51:39 +00001114 /* This swapping of stop and start is to maintain similarity with
1115 range(). */
1116 if (stop == NULL) {
1117 stop = start;
1118 start = NULL;
1119 }
1120 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001121}
1122
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001123static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001124"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001125\n\
1126Create a slice object. This is used for slicing by the Numeric extensions.";
1127
1128
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001130builtin_locals(PyObject *self)
Guido van Rossum872537c1995-07-07 22:43:42 +00001131{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001133
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 d = PyEval_GetLocals();
1135 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001136 return d;
1137}
1138
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001139static char locals_doc[] =
1140"locals() -> dictionary\n\
1141\n\
1142Return the dictionary containing the current scope's local variables.";
1143
1144
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145static PyObject *
Guido van Rossum53451b32001-01-17 15:47:24 +00001146min_max(PyObject *args, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001147{
Tim Petersc3074532001-05-03 07:00:32 +00001148 PyObject *v, *w, *x, *it;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001151 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001154
1155 it = PyObject_GetIter(v);
1156 if (it == NULL)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157 return NULL;
Tim Petersc3074532001-05-03 07:00:32 +00001158
1159 w = NULL; /* the result */
Tim Petersf4848da2001-05-05 00:14:56 +00001160 for (;;) {
Tim Petersc3074532001-05-03 07:00:32 +00001161 x = PyIter_Next(it);
Guido van Rossum2d951851994-08-29 12:52:16 +00001162 if (x == NULL) {
Tim Petersc3074532001-05-03 07:00:32 +00001163 if (PyErr_Occurred()) {
Tim Petersf4848da2001-05-05 00:14:56 +00001164 Py_XDECREF(w);
1165 Py_DECREF(it);
1166 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001167 }
Tim Petersc3074532001-05-03 07:00:32 +00001168 break;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001169 }
Tim Petersc3074532001-05-03 07:00:32 +00001170
Guido van Rossum2d951851994-08-29 12:52:16 +00001171 if (w == NULL)
1172 w = x;
1173 else {
Guido van Rossum53451b32001-01-17 15:47:24 +00001174 int cmp = PyObject_RichCompareBool(x, w, op);
1175 if (cmp > 0) {
1176 Py_DECREF(w);
1177 w = x;
1178 }
1179 else if (cmp < 0) {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001180 Py_DECREF(x);
Tim Petersc3074532001-05-03 07:00:32 +00001181 Py_DECREF(w);
1182 Py_DECREF(it);
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001183 return NULL;
1184 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001185 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001187 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001188 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001189 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001191 "min() or max() arg is an empty sequence");
Tim Petersc3074532001-05-03 07:00:32 +00001192 Py_DECREF(it);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001193 return w;
1194}
1195
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001197builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001198{
Guido van Rossum53451b32001-01-17 15:47:24 +00001199 return min_max(v, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001200}
1201
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001202static char min_doc[] =
1203"min(sequence) -> value\n\
1204min(a, b, c, ...) -> value\n\
1205\n\
1206With a single sequence argument, return its smallest item.\n\
1207With two or more arguments, return the smallest argument.";
1208
1209
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001211builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212{
Guido van Rossum53451b32001-01-17 15:47:24 +00001213 return min_max(v, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001214}
1215
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001216static char max_doc[] =
1217"max(sequence) -> value\n\
1218max(a, b, c, ...) -> value\n\
1219\n\
1220With a single sequence argument, return its largest item.\n\
1221With two or more arguments, return the largest argument.";
1222
1223
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001225builtin_oct(PyObject *self, PyObject *v)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001226{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001229 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1230 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001231 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001232 "oct() argument can't be converted to oct");
1233 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001234 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001235 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001236}
1237
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001238static char oct_doc[] =
1239"oct(number) -> string\n\
1240\n\
1241Return the octal representation of an integer or long integer.";
1242
1243
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001245builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001246{
Mark Hammondef8b6542001-05-13 08:04:26 +00001247 char *name = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001248 char *mode = "r";
1249 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001251
Mark Hammondef8b6542001-05-13 08:04:26 +00001252 if (!PyArg_ParseTuple(args, "et|si:open", Py_FileSystemDefaultEncoding,
1253 &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001254 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 f = PyFile_FromString(name, mode);
Mark Hammondef8b6542001-05-13 08:04:26 +00001256 PyMem_Free(name); /* free the encoded string */
Guido van Rossum2d951851994-08-29 12:52:16 +00001257 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001259 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001260}
1261
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001262static char open_doc[] =
1263"open(filename[, mode[, buffering]]) -> file object\n\
1264\n\
1265Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1266writing or appending. The file will be created if it doesn't exist\n\
1267when opened for writing or appending; it will be truncated when\n\
1268opened for writing. Add a 'b' to the mode for binary files.\n\
1269Add a '+' to the mode to allow simultaneous reading and writing.\n\
1270If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1271buffered, and larger numbers specify the buffer size.";
1272
1273
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001275builtin_ord(PyObject *self, PyObject* obj)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001276{
Guido van Rossum09095f32000-03-10 23:00:52 +00001277 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001278 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001279
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001280 if (PyString_Check(obj)) {
1281 size = PyString_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001282 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001283 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001284 return PyInt_FromLong(ord);
1285 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001286#ifdef Py_USING_UNICODE
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001287 } else if (PyUnicode_Check(obj)) {
1288 size = PyUnicode_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001289 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001290 ord = (long)*PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001291 return PyInt_FromLong(ord);
1292 }
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001293#endif
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001294 } else {
1295 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001296 "ord() expected string of length 1, but " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001297 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001298 return NULL;
1299 }
1300
Guido van Rossumad991772001-01-12 16:03:05 +00001301 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001302 "ord() expected a character, "
1303 "but string of length %d found",
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001304 size);
1305 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001306}
1307
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001308static char ord_doc[] =
1309"ord(c) -> integer\n\
1310\n\
Guido van Rossumad991772001-01-12 16:03:05 +00001311Return the integer ordinal of a one-character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001312
1313
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001316{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001317 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001320 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001321 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001322}
1323
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001324static char pow_doc[] =
1325"pow(x, y[, z]) -> number\n\
1326\n\
1327With two arguments, equivalent to x**y. With three arguments,\n\
1328equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1329
1330
Guido van Rossum124eff01999-02-23 16:11:01 +00001331/* Return number of items in range/xrange (lo, hi, step). step > 0
1332 * required. Return a value < 0 if & only if the true value is too
1333 * large to fit in a signed long.
1334 */
1335static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001336get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001337{
1338 /* -------------------------------------------------------------
1339 If lo >= hi, the range is empty.
1340 Else if n values are in the range, the last one is
1341 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1342 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1343 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1344 the RHS is non-negative and so truncation is the same as the
1345 floor. Letting M be the largest positive long, the worst case
1346 for the RHS numerator is hi=M, lo=-M-1, and then
1347 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1348 precision to compute the RHS exactly.
1349 ---------------------------------------------------------------*/
1350 long n = 0;
1351 if (lo < hi) {
1352 unsigned long uhi = (unsigned long)hi;
1353 unsigned long ulo = (unsigned long)lo;
1354 unsigned long diff = uhi - ulo - 1;
1355 n = (long)(diff / (unsigned long)step + 1);
1356 }
1357 return n;
1358}
1359
Guido van Rossum79f25d91997-04-29 20:08:16 +00001360static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001361builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001362{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001363 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001364 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001365 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001366
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 if (PyTuple_Size(args) <= 1) {
1370 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001371 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372 &ihigh))
1373 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374 }
1375 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001377 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001378 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001379 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001380 }
1381 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001382 PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383 return NULL;
1384 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001385 if (istep > 0)
1386 bign = get_len_of_range(ilow, ihigh, istep);
1387 else
1388 bign = get_len_of_range(ihigh, ilow, -istep);
1389 n = (int)bign;
1390 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001391 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001392 "range() result has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001393 return NULL;
1394 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396 if (v == NULL)
1397 return NULL;
1398 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001400 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001402 return NULL;
1403 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001404 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001405 ilow += istep;
1406 }
1407 return v;
1408}
1409
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001410static char range_doc[] =
1411"range([start,] stop[, step]) -> list of integers\n\
1412\n\
1413Return a list containing an arithmetic progression of integers.\n\
1414range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1415When step is given, it specifies the increment (or decrement).\n\
1416For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1417These are exactly the valid indices for a list of 4 elements.";
1418
1419
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001421builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001422{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001423 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001424 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001425
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426 if (PyTuple_Size(args) <= 1) {
1427 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001428 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001429 &ihigh))
1430 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001431 }
1432 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001433 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001434 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001435 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001436 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001437 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001438 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001439 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001440 return NULL;
1441 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001442 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001443 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001444 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001445 n = get_len_of_range(ihigh, ilow, -istep);
1446 if (n < 0) {
1447 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001448 "xrange() result has too many items");
Guido van Rossum124eff01999-02-23 16:11:01 +00001449 return NULL;
1450 }
Thomas Woutersefafcea2001-07-09 12:30:54 +00001451 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001452}
1453
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001454static char xrange_doc[] =
1455"xrange([start,] stop[, step]) -> xrange object\n\
1456\n\
1457Like range(), but instead of returning a list, returns an object that\n\
1458generates the numbers in the range on demand. This is slightly slower\n\
1459than range() but more memory efficient.";
1460
1461
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001463builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001464{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 PyObject *v = NULL;
1466 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001469 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1471 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001472 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001474 char *prompt;
1475 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001477 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001479 if (po == NULL)
1480 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001482 if (prompt == NULL)
1483 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001484 }
1485 else {
1486 po = NULL;
1487 prompt = "";
1488 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 s = PyOS_Readline(prompt);
1490 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001491 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001493 return NULL;
1494 }
1495 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001497 result = NULL;
1498 }
1499 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001500 size_t len = strlen(s);
1501 if (len > INT_MAX) {
1502 PyErr_SetString(PyExc_OverflowError, "input too long");
1503 result = NULL;
1504 }
1505 else {
1506 result = PyString_FromStringAndSize(s, (int)(len-1));
1507 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001508 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001509 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001510 return result;
1511 }
Guido van Rossum90933611991-06-07 16:10:43 +00001512 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001514 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001515 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001516 return NULL;
1517 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001518 if (Py_FlushLine() != 0 ||
1519 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001520 return NULL;
1521 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001525 return NULL;
1526 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001527 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001528}
1529
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001530static char raw_input_doc[] =
1531"raw_input([prompt]) -> string\n\
1532\n\
1533Read a string from standard input. The trailing newline is stripped.\n\
1534If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1535On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1536is printed without a trailing newline before reading.";
1537
1538
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001540builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001541{
Tim Peters15d81ef2001-05-04 04:39:21 +00001542 PyObject *seq, *func, *result = NULL, *it;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001543
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001545 return NULL;
1546 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001548
Tim Peters15d81ef2001-05-04 04:39:21 +00001549 it = PyObject_GetIter(seq);
1550 if (it == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 PyErr_SetString(PyExc_TypeError,
Tim Peters15d81ef2001-05-04 04:39:21 +00001552 "reduce() arg 2 must support iteration");
1553 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001554 return NULL;
1555 }
1556
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001558 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001559
Tim Peters15d81ef2001-05-04 04:39:21 +00001560 for (;;) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001562
1563 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 Py_DECREF(args);
1565 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001566 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001567 }
1568
Tim Peters15d81ef2001-05-04 04:39:21 +00001569 op2 = PyIter_Next(it);
1570 if (op2 == NULL) {
Tim Petersf4848da2001-05-05 00:14:56 +00001571 if (PyErr_Occurred())
1572 goto Fail;
1573 break;
Guido van Rossum2d951851994-08-29 12:52:16 +00001574 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001575
Guido van Rossum2d951851994-08-29 12:52:16 +00001576 if (result == NULL)
1577 result = op2;
1578 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyTuple_SetItem(args, 0, result);
1580 PyTuple_SetItem(args, 1, op2);
1581 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001582 goto Fail;
1583 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001584 }
1585
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001587
Guido van Rossum2d951851994-08-29 12:52:16 +00001588 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001590 "reduce() of empty sequence with no initial value");
Guido van Rossum2d951851994-08-29 12:52:16 +00001591
Tim Peters15d81ef2001-05-04 04:39:21 +00001592 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001593 return result;
1594
Guido van Rossum2d951851994-08-29 12:52:16 +00001595Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 Py_XDECREF(args);
1597 Py_XDECREF(result);
Tim Peters15d81ef2001-05-04 04:39:21 +00001598 Py_DECREF(it);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001599 return NULL;
1600}
1601
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001602static char reduce_doc[] =
1603"reduce(function, sequence[, initial]) -> value\n\
1604\n\
1605Apply a function of two arguments cumulatively to the items of a sequence,\n\
1606from left to right, so as to reduce the sequence to a single value.\n\
1607For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1608((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1609of the sequence in the calculation, and serves as a default when the\n\
1610sequence is empty.";
1611
1612
Guido van Rossum79f25d91997-04-29 20:08:16 +00001613static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001614builtin_reload(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001615{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617}
1618
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001619static char reload_doc[] =
1620"reload(module) -> module\n\
1621\n\
1622Reload the module. The module must have been successfully imported before.";
1623
1624
Guido van Rossum79f25d91997-04-29 20:08:16 +00001625static PyObject *
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001626builtin_repr(PyObject *self, PyObject *v)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001627{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001628 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001629}
1630
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001631static char repr_doc[] =
1632"repr(object) -> string\n\
1633\n\
1634Return the canonical string representation of the object.\n\
1635For most object types, eval(repr(object)) == object.";
1636
1637
Guido van Rossum79f25d91997-04-29 20:08:16 +00001638static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001639builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001640{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001641 double x;
1642 double f;
1643 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001644 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001645
Guido van Rossum79f25d91997-04-29 20:08:16 +00001646 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001647 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001648 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001649 i = abs(ndigits);
1650 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001651 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001652 if (ndigits < 0)
1653 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001654 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001655 x *= f;
1656 if (x >= 0.0)
1657 x = floor(x + 0.5);
1658 else
1659 x = ceil(x - 0.5);
1660 if (ndigits < 0)
1661 x *= f;
1662 else
1663 x /= f;
1664 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001665}
1666
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001667static char round_doc[] =
1668"round(number[, ndigits]) -> floating point number\n\
1669\n\
1670Round a number to a given precision in decimal digits (default 0 digits).\n\
1671This always returns a floating point number. Precision may be negative.";
1672
1673
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001675builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001676{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001677 PyObject *v = NULL;
1678 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001679
Guido van Rossum79f25d91997-04-29 20:08:16 +00001680 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001682 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001683 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001684 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685 if (!PyErr_Occurred())
1686 PyErr_SetString(PyExc_SystemError,
1687 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001688 }
1689 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001691 }
1692 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001694 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001695 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001696 "vars() argument must have __dict__ attribute");
1697 return NULL;
1698 }
1699 }
1700 return d;
1701}
1702
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001703static char vars_doc[] =
1704"vars([object]) -> dictionary\n\
1705\n\
1706Without arguments, equivalent to locals().\n\
1707With an argument, equivalent to object.__dict__.";
1708
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001709static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001710builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001711{
1712 PyObject *inst;
1713 PyObject *cls;
Guido van Rossum823649d2001-03-21 18:40:58 +00001714 int retval;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001715
Guido van Rossum43713e52000-02-29 13:59:29 +00001716 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001717 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001718
Guido van Rossum823649d2001-03-21 18:40:58 +00001719 retval = PyObject_IsInstance(inst, cls);
1720 if (retval < 0)
Guido van Rossumad991772001-01-12 16:03:05 +00001721 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001722 return PyInt_FromLong(retval);
1723}
1724
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001725static char isinstance_doc[] =
1726"isinstance(object, class-or-type) -> Boolean\n\
1727\n\
1728Return whether an object is an instance of a class or of a subclass thereof.\n\
1729With a type as second argument, return whether that is the object's type.";
1730
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001731
1732static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001733builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001734{
1735 PyObject *derived;
1736 PyObject *cls;
1737 int retval;
1738
Guido van Rossum43713e52000-02-29 13:59:29 +00001739 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001740 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00001741
Guido van Rossum823649d2001-03-21 18:40:58 +00001742 retval = PyObject_IsSubclass(derived, cls);
1743 if (retval < 0)
1744 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001745 return PyInt_FromLong(retval);
1746}
1747
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001748static char issubclass_doc[] =
1749"issubclass(C, B) -> Boolean\n\
1750\n\
1751Return whether class C is a subclass (i.e., a derived class) of class B.";
1752
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001753
Barry Warsawbd599b52000-08-03 15:45:29 +00001754static PyObject*
1755builtin_zip(PyObject *self, PyObject *args)
1756{
1757 PyObject *ret;
1758 int itemsize = PySequence_Length(args);
Tim Peters8572b4f2001-05-06 01:05:02 +00001759 int i;
1760 PyObject *itlist; /* tuple of iterators */
Barry Warsawbd599b52000-08-03 15:45:29 +00001761
1762 if (itemsize < 1) {
1763 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001764 "zip() requires at least one sequence");
Barry Warsawbd599b52000-08-03 15:45:29 +00001765 return NULL;
1766 }
1767 /* args must be a tuple */
1768 assert(PyTuple_Check(args));
1769
Tim Peters8572b4f2001-05-06 01:05:02 +00001770 /* allocate result list */
Barry Warsawbd599b52000-08-03 15:45:29 +00001771 if ((ret = PyList_New(0)) == NULL)
1772 return NULL;
1773
Tim Peters8572b4f2001-05-06 01:05:02 +00001774 /* obtain iterators */
1775 itlist = PyTuple_New(itemsize);
1776 if (itlist == NULL)
1777 goto Fail_ret;
1778 for (i = 0; i < itemsize; ++i) {
1779 PyObject *item = PyTuple_GET_ITEM(args, i);
1780 PyObject *it = PyObject_GetIter(item);
1781 if (it == NULL) {
1782 if (PyErr_ExceptionMatches(PyExc_TypeError))
1783 PyErr_Format(PyExc_TypeError,
1784 "zip argument #%d must support iteration",
1785 i+1);
1786 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00001787 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001788 PyTuple_SET_ITEM(itlist, i, it);
1789 }
Barry Warsawbd599b52000-08-03 15:45:29 +00001790
Tim Peters8572b4f2001-05-06 01:05:02 +00001791 /* build result into ret list */
1792 for (;;) {
1793 int status;
1794 PyObject *next = PyTuple_New(itemsize);
1795 if (!next)
1796 goto Fail_ret_itlist;
1797
1798 for (i = 0; i < itemsize; i++) {
1799 PyObject *it = PyTuple_GET_ITEM(itlist, i);
1800 PyObject *item = PyIter_Next(it);
Barry Warsawbd599b52000-08-03 15:45:29 +00001801 if (!item) {
Tim Peters8572b4f2001-05-06 01:05:02 +00001802 if (PyErr_Occurred()) {
1803 Py_DECREF(ret);
1804 ret = NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00001805 }
1806 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00001807 Py_DECREF(itlist);
1808 return ret;
Barry Warsawbd599b52000-08-03 15:45:29 +00001809 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001810 PyTuple_SET_ITEM(next, i, item);
Barry Warsawbd599b52000-08-03 15:45:29 +00001811 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001812
1813 status = PyList_Append(ret, next);
Barry Warsawbd599b52000-08-03 15:45:29 +00001814 Py_DECREF(next);
Tim Peters8572b4f2001-05-06 01:05:02 +00001815 if (status < 0)
1816 goto Fail_ret_itlist;
Barry Warsawbd599b52000-08-03 15:45:29 +00001817 }
Tim Peters8572b4f2001-05-06 01:05:02 +00001818
1819Fail_ret_itlist:
1820 Py_DECREF(itlist);
1821Fail_ret:
1822 Py_DECREF(ret);
1823 return NULL;
Barry Warsawbd599b52000-08-03 15:45:29 +00001824}
1825
1826
1827static char zip_doc[] =
1828"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
1829\n\
1830Return a list of tuples, where each tuple contains the i-th element\n\
1831from each of the argument sequences. The returned list is truncated\n\
1832in length to the length of the shortest argument sequence.";
1833
1834
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835static PyMethodDef builtin_methods[] = {
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001836 {"__import__", builtin___import__, METH_VARARGS, import_doc},
1837 {"abs", builtin_abs, METH_O, abs_doc},
1838 {"apply", builtin_apply, METH_VARARGS, apply_doc},
1839 {"buffer", builtin_buffer, METH_VARARGS, buffer_doc},
1840 {"callable", builtin_callable, METH_O, callable_doc},
1841 {"chr", builtin_chr, METH_VARARGS, chr_doc},
1842 {"cmp", builtin_cmp, METH_VARARGS, cmp_doc},
1843 {"coerce", builtin_coerce, METH_VARARGS, coerce_doc},
1844 {"compile", builtin_compile, METH_VARARGS, compile_doc},
1845 {"delattr", builtin_delattr, METH_VARARGS, delattr_doc},
1846 {"dir", builtin_dir, METH_VARARGS, dir_doc},
1847 {"divmod", builtin_divmod, METH_VARARGS, divmod_doc},
1848 {"eval", builtin_eval, METH_VARARGS, eval_doc},
1849 {"execfile", builtin_execfile, METH_VARARGS, execfile_doc},
1850 {"filter", builtin_filter, METH_VARARGS, filter_doc},
1851 {"getattr", builtin_getattr, METH_VARARGS, getattr_doc},
1852 {"globals", (PyCFunction)builtin_globals, METH_NOARGS, globals_doc},
1853 {"hasattr", builtin_hasattr, METH_VARARGS, hasattr_doc},
1854 {"hash", builtin_hash, METH_O, hash_doc},
1855 {"hex", builtin_hex, METH_O, hex_doc},
1856 {"id", builtin_id, METH_O, id_doc},
1857 {"input", builtin_input, METH_VARARGS, input_doc},
1858 {"intern", builtin_intern, METH_VARARGS, intern_doc},
1859 {"isinstance", builtin_isinstance, METH_VARARGS, isinstance_doc},
1860 {"issubclass", builtin_issubclass, METH_VARARGS, issubclass_doc},
1861 {"iter", builtin_iter, METH_VARARGS, iter_doc},
1862 {"len", builtin_len, METH_O, len_doc},
1863 {"locals", (PyCFunction)builtin_locals, METH_NOARGS, locals_doc},
1864 {"map", builtin_map, METH_VARARGS, map_doc},
1865 {"max", builtin_max, METH_VARARGS, max_doc},
1866 {"min", builtin_min, METH_VARARGS, min_doc},
1867 {"oct", builtin_oct, METH_O, oct_doc},
1868 {"open", builtin_open, METH_VARARGS, open_doc},
1869 {"ord", builtin_ord, METH_O, ord_doc},
1870 {"pow", builtin_pow, METH_VARARGS, pow_doc},
1871 {"range", builtin_range, METH_VARARGS, range_doc},
1872 {"raw_input", builtin_raw_input, METH_VARARGS, raw_input_doc},
1873 {"reduce", builtin_reduce, METH_VARARGS, reduce_doc},
1874 {"reload", builtin_reload, METH_O, reload_doc},
1875 {"repr", builtin_repr, METH_O, repr_doc},
1876 {"round", builtin_round, METH_VARARGS, round_doc},
1877 {"setattr", builtin_setattr, METH_VARARGS, setattr_doc},
1878 {"slice", builtin_slice, METH_VARARGS, slice_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001879#ifdef Py_USING_UNICODE
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001880 {"unichr", builtin_unichr, METH_VARARGS, unichr_doc},
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001881#endif
Martin v. Löwise3eb1f22001-08-16 13:15:00 +00001882 {"vars", builtin_vars, METH_VARARGS, vars_doc},
1883 {"xrange", builtin_xrange, METH_VARARGS, xrange_doc},
1884 {"zip", builtin_zip, METH_VARARGS, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001885 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001886};
1887
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001888static char builtin_doc[] =
1889"Built-in functions, exceptions, and other objects.\n\
1890\n\
1891Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
1892
Guido van Rossum25ce5661997-08-02 03:10:38 +00001893PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001894_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00001895{
Fred Drake5550de32000-06-20 04:54:19 +00001896 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001897 mod = Py_InitModule4("__builtin__", builtin_methods,
1898 builtin_doc, (PyObject *)NULL,
1899 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001900 if (mod == NULL)
1901 return NULL;
1902 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001903 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1904 return NULL;
1905 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1906 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00001907 if (PyDict_SetItemString(dict, "NotImplemented",
Neil Schemenauer23ab1992001-01-04 01:48:42 +00001908 Py_NotImplemented) < 0)
1909 return NULL;
Tim Peters6d6c1a32001-08-02 04:15:00 +00001910 if (PyDict_SetItemString(dict, "classmethod",
1911 (PyObject *) &PyClassMethod_Type) < 0)
1912 return NULL;
1913#ifndef WITHOUT_COMPLEX
1914 if (PyDict_SetItemString(dict, "complex",
1915 (PyObject *) &PyComplex_Type) < 0)
1916 return NULL;
1917#endif
1918 if (PyDict_SetItemString(dict, "dictionary",
1919 (PyObject *) &PyDict_Type) < 0)
1920 return NULL;
1921 if (PyDict_SetItemString(dict, "float",
1922 (PyObject *) &PyFloat_Type) < 0)
1923 return NULL;
1924 if (PyDict_SetItemString(dict, "int", (PyObject *) &PyInt_Type) < 0)
1925 return NULL;
1926 if (PyDict_SetItemString(dict, "list", (PyObject *) &PyList_Type) < 0)
1927 return NULL;
1928 if (PyDict_SetItemString(dict, "long", (PyObject *) &PyLong_Type) < 0)
1929 return NULL;
1930 if (PyDict_SetItemString(dict, "object",
1931 (PyObject *) &PyBaseObject_Type) < 0)
1932 return NULL;
1933 if (PyDict_SetItemString(dict, "staticmethod",
1934 (PyObject *) &PyStaticMethod_Type) < 0)
1935 return NULL;
1936 if (PyDict_SetItemString(dict, "str", (PyObject *) &PyString_Type) < 0)
1937 return NULL;
1938 if (PyDict_SetItemString(dict, "tuple",
1939 (PyObject *) &PyTuple_Type) < 0)
1940 return NULL;
1941 if (PyDict_SetItemString(dict, "type", (PyObject *) &PyType_Type) < 0)
1942 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001943#ifdef Py_USING_UNICODE
Tim Peters6d6c1a32001-08-02 04:15:00 +00001944 if (PyDict_SetItemString(dict, "unicode",
1945 (PyObject *) &PyUnicode_Type) < 0)
1946 return NULL;
Martin v. Löwis339d0f72001-08-17 18:39:25 +00001947#endif
Fred Drake5550de32000-06-20 04:54:19 +00001948 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
1949 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
1950 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001951 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00001952 }
1953 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001954
Guido van Rossum25ce5661997-08-02 03:10:38 +00001955 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001956}
1957
Guido van Rossume77a7571993-11-03 15:01:26 +00001958/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001959
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001961filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001962{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001963 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001964 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001966
Guido van Rossumb7b45621995-08-04 04:07:45 +00001967 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001969 return tuple;
1970 }
1971
Guido van Rossum79f25d91997-04-29 20:08:16 +00001972 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001973 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001974
Guido van Rossum12d12c51993-10-26 17:58:25 +00001975 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001977 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001978
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001980 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 if (func == Py_None) {
1982 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001983 good = item;
1984 }
1985 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001987 if (arg == NULL)
1988 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 good = PyEval_CallObject(func, arg);
1990 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001991 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001992 goto Fail_1;
1993 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994 ok = PyObject_IsTrue(good);
1995 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001996 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 Py_INCREF(item);
1998 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001999 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002000 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002001 }
2002
Tim Peters4324aa32001-05-28 22:30:08 +00002003 if (_PyTuple_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002004 return NULL;
2005
Guido van Rossum12d12c51993-10-26 17:58:25 +00002006 return result;
2007
Guido van Rossum12d12c51993-10-26 17:58:25 +00002008Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002009 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002010 return NULL;
2011}
2012
2013
Guido van Rossume77a7571993-11-03 15:01:26 +00002014/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002015
Guido van Rossum79f25d91997-04-29 20:08:16 +00002016static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002017filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002018{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002019 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002020 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002022
Guido van Rossum79f25d91997-04-29 20:08:16 +00002023 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002024 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002025 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002026 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002027 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002028 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002029 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002030
Guido van Rossum12d12c51993-10-26 17:58:25 +00002031 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002032 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002033 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002034
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002035 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2036 if (item == NULL)
2037 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 arg = Py_BuildValue("(O)", item);
Tim Peters388ed082001-04-07 20:34:48 +00002039 if (arg == NULL) {
2040 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002041 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00002042 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002043 good = PyEval_CallObject(func, arg);
2044 Py_DECREF(arg);
Tim Peters388ed082001-04-07 20:34:48 +00002045 if (good == NULL) {
2046 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002047 goto Fail_1;
Tim Peters388ed082001-04-07 20:34:48 +00002048 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002049 ok = PyObject_IsTrue(good);
2050 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002051 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 PyString_AS_STRING((PyStringObject *)result)[j++] =
2053 PyString_AS_STRING((PyStringObject *)item)[0];
Tim Peters388ed082001-04-07 20:34:48 +00002054 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002055 }
2056
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002058 return NULL;
2059
Guido van Rossum12d12c51993-10-26 17:58:25 +00002060 return result;
2061
Guido van Rossum12d12c51993-10-26 17:58:25 +00002062Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002063 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002064 return NULL;
2065}