blob: 358b6f1f19bb28de364e9821b68112f7d0559075 [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
Barry Warsaw757af0e1997-08-29 22:13:51 +00001727PyObject *PyExc_StandardError;
1728PyObject *PyExc_NumberError;
1729PyObject *PyExc_LookupError;
1730
Guido van Rossum79f25d91997-04-29 20:08:16 +00001731PyObject *PyExc_AssertionError;
1732PyObject *PyExc_AttributeError;
1733PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001734PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001735PyObject *PyExc_IOError;
1736PyObject *PyExc_ImportError;
1737PyObject *PyExc_IndexError;
1738PyObject *PyExc_KeyError;
1739PyObject *PyExc_KeyboardInterrupt;
1740PyObject *PyExc_MemoryError;
1741PyObject *PyExc_NameError;
1742PyObject *PyExc_OverflowError;
1743PyObject *PyExc_RuntimeError;
1744PyObject *PyExc_SyntaxError;
1745PyObject *PyExc_SystemError;
1746PyObject *PyExc_SystemExit;
1747PyObject *PyExc_TypeError;
1748PyObject *PyExc_ValueError;
1749PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001750
Barry Warsaw757af0e1997-08-29 22:13:51 +00001751PyObject *PyExc_MemoryErrorInst;
1752
1753static struct
1754{
1755 char* name;
1756 PyObject** exc;
1757 int leaf_exc;
1758}
1759bltin_exc[] = {
1760 {"StandardError", &PyExc_StandardError, 0},
1761 {"NumberError", &PyExc_NumberError, 0},
1762 {"LookupError", &PyExc_LookupError, 0},
1763 {"AssertionError", &PyExc_AssertionError, 1},
1764 {"AttributeError", &PyExc_AttributeError, 1},
1765 {"EOFError", &PyExc_EOFError, 1},
1766 {"FloatingPointError", &PyExc_FloatingPointError, 1},
1767 {"IOError", &PyExc_IOError, 1},
1768 {"ImportError", &PyExc_ImportError, 1},
1769 {"IndexError", &PyExc_IndexError, 1},
1770 {"KeyError", &PyExc_KeyError, 1},
1771 {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, 1},
1772 {"MemoryError", &PyExc_MemoryError, 1},
1773 {"NameError", &PyExc_NameError, 1},
1774 {"OverflowError", &PyExc_OverflowError, 1},
1775 {"RuntimeError", &PyExc_RuntimeError, 1},
1776 {"SyntaxError", &PyExc_SyntaxError, 1},
1777 {"SystemError", &PyExc_SystemError, 1},
1778 {"SystemExit", &PyExc_SystemExit, 1},
1779 {"TypeError", &PyExc_TypeError, 1},
1780 {"ValueError", &PyExc_ValueError, 1},
1781 {"ZeroDivisionError", &PyExc_ZeroDivisionError, 1},
1782 {NULL, NULL}
1783};
1784
1785
1786/* import exceptions module to extract class exceptions */
1787static void
1788init_class_exc(dict)
1789 PyObject *dict;
1790{
1791 int i;
1792 PyObject *m = PyImport_ImportModule("exceptions");
1793 PyObject *d;
1794 PyObject *args;
1795
1796 if (m == NULL ||
1797 (d = PyModule_GetDict(m)) == NULL)
1798 {
1799 PyObject *f = PySys_GetObject("stderr");
1800 if (Py_VerboseFlag) {
1801 PyFile_WriteString(
1802 "'import exceptions' failed; traceback:\n", f);
1803 PyErr_Print();
1804 }
1805 else {
1806 PyFile_WriteString(
1807 "'import exceptions' failed; use -v for traceback\n", f);
1808 PyErr_Clear();
1809 }
1810 PyFile_WriteString("defaulting to old style exceptions\n", f);
1811 return;
1812 }
1813 for (i = 0; bltin_exc[i].name; i++) {
1814 /* dig the exception out of the module */
1815 PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name);
1816 if (!exc)
1817 Py_FatalError("built-in exception cannot be initialized");
1818
1819 Py_XDECREF(*bltin_exc[i].exc);
1820
1821 /* squirrel away a pointer to the exception */
1822 Py_INCREF(exc);
1823 *bltin_exc[i].exc = exc;
1824
1825 /* and insert the name in the __builtin__ module */
1826 PyDict_SetItemString(dict, bltin_exc[i].name, exc);
1827 }
1828
1829 /* we need one pre-allocated instance */
1830 args = Py_BuildValue("()");
1831 if (args) {
1832 PyExc_MemoryErrorInst =
1833 PyEval_CallObject(PyExc_MemoryError, args);
1834 Py_DECREF(args);
1835 }
1836
1837 /* we're done with the exceptions module */
1838 Py_DECREF(m);
1839
1840 if (PyErr_Occurred())
1841 Py_FatalError("can't instantiate standard exceptions");
1842}
1843
1844
1845static void
1846fini_instances()
1847{
1848 Py_XDECREF(PyExc_MemoryErrorInst);
1849 PyExc_MemoryErrorInst = NULL;
1850}
1851
1852
Guido van Rossum79f25d91997-04-29 20:08:16 +00001853static PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +00001854newstdexception(dict, name)
1855 PyObject *dict;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001856 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001857{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 PyObject *v = PyString_FromString(name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001859 if (v == NULL || PyDict_SetItemString(dict, name, v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001861 return v;
1862}
1863
1864static void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001865initerrors(dict)
1866 PyObject *dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001867{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001868 int i;
1869 int exccnt = 0;
1870 for (i = 0; bltin_exc[i].name; i++, exccnt++) {
1871 if (bltin_exc[i].leaf_exc)
1872 *bltin_exc[i].exc =
1873 newstdexception(dict, bltin_exc[i].name);
1874 }
1875
1876 /* This is kind of bogus because we special case the three new
1877 exceptions to be nearly forward compatible. But this means we
1878 hard code knowledge about exceptions.py into C here. I don't
1879 have a better solution, though
1880 */
1881 PyExc_LookupError = PyTuple_New(2);
1882 Py_INCREF(PyExc_IndexError);
1883 PyTuple_SET_ITEM(PyExc_LookupError, 0, PyExc_IndexError);
1884 Py_INCREF(PyExc_KeyError);
1885 PyTuple_SET_ITEM(PyExc_LookupError, 1, PyExc_KeyError);
1886 PyDict_SetItemString(dict, "LookupError", PyExc_LookupError);
1887
1888 PyExc_NumberError = PyTuple_New(3);
1889 Py_INCREF(PyExc_OverflowError);
1890 PyTuple_SET_ITEM(PyExc_NumberError, 0, PyExc_OverflowError);
1891 Py_INCREF(PyExc_ZeroDivisionError);
1892 PyTuple_SET_ITEM(PyExc_NumberError, 1, PyExc_ZeroDivisionError);
1893 Py_INCREF(PyExc_FloatingPointError);
1894 PyTuple_SET_ITEM(PyExc_NumberError, 2, PyExc_FloatingPointError);
1895 PyDict_SetItemString(dict, "NumberError", PyExc_NumberError);
1896
1897 PyExc_StandardError = PyTuple_New(exccnt-1);
1898 for (i = 1; bltin_exc[i].name; i++) {
1899 PyObject *exc = *bltin_exc[i].exc;
1900 Py_INCREF(exc);
1901 PyTuple_SET_ITEM(PyExc_StandardError, i-1, exc);
1902 }
1903 PyDict_SetItemString(dict, "StandardError", PyExc_StandardError);
1904
1905 if (PyErr_Occurred())
1906 Py_FatalError("Could not initialize built-in string exceptions");
Guido van Rossum25ce5661997-08-02 03:10:38 +00001907}
1908
1909static void
1910finierrors()
1911{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001912 int i;
1913 for (i = 0; bltin_exc[i].name; i++) {
1914 PyObject *exc = *bltin_exc[i].exc;
1915 Py_XDECREF(exc);
1916 *bltin_exc[i].exc = NULL;
1917 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001918}
1919
1920PyObject *
Barry Warsaw757af0e1997-08-29 22:13:51 +00001921_PyBuiltin_Init_1()
Guido van Rossum25ce5661997-08-02 03:10:38 +00001922{
1923 PyObject *mod, *dict;
1924 mod = Py_InitModule("__builtin__", builtin_methods);
1925 if (mod == NULL)
1926 return NULL;
1927 dict = PyModule_GetDict(mod);
1928 initerrors(dict);
1929 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1930 return NULL;
1931 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1932 return NULL;
1933 if (PyDict_SetItemString(dict, "__debug__",
1934 PyInt_FromLong(Py_OptimizeFlag == 0)) < 0)
1935 return NULL;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001936
Guido van Rossum25ce5661997-08-02 03:10:38 +00001937 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001938}
1939
1940void
Barry Warsaw757af0e1997-08-29 22:13:51 +00001941_PyBuiltin_Init_2(dict)
1942 PyObject *dict;
1943{
1944 /* if Python was started with -X, initialize the class exceptions */
1945 if (Py_UseClassExceptionsFlag)
1946 init_class_exc(dict);
1947}
1948
1949
1950void
1951_PyBuiltin_Fini_1()
1952{
1953 fini_instances();
1954}
1955
1956
1957void
1958_PyBuiltin_Fini_2()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001959{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001960 finierrors();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001961}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001962
Guido van Rossum12d12c51993-10-26 17:58:25 +00001963
Guido van Rossume77a7571993-11-03 15:01:26 +00001964/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001965
Guido van Rossum79f25d91997-04-29 20:08:16 +00001966static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001967filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001968 PyObject *func;
1969 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001970{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001971 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001972 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001973 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001974
Guido van Rossumb7b45621995-08-04 04:07:45 +00001975 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001976 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001977 return tuple;
1978 }
1979
Guido van Rossum79f25d91997-04-29 20:08:16 +00001980 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001981 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001982
Guido van Rossum12d12c51993-10-26 17:58:25 +00001983 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001984 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001985 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001986
Guido van Rossum79f25d91997-04-29 20:08:16 +00001987 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001988 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001989 if (func == Py_None) {
1990 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001991 good = item;
1992 }
1993 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001994 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001995 if (arg == NULL)
1996 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 good = PyEval_CallObject(func, arg);
1998 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001999 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002000 goto Fail_1;
2001 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002002 ok = PyObject_IsTrue(good);
2003 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002004 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002005 Py_INCREF(item);
2006 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002007 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002008 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002009 }
2010
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002012 return NULL;
2013
Guido van Rossum12d12c51993-10-26 17:58:25 +00002014 return result;
2015
Guido van Rossum12d12c51993-10-26 17:58:25 +00002016Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002017 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002018 return NULL;
2019}
2020
2021
Guido van Rossume77a7571993-11-03 15:01:26 +00002022/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002023
Guido van Rossum79f25d91997-04-29 20:08:16 +00002024static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002025filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 PyObject *func;
2027 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002028{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002030 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002031 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002032
Guido van Rossum79f25d91997-04-29 20:08:16 +00002033 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002034 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002036 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002037 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002038 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002039 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002040
Guido van Rossum12d12c51993-10-26 17:58:25 +00002041 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002042 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002043 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002044
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002045 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2046 if (item == NULL)
2047 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048 arg = Py_BuildValue("(O)", item);
2049 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002050 if (arg == NULL)
2051 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002052 good = PyEval_CallObject(func, arg);
2053 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002054 if (good == NULL)
2055 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002056 ok = PyObject_IsTrue(good);
2057 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002058 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 PyString_AS_STRING((PyStringObject *)result)[j++] =
2060 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002061 }
2062
Guido van Rossum79f25d91997-04-29 20:08:16 +00002063 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002064 return NULL;
2065
Guido van Rossum12d12c51993-10-26 17:58:25 +00002066 return result;
2067
Guido van Rossum12d12c51993-10-26 17:58:25 +00002068Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002069 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002070 return NULL;
2071}
Guido van Rossumc6472e91997-03-31 17:15:43 +00002072
2073/* Copied with modifications from stropmodule.c: atoi,atof.atol */
2074
2075static PyObject *
2076int_from_string(v)
2077 PyObject *v;
2078{
2079 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
2080 char *s, *end;
2081 long x;
2082 char buffer[256]; /* For errors */
2083
2084 if (!PyArg_Parse(v, "s", &s))
2085 return NULL;
2086 while (*s && isspace(Py_CHARMASK(*s)))
2087 s++;
2088 if (s[0] == '\0') {
2089 PyErr_SetString(PyExc_ValueError, "empty string for int()");
2090 return NULL;
2091 }
2092 errno = 0;
2093 x = PyOS_strtol(s, &end, 10);
2094 while (*end && isspace(Py_CHARMASK(*end)))
2095 end++;
2096 if (*end != '\0') {
2097 sprintf(buffer, "invalid literal for int(): %.200s", s);
2098 PyErr_SetString(PyExc_ValueError, buffer);
2099 return NULL;
2100 }
2101 else if (errno != 0) {
2102 sprintf(buffer, "int() literal too large: %.200s", s);
2103 PyErr_SetString(PyExc_ValueError, buffer);
2104 return NULL;
2105 }
2106 return PyInt_FromLong(x);
2107}
2108
2109static PyObject *
2110long_from_string(v)
2111 PyObject *v;
2112{
2113 char *s, *end;
2114 PyObject *x;
2115 char buffer[256]; /* For errors */
2116
2117 if (!PyArg_Parse(v, "s", &s))
2118 return NULL;
2119
2120 while (*s && isspace(Py_CHARMASK(*s)))
2121 s++;
2122 if (s[0] == '\0') {
2123 PyErr_SetString(PyExc_ValueError, "empty string for long()");
2124 return NULL;
2125 }
2126 x = PyLong_FromString(s, &end, 10);
2127 if (x == NULL)
2128 return NULL;
2129 while (*end && isspace(Py_CHARMASK(*end)))
2130 end++;
2131 if (*end != '\0') {
2132 sprintf(buffer, "invalid literal for long(): %.200s", s);
2133 PyErr_SetString(PyExc_ValueError, buffer);
2134 Py_DECREF(x);
2135 return NULL;
2136 }
2137 return x;
2138}
2139
2140static PyObject *
2141float_from_string(v)
2142 PyObject *v;
2143{
2144 extern double strtod Py_PROTO((const char *, char **));
2145 char *s, *end;
2146 double x;
2147 char buffer[256]; /* For errors */
2148
2149 if (!PyArg_Parse(v, "s", &s))
2150 return NULL;
2151 while (*s && isspace(Py_CHARMASK(*s)))
2152 s++;
2153 if (s[0] == '\0') {
2154 PyErr_SetString(PyExc_ValueError, "empty string for float()");
2155 return NULL;
2156 }
2157 errno = 0;
2158 PyFPE_START_PROTECT("float_from_string", return 0)
2159 x = strtod(s, &end);
2160 PyFPE_END_PROTECT(x)
2161 while (*end && isspace(Py_CHARMASK(*end)))
2162 end++;
2163 if (*end != '\0') {
2164 sprintf(buffer, "invalid literal for float(): %.200s", s);
2165 PyErr_SetString(PyExc_ValueError, buffer);
2166 return NULL;
2167 }
2168 else if (errno != 0) {
2169 sprintf(buffer, "float() literal too large: %.200s", s);
2170 PyErr_SetString(PyExc_ValueError, buffer);
2171 return NULL;
2172 }
2173 return PyFloat_FromDouble(x);
2174}