blob: 439498dc2af833b43f99318a5f9e0bf746c2fdbb [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 Rossumc8b6df91997-05-23 00:06:51 +0000248 long c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000249
Guido van Rossum79f25d91997-04-29 20:08:16 +0000250 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000251 return NULL;
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000252 c = PyObject_Compare(a, b);
253 if (c && PyErr_Occurred())
254 return NULL;
255 return PyInt_FromLong(c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000256}
257
Guido van Rossum79f25d91997-04-29 20:08:16 +0000258static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000259builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000260 PyObject *self;
261 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000262{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000263 PyObject *v, *w;
264 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000265
Guido van Rossum79f25d91997-04-29 20:08:16 +0000266 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000267 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000268 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000269 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000270 res = Py_BuildValue("(OO)", v, w);
271 Py_DECREF(v);
272 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000273 return res;
274}
275
Guido van Rossum79f25d91997-04-29 20:08:16 +0000276static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000277builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000278 PyObject *self;
279 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000280{
281 char *str;
282 char *filename;
283 char *startstr;
284 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000285
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000287 return NULL;
288 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000289 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000290 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000291 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000292 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000293 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000294 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000296 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000297 return NULL;
298 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000299 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000300}
301
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000302#ifndef WITHOUT_COMPLEX
303
Guido van Rossum79f25d91997-04-29 20:08:16 +0000304static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000305builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 PyObject *self;
307 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000308{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000309 PyObject *r, *i, *tmp;
310 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000311 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000312 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000313
314 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000315 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000316 return NULL;
317 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000318 nbr->nb_float == NULL ||
319 (i != NULL &&
320 ((nbi = i->ob_type->tp_as_number) == NULL ||
321 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000322 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000323 "complex() argument can't be converted to complex");
324 return NULL;
325 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000326 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000327 if (PyInstance_Check(r)) {
328 static PyObject *complexstr;
329 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000330 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000331 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000332 if (complexstr == NULL)
333 return NULL;
334 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000335 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000336 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000337 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000338 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000339 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000340 if (args == NULL)
341 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000342 r = PyEval_CallObject(f, args);
343 Py_DECREF(args);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000344 if (r == NULL)
345 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000346 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000347 }
348 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 if (PyComplex_Check(r)) {
350 cr = ((PyComplexObject*)r)->cval;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000351 if (own_r)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 Py_DECREF(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000353 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000354 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000355 tmp = (*nbr->nb_float)(r);
Guido van Rossumc6472e91997-03-31 17:15:43 +0000356 if (own_r)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000357 Py_DECREF(r);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000358 if (tmp == NULL)
359 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000360 cr.real = PyFloat_AsDouble(tmp);
361 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000362 cr.imag = 0.;
363 }
364 if (i == NULL) {
365 ci.real = 0.;
366 ci.imag = 0.;
367 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000368 else if (PyComplex_Check(i))
369 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000370 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000371 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000372 if (tmp == NULL)
373 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000374 ci.real = PyFloat_AsDouble(tmp);
375 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000376 ci.imag = 0.;
377 }
378 cr.real -= ci.imag;
379 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000381}
382
383#endif
384
Guido van Rossum79f25d91997-04-29 20:08:16 +0000385static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000386builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387 PyObject *self;
388 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000389{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000390 static char *attrlist[] = {"__members__", "__methods__", NULL};
391 PyObject *v = NULL, *l = NULL, *m = NULL;
392 PyObject *d, *x;
393 int i;
394 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000395
Guido van Rossum79f25d91997-04-29 20:08:16 +0000396 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000399 x = PyEval_GetLocals();
400 if (x == NULL)
401 goto error;
402 l = PyMapping_Keys(x);
403 if (l == NULL)
404 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000405 }
406 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000407 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000408 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000409 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000410 else {
411 l = PyMapping_Keys(d);
412 if (l == NULL)
413 PyErr_Clear();
414 Py_DECREF(d);
415 }
416 if (l == NULL) {
417 l = PyList_New(0);
418 if (l == NULL)
419 goto error;
420 }
421 for (s = attrlist; *s != NULL; s++) {
422 m = PyObject_GetAttrString(v, *s);
423 if (m == NULL) {
424 PyErr_Clear();
425 continue;
426 }
427 for (i = 0; ; i++) {
428 x = PySequence_GetItem(m, i);
429 if (x == NULL) {
430 PyErr_Clear();
431 break;
432 }
433 if (PyList_Append(l, x) != 0) {
434 Py_DECREF(x);
435 Py_DECREF(m);
436 goto error;
437 }
438 Py_DECREF(x);
439 }
440 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000441 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000442 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000443 if (PyList_Sort(l) != 0)
444 goto error;
445 return l;
446 error:
447 Py_XDECREF(l);
448 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000449}
450
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000452do_divmod(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000456
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 if (PyInstance_Check(v) || PyInstance_Check(w))
458 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000459 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000460 if (v->ob_type->tp_as_number == NULL ||
461 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000462 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000464 return NULL;
465 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000466 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000467 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000468 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000469 Py_DECREF(v);
470 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000471 return res;
472}
473
Guido van Rossum79f25d91997-04-29 20:08:16 +0000474static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000475builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476 PyObject *self;
477 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000478{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000479 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000480
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000482 return NULL;
483 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000484}
485
Guido van Rossum79f25d91997-04-29 20:08:16 +0000486static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000487builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488 PyObject *self;
489 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000490{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000491 PyObject *cmd;
492 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000493 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000494
Guido van Rossum79f25d91997-04-29 20:08:16 +0000495 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000496 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 &PyDict_Type, &globals,
498 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000499 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500 if (globals == Py_None) {
501 globals = PyEval_GetGlobals();
502 if (locals == Py_None)
503 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000504 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000505 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000506 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
508 if (PyDict_SetItemString(globals, "__builtins__",
509 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000510 return NULL;
511 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 if (PyCode_Check(cmd))
513 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
514 if (!PyString_Check(cmd)) {
515 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000516 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000517 return NULL;
518 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000519 str = PyString_AsString(cmd);
520 if ((int)strlen(str) != PyString_Size(cmd)) {
521 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000522 "embedded '\\0' in string arg");
523 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000524 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000525 while (*str == ' ' || *str == '\t')
526 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000527 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000528}
529
Guido van Rossum79f25d91997-04-29 20:08:16 +0000530static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000531builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532 PyObject *self;
533 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000534{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000535 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000536 PyObject *globals = Py_None, *locals = Py_None;
537 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000538 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000539
Guido van Rossum79f25d91997-04-29 20:08:16 +0000540 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 &PyDict_Type, &globals,
543 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000544 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000545 if (globals == Py_None) {
546 globals = PyEval_GetGlobals();
547 if (locals == Py_None)
548 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000549 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000550 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000551 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
553 if (PyDict_SetItemString(globals, "__builtins__",
554 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000555 return NULL;
556 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000557 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000558 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000560 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000562 return NULL;
563 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000564 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000565 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000566 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000568 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000569}
570
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000572builtin_float(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 PyObject *self;
574 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000575{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000576 PyObject *v;
577 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000578
Guido van Rossum79f25d91997-04-29 20:08:16 +0000579 if (!PyArg_ParseTuple(args, "O:float", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000582 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000583 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000584 nb->nb_float == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000586 "float() argument can't be converted to float");
587 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000588 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000589 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000590}
591
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000593builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594 PyObject *self;
595 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000596{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000597 PyObject *v;
598 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000599
Guido van Rossum79f25d91997-04-29 20:08:16 +0000600 if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000601 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 return PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000603}
604
Guido van Rossum79f25d91997-04-29 20:08:16 +0000605static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000606builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607 PyObject *self;
608 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000609{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000611
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000613 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 d = PyEval_GetGlobals();
615 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000616 return d;
617}
618
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000620builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621 PyObject *self;
622 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000623{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 PyObject *v;
625 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626
Guido van Rossum79f25d91997-04-29 20:08:16 +0000627 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000628 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyErr_Clear();
632 return PyInt_FromLong(0L);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000633 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000634 Py_DECREF(v);
635 return PyInt_FromLong(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000636}
637
Guido van Rossum79f25d91997-04-29 20:08:16 +0000638static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000639builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640 PyObject *self;
641 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000642{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000643 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000644
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000646 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 return PyInt_FromLong((long)v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000648}
649
Guido van Rossum79f25d91997-04-29 20:08:16 +0000650static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000651builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652 PyObject *self;
653 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000654{
655 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000656 PyObject *seq;
657 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000658 int len;
659 } sequence;
660
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000662 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000663 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000664 register int i, j;
665
Guido van Rossum79f25d91997-04-29 20:08:16 +0000666 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000667 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 PyErr_SetString(PyExc_TypeError,
669 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000670 return NULL;
671 }
672
Guido van Rossum79f25d91997-04-29 20:08:16 +0000673 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000674 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000675
Guido van Rossum79f25d91997-04-29 20:08:16 +0000676 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
677 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000678 goto Fail_2;
679 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000680
Guido van Rossum2d951851994-08-29 12:52:16 +0000681 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000682 int curlen;
683
Guido van Rossum79f25d91997-04-29 20:08:16 +0000684 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000685 goto Fail_2;
686
687 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
688 static char errmsg[] =
689 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000690 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000691
692 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000693 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000694 goto Fail_2;
695 }
696
697 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
698 goto Fail_2;
699
700 if (curlen > len)
701 len = curlen;
702 }
703
Guido van Rossum79f25d91997-04-29 20:08:16 +0000704 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000705 goto Fail_2;
706
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000707 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000708 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000709 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000710 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000711
Guido van Rossum79f25d91997-04-29 20:08:16 +0000712 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000713 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000714 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000716 goto Fail_1;
717 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000718
719 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000720 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000721 Py_INCREF(Py_None);
722 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000723 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000724 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000725 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000726 if (item == NULL) {
727 if (i < sqp->len)
728 goto Fail_0;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000729 if (PyErr_Occurred() ==
730 PyExc_IndexError) {
731 PyErr_Clear();
732 Py_INCREF(Py_None);
733 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000734 sqp->len = -1;
735 }
736 else {
737 goto Fail_0;
738 }
739 }
740 else
741 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000742
Guido van Rossum12d12c51993-10-26 17:58:25 +0000743 }
Guido van Rossum32120311995-07-10 13:52:21 +0000744 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000745 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000746 if (PyTuple_SetItem(alist, j, item) < 0) {
747 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000748 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000749 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000750 continue;
751
752 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000753 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000754 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000755 }
756
Guido van Rossum32120311995-07-10 13:52:21 +0000757 if (!alist)
758 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000759
760 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000761 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000762 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000763 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000764
Guido van Rossum79f25d91997-04-29 20:08:16 +0000765 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000766 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000767 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 value = PyEval_CallObject(func, alist);
769 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000770 if (value == NULL)
771 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000772 }
773 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000774 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000775 goto Fail_1;
776 }
777 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000778 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000779 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000780 }
781 }
782
Guido van Rossum79f25d91997-04-29 20:08:16 +0000783 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000784 return result;
785
Guido van Rossum12d12c51993-10-26 17:58:25 +0000786Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000788Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000790 return NULL;
791}
792
Guido van Rossum79f25d91997-04-29 20:08:16 +0000793static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000794builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795 PyObject *self;
796 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000797{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 PyObject *v;
799 PyObject *name;
800 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000801
Guido van Rossum79f25d91997-04-29 20:08:16 +0000802 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000803 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000804 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000805 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000806 Py_INCREF(Py_None);
807 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000808}
809
Guido van Rossum79f25d91997-04-29 20:08:16 +0000810static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000811builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000812 PyObject *self;
813 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000814{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 PyObject *v;
816 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000817
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000819 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000820 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000821 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000822 Py_INCREF(Py_None);
823 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000824}
825
Guido van Rossum79f25d91997-04-29 20:08:16 +0000826static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000827builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000828 PyObject *self;
829 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000830{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000832 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000833
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000835 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000836 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000837 if (x == -1)
838 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000840}
841
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000843builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000844 PyObject *self;
845 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000846{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 PyObject *v;
848 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000849
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000851 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000852
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000853 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000854 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000855 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000856 "hex() argument can't be converted to hex");
857 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000858 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000859 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000860}
861
Guido van Rossum79f25d91997-04-29 20:08:16 +0000862static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000863
Guido van Rossum79f25d91997-04-29 20:08:16 +0000864static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000865builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000866 PyObject *self;
867 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000868{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000870 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000871 PyObject *res;
872 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000873
874 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000875 if (line == NULL)
876 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000878 return NULL;
879 while (*str == ' ' || *str == '\t')
880 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000881 globals = PyEval_GetGlobals();
882 locals = PyEval_GetLocals();
883 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
884 if (PyDict_SetItemString(globals, "__builtins__",
885 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000886 return NULL;
887 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000888 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000890 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000891}
892
Guido van Rossume8811f81997-02-14 15:48:05 +0000893static PyObject *
894builtin_intern(self, args)
895 PyObject *self;
896 PyObject *args;
897{
898 PyObject *s;
899 if (!PyArg_ParseTuple(args, "S", &s))
900 return NULL;
901 Py_INCREF(s);
902 PyString_InternInPlace(&s);
903 return s;
904}
905
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000907builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000908 PyObject *self;
909 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000910{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 PyObject *v;
912 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000913
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000915 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000916 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000917 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000919 nb->nb_int == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000920 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000921 "int() argument can't be converted to int");
922 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000923 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000924 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000925}
926
Guido van Rossum79f25d91997-04-29 20:08:16 +0000927static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000928builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000929 PyObject *self;
930 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000931{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000933 long len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934 PyTypeObject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000935
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000937 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000938 tp = v->ob_type;
939 if (tp->tp_as_sequence != NULL) {
940 len = (*tp->tp_as_sequence->sq_length)(v);
941 }
942 else if (tp->tp_as_mapping != NULL) {
943 len = (*tp->tp_as_mapping->mp_length)(v);
944 }
945 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000946 PyErr_SetString(PyExc_TypeError, "len() of unsized object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000947 return NULL;
948 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000949 if (len < 0)
950 return NULL;
951 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 return PyInt_FromLong(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000953}
954
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000956builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000957 PyObject *self;
958 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000959{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyObject *v;
961 PySequenceMethods *sqf;
Guido van Rossumd1705771996-04-09 02:41:06 +0000962
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000964 return NULL;
965 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
966 int n = (*sqf->sq_length)(v);
967 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 PyObject *l;
Guido van Rossumd1705771996-04-09 02:41:06 +0000969 if (n < 0)
970 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 l = PyList_New(n);
Guido van Rossumd1705771996-04-09 02:41:06 +0000972 if (l == NULL)
973 return NULL;
974 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumd1705771996-04-09 02:41:06 +0000976 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000977 Py_DECREF(l);
Guido van Rossumd1705771996-04-09 02:41:06 +0000978 l = NULL;
979 break;
980 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000981 PyList_SetItem(l, i, item);
Guido van Rossumd1705771996-04-09 02:41:06 +0000982 }
983 /* XXX Should support indefinite-length sequences */
984 return l;
985 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
Guido van Rossumd1705771996-04-09 02:41:06 +0000987 return NULL;
988}
989
Guido van Rossum8861b741996-07-30 16:49:37 +0000990
991static PyObject *
992builtin_slice(self, args)
993 PyObject *self;
994 PyObject *args;
995{
996 PyObject *start, *stop, *step;
997
998 start = stop = step = NULL;
999
1000 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1001 return NULL;
1002
1003 /*This swapping of stop and start is to maintain compatibility with
1004 the range builtin.*/
1005 if (stop == NULL) {
1006 stop = start;
1007 start = NULL;
1008 }
1009 return PySlice_New(start, stop, step);
1010}
1011
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001013builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 PyObject *self;
1015 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001016{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001018
Guido van Rossum79f25d91997-04-29 20:08:16 +00001019 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +00001020 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021 d = PyEval_GetLocals();
1022 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001023 return d;
1024}
1025
Guido van Rossum79f25d91997-04-29 20:08:16 +00001026static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001027builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028 PyObject *self;
1029 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +00001030{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 PyObject *v;
1032 PyNumberMethods *nb;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001033
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +00001037 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001039 nb->nb_long == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001041 "long() argument can't be converted to long");
1042 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001043 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001044 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001045}
1046
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001048min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001050 int sign;
1051{
Guido van Rossum2d951851994-08-29 12:52:16 +00001052 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001053 PyObject *v, *w, *x;
1054 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001055
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001057 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001059 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001060 sq = v->ob_type->tp_as_sequence;
1061 if (sq == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 PyErr_SetString(PyExc_TypeError,
1063 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001064 return NULL;
1065 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001066 w = NULL;
1067 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001068 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001069 if (x == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001070 if (PyErr_Occurred() == PyExc_IndexError) {
1071 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 break;
1073 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001075 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001077 if (w == NULL)
1078 w = x;
1079 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001080 int c = PyObject_Compare(x, w);
1081 if (c && PyErr_Occurred()) {
1082 Py_DECREF(x);
1083 Py_XDECREF(w);
1084 return NULL;
1085 }
1086 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001087 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001088 w = x;
1089 }
1090 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001092 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001093 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001094 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001095 PyErr_SetString(PyExc_ValueError,
1096 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001097 return w;
1098}
1099
Guido van Rossum79f25d91997-04-29 20:08:16 +00001100static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001101builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001102 PyObject *self;
1103 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001104{
1105 return min_max(v, -1);
1106}
1107
Guido van Rossum79f25d91997-04-29 20:08:16 +00001108static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001109builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001110 PyObject *self;
1111 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112{
1113 return min_max(v, 1);
1114}
1115
Guido van Rossum79f25d91997-04-29 20:08:16 +00001116static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001117builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001118 PyObject *self;
1119 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001120{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 PyObject *v;
1122 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001123
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001125 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001126 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1127 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001129 "oct() argument can't be converted to oct");
1130 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001131 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001132 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001133}
1134
Guido van Rossum79f25d91997-04-29 20:08:16 +00001135static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001136builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137 PyObject *self;
1138 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001139{
Guido van Rossum2d951851994-08-29 12:52:16 +00001140 char *name;
1141 char *mode = "r";
1142 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001143 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001144
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001146 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001147 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001148 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001149 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001150 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001151}
1152
Guido van Rossum79f25d91997-04-29 20:08:16 +00001153static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001154builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001155 PyObject *self;
1156 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001157{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001158 char c;
1159
Guido van Rossum79f25d91997-04-29 20:08:16 +00001160 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001161 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001162 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001163}
1164
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001166do_pow(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 PyObject *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001168{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001169 PyObject *res;
1170 if (PyInstance_Check(v) || PyInstance_Check(w))
1171 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001172 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001173 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 PyErr_SetString(PyExc_TypeError,
1175 "pow() requires numeric arguments");
Guido van Rossumd4905451991-05-05 20:00:36 +00001176 return NULL;
1177 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001178 if (
1179#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 !PyComplex_Check(v) &&
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001181#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
1183 if (!PyErr_Occurred())
1184 PyErr_SetString(PyExc_ValueError,
1185 "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001186 return NULL;
1187 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001189 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
1191 Py_DECREF(v);
1192 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001193 return res;
1194}
1195
Guido van Rossum79f25d91997-04-29 20:08:16 +00001196static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001197builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001198 PyObject *self;
1199 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001200{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 PyObject *v, *w, *z = Py_None, *res;
1202 PyObject *v1, *z1, *w2, *z2;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001203
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001205 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001206 if (z == Py_None)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001207 return do_pow(v, w);
1208 /* XXX The ternary version doesn't do class instance coercions */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 if (PyInstance_Check(v))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001210 return v->ob_type->tp_as_number->nb_power(v, w, z);
1211 if (v->ob_type->tp_as_number == NULL ||
1212 z->ob_type->tp_as_number == NULL ||
1213 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001214 PyErr_SetString(PyExc_TypeError,
1215 "pow() requires numeric arguments");
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001216 return NULL;
1217 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001219 return NULL;
1220 res = NULL;
1221 v1 = v;
1222 z1 = z;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001223 if (PyNumber_Coerce(&v1, &z1) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001224 goto error2;
1225 w2 = w;
1226 z2 = z1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 if (PyNumber_Coerce(&w2, &z2) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001228 goto error1;
1229 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 Py_DECREF(w2);
1231 Py_DECREF(z2);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001232 error1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233 Py_DECREF(v1);
1234 Py_DECREF(z1);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001235 error2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 Py_DECREF(v);
1237 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001238 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001239}
1240
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001242builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001243 PyObject *self;
1244 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001245{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001247 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249
Guido van Rossum79f25d91997-04-29 20:08:16 +00001250 if (PyTuple_Size(args) <= 1) {
1251 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001252 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001253 &ihigh))
1254 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001255 }
1256 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001258 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001259 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001260 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001261 }
1262 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001264 return NULL;
1265 }
1266 /* XXX ought to check overflow of subtraction */
1267 if (istep > 0)
1268 n = (ihigh - ilow + istep - 1) / istep;
1269 else
1270 n = (ihigh - ilow + istep + 1) / istep;
1271 if (n < 0)
1272 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001273 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001274 if (v == NULL)
1275 return NULL;
1276 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001277 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001278 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001280 return NULL;
1281 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283 ilow += istep;
1284 }
1285 return v;
1286}
1287
Guido van Rossum79f25d91997-04-29 20:08:16 +00001288static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001289builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 PyObject *self;
1291 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001292{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001293 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001294 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001295
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 if (PyTuple_Size(args) <= 1) {
1297 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001298 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001299 &ihigh))
1300 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001301 }
1302 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001304 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001305 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001306 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001307 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001310 return NULL;
1311 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001312 /* XXX ought to check overflow of subtraction */
1313 if (istep > 0)
1314 n = (ihigh - ilow + istep - 1) / istep;
1315 else
1316 n = (ihigh - ilow + istep + 1) / istep;
1317 if (n < 0)
1318 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001320}
1321
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001323
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001325builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 PyObject *self;
1327 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001328{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329 PyObject *v = NULL;
1330 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001331
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001333 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1335 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001336 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001338 char *prompt;
1339 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001341 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001342 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001343 if (po == NULL)
1344 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001346 }
1347 else {
1348 po = NULL;
1349 prompt = "";
1350 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001351 s = PyOS_Readline(prompt);
1352 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001353 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001354 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001355 return NULL;
1356 }
1357 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001359 result = NULL;
1360 }
1361 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001363 }
1364 free(s);
1365 return result;
1366 }
Guido van Rossum90933611991-06-07 16:10:43 +00001367 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001371 return NULL;
1372 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001373 if (Py_FlushLine() != 0 ||
1374 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001375 return NULL;
1376 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001377 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001378 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001380 return NULL;
1381 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383}
1384
Guido van Rossum79f25d91997-04-29 20:08:16 +00001385static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001386builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387 PyObject *self;
1388 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001389{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 PyObject *seq, *func, *result = NULL;
1391 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001392 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001393
Guido van Rossum79f25d91997-04-29 20:08:16 +00001394 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001395 return NULL;
1396 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001398
1399 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001401 "2nd argument to reduce() must be a sequence object");
1402 return NULL;
1403 }
1404
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001406 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001407
Guido van Rossum2d951851994-08-29 12:52:16 +00001408 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001409 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001410
1411 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001412 Py_DECREF(args);
1413 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001414 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001415 }
1416
Guido van Rossum2d951851994-08-29 12:52:16 +00001417 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001418 if (PyErr_Occurred() == PyExc_IndexError) {
1419 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001420 break;
1421 }
1422 goto Fail;
1423 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001424
Guido van Rossum2d951851994-08-29 12:52:16 +00001425 if (result == NULL)
1426 result = op2;
1427 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001428 PyTuple_SetItem(args, 0, result);
1429 PyTuple_SetItem(args, 1, op2);
1430 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001431 goto Fail;
1432 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001433 }
1434
Guido van Rossum79f25d91997-04-29 20:08:16 +00001435 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001436
Guido van Rossum2d951851994-08-29 12:52:16 +00001437 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001438 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001439 "reduce of empty sequence with no initial value");
1440
Guido van Rossum12d12c51993-10-26 17:58:25 +00001441 return result;
1442
Guido van Rossum2d951851994-08-29 12:52:16 +00001443Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001444 Py_XDECREF(args);
1445 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001446 return NULL;
1447}
1448
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001450builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001451 PyObject *self;
1452 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001453{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001457 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001458 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001459}
1460
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 PyObject *self;
1464 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001465{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001469 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001470 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001471}
1472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001474builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475 PyObject *self;
1476 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001477{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001478 double x;
1479 double f;
1480 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001481 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001482
Guido van Rossum79f25d91997-04-29 20:08:16 +00001483 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001484 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001485 f = 1.0;
1486 for (i = ndigits; --i >= 0; )
1487 f = f*10.0;
1488 for (i = ndigits; ++i <= 0; )
1489 f = f*0.1;
1490 if (x >= 0.0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001491 return PyFloat_FromDouble(floor(x*f + 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001492 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001493 return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001494}
1495
Guido van Rossum79f25d91997-04-29 20:08:16 +00001496static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001497builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001498 PyObject *self;
1499 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001500{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001501 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001502
Guido van Rossum79f25d91997-04-29 20:08:16 +00001503 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001504 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001505 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001506}
1507
Guido van Rossum79f25d91997-04-29 20:08:16 +00001508static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001509builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001510 PyObject *self;
1511 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001512{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001513 PyObject *v;
1514 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001517 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 if (PyTuple_Check(v)) {
1519 Py_INCREF(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001520 return v;
1521 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001522 if (PyList_Check(v))
1523 return PyList_AsTuple(v);
1524 if (PyString_Check(v)) {
1525 int n = PyString_Size(v);
1526 PyObject *t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001527 if (t != NULL) {
1528 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 char *p = PyString_AsString(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001530 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 PyObject *item =
1532 PyString_FromStringAndSize(p+i, 1);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001533 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001534 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001535 t = NULL;
1536 break;
1537 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001538 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001539 }
1540 }
1541 return t;
1542 }
1543 /* Generic sequence object */
1544 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1545 int n = (*sqf->sq_length)(v);
1546 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 PyObject *t;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001548 if (n < 0)
1549 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550 t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001551 if (t == NULL)
1552 return NULL;
1553 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001554 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001555 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001556 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001557 t = NULL;
1558 break;
1559 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001561 }
1562 /* XXX Should support indefinite-length sequences */
1563 return t;
1564 }
1565 /* None of the above */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001566 PyErr_SetString(PyExc_TypeError,
1567 "tuple() argument must be a sequence");
Guido van Rossumcae027b1994-08-29 12:53:11 +00001568 return NULL;
1569}
1570
Guido van Rossum79f25d91997-04-29 20:08:16 +00001571static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001572builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 PyObject *self;
1574 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001575{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001576 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001577
Guido van Rossum79f25d91997-04-29 20:08:16 +00001578 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001579 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001580 v = (PyObject *)v->ob_type;
1581 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001582 return v;
1583}
1584
Guido van Rossum79f25d91997-04-29 20:08:16 +00001585static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001586builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001587 PyObject *self;
1588 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001589{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001590 PyObject *v = NULL;
1591 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001592
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001594 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001595 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001596 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001597 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598 if (!PyErr_Occurred())
1599 PyErr_SetString(PyExc_SystemError,
1600 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001601 }
1602 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001604 }
1605 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001607 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001608 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001609 "vars() argument must have __dict__ attribute");
1610 return NULL;
1611 }
1612 }
1613 return d;
1614}
1615
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001617 {"__import__", builtin___import__, 1},
1618 {"abs", builtin_abs, 1},
1619 {"apply", builtin_apply, 1},
1620 {"callable", builtin_callable, 1},
1621 {"chr", builtin_chr, 1},
1622 {"cmp", builtin_cmp, 1},
1623 {"coerce", builtin_coerce, 1},
1624 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001625#ifndef WITHOUT_COMPLEX
1626 {"complex", builtin_complex, 1},
1627#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001628 {"delattr", builtin_delattr, 1},
1629 {"dir", builtin_dir, 1},
1630 {"divmod", builtin_divmod, 1},
1631 {"eval", builtin_eval, 1},
1632 {"execfile", builtin_execfile, 1},
1633 {"filter", builtin_filter, 1},
1634 {"float", builtin_float, 1},
1635 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001636 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001637 {"hasattr", builtin_hasattr, 1},
1638 {"hash", builtin_hash, 1},
1639 {"hex", builtin_hex, 1},
1640 {"id", builtin_id, 1},
1641 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001642 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001643 {"int", builtin_int, 1},
1644 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001645 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001646 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001647 {"long", builtin_long, 1},
1648 {"map", builtin_map, 1},
1649 {"max", builtin_max, 1},
1650 {"min", builtin_min, 1},
1651 {"oct", builtin_oct, 1},
1652 {"open", builtin_open, 1},
1653 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001654 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001655 {"range", builtin_range, 1},
1656 {"raw_input", builtin_raw_input, 1},
1657 {"reduce", builtin_reduce, 1},
1658 {"reload", builtin_reload, 1},
1659 {"repr", builtin_repr, 1},
1660 {"round", builtin_round, 1},
1661 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001662 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001663 {"str", builtin_str, 1},
1664 {"tuple", builtin_tuple, 1},
1665 {"type", builtin_type, 1},
1666 {"vars", builtin_vars, 1},
1667 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001668 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001669};
1670
Guido van Rossum3f5da241990-12-20 15:06:42 +00001671/* Predefined exceptions */
1672
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673PyObject *PyExc_AccessError;
1674PyObject *PyExc_AssertionError;
1675PyObject *PyExc_AttributeError;
1676PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001677PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001678PyObject *PyExc_IOError;
1679PyObject *PyExc_ImportError;
1680PyObject *PyExc_IndexError;
1681PyObject *PyExc_KeyError;
1682PyObject *PyExc_KeyboardInterrupt;
1683PyObject *PyExc_MemoryError;
1684PyObject *PyExc_NameError;
1685PyObject *PyExc_OverflowError;
1686PyObject *PyExc_RuntimeError;
1687PyObject *PyExc_SyntaxError;
1688PyObject *PyExc_SystemError;
1689PyObject *PyExc_SystemExit;
1690PyObject *PyExc_TypeError;
1691PyObject *PyExc_ValueError;
1692PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001693
Guido van Rossum79f25d91997-04-29 20:08:16 +00001694static PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +00001695newstdexception(dict, name)
1696 PyObject *dict;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001697 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001698{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001699 PyObject *v = PyString_FromString(name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001700 if (v == NULL || PyDict_SetItemString(dict, name, v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001701 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001702 return v;
1703}
1704
1705static void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001706initerrors(dict)
1707 PyObject *dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001708{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001709 PyExc_AccessError = newstdexception(dict, "AccessError");
1710 PyExc_AssertionError = newstdexception(dict, "AssertionError");
1711 PyExc_AttributeError = newstdexception(dict, "AttributeError");
1712 PyExc_EOFError = newstdexception(dict, "EOFError");
1713 PyExc_FloatingPointError = newstdexception(dict, "FloatingPointError");
1714 PyExc_IOError = newstdexception(dict, "IOError");
1715 PyExc_ImportError = newstdexception(dict, "ImportError");
1716 PyExc_IndexError = newstdexception(dict, "IndexError");
1717 PyExc_KeyError = newstdexception(dict, "KeyError");
1718 PyExc_KeyboardInterrupt = newstdexception(dict, "KeyboardInterrupt");
1719 PyExc_MemoryError = newstdexception(dict, "MemoryError");
1720 PyExc_NameError = newstdexception(dict, "NameError");
1721 PyExc_OverflowError = newstdexception(dict, "OverflowError");
1722 PyExc_RuntimeError = newstdexception(dict, "RuntimeError");
1723 PyExc_SyntaxError = newstdexception(dict, "SyntaxError");
1724 PyExc_SystemError = newstdexception(dict, "SystemError");
1725 PyExc_SystemExit = newstdexception(dict, "SystemExit");
1726 PyExc_TypeError = newstdexception(dict, "TypeError");
1727 PyExc_ValueError = newstdexception(dict, "ValueError");
1728 PyExc_ZeroDivisionError = newstdexception(dict, "ZeroDivisionError");
1729}
1730
1731static void
1732finierrors()
1733{
1734 Py_XDECREF(PyExc_AccessError); PyExc_AccessError = NULL;
1735 Py_XDECREF(PyExc_AssertionError); PyExc_AssertionError = NULL;
1736 Py_XDECREF(PyExc_AttributeError); PyExc_AttributeError = NULL;
1737 Py_XDECREF(PyExc_EOFError); PyExc_EOFError = NULL;
1738 Py_XDECREF(PyExc_FloatingPointError); PyExc_FloatingPointError = NULL;
1739 Py_XDECREF(PyExc_IOError); PyExc_IOError = NULL;
1740 Py_XDECREF(PyExc_ImportError); PyExc_ImportError = NULL;
1741 Py_XDECREF(PyExc_IndexError); PyExc_IndexError = NULL;
1742 Py_XDECREF(PyExc_KeyError); PyExc_KeyError = NULL;
1743 Py_XDECREF(PyExc_KeyboardInterrupt); PyExc_KeyboardInterrupt = NULL;
1744 Py_XDECREF(PyExc_MemoryError); PyExc_MemoryError = NULL;
1745 Py_XDECREF(PyExc_NameError); PyExc_NameError = NULL;
1746 Py_XDECREF(PyExc_OverflowError); PyExc_OverflowError = NULL;
1747 Py_XDECREF(PyExc_RuntimeError); PyExc_RuntimeError = NULL;
1748 Py_XDECREF(PyExc_SyntaxError); PyExc_SyntaxError = NULL;
1749 Py_XDECREF(PyExc_SystemError); PyExc_SystemError = NULL;
1750 Py_XDECREF(PyExc_SystemExit); PyExc_SystemExit = NULL;
1751 Py_XDECREF(PyExc_TypeError); PyExc_TypeError = NULL;
1752 Py_XDECREF(PyExc_ValueError); PyExc_ValueError = NULL;
1753 Py_XDECREF(PyExc_ZeroDivisionError); PyExc_ZeroDivisionError = NULL;
1754}
1755
1756PyObject *
1757_PyBuiltin_Init()
1758{
1759 PyObject *mod, *dict;
1760 mod = Py_InitModule("__builtin__", builtin_methods);
1761 if (mod == NULL)
1762 return NULL;
1763 dict = PyModule_GetDict(mod);
1764 initerrors(dict);
1765 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1766 return NULL;
1767 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1768 return NULL;
1769 if (PyDict_SetItemString(dict, "__debug__",
1770 PyInt_FromLong(Py_OptimizeFlag == 0)) < 0)
1771 return NULL;
1772 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001773}
1774
1775void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001776_PyBuiltin_Fini()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001777{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001778 finierrors();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001779}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001780
Guido van Rossum12d12c51993-10-26 17:58:25 +00001781
Guido van Rossume77a7571993-11-03 15:01:26 +00001782/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001783
Guido van Rossum79f25d91997-04-29 20:08:16 +00001784static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001785filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786 PyObject *func;
1787 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001788{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001789 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001790 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001791 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001792
Guido van Rossumb7b45621995-08-04 04:07:45 +00001793 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001794 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001795 return tuple;
1796 }
1797
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001799 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001800
Guido van Rossum12d12c51993-10-26 17:58:25 +00001801 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001803 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001804
Guido van Rossum79f25d91997-04-29 20:08:16 +00001805 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001806 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807 if (func == Py_None) {
1808 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001809 good = item;
1810 }
1811 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001812 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001813 if (arg == NULL)
1814 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001815 good = PyEval_CallObject(func, arg);
1816 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001817 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001818 goto Fail_1;
1819 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001820 ok = PyObject_IsTrue(good);
1821 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001822 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001823 Py_INCREF(item);
1824 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001825 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001826 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001827 }
1828
Guido van Rossum79f25d91997-04-29 20:08:16 +00001829 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001830 return NULL;
1831
Guido van Rossum12d12c51993-10-26 17:58:25 +00001832 return result;
1833
Guido van Rossum12d12c51993-10-26 17:58:25 +00001834Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001835 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001836 return NULL;
1837}
1838
1839
Guido van Rossume77a7571993-11-03 15:01:26 +00001840/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001841
Guido van Rossum79f25d91997-04-29 20:08:16 +00001842static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001843filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844 PyObject *func;
1845 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001846{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001847 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001848 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001850
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001852 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001853 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001854 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001855 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001857 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001858
Guido van Rossum12d12c51993-10-26 17:58:25 +00001859 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001861 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001862
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001863 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1864 if (item == NULL)
1865 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 arg = Py_BuildValue("(O)", item);
1867 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001868 if (arg == NULL)
1869 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 good = PyEval_CallObject(func, arg);
1871 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001872 if (good == NULL)
1873 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874 ok = PyObject_IsTrue(good);
1875 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001876 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 PyString_AS_STRING((PyStringObject *)result)[j++] =
1878 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001879 }
1880
Guido van Rossum79f25d91997-04-29 20:08:16 +00001881 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001882 return NULL;
1883
Guido van Rossum12d12c51993-10-26 17:58:25 +00001884 return result;
1885
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001887 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001888 return NULL;
1889}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001890
1891/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1892
1893static PyObject *
1894int_from_string(v)
1895 PyObject *v;
1896{
1897 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1898 char *s, *end;
1899 long x;
1900 char buffer[256]; /* For errors */
1901
1902 if (!PyArg_Parse(v, "s", &s))
1903 return NULL;
1904 while (*s && isspace(Py_CHARMASK(*s)))
1905 s++;
1906 if (s[0] == '\0') {
1907 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1908 return NULL;
1909 }
1910 errno = 0;
1911 x = PyOS_strtol(s, &end, 10);
1912 while (*end && isspace(Py_CHARMASK(*end)))
1913 end++;
1914 if (*end != '\0') {
1915 sprintf(buffer, "invalid literal for int(): %.200s", s);
1916 PyErr_SetString(PyExc_ValueError, buffer);
1917 return NULL;
1918 }
1919 else if (errno != 0) {
1920 sprintf(buffer, "int() literal too large: %.200s", s);
1921 PyErr_SetString(PyExc_ValueError, buffer);
1922 return NULL;
1923 }
1924 return PyInt_FromLong(x);
1925}
1926
1927static PyObject *
1928long_from_string(v)
1929 PyObject *v;
1930{
1931 char *s, *end;
1932 PyObject *x;
1933 char buffer[256]; /* For errors */
1934
1935 if (!PyArg_Parse(v, "s", &s))
1936 return NULL;
1937
1938 while (*s && isspace(Py_CHARMASK(*s)))
1939 s++;
1940 if (s[0] == '\0') {
1941 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1942 return NULL;
1943 }
1944 x = PyLong_FromString(s, &end, 10);
1945 if (x == NULL)
1946 return NULL;
1947 while (*end && isspace(Py_CHARMASK(*end)))
1948 end++;
1949 if (*end != '\0') {
1950 sprintf(buffer, "invalid literal for long(): %.200s", s);
1951 PyErr_SetString(PyExc_ValueError, buffer);
1952 Py_DECREF(x);
1953 return NULL;
1954 }
1955 return x;
1956}
1957
1958static PyObject *
1959float_from_string(v)
1960 PyObject *v;
1961{
1962 extern double strtod Py_PROTO((const char *, char **));
1963 char *s, *end;
1964 double x;
1965 char buffer[256]; /* For errors */
1966
1967 if (!PyArg_Parse(v, "s", &s))
1968 return NULL;
1969 while (*s && isspace(Py_CHARMASK(*s)))
1970 s++;
1971 if (s[0] == '\0') {
1972 PyErr_SetString(PyExc_ValueError, "empty string for float()");
1973 return NULL;
1974 }
1975 errno = 0;
1976 PyFPE_START_PROTECT("float_from_string", return 0)
1977 x = strtod(s, &end);
1978 PyFPE_END_PROTECT(x)
1979 while (*end && isspace(Py_CHARMASK(*end)))
1980 end++;
1981 if (*end != '\0') {
1982 sprintf(buffer, "invalid literal for float(): %.200s", s);
1983 PyErr_SetString(PyExc_ValueError, buffer);
1984 return NULL;
1985 }
1986 else if (errno != 0) {
1987 sprintf(buffer, "float() literal too large: %.200s", s);
1988 PyErr_SetString(PyExc_ValueError, buffer);
1989 return NULL;
1990 }
1991 return PyFloat_FromDouble(x);
1992}