blob: 4029e1b9c1e6bd232fa9e706e4b11b6f77576ccf [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"
Guido van Rossum5b722181993-03-30 17:46:03 +000037#include "compile.h"
38#include "eval.h"
Guido van Rossum3f5da241990-12-20 15:06:42 +000039
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +000040#include "mymath.h"
41
Guido van Rossum6bf62da1997-04-11 20:37:35 +000042#include <ctype.h>
43
Guido van Rossum1a2c5cb1996-12-10 15:37:36 +000044#ifdef HAVE_UNISTD_H
45#include <unistd.h>
46#endif
47
Guido van Rossum12d12c51993-10-26 17:58:25 +000048/* Forward */
Guido van Rossum79f25d91997-04-29 20:08:16 +000049static PyObject *filterstring Py_PROTO((PyObject *, PyObject *));
50static PyObject *filtertuple Py_PROTO((PyObject *, PyObject *));
51static PyObject *int_from_string Py_PROTO((PyObject *));
52static PyObject *long_from_string Py_PROTO((PyObject *));
53static PyObject *float_from_string Py_PROTO((PyObject *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000054
Guido van Rossum79f25d91997-04-29 20:08:16 +000055static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000056builtin___import__(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000057 PyObject *self;
58 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000059{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000060 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000061 PyObject *globals = NULL;
62 PyObject *locals = NULL;
63 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064
Guido van Rossum79f25d91997-04-29 20:08:16 +000065 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000066 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000067 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000068 return PyImport_ImportModule(name);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000069}
70
71
Guido van Rossum79f25d91997-04-29 20:08:16 +000072static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000073builtin_abs(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 PyObject *self;
75 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000076{
Guido van Rossum79f25d91997-04-29 20:08:16 +000077 PyObject *v;
78 PyNumberMethods *nm;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000079
Guido van Rossum79f25d91997-04-29 20:08:16 +000080 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000081 return NULL;
82 if ((nm = v->ob_type->tp_as_number) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 PyErr_SetString(PyExc_TypeError,
84 "abs() requires numeric argument");
Guido van Rossumd4905451991-05-05 20:00:36 +000085 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +000086 }
Guido van Rossumd4905451991-05-05 20:00:36 +000087 return (*nm->nb_absolute)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000088}
89
Guido van Rossum79f25d91997-04-29 20:08:16 +000090static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +000091builtin_apply(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000092 PyObject *self;
93 PyObject *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000094{
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 PyObject *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000096
Guido van Rossum79f25d91997-04-29 20:08:16 +000097 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000098 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000099 if (alist != NULL && !PyTuple_Check(alist)) {
100 PyErr_SetString(PyExc_TypeError,
101 "apply() 2nd argument must be tuple");
Guido van Rossum2d951851994-08-29 12:52:16 +0000102 return NULL;
103 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000104 if (kwdict != NULL && !PyDict_Check(kwdict)) {
105 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +0000106 "apply() 3rd argument must be dictionary");
107 return NULL;
108 }
109 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000110}
111
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112static PyObject *
Guido van Rossum2d951851994-08-29 12:52:16 +0000113builtin_callable(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000114 PyObject *self;
115 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +0000116{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000117 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000118
Guido van Rossum79f25d91997-04-29 20:08:16 +0000119 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000120 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000121 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000122}
123
Guido van Rossum79f25d91997-04-29 20:08:16 +0000124static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000125builtin_filter(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000126 PyObject *self;
127 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000128{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000129 PyObject *func, *seq, *result;
130 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000131 int len;
132 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000133
Guido van Rossum79f25d91997-04-29 20:08:16 +0000134 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000136
Guido van Rossum79f25d91997-04-29 20:08:16 +0000137 if (PyString_Check(seq)) {
138 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000139 return r;
140 }
141
Guido van Rossum79f25d91997-04-29 20:08:16 +0000142 if (PyTuple_Check(seq)) {
143 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000144 return r;
145 }
146
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000147 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000149 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000150 goto Fail_2;
151 }
152
153 if ((len = (*sqf->sq_length)(seq)) < 0)
154 goto Fail_2;
155
Guido van Rossum79f25d91997-04-29 20:08:16 +0000156 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
157 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000158 result = seq;
159 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000160 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000161 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000162 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000163 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000164
Guido van Rossum2d951851994-08-29 12:52:16 +0000165 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000166 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000167 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000168
Guido van Rossum2d951851994-08-29 12:52:16 +0000169 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
170 if (i < len)
171 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000172 if (PyErr_Occurred() == PyExc_IndexError) {
173 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000174 break;
175 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000176 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000177 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000178
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000180 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000181 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000182 }
183 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000184 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000185 if (arg == NULL)
186 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000187 good = PyEval_CallObject(func, arg);
188 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000189 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000191 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000192 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000193 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000194 ok = PyObject_IsTrue(good);
195 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000196 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000197 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000198 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000199 goto Fail_1;
200 }
201 else {
202 j++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000203 if (PyList_Append(result, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000204 goto Fail_1;
205 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000206 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000207 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000208 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209 }
210
Guido van Rossum12d12c51993-10-26 17:58:25 +0000211
Guido van Rossum79f25d91997-04-29 20:08:16 +0000212 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000213 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000214
Guido van Rossum12d12c51993-10-26 17:58:25 +0000215 return result;
216
Guido van Rossum12d12c51993-10-26 17:58:25 +0000217Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000218 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000219Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000220 return NULL;
221}
222
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000224builtin_chr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000225 PyObject *self;
226 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000227{
228 long x;
229 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000230
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000233 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234 PyErr_SetString(PyExc_ValueError,
235 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000236 return NULL;
237 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000238 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000240}
241
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242static PyObject *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000243builtin_cmp(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000244 PyObject *self;
245 PyObject *args;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000246{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000247 PyObject *a, *b;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000248
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000250 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 return PyInt_FromLong((long)PyObject_Compare(a, b));
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000252}
253
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000255builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000256 PyObject *self;
257 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000258{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 PyObject *v, *w;
260 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000261
Guido van Rossum79f25d91997-04-29 20:08:16 +0000262 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000263 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000264 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000265 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 res = Py_BuildValue("(OO)", v, w);
267 Py_DECREF(v);
268 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000269 return res;
270}
271
Guido van Rossum79f25d91997-04-29 20:08:16 +0000272static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000273builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000274 PyObject *self;
275 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000276{
277 char *str;
278 char *filename;
279 char *startstr;
280 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000281
Guido van Rossum79f25d91997-04-29 20:08:16 +0000282 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000283 return NULL;
284 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000285 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000286 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000287 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000288 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000289 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000290 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000291 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000292 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000293 return NULL;
294 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000296}
297
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000298#ifndef WITHOUT_COMPLEX
299
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000301builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000302 PyObject *self;
303 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000304{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000305 PyObject *r, *i, *tmp;
306 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000307 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000308 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000309
310 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000311 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000312 return NULL;
313 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000314 nbr->nb_float == NULL ||
315 (i != NULL &&
316 ((nbi = i->ob_type->tp_as_number) == NULL ||
317 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000319 "complex() argument can't be converted to complex");
320 return NULL;
321 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000322 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000323 if (PyInstance_Check(r)) {
324 static PyObject *complexstr;
325 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000326 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000327 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000328 if (complexstr == NULL)
329 return NULL;
330 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000331 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000332 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000334 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000336 if (args == NULL)
337 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000338 r = PyEval_CallObject(f, args);
339 Py_DECREF(args);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000340 if (r == NULL)
341 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000342 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000343 }
344 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000345 if (PyComplex_Check(r)) {
346 cr = ((PyComplexObject*)r)->cval;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000347 if (own_r)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000348 Py_DECREF(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000349 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000350 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000351 tmp = (*nbr->nb_float)(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000352 if (own_r)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 Py_DECREF(r);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000354 if (tmp == NULL)
355 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000356 cr.real = PyFloat_AsDouble(tmp);
357 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000358 cr.imag = 0.;
359 }
360 if (i == NULL) {
361 ci.real = 0.;
362 ci.imag = 0.;
363 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000364 else if (PyComplex_Check(i))
365 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000366 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000367 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000368 if (tmp == NULL)
369 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370 ci.real = PyFloat_AsDouble(tmp);
371 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000372 ci.imag = 0.;
373 }
374 cr.real -= ci.imag;
375 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000377}
378
379#endif
380
Guido van Rossum79f25d91997-04-29 20:08:16 +0000381static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000382builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000383 PyObject *self;
384 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000385{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000386 static char *attrlist[] = {"__members__", "__methods__", NULL};
387 PyObject *v = NULL, *l = NULL, *m = NULL;
388 PyObject *d, *x;
389 int i;
390 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000391
Guido van Rossum79f25d91997-04-29 20:08:16 +0000392 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000393 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000394 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000395 x = PyEval_GetLocals();
396 if (x == NULL)
397 goto error;
398 l = PyMapping_Keys(x);
399 if (l == NULL)
400 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000401 }
402 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000403 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000404 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000405 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000406 else {
407 l = PyMapping_Keys(d);
408 if (l == NULL)
409 PyErr_Clear();
410 Py_DECREF(d);
411 }
412 if (l == NULL) {
413 l = PyList_New(0);
414 if (l == NULL)
415 goto error;
416 }
417 for (s = attrlist; *s != NULL; s++) {
418 m = PyObject_GetAttrString(v, *s);
419 if (m == NULL) {
420 PyErr_Clear();
421 continue;
422 }
423 for (i = 0; ; i++) {
424 x = PySequence_GetItem(m, i);
425 if (x == NULL) {
426 PyErr_Clear();
427 break;
428 }
429 if (PyList_Append(l, x) != 0) {
430 Py_DECREF(x);
431 Py_DECREF(m);
432 goto error;
433 }
434 Py_DECREF(x);
435 }
436 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000437 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000438 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000439 if (PyList_Sort(l) != 0)
440 goto error;
441 return l;
442 error:
443 Py_XDECREF(l);
444 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000445}
446
Guido van Rossum79f25d91997-04-29 20:08:16 +0000447static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000448do_divmod(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000450{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000452
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 if (PyInstance_Check(v) || PyInstance_Check(w))
454 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000455 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000456 if (v->ob_type->tp_as_number == NULL ||
457 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000459 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000460 return NULL;
461 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000463 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000464 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 Py_DECREF(v);
466 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000467 return res;
468}
469
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000471builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000472 PyObject *self;
473 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000474{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000476
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000478 return NULL;
479 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000480}
481
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000483builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000484 PyObject *self;
485 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000486{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000487 PyObject *cmd;
488 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000490
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000492 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 &PyDict_Type, &globals,
494 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000496 if (globals == Py_None) {
497 globals = PyEval_GetGlobals();
498 if (locals == Py_None)
499 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000500 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000501 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000502 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000503 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
504 if (PyDict_SetItemString(globals, "__builtins__",
505 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000506 return NULL;
507 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000508 if (PyCode_Check(cmd))
509 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
510 if (!PyString_Check(cmd)) {
511 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000512 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000513 return NULL;
514 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 str = PyString_AsString(cmd);
516 if ((int)strlen(str) != PyString_Size(cmd)) {
517 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518 "embedded '\\0' in string arg");
519 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000520 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000521 while (*str == ' ' || *str == '\t')
522 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000523 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000524}
525
Guido van Rossum79f25d91997-04-29 20:08:16 +0000526static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000528 PyObject *self;
529 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000530{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 PyObject *globals = Py_None, *locals = Py_None;
533 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000534 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 &PyDict_Type, &globals,
539 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000540 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541 if (globals == Py_None) {
542 globals = PyEval_GetGlobals();
543 if (locals == Py_None)
544 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000545 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000547 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
549 if (PyDict_SetItemString(globals, "__builtins__",
550 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000551 return NULL;
552 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000554 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000556 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000558 return NULL;
559 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000560 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000562 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000564 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000565}
566
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568builtin_float(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 PyObject *self;
570 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000571{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000572 PyObject *v;
573 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 if (!PyArg_ParseTuple(args, "O:float", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000576 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000577 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000578 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000579 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000580 nb->nb_float == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000582 "float() argument can't be converted to float");
583 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000584 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000585 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000586}
587
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000589builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 PyObject *self;
591 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000592{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000593 PyObject *v;
594 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000595
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000597 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000598 return PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000599}
600
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000602builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 PyObject *self;
604 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000605{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000607
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000609 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 d = PyEval_GetGlobals();
611 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000612 return d;
613}
614
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000616builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000617 PyObject *self;
618 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000619{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000620 PyObject *v;
621 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000622
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000624 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000625 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000626 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 PyErr_Clear();
628 return PyInt_FromLong(0L);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000629 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000630 Py_DECREF(v);
631 return PyInt_FromLong(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000632}
633
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000635builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 PyObject *self;
637 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000638{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000640
Guido van Rossum79f25d91997-04-29 20:08:16 +0000641 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000642 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 return PyInt_FromLong((long)v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000644}
645
Guido van Rossum79f25d91997-04-29 20:08:16 +0000646static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 PyObject *self;
649 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000650{
651 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyObject *seq;
653 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000654 int len;
655 } sequence;
656
Guido van Rossum79f25d91997-04-29 20:08:16 +0000657 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000658 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000659 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000660 register int i, j;
661
Guido van Rossum79f25d91997-04-29 20:08:16 +0000662 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000664 PyErr_SetString(PyExc_TypeError,
665 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000666 return NULL;
667 }
668
Guido van Rossum79f25d91997-04-29 20:08:16 +0000669 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000670 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000671
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
673 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000674 goto Fail_2;
675 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000676
Guido van Rossum2d951851994-08-29 12:52:16 +0000677 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000678 int curlen;
679
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000681 goto Fail_2;
682
683 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
684 static char errmsg[] =
685 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000686 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000687
688 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000690 goto Fail_2;
691 }
692
693 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
694 goto Fail_2;
695
696 if (curlen > len)
697 len = curlen;
698 }
699
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000701 goto Fail_2;
702
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000703 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000704 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000705 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000706 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000707
Guido van Rossum79f25d91997-04-29 20:08:16 +0000708 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000709 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000710 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000712 goto Fail_1;
713 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000714
715 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000716 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 Py_INCREF(Py_None);
718 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000719 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000720 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000721 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000722 if (item == NULL) {
723 if (i < sqp->len)
724 goto Fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000725 if (PyErr_Occurred() ==
726 PyExc_IndexError) {
727 PyErr_Clear();
728 Py_INCREF(Py_None);
729 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000730 sqp->len = -1;
731 }
732 else {
733 goto Fail_0;
734 }
735 }
736 else
737 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000738
Guido van Rossum12d12c51993-10-26 17:58:25 +0000739 }
Guido van Rossum32120311995-07-10 13:52:21 +0000740 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000741 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000742 if (PyTuple_SetItem(alist, j, item) < 0) {
743 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000744 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000745 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000746 continue;
747
748 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000750 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000751 }
752
Guido van Rossum32120311995-07-10 13:52:21 +0000753 if (!alist)
754 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000755
756 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000757 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000758 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000759 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000760
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000762 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000763 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 value = PyEval_CallObject(func, alist);
765 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000766 if (value == NULL)
767 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000768 }
769 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000770 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000771 goto Fail_1;
772 }
773 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000775 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000776 }
777 }
778
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000780 return result;
781
Guido van Rossum12d12c51993-10-26 17:58:25 +0000782Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000784Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000785 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000786 return NULL;
787}
788
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000790builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 PyObject *self;
792 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000793{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794 PyObject *v;
795 PyObject *name;
796 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000797
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000799 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000801 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 Py_INCREF(Py_None);
803 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000804}
805
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000807builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 PyObject *self;
809 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000810{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811 PyObject *v;
812 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000813
Guido van Rossum79f25d91997-04-29 20:08:16 +0000814 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000815 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000817 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 Py_INCREF(Py_None);
819 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000820}
821
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000823builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 PyObject *self;
825 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000826{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000827 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000829
Guido van Rossum79f25d91997-04-29 20:08:16 +0000830 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833 if (x == -1)
834 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000836}
837
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyObject *self;
841 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000842{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843 PyObject *v;
844 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000845
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000847 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000848
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000850 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000852 "hex() argument can't be converted to hex");
853 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000854 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000855 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000856}
857
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000859
Guido van Rossum79f25d91997-04-29 20:08:16 +0000860static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000861builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862 PyObject *self;
863 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000864{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 PyObject *res;
868 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000869
870 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000871 if (line == NULL)
872 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000873 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874 return NULL;
875 while (*str == ' ' || *str == '\t')
876 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 globals = PyEval_GetGlobals();
878 locals = PyEval_GetLocals();
879 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
880 if (PyDict_SetItemString(globals, "__builtins__",
881 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000882 return NULL;
883 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000884 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000885 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000886 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000887}
888
Guido van Rossume8811f81997-02-14 15:48:05 +0000889static PyObject *
890builtin_intern(self, args)
891 PyObject *self;
892 PyObject *args;
893{
894 PyObject *s;
895 if (!PyArg_ParseTuple(args, "S", &s))
896 return NULL;
897 Py_INCREF(s);
898 PyString_InternInPlace(&s);
899 return s;
900}
901
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000903builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 PyObject *self;
905 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000906{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 PyObject *v;
908 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000909
Guido van Rossum79f25d91997-04-29 20:08:16 +0000910 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000911 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000913 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000915 nb->nb_int == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000917 "int() argument can't be converted to int");
918 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000919 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000920 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000921}
922
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000924builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000925 PyObject *self;
926 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000927{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000929 long len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 PyTypeObject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000933 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934 tp = v->ob_type;
935 if (tp->tp_as_sequence != NULL) {
936 len = (*tp->tp_as_sequence->sq_length)(v);
937 }
938 else if (tp->tp_as_mapping != NULL) {
939 len = (*tp->tp_as_mapping->mp_length)(v);
940 }
941 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 PyErr_SetString(PyExc_TypeError, "len() of unsized object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000943 return NULL;
944 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000945 if (len < 0)
946 return NULL;
947 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948 return PyInt_FromLong(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000949}
950
Guido van Rossum79f25d91997-04-29 20:08:16 +0000951static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000952builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 PyObject *self;
954 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000955{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956 PyObject *v;
957 PySequenceMethods *sqf;
Guido van Rossumd1705771996-04-09 02:41:06 +0000958
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000960 return NULL;
961 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
962 int n = (*sqf->sq_length)(v);
963 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 PyObject *l;
Guido van Rossumd1705771996-04-09 02:41:06 +0000965 if (n < 0)
966 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000967 l = PyList_New(n);
Guido van Rossumd1705771996-04-09 02:41:06 +0000968 if (l == NULL)
969 return NULL;
970 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumd1705771996-04-09 02:41:06 +0000972 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000973 Py_DECREF(l);
Guido van Rossumd1705771996-04-09 02:41:06 +0000974 l = NULL;
975 break;
976 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000977 PyList_SetItem(l, i, item);
Guido van Rossumd1705771996-04-09 02:41:06 +0000978 }
979 /* XXX Should support indefinite-length sequences */
980 return l;
981 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
Guido van Rossumd1705771996-04-09 02:41:06 +0000983 return NULL;
984}
985
Guido van Rossum8861b741996-07-30 16:49:37 +0000986
987static PyObject *
988builtin_slice(self, args)
989 PyObject *self;
990 PyObject *args;
991{
992 PyObject *start, *stop, *step;
993
994 start = stop = step = NULL;
995
996 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
997 return NULL;
998
999 /*This swapping of stop and start is to maintain compatibility with
1000 the range builtin.*/
1001 if (stop == NULL) {
1002 stop = start;
1003 start = NULL;
1004 }
1005 return PySlice_New(start, stop, step);
1006}
1007
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001009builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001010 PyObject *self;
1011 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001012{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001014
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +00001016 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 d = PyEval_GetLocals();
1018 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001019 return d;
1020}
1021
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001023builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 PyObject *self;
1025 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +00001026{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027 PyObject *v;
1028 PyNumberMethods *nb;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001029
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001031 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +00001033 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001034 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001035 nb->nb_long == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001037 "long() argument can't be converted to long");
1038 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001039 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001040 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001041}
1042
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001044min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001045 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001046 int sign;
1047{
Guido van Rossum2d951851994-08-29 12:52:16 +00001048 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 PyObject *v, *w, *x;
1050 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001053 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001055 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001056 sq = v->ob_type->tp_as_sequence;
1057 if (sq == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 PyErr_SetString(PyExc_TypeError,
1059 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001060 return NULL;
1061 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001062 w = NULL;
1063 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001064 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001065 if (x == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066 if (PyErr_Occurred() == PyExc_IndexError) {
1067 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001068 break;
1069 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001071 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001072 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001073 if (w == NULL)
1074 w = x;
1075 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001076 if (PyObject_Compare(x, w) * sign > 0) {
1077 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001078 w = x;
1079 }
1080 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001081 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001082 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001083 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001084 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 PyErr_SetString(PyExc_ValueError,
1086 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001087 return w;
1088}
1089
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001091builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 PyObject *self;
1093 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094{
1095 return min_max(v, -1);
1096}
1097
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001099builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100 PyObject *self;
1101 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001102{
1103 return min_max(v, 1);
1104}
1105
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001107builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108 PyObject *self;
1109 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001110{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 PyObject *v;
1112 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001113
Guido van Rossum79f25d91997-04-29 20:08:16 +00001114 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001115 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001116 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1117 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001119 "oct() argument can't be converted to oct");
1120 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001121 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001122 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001123}
1124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001126builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 PyObject *self;
1128 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129{
Guido van Rossum2d951851994-08-29 12:52:16 +00001130 char *name;
1131 char *mode = "r";
1132 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001133 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001134
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001136 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001138 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001140 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001141}
1142
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001144builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 PyObject *self;
1146 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001147{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001148 char c;
1149
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001153}
1154
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001156do_pow(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 PyObject *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001158{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001159 PyObject *res;
1160 if (PyInstance_Check(v) || PyInstance_Check(w))
1161 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001162 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001163 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001164 PyErr_SetString(PyExc_TypeError,
1165 "pow() requires numeric arguments");
Guido van Rossumd4905451991-05-05 20:00:36 +00001166 return NULL;
1167 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001168 if (
1169#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 !PyComplex_Check(v) &&
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001171#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
1173 if (!PyErr_Occurred())
1174 PyErr_SetString(PyExc_ValueError,
1175 "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001176 return NULL;
1177 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001179 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
1181 Py_DECREF(v);
1182 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001183 return res;
1184}
1185
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001187builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 PyObject *self;
1189 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001190{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 PyObject *v, *w, *z = Py_None, *res;
1192 PyObject *v1, *z1, *w2, *z2;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001193
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001195 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196 if (z == Py_None)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001197 return do_pow(v, w);
1198 /* XXX The ternary version doesn't do class instance coercions */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 if (PyInstance_Check(v))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001200 return v->ob_type->tp_as_number->nb_power(v, w, z);
1201 if (v->ob_type->tp_as_number == NULL ||
1202 z->ob_type->tp_as_number == NULL ||
1203 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 PyErr_SetString(PyExc_TypeError,
1205 "pow() requires numeric arguments");
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001206 return NULL;
1207 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001208 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001209 return NULL;
1210 res = NULL;
1211 v1 = v;
1212 z1 = z;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 if (PyNumber_Coerce(&v1, &z1) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001214 goto error2;
1215 w2 = w;
1216 z2 = z1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 if (PyNumber_Coerce(&w2, &z2) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001218 goto error1;
1219 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 Py_DECREF(w2);
1221 Py_DECREF(z2);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001222 error1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 Py_DECREF(v1);
1224 Py_DECREF(z1);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001225 error2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001226 Py_DECREF(v);
1227 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001228 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001229}
1230
Guido van Rossum79f25d91997-04-29 20:08:16 +00001231static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001232builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233 PyObject *self;
1234 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001235{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001236 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001237 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001239
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 if (PyTuple_Size(args) <= 1) {
1241 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001242 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243 &ihigh))
1244 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001245 }
1246 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001248 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001250 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001251 }
1252 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001254 return NULL;
1255 }
1256 /* XXX ought to check overflow of subtraction */
1257 if (istep > 0)
1258 n = (ihigh - ilow + istep - 1) / istep;
1259 else
1260 n = (ihigh - ilow + istep + 1) / istep;
1261 if (n < 0)
1262 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001264 if (v == NULL)
1265 return NULL;
1266 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001267 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001268 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001269 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001270 return NULL;
1271 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001272 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001273 ilow += istep;
1274 }
1275 return v;
1276}
1277
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001279builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 PyObject *self;
1281 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001282{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001283 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001284 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001285
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286 if (PyTuple_Size(args) <= 1) {
1287 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001288 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289 &ihigh))
1290 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001291 }
1292 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001294 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001295 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001296 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001297 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001298 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001300 return NULL;
1301 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302 /* XXX ought to check overflow of subtraction */
1303 if (istep > 0)
1304 n = (ihigh - ilow + istep - 1) / istep;
1305 else
1306 n = (ihigh - ilow + istep + 1) / istep;
1307 if (n < 0)
1308 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001310}
1311
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001313
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001316 PyObject *self;
1317 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001318{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 PyObject *v = NULL;
1320 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001321
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001323 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1325 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001326 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001328 char *prompt;
1329 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001331 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001333 if (po == NULL)
1334 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001336 }
1337 else {
1338 po = NULL;
1339 prompt = "";
1340 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001341 s = PyOS_Readline(prompt);
1342 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001343 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001344 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001345 return NULL;
1346 }
1347 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001349 result = NULL;
1350 }
1351 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001353 }
1354 free(s);
1355 return result;
1356 }
Guido van Rossum90933611991-06-07 16:10:43 +00001357 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001359 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001360 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001361 return NULL;
1362 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 Py_FlushLine();
1364 if (PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001365 return NULL;
1366 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 return NULL;
1371 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001373}
1374
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001376builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 PyObject *self;
1378 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001379{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyObject *seq, *func, *result = NULL;
1381 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001382 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001383
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385 return NULL;
1386 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001388
1389 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001391 "2nd argument to reduce() must be a sequence object");
1392 return NULL;
1393 }
1394
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001396 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001397
Guido van Rossum2d951851994-08-29 12:52:16 +00001398 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001400
1401 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 Py_DECREF(args);
1403 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001404 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001405 }
1406
Guido van Rossum2d951851994-08-29 12:52:16 +00001407 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001408 if (PyErr_Occurred() == PyExc_IndexError) {
1409 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001410 break;
1411 }
1412 goto Fail;
1413 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001414
Guido van Rossum2d951851994-08-29 12:52:16 +00001415 if (result == NULL)
1416 result = op2;
1417 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001418 PyTuple_SetItem(args, 0, result);
1419 PyTuple_SetItem(args, 1, op2);
1420 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001421 goto Fail;
1422 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001423 }
1424
Guido van Rossum79f25d91997-04-29 20:08:16 +00001425 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001426
Guido van Rossum2d951851994-08-29 12:52:16 +00001427 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001429 "reduce of empty sequence with no initial value");
1430
Guido van Rossum12d12c51993-10-26 17:58:25 +00001431 return result;
1432
Guido van Rossum2d951851994-08-29 12:52:16 +00001433Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001434 Py_XDECREF(args);
1435 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001436 return NULL;
1437}
1438
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001440builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001441 PyObject *self;
1442 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001443{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001445
Guido van Rossum79f25d91997-04-29 20:08:16 +00001446 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001447 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001448 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001449}
1450
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001452builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001453 PyObject *self;
1454 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001455{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001457
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001459 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001460 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001461}
1462
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001464builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001465 PyObject *self;
1466 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001467{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001468 double x;
1469 double f;
1470 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001471 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001474 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001475 f = 1.0;
1476 for (i = ndigits; --i >= 0; )
1477 f = f*10.0;
1478 for (i = ndigits; ++i <= 0; )
1479 f = f*0.1;
1480 if (x >= 0.0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001481 return PyFloat_FromDouble(floor(x*f + 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001482 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001484}
1485
Guido van Rossum79f25d91997-04-29 20:08:16 +00001486static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001487builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 PyObject *self;
1489 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001490{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001492
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001494 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001495 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001496}
1497
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001499builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001500 PyObject *self;
1501 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001502{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 PyObject *v;
1504 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001505
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001507 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508 if (PyTuple_Check(v)) {
1509 Py_INCREF(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001510 return v;
1511 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001512 if (PyList_Check(v))
1513 return PyList_AsTuple(v);
1514 if (PyString_Check(v)) {
1515 int n = PyString_Size(v);
1516 PyObject *t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001517 if (t != NULL) {
1518 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 char *p = PyString_AsString(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001520 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521 PyObject *item =
1522 PyString_FromStringAndSize(p+i, 1);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001523 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001524 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001525 t = NULL;
1526 break;
1527 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001528 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001529 }
1530 }
1531 return t;
1532 }
1533 /* Generic sequence object */
1534 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1535 int n = (*sqf->sq_length)(v);
1536 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001537 PyObject *t;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001538 if (n < 0)
1539 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001540 t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001541 if (t == NULL)
1542 return NULL;
1543 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001545 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001547 t = NULL;
1548 break;
1549 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001551 }
1552 /* XXX Should support indefinite-length sequences */
1553 return t;
1554 }
1555 /* None of the above */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556 PyErr_SetString(PyExc_TypeError,
1557 "tuple() argument must be a sequence");
Guido van Rossumcae027b1994-08-29 12:53:11 +00001558 return NULL;
1559}
1560
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001562builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001563 PyObject *self;
1564 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001565{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001567
Guido van Rossum79f25d91997-04-29 20:08:16 +00001568 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001569 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001570 v = (PyObject *)v->ob_type;
1571 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001572 return v;
1573}
1574
Guido van Rossum79f25d91997-04-29 20:08:16 +00001575static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001576builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 PyObject *self;
1578 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001579{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 PyObject *v = NULL;
1581 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001582
Guido van Rossum79f25d91997-04-29 20:08:16 +00001583 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001584 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001585 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001587 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 if (!PyErr_Occurred())
1589 PyErr_SetString(PyExc_SystemError,
1590 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001591 }
1592 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001594 }
1595 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001597 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001599 "vars() argument must have __dict__ attribute");
1600 return NULL;
1601 }
1602 }
1603 return d;
1604}
1605
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001607 {"__import__", builtin___import__, 1},
1608 {"abs", builtin_abs, 1},
1609 {"apply", builtin_apply, 1},
1610 {"callable", builtin_callable, 1},
1611 {"chr", builtin_chr, 1},
1612 {"cmp", builtin_cmp, 1},
1613 {"coerce", builtin_coerce, 1},
1614 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001615#ifndef WITHOUT_COMPLEX
1616 {"complex", builtin_complex, 1},
1617#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001618 {"delattr", builtin_delattr, 1},
1619 {"dir", builtin_dir, 1},
1620 {"divmod", builtin_divmod, 1},
1621 {"eval", builtin_eval, 1},
1622 {"execfile", builtin_execfile, 1},
1623 {"filter", builtin_filter, 1},
1624 {"float", builtin_float, 1},
1625 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001626 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001627 {"hasattr", builtin_hasattr, 1},
1628 {"hash", builtin_hash, 1},
1629 {"hex", builtin_hex, 1},
1630 {"id", builtin_id, 1},
1631 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001632 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001633 {"int", builtin_int, 1},
1634 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001635 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001636 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001637 {"long", builtin_long, 1},
1638 {"map", builtin_map, 1},
1639 {"max", builtin_max, 1},
1640 {"min", builtin_min, 1},
1641 {"oct", builtin_oct, 1},
1642 {"open", builtin_open, 1},
1643 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001644 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001645 {"range", builtin_range, 1},
1646 {"raw_input", builtin_raw_input, 1},
1647 {"reduce", builtin_reduce, 1},
1648 {"reload", builtin_reload, 1},
1649 {"repr", builtin_repr, 1},
1650 {"round", builtin_round, 1},
1651 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001652 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001653 {"str", builtin_str, 1},
1654 {"tuple", builtin_tuple, 1},
1655 {"type", builtin_type, 1},
1656 {"vars", builtin_vars, 1},
1657 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001658 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001659};
1660
Guido van Rossum79f25d91997-04-29 20:08:16 +00001661static PyObject *builtin_mod;
1662static PyObject *builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001663
Guido van Rossum79f25d91997-04-29 20:08:16 +00001664PyObject *
1665PyBuiltin_GetModule()
Guido van Rossum0865dd91995-01-17 16:30:22 +00001666{
1667 return builtin_mod;
1668}
1669
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670PyObject *
1671PyBuiltin_GetDict()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001672{
Guido van Rossum6135a871995-01-09 17:53:26 +00001673 return builtin_dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001674}
1675
1676/* Predefined exceptions */
1677
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678PyObject *PyExc_AccessError;
1679PyObject *PyExc_AssertionError;
1680PyObject *PyExc_AttributeError;
1681PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001682PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001683PyObject *PyExc_IOError;
1684PyObject *PyExc_ImportError;
1685PyObject *PyExc_IndexError;
1686PyObject *PyExc_KeyError;
1687PyObject *PyExc_KeyboardInterrupt;
1688PyObject *PyExc_MemoryError;
1689PyObject *PyExc_NameError;
1690PyObject *PyExc_OverflowError;
1691PyObject *PyExc_RuntimeError;
1692PyObject *PyExc_SyntaxError;
1693PyObject *PyExc_SystemError;
1694PyObject *PyExc_SystemExit;
1695PyObject *PyExc_TypeError;
1696PyObject *PyExc_ValueError;
1697PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001698
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699static PyObject *
Guido van Rossumfb905c31991-12-16 15:42:38 +00001700newstdexception(name)
1701 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001702{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001703 PyObject *v = PyString_FromString(name);
1704 if (v == NULL || PyDict_SetItemString(builtin_dict, name, v) != 0)
1705 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001706 return v;
1707}
1708
1709static void
1710initerrors()
1711{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001712 PyExc_AccessError = newstdexception("AccessError");
Guido van Rossumc6472e91997-03-31 17:15:43 +00001713 PyExc_AssertionError = newstdexception("AssertionError");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001714 PyExc_AttributeError = newstdexception("AttributeError");
1715 PyExc_EOFError = newstdexception("EOFError");
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001716 PyExc_FloatingPointError = newstdexception("FloatingPointError");
Guido van Rossum79f25d91997-04-29 20:08:16 +00001717 PyExc_IOError = newstdexception("IOError");
1718 PyExc_ImportError = newstdexception("ImportError");
1719 PyExc_IndexError = newstdexception("IndexError");
1720 PyExc_KeyError = newstdexception("KeyError");
1721 PyExc_KeyboardInterrupt = newstdexception("KeyboardInterrupt");
1722 PyExc_MemoryError = newstdexception("MemoryError");
1723 PyExc_NameError = newstdexception("NameError");
1724 PyExc_OverflowError = newstdexception("OverflowError");
1725 PyExc_RuntimeError = newstdexception("RuntimeError");
1726 PyExc_SyntaxError = newstdexception("SyntaxError");
1727 PyExc_SystemError = newstdexception("SystemError");
1728 PyExc_SystemExit = newstdexception("SystemExit");
1729 PyExc_TypeError = newstdexception("TypeError");
1730 PyExc_ValueError = newstdexception("ValueError");
1731 PyExc_ZeroDivisionError = newstdexception("ZeroDivisionError");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001732}
1733
1734void
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735PyBuiltin_Init()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001736{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001737 builtin_mod = Py_InitModule("__builtin__", builtin_methods);
1738 builtin_dict = PyModule_GetDict(builtin_mod);
1739 Py_INCREF(builtin_dict);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740 initerrors();
Guido van Rossum79f25d91997-04-29 20:08:16 +00001741 (void) PyDict_SetItemString(builtin_dict, "None", Py_None);
1742 (void) PyDict_SetItemString(builtin_dict, "Ellipsis", Py_Ellipsis);
1743 (void) PyDict_SetItemString(builtin_dict, "__debug__",
1744 PyInt_FromLong(Py_OptimizeFlag == 0));
1745 if (PyErr_Occurred())
1746 Py_FatalError(
1747 "error creating None/Ellipsis/__debug__ in __builtin__");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001748}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001749
Guido van Rossum12d12c51993-10-26 17:58:25 +00001750
Guido van Rossume77a7571993-11-03 15:01:26 +00001751/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001752
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001754filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 PyObject *func;
1756 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001757{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001758 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001759 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001760 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001761
Guido van Rossumb7b45621995-08-04 04:07:45 +00001762 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001763 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001764 return tuple;
1765 }
1766
Guido van Rossum79f25d91997-04-29 20:08:16 +00001767 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001768 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001769
Guido van Rossum12d12c51993-10-26 17:58:25 +00001770 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001771 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001772 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001773
Guido van Rossum79f25d91997-04-29 20:08:16 +00001774 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001775 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001776 if (func == Py_None) {
1777 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001778 good = item;
1779 }
1780 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001781 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001782 if (arg == NULL)
1783 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784 good = PyEval_CallObject(func, arg);
1785 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001786 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787 goto Fail_1;
1788 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 ok = PyObject_IsTrue(good);
1790 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001791 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001792 Py_INCREF(item);
1793 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001794 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001795 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001796 }
1797
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001799 return NULL;
1800
Guido van Rossum12d12c51993-10-26 17:58:25 +00001801 return result;
1802
Guido van Rossum12d12c51993-10-26 17:58:25 +00001803Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001805 return NULL;
1806}
1807
1808
Guido van Rossume77a7571993-11-03 15:01:26 +00001809/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001810
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001812filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001813 PyObject *func;
1814 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001815{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001817 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001818 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001819
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001821 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001823 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001824 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001826 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001827
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001830 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001831
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001832 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1833 if (item == NULL)
1834 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 arg = Py_BuildValue("(O)", item);
1836 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001837 if (arg == NULL)
1838 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 good = PyEval_CallObject(func, arg);
1840 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001841 if (good == NULL)
1842 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 ok = PyObject_IsTrue(good);
1844 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001845 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 PyString_AS_STRING((PyStringObject *)result)[j++] =
1847 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001848 }
1849
Guido van Rossum79f25d91997-04-29 20:08:16 +00001850 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001851 return NULL;
1852
Guido van Rossum12d12c51993-10-26 17:58:25 +00001853 return result;
1854
Guido van Rossum12d12c51993-10-26 17:58:25 +00001855Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001857 return NULL;
1858}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001859
1860/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1861
1862static PyObject *
1863int_from_string(v)
1864 PyObject *v;
1865{
1866 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1867 char *s, *end;
1868 long x;
1869 char buffer[256]; /* For errors */
1870
1871 if (!PyArg_Parse(v, "s", &s))
1872 return NULL;
1873 while (*s && isspace(Py_CHARMASK(*s)))
1874 s++;
1875 if (s[0] == '\0') {
1876 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1877 return NULL;
1878 }
1879 errno = 0;
1880 x = PyOS_strtol(s, &end, 10);
1881 while (*end && isspace(Py_CHARMASK(*end)))
1882 end++;
1883 if (*end != '\0') {
1884 sprintf(buffer, "invalid literal for int(): %.200s", s);
1885 PyErr_SetString(PyExc_ValueError, buffer);
1886 return NULL;
1887 }
1888 else if (errno != 0) {
1889 sprintf(buffer, "int() literal too large: %.200s", s);
1890 PyErr_SetString(PyExc_ValueError, buffer);
1891 return NULL;
1892 }
1893 return PyInt_FromLong(x);
1894}
1895
1896static PyObject *
1897long_from_string(v)
1898 PyObject *v;
1899{
1900 char *s, *end;
1901 PyObject *x;
1902 char buffer[256]; /* For errors */
1903
1904 if (!PyArg_Parse(v, "s", &s))
1905 return NULL;
1906
1907 while (*s && isspace(Py_CHARMASK(*s)))
1908 s++;
1909 if (s[0] == '\0') {
1910 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1911 return NULL;
1912 }
1913 x = PyLong_FromString(s, &end, 10);
1914 if (x == NULL)
1915 return NULL;
1916 while (*end && isspace(Py_CHARMASK(*end)))
1917 end++;
1918 if (*end != '\0') {
1919 sprintf(buffer, "invalid literal for long(): %.200s", s);
1920 PyErr_SetString(PyExc_ValueError, buffer);
1921 Py_DECREF(x);
1922 return NULL;
1923 }
1924 return x;
1925}
1926
1927static PyObject *
1928float_from_string(v)
1929 PyObject *v;
1930{
1931 extern double strtod Py_PROTO((const char *, char **));
1932 char *s, *end;
1933 double x;
1934 char buffer[256]; /* For errors */
1935
1936 if (!PyArg_Parse(v, "s", &s))
1937 return NULL;
1938 while (*s && isspace(Py_CHARMASK(*s)))
1939 s++;
1940 if (s[0] == '\0') {
1941 PyErr_SetString(PyExc_ValueError, "empty string for float()");
1942 return NULL;
1943 }
1944 errno = 0;
1945 PyFPE_START_PROTECT("float_from_string", return 0)
1946 x = strtod(s, &end);
1947 PyFPE_END_PROTECT(x)
1948 while (*end && isspace(Py_CHARMASK(*end)))
1949 end++;
1950 if (*end != '\0') {
1951 sprintf(buffer, "invalid literal for float(): %.200s", s);
1952 PyErr_SetString(PyExc_ValueError, buffer);
1953 return NULL;
1954 }
1955 else if (errno != 0) {
1956 sprintf(buffer, "float() literal too large: %.200s", s);
1957 PyErr_SetString(PyExc_ValueError, buffer);
1958 return NULL;
1959 }
1960 return PyFloat_FromDouble(x);
1961}