blob: 4ca1310be2133be3b81b0ed26ed8977ec26cd9b8 [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Built-in functions */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005
6#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +00007#include "compile.h"
8#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00009
Guido van Rossum6bf62da1997-04-11 20:37:35 +000010#include <ctype.h>
11
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000012#ifdef HAVE_UNISTD_H
13#include <unistd.h>
14#endif
15
Guido van Rossum12d12c51993-10-26 17:58:25 +000016/* Forward */
Tim Petersdbd9ba62000-07-09 03:09:57 +000017static PyObject *filterstring(PyObject *, PyObject *);
18static PyObject *filtertuple (PyObject *, PyObject *);
Guido van Rossum12d12c51993-10-26 17:58:25 +000019
Guido van Rossum79f25d91997-04-29 20:08:16 +000020static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000021builtin___import__(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +000022{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000023 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000024 PyObject *globals = NULL;
25 PyObject *locals = NULL;
26 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000027
Guido van Rossum79f25d91997-04-29 20:08:16 +000028 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000029 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000030 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000031 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000032}
33
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000034static char import_doc[] =
35"__import__(name, globals, locals, fromlist) -> module\n\
36\n\
37Import a module. The globals are only used to determine the context;\n\
38they are not modified. The locals are currently unused. The fromlist\n\
39should be a list of names to emulate ``from name import ...'', or an\n\
40empty list to emulate ``import name''.\n\
41When importing a module from a package, note that __import__('A.B', ...)\n\
42returns package A when fromlist is empty, but its submodule B when\n\
43fromlist is not empty.";
44
Guido van Rossum1ae940a1995-01-02 19:04:15 +000045
Guido van Rossum79f25d91997-04-29 20:08:16 +000046static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000047builtin_abs(PyObject *self, PyObject *args)
Guido van Rossum1ae940a1995-01-02 19:04:15 +000048{
Guido van Rossum79f25d91997-04-29 20:08:16 +000049 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000050
Guido van Rossum79f25d91997-04-29 20:08:16 +000051 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000052 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000053 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000054}
55
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000056static char abs_doc[] =
57"abs(number) -> number\n\
58\n\
59Return the absolute value of the argument.";
60
61
Guido van Rossum79f25d91997-04-29 20:08:16 +000062static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +000063builtin_apply(PyObject *self, PyObject *args)
Guido van Rossumc02e15c1991-12-16 13:03:00 +000064{
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 PyObject *func, *alist = NULL, *kwdict = NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000066 PyObject *t = NULL, *retval = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067
Guido van Rossum79f25d91997-04-29 20:08:16 +000068 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000069 return NULL;
Barry Warsaw968f8cb1998-10-01 15:33:12 +000070 if (alist != NULL) {
71 if (!PyTuple_Check(alist)) {
72 if (!PySequence_Check(alist)) {
73 PyErr_SetString(PyExc_TypeError,
74 "apply() 2nd argument must be a sequence");
75 return NULL;
76 }
77 t = PySequence_Tuple(alist);
78 if (t == NULL)
79 return NULL;
80 alist = t;
81 }
Guido van Rossum2d951851994-08-29 12:52:16 +000082 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 if (kwdict != NULL && !PyDict_Check(kwdict)) {
84 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +000085 "apply() 3rd argument must be dictionary");
Barry Warsaw968f8cb1998-10-01 15:33:12 +000086 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000087 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +000088 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
89 finally:
90 Py_XDECREF(t);
91 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000092}
93
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000094static char apply_doc[] =
Fred Drake7b912121999-12-23 14:16:55 +000095"apply(object, args[, kwargs]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000096\n\
Fred Drake7b912121999-12-23 14:16:55 +000097Call a callable object with positional arguments taken from the tuple args,\n\
98and keyword arguments taken from the optional dictionary kwargs.\n\
99Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000100
101
Guido van Rossum79f25d91997-04-29 20:08:16 +0000102static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000103builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000104{
105 PyObject *ob;
106 int offset = 0;
107 int size = Py_END_OF_BUFFER;
108
109 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
110 return NULL;
111 return PyBuffer_FromObject(ob, offset, size);
112}
113
114static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000115"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000116\n\
117Creates a new buffer object which references the given object.\n\
118The buffer will reference a slice of the target object from the\n\
119start of the object (or at the specified offset). The slice will\n\
120extend to the end of the target object (or with the specified size).";
121
122
123static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000124builtin_unicode(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000125{
Guido van Rossum3afba762000-04-11 15:38:23 +0000126 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000127 char *encoding = NULL;
128 char *errors = NULL;
129
Guido van Rossum3afba762000-04-11 15:38:23 +0000130 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000131 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000132 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000133}
134
135static char unicode_doc[] =
136"unicode(string [, encoding[, errors]]) -> object\n\
137\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000138Creates a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000139encoding defaults to the current default string encoding and \n\
140errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000141
142
143static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000144builtin_callable(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +0000145{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000146 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000147
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000149 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000151}
152
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000153static char callable_doc[] =
154"callable(object) -> Boolean\n\
155\n\
156Return whether the object is callable (i.e., some kind of function).\n\
157Note that classes are callable, as are instances with a __call__() method.";
158
159
Guido van Rossum79f25d91997-04-29 20:08:16 +0000160static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000161builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000162{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000163 PyObject *func, *seq, *result;
164 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000165 int len;
166 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000167
Guido van Rossum79f25d91997-04-29 20:08:16 +0000168 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 if (PyString_Check(seq)) {
172 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000173 return r;
174 }
175
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176 if (PyTuple_Check(seq)) {
177 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000178 return r;
179 }
180
Guido van Rossum09df08a1998-05-22 00:51:39 +0000181 sqf = seq->ob_type->tp_as_sequence;
182 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000183 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000184 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000185 goto Fail_2;
186 }
187
188 if ((len = (*sqf->sq_length)(seq)) < 0)
189 goto Fail_2;
190
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
192 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000193 result = seq;
194 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000195 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000196 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000197 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000198 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199
Guido van Rossum2d951851994-08-29 12:52:16 +0000200 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000201 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000202 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000203
Guido van Rossum2d951851994-08-29 12:52:16 +0000204 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000205 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000206 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000207 break;
208 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000209 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000210 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000211
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000213 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000215 }
216 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000218 if (arg == NULL)
219 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000220 good = PyEval_CallObject(func, arg);
221 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000222 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000224 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000225 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000226 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000227 ok = PyObject_IsTrue(good);
228 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000229 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000230 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000232 goto Fail_1;
233 }
234 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000235 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000236 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000237 Py_DECREF(item);
238 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000239 goto Fail_1;
240 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000241 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000243 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000244 }
245
Guido van Rossum12d12c51993-10-26 17:58:25 +0000246
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000248 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000249
Guido van Rossum12d12c51993-10-26 17:58:25 +0000250 return result;
251
Guido van Rossum12d12c51993-10-26 17:58:25 +0000252Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000253 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000254Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000255 return NULL;
256}
257
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000258static char filter_doc[] =
259"filter(function, sequence) -> list\n\
260\n\
261Return a list containing those items of sequence for which function(item)\n\
262is true. If function is None, return a list of items that are true.";
263
264
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000266builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000267{
268 long x;
269 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000270
Guido van Rossum79f25d91997-04-29 20:08:16 +0000271 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000272 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000273 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 PyErr_SetString(PyExc_ValueError,
275 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000276 return NULL;
277 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000278 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000279 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000280}
281
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000282static char chr_doc[] =
283"chr(i) -> character\n\
284\n\
285Return a string of one character with ordinal i; 0 <= i < 256.";
286
287
Guido van Rossum79f25d91997-04-29 20:08:16 +0000288static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000289builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000290{
291 long x;
292 Py_UNICODE s[1];
293
294 if (!PyArg_ParseTuple(args, "l:unichr", &x))
295 return NULL;
296 if (x < 0 || x >= 65536) {
297 PyErr_SetString(PyExc_ValueError,
298 "unichr() arg not in range(65536)");
299 return NULL;
300 }
301 s[0] = (Py_UNICODE)x;
302 return PyUnicode_FromUnicode(s, 1);
303}
304
305static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000306"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000307\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000308Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000309
310
311static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000312builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000313{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000314 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000315 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000316
Guido van Rossum79f25d91997-04-29 20:08:16 +0000317 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000318 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000319 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000320 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000321 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000322}
323
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000324static char cmp_doc[] =
325"cmp(x, y) -> integer\n\
326\n\
327Return negative if x<y, zero if x==y, positive if x>y.";
328
329
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000331builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000332{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyObject *v, *w;
334 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000335
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000337 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000339 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 res = Py_BuildValue("(OO)", v, w);
341 Py_DECREF(v);
342 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000343 return res;
344}
345
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000346static char coerce_doc[] =
347"coerce(x, y) -> None or (x1, y1)\n\
348\n\
349When x and y can be coerced to values of the same type, return a tuple\n\
350containing the coerced values. When they can't be coerced, return None.";
351
352
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000354builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000355{
356 char *str;
357 char *filename;
358 char *startstr;
359 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000360
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000362 return NULL;
363 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000364 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000365 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000366 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000367 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000368 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000369 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000371 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000372 return NULL;
373 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000375}
376
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000377static char compile_doc[] =
378"compile(source, filename, mode) -> code object\n\
379\n\
380Compile the source string (a Python module, statement or expression)\n\
381into a code object that can be executed by the exec statement or eval().\n\
382The filename will be used for run-time error messages.\n\
383The mode must be 'exec' to compile a module, 'single' to compile a\n\
384single (interactive) statement, or 'eval' to compile an expression.";
385
386
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000387#ifndef WITHOUT_COMPLEX
388
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000390complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000391{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000392 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000393 const char *s, *start;
394 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000395 double x=0.0, y=0.0, z;
396 int got_re=0, got_im=0, done=0;
397 int digit_or_dot;
398 int sw_error=0;
399 int sign;
400 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000401 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000402 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000403
Guido van Rossum9e896b32000-04-05 20:11:21 +0000404 if (PyString_Check(v)) {
405 s = PyString_AS_STRING(v);
406 len = PyString_GET_SIZE(v);
407 }
408 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000409 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
410 PyErr_SetString(PyExc_ValueError,
411 "complex() literal too large to convert");
412 return NULL;
413 }
414 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
415 PyUnicode_GET_SIZE(v),
416 s_buffer,
417 NULL))
418 return NULL;
419 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000420 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000421 }
422 else if (PyObject_AsCharBuffer(v, &s, &len)) {
423 PyErr_SetString(PyExc_TypeError,
424 "complex() needs a string first argument");
425 return NULL;
426 }
Guido van Rossum11950231999-03-25 21:16:07 +0000427
428 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000429 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000430 while (*s && isspace(Py_CHARMASK(*s)))
431 s++;
432 if (s[0] == '\0') {
433 PyErr_SetString(PyExc_ValueError,
434 "empty string for complex()");
435 return NULL;
436 }
437
438 z = -1.0;
439 sign = 1;
440 do {
441
442 switch (*s) {
443
444 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000445 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000446 PyErr_SetString(
447 PyExc_ValueError,
448 "null byte in argument for complex()");
449 return NULL;
450 }
451 if(!done) sw_error=1;
452 break;
453
454 case '-':
455 sign = -1;
456 /* Fallthrough */
457 case '+':
458 if (done) sw_error=1;
459 s++;
460 if ( *s=='\0'||*s=='+'||*s=='-' ||
461 isspace(Py_CHARMASK(*s)) ) sw_error=1;
462 break;
463
464 case 'J':
465 case 'j':
466 if (got_im || done) {
467 sw_error = 1;
468 break;
469 }
470 if (z<0.0) {
471 y=sign;
472 }
473 else{
474 y=sign*z;
475 }
476 got_im=1;
477 s++;
478 if (*s!='+' && *s!='-' )
479 done=1;
480 break;
481
482 default:
483 if (isspace(Py_CHARMASK(*s))) {
484 while (*s && isspace(Py_CHARMASK(*s)))
485 s++;
486 if (s[0] != '\0')
487 sw_error=1;
488 else
489 done = 1;
490 break;
491 }
492 digit_or_dot =
493 (*s=='.' || isdigit(Py_CHARMASK(*s)));
494 if (done||!digit_or_dot) {
495 sw_error=1;
496 break;
497 }
498 errno = 0;
499 PyFPE_START_PROTECT("strtod", return 0)
500 z = strtod(s, &end) ;
501 PyFPE_END_PROTECT(z)
502 if (errno != 0) {
503 sprintf(buffer,
504 "float() out of range: %.150s", s);
505 PyErr_SetString(
506 PyExc_ValueError,
507 buffer);
508 return NULL;
509 }
510 s=end;
511 if (*s=='J' || *s=='j') {
512
513 break;
514 }
515 if (got_re) {
516 sw_error=1;
517 break;
518 }
519
520 /* accept a real part */
521 x=sign*z;
522 got_re=1;
523 if (got_im) done=1;
524 z = -1.0;
525 sign = 1;
526 break;
527
528 } /* end of switch */
529
530 } while (*s!='\0' && !sw_error);
531
532 if (sw_error) {
533 PyErr_SetString(PyExc_ValueError,
534 "malformed string for complex()");
535 return NULL;
536 }
537
538 return PyComplex_FromDoubles(x,y);
539}
540
541static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000542builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000543{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 PyObject *r, *i, *tmp;
545 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000546 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000547 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000548
549 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000551 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000552 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000553 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000554 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000555 nbr->nb_float == NULL ||
556 (i != NULL &&
557 ((nbi = i->ob_type->tp_as_number) == NULL ||
558 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000560 "complex() argument can't be converted to complex");
561 return NULL;
562 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000563 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 if (PyInstance_Check(r)) {
565 static PyObject *complexstr;
566 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000567 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000568 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000569 if (complexstr == NULL)
570 return NULL;
571 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000573 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000575 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000577 if (args == NULL)
578 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 r = PyEval_CallObject(f, args);
580 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000581 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000582 if (r == NULL)
583 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000584 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000585 }
586 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 if (PyComplex_Check(r)) {
588 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000589 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000591 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000592 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000593 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000594 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000595 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000597 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000598 if (tmp == NULL)
599 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 cr.real = PyFloat_AsDouble(tmp);
601 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000602 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000603 }
604 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000605 ci.real = 0.0;
606 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000607 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 else if (PyComplex_Check(i))
609 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000610 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000611 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000612 if (tmp == NULL)
613 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 ci.real = PyFloat_AsDouble(tmp);
615 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000616 ci.imag = 0.;
617 }
618 cr.real -= ci.imag;
619 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000621}
622
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000623static char complex_doc[] =
624"complex(real[, imag]) -> complex number\n\
625\n\
626Create a complex number from a real part and an optional imaginary part.\n\
627This is equivalent to (real + imag*1j) where imag defaults to 0.";
628
629
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000630#endif
631
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000633builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000634{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000635 static char *attrlist[] = {"__members__", "__methods__", NULL};
636 PyObject *v = NULL, *l = NULL, *m = NULL;
637 PyObject *d, *x;
638 int i;
639 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000642 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000643 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000644 x = PyEval_GetLocals();
645 if (x == NULL)
646 goto error;
647 l = PyMapping_Keys(x);
648 if (l == NULL)
649 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000650 }
651 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000653 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000654 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000655 else {
656 l = PyMapping_Keys(d);
657 if (l == NULL)
658 PyErr_Clear();
659 Py_DECREF(d);
660 }
661 if (l == NULL) {
662 l = PyList_New(0);
663 if (l == NULL)
664 goto error;
665 }
666 for (s = attrlist; *s != NULL; s++) {
667 m = PyObject_GetAttrString(v, *s);
668 if (m == NULL) {
669 PyErr_Clear();
670 continue;
671 }
672 for (i = 0; ; i++) {
673 x = PySequence_GetItem(m, i);
674 if (x == NULL) {
675 PyErr_Clear();
676 break;
677 }
678 if (PyList_Append(l, x) != 0) {
679 Py_DECREF(x);
680 Py_DECREF(m);
681 goto error;
682 }
683 Py_DECREF(x);
684 }
685 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000686 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000687 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000688 if (PyList_Sort(l) != 0)
689 goto error;
690 return l;
691 error:
692 Py_XDECREF(l);
693 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000694}
695
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000696static char dir_doc[] =
697"dir([object]) -> list of strings\n\
698\n\
699Return an alphabetized list of names comprising (some of) the attributes\n\
700of the given object. Without an argument, the names in the current scope\n\
701are listed. With an instance argument, only the instance attributes are\n\
702returned. With a class argument, attributes of the base class are not\n\
703returned. For other types or arguments, this may list members or methods.";
704
705
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000707builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000708{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000710
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000712 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000713 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000714}
715
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000716static char divmod_doc[] =
717"divmod(x, y) -> (div, mod)\n\
718\n\
719Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
720
721
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000723builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000724{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 PyObject *cmd;
726 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000727 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000728
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000730 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000731 &PyDict_Type, &globals,
732 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000733 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 if (globals == Py_None) {
735 globals = PyEval_GetGlobals();
736 if (locals == Py_None)
737 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000738 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000740 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000741 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
742 if (PyDict_SetItemString(globals, "__builtins__",
743 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000744 return NULL;
745 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (PyCode_Check(cmd))
747 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000748 if (!PyString_Check(cmd) &&
749 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000751 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000752 return NULL;
753 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000754 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000755 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000756 while (*str == ' ' || *str == '\t')
757 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000758 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000759}
760
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000761static char eval_doc[] =
762"eval(source[, globals[, locals]]) -> value\n\
763\n\
764Evaluate the source in the context of globals and locals.\n\
765The source may be a string representing a Python expression\n\
766or a code object as returned by compile().\n\
767The globals and locals are dictionaries, defaulting to the current\n\
768globals and locals. If only globals is given, locals defaults to it.";
769
770
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000772builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000773{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000774 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 PyObject *globals = Py_None, *locals = Py_None;
776 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000777 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000778
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000780 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 &PyDict_Type, &globals,
782 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000783 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 if (globals == Py_None) {
785 globals = PyEval_GetGlobals();
786 if (locals == Py_None)
787 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000790 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
792 if (PyDict_SetItemString(globals, "__builtins__",
793 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000794 return NULL;
795 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000799 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000801 return NULL;
802 }
Guido van Rossum0df002c2000-08-27 19:21:52 +0000803 res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000805}
806
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000807static char execfile_doc[] =
808"execfile(filename[, globals[, locals]])\n\
809\n\
810Read and execute a Python script from a file.\n\
811The globals and locals are dictionaries, defaulting to the current\n\
812globals and locals. If only globals is given, locals defaults to it.";
813
814
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000816builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000817{
Guido van Rossum950ff291998-06-29 13:38:57 +0000818 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000821 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000822 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000823 result = PyObject_GetAttr(v, name);
824 if (result == NULL && dflt != NULL) {
825 PyErr_Clear();
826 Py_INCREF(dflt);
827 result = dflt;
828 }
829 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000830}
831
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000832static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000833"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000834\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000835Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
836When a default argument is given, it is returned when the attribute doesn't\n\
837exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000838
839
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000841builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000842{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000844
Guido van Rossum43713e52000-02-29 13:59:29 +0000845 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000846 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 d = PyEval_GetGlobals();
848 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000849 return d;
850}
851
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000852static char globals_doc[] =
853"globals() -> dictionary\n\
854\n\
855Return the dictionary containing the current scope's global variables.";
856
857
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000859builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000860{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861 PyObject *v;
862 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000863
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000864 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000865 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000867 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000869 Py_INCREF(Py_False);
870 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000871 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000873 Py_INCREF(Py_True);
874 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000875}
876
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000877static char hasattr_doc[] =
878"hasattr(object, name) -> Boolean\n\
879\n\
880Return whether the object has an attribute with the given name.\n\
881(This is done by calling getattr(object, name) and catching exceptions.)";
882
883
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000885builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000886{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000890 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000891 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000892}
893
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000894static char id_doc[] =
895"id(object) -> integer\n\
896\n\
897Return the identity of an object. This is guaranteed to be unique among\n\
898simultaneously existing objects. (Hint: it's the object's memory address.)";
899
900
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000902builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000903{
904 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *seq;
906 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000907 int len;
908 } sequence;
909
Guido van Rossum79f25d91997-04-29 20:08:16 +0000910 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000911 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000913 register int i, j;
914
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 PyErr_SetString(PyExc_TypeError,
918 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000919 return NULL;
920 }
921
Guido van Rossum79f25d91997-04-29 20:08:16 +0000922 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000923 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000924
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000925 if (func == Py_None && n == 1) {
926 /* map(None, S) is the same as list(S). */
927 return PySequence_List(PyTuple_GetItem(args, 1));
928 }
929
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
931 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000932 goto Fail_2;
933 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000934
Guido van Rossum2d951851994-08-29 12:52:16 +0000935 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000936 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000937 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000938
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000940 goto Fail_2;
941
Guido van Rossum09df08a1998-05-22 00:51:39 +0000942 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
943 if (sqf == NULL ||
944 sqf->sq_length == NULL ||
945 sqf->sq_item == NULL)
946 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000947 static char errmsg[] =
948 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000949 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000950
951 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000953 goto Fail_2;
954 }
955
956 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
957 goto Fail_2;
958
959 if (curlen > len)
960 len = curlen;
961 }
962
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000964 goto Fail_2;
965
Guido van Rossum2d951851994-08-29 12:52:16 +0000966 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000968 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000969
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000971 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000972 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000974 goto Fail_1;
975 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000976
977 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000978 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000979 Py_INCREF(Py_None);
980 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000981 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000982 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000983 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000984 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000985 if (PyErr_ExceptionMatches(
986 PyExc_IndexError))
987 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 PyErr_Clear();
989 Py_INCREF(Py_None);
990 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000991 sqp->len = -1;
992 }
993 else {
994 goto Fail_0;
995 }
996 }
997 else
998 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000999
Guido van Rossum12d12c51993-10-26 17:58:25 +00001000 }
Guido van Rossum32120311995-07-10 13:52:21 +00001001 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001002 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 if (PyTuple_SetItem(alist, j, item) < 0) {
1004 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001005 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001006 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001007 continue;
1008
1009 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001010 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001011 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001012 }
1013
Guido van Rossum32120311995-07-10 13:52:21 +00001014 if (!alist)
1015 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001016
1017 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001019 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001020 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001021
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001023 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001024 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 value = PyEval_CallObject(func, alist);
1026 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001027 if (value == NULL)
1028 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001029 }
1030 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001031 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001032 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001033 if (status < 0)
1034 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001035 }
1036 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001038 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001039 }
1040 }
1041
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001042 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1043 goto Fail_1;
1044
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001046 return result;
1047
Guido van Rossum12d12c51993-10-26 17:58:25 +00001048Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001050Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001052 return NULL;
1053}
1054
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001055static char map_doc[] =
1056"map(function, sequence[, sequence, ...]) -> list\n\
1057\n\
1058Return a list of the results of applying the function to the items of\n\
1059the argument sequence(s). If more than one sequence is given, the\n\
1060function is called with an argument list consisting of the corresponding\n\
1061item of each sequence, substituting None for missing values when not all\n\
1062sequences have the same length. If the function is None, return a list of\n\
1063the items of the sequence (or a list of tuples if more than one sequence).";
1064
1065
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001067builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001068{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001069 PyObject *v;
1070 PyObject *name;
1071 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001072
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001073 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001074 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001076 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 Py_INCREF(Py_None);
1078 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001079}
1080
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001081static char setattr_doc[] =
1082"setattr(object, name, value)\n\
1083\n\
1084Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1085``x.y = v''.";
1086
1087
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001089builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001090{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 PyObject *v;
1092 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001093
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001094 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001095 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001097 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 Py_INCREF(Py_None);
1099 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001100}
1101
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001102static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001103"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001104\n\
1105Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1106``del x.y''.";
1107
1108
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001110builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001111{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001113 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001114
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001116 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001118 if (x == -1)
1119 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001121}
1122
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001123static char hash_doc[] =
1124"hash(object) -> integer\n\
1125\n\
1126Return a hash value for the object. Two objects with the same value have\n\
1127the same hash value. The reverse is not necessarily true, but likely.";
1128
1129
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001131builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001132{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 PyObject *v;
1134 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001135
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001137 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001138
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001139 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001140 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001142 "hex() argument can't be converted to hex");
1143 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001144 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001145 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001146}
1147
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001148static char hex_doc[] =
1149"hex(number) -> string\n\
1150\n\
1151Return the hexadecimal representation of an integer or long integer.";
1152
1153
Tim Petersdbd9ba62000-07-09 03:09:57 +00001154static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001155
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001157builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001158{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 PyObject *res;
1162 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001163
1164 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001165 if (line == NULL)
1166 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168 return NULL;
1169 while (*str == ' ' || *str == '\t')
1170 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 globals = PyEval_GetGlobals();
1172 locals = PyEval_GetLocals();
1173 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1174 if (PyDict_SetItemString(globals, "__builtins__",
1175 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001176 return NULL;
1177 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001178 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001181}
1182
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001183static char input_doc[] =
1184"input([prompt]) -> value\n\
1185\n\
1186Equivalent to eval(raw_input(prompt)).";
1187
1188
Guido van Rossume8811f81997-02-14 15:48:05 +00001189static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001190builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001191{
1192 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001193 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001194 return NULL;
1195 Py_INCREF(s);
1196 PyString_InternInPlace(&s);
1197 return s;
1198}
1199
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001200static char intern_doc[] =
1201"intern(string) -> string\n\
1202\n\
1203``Intern'' the given string. This enters the string in the (global)\n\
1204table of interned strings whose purpose is to speed up dictionary lookups.\n\
1205Return the string itself or the previously interned string object with the\n\
1206same value.";
1207
1208
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001210builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001211{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001213 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001214
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001215 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001216 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001217 if (base == -909)
1218 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001219 else if (PyString_Check(v))
1220 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1221 else if (PyUnicode_Check(v))
1222 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1223 PyUnicode_GET_SIZE(v),
1224 base);
1225 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001226 PyErr_SetString(PyExc_TypeError,
1227 "can't convert non-string with explicit base");
1228 return NULL;
1229 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001230}
1231
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001232static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001233"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001234\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001235Convert a string or number to an integer, if possible. A floating point\n\
1236argument will be truncated towards zero (this does not include a string\n\
1237representation of a floating point number!) When converting a string, use\n\
1238the optional base. It is an error to supply a base when converting a\n\
1239non-string.";
1240
1241
1242static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001243builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001244{
1245 PyObject *v;
1246 int base = -909; /* unlikely! */
1247
1248 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1249 return NULL;
1250 if (base == -909)
1251 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001252 else if (PyString_Check(v))
1253 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1254 else if (PyUnicode_Check(v))
1255 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1256 PyUnicode_GET_SIZE(v),
1257 base);
1258 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001259 PyErr_SetString(PyExc_TypeError,
1260 "can't convert non-string with explicit base");
1261 return NULL;
1262 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001263}
1264
1265static char long_doc[] =
1266"long(x) -> long integer\n\
1267long(x, base) -> long integer\n\
1268\n\
1269Convert a string or number to a long integer, if possible. A floating\n\
1270point argument will be truncated towards zero (this does not include a\n\
1271string representation of a floating point number!) When converting a\n\
1272string, use the given base. It is an error to supply a base when\n\
1273converting a non-string.";
1274
1275
1276static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001277builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001278{
1279 PyObject *v;
1280
1281 if (!PyArg_ParseTuple(args, "O:float", &v))
1282 return NULL;
1283 if (PyString_Check(v))
1284 return PyFloat_FromString(v, NULL);
1285 return PyNumber_Float(v);
1286}
1287
1288static char float_doc[] =
1289"float(x) -> floating point number\n\
1290\n\
1291Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001292
1293
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001295builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001296{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001298 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001301 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001302 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001303 if (res < 0 && PyErr_Occurred())
1304 return NULL;
1305 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001306}
1307
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001308static char len_doc[] =
1309"len(object) -> integer\n\
1310\n\
1311Return the number of items of a sequence or mapping.";
1312
1313
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001315builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001316{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001320 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001321 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001322}
1323
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001324static char list_doc[] =
1325"list(sequence) -> list\n\
1326\n\
1327Return a new list whose items are the same as those of the argument sequence.";
1328
Guido van Rossum8861b741996-07-30 16:49:37 +00001329
1330static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001331builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001332{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001333 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001334
Guido van Rossum09df08a1998-05-22 00:51:39 +00001335 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001336
Guido van Rossum09df08a1998-05-22 00:51:39 +00001337 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1338 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001339
Guido van Rossum09df08a1998-05-22 00:51:39 +00001340 /* This swapping of stop and start is to maintain similarity with
1341 range(). */
1342 if (stop == NULL) {
1343 stop = start;
1344 start = NULL;
1345 }
1346 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001347}
1348
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001349static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001350"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001351\n\
1352Create a slice object. This is used for slicing by the Numeric extensions.";
1353
1354
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001356builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001357{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001359
Guido van Rossum43713e52000-02-29 13:59:29 +00001360 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001361 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 d = PyEval_GetLocals();
1363 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001364 return d;
1365}
1366
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001367static char locals_doc[] =
1368"locals() -> dictionary\n\
1369\n\
1370Return the dictionary containing the current scope's local variables.";
1371
1372
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001374min_max(PyObject *args, int sign)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001375{
Guido van Rossum2d951851994-08-29 12:52:16 +00001376 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 PyObject *v, *w, *x;
1378 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001381 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001384 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001385 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386 PyErr_SetString(PyExc_TypeError,
1387 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001388 return NULL;
1389 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001390 w = NULL;
1391 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001393 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001394 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001396 break;
1397 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001399 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001400 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001401 if (w == NULL)
1402 w = x;
1403 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001404 int c = PyObject_Compare(x, w);
1405 if (c && PyErr_Occurred()) {
1406 Py_DECREF(x);
1407 Py_XDECREF(w);
1408 return NULL;
1409 }
1410 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001412 w = x;
1413 }
1414 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001415 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001416 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001417 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001418 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419 PyErr_SetString(PyExc_ValueError,
1420 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001421 return w;
1422}
1423
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001425builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001426{
1427 return min_max(v, -1);
1428}
1429
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001430static char min_doc[] =
1431"min(sequence) -> value\n\
1432min(a, b, c, ...) -> value\n\
1433\n\
1434With a single sequence argument, return its smallest item.\n\
1435With two or more arguments, return the smallest argument.";
1436
1437
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001439builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001440{
1441 return min_max(v, 1);
1442}
1443
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001444static char max_doc[] =
1445"max(sequence) -> value\n\
1446max(a, b, c, ...) -> value\n\
1447\n\
1448With a single sequence argument, return its largest item.\n\
1449With two or more arguments, return the largest argument.";
1450
1451
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001453builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001454{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 PyObject *v;
1456 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001457
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001459 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001460 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1461 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001463 "oct() argument can't be converted to oct");
1464 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001465 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001466 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001467}
1468
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001469static char oct_doc[] =
1470"oct(number) -> string\n\
1471\n\
1472Return the octal representation of an integer or long integer.";
1473
1474
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001476builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001477{
Guido van Rossum2d951851994-08-29 12:52:16 +00001478 char *name;
1479 char *mode = "r";
1480 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001482
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001484 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001485 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001486 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001487 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001488 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001489}
1490
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001491static char open_doc[] =
1492"open(filename[, mode[, buffering]]) -> file object\n\
1493\n\
1494Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1495writing or appending. The file will be created if it doesn't exist\n\
1496when opened for writing or appending; it will be truncated when\n\
1497opened for writing. Add a 'b' to the mode for binary files.\n\
1498Add a '+' to the mode to allow simultaneous reading and writing.\n\
1499If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1500buffered, and larger numbers specify the buffer size.";
1501
1502
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001504builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001505{
Guido van Rossum09095f32000-03-10 23:00:52 +00001506 PyObject *obj;
1507 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001508 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001509
Guido van Rossum09095f32000-03-10 23:00:52 +00001510 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001511 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001512
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001513 if (PyString_Check(obj)) {
1514 size = PyString_GET_SIZE(obj);
1515 if (size == 1)
1516 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
1517 } else if (PyUnicode_Check(obj)) {
1518 size = PyUnicode_GET_SIZE(obj);
1519 if (size == 1)
1520 ord = (long)*PyUnicode_AS_UNICODE(obj);
1521 } else {
1522 PyErr_Format(PyExc_TypeError,
Fred Drake078b24f2000-04-13 02:42:50 +00001523 "expected string or Unicode character, " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001524 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001525 return NULL;
1526 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001527 if (size == 1)
1528 return PyInt_FromLong(ord);
Guido van Rossum09095f32000-03-10 23:00:52 +00001529
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001530 PyErr_Format(PyExc_TypeError,
1531 "expected a character, length-%d string found",
1532 size);
1533 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001534}
1535
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001536static char ord_doc[] =
1537"ord(c) -> integer\n\
1538\n\
Fred Drake078b24f2000-04-13 02:42:50 +00001539Return the integer ordinal of a one character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001540
1541
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001543builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001544{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001545 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001546
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001548 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001549 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001550}
1551
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001552static char pow_doc[] =
1553"pow(x, y[, z]) -> number\n\
1554\n\
1555With two arguments, equivalent to x**y. With three arguments,\n\
1556equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1557
1558
Guido van Rossum124eff01999-02-23 16:11:01 +00001559/* Return number of items in range/xrange (lo, hi, step). step > 0
1560 * required. Return a value < 0 if & only if the true value is too
1561 * large to fit in a signed long.
1562 */
1563static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001564get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001565{
1566 /* -------------------------------------------------------------
1567 If lo >= hi, the range is empty.
1568 Else if n values are in the range, the last one is
1569 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1570 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1571 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1572 the RHS is non-negative and so truncation is the same as the
1573 floor. Letting M be the largest positive long, the worst case
1574 for the RHS numerator is hi=M, lo=-M-1, and then
1575 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1576 precision to compute the RHS exactly.
1577 ---------------------------------------------------------------*/
1578 long n = 0;
1579 if (lo < hi) {
1580 unsigned long uhi = (unsigned long)hi;
1581 unsigned long ulo = (unsigned long)lo;
1582 unsigned long diff = uhi - ulo - 1;
1583 n = (long)(diff / (unsigned long)step + 1);
1584 }
1585 return n;
1586}
1587
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001589builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001590{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001591 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001592 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001593 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001594
Guido van Rossum79f25d91997-04-29 20:08:16 +00001595 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001596
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 if (PyTuple_Size(args) <= 1) {
1598 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001599 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001600 &ihigh))
1601 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001602 }
1603 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001605 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001606 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001607 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001608 }
1609 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001610 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001611 return NULL;
1612 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001613 if (istep > 0)
1614 bign = get_len_of_range(ilow, ihigh, istep);
1615 else
1616 bign = get_len_of_range(ihigh, ilow, -istep);
1617 n = (int)bign;
1618 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001619 PyErr_SetString(PyExc_OverflowError,
Guido van Rossum124eff01999-02-23 16:11:01 +00001620 "range() has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001621 return NULL;
1622 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001623 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001624 if (v == NULL)
1625 return NULL;
1626 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001627 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001628 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001629 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001630 return NULL;
1631 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001632 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001633 ilow += istep;
1634 }
1635 return v;
1636}
1637
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001638static char range_doc[] =
1639"range([start,] stop[, step]) -> list of integers\n\
1640\n\
1641Return a list containing an arithmetic progression of integers.\n\
1642range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1643When step is given, it specifies the increment (or decrement).\n\
1644For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1645These are exactly the valid indices for a list of 4 elements.";
1646
1647
Guido van Rossum79f25d91997-04-29 20:08:16 +00001648static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001649builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001650{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001651 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001652 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001653
Guido van Rossum79f25d91997-04-29 20:08:16 +00001654 if (PyTuple_Size(args) <= 1) {
1655 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001656 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001657 &ihigh))
1658 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001659 }
1660 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001662 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001664 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001665 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001666 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001667 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001668 return NULL;
1669 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001670 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001671 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001672 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001673 n = get_len_of_range(ihigh, ilow, -istep);
1674 if (n < 0) {
1675 PyErr_SetString(PyExc_OverflowError,
1676 "xrange() has more than sys.maxint items");
1677 return NULL;
1678 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001680}
1681
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001682static char xrange_doc[] =
1683"xrange([start,] stop[, step]) -> xrange object\n\
1684\n\
1685Like range(), but instead of returning a list, returns an object that\n\
1686generates the numbers in the range on demand. This is slightly slower\n\
1687than range() but more memory efficient.";
1688
1689
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001691builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001692{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001693 PyObject *v = NULL;
1694 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001695
Guido van Rossum79f25d91997-04-29 20:08:16 +00001696 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001697 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001698 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1699 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001700 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001702 char *prompt;
1703 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001705 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001706 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001707 if (po == NULL)
1708 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001709 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001710 if (prompt == NULL)
1711 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001712 }
1713 else {
1714 po = NULL;
1715 prompt = "";
1716 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 s = PyOS_Readline(prompt);
1718 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001719 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001720 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001721 return NULL;
1722 }
1723 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001724 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001725 result = NULL;
1726 }
1727 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001728 size_t len = strlen(s);
1729 if (len > INT_MAX) {
1730 PyErr_SetString(PyExc_OverflowError, "input too long");
1731 result = NULL;
1732 }
1733 else {
1734 result = PyString_FromStringAndSize(s, (int)(len-1));
1735 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001736 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001737 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001738 return result;
1739 }
Guido van Rossum90933611991-06-07 16:10:43 +00001740 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001742 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001743 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001744 return NULL;
1745 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001746 if (Py_FlushLine() != 0 ||
1747 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001748 return NULL;
1749 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001750 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001751 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 return NULL;
1754 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001756}
1757
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001758static char raw_input_doc[] =
1759"raw_input([prompt]) -> string\n\
1760\n\
1761Read a string from standard input. The trailing newline is stripped.\n\
1762If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1763On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1764is printed without a trailing newline before reading.";
1765
1766
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001768builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001769{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001770 PyObject *seq, *func, *result = NULL;
1771 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001772 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001773
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001775 return NULL;
1776 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001778
Guido van Rossum09df08a1998-05-22 00:51:39 +00001779 sqf = seq->ob_type->tp_as_sequence;
1780 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001782 "2nd argument to reduce() must be a sequence object");
1783 return NULL;
1784 }
1785
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001787 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788
Guido van Rossum2d951851994-08-29 12:52:16 +00001789 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001791
1792 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 Py_DECREF(args);
1794 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001795 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001796 }
1797
Guido van Rossum2d951851994-08-29 12:52:16 +00001798 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001799 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001801 break;
1802 }
1803 goto Fail;
1804 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001805
Guido van Rossum2d951851994-08-29 12:52:16 +00001806 if (result == NULL)
1807 result = op2;
1808 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 PyTuple_SetItem(args, 0, result);
1810 PyTuple_SetItem(args, 1, op2);
1811 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001812 goto Fail;
1813 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001814 }
1815
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001817
Guido van Rossum2d951851994-08-29 12:52:16 +00001818 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001820 "reduce of empty sequence with no initial value");
1821
Guido van Rossum12d12c51993-10-26 17:58:25 +00001822 return result;
1823
Guido van Rossum2d951851994-08-29 12:52:16 +00001824Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 Py_XDECREF(args);
1826 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001827 return NULL;
1828}
1829
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001830static char reduce_doc[] =
1831"reduce(function, sequence[, initial]) -> value\n\
1832\n\
1833Apply a function of two arguments cumulatively to the items of a sequence,\n\
1834from left to right, so as to reduce the sequence to a single value.\n\
1835For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1836((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1837of the sequence in the calculation, and serves as a default when the\n\
1838sequence is empty.";
1839
1840
Guido van Rossum79f25d91997-04-29 20:08:16 +00001841static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001842builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001843{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001845
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001847 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001849}
1850
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001851static char reload_doc[] =
1852"reload(module) -> module\n\
1853\n\
1854Reload the module. The module must have been successfully imported before.";
1855
1856
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001858builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001859{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001861
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001863 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001865}
1866
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001867static char repr_doc[] =
1868"repr(object) -> string\n\
1869\n\
1870Return the canonical string representation of the object.\n\
1871For most object types, eval(repr(object)) == object.";
1872
1873
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001875builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001876{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001877 double x;
1878 double f;
1879 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001880 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001881
Guido van Rossum79f25d91997-04-29 20:08:16 +00001882 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001883 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001884 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001885 i = abs(ndigits);
1886 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001887 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001888 if (ndigits < 0)
1889 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001890 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001891 x *= f;
1892 if (x >= 0.0)
1893 x = floor(x + 0.5);
1894 else
1895 x = ceil(x - 0.5);
1896 if (ndigits < 0)
1897 x *= f;
1898 else
1899 x /= f;
1900 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001901}
1902
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001903static char round_doc[] =
1904"round(number[, ndigits]) -> floating point number\n\
1905\n\
1906Round a number to a given precision in decimal digits (default 0 digits).\n\
1907This always returns a floating point number. Precision may be negative.";
1908
1909
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001911builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001912{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001913 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001914
Guido van Rossum79f25d91997-04-29 20:08:16 +00001915 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001916 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001917 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001918}
1919
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001920static char str_doc[] =
1921"str(object) -> string\n\
1922\n\
1923Return a nice string representation of the object.\n\
1924If the argument is a string, the return value is the same object.";
1925
1926
Guido van Rossum79f25d91997-04-29 20:08:16 +00001927static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001928builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001929{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001930 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001931
Guido van Rossum79f25d91997-04-29 20:08:16 +00001932 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001933 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001934 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001935}
1936
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001937static char tuple_doc[] =
1938"tuple(sequence) -> list\n\
1939\n\
1940Return a tuple whose items are the same as those of the argument sequence.\n\
1941If the argument is a tuple, the return value is the same object.";
1942
1943
Guido van Rossum79f25d91997-04-29 20:08:16 +00001944static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001945builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001946{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001947 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001948
Guido van Rossum79f25d91997-04-29 20:08:16 +00001949 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001950 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001951 v = (PyObject *)v->ob_type;
1952 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001953 return v;
1954}
1955
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001956static char type_doc[] =
1957"type(object) -> type object\n\
1958\n\
1959Return the type of the object.";
1960
1961
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001963builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001964{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001965 PyObject *v = NULL;
1966 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001967
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001969 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001970 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001972 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 if (!PyErr_Occurred())
1974 PyErr_SetString(PyExc_SystemError,
1975 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001976 }
1977 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001978 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001979 }
1980 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001981 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001982 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001983 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001984 "vars() argument must have __dict__ attribute");
1985 return NULL;
1986 }
1987 }
1988 return d;
1989}
1990
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001991static char vars_doc[] =
1992"vars([object]) -> dictionary\n\
1993\n\
1994Without arguments, equivalent to locals().\n\
1995With an argument, equivalent to object.__dict__.";
1996
Guido van Rossum668213d1999-06-16 17:28:37 +00001997static int
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001998abstract_issubclass(PyObject *derived, PyObject *cls, char *err, int first)
Guido van Rossum668213d1999-06-16 17:28:37 +00001999{
2000 static PyObject *__bases__ = NULL;
2001 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002002 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002003 int r = 0;
2004
2005 if (__bases__ == NULL) {
2006 __bases__ = PyString_FromString("__bases__");
2007 if (__bases__ == NULL)
2008 return -1;
2009 }
2010
2011 if (first) {
2012 bases = PyObject_GetAttr(cls, __bases__);
2013 if (bases == NULL || !PyTuple_Check(bases)) {
2014 Py_XDECREF(bases);
2015 PyErr_SetString(PyExc_TypeError, err);
2016 return -1;
2017 }
2018 Py_DECREF(bases);
2019 }
2020
2021 if (derived == cls)
2022 return 1;
2023
2024 bases = PyObject_GetAttr(derived, __bases__);
2025 if (bases == NULL || !PyTuple_Check(bases)) {
2026 Py_XDECREF(bases);
2027 PyErr_SetString(PyExc_TypeError, err);
2028 return -1;
2029 }
2030
2031 n = PyTuple_GET_SIZE(bases);
2032 for (i = 0; i < n; i++) {
2033 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i),
2034 cls, err, 0);
2035 if (r != 0)
2036 break;
2037 }
2038
2039 Py_DECREF(bases);
2040
2041 return r;
2042}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002043
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002044static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002045builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002046{
2047 PyObject *inst;
2048 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002049 PyObject *icls;
2050 static PyObject *__class__ = NULL;
2051 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002052
Guido van Rossum43713e52000-02-29 13:59:29 +00002053 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002054 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002055
Guido van Rossum668213d1999-06-16 17:28:37 +00002056 if (PyClass_Check(cls)) {
2057 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002058 PyObject *inclass =
2059 (PyObject*)((PyInstanceObject*)inst)->in_class;
2060 retval = PyClass_IsSubclass(inclass, cls);
2061 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002062 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002063 else if (PyType_Check(cls)) {
2064 retval = ((PyObject *)(inst->ob_type) == cls);
2065 }
2066 else if (!PyInstance_Check(inst)) {
2067 if (__class__ == NULL) {
2068 __class__ = PyString_FromString("__class__");
2069 if (__class__ == NULL)
2070 return NULL;
2071 }
2072 icls = PyObject_GetAttr(inst, __class__);
2073 if (icls != NULL) {
2074 retval = abstract_issubclass(
2075 icls, cls,
2076 "second argument must be a class",
2077 1);
2078 Py_DECREF(icls);
2079 if (retval < 0)
2080 return NULL;
2081 }
2082 else {
2083 PyErr_SetString(PyExc_TypeError,
2084 "second argument must be a class");
2085 return NULL;
2086 }
2087 }
2088 else {
2089 PyErr_SetString(PyExc_TypeError,
2090 "second argument must be a class");
2091 return NULL;
2092 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002093 return PyInt_FromLong(retval);
2094}
2095
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002096static char isinstance_doc[] =
2097"isinstance(object, class-or-type) -> Boolean\n\
2098\n\
2099Return whether an object is an instance of a class or of a subclass thereof.\n\
2100With a type as second argument, return whether that is the object's type.";
2101
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002102
2103static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002104builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002105{
2106 PyObject *derived;
2107 PyObject *cls;
2108 int retval;
2109
Guido van Rossum43713e52000-02-29 13:59:29 +00002110 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002111 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002112
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002113 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002114 retval = abstract_issubclass(
2115 derived, cls, "arguments must be classes", 1);
2116 if (retval < 0)
2117 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002118 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002119 else {
2120 /* shortcut */
2121 if (!(retval = (derived == cls)))
2122 retval = PyClass_IsSubclass(derived, cls);
2123 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002124
2125 return PyInt_FromLong(retval);
2126}
2127
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002128static char issubclass_doc[] =
2129"issubclass(C, B) -> Boolean\n\
2130\n\
2131Return whether class C is a subclass (i.e., a derived class) of class B.";
2132
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002133
Barry Warsawbd599b52000-08-03 15:45:29 +00002134static PyObject*
2135builtin_zip(PyObject *self, PyObject *args)
2136{
2137 PyObject *ret;
2138 int itemsize = PySequence_Length(args);
2139 int i, j;
2140
2141 if (itemsize < 1) {
2142 PyErr_SetString(PyExc_TypeError,
2143 "at least one sequence is required");
2144 return NULL;
2145 }
2146 /* args must be a tuple */
2147 assert(PyTuple_Check(args));
2148
2149 if ((ret = PyList_New(0)) == NULL)
2150 return NULL;
2151
2152 for (i = 0;; i++) {
2153 PyObject *next = PyTuple_New(itemsize);
2154 if (!next) {
2155 Py_DECREF(ret);
2156 return NULL;
2157 }
2158 for (j = 0; j < itemsize; j++) {
2159 PyObject *seq = PyTuple_GET_ITEM(args, j);
2160 PyObject *item = PySequence_GetItem(seq, i);
2161
2162 if (!item) {
2163 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2164 PyErr_Clear();
2165 Py_DECREF(next);
2166 return ret;
2167 }
2168 Py_DECREF(next);
2169 Py_DECREF(ret);
2170 return NULL;
2171 }
2172 PyTuple_SET_ITEM(next, j, item);
2173 }
2174 PyList_Append(ret, next);
2175 Py_DECREF(next);
2176 }
2177 /* no return */
2178}
2179
2180
2181static char zip_doc[] =
2182"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2183\n\
2184Return a list of tuples, where each tuple contains the i-th element\n\
2185from each of the argument sequences. The returned list is truncated\n\
2186in length to the length of the shortest argument sequence.";
2187
2188
Guido van Rossum79f25d91997-04-29 20:08:16 +00002189static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002190 {"__import__", builtin___import__, 1, import_doc},
2191 {"abs", builtin_abs, 1, abs_doc},
2192 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002193 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002194 {"callable", builtin_callable, 1, callable_doc},
2195 {"chr", builtin_chr, 1, chr_doc},
2196 {"cmp", builtin_cmp, 1, cmp_doc},
2197 {"coerce", builtin_coerce, 1, coerce_doc},
2198 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002199#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002200 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002201#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002202 {"delattr", builtin_delattr, 1, delattr_doc},
2203 {"dir", builtin_dir, 1, dir_doc},
2204 {"divmod", builtin_divmod, 1, divmod_doc},
2205 {"eval", builtin_eval, 1, eval_doc},
2206 {"execfile", builtin_execfile, 1, execfile_doc},
2207 {"filter", builtin_filter, 1, filter_doc},
2208 {"float", builtin_float, 1, float_doc},
2209 {"getattr", builtin_getattr, 1, getattr_doc},
2210 {"globals", builtin_globals, 1, globals_doc},
2211 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2212 {"hash", builtin_hash, 1, hash_doc},
2213 {"hex", builtin_hex, 1, hex_doc},
2214 {"id", builtin_id, 1, id_doc},
2215 {"input", builtin_input, 1, input_doc},
2216 {"intern", builtin_intern, 1, intern_doc},
2217 {"int", builtin_int, 1, int_doc},
2218 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2219 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2220 {"len", builtin_len, 1, len_doc},
2221 {"list", builtin_list, 1, list_doc},
2222 {"locals", builtin_locals, 1, locals_doc},
2223 {"long", builtin_long, 1, long_doc},
2224 {"map", builtin_map, 1, map_doc},
2225 {"max", builtin_max, 1, max_doc},
2226 {"min", builtin_min, 1, min_doc},
2227 {"oct", builtin_oct, 1, oct_doc},
2228 {"open", builtin_open, 1, open_doc},
2229 {"ord", builtin_ord, 1, ord_doc},
2230 {"pow", builtin_pow, 1, pow_doc},
2231 {"range", builtin_range, 1, range_doc},
2232 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2233 {"reduce", builtin_reduce, 1, reduce_doc},
2234 {"reload", builtin_reload, 1, reload_doc},
2235 {"repr", builtin_repr, 1, repr_doc},
2236 {"round", builtin_round, 1, round_doc},
2237 {"setattr", builtin_setattr, 1, setattr_doc},
2238 {"slice", builtin_slice, 1, slice_doc},
2239 {"str", builtin_str, 1, str_doc},
2240 {"tuple", builtin_tuple, 1, tuple_doc},
2241 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002242 {"unicode", builtin_unicode, 1, unicode_doc},
2243 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002244 {"vars", builtin_vars, 1, vars_doc},
2245 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002246 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002247 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002248};
2249
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002250static char builtin_doc[] =
2251"Built-in functions, exceptions, and other objects.\n\
2252\n\
2253Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2254
Guido van Rossum25ce5661997-08-02 03:10:38 +00002255PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002256_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002257{
Fred Drake5550de32000-06-20 04:54:19 +00002258 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002259 mod = Py_InitModule4("__builtin__", builtin_methods,
2260 builtin_doc, (PyObject *)NULL,
2261 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002262 if (mod == NULL)
2263 return NULL;
2264 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002265 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2266 return NULL;
2267 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2268 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002269 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2270 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2271 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002272 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002273 }
2274 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002275
Guido van Rossum25ce5661997-08-02 03:10:38 +00002276 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002277}
2278
Guido van Rossume77a7571993-11-03 15:01:26 +00002279/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002280
Guido van Rossum79f25d91997-04-29 20:08:16 +00002281static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002282filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002283{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002284 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002285 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002286 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002287
Guido van Rossumb7b45621995-08-04 04:07:45 +00002288 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002289 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002290 return tuple;
2291 }
2292
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002294 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002295
Guido van Rossum12d12c51993-10-26 17:58:25 +00002296 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002297 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002298 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002299
Guido van Rossum79f25d91997-04-29 20:08:16 +00002300 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002301 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002302 if (func == Py_None) {
2303 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002304 good = item;
2305 }
2306 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002307 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002308 if (arg == NULL)
2309 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002310 good = PyEval_CallObject(func, arg);
2311 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002312 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002313 goto Fail_1;
2314 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002315 ok = PyObject_IsTrue(good);
2316 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002317 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002318 Py_INCREF(item);
2319 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002320 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002321 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002322 }
2323
Guido van Rossum79f25d91997-04-29 20:08:16 +00002324 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002325 return NULL;
2326
Guido van Rossum12d12c51993-10-26 17:58:25 +00002327 return result;
2328
Guido van Rossum12d12c51993-10-26 17:58:25 +00002329Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002331 return NULL;
2332}
2333
2334
Guido van Rossume77a7571993-11-03 15:01:26 +00002335/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002336
Guido van Rossum79f25d91997-04-29 20:08:16 +00002337static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002338filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002339{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002340 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002341 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002343
Guido van Rossum79f25d91997-04-29 20:08:16 +00002344 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002345 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002346 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002347 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002348 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002350 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002351
Guido van Rossum12d12c51993-10-26 17:58:25 +00002352 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002353 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002354 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002355
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002356 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2357 if (item == NULL)
2358 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002359 arg = Py_BuildValue("(O)", item);
2360 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002361 if (arg == NULL)
2362 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002363 good = PyEval_CallObject(func, arg);
2364 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002365 if (good == NULL)
2366 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002367 ok = PyObject_IsTrue(good);
2368 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002369 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002370 PyString_AS_STRING((PyStringObject *)result)[j++] =
2371 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002372 }
2373
Guido van Rossum79f25d91997-04-29 20:08:16 +00002374 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002375 return NULL;
2376
Guido van Rossum12d12c51993-10-26 17:58:25 +00002377 return result;
2378
Guido van Rossum12d12c51993-10-26 17:58:25 +00002379Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002380 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002381 return NULL;
2382}