blob: a89b3fcc4b205d897cb2a0a4b836ebb793be4ea4 [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;
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000172 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 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;
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000729 if (PyErr_ExceptionMatches(
730 PyExc_IndexError))
731 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000732 PyErr_Clear();
733 Py_INCREF(Py_None);
734 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000735 sqp->len = -1;
736 }
737 else {
738 goto Fail_0;
739 }
740 }
741 else
742 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000743
Guido van Rossum12d12c51993-10-26 17:58:25 +0000744 }
Guido van Rossum32120311995-07-10 13:52:21 +0000745 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000746 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 if (PyTuple_SetItem(alist, j, item) < 0) {
748 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000749 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000750 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000751 continue;
752
753 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000754 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000755 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000756 }
757
Guido van Rossum32120311995-07-10 13:52:21 +0000758 if (!alist)
759 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000760
761 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000763 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000764 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000765
Guido van Rossum79f25d91997-04-29 20:08:16 +0000766 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000767 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000768 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000769 value = PyEval_CallObject(func, alist);
770 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000771 if (value == NULL)
772 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000773 }
774 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000776 goto Fail_1;
777 }
778 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000780 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000781 }
782 }
783
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000785 return result;
786
Guido van Rossum12d12c51993-10-26 17:58:25 +0000787Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000788 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000789Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000791 return NULL;
792}
793
Guido van Rossum79f25d91997-04-29 20:08:16 +0000794static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000795builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796 PyObject *self;
797 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000798{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000799 PyObject *v;
800 PyObject *name;
801 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000804 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000806 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 Py_INCREF(Py_None);
808 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000809}
810
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000812builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 PyObject *self;
814 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000815{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816 PyObject *v;
817 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000820 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000822 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 Py_INCREF(Py_None);
824 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000825}
826
Guido van Rossum79f25d91997-04-29 20:08:16 +0000827static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000828builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829 PyObject *self;
830 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000831{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000832 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000836 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838 if (x == -1)
839 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000841}
842
Guido van Rossum79f25d91997-04-29 20:08:16 +0000843static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000844builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845 PyObject *self;
846 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000847{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000848 PyObject *v;
849 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000850
Guido van Rossum79f25d91997-04-29 20:08:16 +0000851 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000852 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000853
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000855 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000856 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000857 "hex() argument can't be converted to hex");
858 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000859 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000860 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000861}
862
Guido van Rossum79f25d91997-04-29 20:08:16 +0000863static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000864
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000866builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867 PyObject *self;
868 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000869{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000870 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000871 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 PyObject *res;
873 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000874
875 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000876 if (line == NULL)
877 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000878 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000879 return NULL;
880 while (*str == ' ' || *str == '\t')
881 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 globals = PyEval_GetGlobals();
883 locals = PyEval_GetLocals();
884 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
885 if (PyDict_SetItemString(globals, "__builtins__",
886 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000887 return NULL;
888 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000889 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000891 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892}
893
Guido van Rossume8811f81997-02-14 15:48:05 +0000894static PyObject *
895builtin_intern(self, args)
896 PyObject *self;
897 PyObject *args;
898{
899 PyObject *s;
900 if (!PyArg_ParseTuple(args, "S", &s))
901 return NULL;
902 Py_INCREF(s);
903 PyString_InternInPlace(&s);
904 return s;
905}
906
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000908builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909 PyObject *self;
910 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000911{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000912 PyObject *v;
913 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000914
Guido van Rossum79f25d91997-04-29 20:08:16 +0000915 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000918 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000919 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000920 nb->nb_int == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000921 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000922 "int() argument can't be converted to int");
923 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000924 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000925 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000926}
927
Guido van Rossum79f25d91997-04-29 20:08:16 +0000928static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000929builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930 PyObject *self;
931 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000932{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934 long len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyTypeObject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000936
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000938 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000939 tp = v->ob_type;
940 if (tp->tp_as_sequence != NULL) {
941 len = (*tp->tp_as_sequence->sq_length)(v);
942 }
943 else if (tp->tp_as_mapping != NULL) {
944 len = (*tp->tp_as_mapping->mp_length)(v);
945 }
946 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947 PyErr_SetString(PyExc_TypeError, "len() of unsized object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000948 return NULL;
949 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000950 if (len < 0)
951 return NULL;
952 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 return PyInt_FromLong(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000954}
955
Guido van Rossum79f25d91997-04-29 20:08:16 +0000956static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000957builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958 PyObject *self;
959 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000960{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 PyObject *v;
962 PySequenceMethods *sqf;
Guido van Rossumd1705771996-04-09 02:41:06 +0000963
Guido van Rossum79f25d91997-04-29 20:08:16 +0000964 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000965 return NULL;
966 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
967 int n = (*sqf->sq_length)(v);
968 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 PyObject *l;
Guido van Rossumd1705771996-04-09 02:41:06 +0000970 if (n < 0)
971 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000972 l = PyList_New(n);
Guido van Rossumd1705771996-04-09 02:41:06 +0000973 if (l == NULL)
974 return NULL;
975 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000976 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumd1705771996-04-09 02:41:06 +0000977 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 Py_DECREF(l);
Guido van Rossumd1705771996-04-09 02:41:06 +0000979 l = NULL;
980 break;
981 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000982 PyList_SetItem(l, i, item);
Guido van Rossumd1705771996-04-09 02:41:06 +0000983 }
984 /* XXX Should support indefinite-length sequences */
985 return l;
986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
Guido van Rossumd1705771996-04-09 02:41:06 +0000988 return NULL;
989}
990
Guido van Rossum8861b741996-07-30 16:49:37 +0000991
992static PyObject *
993builtin_slice(self, args)
994 PyObject *self;
995 PyObject *args;
996{
997 PyObject *start, *stop, *step;
998
999 start = stop = step = NULL;
1000
1001 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1002 return NULL;
1003
1004 /*This swapping of stop and start is to maintain compatibility with
1005 the range builtin.*/
1006 if (stop == NULL) {
1007 stop = start;
1008 start = NULL;
1009 }
1010 return PySlice_New(start, stop, step);
1011}
1012
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001014builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 PyObject *self;
1016 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001017{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001018 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +00001021 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 d = PyEval_GetLocals();
1023 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001024 return d;
1025}
1026
Guido van Rossum79f25d91997-04-29 20:08:16 +00001027static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001028builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029 PyObject *self;
1030 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +00001031{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001032 PyObject *v;
1033 PyNumberMethods *nb;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001034
Guido van Rossum79f25d91997-04-29 20:08:16 +00001035 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +00001038 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001039 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001040 nb->nb_long == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001042 "long() argument can't be converted to long");
1043 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001044 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001045 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001046}
1047
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001049min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001050 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001051 int sign;
1052{
Guido van Rossum2d951851994-08-29 12:52:16 +00001053 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001054 PyObject *v, *w, *x;
1055 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001056
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001060 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001061 sq = v->ob_type->tp_as_sequence;
1062 if (sq == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001063 PyErr_SetString(PyExc_TypeError,
1064 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001065 return NULL;
1066 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001067 w = NULL;
1068 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001070 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001071 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001073 break;
1074 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001076 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001077 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001078 if (w == NULL)
1079 w = x;
1080 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001081 int c = PyObject_Compare(x, w);
1082 if (c && PyErr_Occurred()) {
1083 Py_DECREF(x);
1084 Py_XDECREF(w);
1085 return NULL;
1086 }
1087 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001088 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001089 w = x;
1090 }
1091 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001093 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001095 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 PyErr_SetString(PyExc_ValueError,
1097 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001098 return w;
1099}
1100
Guido van Rossum79f25d91997-04-29 20:08:16 +00001101static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001102builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103 PyObject *self;
1104 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001105{
1106 return min_max(v, -1);
1107}
1108
Guido van Rossum79f25d91997-04-29 20:08:16 +00001109static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001110builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 PyObject *self;
1112 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001113{
1114 return min_max(v, 1);
1115}
1116
Guido van Rossum79f25d91997-04-29 20:08:16 +00001117static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001118builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119 PyObject *self;
1120 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001121{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 PyObject *v;
1123 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001124
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001126 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001127 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1128 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001129 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001130 "oct() argument can't be converted to oct");
1131 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001132 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001133 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001134}
1135
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001137builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 PyObject *self;
1139 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001140{
Guido van Rossum2d951851994-08-29 12:52:16 +00001141 char *name;
1142 char *mode = "r";
1143 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001145
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001147 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001149 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001151 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001152}
1153
Guido van Rossum79f25d91997-04-29 20:08:16 +00001154static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001155builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156 PyObject *self;
1157 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001158{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001159 char c;
1160
Guido van Rossum79f25d91997-04-29 20:08:16 +00001161 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001162 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001164}
1165
Guido van Rossum79f25d91997-04-29 20:08:16 +00001166static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001167do_pow(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 PyObject *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001169{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 PyObject *res;
1171 if (PyInstance_Check(v) || PyInstance_Check(w))
1172 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001173 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001174 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 PyErr_SetString(PyExc_TypeError,
1176 "pow() requires numeric arguments");
Guido van Rossumd4905451991-05-05 20:00:36 +00001177 return NULL;
1178 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001179 if (
1180#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 !PyComplex_Check(v) &&
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001182#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
1184 if (!PyErr_Occurred())
1185 PyErr_SetString(PyExc_ValueError,
1186 "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001187 return NULL;
1188 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001190 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
1192 Py_DECREF(v);
1193 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001194 return res;
1195}
1196
Guido van Rossum79f25d91997-04-29 20:08:16 +00001197static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001198builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199 PyObject *self;
1200 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001201{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 PyObject *v, *w, *z = Py_None, *res;
1203 PyObject *v1, *z1, *w2, *z2;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001204
Guido van Rossum79f25d91997-04-29 20:08:16 +00001205 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001206 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 if (z == Py_None)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001208 return do_pow(v, w);
1209 /* XXX The ternary version doesn't do class instance coercions */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001210 if (PyInstance_Check(v))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001211 return v->ob_type->tp_as_number->nb_power(v, w, z);
1212 if (v->ob_type->tp_as_number == NULL ||
1213 z->ob_type->tp_as_number == NULL ||
1214 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001215 PyErr_SetString(PyExc_TypeError,
1216 "pow() requires numeric arguments");
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001217 return NULL;
1218 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001220 return NULL;
1221 res = NULL;
1222 v1 = v;
1223 z1 = z;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001224 if (PyNumber_Coerce(&v1, &z1) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001225 goto error2;
1226 w2 = w;
1227 z2 = z1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 if (PyNumber_Coerce(&w2, &z2) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001229 goto error1;
1230 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001231 Py_DECREF(w2);
1232 Py_DECREF(z2);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001233 error1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001234 Py_DECREF(v1);
1235 Py_DECREF(z1);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001236 error2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 Py_DECREF(v);
1238 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001239 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001240}
1241
Guido van Rossum79f25d91997-04-29 20:08:16 +00001242static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001243builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 PyObject *self;
1245 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001246{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001247 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001249 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001250
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 if (PyTuple_Size(args) <= 1) {
1252 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001253 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001254 &ihigh))
1255 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001256 }
1257 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001258 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001259 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001260 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001261 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001262 }
1263 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001265 return NULL;
1266 }
1267 /* XXX ought to check overflow of subtraction */
1268 if (istep > 0)
1269 n = (ihigh - ilow + istep - 1) / istep;
1270 else
1271 n = (ihigh - ilow + istep + 1) / istep;
1272 if (n < 0)
1273 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001274 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001275 if (v == NULL)
1276 return NULL;
1277 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001278 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001279 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001281 return NULL;
1282 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001283 PyList_SetItem(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001284 ilow += istep;
1285 }
1286 return v;
1287}
1288
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001290builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291 PyObject *self;
1292 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001293{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001294 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001295 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001296
Guido van Rossum79f25d91997-04-29 20:08:16 +00001297 if (PyTuple_Size(args) <= 1) {
1298 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001299 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001300 &ihigh))
1301 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001302 }
1303 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001304 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001305 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001307 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001308 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001311 return NULL;
1312 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001313 /* XXX ought to check overflow of subtraction */
1314 if (istep > 0)
1315 n = (ihigh - ilow + istep - 1) / istep;
1316 else
1317 n = (ihigh - ilow + istep + 1) / istep;
1318 if (n < 0)
1319 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001321}
1322
Guido van Rossum79f25d91997-04-29 20:08:16 +00001323extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001324
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001326builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 PyObject *self;
1328 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001329{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001330 PyObject *v = NULL;
1331 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001332
Guido van Rossum79f25d91997-04-29 20:08:16 +00001333 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001334 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1336 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001337 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001338 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001339 char *prompt;
1340 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001341 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001342 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001343 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001344 if (po == NULL)
1345 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001346 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001347 }
1348 else {
1349 po = NULL;
1350 prompt = "";
1351 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001352 s = PyOS_Readline(prompt);
1353 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001354 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001356 return NULL;
1357 }
1358 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001360 result = NULL;
1361 }
1362 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001364 }
1365 free(s);
1366 return result;
1367 }
Guido van Rossum90933611991-06-07 16:10:43 +00001368 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001370 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001371 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001372 return NULL;
1373 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001374 if (Py_FlushLine() != 0 ||
1375 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001376 return NULL;
1377 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001378 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001379 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001380 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001381 return NULL;
1382 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001384}
1385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001387builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 PyObject *self;
1389 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001390{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001391 PyObject *seq, *func, *result = NULL;
1392 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001393 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001394
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396 return NULL;
1397 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001399
1400 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001402 "2nd argument to reduce() must be a sequence object");
1403 return NULL;
1404 }
1405
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001407 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001408
Guido van Rossum2d951851994-08-29 12:52:16 +00001409 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001411
1412 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 Py_DECREF(args);
1414 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001415 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001416 }
1417
Guido van Rossum2d951851994-08-29 12:52:16 +00001418 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001419 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001420 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001421 break;
1422 }
1423 goto Fail;
1424 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001425
Guido van Rossum2d951851994-08-29 12:52:16 +00001426 if (result == NULL)
1427 result = op2;
1428 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001429 PyTuple_SetItem(args, 0, result);
1430 PyTuple_SetItem(args, 1, op2);
1431 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001432 goto Fail;
1433 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001434 }
1435
Guido van Rossum79f25d91997-04-29 20:08:16 +00001436 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001437
Guido van Rossum2d951851994-08-29 12:52:16 +00001438 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001439 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001440 "reduce of empty sequence with no initial value");
1441
Guido van Rossum12d12c51993-10-26 17:58:25 +00001442 return result;
1443
Guido van Rossum2d951851994-08-29 12:52:16 +00001444Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001445 Py_XDECREF(args);
1446 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001447 return NULL;
1448}
1449
Guido van Rossum79f25d91997-04-29 20:08:16 +00001450static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001451builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001452 PyObject *self;
1453 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001454{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001455 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001456
Guido van Rossum79f25d91997-04-29 20:08:16 +00001457 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001458 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001460}
1461
Guido van Rossum79f25d91997-04-29 20:08:16 +00001462static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001463builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001464 PyObject *self;
1465 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001466{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001467 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001468
Guido van Rossum79f25d91997-04-29 20:08:16 +00001469 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001470 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001472}
1473
Guido van Rossum79f25d91997-04-29 20:08:16 +00001474static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001475builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001476 PyObject *self;
1477 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001478{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001479 double x;
1480 double f;
1481 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001482 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001483
Guido van Rossum79f25d91997-04-29 20:08:16 +00001484 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001485 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001486 f = 1.0;
1487 for (i = ndigits; --i >= 0; )
1488 f = f*10.0;
1489 for (i = ndigits; ++i <= 0; )
1490 f = f*0.1;
1491 if (x >= 0.0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001492 return PyFloat_FromDouble(floor(x*f + 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001493 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001494 return PyFloat_FromDouble(ceil(x*f - 0.5) / f);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001495}
1496
Guido van Rossum79f25d91997-04-29 20:08:16 +00001497static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001498builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001499 PyObject *self;
1500 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001501{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001502 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001503
Guido van Rossum79f25d91997-04-29 20:08:16 +00001504 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001505 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001506 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001507}
1508
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 PyObject *self;
1512 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001513{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001514 PyObject *v;
1515 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001516
Guido van Rossum79f25d91997-04-29 20:08:16 +00001517 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001518 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001519 if (PyTuple_Check(v)) {
1520 Py_INCREF(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001521 return v;
1522 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001523 if (PyList_Check(v))
1524 return PyList_AsTuple(v);
1525 if (PyString_Check(v)) {
1526 int n = PyString_Size(v);
1527 PyObject *t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001528 if (t != NULL) {
1529 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001530 char *p = PyString_AsString(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001531 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001532 PyObject *item =
1533 PyString_FromStringAndSize(p+i, 1);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001534 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001536 t = NULL;
1537 break;
1538 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001539 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001540 }
1541 }
1542 return t;
1543 }
1544 /* Generic sequence object */
1545 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1546 int n = (*sqf->sq_length)(v);
1547 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548 PyObject *t;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001549 if (n < 0)
1550 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001552 if (t == NULL)
1553 return NULL;
1554 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001555 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001556 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001557 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001558 t = NULL;
1559 break;
1560 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001561 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001562 }
1563 /* XXX Should support indefinite-length sequences */
1564 return t;
1565 }
1566 /* None of the above */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyErr_SetString(PyExc_TypeError,
1568 "tuple() argument must be a sequence");
Guido van Rossumcae027b1994-08-29 12:53:11 +00001569 return NULL;
1570}
1571
Guido van Rossum79f25d91997-04-29 20:08:16 +00001572static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001573builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001574 PyObject *self;
1575 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001576{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001577 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001578
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001580 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001581 v = (PyObject *)v->ob_type;
1582 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001583 return v;
1584}
1585
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001587builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001588 PyObject *self;
1589 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001590{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 PyObject *v = NULL;
1592 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001593
Guido van Rossum79f25d91997-04-29 20:08:16 +00001594 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001595 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001596 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001597 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001598 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001599 if (!PyErr_Occurred())
1600 PyErr_SetString(PyExc_SystemError,
1601 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001602 }
1603 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001604 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001605 }
1606 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001607 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001608 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001610 "vars() argument must have __dict__ attribute");
1611 return NULL;
1612 }
1613 }
1614 return d;
1615}
1616
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001617static PyObject *
1618builtin_isinstance(self, args)
1619 PyObject *self;
1620 PyObject *args;
1621{
1622 PyObject *inst;
1623 PyObject *cls;
1624 int retval;
1625
1626 if (!PyArg_ParseTuple(args, "OO", &inst, &cls))
1627 return NULL;
1628 if (!PyClass_Check(cls)) {
1629 PyErr_SetString(PyExc_TypeError,
1630 "second argument must be a class");
1631 return NULL;
1632 }
1633
1634 if (!PyInstance_Check(inst))
1635 retval = 0;
1636 else {
1637 PyObject *inclass =
1638 (PyObject*)((PyInstanceObject*)inst)->in_class;
1639 retval = PyClass_IsSubclass(inclass, cls);
1640 }
1641 return PyInt_FromLong(retval);
1642}
1643
1644
1645static PyObject *
1646builtin_issubclass(self, args)
1647 PyObject *self;
1648 PyObject *args;
1649{
1650 PyObject *derived;
1651 PyObject *cls;
1652 int retval;
1653
1654 if (!PyArg_ParseTuple(args, "OO", &derived, &cls))
1655 return NULL;
1656 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1657 PyErr_SetString(PyExc_TypeError, "arguments must be classes");
1658 return NULL;
1659 }
1660 /* shortcut */
1661 if (!(retval = (derived == cls)))
1662 retval = PyClass_IsSubclass(derived, cls);
1663
1664 return PyInt_FromLong(retval);
1665}
1666
1667
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001669 {"__import__", builtin___import__, 1},
1670 {"abs", builtin_abs, 1},
1671 {"apply", builtin_apply, 1},
1672 {"callable", builtin_callable, 1},
1673 {"chr", builtin_chr, 1},
1674 {"cmp", builtin_cmp, 1},
1675 {"coerce", builtin_coerce, 1},
1676 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001677#ifndef WITHOUT_COMPLEX
1678 {"complex", builtin_complex, 1},
1679#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001680 {"delattr", builtin_delattr, 1},
1681 {"dir", builtin_dir, 1},
1682 {"divmod", builtin_divmod, 1},
1683 {"eval", builtin_eval, 1},
1684 {"execfile", builtin_execfile, 1},
1685 {"filter", builtin_filter, 1},
1686 {"float", builtin_float, 1},
1687 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001688 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001689 {"hasattr", builtin_hasattr, 1},
1690 {"hash", builtin_hash, 1},
1691 {"hex", builtin_hex, 1},
1692 {"id", builtin_id, 1},
1693 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001694 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001695 {"int", builtin_int, 1},
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001696 {"isinstance", builtin_isinstance, 1},
1697 {"issubclass", builtin_issubclass, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001698 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001699 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001700 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001701 {"long", builtin_long, 1},
1702 {"map", builtin_map, 1},
1703 {"max", builtin_max, 1},
1704 {"min", builtin_min, 1},
1705 {"oct", builtin_oct, 1},
1706 {"open", builtin_open, 1},
1707 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001708 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001709 {"range", builtin_range, 1},
1710 {"raw_input", builtin_raw_input, 1},
1711 {"reduce", builtin_reduce, 1},
1712 {"reload", builtin_reload, 1},
1713 {"repr", builtin_repr, 1},
1714 {"round", builtin_round, 1},
1715 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001716 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001717 {"str", builtin_str, 1},
1718 {"tuple", builtin_tuple, 1},
1719 {"type", builtin_type, 1},
1720 {"vars", builtin_vars, 1},
1721 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001722 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001723};
1724
Guido van Rossum3f5da241990-12-20 15:06:42 +00001725/* Predefined exceptions */
1726
Guido van Rossum79f25d91997-04-29 20:08:16 +00001727PyObject *PyExc_AccessError;
1728PyObject *PyExc_AssertionError;
1729PyObject *PyExc_AttributeError;
1730PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001731PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001732PyObject *PyExc_IOError;
1733PyObject *PyExc_ImportError;
1734PyObject *PyExc_IndexError;
1735PyObject *PyExc_KeyError;
1736PyObject *PyExc_KeyboardInterrupt;
1737PyObject *PyExc_MemoryError;
1738PyObject *PyExc_NameError;
1739PyObject *PyExc_OverflowError;
1740PyObject *PyExc_RuntimeError;
1741PyObject *PyExc_SyntaxError;
1742PyObject *PyExc_SystemError;
1743PyObject *PyExc_SystemExit;
1744PyObject *PyExc_TypeError;
1745PyObject *PyExc_ValueError;
1746PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001747
Guido van Rossum79f25d91997-04-29 20:08:16 +00001748static PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +00001749newstdexception(dict, name)
1750 PyObject *dict;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001751 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001752{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753 PyObject *v = PyString_FromString(name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001754 if (v == NULL || PyDict_SetItemString(dict, name, v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001755 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001756 return v;
1757}
1758
1759static void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001760initerrors(dict)
1761 PyObject *dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001762{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001763 PyExc_AccessError = newstdexception(dict, "AccessError");
1764 PyExc_AssertionError = newstdexception(dict, "AssertionError");
1765 PyExc_AttributeError = newstdexception(dict, "AttributeError");
1766 PyExc_EOFError = newstdexception(dict, "EOFError");
1767 PyExc_FloatingPointError = newstdexception(dict, "FloatingPointError");
1768 PyExc_IOError = newstdexception(dict, "IOError");
1769 PyExc_ImportError = newstdexception(dict, "ImportError");
1770 PyExc_IndexError = newstdexception(dict, "IndexError");
1771 PyExc_KeyError = newstdexception(dict, "KeyError");
1772 PyExc_KeyboardInterrupt = newstdexception(dict, "KeyboardInterrupt");
1773 PyExc_MemoryError = newstdexception(dict, "MemoryError");
1774 PyExc_NameError = newstdexception(dict, "NameError");
1775 PyExc_OverflowError = newstdexception(dict, "OverflowError");
1776 PyExc_RuntimeError = newstdexception(dict, "RuntimeError");
1777 PyExc_SyntaxError = newstdexception(dict, "SyntaxError");
1778 PyExc_SystemError = newstdexception(dict, "SystemError");
1779 PyExc_SystemExit = newstdexception(dict, "SystemExit");
1780 PyExc_TypeError = newstdexception(dict, "TypeError");
1781 PyExc_ValueError = newstdexception(dict, "ValueError");
1782 PyExc_ZeroDivisionError = newstdexception(dict, "ZeroDivisionError");
1783}
1784
1785static void
1786finierrors()
1787{
1788 Py_XDECREF(PyExc_AccessError); PyExc_AccessError = NULL;
1789 Py_XDECREF(PyExc_AssertionError); PyExc_AssertionError = NULL;
1790 Py_XDECREF(PyExc_AttributeError); PyExc_AttributeError = NULL;
1791 Py_XDECREF(PyExc_EOFError); PyExc_EOFError = NULL;
1792 Py_XDECREF(PyExc_FloatingPointError); PyExc_FloatingPointError = NULL;
1793 Py_XDECREF(PyExc_IOError); PyExc_IOError = NULL;
1794 Py_XDECREF(PyExc_ImportError); PyExc_ImportError = NULL;
1795 Py_XDECREF(PyExc_IndexError); PyExc_IndexError = NULL;
1796 Py_XDECREF(PyExc_KeyError); PyExc_KeyError = NULL;
1797 Py_XDECREF(PyExc_KeyboardInterrupt); PyExc_KeyboardInterrupt = NULL;
1798 Py_XDECREF(PyExc_MemoryError); PyExc_MemoryError = NULL;
1799 Py_XDECREF(PyExc_NameError); PyExc_NameError = NULL;
1800 Py_XDECREF(PyExc_OverflowError); PyExc_OverflowError = NULL;
1801 Py_XDECREF(PyExc_RuntimeError); PyExc_RuntimeError = NULL;
1802 Py_XDECREF(PyExc_SyntaxError); PyExc_SyntaxError = NULL;
1803 Py_XDECREF(PyExc_SystemError); PyExc_SystemError = NULL;
1804 Py_XDECREF(PyExc_SystemExit); PyExc_SystemExit = NULL;
1805 Py_XDECREF(PyExc_TypeError); PyExc_TypeError = NULL;
1806 Py_XDECREF(PyExc_ValueError); PyExc_ValueError = NULL;
1807 Py_XDECREF(PyExc_ZeroDivisionError); PyExc_ZeroDivisionError = NULL;
1808}
1809
1810PyObject *
1811_PyBuiltin_Init()
1812{
1813 PyObject *mod, *dict;
1814 mod = Py_InitModule("__builtin__", builtin_methods);
1815 if (mod == NULL)
1816 return NULL;
1817 dict = PyModule_GetDict(mod);
1818 initerrors(dict);
1819 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1820 return NULL;
1821 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1822 return NULL;
1823 if (PyDict_SetItemString(dict, "__debug__",
1824 PyInt_FromLong(Py_OptimizeFlag == 0)) < 0)
1825 return NULL;
1826 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001827}
1828
1829void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001830_PyBuiltin_Fini()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001831{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001832 finierrors();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001833}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001834
Guido van Rossum12d12c51993-10-26 17:58:25 +00001835
Guido van Rossume77a7571993-11-03 15:01:26 +00001836/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001837
Guido van Rossum79f25d91997-04-29 20:08:16 +00001838static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001839filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001840 PyObject *func;
1841 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001842{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001843 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001844 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001845 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001846
Guido van Rossumb7b45621995-08-04 04:07:45 +00001847 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001849 return tuple;
1850 }
1851
Guido van Rossum79f25d91997-04-29 20:08:16 +00001852 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001853 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001854
Guido van Rossum12d12c51993-10-26 17:58:25 +00001855 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001856 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001857 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001858
Guido van Rossum79f25d91997-04-29 20:08:16 +00001859 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001860 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001861 if (func == Py_None) {
1862 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001863 good = item;
1864 }
1865 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001866 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001867 if (arg == NULL)
1868 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001869 good = PyEval_CallObject(func, arg);
1870 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001871 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001872 goto Fail_1;
1873 }
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 Py_INCREF(item);
1878 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001879 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001880 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001881 }
1882
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001884 return NULL;
1885
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886 return result;
1887
Guido van Rossum12d12c51993-10-26 17:58:25 +00001888Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001890 return NULL;
1891}
1892
1893
Guido van Rossume77a7571993-11-03 15:01:26 +00001894/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001895
Guido van Rossum79f25d91997-04-29 20:08:16 +00001896static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001897filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001898 PyObject *func;
1899 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001900{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001901 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001902 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001903 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001904
Guido van Rossum79f25d91997-04-29 20:08:16 +00001905 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001906 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001907 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001908 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001909 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001910 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001911 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001912
Guido van Rossum12d12c51993-10-26 17:58:25 +00001913 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001914 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001915 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001916
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001917 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1918 if (item == NULL)
1919 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001920 arg = Py_BuildValue("(O)", item);
1921 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001922 if (arg == NULL)
1923 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001924 good = PyEval_CallObject(func, arg);
1925 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001926 if (good == NULL)
1927 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001928 ok = PyObject_IsTrue(good);
1929 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001930 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001931 PyString_AS_STRING((PyStringObject *)result)[j++] =
1932 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001933 }
1934
Guido van Rossum79f25d91997-04-29 20:08:16 +00001935 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001936 return NULL;
1937
Guido van Rossum12d12c51993-10-26 17:58:25 +00001938 return result;
1939
Guido van Rossum12d12c51993-10-26 17:58:25 +00001940Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001941 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001942 return NULL;
1943}
Guido van Rossumc6472e91997-03-31 17:15:43 +00001944
1945/* Copied with modifications from stropmodule.c: atoi,atof.atol */
1946
1947static PyObject *
1948int_from_string(v)
1949 PyObject *v;
1950{
1951 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
1952 char *s, *end;
1953 long x;
1954 char buffer[256]; /* For errors */
1955
1956 if (!PyArg_Parse(v, "s", &s))
1957 return NULL;
1958 while (*s && isspace(Py_CHARMASK(*s)))
1959 s++;
1960 if (s[0] == '\0') {
1961 PyErr_SetString(PyExc_ValueError, "empty string for int()");
1962 return NULL;
1963 }
1964 errno = 0;
1965 x = PyOS_strtol(s, &end, 10);
1966 while (*end && isspace(Py_CHARMASK(*end)))
1967 end++;
1968 if (*end != '\0') {
1969 sprintf(buffer, "invalid literal for int(): %.200s", s);
1970 PyErr_SetString(PyExc_ValueError, buffer);
1971 return NULL;
1972 }
1973 else if (errno != 0) {
1974 sprintf(buffer, "int() literal too large: %.200s", s);
1975 PyErr_SetString(PyExc_ValueError, buffer);
1976 return NULL;
1977 }
1978 return PyInt_FromLong(x);
1979}
1980
1981static PyObject *
1982long_from_string(v)
1983 PyObject *v;
1984{
1985 char *s, *end;
1986 PyObject *x;
1987 char buffer[256]; /* For errors */
1988
1989 if (!PyArg_Parse(v, "s", &s))
1990 return NULL;
1991
1992 while (*s && isspace(Py_CHARMASK(*s)))
1993 s++;
1994 if (s[0] == '\0') {
1995 PyErr_SetString(PyExc_ValueError, "empty string for long()");
1996 return NULL;
1997 }
1998 x = PyLong_FromString(s, &end, 10);
1999 if (x == NULL)
2000 return NULL;
2001 while (*end && isspace(Py_CHARMASK(*end)))
2002 end++;
2003 if (*end != '\0') {
2004 sprintf(buffer, "invalid literal for long(): %.200s", s);
2005 PyErr_SetString(PyExc_ValueError, buffer);
2006 Py_DECREF(x);
2007 return NULL;
2008 }
2009 return x;
2010}
2011
2012static PyObject *
2013float_from_string(v)
2014 PyObject *v;
2015{
2016 extern double strtod Py_PROTO((const char *, char **));
2017 char *s, *end;
2018 double x;
2019 char buffer[256]; /* For errors */
2020
2021 if (!PyArg_Parse(v, "s", &s))
2022 return NULL;
2023 while (*s && isspace(Py_CHARMASK(*s)))
2024 s++;
2025 if (s[0] == '\0') {
2026 PyErr_SetString(PyExc_ValueError, "empty string for float()");
2027 return NULL;
2028 }
2029 errno = 0;
2030 PyFPE_START_PROTECT("float_from_string", return 0)
2031 x = strtod(s, &end);
2032 PyFPE_END_PROTECT(x)
2033 while (*end && isspace(Py_CHARMASK(*end)))
2034 end++;
2035 if (*end != '\0') {
2036 sprintf(buffer, "invalid literal for float(): %.200s", s);
2037 PyErr_SetString(PyExc_ValueError, buffer);
2038 return NULL;
2039 }
2040 else if (errno != 0) {
2041 sprintf(buffer, "float() literal too large: %.200s", s);
2042 PyErr_SetString(PyExc_ValueError, buffer);
2043 return NULL;
2044 }
2045 return PyFloat_FromDouble(x);
2046}