blob: fd8dc803cf55d176ef531eab95848bb0a1c9282f [file] [log] [blame]
Guido van Rossumf70e43a1991-02-19 12:39:46 +00001/***********************************************************
Guido van Rossum6d023c91995-01-04 19:12:13 +00002Copyright 1991-1995 by Stichting Mathematisch Centrum, Amsterdam,
3The Netherlands.
Guido van Rossumf70e43a1991-02-19 12:39:46 +00004
5 All Rights Reserved
6
Guido van Rossumd266eb41996-10-25 14:44:06 +00007Permission to use, copy, modify, and distribute this software and its
8documentation for any purpose and without fee is hereby granted,
Guido van Rossumf70e43a1991-02-19 12:39:46 +00009provided that the above copyright notice appear in all copies and that
Guido van Rossumd266eb41996-10-25 14:44:06 +000010both that copyright notice and this permission notice appear in
Guido van Rossumf70e43a1991-02-19 12:39:46 +000011supporting documentation, and that the names of Stichting Mathematisch
Guido van Rossumd266eb41996-10-25 14:44:06 +000012Centrum or CWI or Corporation for National Research Initiatives or
13CNRI not be used in advertising or publicity pertaining to
14distribution of the software without specific, written prior
15permission.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000016
Guido van Rossumd266eb41996-10-25 14:44:06 +000017While CWI is the initial source for this software, a modified version
18is made available by the Corporation for National Research Initiatives
19(CNRI) at the Internet address ftp://ftp.python.org.
20
21STICHTING MATHEMATISCH CENTRUM AND CNRI DISCLAIM ALL WARRANTIES WITH
22REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF
23MERCHANTABILITY AND FITNESS, IN NO EVENT SHALL STICHTING MATHEMATISCH
24CENTRUM OR CNRI BE LIABLE FOR ANY SPECIAL, INDIRECT OR CONSEQUENTIAL
25DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
26PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
27TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
28PERFORMANCE OF THIS SOFTWARE.
Guido van Rossumf70e43a1991-02-19 12:39:46 +000029
30******************************************************************/
31
Guido van Rossum3f5da241990-12-20 15:06:42 +000032/* Built-in functions */
33
Guido van Rossum79f25d91997-04-29 20:08:16 +000034#include "Python.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000035
36#include "node.h"
37#include "graminit.h"
Guido van Rossum5b722181993-03-30 17:46:03 +000038#include "compile.h"
39#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000040
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000041#include "mymath.h"
42
Guido van Rossum6bf62da1997-04-11 20:37:35 +000043#include <ctype.h>
44
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000045#ifdef HAVE_UNISTD_H
46#include <unistd.h>
47#endif
48
Guido van Rossum12d12c51993-10-26 17:58:25 +000049/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000050static PyObject *filterstring Py_PROTO((PyObject *, PyObject *));
51static PyObject *filtertuple Py_PROTO((PyObject *, PyObject *));
52static PyObject *int_from_string Py_PROTO((PyObject *));
53static PyObject *long_from_string Py_PROTO((PyObject *));
54static PyObject *float_from_string Py_PROTO((PyObject *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000055
Guido van Rossum79f25d91997-04-29 20:08:16 +000056static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057builtin___import__(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000058 PyObject *self;
59 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000060{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000062 PyObject *globals = NULL;
63 PyObject *locals = NULL;
64 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000065
Guido van Rossum79f25d91997-04-29 20:08:16 +000066 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000067 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000068 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000069 return PyImport_ImportModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070}
71
72
Guido van Rossum79f25d91997-04-29 20:08:16 +000073static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000074builtin_abs(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000075 PyObject *self;
76 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077{
Guido van Rossum79f25d91997-04-29 20:08:16 +000078 PyObject *v;
79 PyNumberMethods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000080
Guido van Rossum79f25d91997-04-29 20:08:16 +000081 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000082 return NULL;
83 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000084 PyErr_SetString(PyExc_TypeError,
85 "abs() requires numeric argument");
Guido van Rossumd4905451991-05-05 20:00:36 +000086 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000087 }
Guido van Rossumd4905451991-05-05 20:00:36 +000088 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000089}
90
Guido van Rossum79f25d91997-04-29 20:08:16 +000091static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +000092builtin_apply(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000093 PyObject *self;
94 PyObject *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000095{
Guido van Rossum79f25d91997-04-29 20:08:16 +000096 PyObject *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000097
Guido van Rossum79f25d91997-04-29 20:08:16 +000098 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000099 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000100 if (alist != NULL && !PyTuple_Check(alist)) {
101 PyErr_SetString(PyExc_TypeError,
102 "apply() 2nd argument must be tuple");
Guido van Rossum2d951851994-08-29 12:52:16 +0000103 return NULL;
104 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000105 if (kwdict != NULL && !PyDict_Check(kwdict)) {
106 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000107 "apply() 3rd argument must be dictionary");
108 return NULL;
109 }
110 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000111}
112
Guido van Rossum79f25d91997-04-29 20:08:16 +0000113static PyObject *
Guido van Rossum2d951851994-08-29 12:52:16 +0000114builtin_callable(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115 PyObject *self;
116 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +0000117{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000118 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000119
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000121 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000122 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000123}
124
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000126builtin_filter(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000127 PyObject *self;
128 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000129{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000130 PyObject *func, *seq, *result;
131 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000132 int len;
133 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000134
Guido van Rossum79f25d91997-04-29 20:08:16 +0000135 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000137
Guido van Rossum79f25d91997-04-29 20:08:16 +0000138 if (PyString_Check(seq)) {
139 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000140 return r;
141 }
142
Guido van Rossum79f25d91997-04-29 20:08:16 +0000143 if (PyTuple_Check(seq)) {
144 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000145 return r;
146 }
147
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000148 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000149 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000150 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000151 goto Fail_2;
152 }
153
154 if ((len = (*sqf->sq_length)(seq)) < 0)
155 goto Fail_2;
156
Guido van Rossum79f25d91997-04-29 20:08:16 +0000157 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
158 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000159 result = seq;
160 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000161 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000162 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000163 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000164 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000165
Guido van Rossum2d951851994-08-29 12:52:16 +0000166 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000167 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000169
Guido van Rossum2d951851994-08-29 12:52:16 +0000170 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
171 if (i < len)
172 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 if (PyErr_Occurred() == PyExc_IndexError) {
174 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000175 break;
176 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000178 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000179
Guido van Rossum79f25d91997-04-29 20:08:16 +0000180 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000181 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000183 }
184 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000185 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000186 if (arg == NULL)
187 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000188 good = PyEval_CallObject(func, arg);
189 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000190 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000191 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000192 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000193 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000194 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000195 ok = PyObject_IsTrue(good);
196 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000197 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000198 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000200 goto Fail_1;
201 }
202 else {
203 j++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 if (PyList_Append(result, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000205 goto Fail_1;
206 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000207 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000208 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000210 }
211
Guido van Rossum12d12c51993-10-26 17:58:25 +0000212
Guido van Rossum79f25d91997-04-29 20:08:16 +0000213 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000214 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215
Guido van Rossum12d12c51993-10-26 17:58:25 +0000216 return result;
217
Guido van Rossum12d12c51993-10-26 17:58:25 +0000218Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000219 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000221 return NULL;
222}
223
Guido van Rossum79f25d91997-04-29 20:08:16 +0000224static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000225builtin_chr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 PyObject *self;
227 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228{
229 long x;
230 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000231
Guido van Rossum79f25d91997-04-29 20:08:16 +0000232 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000234 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000235 PyErr_SetString(PyExc_ValueError,
236 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000237 return NULL;
238 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000239 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000240 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000241}
242
Guido van Rossum79f25d91997-04-29 20:08:16 +0000243static PyObject *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000244builtin_cmp(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000245 PyObject *self;
246 PyObject *args;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000247{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000248 PyObject *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000251 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000252 return PyInt_FromLong((long)PyObject_Compare(a, b));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000253}
254
Guido van Rossum79f25d91997-04-29 20:08:16 +0000255static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000256builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 PyObject *self;
258 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000259{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 PyObject *v, *w;
261 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000262
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000264 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000265 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000266 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267 res = Py_BuildValue("(OO)", v, w);
268 Py_DECREF(v);
269 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000270 return res;
271}
272
Guido van Rossum79f25d91997-04-29 20:08:16 +0000273static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000274builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000275 PyObject *self;
276 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000277{
278 char *str;
279 char *filename;
280 char *startstr;
281 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000282
Guido van Rossum79f25d91997-04-29 20:08:16 +0000283 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000284 return NULL;
285 if (strcmp(startstr, "exec") == 0)
286 start = file_input;
287 else if (strcmp(startstr, "eval") == 0)
288 start = eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000289 else if (strcmp(startstr, "single") == 0)
290 start = single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000291 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000292 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000293 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000294 return NULL;
295 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000296 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000297}
298
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000299#ifndef WITHOUT_COMPLEX
300
Guido van Rossum79f25d91997-04-29 20:08:16 +0000301static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000302builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000303 PyObject *self;
304 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000305{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 PyObject *r, *i, *tmp;
307 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000308 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000309 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000310
311 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000312 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000313 return NULL;
314 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000315 nbr->nb_float == NULL ||
316 (i != NULL &&
317 ((nbi = i->ob_type->tp_as_number) == NULL ||
318 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000319 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000320 "complex() argument can't be converted to complex");
321 return NULL;
322 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000323 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000324 if (PyInstance_Check(r)) {
325 static PyObject *complexstr;
326 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000327 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000328 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000329 if (complexstr == NULL)
330 return NULL;
331 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000332 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000333 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000334 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000335 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000336 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000337 if (args == NULL)
338 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 r = PyEval_CallObject(f, args);
340 Py_DECREF(args);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000341 if (r == NULL)
342 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000343 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000344 }
345 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000346 if (PyComplex_Check(r)) {
347 cr = ((PyComplexObject*)r)->cval;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000348 if (own_r)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 Py_DECREF(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000350 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000351 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000352 tmp = (*nbr->nb_float)(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000353 if (own_r)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000354 Py_DECREF(r);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000355 if (tmp == NULL)
356 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 cr.real = PyFloat_AsDouble(tmp);
358 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000359 cr.imag = 0.;
360 }
361 if (i == NULL) {
362 ci.real = 0.;
363 ci.imag = 0.;
364 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000365 else if (PyComplex_Check(i))
366 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000367 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000368 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000369 if (tmp == NULL)
370 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000371 ci.real = PyFloat_AsDouble(tmp);
372 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000373 ci.imag = 0.;
374 }
375 cr.real -= ci.imag;
376 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000377 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000378}
379
380#endif
381
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000383builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000384 PyObject *self;
385 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000386{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 PyObject *v = NULL;
388 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000389
Guido van Rossum79f25d91997-04-29 20:08:16 +0000390 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000392 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 d = PyEval_GetLocals();
394 Py_INCREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 }
396 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000397 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000398 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000399 PyErr_SetString(PyExc_TypeError,
Guido van Rossum006bcd41991-10-24 14:54:44 +0000400 "dir() argument must have __dict__ attribute");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 return NULL;
402 }
Guido van Rossum3f5da241990-12-20 15:06:42 +0000403 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 if (PyDict_Check(d)) {
405 v = PyDict_Keys(d);
406 if (PyList_Sort(v) != 0) {
407 Py_DECREF(v);
Guido van Rossumdc8a1081991-10-20 20:11:03 +0000408 v = NULL;
409 }
410 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000411 else {
Guido van Rossum795ba581996-05-23 22:49:07 +0000412 v = PyObject_CallMethod(d, "keys", NULL);
413 if (v == NULL) {
414 PyErr_Clear();
Guido van Rossum79f25d91997-04-29 20:08:16 +0000415 v = PyList_New(0);
Guido van Rossum795ba581996-05-23 22:49:07 +0000416 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000417 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000418 Py_DECREF(d);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000419 return v;
420}
421
Guido van Rossum79f25d91997-04-29 20:08:16 +0000422static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000423do_divmod(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000424 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000425{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000426 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000427
Guido van Rossum79f25d91997-04-29 20:08:16 +0000428 if (PyInstance_Check(v) || PyInstance_Check(w))
429 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000430 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000431 if (v->ob_type->tp_as_number == NULL ||
432 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000433 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000434 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000435 return NULL;
436 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000437 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000438 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000439 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000440 Py_DECREF(v);
441 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000442 return res;
443}
444
Guido van Rossum79f25d91997-04-29 20:08:16 +0000445static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000446builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447 PyObject *self;
448 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000449{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000451
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000453 return NULL;
454 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000455}
456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyObject *self;
460 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000461{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 PyObject *cmd;
463 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000464 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000465
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000467 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 &PyDict_Type, &globals,
469 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000470 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 if (globals == Py_None) {
472 globals = PyEval_GetGlobals();
473 if (locals == Py_None)
474 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000475 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000477 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
479 if (PyDict_SetItemString(globals, "__builtins__",
480 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000481 return NULL;
482 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483 if (PyCode_Check(cmd))
484 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
485 if (!PyString_Check(cmd)) {
486 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000488 return NULL;
489 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 str = PyString_AsString(cmd);
491 if ((int)strlen(str) != PyString_Size(cmd)) {
492 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 "embedded '\\0' in string arg");
494 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000495 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496 while (*str == ' ' || *str == '\t')
497 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000498 return PyRun_String(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000499}
500
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000502builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 PyObject *self;
504 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000505{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000506 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 PyObject *globals = Py_None, *locals = Py_None;
508 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000509 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000510
Guido van Rossum79f25d91997-04-29 20:08:16 +0000511 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000512 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000513 &PyDict_Type, &globals,
514 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000515 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 if (globals == Py_None) {
517 globals = PyEval_GetGlobals();
518 if (locals == Py_None)
519 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000520 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000522 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000523 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
524 if (PyDict_SetItemString(globals, "__builtins__",
525 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000526 return NULL;
527 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000529 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000531 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000533 return NULL;
534 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 res = PyRun_File(fp, filename, file_input, globals, locals);
536 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000537 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000539 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000540}
541
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543builtin_float(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 PyObject *self;
545 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000546{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 PyObject *v;
548 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 if (!PyArg_ParseTuple(args, "O:float", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000551 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000553 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000555 nb->nb_float == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000557 "float() argument can't be converted to float");
558 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000559 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000560 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000561}
562
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000564builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 PyObject *self;
566 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000567{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *v;
569 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000572 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 return PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000574}
575
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000577builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 PyObject *self;
579 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000580{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000582
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000584 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 d = PyEval_GetGlobals();
586 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000587 return d;
588}
589
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000591builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyObject *self;
593 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000594{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000595 PyObject *v;
596 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000597
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000599 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000601 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 PyErr_Clear();
603 return PyInt_FromLong(0L);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000604 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605 Py_DECREF(v);
606 return PyInt_FromLong(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000607}
608
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000610builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 PyObject *self;
612 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000613{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000615
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000617 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 return PyInt_FromLong((long)v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000619}
620
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000622builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 PyObject *self;
624 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000625{
626 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 PyObject *seq;
628 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000629 int len;
630 } sequence;
631
Guido van Rossum79f25d91997-04-29 20:08:16 +0000632 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000633 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000634 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000635 register int i, j;
636
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000638 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 PyErr_SetString(PyExc_TypeError,
640 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000641 return NULL;
642 }
643
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000645 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000646
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
648 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000649 goto Fail_2;
650 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000651
Guido van Rossum2d951851994-08-29 12:52:16 +0000652 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000653 int curlen;
654
Guido van Rossum79f25d91997-04-29 20:08:16 +0000655 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000656 goto Fail_2;
657
658 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
659 static char errmsg[] =
660 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000661 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000662
663 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000665 goto Fail_2;
666 }
667
668 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
669 goto Fail_2;
670
671 if (curlen > len)
672 len = curlen;
673 }
674
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000676 goto Fail_2;
677
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000678 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000679 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000681 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000682
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000684 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000685 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000687 goto Fail_1;
688 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000689
690 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000691 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000692 Py_INCREF(Py_None);
693 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000694 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000695 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000696 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000697 if (item == NULL) {
698 if (i < sqp->len)
699 goto Fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 if (PyErr_Occurred() ==
701 PyExc_IndexError) {
702 PyErr_Clear();
703 Py_INCREF(Py_None);
704 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000705 sqp->len = -1;
706 }
707 else {
708 goto Fail_0;
709 }
710 }
711 else
712 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000713
Guido van Rossum12d12c51993-10-26 17:58:25 +0000714 }
Guido van Rossum32120311995-07-10 13:52:21 +0000715 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000716 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 if (PyTuple_SetItem(alist, j, item) < 0) {
718 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000719 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000720 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000721 continue;
722
723 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000724 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000725 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000726 }
727
Guido van Rossum32120311995-07-10 13:52:21 +0000728 if (!alist)
729 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000730
731 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000733 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000734 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000735
Guido van Rossum79f25d91997-04-29 20:08:16 +0000736 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000737 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000738 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000739 value = PyEval_CallObject(func, alist);
740 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000741 if (value == NULL)
742 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000743 }
744 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000745 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000746 goto Fail_1;
747 }
748 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000750 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000751 }
752 }
753
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000755 return result;
756
Guido van Rossum12d12c51993-10-26 17:58:25 +0000757Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000759Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000760 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000761 return NULL;
762}
763
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000765builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 PyObject *self;
767 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000768{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 PyObject *v;
770 PyObject *name;
771 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000772
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000774 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000776 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 Py_INCREF(Py_None);
778 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000779}
780
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000782builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyObject *self;
784 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000785{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 PyObject *v;
787 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000788
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000790 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000792 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793 Py_INCREF(Py_None);
794 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000795}
796
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000798builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 PyObject *self;
800 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000801{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000803 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000806 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000808 if (x == -1)
809 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000811}
812
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 PyObject *self;
816 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000817{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 PyObject *v;
819 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000824 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000825 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000827 "hex() argument can't be converted to hex");
828 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000829 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000830 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000831}
832
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000834
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 PyObject *self;
838 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000839{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000841 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 PyObject *res;
843 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844
845 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000846 if (line == NULL)
847 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849 return NULL;
850 while (*str == ' ' || *str == '\t')
851 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 globals = PyEval_GetGlobals();
853 locals = PyEval_GetLocals();
854 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
855 if (PyDict_SetItemString(globals, "__builtins__",
856 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000857 return NULL;
858 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000859 res = PyRun_String(str, eval_input, globals, locals);
860 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000862}
863
Guido van Rossume8811f81997-02-14 15:48:05 +0000864static PyObject *
865builtin_intern(self, args)
866 PyObject *self;
867 PyObject *args;
868{
869 PyObject *s;
870 if (!PyArg_ParseTuple(args, "S", &s))
871 return NULL;
872 Py_INCREF(s);
873 PyString_InternInPlace(&s);
874 return s;
875}
876
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000879 PyObject *self;
880 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000881{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 PyObject *v;
883 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000884
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000888 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000890 nb->nb_int == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000891 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000892 "int() argument can't be converted to int");
893 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000894 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000895 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896}
897
Guido van Rossum79f25d91997-04-29 20:08:16 +0000898static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000899builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900 PyObject *self;
901 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000902{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000904 long len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyTypeObject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000906
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000908 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000909 tp = v->ob_type;
910 if (tp->tp_as_sequence != NULL) {
911 len = (*tp->tp_as_sequence->sq_length)(v);
912 }
913 else if (tp->tp_as_mapping != NULL) {
914 len = (*tp->tp_as_mapping->mp_length)(v);
915 }
916 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 PyErr_SetString(PyExc_TypeError, "len() of unsized object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000918 return NULL;
919 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000920 if (len < 0)
921 return NULL;
922 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 return PyInt_FromLong(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000924}
925
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000927builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 PyObject *self;
929 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000930{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyObject *v;
932 PySequenceMethods *sqf;
Guido van Rossumd1705771996-04-09 02:41:06 +0000933
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000935 return NULL;
936 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
937 int n = (*sqf->sq_length)(v);
938 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 PyObject *l;
Guido van Rossumd1705771996-04-09 02:41:06 +0000940 if (n < 0)
941 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 l = PyList_New(n);
Guido van Rossumd1705771996-04-09 02:41:06 +0000943 if (l == NULL)
944 return NULL;
945 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumd1705771996-04-09 02:41:06 +0000947 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 Py_DECREF(l);
Guido van Rossumd1705771996-04-09 02:41:06 +0000949 l = NULL;
950 break;
951 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 PyList_SetItem(l, i, item);
Guido van Rossumd1705771996-04-09 02:41:06 +0000953 }
954 /* XXX Should support indefinite-length sequences */
955 return l;
956 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
Guido van Rossumd1705771996-04-09 02:41:06 +0000958 return NULL;
959}
960
Guido van Rossum8861b741996-07-30 16:49:37 +0000961
962static PyObject *
963builtin_slice(self, args)
964 PyObject *self;
965 PyObject *args;
966{
967 PyObject *start, *stop, *step;
968
969 start = stop = step = NULL;
970
971 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
972 return NULL;
973
974 /*This swapping of stop and start is to maintain compatibility with
975 the range builtin.*/
976 if (stop == NULL) {
977 stop = start;
978 start = NULL;
979 }
980 return PySlice_New(start, stop, step);
981}
982
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000984builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000985 PyObject *self;
986 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000987{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000988 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000989
Guido van Rossum79f25d91997-04-29 20:08:16 +0000990 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000991 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000992 d = PyEval_GetLocals();
993 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000994 return d;
995}
996
Guido van Rossum79f25d91997-04-29 20:08:16 +0000997static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000998builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 PyObject *self;
1000 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +00001001{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001002 PyObject *v;
1003 PyNumberMethods *nb;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001004
Guido van Rossum79f25d91997-04-29 20:08:16 +00001005 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001006 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +00001008 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001009 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001010 nb->nb_long == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001012 "long() argument can't be converted to long");
1013 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001014 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001015 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001016}
1017
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001019min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001021 int sign;
1022{
Guido van Rossum2d951851994-08-29 12:52:16 +00001023 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 PyObject *v, *w, *x;
1025 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001026
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001030 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001031 sq = v->ob_type->tp_as_sequence;
1032 if (sq == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyErr_SetString(PyExc_TypeError,
1034 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001035 return NULL;
1036 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001037 w = NULL;
1038 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001039 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001040 if (x == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 if (PyErr_Occurred() == PyExc_IndexError) {
1042 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001043 break;
1044 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001046 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001047 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001048 if (w == NULL)
1049 w = x;
1050 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001051 if (PyObject_Compare(x, w) * sign > 0) {
1052 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001053 w = x;
1054 }
1055 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001057 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001059 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 PyErr_SetString(PyExc_ValueError,
1061 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062 return w;
1063}
1064
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001066builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 PyObject *self;
1068 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069{
1070 return min_max(v, -1);
1071}
1072
Guido van Rossum79f25d91997-04-29 20:08:16 +00001073static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001074builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 PyObject *self;
1076 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001077{
1078 return min_max(v, 1);
1079}
1080
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001082builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001083 PyObject *self;
1084 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001085{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 PyObject *v;
1087 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001088
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001090 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001091 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1092 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001094 "oct() argument can't be converted to oct");
1095 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001096 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001097 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001098}
1099
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001101builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 PyObject *self;
1103 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001104{
Guido van Rossum2d951851994-08-29 12:52:16 +00001105 char *name;
1106 char *mode = "r";
1107 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001109
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001111 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001113 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001115 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001116}
1117
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001119builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001120 PyObject *self;
1121 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001122{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001123 char c;
1124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001126 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001128}
1129
Guido van Rossum79f25d91997-04-29 20:08:16 +00001130static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001131do_pow(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001132 PyObject *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001133{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 PyObject *res;
1135 if (PyInstance_Check(v) || PyInstance_Check(w))
1136 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001137 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001138 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyErr_SetString(PyExc_TypeError,
1140 "pow() requires numeric arguments");
Guido van Rossumd4905451991-05-05 20:00:36 +00001141 return NULL;
1142 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001143 if (
1144#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 !PyComplex_Check(v) &&
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001146#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
1148 if (!PyErr_Occurred())
1149 PyErr_SetString(PyExc_ValueError,
1150 "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001151 return NULL;
1152 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001154 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
1156 Py_DECREF(v);
1157 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001158 return res;
1159}
1160
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001162builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 PyObject *self;
1164 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001165{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166 PyObject *v, *w, *z = Py_None, *res;
1167 PyObject *v1, *z1, *w2, *z2;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001168
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001170 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 if (z == Py_None)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001172 return do_pow(v, w);
1173 /* XXX The ternary version doesn't do class instance coercions */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 if (PyInstance_Check(v))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001175 return v->ob_type->tp_as_number->nb_power(v, w, z);
1176 if (v->ob_type->tp_as_number == NULL ||
1177 z->ob_type->tp_as_number == NULL ||
1178 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 PyErr_SetString(PyExc_TypeError,
1180 "pow() requires numeric arguments");
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001181 return NULL;
1182 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001184 return NULL;
1185 res = NULL;
1186 v1 = v;
1187 z1 = z;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 if (PyNumber_Coerce(&v1, &z1) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001189 goto error2;
1190 w2 = w;
1191 z2 = z1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 if (PyNumber_Coerce(&w2, &z2) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001193 goto error1;
1194 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 Py_DECREF(w2);
1196 Py_DECREF(z2);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001197 error1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 Py_DECREF(v1);
1199 Py_DECREF(z1);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001200 error2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 Py_DECREF(v);
1202 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001203 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001204}
1205
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001207builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001208 PyObject *self;
1209 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001210{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001211 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001212 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001214
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 if (PyTuple_Size(args) <= 1) {
1216 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001217 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001218 &ihigh))
1219 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001220 }
1221 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001222 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001223 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001224 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001225 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001226 }
1227 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001229 return NULL;
1230 }
1231 /* XXX ought to check overflow of subtraction */
1232 if (istep > 0)
1233 n = (ihigh - ilow + istep - 1) / istep;
1234 else
1235 n = (ihigh - ilow + istep + 1) / istep;
1236 if (n < 0)
1237 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001239 if (v == NULL)
1240 return NULL;
1241 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001243 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001245 return NULL;
1246 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248 ilow += istep;
1249 }
1250 return v;
1251}
1252
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001255 PyObject *self;
1256 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001257{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001258 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001259 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001260
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 if (PyTuple_Size(args) <= 1) {
1262 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001263 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001264 &ihigh))
1265 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001266 }
1267 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001269 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001270 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001271 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001272 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001273 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001275 return NULL;
1276 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001277 /* XXX ought to check overflow of subtraction */
1278 if (istep > 0)
1279 n = (ihigh - ilow + istep - 1) / istep;
1280 else
1281 n = (ihigh - ilow + istep + 1) / istep;
1282 if (n < 0)
1283 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001284 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001285}
1286
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001288
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 PyObject *self;
1292 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001293{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 PyObject *v = NULL;
1295 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001298 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1300 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001301 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001303 char *prompt;
1304 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001306 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001308 if (po == NULL)
1309 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001311 }
1312 else {
1313 po = NULL;
1314 prompt = "";
1315 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316 s = PyOS_Readline(prompt);
1317 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001318 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001320 return NULL;
1321 }
1322 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001324 result = NULL;
1325 }
1326 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001328 }
1329 free(s);
1330 return result;
1331 }
Guido van Rossum90933611991-06-07 16:10:43 +00001332 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001334 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001336 return NULL;
1337 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 Py_FlushLine();
1339 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001340 return NULL;
1341 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001343 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001344 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001345 return NULL;
1346 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001347 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001348}
1349
Guido van Rossum79f25d91997-04-29 20:08:16 +00001350static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001351builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352 PyObject *self;
1353 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001354{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 PyObject *seq, *func, *result = NULL;
1356 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001357 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001358
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360 return NULL;
1361 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001363
1364 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001366 "2nd argument to reduce() must be a sequence object");
1367 return NULL;
1368 }
1369
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001371 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001372
Guido van Rossum2d951851994-08-29 12:52:16 +00001373 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001374 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001375
1376 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 Py_DECREF(args);
1378 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001379 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001380 }
1381
Guido van Rossum2d951851994-08-29 12:52:16 +00001382 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 if (PyErr_Occurred() == PyExc_IndexError) {
1384 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001385 break;
1386 }
1387 goto Fail;
1388 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001389
Guido van Rossum2d951851994-08-29 12:52:16 +00001390 if (result == NULL)
1391 result = op2;
1392 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393 PyTuple_SetItem(args, 0, result);
1394 PyTuple_SetItem(args, 1, op2);
1395 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001396 goto Fail;
1397 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001398 }
1399
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001401
Guido van Rossum2d951851994-08-29 12:52:16 +00001402 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001404 "reduce of empty sequence with no initial value");
1405
Guido van Rossum12d12c51993-10-26 17:58:25 +00001406 return result;
1407
Guido van Rossum2d951851994-08-29 12:52:16 +00001408Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 Py_XDECREF(args);
1410 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001411 return NULL;
1412}
1413
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001415builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 PyObject *self;
1417 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001418{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001420
Guido van Rossum79f25d91997-04-29 20:08:16 +00001421 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001422 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001423 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001424}
1425
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001427builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 PyObject *self;
1429 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001430{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001431 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001432
Guido van Rossum79f25d91997-04-29 20:08:16 +00001433 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001434 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001436}
1437
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001439builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440 PyObject *self;
1441 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001442{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001443 double x;
1444 double f;
1445 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001446 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001447
Guido van Rossum79f25d91997-04-29 20:08:16 +00001448 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001449 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001450 f = 1.0;
1451 for (i = ndigits; --i >= 0; )
1452 f = f*10.0;
1453 for (i = ndigits; ++i <= 0; )
1454 f = f*0.1;
1455 if (x >= 0.0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 return PyFloat_FromDouble(floor(x*f + 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001457 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001459}
1460
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 PyObject *self;
1464 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001465{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001469 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001471}
1472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001474builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475 PyObject *self;
1476 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001477{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478 PyObject *v;
1479 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001480
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001482 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 if (PyTuple_Check(v)) {
1484 Py_INCREF(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001485 return v;
1486 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001487 if (PyList_Check(v))
1488 return PyList_AsTuple(v);
1489 if (PyString_Check(v)) {
1490 int n = PyString_Size(v);
1491 PyObject *t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001492 if (t != NULL) {
1493 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 char *p = PyString_AsString(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001495 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 PyObject *item =
1497 PyString_FromStringAndSize(p+i, 1);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001498 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001500 t = NULL;
1501 break;
1502 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001504 }
1505 }
1506 return t;
1507 }
1508 /* Generic sequence object */
1509 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1510 int n = (*sqf->sq_length)(v);
1511 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 PyObject *t;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001513 if (n < 0)
1514 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001515 t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001516 if (t == NULL)
1517 return NULL;
1518 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001520 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001522 t = NULL;
1523 break;
1524 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001526 }
1527 /* XXX Should support indefinite-length sequences */
1528 return t;
1529 }
1530 /* None of the above */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 PyErr_SetString(PyExc_TypeError,
1532 "tuple() argument must be a sequence");
Guido van Rossumcae027b1994-08-29 12:53:11 +00001533 return NULL;
1534}
1535
Guido van Rossum79f25d91997-04-29 20:08:16 +00001536static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001537builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 PyObject *self;
1539 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001540{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001541 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001542
Guido van Rossum79f25d91997-04-29 20:08:16 +00001543 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001544 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545 v = (PyObject *)v->ob_type;
1546 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001547 return v;
1548}
1549
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001551builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001552 PyObject *self;
1553 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001554{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 PyObject *v = NULL;
1556 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001557
Guido van Rossum79f25d91997-04-29 20:08:16 +00001558 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001559 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001560 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001562 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001563 if (!PyErr_Occurred())
1564 PyErr_SetString(PyExc_SystemError,
1565 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001566 }
1567 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001569 }
1570 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001572 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001574 "vars() argument must have __dict__ attribute");
1575 return NULL;
1576 }
1577 }
1578 return d;
1579}
1580
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001582 {"__import__", builtin___import__, 1},
1583 {"abs", builtin_abs, 1},
1584 {"apply", builtin_apply, 1},
1585 {"callable", builtin_callable, 1},
1586 {"chr", builtin_chr, 1},
1587 {"cmp", builtin_cmp, 1},
1588 {"coerce", builtin_coerce, 1},
1589 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001590#ifndef WITHOUT_COMPLEX
1591 {"complex", builtin_complex, 1},
1592#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001593 {"delattr", builtin_delattr, 1},
1594 {"dir", builtin_dir, 1},
1595 {"divmod", builtin_divmod, 1},
1596 {"eval", builtin_eval, 1},
1597 {"execfile", builtin_execfile, 1},
1598 {"filter", builtin_filter, 1},
1599 {"float", builtin_float, 1},
1600 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001601 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001602 {"hasattr", builtin_hasattr, 1},
1603 {"hash", builtin_hash, 1},
1604 {"hex", builtin_hex, 1},
1605 {"id", builtin_id, 1},
1606 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001607 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001608 {"int", builtin_int, 1},
1609 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001610 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001611 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001612 {"long", builtin_long, 1},
1613 {"map", builtin_map, 1},
1614 {"max", builtin_max, 1},
1615 {"min", builtin_min, 1},
1616 {"oct", builtin_oct, 1},
1617 {"open", builtin_open, 1},
1618 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001619 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001620 {"range", builtin_range, 1},
1621 {"raw_input", builtin_raw_input, 1},
1622 {"reduce", builtin_reduce, 1},
1623 {"reload", builtin_reload, 1},
1624 {"repr", builtin_repr, 1},
1625 {"round", builtin_round, 1},
1626 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001627 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001628 {"str", builtin_str, 1},
1629 {"tuple", builtin_tuple, 1},
1630 {"type", builtin_type, 1},
1631 {"vars", builtin_vars, 1},
1632 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001633 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001634};
1635
Guido van Rossum79f25d91997-04-29 20:08:16 +00001636static PyObject *builtin_mod;
1637static PyObject *builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001638
Guido van Rossum79f25d91997-04-29 20:08:16 +00001639PyObject *
1640PyBuiltin_GetModule()
Guido van Rossum0865dd91995-01-17 16:30:22 +00001641{
1642 return builtin_mod;
1643}
1644
Guido van Rossum79f25d91997-04-29 20:08:16 +00001645PyObject *
1646PyBuiltin_GetDict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001647{
Guido van Rossum6135a871995-01-09 17:53:26 +00001648 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001649}
1650
1651/* Predefined exceptions */
1652
Guido van Rossum79f25d91997-04-29 20:08:16 +00001653PyObject *PyExc_AccessError;
1654PyObject *PyExc_AssertionError;
1655PyObject *PyExc_AttributeError;
1656PyObject *PyExc_EOFError;
1657PyObject *FloatingPointError;
1658PyObject *PyExc_IOError;
1659PyObject *PyExc_ImportError;
1660PyObject *PyExc_IndexError;
1661PyObject *PyExc_KeyError;
1662PyObject *PyExc_KeyboardInterrupt;
1663PyObject *PyExc_MemoryError;
1664PyObject *PyExc_NameError;
1665PyObject *PyExc_OverflowError;
1666PyObject *PyExc_RuntimeError;
1667PyObject *PyExc_SyntaxError;
1668PyObject *PyExc_SystemError;
1669PyObject *PyExc_SystemExit;
1670PyObject *PyExc_TypeError;
1671PyObject *PyExc_ValueError;
1672PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001673
Guido van Rossum79f25d91997-04-29 20:08:16 +00001674static PyObject *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001675newstdexception(name)
1676 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001677{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678 PyObject *v = PyString_FromString(name);
1679 if (v == NULL || PyDict_SetItemString(builtin_dict, name, v) != 0)
1680 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001681 return v;
1682}
1683
1684static void
1685initerrors()
1686{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001687 PyExc_AccessError = newstdexception("AccessError");
Guido van Rossumc6472e91997-03-31 17:15:43 +00001688 PyExc_AssertionError = newstdexception("AssertionError");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001689 PyExc_AttributeError = newstdexception("AttributeError");
1690 PyExc_EOFError = newstdexception("EOFError");
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001691 FloatingPointError = newstdexception("FloatingPointError");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001692 PyExc_IOError = newstdexception("IOError");
1693 PyExc_ImportError = newstdexception("ImportError");
1694 PyExc_IndexError = newstdexception("IndexError");
1695 PyExc_KeyError = newstdexception("KeyError");
1696 PyExc_KeyboardInterrupt = newstdexception("KeyboardInterrupt");
1697 PyExc_MemoryError = newstdexception("MemoryError");
1698 PyExc_NameError = newstdexception("NameError");
1699 PyExc_OverflowError = newstdexception("OverflowError");
1700 PyExc_RuntimeError = newstdexception("RuntimeError");
1701 PyExc_SyntaxError = newstdexception("SyntaxError");
1702 PyExc_SystemError = newstdexception("SystemError");
1703 PyExc_SystemExit = newstdexception("SystemExit");
1704 PyExc_TypeError = newstdexception("TypeError");
1705 PyExc_ValueError = newstdexception("ValueError");
1706 PyExc_ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001707}
1708
1709void
Guido van Rossum79f25d91997-04-29 20:08:16 +00001710PyBuiltin_Init()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001711{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 builtin_mod = Py_InitModule("__builtin__", builtin_methods);
1713 builtin_dict = PyModule_GetDict(builtin_mod);
1714 Py_INCREF(builtin_dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001715 initerrors();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001716 (void) PyDict_SetItemString(builtin_dict, "None", Py_None);
1717 (void) PyDict_SetItemString(builtin_dict, "Ellipsis", Py_Ellipsis);
1718 (void) PyDict_SetItemString(builtin_dict, "__debug__",
1719 PyInt_FromLong(Py_OptimizeFlag == 0));
1720 if (PyErr_Occurred())
1721 Py_FatalError(
1722 "error creating None/Ellipsis/__debug__ in __builtin__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001724
Guido van Rossum12d12c51993-10-26 17:58:25 +00001725
Guido van Rossume77a7571993-11-03 15:01:26 +00001726/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001727
Guido van Rossum79f25d91997-04-29 20:08:16 +00001728static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001729filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001730 PyObject *func;
1731 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001732{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001733 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001734 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001736
Guido van Rossumb7b45621995-08-04 04:07:45 +00001737 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001739 return tuple;
1740 }
1741
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001743 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001744
Guido van Rossum12d12c51993-10-26 17:58:25 +00001745 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001746 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001747 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001748
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001750 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001751 if (func == Py_None) {
1752 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001753 good = item;
1754 }
1755 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001757 if (arg == NULL)
1758 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 good = PyEval_CallObject(func, arg);
1760 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001761 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001762 goto Fail_1;
1763 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764 ok = PyObject_IsTrue(good);
1765 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001766 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 Py_INCREF(item);
1768 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001769 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001770 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001771 }
1772
Guido van Rossum79f25d91997-04-29 20:08:16 +00001773 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001774 return NULL;
1775
Guido van Rossum12d12c51993-10-26 17:58:25 +00001776 return result;
1777
Guido van Rossum12d12c51993-10-26 17:58:25 +00001778Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001779 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001780 return NULL;
1781}
1782
1783
Guido van Rossume77a7571993-11-03 15:01:26 +00001784/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001785
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 PyObject *func;
1789 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001790{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001791 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001792 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001794
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001796 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001797 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001798 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001799 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001801 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001802
Guido van Rossum12d12c51993-10-26 17:58:25 +00001803 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001805 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001807 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1808 if (item == NULL)
1809 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001810 arg = Py_BuildValue("(O)", item);
1811 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001812 if (arg == NULL)
1813 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 good = PyEval_CallObject(func, arg);
1815 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001816 if (good == NULL)
1817 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 ok = PyObject_IsTrue(good);
1819 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001820 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 PyString_AS_STRING((PyStringObject *)result)[j++] =
1822 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001823 }
1824
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001826 return NULL;
1827
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828 return result;
1829
Guido van Rossum12d12c51993-10-26 17:58:25 +00001830Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001832 return NULL;
1833}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001834
1835/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1836
1837static PyObject *
1838int_from_string(v)
1839 PyObject *v;
1840{
1841 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1842 char *s, *end;
1843 long x;
1844 char buffer[256]; /* For errors */
1845
1846 if (!PyArg_Parse(v, "s", &s))
1847 return NULL;
1848 while (*s && isspace(Py_CHARMASK(*s)))
1849 s++;
1850 if (s[0] == '\0') {
1851 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1852 return NULL;
1853 }
1854 errno = 0;
1855 x = PyOS_strtol(s, &end, 10);
1856 while (*end && isspace(Py_CHARMASK(*end)))
1857 end++;
1858 if (*end != '\0') {
1859 sprintf(buffer, "invalid literal for int(): %.200s", s);
1860 PyErr_SetString(PyExc_ValueError, buffer);
1861 return NULL;
1862 }
1863 else if (errno != 0) {
1864 sprintf(buffer, "int() literal too large: %.200s", s);
1865 PyErr_SetString(PyExc_ValueError, buffer);
1866 return NULL;
1867 }
1868 return PyInt_FromLong(x);
1869}
1870
1871static PyObject *
1872long_from_string(v)
1873 PyObject *v;
1874{
1875 char *s, *end;
1876 PyObject *x;
1877 char buffer[256]; /* For errors */
1878
1879 if (!PyArg_Parse(v, "s", &s))
1880 return NULL;
1881
1882 while (*s && isspace(Py_CHARMASK(*s)))
1883 s++;
1884 if (s[0] == '\0') {
1885 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1886 return NULL;
1887 }
1888 x = PyLong_FromString(s, &end, 10);
1889 if (x == NULL)
1890 return NULL;
1891 while (*end && isspace(Py_CHARMASK(*end)))
1892 end++;
1893 if (*end != '\0') {
1894 sprintf(buffer, "invalid literal for long(): %.200s", s);
1895 PyErr_SetString(PyExc_ValueError, buffer);
1896 Py_DECREF(x);
1897 return NULL;
1898 }
1899 return x;
1900}
1901
1902static PyObject *
1903float_from_string(v)
1904 PyObject *v;
1905{
1906 extern double strtod Py_PROTO((const char *, char **));
1907 char *s, *end;
1908 double x;
1909 char buffer[256]; /* For errors */
1910
1911 if (!PyArg_Parse(v, "s", &s))
1912 return NULL;
1913 while (*s && isspace(Py_CHARMASK(*s)))
1914 s++;
1915 if (s[0] == '\0') {
1916 PyErr_SetString(PyExc_ValueError, "empty string for float()");
1917 return NULL;
1918 }
1919 errno = 0;
1920 PyFPE_START_PROTECT("float_from_string", return 0)
1921 x = strtod(s, &end);
1922 PyFPE_END_PROTECT(x)
1923 while (*end && isspace(Py_CHARMASK(*end)))
1924 end++;
1925 if (*end != '\0') {
1926 sprintf(buffer, "invalid literal for float(): %.200s", s);
1927 PyErr_SetString(PyExc_ValueError, buffer);
1928 return NULL;
1929 }
1930 else if (errno != 0) {
1931 sprintf(buffer, "float() literal too large: %.200s", s);
1932 PyErr_SetString(PyExc_ValueError, buffer);
1933 return NULL;
1934 }
1935 return PyFloat_FromDouble(x);
1936}