blob: e5db11ec7840e8c1c0614ef68c21f25b741bd4e7 [file] [log] [blame]
Andrew M. Kuchling9bcc68c2000-12-20 15:07:34 +00001
Guido van Rossum3f5da241990-12-20 15:06:42 +00002/* Built-in functions */
3
Guido van Rossum79f25d91997-04-29 20:08:16 +00004#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00005
6#include "node.h"
Guido van Rossum5b722181993-03-30 17:46:03 +00007#include "compile.h"
8#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +00009
Guido van Rossum6bf62da1997-04-11 20:37:35 +000010#include <ctype.h>
11
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000012#ifdef HAVE_UNISTD_H
13#include <unistd.h>
14#endif
15
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)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000073 PyErr_Format(PyExc_TypeError,
74 "apply() arg 2 expect sequence, found %s",
75 alist->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000076 return NULL;
77 }
78 t = PySequence_Tuple(alist);
79 if (t == NULL)
80 return NULL;
81 alist = t;
82 }
Guido van Rossum2d951851994-08-29 12:52:16 +000083 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000084 if (kwdict != NULL && !PyDict_Check(kwdict)) {
Jeremy Hyltonc862cf42001-01-19 03:25:05 +000085 PyErr_Format(PyExc_TypeError,
86 "apply() arg 3 expected dictionary, found %s",
87 kwdict->ob_type->tp_name);
Barry Warsaw968f8cb1998-10-01 15:33:12 +000088 goto finally;
Guido van Rossum681d79a1995-07-18 14:51:37 +000089 }
Barry Warsaw968f8cb1998-10-01 15:33:12 +000090 retval = PyEval_CallObjectWithKeywords(func, alist, kwdict);
91 finally:
92 Py_XDECREF(t);
93 return retval;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000094}
95
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000096static char apply_doc[] =
Fred Drakef1fbc622001-01-12 17:05:05 +000097"apply(object[, args[, kwargs]]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +000098\n\
Fred Drake7b912121999-12-23 14:16:55 +000099Call a callable object with positional arguments taken from the tuple args,\n\
100and keyword arguments taken from the optional dictionary kwargs.\n\
101Note that classes are callable, as are instances with a __call__() method.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000102
103
Guido van Rossum79f25d91997-04-29 20:08:16 +0000104static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000105builtin_buffer(PyObject *self, PyObject *args)
Guido van Rossum0daf0221999-03-19 19:07:19 +0000106{
107 PyObject *ob;
108 int offset = 0;
109 int size = Py_END_OF_BUFFER;
110
111 if ( !PyArg_ParseTuple(args, "O|ii:buffer", &ob, &offset, &size) )
112 return NULL;
113 return PyBuffer_FromObject(ob, offset, size);
114}
115
116static char buffer_doc[] =
Guido van Rossum09095f32000-03-10 23:00:52 +0000117"buffer(object [, offset[, size]]) -> object\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000118\n\
Guido van Rossumad991772001-01-12 16:03:05 +0000119Create a new buffer object which references the given object.\n\
Guido van Rossum0daf0221999-03-19 19:07:19 +0000120The buffer will reference a slice of the target object from the\n\
121start of the object (or at the specified offset). The slice will\n\
122extend to the end of the target object (or with the specified size).";
123
124
125static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000126builtin_unicode(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000127{
Guido van Rossum3afba762000-04-11 15:38:23 +0000128 PyObject *v;
Guido van Rossum09095f32000-03-10 23:00:52 +0000129 char *encoding = NULL;
130 char *errors = NULL;
131
Guido van Rossum3afba762000-04-11 15:38:23 +0000132 if ( !PyArg_ParseTuple(args, "O|ss:unicode", &v, &encoding, &errors) )
Guido van Rossum09095f32000-03-10 23:00:52 +0000133 return NULL;
Marc-André Lemburg1b1bcc92000-07-07 13:48:25 +0000134 return PyUnicode_FromEncodedObject(v, encoding, errors);
Guido van Rossum09095f32000-03-10 23:00:52 +0000135}
136
137static char unicode_doc[] =
138"unicode(string [, encoding[, errors]]) -> object\n\
139\n\
Guido van Rossumad991772001-01-12 16:03:05 +0000140Create a new Unicode object from the given encoded string.\n\
Fred Drakec640b182000-05-09 19:55:16 +0000141encoding defaults to the current default string encoding and \n\
142errors, defining the error handling, to 'strict'.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000143
144
145static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000146builtin_callable(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +0000147{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000149
Guido van Rossum79f25d91997-04-29 20:08:16 +0000150 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000151 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000152 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000153}
154
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000155static char callable_doc[] =
156"callable(object) -> Boolean\n\
157\n\
158Return whether the object is callable (i.e., some kind of function).\n\
159Note that classes are callable, as are instances with a __call__() method.";
160
161
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000163builtin_filter(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000164{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 PyObject *func, *seq, *result;
166 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000167 int len;
168 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169
Guido van Rossum79f25d91997-04-29 20:08:16 +0000170 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000171 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000172
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 if (PyString_Check(seq)) {
174 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000175 return r;
176 }
177
Guido van Rossum79f25d91997-04-29 20:08:16 +0000178 if (PyTuple_Check(seq)) {
179 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000180 return r;
181 }
182
Guido van Rossum09df08a1998-05-22 00:51:39 +0000183 sqf = seq->ob_type->tp_as_sequence;
184 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000186 "filter() arg 2 must be a sequence");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000187 goto Fail_2;
188 }
189
190 if ((len = (*sqf->sq_length)(seq)) < 0)
191 goto Fail_2;
192
Guido van Rossum79f25d91997-04-29 20:08:16 +0000193 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
194 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000195 result = seq;
196 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000197 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000199 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000200 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000201
Guido van Rossum2d951851994-08-29 12:52:16 +0000202 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000204 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000205
Guido van Rossum2d951851994-08-29 12:52:16 +0000206 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000207 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000209 break;
210 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000211 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000212 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000213
Guido van Rossum79f25d91997-04-29 20:08:16 +0000214 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000215 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000216 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000217 }
218 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000220 if (arg == NULL)
221 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000222 good = PyEval_CallObject(func, arg);
223 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000224 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000226 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000227 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000228 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000229 ok = PyObject_IsTrue(good);
230 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000231 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000232 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000233 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000234 goto Fail_1;
235 }
236 else {
Barry Warsawfa77e091999-01-28 18:49:12 +0000237 int status = PyList_Append(result, item);
Guido van Rossum2d951851994-08-29 12:52:16 +0000238 j++;
Barry Warsawfa77e091999-01-28 18:49:12 +0000239 Py_DECREF(item);
240 if (status < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000241 goto Fail_1;
242 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000243 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000245 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000246 }
247
Guido van Rossum12d12c51993-10-26 17:58:25 +0000248
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000250 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000251
Guido van Rossum12d12c51993-10-26 17:58:25 +0000252 return result;
253
Guido van Rossum12d12c51993-10-26 17:58:25 +0000254Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000256Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000257 return NULL;
258}
259
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000260static char filter_doc[] =
261"filter(function, sequence) -> list\n\
262\n\
263Return a list containing those items of sequence for which function(item)\n\
264is true. If function is None, return a list of items that are true.";
265
266
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000268builtin_chr(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000269{
270 long x;
271 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000272
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000274 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000275 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000276 PyErr_SetString(PyExc_ValueError,
277 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000278 return NULL;
279 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000280 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000281 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000282}
283
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000284static char chr_doc[] =
285"chr(i) -> character\n\
286\n\
287Return a string of one character with ordinal i; 0 <= i < 256.";
288
289
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000291builtin_unichr(PyObject *self, PyObject *args)
Guido van Rossum09095f32000-03-10 23:00:52 +0000292{
293 long x;
294 Py_UNICODE s[1];
295
296 if (!PyArg_ParseTuple(args, "l:unichr", &x))
297 return NULL;
298 if (x < 0 || x >= 65536) {
299 PyErr_SetString(PyExc_ValueError,
300 "unichr() arg not in range(65536)");
301 return NULL;
302 }
303 s[0] = (Py_UNICODE)x;
304 return PyUnicode_FromUnicode(s, 1);
305}
306
307static char unichr_doc[] =
Fred Drake078b24f2000-04-13 02:42:50 +0000308"unichr(i) -> Unicode character\n\
Guido van Rossum09095f32000-03-10 23:00:52 +0000309\n\
Fred Drake078b24f2000-04-13 02:42:50 +0000310Return a Unicode string of one character with ordinal i; 0 <= i < 65536.";
Guido van Rossum09095f32000-03-10 23:00:52 +0000311
312
313static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000314builtin_cmp(PyObject *self, PyObject *args)
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000315{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000316 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000317 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000318
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000320 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000321 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000322 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000323 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000324}
325
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000326static char cmp_doc[] =
327"cmp(x, y) -> integer\n\
328\n\
329Return negative if x<y, zero if x==y, positive if x>y.";
330
331
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000333builtin_coerce(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000334{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 PyObject *v, *w;
336 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000337
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000339 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000341 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 res = Py_BuildValue("(OO)", v, w);
343 Py_DECREF(v);
344 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000345 return res;
346}
347
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000348static char coerce_doc[] =
349"coerce(x, y) -> None or (x1, y1)\n\
350\n\
351When x and y can be coerced to values of the same type, return a tuple\n\
352containing the coerced values. When they can't be coerced, return None.";
353
354
Guido van Rossum79f25d91997-04-29 20:08:16 +0000355static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000356builtin_compile(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000357{
358 char *str;
359 char *filename;
360 char *startstr;
361 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000362
Guido van Rossum79f25d91997-04-29 20:08:16 +0000363 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000364 return NULL;
365 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000366 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000367 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000368 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000369 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000370 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000371 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000372 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000373 "compile() arg 3 must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000374 return NULL;
375 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000377}
378
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000379static char compile_doc[] =
380"compile(source, filename, mode) -> code object\n\
381\n\
382Compile the source string (a Python module, statement or expression)\n\
383into a code object that can be executed by the exec statement or eval().\n\
384The filename will be used for run-time error messages.\n\
385The mode must be 'exec' to compile a module, 'single' to compile a\n\
386single (interactive) statement, or 'eval' to compile an expression.";
387
388
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000389#ifndef WITHOUT_COMPLEX
390
Guido van Rossum79f25d91997-04-29 20:08:16 +0000391static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000392complex_from_string(PyObject *v)
Guido van Rossum11950231999-03-25 21:16:07 +0000393{
Tim Petersdbd9ba62000-07-09 03:09:57 +0000394 extern double strtod(const char *, char **);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000395 const char *s, *start;
396 char *end;
Guido van Rossum11950231999-03-25 21:16:07 +0000397 double x=0.0, y=0.0, z;
398 int got_re=0, got_im=0, done=0;
399 int digit_or_dot;
400 int sw_error=0;
401 int sign;
402 char buffer[256]; /* For errors */
Barry Warsaw5ca1ef92000-08-18 05:02:16 +0000403 char s_buffer[256];
Guido van Rossum9e896b32000-04-05 20:11:21 +0000404 int len;
Guido van Rossum11950231999-03-25 21:16:07 +0000405
Guido van Rossum9e896b32000-04-05 20:11:21 +0000406 if (PyString_Check(v)) {
407 s = PyString_AS_STRING(v);
408 len = PyString_GET_SIZE(v);
409 }
410 else if (PyUnicode_Check(v)) {
Guido van Rossum9e896b32000-04-05 20:11:21 +0000411 if (PyUnicode_GET_SIZE(v) >= sizeof(s_buffer)) {
412 PyErr_SetString(PyExc_ValueError,
413 "complex() literal too large to convert");
414 return NULL;
415 }
Guido van Rossumad991772001-01-12 16:03:05 +0000416 if (PyUnicode_EncodeDecimal(PyUnicode_AS_UNICODE(v),
Guido van Rossum9e896b32000-04-05 20:11:21 +0000417 PyUnicode_GET_SIZE(v),
Guido van Rossumad991772001-01-12 16:03:05 +0000418 s_buffer,
Guido van Rossum9e896b32000-04-05 20:11:21 +0000419 NULL))
420 return NULL;
421 s = s_buffer;
Trent Mick29b83812000-08-12 21:35:36 +0000422 len = (int)strlen(s);
Guido van Rossum9e896b32000-04-05 20:11:21 +0000423 }
424 else if (PyObject_AsCharBuffer(v, &s, &len)) {
425 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000426 "complex() arg is not a string");
Guido van Rossum9e896b32000-04-05 20:11:21 +0000427 return NULL;
428 }
Guido van Rossum11950231999-03-25 21:16:07 +0000429
430 /* position on first nonblank */
Guido van Rossum9e896b32000-04-05 20:11:21 +0000431 start = s;
Guido van Rossum11950231999-03-25 21:16:07 +0000432 while (*s && isspace(Py_CHARMASK(*s)))
433 s++;
434 if (s[0] == '\0') {
435 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000436 "complex() arg is an empty string");
Guido van Rossum11950231999-03-25 21:16:07 +0000437 return NULL;
438 }
439
440 z = -1.0;
441 sign = 1;
442 do {
Guido van Rossumad991772001-01-12 16:03:05 +0000443
Guido van Rossum11950231999-03-25 21:16:07 +0000444 switch (*s) {
445
446 case '\0':
Guido van Rossum9e896b32000-04-05 20:11:21 +0000447 if (s-start != len) {
Guido van Rossum11950231999-03-25 21:16:07 +0000448 PyErr_SetString(
449 PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000450 "complex() arg contains a null byte");
Guido van Rossum11950231999-03-25 21:16:07 +0000451 return NULL;
452 }
453 if(!done) sw_error=1;
454 break;
Guido van Rossumad991772001-01-12 16:03:05 +0000455
Guido van Rossum11950231999-03-25 21:16:07 +0000456 case '-':
457 sign = -1;
458 /* Fallthrough */
459 case '+':
460 if (done) sw_error=1;
461 s++;
462 if ( *s=='\0'||*s=='+'||*s=='-' ||
463 isspace(Py_CHARMASK(*s)) ) sw_error=1;
464 break;
465
466 case 'J':
467 case 'j':
468 if (got_im || done) {
469 sw_error = 1;
470 break;
471 }
472 if (z<0.0) {
473 y=sign;
474 }
475 else{
476 y=sign*z;
477 }
478 got_im=1;
479 s++;
480 if (*s!='+' && *s!='-' )
481 done=1;
482 break;
483
484 default:
485 if (isspace(Py_CHARMASK(*s))) {
486 while (*s && isspace(Py_CHARMASK(*s)))
487 s++;
488 if (s[0] != '\0')
489 sw_error=1;
490 else
491 done = 1;
492 break;
493 }
494 digit_or_dot =
495 (*s=='.' || isdigit(Py_CHARMASK(*s)));
496 if (done||!digit_or_dot) {
497 sw_error=1;
498 break;
499 }
500 errno = 0;
501 PyFPE_START_PROTECT("strtod", return 0)
502 z = strtod(s, &end) ;
503 PyFPE_END_PROTECT(z)
504 if (errno != 0) {
505 sprintf(buffer,
506 "float() out of range: %.150s", s);
507 PyErr_SetString(
508 PyExc_ValueError,
509 buffer);
510 return NULL;
511 }
512 s=end;
513 if (*s=='J' || *s=='j') {
Guido van Rossumad991772001-01-12 16:03:05 +0000514
Guido van Rossum11950231999-03-25 21:16:07 +0000515 break;
516 }
517 if (got_re) {
518 sw_error=1;
519 break;
520 }
521
522 /* accept a real part */
523 x=sign*z;
524 got_re=1;
525 if (got_im) done=1;
526 z = -1.0;
527 sign = 1;
528 break;
Guido van Rossumad991772001-01-12 16:03:05 +0000529
Guido van Rossum11950231999-03-25 21:16:07 +0000530 } /* end of switch */
531
532 } while (*s!='\0' && !sw_error);
533
534 if (sw_error) {
535 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +0000536 "complex() arg is a malformed string");
Guido van Rossum11950231999-03-25 21:16:07 +0000537 return NULL;
538 }
539
540 return PyComplex_FromDoubles(x,y);
541}
542
543static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000544builtin_complex(PyObject *self, PyObject *args)
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000545{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 PyObject *r, *i, *tmp;
547 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000548 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000549 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000550
551 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000553 return NULL;
Guido van Rossum9e896b32000-04-05 20:11:21 +0000554 if (PyString_Check(r) || PyUnicode_Check(r))
Guido van Rossum11950231999-03-25 21:16:07 +0000555 return complex_from_string(r);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000556 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000557 nbr->nb_float == NULL ||
558 (i != NULL &&
559 ((nbi = i->ob_type->tp_as_number) == NULL ||
560 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000562 "complex() arg can't be converted to complex");
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000563 return NULL;
564 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000565 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566 if (PyInstance_Check(r)) {
567 static PyObject *complexstr;
568 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000569 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000570 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000571 if (complexstr == NULL)
572 return NULL;
573 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000574 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000575 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000577 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000579 if (args == NULL)
580 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 r = PyEval_CallObject(f, args);
582 Py_DECREF(args);
Barry Warsawf988e681999-01-27 23:13:59 +0000583 Py_DECREF(f);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000584 if (r == NULL)
585 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000586 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000587 }
588 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589 if (PyComplex_Check(r)) {
590 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000591 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000593 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000594 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000595 else {
Guido van Rossum8dabbf12001-01-19 02:11:59 +0000596 tmp = PyNumber_Float(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000597 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000599 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000600 if (tmp == NULL)
601 return NULL;
Guido van Rossum8dabbf12001-01-19 02:11:59 +0000602 if (!PyFloat_Check(tmp)) {
603 PyErr_SetString(PyExc_TypeError,
604 "float(r) didn't return a float");
605 Py_DECREF(tmp);
606 return NULL;
607 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 cr.real = PyFloat_AsDouble(tmp);
609 Py_DECREF(tmp);
Guido van Rossum11950231999-03-25 21:16:07 +0000610 cr.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000611 }
612 if (i == NULL) {
Guido van Rossum11950231999-03-25 21:16:07 +0000613 ci.real = 0.0;
614 ci.imag = 0.0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000615 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 else if (PyComplex_Check(i))
617 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000618 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000619 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000620 if (tmp == NULL)
621 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000622 ci.real = PyFloat_AsDouble(tmp);
623 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000624 ci.imag = 0.;
625 }
626 cr.real -= ci.imag;
627 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000629}
630
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000631static char complex_doc[] =
632"complex(real[, imag]) -> complex number\n\
633\n\
634Create a complex number from a real part and an optional imaginary part.\n\
635This is equivalent to (real + imag*1j) where imag defaults to 0.";
636
637
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000638#endif
639
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000641builtin_dir(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000642{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000643 static char *attrlist[] = {"__members__", "__methods__", NULL};
644 PyObject *v = NULL, *l = NULL, *m = NULL;
645 PyObject *d, *x;
646 int i;
647 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000648
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000650 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000651 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000652 x = PyEval_GetLocals();
653 if (x == NULL)
654 goto error;
655 l = PyMapping_Keys(x);
656 if (l == NULL)
657 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000658 }
659 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000660 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000661 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000662 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000663 else {
664 l = PyMapping_Keys(d);
665 if (l == NULL)
666 PyErr_Clear();
667 Py_DECREF(d);
668 }
669 if (l == NULL) {
670 l = PyList_New(0);
671 if (l == NULL)
672 goto error;
673 }
674 for (s = attrlist; *s != NULL; s++) {
675 m = PyObject_GetAttrString(v, *s);
676 if (m == NULL) {
677 PyErr_Clear();
678 continue;
679 }
680 for (i = 0; ; i++) {
681 x = PySequence_GetItem(m, i);
682 if (x == NULL) {
683 PyErr_Clear();
684 break;
685 }
686 if (PyList_Append(l, x) != 0) {
687 Py_DECREF(x);
688 Py_DECREF(m);
689 goto error;
690 }
691 Py_DECREF(x);
692 }
693 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000694 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000695 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000696 if (PyList_Sort(l) != 0)
697 goto error;
698 return l;
699 error:
700 Py_XDECREF(l);
701 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000702}
703
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000704static char dir_doc[] =
705"dir([object]) -> list of strings\n\
706\n\
707Return an alphabetized list of names comprising (some of) the attributes\n\
708of the given object. Without an argument, the names in the current scope\n\
709are listed. With an instance argument, only the instance attributes are\n\
710returned. With a class argument, attributes of the base class are not\n\
711returned. For other types or arguments, this may list members or methods.";
712
713
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000715builtin_divmod(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000716{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000718
Guido van Rossum79f25d91997-04-29 20:08:16 +0000719 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000720 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000721 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000722}
723
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000724static char divmod_doc[] =
725"divmod(x, y) -> (div, mod)\n\
726\n\
727Return the tuple ((x-x%y)/y, x%y). Invariant: div*y + mod == x.";
728
729
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000731builtin_eval(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000732{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000733 PyObject *cmd;
734 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000735 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000736
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000738 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 &PyDict_Type, &globals,
740 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000741 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if (globals == Py_None) {
743 globals = PyEval_GetGlobals();
744 if (locals == Py_None)
745 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000746 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000748 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
750 if (PyDict_SetItemString(globals, "__builtins__",
751 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000752 return NULL;
753 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 if (PyCode_Check(cmd))
755 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000756 if (!PyString_Check(cmd) &&
757 !PyUnicode_Check(cmd)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +0000759 "eval() arg 1 must be a string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000760 return NULL;
761 }
Marc-André Lemburgd1ba4432000-09-19 21:04:18 +0000762 if (PyString_AsStringAndSize(cmd, &str, NULL))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000763 return NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000764 while (*str == ' ' || *str == '\t')
765 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000766 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000767}
768
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000769static char eval_doc[] =
770"eval(source[, globals[, locals]]) -> value\n\
771\n\
772Evaluate the source in the context of globals and locals.\n\
773The source may be a string representing a Python expression\n\
774or a code object as returned by compile().\n\
775The globals and locals are dictionaries, defaulting to the current\n\
776globals and locals. If only globals is given, locals defaults to it.";
777
778
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000780builtin_execfile(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +0000781{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000782 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyObject *globals = Py_None, *locals = Py_None;
784 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000785 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 &PyDict_Type, &globals,
790 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000791 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 if (globals == Py_None) {
793 globals = PyEval_GetGlobals();
794 if (locals == Py_None)
795 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000796 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000798 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
800 if (PyDict_SetItemString(globals, "__builtins__",
801 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000802 return NULL;
803 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000805 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000807 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000809 return NULL;
810 }
Guido van Rossum0df002c2000-08-27 19:21:52 +0000811 res = PyRun_FileEx(fp, filename, Py_file_input, globals, locals, 1);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000813}
814
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000815static char execfile_doc[] =
816"execfile(filename[, globals[, locals]])\n\
817\n\
818Read and execute a Python script from a file.\n\
819The globals and locals are dictionaries, defaulting to the current\n\
820globals and locals. If only globals is given, locals defaults to it.";
821
822
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000824builtin_getattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +0000825{
Guido van Rossum950ff291998-06-29 13:38:57 +0000826 PyObject *v, *result, *dflt = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000827 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000828
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000829 if (!PyArg_ParseTuple(args, "OO|O:getattr", &v, &name, &dflt))
Guido van Rossum33894be1992-01-27 16:53:09 +0000830 return NULL;
Guido van Rossum950ff291998-06-29 13:38:57 +0000831 result = PyObject_GetAttr(v, name);
832 if (result == NULL && dflt != NULL) {
833 PyErr_Clear();
834 Py_INCREF(dflt);
835 result = dflt;
836 }
837 return result;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838}
839
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000840static char getattr_doc[] =
Guido van Rossum950ff291998-06-29 13:38:57 +0000841"getattr(object, name[, default]) -> value\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000842\n\
Guido van Rossum950ff291998-06-29 13:38:57 +0000843Get a named attribute from an object; getattr(x, 'y') is equivalent to x.y.\n\
844When a default argument is given, it is returned when the attribute doesn't\n\
845exist; without it, an exception is raised in that case.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000846
847
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000849builtin_globals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +0000850{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000852
Guido van Rossum43713e52000-02-29 13:59:29 +0000853 if (!PyArg_ParseTuple(args, ":globals"))
Guido van Rossum872537c1995-07-07 22:43:42 +0000854 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 d = PyEval_GetGlobals();
856 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000857 return d;
858}
859
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000860static char globals_doc[] =
861"globals() -> dictionary\n\
862\n\
863Return the dictionary containing the current scope's global variables.";
864
865
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000867builtin_hasattr(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +0000868{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 PyObject *v;
870 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000871
Marc-André Lemburg691270f2000-09-18 16:22:27 +0000872 if (!PyArg_ParseTuple(args, "OO:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000873 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000875 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000876 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000877 Py_INCREF(Py_False);
878 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000879 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000881 Py_INCREF(Py_True);
882 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000883}
884
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000885static char hasattr_doc[] =
886"hasattr(object, name) -> Boolean\n\
887\n\
888Return whether the object has an attribute with the given name.\n\
889(This is done by calling getattr(object, name) and catching exceptions.)";
890
891
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000893builtin_id(PyObject *self, PyObject *args)
Guido van Rossum5b722181993-03-30 17:46:03 +0000894{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000896
Guido van Rossum79f25d91997-04-29 20:08:16 +0000897 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000898 return NULL;
Guido van Rossum106f2da2000-06-28 21:12:25 +0000899 return PyLong_FromVoidPtr(v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000900}
901
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +0000902static char id_doc[] =
903"id(object) -> integer\n\
904\n\
905Return the identity of an object. This is guaranteed to be unique among\n\
906simultaneously existing objects. (Hint: it's the object's memory address.)";
907
908
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +0000910builtin_map(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000911{
912 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 PyObject *seq;
914 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000915 int len;
916 } sequence;
917
Guido van Rossum79f25d91997-04-29 20:08:16 +0000918 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000919 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000920 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000921 register int i, j;
922
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 PyErr_SetString(PyExc_TypeError,
926 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000927 return NULL;
928 }
929
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000932
Guido van Rossumfa4ac711998-07-10 17:37:30 +0000933 if (func == Py_None && n == 1) {
934 /* map(None, S) is the same as list(S). */
935 return PySequence_List(PyTuple_GetItem(args, 1));
936 }
937
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
939 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000940 goto Fail_2;
941 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000942
Guido van Rossum2d951851994-08-29 12:52:16 +0000943 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000944 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000945 PySequenceMethods *sqf;
Guido van Rossumad991772001-01-12 16:03:05 +0000946
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000948 goto Fail_2;
949
Guido van Rossum09df08a1998-05-22 00:51:39 +0000950 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
951 if (sqf == NULL ||
952 sqf->sq_length == NULL ||
953 sqf->sq_item == NULL)
954 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000955 static char errmsg[] =
956 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000957 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000958
959 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000961 goto Fail_2;
962 }
963
964 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
965 goto Fail_2;
966
967 if (curlen > len)
968 len = curlen;
969 }
970
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000972 goto Fail_2;
973
Guido van Rossum2d951851994-08-29 12:52:16 +0000974 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000976 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000977
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000979 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000980 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000982 goto Fail_1;
983 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000984
985 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000986 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 Py_INCREF(Py_None);
988 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000989 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000990 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000991 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000992 if (item == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000993 if (PyErr_ExceptionMatches(
994 PyExc_IndexError))
995 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000996 PyErr_Clear();
997 Py_INCREF(Py_None);
998 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000999 sqp->len = -1;
1000 }
1001 else {
1002 goto Fail_0;
1003 }
1004 }
1005 else
1006 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001007
Guido van Rossum12d12c51993-10-26 17:58:25 +00001008 }
Guido van Rossum32120311995-07-10 13:52:21 +00001009 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +00001010 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 if (PyTuple_SetItem(alist, j, item) < 0) {
1012 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001013 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +00001014 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001015 continue;
1016
1017 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001019 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001020 }
1021
Guido van Rossum32120311995-07-10 13:52:21 +00001022 if (!alist)
1023 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +00001024
1025 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001026 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +00001027 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001028 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001029
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +00001031 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001032 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 value = PyEval_CallObject(func, alist);
1034 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001035 if (value == NULL)
1036 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001037 }
1038 if (i >= len) {
Barry Warsawfa77e091999-01-28 18:49:12 +00001039 int status = PyList_Append(result, value);
Barry Warsaw21332871999-01-28 04:21:35 +00001040 Py_DECREF(value);
Barry Warsawfa77e091999-01-28 18:49:12 +00001041 if (status < 0)
1042 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +00001043 }
1044 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001046 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001047 }
1048 }
1049
Guido van Rossumfa4ac711998-07-10 17:37:30 +00001050 if (i < len && PyList_SetSlice(result, i, len, NULL) < 0)
1051 goto Fail_1;
1052
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001054 return result;
1055
Guido van Rossum12d12c51993-10-26 17:58:25 +00001056Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001058Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001060 return NULL;
1061}
1062
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001063static char map_doc[] =
1064"map(function, sequence[, sequence, ...]) -> list\n\
1065\n\
1066Return a list of the results of applying the function to the items of\n\
1067the argument sequence(s). If more than one sequence is given, the\n\
1068function is called with an argument list consisting of the corresponding\n\
1069item of each sequence, substituting None for missing values when not all\n\
1070sequences have the same length. If the function is None, return a list of\n\
1071the items of the sequence (or a list of tuples if more than one sequence).";
1072
1073
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001075builtin_setattr(PyObject *self, PyObject *args)
Guido van Rossum33894be1992-01-27 16:53:09 +00001076{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 PyObject *v;
1078 PyObject *name;
1079 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001080
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001081 if (!PyArg_ParseTuple(args, "OOO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +00001082 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +00001084 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 Py_INCREF(Py_None);
1086 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +00001087}
1088
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001089static char setattr_doc[] =
1090"setattr(object, name, value)\n\
1091\n\
1092Set a named attribute on an object; setattr(x, 'y', v) is equivalent to\n\
1093``x.y = v''.";
1094
1095
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001097builtin_delattr(PyObject *self, PyObject *args)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001098{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 PyObject *v;
1100 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101
Marc-André Lemburg691270f2000-09-18 16:22:27 +00001102 if (!PyArg_ParseTuple(args, "OO:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +00001103 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001104 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +00001105 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 Py_INCREF(Py_None);
1107 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +00001108}
1109
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001110static char delattr_doc[] =
Guido van Rossumdf12a591998-11-23 22:13:04 +00001111"delattr(object, name)\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001112\n\
1113Delete a named attribute on an object; delattr(x, 'y') is equivalent to\n\
1114``del x.y''.";
1115
1116
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001118builtin_hash(PyObject *self, PyObject *args)
Guido van Rossum9bfef441993-03-29 10:43:31 +00001119{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +00001121 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001122
Guido van Rossum79f25d91997-04-29 20:08:16 +00001123 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +00001124 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001126 if (x == -1)
1127 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +00001129}
1130
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001131static char hash_doc[] =
1132"hash(object) -> integer\n\
1133\n\
1134Return a hash value for the object. Two objects with the same value have\n\
1135the same hash value. The reverse is not necessarily true, but likely.";
1136
1137
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001139builtin_hex(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001140{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001141 PyObject *v;
1142 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001143
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00001146
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001148 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001150 "hex() argument can't be converted to hex");
1151 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001152 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001153 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001154}
1155
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001156static char hex_doc[] =
1157"hex(number) -> string\n\
1158\n\
1159Return the hexadecimal representation of an integer or long integer.";
1160
1161
Tim Petersdbd9ba62000-07-09 03:09:57 +00001162static PyObject *builtin_raw_input(PyObject *, PyObject *);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001163
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001165builtin_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001166{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001168 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 PyObject *res;
1170 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001171
1172 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +00001173 if (line == NULL)
1174 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001176 return NULL;
1177 while (*str == ' ' || *str == '\t')
1178 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 globals = PyEval_GetGlobals();
1180 locals = PyEval_GetLocals();
1181 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
1182 if (PyDict_SetItemString(globals, "__builtins__",
1183 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +00001184 return NULL;
1185 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +00001186 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001188 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001189}
1190
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001191static char input_doc[] =
1192"input([prompt]) -> value\n\
1193\n\
1194Equivalent to eval(raw_input(prompt)).";
1195
1196
Guido van Rossume8811f81997-02-14 15:48:05 +00001197static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001198builtin_intern(PyObject *self, PyObject *args)
Guido van Rossume8811f81997-02-14 15:48:05 +00001199{
1200 PyObject *s;
Guido van Rossum43713e52000-02-29 13:59:29 +00001201 if (!PyArg_ParseTuple(args, "S:intern", &s))
Guido van Rossume8811f81997-02-14 15:48:05 +00001202 return NULL;
1203 Py_INCREF(s);
1204 PyString_InternInPlace(&s);
1205 return s;
1206}
1207
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001208static char intern_doc[] =
1209"intern(string) -> string\n\
1210\n\
1211``Intern'' the given string. This enters the string in the (global)\n\
1212table of interned strings whose purpose is to speed up dictionary lookups.\n\
1213Return the string itself or the previously interned string object with the\n\
1214same value.";
1215
1216
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001218builtin_int(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001219{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 PyObject *v;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001221 int base = -909; /* unlikely! */
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001223 if (!PyArg_ParseTuple(args, "O|i:int", &v, &base))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001224 return NULL;
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001225 if (base == -909)
1226 return PyNumber_Int(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001227 else if (PyString_Check(v))
1228 return PyInt_FromString(PyString_AS_STRING(v), NULL, base);
1229 else if (PyUnicode_Check(v))
1230 return PyInt_FromUnicode(PyUnicode_AS_UNICODE(v),
1231 PyUnicode_GET_SIZE(v),
1232 base);
1233 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001234 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001235 "int() can't convert non-string with explicit base");
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001236 return NULL;
1237 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001238}
1239
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001240static char int_doc[] =
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001241"int(x[, base]) -> integer\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001242\n\
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001243Convert a string or number to an integer, if possible. A floating point\n\
1244argument will be truncated towards zero (this does not include a string\n\
1245representation of a floating point number!) When converting a string, use\n\
1246the optional base. It is an error to supply a base when converting a\n\
1247non-string.";
1248
1249
1250static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001251builtin_long(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001252{
1253 PyObject *v;
1254 int base = -909; /* unlikely! */
Guido van Rossumad991772001-01-12 16:03:05 +00001255
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001256 if (!PyArg_ParseTuple(args, "O|i:long", &v, &base))
1257 return NULL;
1258 if (base == -909)
1259 return PyNumber_Long(v);
Guido van Rossum9e896b32000-04-05 20:11:21 +00001260 else if (PyString_Check(v))
1261 return PyLong_FromString(PyString_AS_STRING(v), NULL, base);
1262 else if (PyUnicode_Check(v))
1263 return PyLong_FromUnicode(PyUnicode_AS_UNICODE(v),
1264 PyUnicode_GET_SIZE(v),
1265 base);
1266 else {
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001267 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001268 "long() can't convert non-string with explicit base");
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001269 return NULL;
1270 }
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001271}
1272
1273static char long_doc[] =
1274"long(x) -> long integer\n\
1275long(x, base) -> long integer\n\
1276\n\
1277Convert a string or number to a long integer, if possible. A floating\n\
1278point argument will be truncated towards zero (this does not include a\n\
1279string representation of a floating point number!) When converting a\n\
1280string, use the given base. It is an error to supply a base when\n\
1281converting a non-string.";
1282
1283
1284static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001285builtin_float(PyObject *self, PyObject *args)
Barry Warsaw226ae6c1999-10-12 19:54:53 +00001286{
1287 PyObject *v;
1288
1289 if (!PyArg_ParseTuple(args, "O:float", &v))
1290 return NULL;
1291 if (PyString_Check(v))
1292 return PyFloat_FromString(v, NULL);
1293 return PyNumber_Float(v);
1294}
1295
1296static char float_doc[] =
1297"float(x) -> floating point number\n\
1298\n\
1299Convert a string or number to a floating point number, if possible.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001300
1301
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001303builtin_len(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 PyObject *v;
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001306 long res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001307
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001309 return NULL;
Jeremy Hylton03657cf2000-07-12 13:05:33 +00001310 res = PyObject_Size(v);
Guido van Rossum8ea9f4d1998-06-29 22:26:50 +00001311 if (res < 0 && PyErr_Occurred())
1312 return NULL;
1313 return PyInt_FromLong(res);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001314}
1315
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001316static char len_doc[] =
1317"len(object) -> integer\n\
1318\n\
1319Return the number of items of a sequence or mapping.";
1320
1321
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001323builtin_list(PyObject *self, PyObject *args)
Guido van Rossumd1705771996-04-09 02:41:06 +00001324{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +00001326
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +00001328 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001329 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +00001330}
1331
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001332static char list_doc[] =
1333"list(sequence) -> list\n\
1334\n\
1335Return a new list whose items are the same as those of the argument sequence.";
1336
Guido van Rossum8861b741996-07-30 16:49:37 +00001337
1338static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001339builtin_slice(PyObject *self, PyObject *args)
Guido van Rossum8861b741996-07-30 16:49:37 +00001340{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001341 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +00001342
Guido van Rossum09df08a1998-05-22 00:51:39 +00001343 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001344
Guido van Rossum09df08a1998-05-22 00:51:39 +00001345 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1346 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +00001347
Guido van Rossum09df08a1998-05-22 00:51:39 +00001348 /* This swapping of stop and start is to maintain similarity with
1349 range(). */
1350 if (stop == NULL) {
1351 stop = start;
1352 start = NULL;
1353 }
1354 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +00001355}
1356
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001357static char slice_doc[] =
Fred Drake3d587441999-07-19 15:21:16 +00001358"slice([start,] stop[, step]) -> slice object\n\
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001359\n\
1360Create a slice object. This is used for slicing by the Numeric extensions.";
1361
1362
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001364builtin_locals(PyObject *self, PyObject *args)
Guido van Rossum872537c1995-07-07 22:43:42 +00001365{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001366 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001367
Guido van Rossum43713e52000-02-29 13:59:29 +00001368 if (!PyArg_ParseTuple(args, ":locals"))
Guido van Rossum872537c1995-07-07 22:43:42 +00001369 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 d = PyEval_GetLocals();
1371 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001372 return d;
1373}
1374
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001375static char locals_doc[] =
1376"locals() -> dictionary\n\
1377\n\
1378Return the dictionary containing the current scope's local variables.";
1379
1380
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381static PyObject *
Guido van Rossum53451b32001-01-17 15:47:24 +00001382min_max(PyObject *args, int op)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383{
Guido van Rossum2d951851994-08-29 12:52:16 +00001384 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 PyObject *v, *w, *x;
1386 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001389 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001391 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001393 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001395 "min() or max() arg must be a sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001396 return NULL;
1397 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001398 w = NULL;
1399 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001400 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001401 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001402 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001404 break;
1405 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001407 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001408 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001409 if (w == NULL)
1410 w = x;
1411 else {
Guido van Rossum53451b32001-01-17 15:47:24 +00001412 int cmp = PyObject_RichCompareBool(x, w, op);
1413 if (cmp > 0) {
1414 Py_DECREF(w);
1415 w = x;
1416 }
1417 else if (cmp < 0) {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001418 Py_DECREF(x);
1419 Py_XDECREF(w);
1420 return NULL;
1421 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001422 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001424 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001425 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001426 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001427 PyErr_SetString(PyExc_ValueError,
Fred Drake661ea262000-10-24 19:57:45 +00001428 "min() or max() arg is an empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001429 return w;
1430}
1431
Guido van Rossum79f25d91997-04-29 20:08:16 +00001432static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001433builtin_min(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001434{
Guido van Rossum53451b32001-01-17 15:47:24 +00001435 return min_max(v, Py_LT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001436}
1437
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001438static char min_doc[] =
1439"min(sequence) -> value\n\
1440min(a, b, c, ...) -> value\n\
1441\n\
1442With a single sequence argument, return its smallest item.\n\
1443With two or more arguments, return the smallest argument.";
1444
1445
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001447builtin_max(PyObject *self, PyObject *v)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001448{
Guido van Rossum53451b32001-01-17 15:47:24 +00001449 return min_max(v, Py_GT);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450}
1451
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001452static char max_doc[] =
1453"max(sequence) -> value\n\
1454max(a, b, c, ...) -> value\n\
1455\n\
1456With a single sequence argument, return its largest item.\n\
1457With two or more arguments, return the largest argument.";
1458
1459
Guido van Rossum79f25d91997-04-29 20:08:16 +00001460static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001461builtin_oct(PyObject *self, PyObject *args)
Guido van Rossum006bcd41991-10-24 14:54:44 +00001462{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 PyObject *v;
1464 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001465
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001468 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1469 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001471 "oct() argument can't be converted to oct");
1472 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001473 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001474 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001475}
1476
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001477static char oct_doc[] =
1478"oct(number) -> string\n\
1479\n\
1480Return the octal representation of an integer or long integer.";
1481
1482
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001484builtin_open(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001485{
Guido van Rossum2d951851994-08-29 12:52:16 +00001486 char *name;
1487 char *mode = "r";
1488 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001490
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001492 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001494 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001496 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001497}
1498
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001499static char open_doc[] =
1500"open(filename[, mode[, buffering]]) -> file object\n\
1501\n\
1502Open a file. The mode can be 'r', 'w' or 'a' for reading (default),\n\
1503writing or appending. The file will be created if it doesn't exist\n\
1504when opened for writing or appending; it will be truncated when\n\
1505opened for writing. Add a 'b' to the mode for binary files.\n\
1506Add a '+' to the mode to allow simultaneous reading and writing.\n\
1507If the buffering argument is given, 0 means unbuffered, 1 means line\n\
1508buffered, and larger numbers specify the buffer size.";
1509
1510
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001512builtin_ord(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001513{
Guido van Rossum09095f32000-03-10 23:00:52 +00001514 PyObject *obj;
1515 long ord;
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001516 int size;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001517
Guido van Rossum09095f32000-03-10 23:00:52 +00001518 if (!PyArg_ParseTuple(args, "O:ord", &obj))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001519 return NULL;
Guido van Rossum09095f32000-03-10 23:00:52 +00001520
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001521 if (PyString_Check(obj)) {
1522 size = PyString_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001523 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001524 ord = (long)((unsigned char)*PyString_AS_STRING(obj));
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001525 return PyInt_FromLong(ord);
1526 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001527 } else if (PyUnicode_Check(obj)) {
1528 size = PyUnicode_GET_SIZE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001529 if (size == 1) {
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001530 ord = (long)*PyUnicode_AS_UNICODE(obj);
Andrew M. Kuchling34c20cf2000-12-20 14:36:56 +00001531 return PyInt_FromLong(ord);
1532 }
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001533 } else {
1534 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001535 "ord() expected string of length 1, but " \
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001536 "%.200s found", obj->ob_type->tp_name);
Guido van Rossum09095f32000-03-10 23:00:52 +00001537 return NULL;
1538 }
1539
Guido van Rossumad991772001-01-12 16:03:05 +00001540 PyErr_Format(PyExc_TypeError,
Andrew M. Kuchlingf07aad12000-12-23 14:11:28 +00001541 "ord() expected a character, "
1542 "but string of length %d found",
Jeremy Hylton394b54d2000-04-12 21:19:47 +00001543 size);
1544 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001545}
1546
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001547static char ord_doc[] =
1548"ord(c) -> integer\n\
1549\n\
Guido van Rossumad991772001-01-12 16:03:05 +00001550Return the integer ordinal of a one-character string.";
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001551
1552
Guido van Rossum79f25d91997-04-29 20:08:16 +00001553static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001554builtin_pow(PyObject *self, PyObject *args)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001555{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001556 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001557
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001559 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001560 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001561}
1562
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001563static char pow_doc[] =
1564"pow(x, y[, z]) -> number\n\
1565\n\
1566With two arguments, equivalent to x**y. With three arguments,\n\
1567equivalent to (x**y) % z, but may be more efficient (e.g. for longs).";
1568
1569
Guido van Rossum124eff01999-02-23 16:11:01 +00001570/* Return number of items in range/xrange (lo, hi, step). step > 0
1571 * required. Return a value < 0 if & only if the true value is too
1572 * large to fit in a signed long.
1573 */
1574static long
Thomas Wouterse28c2962000-07-23 22:21:32 +00001575get_len_of_range(long lo, long hi, long step)
Guido van Rossum124eff01999-02-23 16:11:01 +00001576{
1577 /* -------------------------------------------------------------
1578 If lo >= hi, the range is empty.
1579 Else if n values are in the range, the last one is
1580 lo + (n-1)*step, which must be <= hi-1. Rearranging,
1581 n <= (hi - lo - 1)/step + 1, so taking the floor of the RHS gives
1582 the proper value. Since lo < hi in this case, hi-lo-1 >= 0, so
1583 the RHS is non-negative and so truncation is the same as the
1584 floor. Letting M be the largest positive long, the worst case
1585 for the RHS numerator is hi=M, lo=-M-1, and then
1586 hi-lo-1 = M-(-M-1)-1 = 2*M. Therefore unsigned long has enough
1587 precision to compute the RHS exactly.
1588 ---------------------------------------------------------------*/
1589 long n = 0;
1590 if (lo < hi) {
1591 unsigned long uhi = (unsigned long)hi;
1592 unsigned long ulo = (unsigned long)lo;
1593 unsigned long diff = uhi - ulo - 1;
1594 n = (long)(diff / (unsigned long)step + 1);
1595 }
1596 return n;
1597}
1598
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001600builtin_range(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001601{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001602 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum124eff01999-02-23 16:11:01 +00001603 long bign;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001604 int i, n;
Guido van Rossum124eff01999-02-23 16:11:01 +00001605
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001607
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 if (PyTuple_Size(args) <= 1) {
1609 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001610 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001611 &ihigh))
1612 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001613 }
1614 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001615 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001616 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001618 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001619 }
1620 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001621 PyErr_SetString(PyExc_ValueError, "range() arg 3 must not be zero");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001622 return NULL;
1623 }
Guido van Rossum124eff01999-02-23 16:11:01 +00001624 if (istep > 0)
1625 bign = get_len_of_range(ilow, ihigh, istep);
1626 else
1627 bign = get_len_of_range(ihigh, ilow, -istep);
1628 n = (int)bign;
1629 if (bign < 0 || (long)n != bign) {
Guido van Rossume23cde21999-01-12 05:07:47 +00001630 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001631 "range() result has too many items");
Guido van Rossume23cde21999-01-12 05:07:47 +00001632 return NULL;
1633 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001634 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001635 if (v == NULL)
1636 return NULL;
1637 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001638 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001639 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001640 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001641 return NULL;
1642 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001643 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001644 ilow += istep;
1645 }
1646 return v;
1647}
1648
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001649static char range_doc[] =
1650"range([start,] stop[, step]) -> list of integers\n\
1651\n\
1652Return a list containing an arithmetic progression of integers.\n\
1653range(i, j) returns [i, i+1, i+2, ..., j-1]; start (!) defaults to 0.\n\
1654When step is given, it specifies the increment (or decrement).\n\
1655For example, range(4) returns [0, 1, 2, 3]. The end point is omitted!\n\
1656These are exactly the valid indices for a list of 4 elements.";
1657
1658
Guido van Rossum79f25d91997-04-29 20:08:16 +00001659static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001660builtin_xrange(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001661{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001662 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001663 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001664
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665 if (PyTuple_Size(args) <= 1) {
1666 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001667 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001668 &ihigh))
1669 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001670 }
1671 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001672 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001673 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001674 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001675 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001676 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001677 if (istep == 0) {
Fred Drake661ea262000-10-24 19:57:45 +00001678 PyErr_SetString(PyExc_ValueError, "xrange() arg 3 must not be zero");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001679 return NULL;
1680 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001681 if (istep > 0)
Guido van Rossum124eff01999-02-23 16:11:01 +00001682 n = get_len_of_range(ilow, ihigh, istep);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001683 else
Guido van Rossum124eff01999-02-23 16:11:01 +00001684 n = get_len_of_range(ihigh, ilow, -istep);
1685 if (n < 0) {
1686 PyErr_SetString(PyExc_OverflowError,
Fred Drake661ea262000-10-24 19:57:45 +00001687 "xrange() result has too many items");
Guido van Rossum124eff01999-02-23 16:11:01 +00001688 return NULL;
1689 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001690 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001691}
1692
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001693static char xrange_doc[] =
1694"xrange([start,] stop[, step]) -> xrange object\n\
1695\n\
1696Like range(), but instead of returning a list, returns an object that\n\
1697generates the numbers in the range on demand. This is slightly slower\n\
1698than range() but more memory efficient.";
1699
1700
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001702builtin_raw_input(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 PyObject *v = NULL;
1705 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001706
Guido van Rossum79f25d91997-04-29 20:08:16 +00001707 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001708 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001709 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1710 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001711 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001713 char *prompt;
1714 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001716 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001718 if (po == NULL)
1719 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001720 prompt = PyString_AsString(po);
Guido van Rossumd9b52081998-06-26 18:25:38 +00001721 if (prompt == NULL)
1722 return NULL;
Guido van Rossum872537c1995-07-07 22:43:42 +00001723 }
1724 else {
1725 po = NULL;
1726 prompt = "";
1727 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001728 s = PyOS_Readline(prompt);
1729 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001730 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001731 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001732 return NULL;
1733 }
1734 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001736 result = NULL;
1737 }
1738 else { /* strip trailing '\n' */
Guido van Rossum106f2da2000-06-28 21:12:25 +00001739 size_t len = strlen(s);
1740 if (len > INT_MAX) {
1741 PyErr_SetString(PyExc_OverflowError, "input too long");
1742 result = NULL;
1743 }
1744 else {
1745 result = PyString_FromStringAndSize(s, (int)(len-1));
1746 }
Guido van Rossum872537c1995-07-07 22:43:42 +00001747 }
Guido van Rossumb18618d2000-05-03 23:44:39 +00001748 PyMem_FREE(s);
Guido van Rossum872537c1995-07-07 22:43:42 +00001749 return result;
1750 }
Guido van Rossum90933611991-06-07 16:10:43 +00001751 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001752 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001753 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001755 return NULL;
1756 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001757 if (Py_FlushLine() != 0 ||
1758 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001759 return NULL;
1760 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001762 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001764 return NULL;
1765 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001766 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001767}
1768
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001769static char raw_input_doc[] =
1770"raw_input([prompt]) -> string\n\
1771\n\
1772Read a string from standard input. The trailing newline is stripped.\n\
1773If the user hits EOF (Unix: Ctl-D, Windows: Ctl-Z+Return), raise EOFError.\n\
1774On Unix, GNU readline is used if enabled. The prompt string, if given,\n\
1775is printed without a trailing newline before reading.";
1776
1777
Guido van Rossum79f25d91997-04-29 20:08:16 +00001778static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001779builtin_reduce(PyObject *self, PyObject *args)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001780{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 PyObject *seq, *func, *result = NULL;
1782 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001783 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001784
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001786 return NULL;
1787 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001789
Guido van Rossum09df08a1998-05-22 00:51:39 +00001790 sqf = seq->ob_type->tp_as_sequence;
1791 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001793 "reduce() arg 2 must be a sequence");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001794 return NULL;
1795 }
1796
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001798 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001799
Guido van Rossum2d951851994-08-29 12:52:16 +00001800 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001801 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001802
1803 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 Py_DECREF(args);
1805 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001806 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001807 }
1808
Guido van Rossum2d951851994-08-29 12:52:16 +00001809 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001810 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001812 break;
1813 }
1814 goto Fail;
1815 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001816
Guido van Rossum2d951851994-08-29 12:52:16 +00001817 if (result == NULL)
1818 result = op2;
1819 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 PyTuple_SetItem(args, 0, result);
1821 PyTuple_SetItem(args, 1, op2);
1822 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001823 goto Fail;
1824 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001825 }
1826
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828
Guido van Rossum2d951851994-08-29 12:52:16 +00001829 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001830 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00001831 "reduce() of empty sequence with no initial value");
Guido van Rossum2d951851994-08-29 12:52:16 +00001832
Guido van Rossum12d12c51993-10-26 17:58:25 +00001833 return result;
1834
Guido van Rossum2d951851994-08-29 12:52:16 +00001835Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 Py_XDECREF(args);
1837 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001838 return NULL;
1839}
1840
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001841static char reduce_doc[] =
1842"reduce(function, sequence[, initial]) -> value\n\
1843\n\
1844Apply a function of two arguments cumulatively to the items of a sequence,\n\
1845from left to right, so as to reduce the sequence to a single value.\n\
1846For example, reduce(lambda x, y: x+y, [1, 2, 3, 4, 5]) calculates\n\
1847((((1+2)+3)+4)+5). If initial is present, it is placed before the items\n\
1848of the sequence in the calculation, and serves as a default when the\n\
1849sequence is empty.";
1850
1851
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001853builtin_reload(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001854{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001856
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001858 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001860}
1861
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001862static char reload_doc[] =
1863"reload(module) -> module\n\
1864\n\
1865Reload the module. The module must have been successfully imported before.";
1866
1867
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001869builtin_repr(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001870{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001871 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001872
Guido van Rossum79f25d91997-04-29 20:08:16 +00001873 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001874 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001875 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001876}
1877
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001878static char repr_doc[] =
1879"repr(object) -> string\n\
1880\n\
1881Return the canonical string representation of the object.\n\
1882For most object types, eval(repr(object)) == object.";
1883
1884
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001886builtin_round(PyObject *self, PyObject *args)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001887{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001888 double x;
1889 double f;
1890 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001891 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001892
Guido van Rossum79f25d91997-04-29 20:08:16 +00001893 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001894 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001895 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001896 i = abs(ndigits);
1897 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001898 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001899 if (ndigits < 0)
1900 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001901 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001902 x *= f;
1903 if (x >= 0.0)
1904 x = floor(x + 0.5);
1905 else
1906 x = ceil(x - 0.5);
1907 if (ndigits < 0)
1908 x *= f;
1909 else
1910 x /= f;
1911 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001912}
1913
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001914static char round_doc[] =
1915"round(number[, ndigits]) -> floating point number\n\
1916\n\
1917Round a number to a given precision in decimal digits (default 0 digits).\n\
1918This always returns a floating point number. Precision may be negative.";
1919
1920
Guido van Rossum79f25d91997-04-29 20:08:16 +00001921static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001922builtin_str(PyObject *self, PyObject *args)
Guido van Rossumc89705d1992-11-26 08:54:07 +00001923{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001925
Guido van Rossum79f25d91997-04-29 20:08:16 +00001926 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001927 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001929}
1930
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001931static char str_doc[] =
1932"str(object) -> string\n\
1933\n\
1934Return a nice string representation of the object.\n\
1935If the argument is a string, the return value is the same object.";
1936
1937
Guido van Rossum79f25d91997-04-29 20:08:16 +00001938static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001939builtin_tuple(PyObject *self, PyObject *args)
Guido van Rossumcae027b1994-08-29 12:53:11 +00001940{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001942
Guido van Rossum79f25d91997-04-29 20:08:16 +00001943 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001944 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001945 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001946}
1947
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001948static char tuple_doc[] =
1949"tuple(sequence) -> list\n\
1950\n\
1951Return a tuple whose items are the same as those of the argument sequence.\n\
1952If the argument is a tuple, the return value is the same object.";
1953
1954
Guido van Rossum79f25d91997-04-29 20:08:16 +00001955static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001956builtin_type(PyObject *self, PyObject *args)
Guido van Rossum3f5da241990-12-20 15:06:42 +00001957{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001958 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001959
Guido van Rossum79f25d91997-04-29 20:08:16 +00001960 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001962 v = (PyObject *)v->ob_type;
1963 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001964 return v;
1965}
1966
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00001967static char type_doc[] =
1968"type(object) -> type object\n\
1969\n\
1970Return the type of the object.";
1971
1972
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00001974builtin_vars(PyObject *self, PyObject *args)
Guido van Rossum2d951851994-08-29 12:52:16 +00001975{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 PyObject *v = NULL;
1977 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001978
Guido van Rossum79f25d91997-04-29 20:08:16 +00001979 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001980 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001981 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001982 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001983 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 if (!PyErr_Occurred())
1985 PyErr_SetString(PyExc_SystemError,
1986 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001987 }
1988 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001990 }
1991 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001993 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001995 "vars() argument must have __dict__ attribute");
1996 return NULL;
1997 }
1998 }
1999 return d;
2000}
2001
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002002static char vars_doc[] =
2003"vars([object]) -> dictionary\n\
2004\n\
2005Without arguments, equivalent to locals().\n\
2006With an argument, equivalent to object.__dict__.";
2007
Guido van Rossum668213d1999-06-16 17:28:37 +00002008static int
Neil Schemenauercc343ca2000-12-04 15:42:11 +00002009abstract_issubclass(PyObject *derived, PyObject *cls, int first)
Guido van Rossum668213d1999-06-16 17:28:37 +00002010{
2011 static PyObject *__bases__ = NULL;
2012 PyObject *bases;
Guido van Rossum7f851861999-06-17 19:12:39 +00002013 int i, n;
Guido van Rossum668213d1999-06-16 17:28:37 +00002014 int r = 0;
2015
2016 if (__bases__ == NULL) {
2017 __bases__ = PyString_FromString("__bases__");
2018 if (__bases__ == NULL)
2019 return -1;
2020 }
2021
2022 if (first) {
2023 bases = PyObject_GetAttr(cls, __bases__);
2024 if (bases == NULL || !PyTuple_Check(bases)) {
Guido van Rossumad991772001-01-12 16:03:05 +00002025 Py_XDECREF(bases);
2026 PyErr_SetString(PyExc_TypeError,
2027 "issubclass() arg 2 must be a class");
Guido van Rossum668213d1999-06-16 17:28:37 +00002028 return -1;
2029 }
2030 Py_DECREF(bases);
2031 }
2032
2033 if (derived == cls)
2034 return 1;
2035
2036 bases = PyObject_GetAttr(derived, __bases__);
2037 if (bases == NULL || !PyTuple_Check(bases)) {
2038 Py_XDECREF(bases);
Neil Schemenauercc343ca2000-12-04 15:42:11 +00002039 PyErr_SetString(PyExc_TypeError,
Guido van Rossumad991772001-01-12 16:03:05 +00002040 "issubclass() arg 1 must be a class");
Guido van Rossum668213d1999-06-16 17:28:37 +00002041 return -1;
2042 }
2043
2044 n = PyTuple_GET_SIZE(bases);
2045 for (i = 0; i < n; i++) {
Neil Schemenauercc343ca2000-12-04 15:42:11 +00002046 r = abstract_issubclass(PyTuple_GET_ITEM(bases, i), cls, 0);
Guido van Rossum668213d1999-06-16 17:28:37 +00002047 if (r != 0)
2048 break;
2049 }
2050
2051 Py_DECREF(bases);
2052
2053 return r;
2054}
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002055
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002056static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002057builtin_isinstance(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002058{
2059 PyObject *inst;
2060 PyObject *cls;
Guido van Rossum668213d1999-06-16 17:28:37 +00002061 PyObject *icls;
2062 static PyObject *__class__ = NULL;
2063 int retval = 0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002064
Guido van Rossum43713e52000-02-29 13:59:29 +00002065 if (!PyArg_ParseTuple(args, "OO:isinstance", &inst, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002066 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002067
Guido van Rossum668213d1999-06-16 17:28:37 +00002068 if (PyClass_Check(cls)) {
2069 if (PyInstance_Check(inst)) {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00002070 PyObject *inclass =
2071 (PyObject*)((PyInstanceObject*)inst)->in_class;
2072 retval = PyClass_IsSubclass(inclass, cls);
2073 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002074 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002075 else if (PyType_Check(cls)) {
2076 retval = ((PyObject *)(inst->ob_type) == cls);
2077 }
2078 else if (!PyInstance_Check(inst)) {
Guido van Rossumad991772001-01-12 16:03:05 +00002079 if (__class__ == NULL) {
Guido van Rossum668213d1999-06-16 17:28:37 +00002080 __class__ = PyString_FromString("__class__");
2081 if (__class__ == NULL)
2082 return NULL;
2083 }
2084 icls = PyObject_GetAttr(inst, __class__);
2085 if (icls != NULL) {
Guido van Rossumad991772001-01-12 16:03:05 +00002086 retval = abstract_issubclass(icls, cls, 1);
Guido van Rossum668213d1999-06-16 17:28:37 +00002087 Py_DECREF(icls);
Guido van Rossumad991772001-01-12 16:03:05 +00002088 if (retval < 0 &&
2089 !PyErr_ExceptionMatches(PyExc_TypeError))
Guido van Rossum668213d1999-06-16 17:28:37 +00002090 return NULL;
2091 }
Guido van Rossumad991772001-01-12 16:03:05 +00002092 else
2093 retval = -1;
2094 }
2095 else
2096 retval = -1;
2097
2098 if (retval < 0) {
2099 PyErr_SetString(PyExc_TypeError,
2100 "isinstance() arg 2 must be a class or type");
2101 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002102 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002103 return PyInt_FromLong(retval);
2104}
2105
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002106static char isinstance_doc[] =
2107"isinstance(object, class-or-type) -> Boolean\n\
2108\n\
2109Return whether an object is an instance of a class or of a subclass thereof.\n\
2110With a type as second argument, return whether that is the object's type.";
2111
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002112
2113static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002114builtin_issubclass(PyObject *self, PyObject *args)
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002115{
2116 PyObject *derived;
2117 PyObject *cls;
2118 int retval;
2119
Guido van Rossum43713e52000-02-29 13:59:29 +00002120 if (!PyArg_ParseTuple(args, "OO:issubclass", &derived, &cls))
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002121 return NULL;
Guido van Rossum668213d1999-06-16 17:28:37 +00002122
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002123 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
Neil Schemenauercc343ca2000-12-04 15:42:11 +00002124 retval = abstract_issubclass(derived, cls, 1);
Guido van Rossumad991772001-01-12 16:03:05 +00002125 if (retval < 0)
Guido van Rossum668213d1999-06-16 17:28:37 +00002126 return NULL;
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002127 }
Guido van Rossum668213d1999-06-16 17:28:37 +00002128 else {
2129 /* shortcut */
2130 if (!(retval = (derived == cls)))
2131 retval = PyClass_IsSubclass(derived, cls);
2132 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002133
2134 return PyInt_FromLong(retval);
2135}
2136
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002137static char issubclass_doc[] =
2138"issubclass(C, B) -> Boolean\n\
2139\n\
2140Return whether class C is a subclass (i.e., a derived class) of class B.";
2141
Barry Warsawcde8b1b1997-08-22 21:14:38 +00002142
Barry Warsawbd599b52000-08-03 15:45:29 +00002143static PyObject*
2144builtin_zip(PyObject *self, PyObject *args)
2145{
2146 PyObject *ret;
2147 int itemsize = PySequence_Length(args);
2148 int i, j;
2149
2150 if (itemsize < 1) {
2151 PyErr_SetString(PyExc_TypeError,
Fred Drake661ea262000-10-24 19:57:45 +00002152 "zip() requires at least one sequence");
Barry Warsawbd599b52000-08-03 15:45:29 +00002153 return NULL;
2154 }
2155 /* args must be a tuple */
2156 assert(PyTuple_Check(args));
2157
2158 if ((ret = PyList_New(0)) == NULL)
2159 return NULL;
2160
2161 for (i = 0;; i++) {
2162 PyObject *next = PyTuple_New(itemsize);
2163 if (!next) {
2164 Py_DECREF(ret);
2165 return NULL;
2166 }
2167 for (j = 0; j < itemsize; j++) {
2168 PyObject *seq = PyTuple_GET_ITEM(args, j);
2169 PyObject *item = PySequence_GetItem(seq, i);
2170
2171 if (!item) {
2172 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
2173 PyErr_Clear();
2174 Py_DECREF(next);
2175 return ret;
2176 }
2177 Py_DECREF(next);
2178 Py_DECREF(ret);
2179 return NULL;
2180 }
2181 PyTuple_SET_ITEM(next, j, item);
2182 }
2183 PyList_Append(ret, next);
2184 Py_DECREF(next);
2185 }
2186 /* no return */
2187}
2188
2189
2190static char zip_doc[] =
2191"zip(seq1 [, seq2 [...]]) -> [(seq1[0], seq2[0] ...), (...)]\n\
2192\n\
2193Return a list of tuples, where each tuple contains the i-th element\n\
2194from each of the argument sequences. The returned list is truncated\n\
2195in length to the length of the shortest argument sequence.";
2196
2197
Guido van Rossum79f25d91997-04-29 20:08:16 +00002198static PyMethodDef builtin_methods[] = {
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002199 {"__import__", builtin___import__, 1, import_doc},
2200 {"abs", builtin_abs, 1, abs_doc},
2201 {"apply", builtin_apply, 1, apply_doc},
Guido van Rossum0daf0221999-03-19 19:07:19 +00002202 {"buffer", builtin_buffer, 1, buffer_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002203 {"callable", builtin_callable, 1, callable_doc},
2204 {"chr", builtin_chr, 1, chr_doc},
2205 {"cmp", builtin_cmp, 1, cmp_doc},
2206 {"coerce", builtin_coerce, 1, coerce_doc},
2207 {"compile", builtin_compile, 1, compile_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002208#ifndef WITHOUT_COMPLEX
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002209 {"complex", builtin_complex, 1, complex_doc},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00002210#endif
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002211 {"delattr", builtin_delattr, 1, delattr_doc},
2212 {"dir", builtin_dir, 1, dir_doc},
2213 {"divmod", builtin_divmod, 1, divmod_doc},
2214 {"eval", builtin_eval, 1, eval_doc},
2215 {"execfile", builtin_execfile, 1, execfile_doc},
2216 {"filter", builtin_filter, 1, filter_doc},
2217 {"float", builtin_float, 1, float_doc},
2218 {"getattr", builtin_getattr, 1, getattr_doc},
2219 {"globals", builtin_globals, 1, globals_doc},
2220 {"hasattr", builtin_hasattr, 1, hasattr_doc},
2221 {"hash", builtin_hash, 1, hash_doc},
2222 {"hex", builtin_hex, 1, hex_doc},
2223 {"id", builtin_id, 1, id_doc},
2224 {"input", builtin_input, 1, input_doc},
2225 {"intern", builtin_intern, 1, intern_doc},
2226 {"int", builtin_int, 1, int_doc},
2227 {"isinstance", builtin_isinstance, 1, isinstance_doc},
2228 {"issubclass", builtin_issubclass, 1, issubclass_doc},
2229 {"len", builtin_len, 1, len_doc},
2230 {"list", builtin_list, 1, list_doc},
2231 {"locals", builtin_locals, 1, locals_doc},
2232 {"long", builtin_long, 1, long_doc},
2233 {"map", builtin_map, 1, map_doc},
2234 {"max", builtin_max, 1, max_doc},
2235 {"min", builtin_min, 1, min_doc},
2236 {"oct", builtin_oct, 1, oct_doc},
2237 {"open", builtin_open, 1, open_doc},
2238 {"ord", builtin_ord, 1, ord_doc},
2239 {"pow", builtin_pow, 1, pow_doc},
2240 {"range", builtin_range, 1, range_doc},
2241 {"raw_input", builtin_raw_input, 1, raw_input_doc},
2242 {"reduce", builtin_reduce, 1, reduce_doc},
2243 {"reload", builtin_reload, 1, reload_doc},
2244 {"repr", builtin_repr, 1, repr_doc},
2245 {"round", builtin_round, 1, round_doc},
2246 {"setattr", builtin_setattr, 1, setattr_doc},
2247 {"slice", builtin_slice, 1, slice_doc},
2248 {"str", builtin_str, 1, str_doc},
2249 {"tuple", builtin_tuple, 1, tuple_doc},
2250 {"type", builtin_type, 1, type_doc},
Guido van Rossum09095f32000-03-10 23:00:52 +00002251 {"unicode", builtin_unicode, 1, unicode_doc},
2252 {"unichr", builtin_unichr, 1, unichr_doc},
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002253 {"vars", builtin_vars, 1, vars_doc},
2254 {"xrange", builtin_xrange, 1, xrange_doc},
Barry Warsawbd599b52000-08-03 15:45:29 +00002255 {"zip", builtin_zip, 1, zip_doc},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00002256 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00002257};
2258
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002259static char builtin_doc[] =
2260"Built-in functions, exceptions, and other objects.\n\
2261\n\
2262Noteworthy: None is the `nil' object; Ellipsis represents `...' in slices.";
2263
Guido van Rossum25ce5661997-08-02 03:10:38 +00002264PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002265_PyBuiltin_Init(void)
Guido van Rossum25ce5661997-08-02 03:10:38 +00002266{
Fred Drake5550de32000-06-20 04:54:19 +00002267 PyObject *mod, *dict, *debug;
Guido van Rossumf9d9c6c1998-06-26 21:23:49 +00002268 mod = Py_InitModule4("__builtin__", builtin_methods,
2269 builtin_doc, (PyObject *)NULL,
2270 PYTHON_API_VERSION);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002271 if (mod == NULL)
2272 return NULL;
2273 dict = PyModule_GetDict(mod);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002274 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
2275 return NULL;
2276 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
2277 return NULL;
Guido van Rossumad991772001-01-12 16:03:05 +00002278 if (PyDict_SetItemString(dict, "NotImplemented",
Neil Schemenauer23ab1992001-01-04 01:48:42 +00002279 Py_NotImplemented) < 0)
2280 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002281 debug = PyInt_FromLong(Py_OptimizeFlag == 0);
2282 if (PyDict_SetItemString(dict, "__debug__", debug) < 0) {
2283 Py_XDECREF(debug);
Guido van Rossum25ce5661997-08-02 03:10:38 +00002284 return NULL;
Fred Drake5550de32000-06-20 04:54:19 +00002285 }
2286 Py_XDECREF(debug);
Barry Warsaw757af0e1997-08-29 22:13:51 +00002287
Guido van Rossum25ce5661997-08-02 03:10:38 +00002288 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00002289}
2290
Guido van Rossume77a7571993-11-03 15:01:26 +00002291/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002292
Guido van Rossum79f25d91997-04-29 20:08:16 +00002293static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002294filtertuple(PyObject *func, PyObject *tuple)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002295{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002296 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002297 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002298 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002299
Guido van Rossumb7b45621995-08-04 04:07:45 +00002300 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002301 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002302 return tuple;
2303 }
2304
Guido van Rossum79f25d91997-04-29 20:08:16 +00002305 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002306 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002307
Guido van Rossum12d12c51993-10-26 17:58:25 +00002308 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002309 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002310 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002311
Guido van Rossum79f25d91997-04-29 20:08:16 +00002312 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002313 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002314 if (func == Py_None) {
2315 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002316 good = item;
2317 }
2318 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002319 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002320 if (arg == NULL)
2321 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002322 good = PyEval_CallObject(func, arg);
2323 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002324 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002325 goto Fail_1;
2326 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002327 ok = PyObject_IsTrue(good);
2328 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002329 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002330 Py_INCREF(item);
2331 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002332 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002333 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002334 }
2335
Guido van Rossum79f25d91997-04-29 20:08:16 +00002336 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002337 return NULL;
2338
Guido van Rossum12d12c51993-10-26 17:58:25 +00002339 return result;
2340
Guido van Rossum12d12c51993-10-26 17:58:25 +00002341Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002342 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002343 return NULL;
2344}
2345
2346
Guido van Rossume77a7571993-11-03 15:01:26 +00002347/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002348
Guido van Rossum79f25d91997-04-29 20:08:16 +00002349static PyObject *
Thomas Woutersf70ef4f2000-07-22 18:47:25 +00002350filterstring(PyObject *func, PyObject *strobj)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002351{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002352 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002353 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002354 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002355
Guido van Rossum79f25d91997-04-29 20:08:16 +00002356 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002357 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002358 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002359 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002360 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002361 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002362 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002363
Guido van Rossum12d12c51993-10-26 17:58:25 +00002364 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002365 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002366 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002367
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002368 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2369 if (item == NULL)
2370 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002371 arg = Py_BuildValue("(O)", item);
2372 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002373 if (arg == NULL)
2374 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002375 good = PyEval_CallObject(func, arg);
2376 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002377 if (good == NULL)
2378 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002379 ok = PyObject_IsTrue(good);
2380 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002381 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002382 PyString_AS_STRING((PyStringObject *)result)[j++] =
2383 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002384 }
2385
Guido van Rossum79f25d91997-04-29 20:08:16 +00002386 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002387 return NULL;
2388
Guido van Rossum12d12c51993-10-26 17:58:25 +00002389 return result;
2390
Guido van Rossum12d12c51993-10-26 17:58:25 +00002391Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002392 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002393 return NULL;
2394}