blob: c2a74996446e33bc2e97fba93dcd8d608b9eea65 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00002Copyright (c) 2000, BeOpen.com.
3Copyright (c) 1995-2000, Corporation for National Research Initiatives.
4Copyright (c) 1990-1995, Stichting Mathematisch Centrum.
5All rights reserved.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00006
Guido van Rossumfd71b9e2000-06-30 23:50:40 +00007See the file "Misc/COPYRIGHT" for information on usage and
8redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009******************************************************************/
10
Guido van Rossum3f5da241990-12-20 15:06:42 +000011/* Built-in functions */
12
Guido van Rossum79f25d91997-04-29 20:08:16 +000013#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000014
15#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000016#include "compile.h"
17#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000018
Guido van Rossum6bf62da1997-04-11 20:37:35 +000019#include <ctype.h>
20
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000021#ifdef HAVE_UNISTD_H
22#include <unistd.h>
23#endif
Jack Jansen41aa8e52000-07-03 21:39:47 +000024#ifdef HAVE_LIMITS_H
25#include <limits.h>
26#endif
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000027
Guido van Rossum12d12c51993-10-26 17:58:25 +000028/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000029static PyObject *filterstring(PyObject *, PyObject *);
30static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000031
Guido van Rossum79f25d91997-04-29 20:08:16 +000032static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000033builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000034{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000035 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000036 PyObject *globals = NULL;
37 PyObject *locals = NULL;
38 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000039
Guido van Rossum79f25d91997-04-29 20:08:16 +000040 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000041 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000042 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000043 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000044}
45
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000046static char import_doc[] =
47"__import__(name, globals, locals, fromlist) -> module\n\
48\n\
49Import a module. The globals are only used to determine the context;\n\
50they are not modified. The locals are currently unused. The fromlist\n\
51should be a list of names to emulate ``from name import ...'', or an\n\
52empty list to emulate ``import name''.\n\
53When importing a module from a package, note that __import__('A.B', ...)\n\
54returns package A when fromlist is empty, but its submodule B when\n\
55fromlist is not empty.";
56
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057
Guido van Rossum79f25d91997-04-29 20:08:16 +000058static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000059builtin_abs(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000060{
Guido van Rossum79f25d91997-04-29 20:08:16 +000061 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000062
Guido van Rossum79f25d91997-04-29 20:08:16 +000063 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000065 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000066}
67
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000068static char abs_doc[] =
69"abs(number) -> number\n\
70\n\
71Return the absolute value of the argument.";
72
73
Guido van Rossum79f25d91997-04-29 20:08:16 +000074static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000075builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000076{
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000078 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000079
Guido van Rossum79f25d91997-04-29 20:08:16 +000080 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000081 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000082 if (alist != NULL) {
83 if (!PyTuple_Check(alist)) {
84 if (!PySequence_Check(alist)) {
85 PyErr_SetString(PyExc_TypeError,
86 "apply() 2nd argument must be a sequence");
87 return NULL;
88 }
89 t = PySequence_Tuple(alist);
90 if (t == NULL)
91 return NULL;
92 alist = t;
93 }
Guido van Rossum2d951851994-08-29 12:52:16 +000094 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 if (kwdict != NULL && !PyDict_Check(kwdict)) {
96 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +000097 "apply() 3rd argument must be dictionary");
Barry Warsaw968f8cb1998-10-01 15:33:12 +000098 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000099 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +0000100 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
101 finally:
102 Py_XDECREF(t);
103 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000104}
105
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000106static char apply_doc[] =
Fred Drake7b912121999-12-23 14:16:55 +0000107"apply(object, args[, kwargs]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000108\n\
Fred Drake7b912121999-12-23 14:16:55 +0000109Call a callable object with positional arguments taken from the tuple args,\n\
110and keyword arguments taken from the optional dictionary kwargs.\n\
111Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000112
113
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000115builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000116{
117 PyObject *ob;
118 int offset = 0;
119 int size = Py_END_OF_BUFFER;
120
121 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
122 return NULL;
123 return PyBuffer_FromObject(ob, offset, size);
124}
125
126static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000127"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000128\n\
129Creates a new buffer object which references the given object.\n\
130The buffer will reference a slice of the target object from the\n\
131start of the object (or at the specified offset). The slice will\n\
132extend to the end of the target object (or with the specified size).";
133
134
135static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000136builtin_unicode(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000137{
Guido van Rossum3afba762000-04-11 15:38:23 +0000138 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000139 char *encoding = NULL;
140 char *errors = NULL;
141
Guido van Rossum3afba762000-04-11 15:38:23 +0000142 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000143 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000144 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000145}
146
147static char unicode_doc[] =
148"unicode(string [, encoding[, errors]]) -> object\n\
149\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000150Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000151encoding defaults to the current default string encoding and \n\
152errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000153
154
155static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000156builtin_callable(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +0000157{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000159
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000161 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000163}
164
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000165static char callable_doc[] =
166"callable(object) -> Boolean\n\
167\n\
168Return whether the object is callable (i.e., some kind of function).\n\
169Note that classes are callable, as are instances with a __call__() method.";
170
171
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000173builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000174{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000175 PyObject *func, *seq, *result;
176 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 int len;
178 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000181 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000182
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 if (PyString_Check(seq)) {
184 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000185 return r;
186 }
187
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 if (PyTuple_Check(seq)) {
189 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000190 return r;
191 }
192
Guido van Rossum09df08a1998-05-22 00:51:39 +0000193 sqf = seq->ob_type->tp_as_sequence;
194 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000195 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000196 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 goto Fail_2;
198 }
199
200 if ((len = (*sqf->sq_length)(seq)) < 0)
201 goto Fail_2;
202
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
204 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205 result = seq;
206 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000207 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000210 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000211
Guido van Rossum2d951851994-08-29 12:52:16 +0000212 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000214 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215
Guido van Rossum2d951851994-08-29 12:52:16 +0000216 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000217 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000219 break;
220 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000221 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000222 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000223
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000225 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000227 }
228 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000230 if (arg == NULL)
231 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 good = PyEval_CallObject(func, arg);
233 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000234 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000236 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000237 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000238 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 ok = PyObject_IsTrue(good);
240 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000241 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000242 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000244 goto Fail_1;
245 }
246 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000247 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000248 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000249 Py_DECREF(item);
250 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000251 goto Fail_1;
252 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000253 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000255 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000256 }
257
Guido van Rossum12d12c51993-10-26 17:58:25 +0000258
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000260 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000261
Guido van Rossum12d12c51993-10-26 17:58:25 +0000262 return result;
263
Guido van Rossum12d12c51993-10-26 17:58:25 +0000264Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000266Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000267 return NULL;
268}
269
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000270static char filter_doc[] =
271"filter(function, sequence) -> list\n\
272\n\
273Return a list containing those items of sequence for which function(item)\n\
274is true. If function is None, return a list of items that are true.";
275
276
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000278builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000279{
280 long x;
281 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000284 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000285 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyErr_SetString(PyExc_ValueError,
287 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000288 return NULL;
289 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000290 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000292}
293
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000294static char chr_doc[] =
295"chr(i) -> character\n\
296\n\
297Return a string of one character with ordinal i; 0 <= i < 256.";
298
299
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000301builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000302{
303 long x;
304 Py_UNICODE s[1];
305
306 if (!PyArg_ParseTuple(args, "l:unichr", &x))
307 return NULL;
308 if (x < 0 || x >= 65536) {
309 PyErr_SetString(PyExc_ValueError,
310 "unichr() arg not in range(65536)");
311 return NULL;
312 }
313 s[0] = (Py_UNICODE)x;
314 return PyUnicode_FromUnicode(s, 1);
315}
316
317static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000318"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000319\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000320Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000321
322
323static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000324builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000325{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000327 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000328
Guido van Rossum79f25d91997-04-29 20:08:16 +0000329 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000330 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000331 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000332 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000333 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000334}
335
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000336static char cmp_doc[] =
337"cmp(x, y) -> integer\n\
338\n\
339Return negative if x<y, zero if x==y, positive if x>y.";
340
341
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000343builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000344{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 PyObject *v, *w;
346 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000347
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000349 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000350 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000351 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 res = Py_BuildValue("(OO)", v, w);
353 Py_DECREF(v);
354 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000355 return res;
356}
357
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000358static char coerce_doc[] =
359"coerce(x, y) -> None or (x1, y1)\n\
360\n\
361When x and y can be coerced to values of the same type, return a tuple\n\
362containing the coerced values. When they can't be coerced, return None.";
363
364
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000366builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000367{
368 char *str;
369 char *filename;
370 char *startstr;
371 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000372
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000374 return NULL;
375 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000376 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000377 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000378 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000379 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000380 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000381 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000383 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000384 return NULL;
385 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000386 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000387}
388
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000389static char compile_doc[] =
390"compile(source, filename, mode) -> code object\n\
391\n\
392Compile the source string (a Python module, statement or expression)\n\
393into a code object that can be executed by the exec statement or eval().\n\
394The filename will be used for run-time error messages.\n\
395The mode must be 'exec' to compile a module, 'single' to compile a\n\
396single (interactive) statement, or 'eval' to compile an expression.";
397
398
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000399#ifndef WITHOUT_COMPLEX
400
Guido van Rossum79f25d91997-04-29 20:08:16 +0000401static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000402complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000403{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000404 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000405 const char *s, *start;
406 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000407 double x=0.0, y=0.0, z;
408 int got_re=0, got_im=0, done=0;
409 int digit_or_dot;
410 int sw_error=0;
411 int sign;
412 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000413 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000414 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000415
Guido van Rossum9e896b32000-04-05 20:11:21 +0000416 if (PyString_Check(v)) {
417 s = PyString_AS_STRING(v);
418 len = PyString_GET_SIZE(v);
419 }
420 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000421 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
422 PyErr_SetString(PyExc_ValueError,
423 "complex() literal too large to convert");
424 return NULL;
425 }
426 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
427 PyUnicode_GET_SIZE(v),
428 s_buffer,
429 NULL))
430 return NULL;
431 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000432 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000433 }
434 else if (PyObject_AsCharBuffer(v, &s, &len)) {
435 PyErr_SetString(PyExc_TypeError,
436 "complex() needs a string first argument");
437 return NULL;
438 }
Guido van Rossum11950231999-03-25 21:16:07 +0000439
440 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000441 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000442 while (*s && isspace(Py_CHARMASK(*s)))
443 s++;
444 if (s[0] == '\0') {
445 PyErr_SetString(PyExc_ValueError,
446 "empty string for complex()");
447 return NULL;
448 }
449
450 z = -1.0;
451 sign = 1;
452 do {
453
454 switch (*s) {
455
456 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000457 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000458 PyErr_SetString(
459 PyExc_ValueError,
460 "null byte in argument for complex()");
461 return NULL;
462 }
463 if(!done) sw_error=1;
464 break;
465
466 case '-':
467 sign = -1;
468 /* Fallthrough */
469 case '+':
470 if (done) sw_error=1;
471 s++;
472 if ( *s=='\0'||*s=='+'||*s=='-' ||
473 isspace(Py_CHARMASK(*s)) ) sw_error=1;
474 break;
475
476 case 'J':
477 case 'j':
478 if (got_im || done) {
479 sw_error = 1;
480 break;
481 }
482 if (z<0.0) {
483 y=sign;
484 }
485 else{
486 y=sign*z;
487 }
488 got_im=1;
489 s++;
490 if (*s!='+' && *s!='-' )
491 done=1;
492 break;
493
494 default:
495 if (isspace(Py_CHARMASK(*s))) {
496 while (*s && isspace(Py_CHARMASK(*s)))
497 s++;
498 if (s[0] != '\0')
499 sw_error=1;
500 else
501 done = 1;
502 break;
503 }
504 digit_or_dot =
505 (*s=='.' || isdigit(Py_CHARMASK(*s)));
506 if (done||!digit_or_dot) {
507 sw_error=1;
508 break;
509 }
510 errno = 0;
511 PyFPE_START_PROTECT("strtod", return 0)
512 z = strtod(s, &end) ;
513 PyFPE_END_PROTECT(z)
514 if (errno != 0) {
515 sprintf(buffer,
516 "float() out of range: %.150s", s);
517 PyErr_SetString(
518 PyExc_ValueError,
519 buffer);
520 return NULL;
521 }
522 s=end;
523 if (*s=='J' || *s=='j') {
524
525 break;
526 }
527 if (got_re) {
528 sw_error=1;
529 break;
530 }
531
532 /* accept a real part */
533 x=sign*z;
534 got_re=1;
535 if (got_im) done=1;
536 z = -1.0;
537 sign = 1;
538 break;
539
540 } /* end of switch */
541
542 } while (*s!='\0' && !sw_error);
543
544 if (sw_error) {
545 PyErr_SetString(PyExc_ValueError,
546 "malformed string for complex()");
547 return NULL;
548 }
549
550 return PyComplex_FromDoubles(x,y);
551}
552
553static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000554builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000555{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyObject *r, *i, *tmp;
557 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000558 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000559 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000560
561 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000562 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000563 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000564 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000565 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000566 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000567 nbr->nb_float == NULL ||
568 (i != NULL &&
569 ((nbi = i->ob_type->tp_as_number) == NULL ||
570 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000572 "complex() argument can't be converted to complex");
573 return NULL;
574 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000575 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 if (PyInstance_Check(r)) {
577 static PyObject *complexstr;
578 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000579 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000580 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000581 if (complexstr == NULL)
582 return NULL;
583 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000584 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000585 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000586 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000587 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000589 if (args == NULL)
590 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 r = PyEval_CallObject(f, args);
592 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000593 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000594 if (r == NULL)
595 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000596 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000597 }
598 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 if (PyComplex_Check(r)) {
600 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000601 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000603 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000604 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000605 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000606 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000607 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000609 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000610 if (tmp == NULL)
611 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 cr.real = PyFloat_AsDouble(tmp);
613 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000614 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000615 }
616 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000617 ci.real = 0.0;
618 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000619 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 else if (PyComplex_Check(i))
621 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000622 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000623 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000624 if (tmp == NULL)
625 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 ci.real = PyFloat_AsDouble(tmp);
627 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000628 ci.imag = 0.;
629 }
630 cr.real -= ci.imag;
631 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000633}
634
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000635static char complex_doc[] =
636"complex(real[, imag]) -> complex number\n\
637\n\
638Create a complex number from a real part and an optional imaginary part.\n\
639This is equivalent to (real + imag*1j) where imag defaults to 0.";
640
641
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000642#endif
643
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000645builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000646{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000647 static char *attrlist[] = {"__members__", "__methods__", NULL};
648 PyObject *v = NULL, *l = NULL, *m = NULL;
649 PyObject *d, *x;
650 int i;
651 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000652
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000654 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000655 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000656 x = PyEval_GetLocals();
657 if (x == NULL)
658 goto error;
659 l = PyMapping_Keys(x);
660 if (l == NULL)
661 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000662 }
663 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000665 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000666 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000667 else {
668 l = PyMapping_Keys(d);
669 if (l == NULL)
670 PyErr_Clear();
671 Py_DECREF(d);
672 }
673 if (l == NULL) {
674 l = PyList_New(0);
675 if (l == NULL)
676 goto error;
677 }
678 for (s = attrlist; *s != NULL; s++) {
679 m = PyObject_GetAttrString(v, *s);
680 if (m == NULL) {
681 PyErr_Clear();
682 continue;
683 }
684 for (i = 0; ; i++) {
685 x = PySequence_GetItem(m, i);
686 if (x == NULL) {
687 PyErr_Clear();
688 break;
689 }
690 if (PyList_Append(l, x) != 0) {
691 Py_DECREF(x);
692 Py_DECREF(m);
693 goto error;
694 }
695 Py_DECREF(x);
696 }
697 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000698 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000699 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000700 if (PyList_Sort(l) != 0)
701 goto error;
702 return l;
703 error:
704 Py_XDECREF(l);
705 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000706}
707
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000708static char dir_doc[] =
709"dir([object]) -> list of strings\n\
710\n\
711Return an alphabetized list of names comprising (some of) the attributes\n\
712of the given object. Without an argument, the names in the current scope\n\
713are listed. With an instance argument, only the instance attributes are\n\
714returned. With a class argument, attributes of the base class are not\n\
715returned. For other types or arguments, this may list members or methods.";
716
717
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000719builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000720{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000722
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000724 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000725 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000726}
727
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000728static char divmod_doc[] =
729"divmod(x, y) -> (div, mod)\n\
730\n\
731Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
732
733
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000735builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000736{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 PyObject *cmd;
738 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000739 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000740
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000742 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 &PyDict_Type, &globals,
744 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000745 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (globals == Py_None) {
747 globals = PyEval_GetGlobals();
748 if (locals == Py_None)
749 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000750 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000751 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000752 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
754 if (PyDict_SetItemString(globals, "__builtins__",
755 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000756 return NULL;
757 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (PyCode_Check(cmd))
759 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
760 if (!PyString_Check(cmd)) {
761 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000762 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000763 return NULL;
764 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 str = PyString_AsString(cmd);
Guido van Rossum106f2da2000-06-28 21:12:25 +0000766 if (strlen(str) != (size_t)PyString_Size(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000768 "embedded '\\0' in string arg");
769 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000770 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000771 while (*str == ' ' || *str == '\t')
772 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000773 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000774}
775
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000776static char eval_doc[] =
777"eval(source[, globals[, locals]]) -> value\n\
778\n\
779Evaluate the source in the context of globals and locals.\n\
780The source may be a string representing a Python expression\n\
781or a code object as returned by compile().\n\
782The globals and locals are dictionaries, defaulting to the current\n\
783globals and locals. If only globals is given, locals defaults to it.";
784
785
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000787builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000788{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000789 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 PyObject *globals = Py_None, *locals = Py_None;
791 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000792 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000793
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000795 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 &PyDict_Type, &globals,
797 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000798 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 if (globals == Py_None) {
800 globals = PyEval_GetGlobals();
801 if (locals == Py_None)
802 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000803 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000805 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
807 if (PyDict_SetItemString(globals, "__builtins__",
808 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000809 return NULL;
810 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000814 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000816 return NULL;
817 }
Guido van Rossum0df002c2000-08-27 19:21:52 +0000818 res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000819 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000820}
821
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000822static char execfile_doc[] =
823"execfile(filename[, globals[, locals]])\n\
824\n\
825Read and execute a Python script from a file.\n\
826The globals and locals are dictionaries, defaulting to the current\n\
827globals and locals. If only globals is given, locals defaults to it.";
828
829
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000831builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000832{
Guido van Rossum950ff291998-06-29 13:38:57 +0000833 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000835
Guido van Rossum950ff291998-06-29 13:38:57 +0000836 if (!PyArg_ParseTuple(args, "OS|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000837 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000838 result = PyObject_GetAttr(v, name);
839 if (result == NULL && dflt != NULL) {
840 PyErr_Clear();
841 Py_INCREF(dflt);
842 result = dflt;
843 }
844 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000845}
846
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000847static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000848"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000849\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000850Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
851When a default argument is given, it is returned when the attribute doesn't\n\
852exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000853
854
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000856builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000857{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000859
Guido van Rossum43713e52000-02-29 13:59:29 +0000860 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000861 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 d = PyEval_GetGlobals();
863 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000864 return d;
865}
866
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000867static char globals_doc[] =
868"globals() -> dictionary\n\
869\n\
870Return the dictionary containing the current scope's global variables.";
871
872
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000874builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000875{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 PyObject *v;
877 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000880 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000882 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000884 Py_INCREF(Py_False);
885 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000886 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000888 Py_INCREF(Py_True);
889 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000890}
891
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000892static char hasattr_doc[] =
893"hasattr(object, name) -> Boolean\n\
894\n\
895Return whether the object has an attribute with the given name.\n\
896(This is done by calling getattr(object, name) and catching exceptions.)";
897
898
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000900builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000901{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000903
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000905 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000906 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000907}
908
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000909static char id_doc[] =
910"id(object) -> integer\n\
911\n\
912Return the identity of an object. This is guaranteed to be unique among\n\
913simultaneously existing objects. (Hint: it's the object's memory address.)";
914
915
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000917builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000918{
919 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 PyObject *seq;
921 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000922 int len;
923 } sequence;
924
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000926 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000927 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000928 register int i, j;
929
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 PyErr_SetString(PyExc_TypeError,
933 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000934 return NULL;
935 }
936
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000939
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000940 if (func == Py_None && n == 1) {
941 /* map(None, S) is the same as list(S). */
942 return PySequence_List(PyTuple_GetItem(args, 1));
943 }
944
Guido van Rossum79f25d91997-04-29 20:08:16 +0000945 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
946 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000947 goto Fail_2;
948 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000949
Guido van Rossum2d951851994-08-29 12:52:16 +0000950 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000951 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000952 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000953
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000955 goto Fail_2;
956
Guido van Rossum09df08a1998-05-22 00:51:39 +0000957 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
958 if (sqf == NULL ||
959 sqf->sq_length == NULL ||
960 sqf->sq_item == NULL)
961 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000962 static char errmsg[] =
963 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000964 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000965
966 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000968 goto Fail_2;
969 }
970
971 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
972 goto Fail_2;
973
974 if (curlen > len)
975 len = curlen;
976 }
977
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000979 goto Fail_2;
980
Guido van Rossum2d951851994-08-29 12:52:16 +0000981 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000983 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000984
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000986 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000987 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000989 goto Fail_1;
990 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000991
992 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000993 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000994 Py_INCREF(Py_None);
995 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000996 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000997 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000998 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000999 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001000 if (PyErr_ExceptionMatches(
1001 PyExc_IndexError))
1002 {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 PyErr_Clear();
1004 Py_INCREF(Py_None);
1005 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +00001006 sqp->len = -1;
1007 }
1008 else {
1009 goto Fail_0;
1010 }
1011 }
1012 else
1013 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001014
Guido van Rossum12d12c51993-10-26 17:58:25 +00001015 }
Guido van Rossum32120311995-07-10 13:52:21 +00001016 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001017 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 if (PyTuple_SetItem(alist, j, item) < 0) {
1019 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001020 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001021 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001022 continue;
1023
1024 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001026 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001027 }
1028
Guido van Rossum32120311995-07-10 13:52:21 +00001029 if (!alist)
1030 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001031
1032 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001034 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001035 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001036
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001038 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001039 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 value = PyEval_CallObject(func, alist);
1041 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001042 if (value == NULL)
1043 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001044 }
1045 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001046 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001047 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001048 if (status < 0)
1049 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001050 }
1051 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001053 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001054 }
1055 }
1056
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001057 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1058 goto Fail_1;
1059
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001061 return result;
1062
Guido van Rossum12d12c51993-10-26 17:58:25 +00001063Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001064 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001065Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001067 return NULL;
1068}
1069
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001070static char map_doc[] =
1071"map(function, sequence[, sequence, ...]) -> list\n\
1072\n\
1073Return a list of the results of applying the function to the items of\n\
1074the argument sequence(s). If more than one sequence is given, the\n\
1075function is called with an argument list consisting of the corresponding\n\
1076item of each sequence, substituting None for missing values when not all\n\
1077sequences have the same length. If the function is None, return a list of\n\
1078the items of the sequence (or a list of tuples if more than one sequence).";
1079
1080
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001082builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001083{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 PyObject *v;
1085 PyObject *name;
1086 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001087
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001089 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001091 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 Py_INCREF(Py_None);
1093 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001094}
1095
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001096static char setattr_doc[] =
1097"setattr(object, name, value)\n\
1098\n\
1099Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1100``x.y = v''.";
1101
1102
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001104builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001105{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 PyObject *v;
1107 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001108
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001110 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001112 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 Py_INCREF(Py_None);
1114 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001115}
1116
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001117static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001118"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001119\n\
1120Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1121``del x.y''.";
1122
1123
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001125builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001126{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001128 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001129
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001131 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001133 if (x == -1)
1134 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001136}
1137
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001138static char hash_doc[] =
1139"hash(object) -> integer\n\
1140\n\
1141Return a hash value for the object. Two objects with the same value have\n\
1142the same hash value. The reverse is not necessarily true, but likely.";
1143
1144
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001146builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001147{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 PyObject *v;
1149 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001150
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001152 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001153
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001155 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001157 "hex() argument can't be converted to hex");
1158 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001159 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001160 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001161}
1162
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001163static char hex_doc[] =
1164"hex(number) -> string\n\
1165\n\
1166Return the hexadecimal representation of an integer or long integer.";
1167
1168
Tim Petersdbd9ba62000-07-09 03:09:57 +00001169static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001170
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001172builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001173{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001175 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001176 PyObject *res;
1177 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001178
1179 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001180 if (line == NULL)
1181 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001183 return NULL;
1184 while (*str == ' ' || *str == '\t')
1185 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 globals = PyEval_GetGlobals();
1187 locals = PyEval_GetLocals();
1188 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1189 if (PyDict_SetItemString(globals, "__builtins__",
1190 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001191 return NULL;
1192 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001193 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001195 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001196}
1197
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001198static char input_doc[] =
1199"input([prompt]) -> value\n\
1200\n\
1201Equivalent to eval(raw_input(prompt)).";
1202
1203
Guido van Rossume8811f81997-02-14 15:48:05 +00001204static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001205builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001206{
1207 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001208 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001209 return NULL;
1210 Py_INCREF(s);
1211 PyString_InternInPlace(&s);
1212 return s;
1213}
1214
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001215static char intern_doc[] =
1216"intern(string) -> string\n\
1217\n\
1218``Intern'' the given string. This enters the string in the (global)\n\
1219table of interned strings whose purpose is to speed up dictionary lookups.\n\
1220Return the string itself or the previously interned string object with the\n\
1221same value.";
1222
1223
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001225builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001226{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001228 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001229
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001230 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001232 if (base == -909)
1233 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001234 else if (PyString_Check(v))
1235 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1236 else if (PyUnicode_Check(v))
1237 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1238 PyUnicode_GET_SIZE(v),
1239 base);
1240 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001241 PyErr_SetString(PyExc_TypeError,
1242 "can't convert non-string with explicit base");
1243 return NULL;
1244 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001245}
1246
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001247static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001248"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001249\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001250Convert a string or number to an integer, if possible. A floating point\n\
1251argument will be truncated towards zero (this does not include a string\n\
1252representation of a floating point number!) When converting a string, use\n\
1253the optional base. It is an error to supply a base when converting a\n\
1254non-string.";
1255
1256
1257static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001258builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001259{
1260 PyObject *v;
1261 int base = -909; /* unlikely! */
1262
1263 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1264 return NULL;
1265 if (base == -909)
1266 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001267 else if (PyString_Check(v))
1268 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1269 else if (PyUnicode_Check(v))
1270 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1271 PyUnicode_GET_SIZE(v),
1272 base);
1273 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001274 PyErr_SetString(PyExc_TypeError,
1275 "can't convert non-string with explicit base");
1276 return NULL;
1277 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001278}
1279
1280static char long_doc[] =
1281"long(x) -> long integer\n\
1282long(x, base) -> long integer\n\
1283\n\
1284Convert a string or number to a long integer, if possible. A floating\n\
1285point argument will be truncated towards zero (this does not include a\n\
1286string representation of a floating point number!) When converting a\n\
1287string, use the given base. It is an error to supply a base when\n\
1288converting a non-string.";
1289
1290
1291static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001292builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001293{
1294 PyObject *v;
1295
1296 if (!PyArg_ParseTuple(args, "O:float", &v))
1297 return NULL;
1298 if (PyString_Check(v))
1299 return PyFloat_FromString(v, NULL);
1300 return PyNumber_Float(v);
1301}
1302
1303static char float_doc[] =
1304"float(x) -> floating point number\n\
1305\n\
1306Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001307
1308
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001310builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001311{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001313 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001316 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001317 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001318 if (res < 0 && PyErr_Occurred())
1319 return NULL;
1320 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001321}
1322
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001323static char len_doc[] =
1324"len(object) -> integer\n\
1325\n\
1326Return the number of items of a sequence or mapping.";
1327
1328
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001330builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001331{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001333
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001335 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001336 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001337}
1338
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001339static char list_doc[] =
1340"list(sequence) -> list\n\
1341\n\
1342Return a new list whose items are the same as those of the argument sequence.";
1343
Guido van Rossum8861b741996-07-30 16:49:37 +00001344
1345static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001346builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001347{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001348 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001349
Guido van Rossum09df08a1998-05-22 00:51:39 +00001350 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001351
Guido van Rossum09df08a1998-05-22 00:51:39 +00001352 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1353 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001354
Guido van Rossum09df08a1998-05-22 00:51:39 +00001355 /* This swapping of stop and start is to maintain similarity with
1356 range(). */
1357 if (stop == NULL) {
1358 stop = start;
1359 start = NULL;
1360 }
1361 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001362}
1363
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001364static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001365"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001366\n\
1367Create a slice object. This is used for slicing by the Numeric extensions.";
1368
1369
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001371builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001372{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001374
Guido van Rossum43713e52000-02-29 13:59:29 +00001375 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001376 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 d = PyEval_GetLocals();
1378 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001379 return d;
1380}
1381
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001382static char locals_doc[] =
1383"locals() -> dictionary\n\
1384\n\
1385Return the dictionary containing the current scope's local variables.";
1386
1387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001389min_max(PyObject *args, int sign)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390{
Guido van Rossum2d951851994-08-29 12:52:16 +00001391 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 PyObject *v, *w, *x;
1393 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001398 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001399 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001400 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 PyErr_SetString(PyExc_TypeError,
1402 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001403 return NULL;
1404 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001405 w = NULL;
1406 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001407 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001408 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001409 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001411 break;
1412 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001414 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001415 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001416 if (w == NULL)
1417 w = x;
1418 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001419 int c = PyObject_Compare(x, w);
1420 if (c && PyErr_Occurred()) {
1421 Py_DECREF(x);
1422 Py_XDECREF(w);
1423 return NULL;
1424 }
1425 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001427 w = x;
1428 }
1429 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001430 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001431 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001432 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001433 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 PyErr_SetString(PyExc_ValueError,
1435 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001436 return w;
1437}
1438
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001440builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001441{
1442 return min_max(v, -1);
1443}
1444
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001445static char min_doc[] =
1446"min(sequence) -> value\n\
1447min(a, b, c, ...) -> value\n\
1448\n\
1449With a single sequence argument, return its smallest item.\n\
1450With two or more arguments, return the smallest argument.";
1451
1452
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001454builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001455{
1456 return min_max(v, 1);
1457}
1458
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001459static char max_doc[] =
1460"max(sequence) -> value\n\
1461max(a, b, c, ...) -> value\n\
1462\n\
1463With a single sequence argument, return its largest item.\n\
1464With two or more arguments, return the largest argument.";
1465
1466
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001468builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001469{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 PyObject *v;
1471 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001474 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001475 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1476 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001477 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001478 "oct() argument can't be converted to oct");
1479 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001480 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001481 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001482}
1483
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001484static char oct_doc[] =
1485"oct(number) -> string\n\
1486\n\
1487Return the octal representation of an integer or long integer.";
1488
1489
Guido van Rossum79f25d91997-04-29 20:08:16 +00001490static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001491builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492{
Guido van Rossum2d951851994-08-29 12:52:16 +00001493 char *name;
1494 char *mode = "r";
1495 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001497
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001499 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001500 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001501 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001503 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001504}
1505
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001506static char open_doc[] =
1507"open(filename[, mode[, buffering]]) -> file object\n\
1508\n\
1509Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1510writing or appending. The file will be created if it doesn't exist\n\
1511when opened for writing or appending; it will be truncated when\n\
1512opened for writing. Add a 'b' to the mode for binary files.\n\
1513Add a '+' to the mode to allow simultaneous reading and writing.\n\
1514If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1515buffered, and larger numbers specify the buffer size.";
1516
1517
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001519builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001520{
Guido van Rossum09095f32000-03-10 23:00:52 +00001521 PyObject *obj;
1522 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001523 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001524
Guido van Rossum09095f32000-03-10 23:00:52 +00001525 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001526 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001527
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001528 if (PyString_Check(obj)) {
1529 size = PyString_GET_SIZE(obj);
1530 if (size == 1)
1531 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1532 } else if (PyUnicode_Check(obj)) {
1533 size = PyUnicode_GET_SIZE(obj);
1534 if (size == 1)
1535 ord = (long)*PyUnicode_AS_UNICODE(obj);
1536 } else {
1537 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001538 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001539 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001540 return NULL;
1541 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001542 if (size == 1)
1543 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001544
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001545 PyErr_Format(PyExc_TypeError,
1546 "expected a character, length-%d string found",
1547 size);
1548 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001549}
1550
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001551static char ord_doc[] =
1552"ord(c) -> integer\n\
1553\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001554Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001555
1556
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001558builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001559{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001560 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001561
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001563 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001564 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001565}
1566
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001567static char pow_doc[] =
1568"pow(x, y[, z]) -> number\n\
1569\n\
1570With two arguments, equivalent to x**y. With three arguments,\n\
1571equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1572
1573
Guido van Rossum124eff01999-02-23 16:11:01 +00001574/* Return number of items in range/xrange (lo, hi, step). step > 0
1575 * required. Return a value < 0 if & only if the true value is too
1576 * large to fit in a signed long.
1577 */
1578static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001579get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001580{
1581 /* -------------------------------------------------------------
1582 If lo >= hi, the range is empty.
1583 Else if n values are in the range, the last one is
1584 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1585 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1586 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1587 the RHS is non-negative and so truncation is the same as the
1588 floor. Letting M be the largest positive long, the worst case
1589 for the RHS numerator is hi=M, lo=-M-1, and then
1590 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1591 precision to compute the RHS exactly.
1592 ---------------------------------------------------------------*/
1593 long n = 0;
1594 if (lo < hi) {
1595 unsigned long uhi = (unsigned long)hi;
1596 unsigned long ulo = (unsigned long)lo;
1597 unsigned long diff = uhi - ulo - 1;
1598 n = (long)(diff / (unsigned long)step + 1);
1599 }
1600 return n;
1601}
1602
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001604builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001605{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001607 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001609
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001611
Guido van Rossum79f25d91997-04-29 20:08:16 +00001612 if (PyTuple_Size(args) <= 1) {
1613 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001614 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001615 &ihigh))
1616 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001617 }
1618 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001620 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001621 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001622 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001623 }
1624 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001625 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001626 return NULL;
1627 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001628 if (istep > 0)
1629 bign = get_len_of_range(ilow, ihigh, istep);
1630 else
1631 bign = get_len_of_range(ihigh, ilow, -istep);
1632 n = (int)bign;
1633 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001634 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001635 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001636 return NULL;
1637 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001638 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 if (v == NULL)
1640 return NULL;
1641 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001642 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001643 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001644 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001645 return NULL;
1646 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001647 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001648 ilow += istep;
1649 }
1650 return v;
1651}
1652
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001653static char range_doc[] =
1654"range([start,] stop[, step]) -> list of integers\n\
1655\n\
1656Return a list containing an arithmetic progression of integers.\n\
1657range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1658When step is given, it specifies the increment (or decrement).\n\
1659For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1660These are exactly the valid indices for a list of 4 elements.";
1661
1662
Guido van Rossum79f25d91997-04-29 20:08:16 +00001663static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001664builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001665{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001667 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001668
Guido van Rossum79f25d91997-04-29 20:08:16 +00001669 if (PyTuple_Size(args) <= 1) {
1670 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001671 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001672 &ihigh))
1673 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001674 }
1675 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001676 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001677 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001678 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001679 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001680 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001682 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001683 return NULL;
1684 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001685 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001686 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001687 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001688 n = get_len_of_range(ihigh, ilow, -istep);
1689 if (n < 0) {
1690 PyErr_SetString(PyExc_OverflowError,
1691 "xrange() has more than sys.maxint items");
1692 return NULL;
1693 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001695}
1696
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001697static char xrange_doc[] =
1698"xrange([start,] stop[, step]) -> xrange object\n\
1699\n\
1700Like range(), but instead of returning a list, returns an object that\n\
1701generates the numbers in the range on demand. This is slightly slower\n\
1702than range() but more memory efficient.";
1703
1704
Guido van Rossum79f25d91997-04-29 20:08:16 +00001705static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001706builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001707{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001708 PyObject *v = NULL;
1709 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001710
Guido van Rossum79f25d91997-04-29 20:08:16 +00001711 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001712 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001713 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1714 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001715 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001717 char *prompt;
1718 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001719 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001720 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001721 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001722 if (po == NULL)
1723 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001725 if (prompt == NULL)
1726 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001727 }
1728 else {
1729 po = NULL;
1730 prompt = "";
1731 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001732 s = PyOS_Readline(prompt);
1733 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001734 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001736 return NULL;
1737 }
1738 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001739 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001740 result = NULL;
1741 }
1742 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001743 size_t len = strlen(s);
1744 if (len > INT_MAX) {
1745 PyErr_SetString(PyExc_OverflowError, "input too long");
1746 result = NULL;
1747 }
1748 else {
1749 result = PyString_FromStringAndSize(s, (int)(len-1));
1750 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001751 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001752 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001753 return result;
1754 }
Guido van Rossum90933611991-06-07 16:10:43 +00001755 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001757 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001759 return NULL;
1760 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001761 if (Py_FlushLine() != 0 ||
1762 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001763 return NULL;
1764 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001765 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001766 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001768 return NULL;
1769 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001771}
1772
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001773static char raw_input_doc[] =
1774"raw_input([prompt]) -> string\n\
1775\n\
1776Read a string from standard input. The trailing newline is stripped.\n\
1777If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1778On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1779is printed without a trailing newline before reading.";
1780
1781
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001783builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001784{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 PyObject *seq, *func, *result = NULL;
1786 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001790 return NULL;
1791 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001793
Guido van Rossum09df08a1998-05-22 00:51:39 +00001794 sqf = seq->ob_type->tp_as_sequence;
1795 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001797 "2nd argument to reduce() must be a sequence object");
1798 return NULL;
1799 }
1800
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001802 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001803
Guido van Rossum2d951851994-08-29 12:52:16 +00001804 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806
1807 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001808 Py_DECREF(args);
1809 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001810 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001811 }
1812
Guido van Rossum2d951851994-08-29 12:52:16 +00001813 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001814 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001816 break;
1817 }
1818 goto Fail;
1819 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001820
Guido van Rossum2d951851994-08-29 12:52:16 +00001821 if (result == NULL)
1822 result = op2;
1823 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 PyTuple_SetItem(args, 0, result);
1825 PyTuple_SetItem(args, 1, op2);
1826 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001827 goto Fail;
1828 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001829 }
1830
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001832
Guido van Rossum2d951851994-08-29 12:52:16 +00001833 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001834 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001835 "reduce of empty sequence with no initial value");
1836
Guido van Rossum12d12c51993-10-26 17:58:25 +00001837 return result;
1838
Guido van Rossum2d951851994-08-29 12:52:16 +00001839Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840 Py_XDECREF(args);
1841 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001842 return NULL;
1843}
1844
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001845static char reduce_doc[] =
1846"reduce(function, sequence[, initial]) -> value\n\
1847\n\
1848Apply a function of two arguments cumulatively to the items of a sequence,\n\
1849from left to right, so as to reduce the sequence to a single value.\n\
1850For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1851((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1852of the sequence in the calculation, and serves as a default when the\n\
1853sequence is empty.";
1854
1855
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001857builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001858{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001860
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001862 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001863 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001864}
1865
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001866static char reload_doc[] =
1867"reload(module) -> module\n\
1868\n\
1869Reload the module. The module must have been successfully imported before.";
1870
1871
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001873builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001874{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001876
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001878 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001880}
1881
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001882static char repr_doc[] =
1883"repr(object) -> string\n\
1884\n\
1885Return the canonical string representation of the object.\n\
1886For most object types, eval(repr(object)) == object.";
1887
1888
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001890builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001891{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001892 double x;
1893 double f;
1894 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001895 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001896
Guido van Rossum79f25d91997-04-29 20:08:16 +00001897 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001898 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001899 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001900 i = abs(ndigits);
1901 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001902 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001903 if (ndigits < 0)
1904 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001905 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001906 x *= f;
1907 if (x >= 0.0)
1908 x = floor(x + 0.5);
1909 else
1910 x = ceil(x - 0.5);
1911 if (ndigits < 0)
1912 x *= f;
1913 else
1914 x /= f;
1915 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001916}
1917
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001918static char round_doc[] =
1919"round(number[, ndigits]) -> floating point number\n\
1920\n\
1921Round a number to a given precision in decimal digits (default 0 digits).\n\
1922This always returns a floating point number. Precision may be negative.";
1923
1924
Guido van Rossum79f25d91997-04-29 20:08:16 +00001925static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001926builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001927{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001929
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001931 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001933}
1934
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001935static char str_doc[] =
1936"str(object) -> string\n\
1937\n\
1938Return a nice string representation of the object.\n\
1939If the argument is a string, the return value is the same object.";
1940
1941
Guido van Rossum79f25d91997-04-29 20:08:16 +00001942static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001943builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001944{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001945 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001946
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001949 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001950}
1951
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001952static char tuple_doc[] =
1953"tuple(sequence) -> list\n\
1954\n\
1955Return a tuple whose items are the same as those of the argument sequence.\n\
1956If the argument is a tuple, the return value is the same object.";
1957
1958
Guido van Rossum79f25d91997-04-29 20:08:16 +00001959static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001960builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001963
Guido van Rossum79f25d91997-04-29 20:08:16 +00001964 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001965 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001966 v = (PyObject *)v->ob_type;
1967 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001968 return v;
1969}
1970
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001971static char type_doc[] =
1972"type(object) -> type object\n\
1973\n\
1974Return the type of the object.";
1975
1976
Guido van Rossum79f25d91997-04-29 20:08:16 +00001977static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001978builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001979{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 PyObject *v = NULL;
1981 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001982
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001984 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001985 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001986 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001987 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001988 if (!PyErr_Occurred())
1989 PyErr_SetString(PyExc_SystemError,
1990 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001991 }
1992 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001993 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001994 }
1995 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001996 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001997 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001998 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001999 "vars() argument must have __dict__ attribute");
2000 return NULL;
2001 }
2002 }
2003 return d;
2004}
2005
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002006static char vars_doc[] =
2007"vars([object]) -> dictionary\n\
2008\n\
2009Without arguments, equivalent to locals().\n\
2010With an argument, equivalent to object.__dict__.";
2011
Guido van Rossum668213d1999-06-16 17:28:37 +00002012static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002013abstract_issubclass(PyObject *derived, PyObject *cls, char *err, int first)
Guido van Rossum668213d1999-06-16 17:28:37 +00002014{
2015 static PyObject *__bases__ = NULL;
2016 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002017 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002018 int r = 0;
2019
2020 if (__bases__ == NULL) {
2021 __bases__ = PyString_FromString("__bases__");
2022 if (__bases__ == NULL)
2023 return -1;
2024 }
2025
2026 if (first) {
2027 bases = PyObject_GetAttr(cls, __bases__);
2028 if (bases == NULL || !PyTuple_Check(bases)) {
2029 Py_XDECREF(bases);
2030 PyErr_SetString(PyExc_TypeError, err);
2031 return -1;
2032 }
2033 Py_DECREF(bases);
2034 }
2035
2036 if (derived == cls)
2037 return 1;
2038
2039 bases = PyObject_GetAttr(derived, __bases__);
2040 if (bases == NULL || !PyTuple_Check(bases)) {
2041 Py_XDECREF(bases);
2042 PyErr_SetString(PyExc_TypeError, err);
2043 return -1;
2044 }
2045
2046 n = PyTuple_GET_SIZE(bases);
2047 for (i = 0; i < n; i++) {
2048 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2049 cls, err, 0);
2050 if (r != 0)
2051 break;
2052 }
2053
2054 Py_DECREF(bases);
2055
2056 return r;
2057}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002058
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002059static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002060builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002061{
2062 PyObject *inst;
2063 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002064 PyObject *icls;
2065 static PyObject *__class__ = NULL;
2066 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002067
Guido van Rossum43713e52000-02-29 13:59:29 +00002068 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002069 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002070
Guido van Rossum668213d1999-06-16 17:28:37 +00002071 if (PyClass_Check(cls)) {
2072 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002073 PyObject *inclass =
2074 (PyObject*)((PyInstanceObject*)inst)->in_class;
2075 retval = PyClass_IsSubclass(inclass, cls);
2076 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002077 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002078 else if (PyType_Check(cls)) {
2079 retval = ((PyObject *)(inst->ob_type) == cls);
2080 }
2081 else if (!PyInstance_Check(inst)) {
2082 if (__class__ == NULL) {
2083 __class__ = PyString_FromString("__class__");
2084 if (__class__ == NULL)
2085 return NULL;
2086 }
2087 icls = PyObject_GetAttr(inst, __class__);
2088 if (icls != NULL) {
2089 retval = abstract_issubclass(
2090 icls, cls,
2091 "second argument must be a class",
2092 1);
2093 Py_DECREF(icls);
2094 if (retval < 0)
2095 return NULL;
2096 }
2097 else {
2098 PyErr_SetString(PyExc_TypeError,
2099 "second argument must be a class");
2100 return NULL;
2101 }
2102 }
2103 else {
2104 PyErr_SetString(PyExc_TypeError,
2105 "second argument must be a class");
2106 return NULL;
2107 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002108 return PyInt_FromLong(retval);
2109}
2110
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002111static char isinstance_doc[] =
2112"isinstance(object, class-or-type) -> Boolean\n\
2113\n\
2114Return whether an object is an instance of a class or of a subclass thereof.\n\
2115With a type as second argument, return whether that is the object's type.";
2116
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002117
2118static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002119builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002120{
2121 PyObject *derived;
2122 PyObject *cls;
2123 int retval;
2124
Guido van Rossum43713e52000-02-29 13:59:29 +00002125 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002126 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002127
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002128 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002129 retval = abstract_issubclass(
2130 derived, cls, "arguments must be classes", 1);
2131 if (retval < 0)
2132 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002133 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002134 else {
2135 /* shortcut */
2136 if (!(retval = (derived == cls)))
2137 retval = PyClass_IsSubclass(derived, cls);
2138 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002139
2140 return PyInt_FromLong(retval);
2141}
2142
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002143static char issubclass_doc[] =
2144"issubclass(C, B) -> Boolean\n\
2145\n\
2146Return whether class C is a subclass (i.e., a derived class) of class B.";
2147
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002148
Barry Warsawbd599b52000-08-03 15:45:29 +00002149static PyObject*
2150builtin_zip(PyObject *self, PyObject *args)
2151{
2152 PyObject *ret;
2153 int itemsize = PySequence_Length(args);
2154 int i, j;
2155
2156 if (itemsize < 1) {
2157 PyErr_SetString(PyExc_TypeError,
2158 "at least one sequence is required");
2159 return NULL;
2160 }
2161 /* args must be a tuple */
2162 assert(PyTuple_Check(args));
2163
2164 if ((ret = PyList_New(0)) == NULL)
2165 return NULL;
2166
2167 for (i = 0;; i++) {
2168 PyObject *next = PyTuple_New(itemsize);
2169 if (!next) {
2170 Py_DECREF(ret);
2171 return NULL;
2172 }
2173 for (j = 0; j < itemsize; j++) {
2174 PyObject *seq = PyTuple_GET_ITEM(args, j);
2175 PyObject *item = PySequence_GetItem(seq, i);
2176
2177 if (!item) {
2178 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2179 PyErr_Clear();
2180 Py_DECREF(next);
2181 return ret;
2182 }
2183 Py_DECREF(next);
2184 Py_DECREF(ret);
2185 return NULL;
2186 }
2187 PyTuple_SET_ITEM(next, j, item);
2188 }
2189 PyList_Append(ret, next);
2190 Py_DECREF(next);
2191 }
2192 /* no return */
2193}
2194
2195
2196static char zip_doc[] =
2197"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2198\n\
2199Return a list of tuples, where each tuple contains the i-th element\n\
2200from each of the argument sequences. The returned list is truncated\n\
2201in length to the length of the shortest argument sequence.";
2202
2203
Guido van Rossum79f25d91997-04-29 20:08:16 +00002204static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002205 {"__import__", builtin___import__, 1, import_doc},
2206 {"abs", builtin_abs, 1, abs_doc},
2207 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002208 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002209 {"callable", builtin_callable, 1, callable_doc},
2210 {"chr", builtin_chr, 1, chr_doc},
2211 {"cmp", builtin_cmp, 1, cmp_doc},
2212 {"coerce", builtin_coerce, 1, coerce_doc},
2213 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002214#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002215 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002216#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002217 {"delattr", builtin_delattr, 1, delattr_doc},
2218 {"dir", builtin_dir, 1, dir_doc},
2219 {"divmod", builtin_divmod, 1, divmod_doc},
2220 {"eval", builtin_eval, 1, eval_doc},
2221 {"execfile", builtin_execfile, 1, execfile_doc},
2222 {"filter", builtin_filter, 1, filter_doc},
2223 {"float", builtin_float, 1, float_doc},
2224 {"getattr", builtin_getattr, 1, getattr_doc},
2225 {"globals", builtin_globals, 1, globals_doc},
2226 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2227 {"hash", builtin_hash, 1, hash_doc},
2228 {"hex", builtin_hex, 1, hex_doc},
2229 {"id", builtin_id, 1, id_doc},
2230 {"input", builtin_input, 1, input_doc},
2231 {"intern", builtin_intern, 1, intern_doc},
2232 {"int", builtin_int, 1, int_doc},
2233 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2234 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2235 {"len", builtin_len, 1, len_doc},
2236 {"list", builtin_list, 1, list_doc},
2237 {"locals", builtin_locals, 1, locals_doc},
2238 {"long", builtin_long, 1, long_doc},
2239 {"map", builtin_map, 1, map_doc},
2240 {"max", builtin_max, 1, max_doc},
2241 {"min", builtin_min, 1, min_doc},
2242 {"oct", builtin_oct, 1, oct_doc},
2243 {"open", builtin_open, 1, open_doc},
2244 {"ord", builtin_ord, 1, ord_doc},
2245 {"pow", builtin_pow, 1, pow_doc},
2246 {"range", builtin_range, 1, range_doc},
2247 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2248 {"reduce", builtin_reduce, 1, reduce_doc},
2249 {"reload", builtin_reload, 1, reload_doc},
2250 {"repr", builtin_repr, 1, repr_doc},
2251 {"round", builtin_round, 1, round_doc},
2252 {"setattr", builtin_setattr, 1, setattr_doc},
2253 {"slice", builtin_slice, 1, slice_doc},
2254 {"str", builtin_str, 1, str_doc},
2255 {"tuple", builtin_tuple, 1, tuple_doc},
2256 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002257 {"unicode", builtin_unicode, 1, unicode_doc},
2258 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002259 {"vars", builtin_vars, 1, vars_doc},
2260 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002261 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002262 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002263};
2264
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002265static char builtin_doc[] =
2266"Built-in functions, exceptions, and other objects.\n\
2267\n\
2268Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2269
Guido van Rossum25ce5661997-08-02 03:10:38 +00002270PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002271_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002272{
Fred Drake5550de32000-06-20 04:54:19 +00002273 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002274 mod = Py_InitModule4("__builtin__", builtin_methods,
2275 builtin_doc, (PyObject *)NULL,
2276 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002277 if (mod == NULL)
2278 return NULL;
2279 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002280 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2281 return NULL;
2282 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2283 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002284 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2285 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2286 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002287 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002288 }
2289 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002290
Guido van Rossum25ce5661997-08-02 03:10:38 +00002291 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002292}
2293
Guido van Rossume77a7571993-11-03 15:01:26 +00002294/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002295
Guido van Rossum79f25d91997-04-29 20:08:16 +00002296static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002297filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002298{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002299 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002300 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002301 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002302
Guido van Rossumb7b45621995-08-04 04:07:45 +00002303 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002304 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002305 return tuple;
2306 }
2307
Guido van Rossum79f25d91997-04-29 20:08:16 +00002308 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002309 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002310
Guido van Rossum12d12c51993-10-26 17:58:25 +00002311 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002312 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002313 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002314
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002316 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002317 if (func == Py_None) {
2318 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002319 good = item;
2320 }
2321 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002322 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002323 if (arg == NULL)
2324 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002325 good = PyEval_CallObject(func, arg);
2326 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002327 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002328 goto Fail_1;
2329 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 ok = PyObject_IsTrue(good);
2331 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002332 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002333 Py_INCREF(item);
2334 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002335 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002336 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002337 }
2338
Guido van Rossum79f25d91997-04-29 20:08:16 +00002339 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002340 return NULL;
2341
Guido van Rossum12d12c51993-10-26 17:58:25 +00002342 return result;
2343
Guido van Rossum12d12c51993-10-26 17:58:25 +00002344Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002345 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002346 return NULL;
2347}
2348
2349
Guido van Rossume77a7571993-11-03 15:01:26 +00002350/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002351
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002353filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002354{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002355 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002356 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002357 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002358
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002360 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002362 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002363 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002364 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002365 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002366
Guido van Rossum12d12c51993-10-26 17:58:25 +00002367 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002368 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002369 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002370
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002371 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2372 if (item == NULL)
2373 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002374 arg = Py_BuildValue("(O)", item);
2375 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002376 if (arg == NULL)
2377 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002378 good = PyEval_CallObject(func, arg);
2379 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002380 if (good == NULL)
2381 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 ok = PyObject_IsTrue(good);
2383 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002384 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002385 PyString_AS_STRING((PyStringObject *)result)[j++] =
2386 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002387 }
2388
Guido van Rossum79f25d91997-04-29 20:08:16 +00002389 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002390 return NULL;
2391
Guido van Rossum12d12c51993-10-26 17:58:25 +00002392 return result;
2393
Guido van Rossum12d12c51993-10-26 17:58:25 +00002394Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002395 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002396 return NULL;
2397}