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