blob: 68a5109660262e236bdf91e6a29e33e6603cbf41 [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 Rossumaee0bad1997-09-05 07:33:22 +000068 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
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 Rossum730806d1998-04-10 22:27:42 +0000351 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000352 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000353 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000354 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000355 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000356 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000357 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000358 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000359 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000360 if (tmp == NULL)
361 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000362 cr.real = PyFloat_AsDouble(tmp);
363 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000364 cr.imag = 0.;
365 }
366 if (i == NULL) {
367 ci.real = 0.;
368 ci.imag = 0.;
369 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000370 else if (PyComplex_Check(i))
371 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000372 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000373 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000374 if (tmp == NULL)
375 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000376 ci.real = PyFloat_AsDouble(tmp);
377 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000378 ci.imag = 0.;
379 }
380 cr.real -= ci.imag;
381 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000382 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000383}
384
385#endif
386
Guido van Rossum79f25d91997-04-29 20:08:16 +0000387static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 PyObject *self;
390 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000392 static char *attrlist[] = {"__members__", "__methods__", NULL};
393 PyObject *v = NULL, *l = NULL, *m = NULL;
394 PyObject *d, *x;
395 int i;
396 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000397
Guido van Rossum79f25d91997-04-29 20:08:16 +0000398 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000399 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000400 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000401 x = PyEval_GetLocals();
402 if (x == NULL)
403 goto error;
404 l = PyMapping_Keys(x);
405 if (l == NULL)
406 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000407 }
408 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000409 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000410 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000411 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000412 else {
413 l = PyMapping_Keys(d);
414 if (l == NULL)
415 PyErr_Clear();
416 Py_DECREF(d);
417 }
418 if (l == NULL) {
419 l = PyList_New(0);
420 if (l == NULL)
421 goto error;
422 }
423 for (s = attrlist; *s != NULL; s++) {
424 m = PyObject_GetAttrString(v, *s);
425 if (m == NULL) {
426 PyErr_Clear();
427 continue;
428 }
429 for (i = 0; ; i++) {
430 x = PySequence_GetItem(m, i);
431 if (x == NULL) {
432 PyErr_Clear();
433 break;
434 }
435 if (PyList_Append(l, x) != 0) {
436 Py_DECREF(x);
437 Py_DECREF(m);
438 goto error;
439 }
440 Py_DECREF(x);
441 }
442 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000443 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000444 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000445 if (PyList_Sort(l) != 0)
446 goto error;
447 return l;
448 error:
449 Py_XDECREF(l);
450 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000451}
452
Guido van Rossum79f25d91997-04-29 20:08:16 +0000453static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000454do_divmod(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000455 PyObject *v, *w;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000456{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000457 PyObject *res;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000458
Guido van Rossum79f25d91997-04-29 20:08:16 +0000459 if (PyInstance_Check(v) || PyInstance_Check(w))
460 return PyInstance_DoBinOp(v, w, "__divmod__", "__rdivmod__",
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000461 do_divmod);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000462 if (v->ob_type->tp_as_number == NULL ||
463 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000464 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000465 "divmod() requires numeric or class instance arguments");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000466 return NULL;
467 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000468 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +0000469 return NULL;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000470 res = (*v->ob_type->tp_as_number->nb_divmod)(v, w);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000471 Py_DECREF(v);
472 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000473 return res;
474}
475
Guido van Rossum79f25d91997-04-29 20:08:16 +0000476static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000477builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000478 PyObject *self;
479 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000480{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000481 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000482
Guido van Rossum79f25d91997-04-29 20:08:16 +0000483 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000484 return NULL;
485 return do_divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000486}
487
Guido van Rossum79f25d91997-04-29 20:08:16 +0000488static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000489builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000490 PyObject *self;
491 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000492{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000493 PyObject *cmd;
494 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000496
Guido van Rossum79f25d91997-04-29 20:08:16 +0000497 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000498 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000499 &PyDict_Type, &globals,
500 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 if (globals == Py_None) {
503 globals = PyEval_GetGlobals();
504 if (locals == Py_None)
505 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000506 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000507 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000508 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000509 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
510 if (PyDict_SetItemString(globals, "__builtins__",
511 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000512 return NULL;
513 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000514 if (PyCode_Check(cmd))
515 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
516 if (!PyString_Check(cmd)) {
517 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000518 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000519 return NULL;
520 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000521 str = PyString_AsString(cmd);
522 if ((int)strlen(str) != PyString_Size(cmd)) {
523 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000524 "embedded '\\0' in string arg");
525 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000526 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000527 while (*str == ' ' || *str == '\t')
528 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000529 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000530}
531
Guido van Rossum79f25d91997-04-29 20:08:16 +0000532static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000533builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000534 PyObject *self;
535 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000536{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000537 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000538 PyObject *globals = Py_None, *locals = Py_None;
539 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000540 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000541
Guido van Rossum79f25d91997-04-29 20:08:16 +0000542 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000543 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000544 &PyDict_Type, &globals,
545 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000546 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000547 if (globals == Py_None) {
548 globals = PyEval_GetGlobals();
549 if (locals == Py_None)
550 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000551 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000552 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000553 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000554 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
555 if (PyDict_SetItemString(globals, "__builtins__",
556 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000557 return NULL;
558 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000559 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000562 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000564 return NULL;
565 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000566 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000567 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000568 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000569 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000570 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000571}
572
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000574builtin_float(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 PyObject *self;
576 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000577{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000578 PyObject *v;
579 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000580
Guido van Rossum79f25d91997-04-29 20:08:16 +0000581 if (!PyArg_ParseTuple(args, "O:float", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000582 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000583 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000584 return float_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000585 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000586 nb->nb_float == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000587 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000588 "float() argument can't be converted to float");
589 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000590 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000591 return (*nb->nb_float)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000592}
593
Guido van Rossum79f25d91997-04-29 20:08:16 +0000594static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000595builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 PyObject *self;
597 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000598{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000599 PyObject *v;
600 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000601
Guido van Rossum79f25d91997-04-29 20:08:16 +0000602 if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000603 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000604 return PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000605}
606
Guido van Rossum79f25d91997-04-29 20:08:16 +0000607static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000608builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000609 PyObject *self;
610 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000611{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000612 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000613
Guido van Rossum79f25d91997-04-29 20:08:16 +0000614 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000615 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000616 d = PyEval_GetGlobals();
617 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000618 return d;
619}
620
Guido van Rossum79f25d91997-04-29 20:08:16 +0000621static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000622builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000623 PyObject *self;
624 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000625{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000626 PyObject *v;
627 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000628
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000630 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000632 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000633 PyErr_Clear();
634 return PyInt_FromLong(0L);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000635 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 Py_DECREF(v);
637 return PyInt_FromLong(1L);
Guido van Rossum33894be1992-01-27 16:53:09 +0000638}
639
Guido van Rossum79f25d91997-04-29 20:08:16 +0000640static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000641builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000642 PyObject *self;
643 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000644{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000645 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000646
Guido van Rossum79f25d91997-04-29 20:08:16 +0000647 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000648 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000649 return PyInt_FromLong((long)v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000650}
651
Guido van Rossum79f25d91997-04-29 20:08:16 +0000652static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000653builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000654 PyObject *self;
655 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000656{
657 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000658 PyObject *seq;
659 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000660 int len;
661 } sequence;
662
Guido van Rossum79f25d91997-04-29 20:08:16 +0000663 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000664 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000665 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000666 register int i, j;
667
Guido van Rossum79f25d91997-04-29 20:08:16 +0000668 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000669 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000670 PyErr_SetString(PyExc_TypeError,
671 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000672 return NULL;
673 }
674
Guido van Rossum79f25d91997-04-29 20:08:16 +0000675 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000676 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000677
Guido van Rossum79f25d91997-04-29 20:08:16 +0000678 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
679 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000680 goto Fail_2;
681 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000682
Guido van Rossum2d951851994-08-29 12:52:16 +0000683 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000684 int curlen;
685
Guido van Rossum79f25d91997-04-29 20:08:16 +0000686 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000687 goto Fail_2;
688
689 if (! (sqp->sqf = sqp->seq->ob_type->tp_as_sequence)) {
690 static char errmsg[] =
691 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000692 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000693
694 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000695 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000696 goto Fail_2;
697 }
698
699 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
700 goto Fail_2;
701
702 if (curlen > len)
703 len = curlen;
704 }
705
Guido van Rossum79f25d91997-04-29 20:08:16 +0000706 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000707 goto Fail_2;
708
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000709 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000710 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000711 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000712 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000713
Guido van Rossum79f25d91997-04-29 20:08:16 +0000714 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000715 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000716 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000717 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000718 goto Fail_1;
719 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000720
721 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000722 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000723 Py_INCREF(Py_None);
724 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000725 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000726 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000727 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000728 if (item == NULL) {
729 if (i < sqp->len)
730 goto Fail_0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000731 if (PyErr_ExceptionMatches(
732 PyExc_IndexError))
733 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 PyErr_Clear();
735 Py_INCREF(Py_None);
736 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000737 sqp->len = -1;
738 }
739 else {
740 goto Fail_0;
741 }
742 }
743 else
744 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000745
Guido van Rossum12d12c51993-10-26 17:58:25 +0000746 }
Guido van Rossum32120311995-07-10 13:52:21 +0000747 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000748 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000749 if (PyTuple_SetItem(alist, j, item) < 0) {
750 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000751 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000752 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000753 continue;
754
755 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000757 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000758 }
759
Guido van Rossum32120311995-07-10 13:52:21 +0000760 if (!alist)
761 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000762
763 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000765 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000766 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000767
Guido van Rossum79f25d91997-04-29 20:08:16 +0000768 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000769 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000770 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 value = PyEval_CallObject(func, alist);
772 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000773 if (value == NULL)
774 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000775 }
776 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000777 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000778 goto Fail_1;
779 }
780 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000782 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000783 }
784 }
785
Guido van Rossum79f25d91997-04-29 20:08:16 +0000786 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000787 return result;
788
Guido van Rossum12d12c51993-10-26 17:58:25 +0000789Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000790 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000791Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000792 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000793 return NULL;
794}
795
Guido van Rossum79f25d91997-04-29 20:08:16 +0000796static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000797builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000798 PyObject *self;
799 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000800{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000801 PyObject *v;
802 PyObject *name;
803 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000804
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000806 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000807 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000808 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000809 Py_INCREF(Py_None);
810 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000811}
812
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000814builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000815 PyObject *self;
816 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000817{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000818 PyObject *v;
819 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820
Guido van Rossum79f25d91997-04-29 20:08:16 +0000821 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000822 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000823 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000824 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000825 Py_INCREF(Py_None);
826 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000827}
828
Guido van Rossum79f25d91997-04-29 20:08:16 +0000829static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000830builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831 PyObject *self;
832 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000833{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000834 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000835 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000836
Guido van Rossum79f25d91997-04-29 20:08:16 +0000837 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000838 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000839 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000840 if (x == -1)
841 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000842 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000843}
844
Guido van Rossum79f25d91997-04-29 20:08:16 +0000845static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000846builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000847 PyObject *self;
848 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000849{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 PyObject *v;
851 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000852
Guido van Rossum79f25d91997-04-29 20:08:16 +0000853 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000854 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000855
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000856 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000857 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000859 "hex() argument can't be converted to hex");
860 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000861 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000862 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000863}
864
Guido van Rossum79f25d91997-04-29 20:08:16 +0000865static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000866
Guido van Rossum79f25d91997-04-29 20:08:16 +0000867static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000868builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000869 PyObject *self;
870 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000871{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000872 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000873 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000874 PyObject *res;
875 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876
877 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000878 if (line == NULL)
879 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881 return NULL;
882 while (*str == ' ' || *str == '\t')
883 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000884 globals = PyEval_GetGlobals();
885 locals = PyEval_GetLocals();
886 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
887 if (PyDict_SetItemString(globals, "__builtins__",
888 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000889 return NULL;
890 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000891 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000894}
895
Guido van Rossume8811f81997-02-14 15:48:05 +0000896static PyObject *
897builtin_intern(self, args)
898 PyObject *self;
899 PyObject *args;
900{
901 PyObject *s;
902 if (!PyArg_ParseTuple(args, "S", &s))
903 return NULL;
904 Py_INCREF(s);
905 PyString_InternInPlace(&s);
906 return s;
907}
908
Guido van Rossum79f25d91997-04-29 20:08:16 +0000909static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000910builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000911 PyObject *self;
912 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000913{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000914 PyObject *v;
915 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000916
Guido van Rossum79f25d91997-04-29 20:08:16 +0000917 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000918 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000919 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +0000920 return int_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000921 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000922 nb->nb_int == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000923 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000924 "int() argument can't be converted to int");
925 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000926 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000927 return (*nb->nb_int)(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000928}
929
Guido van Rossum79f25d91997-04-29 20:08:16 +0000930static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000931builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000932 PyObject *self;
933 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000934{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000936 long len;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000937 PyTypeObject *tp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000938
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000940 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000941 tp = v->ob_type;
942 if (tp->tp_as_sequence != NULL) {
943 len = (*tp->tp_as_sequence->sq_length)(v);
944 }
945 else if (tp->tp_as_mapping != NULL) {
946 len = (*tp->tp_as_mapping->mp_length)(v);
947 }
948 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 PyErr_SetString(PyExc_TypeError, "len() of unsized object");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000950 return NULL;
951 }
Guido van Rossum04691fc1992-08-12 15:35:34 +0000952 if (len < 0)
953 return NULL;
954 else
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 return PyInt_FromLong(len);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000956}
957
Guido van Rossum79f25d91997-04-29 20:08:16 +0000958static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000959builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960 PyObject *self;
961 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000962{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000963 PyObject *v;
964 PySequenceMethods *sqf;
Guido van Rossumd1705771996-04-09 02:41:06 +0000965
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000967 return NULL;
968 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
969 int n = (*sqf->sq_length)(v);
970 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 PyObject *l;
Guido van Rossumd1705771996-04-09 02:41:06 +0000972 if (n < 0)
973 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 l = PyList_New(n);
Guido van Rossumd1705771996-04-09 02:41:06 +0000975 if (l == NULL)
976 return NULL;
977 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000978 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumd1705771996-04-09 02:41:06 +0000979 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000980 Py_DECREF(l);
Guido van Rossumd1705771996-04-09 02:41:06 +0000981 l = NULL;
982 break;
983 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyList_SetItem(l, i, item);
Guido van Rossumd1705771996-04-09 02:41:06 +0000985 }
986 /* XXX Should support indefinite-length sequences */
987 return l;
988 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000989 PyErr_SetString(PyExc_TypeError, "list() argument must be a sequence");
Guido van Rossumd1705771996-04-09 02:41:06 +0000990 return NULL;
991}
992
Guido van Rossum8861b741996-07-30 16:49:37 +0000993
994static PyObject *
995builtin_slice(self, args)
996 PyObject *self;
997 PyObject *args;
998{
999 PyObject *start, *stop, *step;
1000
1001 start = stop = step = NULL;
1002
1003 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
1004 return NULL;
1005
1006 /*This swapping of stop and start is to maintain compatibility with
1007 the range builtin.*/
1008 if (stop == NULL) {
1009 stop = start;
1010 start = NULL;
1011 }
1012 return PySlice_New(start, stop, step);
1013}
1014
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +00001016builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001017 PyObject *self;
1018 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +00001019{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +00001021
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +00001023 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001024 d = PyEval_GetLocals();
1025 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +00001026 return d;
1027}
1028
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001030builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 PyObject *self;
1032 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +00001033{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 PyObject *v;
1035 PyNumberMethods *nb;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001036
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001039 if (PyString_Check(v))
Guido van Rossumc6472e91997-03-31 17:15:43 +00001040 return long_from_string(v);
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001041 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001042 nb->nb_long == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001043 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001044 "long() argument can't be converted to long");
1045 return NULL;
Guido van Rossumd4905451991-05-05 20:00:36 +00001046 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001047 return (*nb->nb_long)(v);
Guido van Rossumd4905451991-05-05 20:00:36 +00001048}
1049
Guido van Rossum79f25d91997-04-29 20:08:16 +00001050static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001051min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001052 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001053 int sign;
1054{
Guido van Rossum2d951851994-08-29 12:52:16 +00001055 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 PyObject *v, *w, *x;
1057 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001058
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001060 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001062 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001063 sq = v->ob_type->tp_as_sequence;
1064 if (sq == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065 PyErr_SetString(PyExc_TypeError,
1066 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001067 return NULL;
1068 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001069 w = NULL;
1070 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +00001071 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +00001072 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001073 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001075 break;
1076 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001078 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001079 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001080 if (w == NULL)
1081 w = x;
1082 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001083 int c = PyObject_Compare(x, w);
1084 if (c && PyErr_Occurred()) {
1085 Py_DECREF(x);
1086 Py_XDECREF(w);
1087 return NULL;
1088 }
1089 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001091 w = x;
1092 }
1093 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001094 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001095 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001096 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001097 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 PyErr_SetString(PyExc_ValueError,
1099 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001100 return w;
1101}
1102
Guido van Rossum79f25d91997-04-29 20:08:16 +00001103static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001104builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 PyObject *self;
1106 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001107{
1108 return min_max(v, -1);
1109}
1110
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001113 PyObject *self;
1114 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001115{
1116 return min_max(v, 1);
1117}
1118
Guido van Rossum79f25d91997-04-29 20:08:16 +00001119static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001120builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 PyObject *self;
1122 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001123{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001124 PyObject *v;
1125 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001126
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001128 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001129 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1130 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001131 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001132 "oct() argument can't be converted to oct");
1133 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001134 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001135 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001136}
1137
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001139builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001140 PyObject *self;
1141 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001142{
Guido van Rossum2d951851994-08-29 12:52:16 +00001143 char *name;
1144 char *mode = "r";
1145 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001146 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147
Guido van Rossum79f25d91997-04-29 20:08:16 +00001148 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001149 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001150 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001151 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001153 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001154}
1155
Guido van Rossum79f25d91997-04-29 20:08:16 +00001156static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001157builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyObject *self;
1159 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001160{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001161 char c;
1162
Guido van Rossum79f25d91997-04-29 20:08:16 +00001163 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001164 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001165 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001166}
1167
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001169do_pow(v, w)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170 PyObject *v, *w;
Guido van Rossumd4905451991-05-05 20:00:36 +00001171{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172 PyObject *res;
1173 if (PyInstance_Check(v) || PyInstance_Check(w))
1174 return PyInstance_DoBinOp(v, w, "__pow__", "__rpow__", do_pow);
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001175 if (v->ob_type->tp_as_number == NULL ||
Guido van Rossumdf05ac61994-08-29 12:52:37 +00001176 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyErr_SetString(PyExc_TypeError,
1178 "pow() requires numeric arguments");
Guido van Rossumd4905451991-05-05 20:00:36 +00001179 return NULL;
1180 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001181 if (
1182#ifndef WITHOUT_COMPLEX
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 !PyComplex_Check(v) &&
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001184#endif
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 PyFloat_Check(w) && PyFloat_AsDouble(v) < 0.0) {
1186 if (!PyErr_Occurred())
1187 PyErr_SetString(PyExc_ValueError,
1188 "negative number to float power");
Guido van Rossum21651581995-02-10 16:57:16 +00001189 return NULL;
1190 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001192 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 res = (*v->ob_type->tp_as_number->nb_power)(v, w, Py_None);
1194 Py_DECREF(v);
1195 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001196 return res;
1197}
1198
Guido van Rossum79f25d91997-04-29 20:08:16 +00001199static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001200builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 PyObject *self;
1202 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001203{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 PyObject *v, *w, *z = Py_None, *res;
1205 PyObject *v1, *z1, *w2, *z2;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001206
Guido van Rossum79f25d91997-04-29 20:08:16 +00001207 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001208 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 if (z == Py_None)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001210 return do_pow(v, w);
1211 /* XXX The ternary version doesn't do class instance coercions */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 if (PyInstance_Check(v))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001213 return v->ob_type->tp_as_number->nb_power(v, w, z);
1214 if (v->ob_type->tp_as_number == NULL ||
1215 z->ob_type->tp_as_number == NULL ||
1216 w->ob_type->tp_as_number == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001217 PyErr_SetString(PyExc_TypeError,
1218 "pow() requires numeric arguments");
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001219 return NULL;
1220 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 if (PyNumber_Coerce(&v, &w) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001222 return NULL;
1223 res = NULL;
1224 v1 = v;
1225 z1 = z;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001226 if (PyNumber_Coerce(&v1, &z1) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001227 goto error2;
1228 w2 = w;
1229 z2 = z1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 if (PyNumber_Coerce(&w2, &z2) != 0)
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001231 goto error1;
1232 res = (*v1->ob_type->tp_as_number->nb_power)(v1, w2, z2);
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233 Py_DECREF(w2);
1234 Py_DECREF(z2);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001235 error1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236 Py_DECREF(v1);
1237 Py_DECREF(z1);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001238 error2:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001239 Py_DECREF(v);
1240 Py_DECREF(w);
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001241 return res;
Guido van Rossumd4905451991-05-05 20:00:36 +00001242}
1243
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001246 PyObject *self;
1247 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001248{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001249 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001250 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001252
Guido van Rossum79f25d91997-04-29 20:08:16 +00001253 if (PyTuple_Size(args) <= 1) {
1254 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001255 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001256 &ihigh))
1257 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001258 }
1259 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001261 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001262 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001263 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001264 }
1265 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001266 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001267 return NULL;
1268 }
1269 /* XXX ought to check overflow of subtraction */
1270 if (istep > 0)
1271 n = (ihigh - ilow + istep - 1) / istep;
1272 else
1273 n = (ihigh - ilow + istep + 1) / istep;
1274 if (n < 0)
1275 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001276 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001277 if (v == NULL)
1278 return NULL;
1279 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001281 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001282 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001283 return NULL;
1284 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001285 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001286 ilow += istep;
1287 }
1288 return v;
1289}
1290
Guido van Rossum79f25d91997-04-29 20:08:16 +00001291static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001292builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001293 PyObject *self;
1294 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001295{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001296 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001297 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001298
Guido van Rossum79f25d91997-04-29 20:08:16 +00001299 if (PyTuple_Size(args) <= 1) {
1300 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001301 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302 &ihigh))
1303 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001304 }
1305 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001307 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001309 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001310 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001311 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001313 return NULL;
1314 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001315 /* XXX ought to check overflow of subtraction */
1316 if (istep > 0)
1317 n = (ihigh - ilow + istep - 1) / istep;
1318 else
1319 n = (ihigh - ilow + istep + 1) / istep;
1320 if (n < 0)
1321 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001323}
1324
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001326
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001328builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001329 PyObject *self;
1330 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001331{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001332 PyObject *v = NULL;
1333 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001334
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001336 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001337 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1338 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001339 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001340 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001341 char *prompt;
1342 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001343 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001344 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001345 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001346 if (po == NULL)
1347 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001348 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001349 }
1350 else {
1351 po = NULL;
1352 prompt = "";
1353 }
Guido van Rossumee81af81997-09-26 21:47:43 +00001354 Py_BEGIN_ALLOW_THREADS
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355 s = PyOS_Readline(prompt);
Guido van Rossumee81af81997-09-26 21:47:43 +00001356 Py_END_ALLOW_THREADS
Guido van Rossum79f25d91997-04-29 20:08:16 +00001357 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001358 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001359 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001360 return NULL;
1361 }
1362 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001364 result = NULL;
1365 }
1366 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001368 }
1369 free(s);
1370 return result;
1371 }
Guido van Rossum90933611991-06-07 16:10:43 +00001372 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001374 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001375 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001376 return NULL;
1377 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001378 if (Py_FlushLine() != 0 ||
1379 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001380 return NULL;
1381 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001382 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001383 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385 return NULL;
1386 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001387 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001388}
1389
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001391builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001392 PyObject *self;
1393 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001394{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyObject *seq, *func, *result = NULL;
1396 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001397 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001398
Guido van Rossum79f25d91997-04-29 20:08:16 +00001399 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400 return NULL;
1401 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001402 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001403
1404 if ((sqf = seq->ob_type->tp_as_sequence) == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001405 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001406 "2nd argument to reduce() must be a sequence object");
1407 return NULL;
1408 }
1409
Guido van Rossum79f25d91997-04-29 20:08:16 +00001410 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001411 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001412
Guido van Rossum2d951851994-08-29 12:52:16 +00001413 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001415
1416 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001417 Py_DECREF(args);
1418 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001419 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001420 }
1421
Guido van Rossum2d951851994-08-29 12:52:16 +00001422 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001423 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001424 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001425 break;
1426 }
1427 goto Fail;
1428 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001429
Guido van Rossum2d951851994-08-29 12:52:16 +00001430 if (result == NULL)
1431 result = op2;
1432 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001433 PyTuple_SetItem(args, 0, result);
1434 PyTuple_SetItem(args, 1, op2);
1435 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001436 goto Fail;
1437 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001438 }
1439
Guido van Rossum79f25d91997-04-29 20:08:16 +00001440 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001441
Guido van Rossum2d951851994-08-29 12:52:16 +00001442 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001443 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001444 "reduce of empty sequence with no initial value");
1445
Guido van Rossum12d12c51993-10-26 17:58:25 +00001446 return result;
1447
Guido van Rossum2d951851994-08-29 12:52:16 +00001448Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001449 Py_XDECREF(args);
1450 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001451 return NULL;
1452}
1453
Guido van Rossum79f25d91997-04-29 20:08:16 +00001454static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001455builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001456 PyObject *self;
1457 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001458{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001459 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001460
Guido van Rossum79f25d91997-04-29 20:08:16 +00001461 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001462 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001463 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001464}
1465
Guido van Rossum79f25d91997-04-29 20:08:16 +00001466static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001467builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001468 PyObject *self;
1469 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001470{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001471 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001472
Guido van Rossum79f25d91997-04-29 20:08:16 +00001473 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001474 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001475 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001476}
1477
Guido van Rossum79f25d91997-04-29 20:08:16 +00001478static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001479builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480 PyObject *self;
1481 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001482{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001483 double x;
1484 double f;
1485 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001486 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001487
Guido van Rossum79f25d91997-04-29 20:08:16 +00001488 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001489 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001490 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001491 i = abs(ndigits);
1492 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001493 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001494 if (ndigits < 0)
1495 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001496 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001497 x *= f;
1498 if (x >= 0.0)
1499 x = floor(x + 0.5);
1500 else
1501 x = ceil(x - 0.5);
1502 if (ndigits < 0)
1503 x *= f;
1504 else
1505 x /= f;
1506 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001507}
1508
Guido van Rossum79f25d91997-04-29 20:08:16 +00001509static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001511 PyObject *self;
1512 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001513{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001514 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515
Guido van Rossum79f25d91997-04-29 20:08:16 +00001516 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001517 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001518 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001519}
1520
Guido van Rossum79f25d91997-04-29 20:08:16 +00001521static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001522builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001523 PyObject *self;
1524 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001525{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001526 PyObject *v;
1527 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001528
Guido van Rossum79f25d91997-04-29 20:08:16 +00001529 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001530 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001531 if (PyTuple_Check(v)) {
1532 Py_INCREF(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001533 return v;
1534 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001535 if (PyList_Check(v))
1536 return PyList_AsTuple(v);
1537 if (PyString_Check(v)) {
1538 int n = PyString_Size(v);
1539 PyObject *t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001540 if (t != NULL) {
1541 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001542 char *p = PyString_AsString(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001543 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544 PyObject *item =
1545 PyString_FromStringAndSize(p+i, 1);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001546 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001547 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001548 t = NULL;
1549 break;
1550 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001551 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001552 }
1553 }
1554 return t;
1555 }
1556 /* Generic sequence object */
1557 if ((sqf = v->ob_type->tp_as_sequence) != NULL) {
1558 int n = (*sqf->sq_length)(v);
1559 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001560 PyObject *t;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001561 if (n < 0)
1562 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001563 t = PyTuple_New(n);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001564 if (t == NULL)
1565 return NULL;
1566 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001567 PyObject *item = (*sqf->sq_item)(v, i);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001568 if (item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001569 Py_DECREF(t);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001570 t = NULL;
1571 break;
1572 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001573 PyTuple_SetItem(t, i, item);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001574 }
1575 /* XXX Should support indefinite-length sequences */
1576 return t;
1577 }
1578 /* None of the above */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001579 PyErr_SetString(PyExc_TypeError,
1580 "tuple() argument must be a sequence");
Guido van Rossumcae027b1994-08-29 12:53:11 +00001581 return NULL;
1582}
1583
Guido van Rossum79f25d91997-04-29 20:08:16 +00001584static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001585builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001586 PyObject *self;
1587 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001588{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001589 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001590
Guido van Rossum79f25d91997-04-29 20:08:16 +00001591 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001592 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001593 v = (PyObject *)v->ob_type;
1594 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001595 return v;
1596}
1597
Guido van Rossum79f25d91997-04-29 20:08:16 +00001598static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001599builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001600 PyObject *self;
1601 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001602{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001603 PyObject *v = NULL;
1604 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001605
Guido van Rossum79f25d91997-04-29 20:08:16 +00001606 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001607 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001608 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001609 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001610 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001611 if (!PyErr_Occurred())
1612 PyErr_SetString(PyExc_SystemError,
1613 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001614 }
1615 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001616 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001617 }
1618 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001619 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001620 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001621 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001622 "vars() argument must have __dict__ attribute");
1623 return NULL;
1624 }
1625 }
1626 return d;
1627}
1628
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001629static PyObject *
1630builtin_isinstance(self, args)
1631 PyObject *self;
1632 PyObject *args;
1633{
1634 PyObject *inst;
1635 PyObject *cls;
1636 int retval;
1637
1638 if (!PyArg_ParseTuple(args, "OO", &inst, &cls))
1639 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001640 if (PyType_Check(cls)) {
Guido van Rossumd6af46d1997-12-10 05:51:47 +00001641 retval = ((PyObject *)(inst->ob_type) == cls);
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001642 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001643 else {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001644 if (!PyClass_Check(cls)) {
1645 PyErr_SetString(PyExc_TypeError,
1646 "second argument must be a class");
1647 return NULL;
1648 }
1649
1650 if (!PyInstance_Check(inst))
1651 retval = 0;
1652 else {
1653 PyObject *inclass =
1654 (PyObject*)((PyInstanceObject*)inst)->in_class;
1655 retval = PyClass_IsSubclass(inclass, cls);
1656 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001657 }
1658 return PyInt_FromLong(retval);
1659}
1660
1661
1662static PyObject *
1663builtin_issubclass(self, args)
1664 PyObject *self;
1665 PyObject *args;
1666{
1667 PyObject *derived;
1668 PyObject *cls;
1669 int retval;
1670
1671 if (!PyArg_ParseTuple(args, "OO", &derived, &cls))
1672 return NULL;
1673 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1674 PyErr_SetString(PyExc_TypeError, "arguments must be classes");
1675 return NULL;
1676 }
1677 /* shortcut */
1678 if (!(retval = (derived == cls)))
1679 retval = PyClass_IsSubclass(derived, cls);
1680
1681 return PyInt_FromLong(retval);
1682}
1683
1684
Guido van Rossum79f25d91997-04-29 20:08:16 +00001685static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001686 {"__import__", builtin___import__, 1},
1687 {"abs", builtin_abs, 1},
1688 {"apply", builtin_apply, 1},
1689 {"callable", builtin_callable, 1},
1690 {"chr", builtin_chr, 1},
1691 {"cmp", builtin_cmp, 1},
1692 {"coerce", builtin_coerce, 1},
1693 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001694#ifndef WITHOUT_COMPLEX
1695 {"complex", builtin_complex, 1},
1696#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001697 {"delattr", builtin_delattr, 1},
1698 {"dir", builtin_dir, 1},
1699 {"divmod", builtin_divmod, 1},
1700 {"eval", builtin_eval, 1},
1701 {"execfile", builtin_execfile, 1},
1702 {"filter", builtin_filter, 1},
1703 {"float", builtin_float, 1},
1704 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001705 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001706 {"hasattr", builtin_hasattr, 1},
1707 {"hash", builtin_hash, 1},
1708 {"hex", builtin_hex, 1},
1709 {"id", builtin_id, 1},
1710 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001711 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001712 {"int", builtin_int, 1},
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001713 {"isinstance", builtin_isinstance, 1},
1714 {"issubclass", builtin_issubclass, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001715 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001716 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001717 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001718 {"long", builtin_long, 1},
1719 {"map", builtin_map, 1},
1720 {"max", builtin_max, 1},
1721 {"min", builtin_min, 1},
1722 {"oct", builtin_oct, 1},
1723 {"open", builtin_open, 1},
1724 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001725 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001726 {"range", builtin_range, 1},
1727 {"raw_input", builtin_raw_input, 1},
1728 {"reduce", builtin_reduce, 1},
1729 {"reload", builtin_reload, 1},
1730 {"repr", builtin_repr, 1},
1731 {"round", builtin_round, 1},
1732 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001733 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001734 {"str", builtin_str, 1},
1735 {"tuple", builtin_tuple, 1},
1736 {"type", builtin_type, 1},
1737 {"vars", builtin_vars, 1},
1738 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001739 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001740};
1741
Guido van Rossum3f5da241990-12-20 15:06:42 +00001742/* Predefined exceptions */
1743
Guido van Rossum04748321997-09-16 18:43:15 +00001744PyObject *PyExc_Exception;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001745PyObject *PyExc_StandardError;
Barry Warsaw412cdc21997-09-16 21:51:14 +00001746PyObject *PyExc_ArithmeticError;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001747PyObject *PyExc_LookupError;
1748
Guido van Rossum79f25d91997-04-29 20:08:16 +00001749PyObject *PyExc_AssertionError;
1750PyObject *PyExc_AttributeError;
1751PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001752PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001753PyObject *PyExc_IOError;
1754PyObject *PyExc_ImportError;
1755PyObject *PyExc_IndexError;
1756PyObject *PyExc_KeyError;
1757PyObject *PyExc_KeyboardInterrupt;
1758PyObject *PyExc_MemoryError;
1759PyObject *PyExc_NameError;
1760PyObject *PyExc_OverflowError;
1761PyObject *PyExc_RuntimeError;
1762PyObject *PyExc_SyntaxError;
1763PyObject *PyExc_SystemError;
1764PyObject *PyExc_SystemExit;
1765PyObject *PyExc_TypeError;
1766PyObject *PyExc_ValueError;
1767PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001768
Barry Warsaw757af0e1997-08-29 22:13:51 +00001769PyObject *PyExc_MemoryErrorInst;
1770
1771static struct
1772{
1773 char* name;
1774 PyObject** exc;
1775 int leaf_exc;
1776}
1777bltin_exc[] = {
Guido van Rossum04748321997-09-16 18:43:15 +00001778 {"Exception", &PyExc_Exception, 0},
Barry Warsaw757af0e1997-08-29 22:13:51 +00001779 {"StandardError", &PyExc_StandardError, 0},
Barry Warsaw412cdc21997-09-16 21:51:14 +00001780 {"ArithmeticError", &PyExc_ArithmeticError, 0},
Barry Warsaw757af0e1997-08-29 22:13:51 +00001781 {"LookupError", &PyExc_LookupError, 0},
1782 {"AssertionError", &PyExc_AssertionError, 1},
1783 {"AttributeError", &PyExc_AttributeError, 1},
1784 {"EOFError", &PyExc_EOFError, 1},
1785 {"FloatingPointError", &PyExc_FloatingPointError, 1},
1786 {"IOError", &PyExc_IOError, 1},
1787 {"ImportError", &PyExc_ImportError, 1},
1788 {"IndexError", &PyExc_IndexError, 1},
1789 {"KeyError", &PyExc_KeyError, 1},
1790 {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, 1},
1791 {"MemoryError", &PyExc_MemoryError, 1},
1792 {"NameError", &PyExc_NameError, 1},
1793 {"OverflowError", &PyExc_OverflowError, 1},
1794 {"RuntimeError", &PyExc_RuntimeError, 1},
1795 {"SyntaxError", &PyExc_SyntaxError, 1},
1796 {"SystemError", &PyExc_SystemError, 1},
1797 {"SystemExit", &PyExc_SystemExit, 1},
1798 {"TypeError", &PyExc_TypeError, 1},
1799 {"ValueError", &PyExc_ValueError, 1},
1800 {"ZeroDivisionError", &PyExc_ZeroDivisionError, 1},
1801 {NULL, NULL}
1802};
1803
1804
1805/* import exceptions module to extract class exceptions */
1806static void
1807init_class_exc(dict)
1808 PyObject *dict;
1809{
1810 int i;
1811 PyObject *m = PyImport_ImportModule("exceptions");
1812 PyObject *d;
1813 PyObject *args;
1814
1815 if (m == NULL ||
1816 (d = PyModule_GetDict(m)) == NULL)
1817 {
1818 PyObject *f = PySys_GetObject("stderr");
1819 if (Py_VerboseFlag) {
1820 PyFile_WriteString(
1821 "'import exceptions' failed; traceback:\n", f);
1822 PyErr_Print();
1823 }
1824 else {
1825 PyFile_WriteString(
1826 "'import exceptions' failed; use -v for traceback\n", f);
1827 PyErr_Clear();
1828 }
1829 PyFile_WriteString("defaulting to old style exceptions\n", f);
1830 return;
1831 }
1832 for (i = 0; bltin_exc[i].name; i++) {
1833 /* dig the exception out of the module */
1834 PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name);
1835 if (!exc)
1836 Py_FatalError("built-in exception cannot be initialized");
1837
1838 Py_XDECREF(*bltin_exc[i].exc);
1839
1840 /* squirrel away a pointer to the exception */
1841 Py_INCREF(exc);
1842 *bltin_exc[i].exc = exc;
1843
1844 /* and insert the name in the __builtin__ module */
1845 PyDict_SetItemString(dict, bltin_exc[i].name, exc);
1846 }
1847
1848 /* we need one pre-allocated instance */
1849 args = Py_BuildValue("()");
1850 if (args) {
1851 PyExc_MemoryErrorInst =
1852 PyEval_CallObject(PyExc_MemoryError, args);
1853 Py_DECREF(args);
1854 }
1855
1856 /* we're done with the exceptions module */
1857 Py_DECREF(m);
1858
1859 if (PyErr_Occurred())
1860 Py_FatalError("can't instantiate standard exceptions");
1861}
1862
1863
1864static void
1865fini_instances()
1866{
1867 Py_XDECREF(PyExc_MemoryErrorInst);
1868 PyExc_MemoryErrorInst = NULL;
1869}
1870
1871
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872static PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +00001873newstdexception(dict, name)
1874 PyObject *dict;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001875 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001876{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001877 PyObject *v = PyString_FromString(name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001878 if (v == NULL || PyDict_SetItemString(dict, name, v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001880 return v;
1881}
1882
1883static void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001884initerrors(dict)
1885 PyObject *dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001886{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001887 int i;
1888 int exccnt = 0;
1889 for (i = 0; bltin_exc[i].name; i++, exccnt++) {
1890 if (bltin_exc[i].leaf_exc)
1891 *bltin_exc[i].exc =
1892 newstdexception(dict, bltin_exc[i].name);
1893 }
1894
1895 /* This is kind of bogus because we special case the three new
1896 exceptions to be nearly forward compatible. But this means we
1897 hard code knowledge about exceptions.py into C here. I don't
1898 have a better solution, though
1899 */
1900 PyExc_LookupError = PyTuple_New(2);
1901 Py_INCREF(PyExc_IndexError);
1902 PyTuple_SET_ITEM(PyExc_LookupError, 0, PyExc_IndexError);
1903 Py_INCREF(PyExc_KeyError);
1904 PyTuple_SET_ITEM(PyExc_LookupError, 1, PyExc_KeyError);
1905 PyDict_SetItemString(dict, "LookupError", PyExc_LookupError);
1906
Barry Warsaw412cdc21997-09-16 21:51:14 +00001907 PyExc_ArithmeticError = PyTuple_New(3);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001908 Py_INCREF(PyExc_OverflowError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001909 PyTuple_SET_ITEM(PyExc_ArithmeticError, 0, PyExc_OverflowError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001910 Py_INCREF(PyExc_ZeroDivisionError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001911 PyTuple_SET_ITEM(PyExc_ArithmeticError, 1, PyExc_ZeroDivisionError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001912 Py_INCREF(PyExc_FloatingPointError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001913 PyTuple_SET_ITEM(PyExc_ArithmeticError, 2, PyExc_FloatingPointError);
1914 PyDict_SetItemString(dict, "ArithmeticError", PyExc_ArithmeticError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001915
Barry Warsawb01a7fa1997-09-18 03:44:38 +00001916 PyExc_StandardError = PyTuple_New(exccnt-2);
1917 for (i = 2; bltin_exc[i].name; i++) {
Barry Warsaw757af0e1997-08-29 22:13:51 +00001918 PyObject *exc = *bltin_exc[i].exc;
1919 Py_INCREF(exc);
Barry Warsawb01a7fa1997-09-18 03:44:38 +00001920 PyTuple_SET_ITEM(PyExc_StandardError, i-2, exc);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001921 }
1922 PyDict_SetItemString(dict, "StandardError", PyExc_StandardError);
Guido van Rossum04748321997-09-16 18:43:15 +00001923
1924 /* Exception is treated differently; for now, it's == StandardError */
1925 PyExc_Exception = PyExc_StandardError;
1926 Py_INCREF(PyExc_Exception);
1927 PyDict_SetItemString(dict, "Exception", PyExc_Exception);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001928
1929 if (PyErr_Occurred())
1930 Py_FatalError("Could not initialize built-in string exceptions");
Guido van Rossum25ce5661997-08-02 03:10:38 +00001931}
1932
1933static void
1934finierrors()
1935{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001936 int i;
1937 for (i = 0; bltin_exc[i].name; i++) {
1938 PyObject *exc = *bltin_exc[i].exc;
1939 Py_XDECREF(exc);
1940 *bltin_exc[i].exc = NULL;
1941 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001942}
1943
1944PyObject *
Barry Warsaw757af0e1997-08-29 22:13:51 +00001945_PyBuiltin_Init_1()
Guido van Rossum25ce5661997-08-02 03:10:38 +00001946{
1947 PyObject *mod, *dict;
1948 mod = Py_InitModule("__builtin__", builtin_methods);
1949 if (mod == NULL)
1950 return NULL;
1951 dict = PyModule_GetDict(mod);
1952 initerrors(dict);
1953 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1954 return NULL;
1955 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1956 return NULL;
1957 if (PyDict_SetItemString(dict, "__debug__",
1958 PyInt_FromLong(Py_OptimizeFlag == 0)) < 0)
1959 return NULL;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001960
Guido van Rossum25ce5661997-08-02 03:10:38 +00001961 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001962}
1963
1964void
Barry Warsaw757af0e1997-08-29 22:13:51 +00001965_PyBuiltin_Init_2(dict)
1966 PyObject *dict;
1967{
1968 /* if Python was started with -X, initialize the class exceptions */
1969 if (Py_UseClassExceptionsFlag)
1970 init_class_exc(dict);
1971}
1972
1973
1974void
1975_PyBuiltin_Fini_1()
1976{
1977 fini_instances();
1978}
1979
1980
1981void
1982_PyBuiltin_Fini_2()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001983{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001984 finierrors();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001985}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001986
Guido van Rossum12d12c51993-10-26 17:58:25 +00001987
Guido van Rossume77a7571993-11-03 15:01:26 +00001988/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001989
Guido van Rossum79f25d91997-04-29 20:08:16 +00001990static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001991filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001992 PyObject *func;
1993 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001994{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001995 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001996 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001997 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001998
Guido van Rossumb7b45621995-08-04 04:07:45 +00001999 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002000 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00002001 return tuple;
2002 }
2003
Guido van Rossum79f25d91997-04-29 20:08:16 +00002004 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002005 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002006
Guido van Rossum12d12c51993-10-26 17:58:25 +00002007 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002008 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002009 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002010
Guido van Rossum79f25d91997-04-29 20:08:16 +00002011 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002012 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002013 if (func == Py_None) {
2014 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002015 good = item;
2016 }
2017 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002018 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002019 if (arg == NULL)
2020 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002021 good = PyEval_CallObject(func, arg);
2022 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002023 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002024 goto Fail_1;
2025 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002026 ok = PyObject_IsTrue(good);
2027 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002028 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002029 Py_INCREF(item);
2030 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002031 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002032 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00002033 }
2034
Guido van Rossum79f25d91997-04-29 20:08:16 +00002035 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002036 return NULL;
2037
Guido van Rossum12d12c51993-10-26 17:58:25 +00002038 return result;
2039
Guido van Rossum12d12c51993-10-26 17:58:25 +00002040Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002041 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002042 return NULL;
2043}
2044
2045
Guido van Rossume77a7571993-11-03 15:01:26 +00002046/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00002047
Guido van Rossum79f25d91997-04-29 20:08:16 +00002048static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00002049filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002050 PyObject *func;
2051 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002052{
Guido van Rossum79f25d91997-04-29 20:08:16 +00002053 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002054 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002055 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002056
Guido van Rossum79f25d91997-04-29 20:08:16 +00002057 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00002058 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00002059 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00002060 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002061 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00002062 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00002063 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002064
Guido van Rossum12d12c51993-10-26 17:58:25 +00002065 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00002066 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002067 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00002068
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002069 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
2070 if (item == NULL)
2071 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002072 arg = Py_BuildValue("(O)", item);
2073 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002074 if (arg == NULL)
2075 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002076 good = PyEval_CallObject(func, arg);
2077 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002078 if (good == NULL)
2079 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00002080 ok = PyObject_IsTrue(good);
2081 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00002082 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00002083 PyString_AS_STRING((PyStringObject *)result)[j++] =
2084 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00002085 }
2086
Guido van Rossum79f25d91997-04-29 20:08:16 +00002087 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00002088 return NULL;
2089
Guido van Rossum12d12c51993-10-26 17:58:25 +00002090 return result;
2091
Guido van Rossum12d12c51993-10-26 17:58:25 +00002092Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00002093 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00002094 return NULL;
2095}
Guido van Rossumc6472e91997-03-31 17:15:43 +00002096
2097/* Copied with modifications from stropmodule.c: atoi,atof.atol */
2098
2099static PyObject *
2100int_from_string(v)
2101 PyObject *v;
2102{
2103 extern long PyOS_strtol Py_PROTO((const char *, char **, int));
2104 char *s, *end;
2105 long x;
2106 char buffer[256]; /* For errors */
2107
Guido van Rossum8f745711998-03-13 21:30:14 +00002108 s = PyString_AS_STRING(v);
Guido van Rossumc6472e91997-03-31 17:15:43 +00002109 while (*s && isspace(Py_CHARMASK(*s)))
2110 s++;
2111 if (s[0] == '\0') {
2112 PyErr_SetString(PyExc_ValueError, "empty string for int()");
2113 return NULL;
2114 }
2115 errno = 0;
2116 x = PyOS_strtol(s, &end, 10);
2117 while (*end && isspace(Py_CHARMASK(*end)))
2118 end++;
2119 if (*end != '\0') {
2120 sprintf(buffer, "invalid literal for int(): %.200s", s);
2121 PyErr_SetString(PyExc_ValueError, buffer);
2122 return NULL;
2123 }
Guido van Rossum8f745711998-03-13 21:30:14 +00002124 else if (end-s != PyString_GET_SIZE(v)) {
2125 PyErr_SetString(PyExc_ValueError,
2126 "null byte in argument for int()");
2127 return NULL;
2128 }
Guido van Rossumc6472e91997-03-31 17:15:43 +00002129 else if (errno != 0) {
2130 sprintf(buffer, "int() literal too large: %.200s", s);
2131 PyErr_SetString(PyExc_ValueError, buffer);
2132 return NULL;
2133 }
2134 return PyInt_FromLong(x);
2135}
2136
2137static PyObject *
2138long_from_string(v)
2139 PyObject *v;
2140{
2141 char *s, *end;
2142 PyObject *x;
2143 char buffer[256]; /* For errors */
2144
Guido van Rossum8f745711998-03-13 21:30:14 +00002145 s = PyString_AS_STRING(v);
Guido van Rossumc6472e91997-03-31 17:15:43 +00002146 while (*s && isspace(Py_CHARMASK(*s)))
2147 s++;
2148 if (s[0] == '\0') {
2149 PyErr_SetString(PyExc_ValueError, "empty string for long()");
2150 return NULL;
2151 }
2152 x = PyLong_FromString(s, &end, 10);
2153 if (x == NULL)
2154 return NULL;
2155 while (*end && isspace(Py_CHARMASK(*end)))
2156 end++;
2157 if (*end != '\0') {
2158 sprintf(buffer, "invalid literal for long(): %.200s", s);
2159 PyErr_SetString(PyExc_ValueError, buffer);
2160 Py_DECREF(x);
2161 return NULL;
2162 }
Guido van Rossum8f745711998-03-13 21:30:14 +00002163 else if (end-s != PyString_GET_SIZE(v)) {
2164 PyErr_SetString(PyExc_ValueError,
2165 "null byte in argument for float()");
2166 return NULL;
2167 }
Guido van Rossumc6472e91997-03-31 17:15:43 +00002168 return x;
2169}
2170
2171static PyObject *
2172float_from_string(v)
2173 PyObject *v;
2174{
2175 extern double strtod Py_PROTO((const char *, char **));
2176 char *s, *end;
2177 double x;
2178 char buffer[256]; /* For errors */
2179
Guido van Rossum8f745711998-03-13 21:30:14 +00002180 s = PyString_AS_STRING(v);
Guido van Rossumc6472e91997-03-31 17:15:43 +00002181 while (*s && isspace(Py_CHARMASK(*s)))
2182 s++;
2183 if (s[0] == '\0') {
2184 PyErr_SetString(PyExc_ValueError, "empty string for float()");
2185 return NULL;
2186 }
2187 errno = 0;
2188 PyFPE_START_PROTECT("float_from_string", return 0)
2189 x = strtod(s, &end);
2190 PyFPE_END_PROTECT(x)
2191 while (*end && isspace(Py_CHARMASK(*end)))
2192 end++;
2193 if (*end != '\0') {
2194 sprintf(buffer, "invalid literal for float(): %.200s", s);
2195 PyErr_SetString(PyExc_ValueError, buffer);
2196 return NULL;
2197 }
Guido van Rossum8f745711998-03-13 21:30:14 +00002198 else if (end-s != PyString_GET_SIZE(v)) {
2199 PyErr_SetString(PyExc_ValueError,
2200 "null byte in argument for float()");
2201 return NULL;
2202 }
Guido van Rossumc6472e91997-03-31 17:15:43 +00002203 else if (errno != 0) {
2204 sprintf(buffer, "float() literal too large: %.200s", s);
2205 PyErr_SetString(PyExc_ValueError, buffer);
2206 return NULL;
2207 }
2208 return PyFloat_FromDouble(x);
2209}