blob: 2461904ade1084d0ee3579c82c0679fa9ea880b9 [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 Rossum666b17a1997-05-06 16:36:57 +0000387 static char *attrlist[] = {"__members__", "__methods__", NULL};
388 PyObject *v = NULL, *l = NULL, *m = NULL;
389 PyObject *d, *x;
390 int i;
391 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000392
Guido van Rossum79f25d91997-04-29 20:08:16 +0000393 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000394 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000395 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000396 x = PyEval_GetLocals();
397 if (x == NULL)
398 goto error;
399 l = PyMapping_Keys(x);
400 if (l == NULL)
401 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000402 }
403 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000404 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000405 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000406 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000407 else {
408 l = PyMapping_Keys(d);
409 if (l == NULL)
410 PyErr_Clear();
411 Py_DECREF(d);
412 }
413 if (l == NULL) {
414 l = PyList_New(0);
415 if (l == NULL)
416 goto error;
417 }
418 for (s = attrlist; *s != NULL; s++) {
419 m = PyObject_GetAttrString(v, *s);
420 if (m == NULL) {
421 PyErr_Clear();
422 continue;
423 }
424 for (i = 0; ; i++) {
425 x = PySequence_GetItem(m, i);
426 if (x == NULL) {
427 PyErr_Clear();
428 break;
429 }
430 if (PyList_Append(l, x) != 0) {
431 Py_DECREF(x);
432 Py_DECREF(m);
433 goto error;
434 }
435 Py_DECREF(x);
436 }
437 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000438 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000439 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000440 if (PyList_Sort(l) != 0)
441 goto error;
442 return l;
443 error:
444 Py_XDECREF(l);
445 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000446}
447
Guido van Rossum79f25d91997-04-29 20:08:16 +0000448static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000449do_divmod(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000450 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000452 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000453
Guido van Rossum79f25d91997-04-29 20:08:16 +0000454 if (PyInstance_Check(v) || PyInstance_Check(w))
455 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000456 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000457 if (v->ob_type->tp_as_number == NULL ||
458 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000460 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000461 return NULL;
462 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000463 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000464 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000465 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 Py_DECREF(v);
467 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000468 return res;
469}
470
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000472builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000473 PyObject *self;
474 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000475{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000477
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000479 return NULL;
480 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000481}
482
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000484builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000485 PyObject *self;
486 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000487{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 PyObject *cmd;
489 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000490 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000491
Guido van Rossum79f25d91997-04-29 20:08:16 +0000492 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000494 &PyDict_Type, &globals,
495 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 if (globals == Py_None) {
498 globals = PyEval_GetGlobals();
499 if (locals == Py_None)
500 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000501 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000503 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000504 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
505 if (PyDict_SetItemString(globals, "__builtins__",
506 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000507 return NULL;
508 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 if (PyCode_Check(cmd))
510 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
511 if (!PyString_Check(cmd)) {
512 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000513 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000514 return NULL;
515 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000516 str = PyString_AsString(cmd);
517 if ((int)strlen(str) != PyString_Size(cmd)) {
518 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000519 "embedded '\\0' in string arg");
520 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000521 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 while (*str == ' ' || *str == '\t')
523 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000524 return PyRun_String(str, eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000525}
526
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 PyObject *self;
530 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000531{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000532 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000533 PyObject *globals = Py_None, *locals = Py_None;
534 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000535 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000536
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000539 &PyDict_Type, &globals,
540 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000541 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 if (globals == Py_None) {
543 globals = PyEval_GetGlobals();
544 if (locals == Py_None)
545 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000546 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000548 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000549 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
550 if (PyDict_SetItemString(globals, "__builtins__",
551 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000552 return NULL;
553 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000555 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000556 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000557 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000559 return NULL;
560 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 res = PyRun_File(fp, filename, file_input, globals, locals);
562 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000563 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000564 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000565 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000566}
567
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000569builtin_float(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000570 PyObject *self;
571 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000572{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 PyObject *v;
574 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000575
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 if (!PyArg_ParseTuple(args, "O:float", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000577 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000579 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000581 nb->nb_float == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000583 "float() argument can't be converted to float");
584 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000585 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000586 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000587}
588
Guido van Rossum79f25d91997-04-29 20:08:16 +0000589static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000590builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000591 PyObject *self;
592 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000593{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyObject *v;
595 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000596
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000598 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 return PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000600}
601
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000603builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 PyObject *self;
605 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000606{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000608
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000610 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000611 d = PyEval_GetGlobals();
612 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000613 return d;
614}
615
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000617builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000618 PyObject *self;
619 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000620{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 PyObject *v;
622 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000623
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000625 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000627 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000628 PyErr_Clear();
629 return PyInt_FromLong(0L);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 Py_DECREF(v);
632 return PyInt_FromLong(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000633}
634
Guido van Rossum79f25d91997-04-29 20:08:16 +0000635static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000636builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000637 PyObject *self;
638 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000639{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000641
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000643 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000644 return PyInt_FromLong((long)v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000645}
646
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000648builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 PyObject *self;
650 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000651{
652 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000653 PyObject *seq;
654 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000655 int len;
656 } sequence;
657
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000659 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000660 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000661 register int i, j;
662
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000664 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000665 PyErr_SetString(PyExc_TypeError,
666 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000667 return NULL;
668 }
669
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000671 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000672
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
674 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000675 goto Fail_2;
676 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000677
Guido van Rossum2d951851994-08-29 12:52:16 +0000678 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000679 int curlen;
680
Guido van Rossum79f25d91997-04-29 20:08:16 +0000681 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000682 goto Fail_2;
683
684 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
685 static char errmsg[] =
686 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000687 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000688
689 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000690 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000691 goto Fail_2;
692 }
693
694 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
695 goto Fail_2;
696
697 if (curlen > len)
698 len = curlen;
699 }
700
Guido van Rossum79f25d91997-04-29 20:08:16 +0000701 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000702 goto Fail_2;
703
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000704 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000705 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000707 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000708
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000710 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000711 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000713 goto Fail_1;
714 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000715
716 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000717 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000718 Py_INCREF(Py_None);
719 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000720 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000721 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000722 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000723 if (item == NULL) {
724 if (i < sqp->len)
725 goto Fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000726 if (PyErr_Occurred() ==
727 PyExc_IndexError) {
728 PyErr_Clear();
729 Py_INCREF(Py_None);
730 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000731 sqp->len = -1;
732 }
733 else {
734 goto Fail_0;
735 }
736 }
737 else
738 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000739
Guido van Rossum12d12c51993-10-26 17:58:25 +0000740 }
Guido van Rossum32120311995-07-10 13:52:21 +0000741 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000742 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 if (PyTuple_SetItem(alist, j, item) < 0) {
744 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000745 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000746 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000747 continue;
748
749 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000750 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000751 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000752 }
753
Guido van Rossum32120311995-07-10 13:52:21 +0000754 if (!alist)
755 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000756
757 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000759 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000760 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000761
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000763 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000764 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 value = PyEval_CallObject(func, alist);
766 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000767 if (value == NULL)
768 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000769 }
770 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000772 goto Fail_1;
773 }
774 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000776 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000777 }
778 }
779
Guido van Rossum79f25d91997-04-29 20:08:16 +0000780 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000781 return result;
782
Guido van Rossum12d12c51993-10-26 17:58:25 +0000783Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000785Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000787 return NULL;
788}
789
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000791builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 PyObject *self;
793 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000794{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 PyObject *v;
796 PyObject *name;
797 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000798
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000800 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000802 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 Py_INCREF(Py_None);
804 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000805}
806
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000808builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 PyObject *self;
810 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000811{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 PyObject *v;
813 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000814
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000816 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000817 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000818 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 Py_INCREF(Py_None);
820 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000821}
822
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000824builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 PyObject *self;
826 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000827{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000829 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000830
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000832 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000834 if (x == -1)
835 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000837}
838
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000840builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000841 PyObject *self;
842 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000843{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 PyObject *v;
845 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000848 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000849
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000851 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000852 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000853 "hex() argument can't be converted to hex");
854 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000855 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000856 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000857}
858
Guido van Rossum79f25d91997-04-29 20:08:16 +0000859static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000860
Guido van Rossum79f25d91997-04-29 20:08:16 +0000861static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000862builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863 PyObject *self;
864 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000865{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000867 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000868 PyObject *res;
869 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870
871 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000872 if (line == NULL)
873 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000875 return NULL;
876 while (*str == ' ' || *str == '\t')
877 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 globals = PyEval_GetGlobals();
879 locals = PyEval_GetLocals();
880 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
881 if (PyDict_SetItemString(globals, "__builtins__",
882 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000883 return NULL;
884 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 res = PyRun_String(str, eval_input, globals, locals);
886 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000887 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000888}
889
Guido van Rossume8811f81997-02-14 15:48:05 +0000890static PyObject *
891builtin_intern(self, args)
892 PyObject *self;
893 PyObject *args;
894{
895 PyObject *s;
896 if (!PyArg_ParseTuple(args, "S", &s))
897 return NULL;
898 Py_INCREF(s);
899 PyString_InternInPlace(&s);
900 return s;
901}
902
Guido van Rossum79f25d91997-04-29 20:08:16 +0000903static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000904builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *self;
906 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000907{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 PyObject *v;
909 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000912 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000913 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000914 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000916 nb->nb_int == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000918 "int() argument can't be converted to int");
919 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000920 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000921 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000922}
923
Guido van Rossum79f25d91997-04-29 20:08:16 +0000924static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000925builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000926 PyObject *self;
927 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000928{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000930 long len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000931 PyTypeObject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000932
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000935 tp = v->ob_type;
936 if (tp->tp_as_sequence != NULL) {
937 len = (*tp->tp_as_sequence->sq_length)(v);
938 }
939 else if (tp->tp_as_mapping != NULL) {
940 len = (*tp->tp_as_mapping->mp_length)(v);
941 }
942 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 PyErr_SetString(PyExc_TypeError, "len() of unsized object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000944 return NULL;
945 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000946 if (len < 0)
947 return NULL;
948 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 return PyInt_FromLong(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000950}
951
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000953builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 PyObject *self;
955 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000956{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyObject *v;
958 PySequenceMethods *sqf;
Guido van Rossumd1705771996-04-09 02:41:06 +0000959
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000961 return NULL;
962 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
963 int n = (*sqf->sq_length)(v);
964 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 PyObject *l;
Guido van Rossumd1705771996-04-09 02:41:06 +0000966 if (n < 0)
967 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 l = PyList_New(n);
Guido van Rossumd1705771996-04-09 02:41:06 +0000969 if (l == NULL)
970 return NULL;
971 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumd1705771996-04-09 02:41:06 +0000973 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 Py_DECREF(l);
Guido van Rossumd1705771996-04-09 02:41:06 +0000975 l = NULL;
976 break;
977 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyList_SetItem(l, i, item);
Guido van Rossumd1705771996-04-09 02:41:06 +0000979 }
980 /* XXX Should support indefinite-length sequences */
981 return l;
982 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
Guido van Rossumd1705771996-04-09 02:41:06 +0000984 return NULL;
985}
986
Guido van Rossum8861b741996-07-30 16:49:37 +0000987
988static PyObject *
989builtin_slice(self, args)
990 PyObject *self;
991 PyObject *args;
992{
993 PyObject *start, *stop, *step;
994
995 start = stop = step = NULL;
996
997 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
998 return NULL;
999
1000 /*This swapping of stop and start is to maintain compatibility with
1001 the range builtin.*/
1002 if (stop == NULL) {
1003 stop = start;
1004 start = NULL;
1005 }
1006 return PySlice_New(start, stop, step);
1007}
1008
Guido van Rossum79f25d91997-04-29 20:08:16 +00001009static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001010builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001011 PyObject *self;
1012 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001013{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001015
Guido van Rossum79f25d91997-04-29 20:08:16 +00001016 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +00001017 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 d = PyEval_GetLocals();
1019 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001020 return d;
1021}
1022
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001024builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001025 PyObject *self;
1026 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +00001027{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 PyObject *v;
1029 PyNumberMethods *nb;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001030
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001032 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +00001034 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001036 nb->nb_long == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001038 "long() argument can't be converted to long");
1039 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001040 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001041 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001042}
1043
Guido van Rossum79f25d91997-04-29 20:08:16 +00001044static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001045min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001046 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001047 int sign;
1048{
Guido van Rossum2d951851994-08-29 12:52:16 +00001049 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001050 PyObject *v, *w, *x;
1051 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001052
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001054 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001056 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001057 sq = v->ob_type->tp_as_sequence;
1058 if (sq == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 PyErr_SetString(PyExc_TypeError,
1060 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001061 return NULL;
1062 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001063 w = NULL;
1064 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001066 if (x == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 if (PyErr_Occurred() == PyExc_IndexError) {
1068 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001069 break;
1070 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001071 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001073 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001074 if (w == NULL)
1075 w = x;
1076 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 if (PyObject_Compare(x, w) * sign > 0) {
1078 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001079 w = x;
1080 }
1081 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001082 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001083 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001084 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001085 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001086 PyErr_SetString(PyExc_ValueError,
1087 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001088 return w;
1089}
1090
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001092builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001093 PyObject *self;
1094 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001095{
1096 return min_max(v, -1);
1097}
1098
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001100builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101 PyObject *self;
1102 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001103{
1104 return min_max(v, 1);
1105}
1106
Guido van Rossum79f25d91997-04-29 20:08:16 +00001107static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001108builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109 PyObject *self;
1110 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001111{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 PyObject *v;
1113 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001114
Guido van Rossum79f25d91997-04-29 20:08:16 +00001115 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001116 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001117 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1118 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001120 "oct() argument can't be converted to oct");
1121 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001122 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001123 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001124}
1125
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001127builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 PyObject *self;
1129 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001130{
Guido van Rossum2d951851994-08-29 12:52:16 +00001131 char *name;
1132 char *mode = "r";
1133 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001134 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001135
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001137 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001139 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001140 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001141 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001142}
1143
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001145builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 PyObject *self;
1147 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001148{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001149 char c;
1150
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001152 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001154}
1155
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001157do_pow(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyObject *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001159{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 PyObject *res;
1161 if (PyInstance_Check(v) || PyInstance_Check(w))
1162 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001163 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001164 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 PyErr_SetString(PyExc_TypeError,
1166 "pow() requires numeric arguments");
Guido van Rossumd4905451991-05-05 20:00:36 +00001167 return NULL;
1168 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001169 if (
1170#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171 !PyComplex_Check(v) &&
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001172#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
1174 if (!PyErr_Occurred())
1175 PyErr_SetString(PyExc_ValueError,
1176 "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001177 return NULL;
1178 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001179 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001180 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
1182 Py_DECREF(v);
1183 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001184 return res;
1185}
1186
Guido van Rossum79f25d91997-04-29 20:08:16 +00001187static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001188builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 PyObject *self;
1190 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001191{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001192 PyObject *v, *w, *z = Py_None, *res;
1193 PyObject *v1, *z1, *w2, *z2;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001194
Guido van Rossum79f25d91997-04-29 20:08:16 +00001195 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001196 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197 if (z == Py_None)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001198 return do_pow(v, w);
1199 /* XXX The ternary version doesn't do class instance coercions */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 if (PyInstance_Check(v))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001201 return v->ob_type->tp_as_number->nb_power(v, w, z);
1202 if (v->ob_type->tp_as_number == NULL ||
1203 z->ob_type->tp_as_number == NULL ||
1204 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001205 PyErr_SetString(PyExc_TypeError,
1206 "pow() requires numeric arguments");
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001207 return NULL;
1208 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001210 return NULL;
1211 res = NULL;
1212 v1 = v;
1213 z1 = z;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 if (PyNumber_Coerce(&v1, &z1) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001215 goto error2;
1216 w2 = w;
1217 z2 = z1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 if (PyNumber_Coerce(&w2, &z2) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001219 goto error1;
1220 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 Py_DECREF(w2);
1222 Py_DECREF(z2);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001223 error1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 Py_DECREF(v1);
1225 Py_DECREF(z1);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001226 error2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 Py_DECREF(v);
1228 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001229 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001230}
1231
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001233builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 PyObject *self;
1235 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001236{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001237 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001238 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001240
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241 if (PyTuple_Size(args) <= 1) {
1242 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001243 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001244 &ihigh))
1245 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001246 }
1247 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001249 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001252 }
1253 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001254 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001255 return NULL;
1256 }
1257 /* XXX ought to check overflow of subtraction */
1258 if (istep > 0)
1259 n = (ihigh - ilow + istep - 1) / istep;
1260 else
1261 n = (ihigh - ilow + istep + 1) / istep;
1262 if (n < 0)
1263 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001265 if (v == NULL)
1266 return NULL;
1267 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001268 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001269 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001271 return NULL;
1272 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001273 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001274 ilow += istep;
1275 }
1276 return v;
1277}
1278
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001280builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001281 PyObject *self;
1282 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001283{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001284 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001285 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001286
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 if (PyTuple_Size(args) <= 1) {
1288 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001289 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290 &ihigh))
1291 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001292 }
1293 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001294 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001295 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001297 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001298 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001301 return NULL;
1302 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001303 /* XXX ought to check overflow of subtraction */
1304 if (istep > 0)
1305 n = (ihigh - ilow + istep - 1) / istep;
1306 else
1307 n = (ihigh - ilow + istep + 1) / istep;
1308 if (n < 0)
1309 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001311}
1312
Guido van Rossum79f25d91997-04-29 20:08:16 +00001313extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001314
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001316builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317 PyObject *self;
1318 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001319{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 PyObject *v = NULL;
1321 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001322
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001324 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1326 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001327 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001328 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001329 char *prompt;
1330 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001331 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001332 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001334 if (po == NULL)
1335 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001336 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001337 }
1338 else {
1339 po = NULL;
1340 prompt = "";
1341 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 s = PyOS_Readline(prompt);
1343 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001344 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001346 return NULL;
1347 }
1348 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001349 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001350 result = NULL;
1351 }
1352 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001353 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001354 }
1355 free(s);
1356 return result;
1357 }
Guido van Rossum90933611991-06-07 16:10:43 +00001358 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001360 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362 return NULL;
1363 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 Py_FlushLine();
1365 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001366 return NULL;
1367 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371 return NULL;
1372 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001374}
1375
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001377builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 PyObject *self;
1379 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001380{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 PyObject *seq, *func, *result = NULL;
1382 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001383 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001384
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001386 return NULL;
1387 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001389
1390 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001392 "2nd argument to reduce() must be a sequence object");
1393 return NULL;
1394 }
1395
Guido van Rossum79f25d91997-04-29 20:08:16 +00001396 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001397 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001398
Guido van Rossum2d951851994-08-29 12:52:16 +00001399 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001401
1402 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 Py_DECREF(args);
1404 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001405 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001406 }
1407
Guido van Rossum2d951851994-08-29 12:52:16 +00001408 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 if (PyErr_Occurred() == PyExc_IndexError) {
1410 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001411 break;
1412 }
1413 goto Fail;
1414 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001415
Guido van Rossum2d951851994-08-29 12:52:16 +00001416 if (result == NULL)
1417 result = op2;
1418 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001419 PyTuple_SetItem(args, 0, result);
1420 PyTuple_SetItem(args, 1, op2);
1421 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001422 goto Fail;
1423 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001424 }
1425
Guido van Rossum79f25d91997-04-29 20:08:16 +00001426 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001427
Guido van Rossum2d951851994-08-29 12:52:16 +00001428 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001430 "reduce of empty sequence with no initial value");
1431
Guido van Rossum12d12c51993-10-26 17:58:25 +00001432 return result;
1433
Guido van Rossum2d951851994-08-29 12:52:16 +00001434Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 Py_XDECREF(args);
1436 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001437 return NULL;
1438}
1439
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001441builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001442 PyObject *self;
1443 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001444{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001445 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001446
Guido van Rossum79f25d91997-04-29 20:08:16 +00001447 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001448 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001450}
1451
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001453builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 PyObject *self;
1455 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001456{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001458
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001460 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001462}
1463
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001465builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 PyObject *self;
1467 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001468{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001469 double x;
1470 double f;
1471 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001472 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001473
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001475 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001476 f = 1.0;
1477 for (i = ndigits; --i >= 0; )
1478 f = f*10.0;
1479 for (i = ndigits; ++i <= 0; )
1480 f = f*0.1;
1481 if (x >= 0.0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482 return PyFloat_FromDouble(floor(x*f + 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001483 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001485}
1486
Guido van Rossum79f25d91997-04-29 20:08:16 +00001487static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001488builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001489 PyObject *self;
1490 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001491{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001493
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001495 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001497}
1498
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001500builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 PyObject *self;
1502 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001503{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001504 PyObject *v;
1505 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001506
Guido van Rossum79f25d91997-04-29 20:08:16 +00001507 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001508 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509 if (PyTuple_Check(v)) {
1510 Py_INCREF(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001511 return v;
1512 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 if (PyList_Check(v))
1514 return PyList_AsTuple(v);
1515 if (PyString_Check(v)) {
1516 int n = PyString_Size(v);
1517 PyObject *t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001518 if (t != NULL) {
1519 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001520 char *p = PyString_AsString(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001521 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 PyObject *item =
1523 PyString_FromStringAndSize(p+i, 1);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001524 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001525 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001526 t = NULL;
1527 break;
1528 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001530 }
1531 }
1532 return t;
1533 }
1534 /* Generic sequence object */
1535 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1536 int n = (*sqf->sq_length)(v);
1537 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 PyObject *t;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001539 if (n < 0)
1540 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001541 t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001542 if (t == NULL)
1543 return NULL;
1544 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001545 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001546 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001548 t = NULL;
1549 break;
1550 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001552 }
1553 /* XXX Should support indefinite-length sequences */
1554 return t;
1555 }
1556 /* None of the above */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557 PyErr_SetString(PyExc_TypeError,
1558 "tuple() argument must be a sequence");
Guido van Rossumcae027b1994-08-29 12:53:11 +00001559 return NULL;
1560}
1561
Guido van Rossum79f25d91997-04-29 20:08:16 +00001562static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001563builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001564 PyObject *self;
1565 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001566{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001568
Guido van Rossum79f25d91997-04-29 20:08:16 +00001569 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001570 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571 v = (PyObject *)v->ob_type;
1572 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001573 return v;
1574}
1575
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001577builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001578 PyObject *self;
1579 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001580{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 PyObject *v = NULL;
1582 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001583
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001585 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001586 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001588 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 if (!PyErr_Occurred())
1590 PyErr_SetString(PyExc_SystemError,
1591 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001592 }
1593 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001595 }
1596 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001598 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001600 "vars() argument must have __dict__ attribute");
1601 return NULL;
1602 }
1603 }
1604 return d;
1605}
1606
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001608 {"__import__", builtin___import__, 1},
1609 {"abs", builtin_abs, 1},
1610 {"apply", builtin_apply, 1},
1611 {"callable", builtin_callable, 1},
1612 {"chr", builtin_chr, 1},
1613 {"cmp", builtin_cmp, 1},
1614 {"coerce", builtin_coerce, 1},
1615 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001616#ifndef WITHOUT_COMPLEX
1617 {"complex", builtin_complex, 1},
1618#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001619 {"delattr", builtin_delattr, 1},
1620 {"dir", builtin_dir, 1},
1621 {"divmod", builtin_divmod, 1},
1622 {"eval", builtin_eval, 1},
1623 {"execfile", builtin_execfile, 1},
1624 {"filter", builtin_filter, 1},
1625 {"float", builtin_float, 1},
1626 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001627 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001628 {"hasattr", builtin_hasattr, 1},
1629 {"hash", builtin_hash, 1},
1630 {"hex", builtin_hex, 1},
1631 {"id", builtin_id, 1},
1632 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001633 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001634 {"int", builtin_int, 1},
1635 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001636 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001637 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001638 {"long", builtin_long, 1},
1639 {"map", builtin_map, 1},
1640 {"max", builtin_max, 1},
1641 {"min", builtin_min, 1},
1642 {"oct", builtin_oct, 1},
1643 {"open", builtin_open, 1},
1644 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001645 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001646 {"range", builtin_range, 1},
1647 {"raw_input", builtin_raw_input, 1},
1648 {"reduce", builtin_reduce, 1},
1649 {"reload", builtin_reload, 1},
1650 {"repr", builtin_repr, 1},
1651 {"round", builtin_round, 1},
1652 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001653 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001654 {"str", builtin_str, 1},
1655 {"tuple", builtin_tuple, 1},
1656 {"type", builtin_type, 1},
1657 {"vars", builtin_vars, 1},
1658 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001659 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001660};
1661
Guido van Rossum79f25d91997-04-29 20:08:16 +00001662static PyObject *builtin_mod;
1663static PyObject *builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001664
Guido van Rossum79f25d91997-04-29 20:08:16 +00001665PyObject *
1666PyBuiltin_GetModule()
Guido van Rossum0865dd91995-01-17 16:30:22 +00001667{
1668 return builtin_mod;
1669}
1670
Guido van Rossum79f25d91997-04-29 20:08:16 +00001671PyObject *
1672PyBuiltin_GetDict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001673{
Guido van Rossum6135a871995-01-09 17:53:26 +00001674 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001675}
1676
1677/* Predefined exceptions */
1678
Guido van Rossum79f25d91997-04-29 20:08:16 +00001679PyObject *PyExc_AccessError;
1680PyObject *PyExc_AssertionError;
1681PyObject *PyExc_AttributeError;
1682PyObject *PyExc_EOFError;
1683PyObject *FloatingPointError;
1684PyObject *PyExc_IOError;
1685PyObject *PyExc_ImportError;
1686PyObject *PyExc_IndexError;
1687PyObject *PyExc_KeyError;
1688PyObject *PyExc_KeyboardInterrupt;
1689PyObject *PyExc_MemoryError;
1690PyObject *PyExc_NameError;
1691PyObject *PyExc_OverflowError;
1692PyObject *PyExc_RuntimeError;
1693PyObject *PyExc_SyntaxError;
1694PyObject *PyExc_SystemError;
1695PyObject *PyExc_SystemExit;
1696PyObject *PyExc_TypeError;
1697PyObject *PyExc_ValueError;
1698PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001699
Guido van Rossum79f25d91997-04-29 20:08:16 +00001700static PyObject *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001701newstdexception(name)
1702 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001703{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001704 PyObject *v = PyString_FromString(name);
1705 if (v == NULL || PyDict_SetItemString(builtin_dict, name, v) != 0)
1706 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001707 return v;
1708}
1709
1710static void
1711initerrors()
1712{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001713 PyExc_AccessError = newstdexception("AccessError");
Guido van Rossumc6472e91997-03-31 17:15:43 +00001714 PyExc_AssertionError = newstdexception("AssertionError");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001715 PyExc_AttributeError = newstdexception("AttributeError");
1716 PyExc_EOFError = newstdexception("EOFError");
Guido van Rossum0ae748d1997-02-14 22:58:07 +00001717 FloatingPointError = newstdexception("FloatingPointError");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001718 PyExc_IOError = newstdexception("IOError");
1719 PyExc_ImportError = newstdexception("ImportError");
1720 PyExc_IndexError = newstdexception("IndexError");
1721 PyExc_KeyError = newstdexception("KeyError");
1722 PyExc_KeyboardInterrupt = newstdexception("KeyboardInterrupt");
1723 PyExc_MemoryError = newstdexception("MemoryError");
1724 PyExc_NameError = newstdexception("NameError");
1725 PyExc_OverflowError = newstdexception("OverflowError");
1726 PyExc_RuntimeError = newstdexception("RuntimeError");
1727 PyExc_SyntaxError = newstdexception("SyntaxError");
1728 PyExc_SystemError = newstdexception("SystemError");
1729 PyExc_SystemExit = newstdexception("SystemExit");
1730 PyExc_TypeError = newstdexception("TypeError");
1731 PyExc_ValueError = newstdexception("ValueError");
1732 PyExc_ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001733}
1734
1735void
Guido van Rossum79f25d91997-04-29 20:08:16 +00001736PyBuiltin_Init()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001737{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001738 builtin_mod = Py_InitModule("__builtin__", builtin_methods);
1739 builtin_dict = PyModule_GetDict(builtin_mod);
1740 Py_INCREF(builtin_dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001741 initerrors();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001742 (void) PyDict_SetItemString(builtin_dict, "None", Py_None);
1743 (void) PyDict_SetItemString(builtin_dict, "Ellipsis", Py_Ellipsis);
1744 (void) PyDict_SetItemString(builtin_dict, "__debug__",
1745 PyInt_FromLong(Py_OptimizeFlag == 0));
1746 if (PyErr_Occurred())
1747 Py_FatalError(
1748 "error creating None/Ellipsis/__debug__ in __builtin__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001749}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001750
Guido van Rossum12d12c51993-10-26 17:58:25 +00001751
Guido van Rossume77a7571993-11-03 15:01:26 +00001752/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001753
Guido van Rossum79f25d91997-04-29 20:08:16 +00001754static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001755filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001756 PyObject *func;
1757 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001758{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001759 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001760 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001761 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001762
Guido van Rossumb7b45621995-08-04 04:07:45 +00001763 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001764 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001765 return tuple;
1766 }
1767
Guido van Rossum79f25d91997-04-29 20:08:16 +00001768 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001769 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001770
Guido van Rossum12d12c51993-10-26 17:58:25 +00001771 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001772 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001773 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001774
Guido van Rossum79f25d91997-04-29 20:08:16 +00001775 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001776 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001777 if (func == Py_None) {
1778 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001779 good = item;
1780 }
1781 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001782 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001783 if (arg == NULL)
1784 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001785 good = PyEval_CallObject(func, arg);
1786 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001787 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788 goto Fail_1;
1789 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 ok = PyObject_IsTrue(good);
1791 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001792 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 Py_INCREF(item);
1794 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001795 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001796 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001797 }
1798
Guido van Rossum79f25d91997-04-29 20:08:16 +00001799 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001800 return NULL;
1801
Guido van Rossum12d12c51993-10-26 17:58:25 +00001802 return result;
1803
Guido van Rossum12d12c51993-10-26 17:58:25 +00001804Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806 return NULL;
1807}
1808
1809
Guido van Rossume77a7571993-11-03 15:01:26 +00001810/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001811
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001813filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 PyObject *func;
1815 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001816{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001818 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001820
Guido van Rossum79f25d91997-04-29 20:08:16 +00001821 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001822 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001824 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001825 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001826 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001827 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828
Guido van Rossum12d12c51993-10-26 17:58:25 +00001829 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001830 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001831 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001832
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001833 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1834 if (item == NULL)
1835 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001836 arg = Py_BuildValue("(O)", item);
1837 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001838 if (arg == NULL)
1839 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840 good = PyEval_CallObject(func, arg);
1841 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001842 if (good == NULL)
1843 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 ok = PyObject_IsTrue(good);
1845 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001846 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 PyString_AS_STRING((PyStringObject *)result)[j++] =
1848 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001849 }
1850
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001852 return NULL;
1853
Guido van Rossum12d12c51993-10-26 17:58:25 +00001854 return result;
1855
Guido van Rossum12d12c51993-10-26 17:58:25 +00001856Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001858 return NULL;
1859}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001860
1861/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1862
1863static PyObject *
1864int_from_string(v)
1865 PyObject *v;
1866{
1867 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1868 char *s, *end;
1869 long x;
1870 char buffer[256]; /* For errors */
1871
1872 if (!PyArg_Parse(v, "s", &s))
1873 return NULL;
1874 while (*s && isspace(Py_CHARMASK(*s)))
1875 s++;
1876 if (s[0] == '\0') {
1877 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1878 return NULL;
1879 }
1880 errno = 0;
1881 x = PyOS_strtol(s, &end, 10);
1882 while (*end && isspace(Py_CHARMASK(*end)))
1883 end++;
1884 if (*end != '\0') {
1885 sprintf(buffer, "invalid literal for int(): %.200s", s);
1886 PyErr_SetString(PyExc_ValueError, buffer);
1887 return NULL;
1888 }
1889 else if (errno != 0) {
1890 sprintf(buffer, "int() literal too large: %.200s", s);
1891 PyErr_SetString(PyExc_ValueError, buffer);
1892 return NULL;
1893 }
1894 return PyInt_FromLong(x);
1895}
1896
1897static PyObject *
1898long_from_string(v)
1899 PyObject *v;
1900{
1901 char *s, *end;
1902 PyObject *x;
1903 char buffer[256]; /* For errors */
1904
1905 if (!PyArg_Parse(v, "s", &s))
1906 return NULL;
1907
1908 while (*s && isspace(Py_CHARMASK(*s)))
1909 s++;
1910 if (s[0] == '\0') {
1911 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1912 return NULL;
1913 }
1914 x = PyLong_FromString(s, &end, 10);
1915 if (x == NULL)
1916 return NULL;
1917 while (*end && isspace(Py_CHARMASK(*end)))
1918 end++;
1919 if (*end != '\0') {
1920 sprintf(buffer, "invalid literal for long(): %.200s", s);
1921 PyErr_SetString(PyExc_ValueError, buffer);
1922 Py_DECREF(x);
1923 return NULL;
1924 }
1925 return x;
1926}
1927
1928static PyObject *
1929float_from_string(v)
1930 PyObject *v;
1931{
1932 extern double strtod Py_PROTO((const char *, char **));
1933 char *s, *end;
1934 double x;
1935 char buffer[256]; /* For errors */
1936
1937 if (!PyArg_Parse(v, "s", &s))
1938 return NULL;
1939 while (*s && isspace(Py_CHARMASK(*s)))
1940 s++;
1941 if (s[0] == '\0') {
1942 PyErr_SetString(PyExc_ValueError, "empty string for float()");
1943 return NULL;
1944 }
1945 errno = 0;
1946 PyFPE_START_PROTECT("float_from_string", return 0)
1947 x = strtod(s, &end);
1948 PyFPE_END_PROTECT(x)
1949 while (*end && isspace(Py_CHARMASK(*end)))
1950 end++;
1951 if (*end != '\0') {
1952 sprintf(buffer, "invalid literal for float(): %.200s", s);
1953 PyErr_SetString(PyExc_ValueError, buffer);
1954 return NULL;
1955 }
1956 else if (errno != 0) {
1957 sprintf(buffer, "float() literal too large: %.200s", s);
1958 PyErr_SetString(PyExc_ValueError, buffer);
1959 return NULL;
1960 }
1961 return PyFloat_FromDouble(x);
1962}