blob: 7ca72ed4c5144fa2dcec500b944865906db5b9fd [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 *));
Guido van Rossum12d12c51993-10-26 17:58:25 +000051
Guido van Rossum79f25d91997-04-29 20:08:16 +000052static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000053builtin___import__(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000054 PyObject *self;
55 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +000056{
Guido van Rossum1ae940a1995-01-02 19:04:15 +000057 char *name;
Guido van Rossum79f25d91997-04-29 20:08:16 +000058 PyObject *globals = NULL;
59 PyObject *locals = NULL;
60 PyObject *fromlist = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000061
Guido van Rossum79f25d91997-04-29 20:08:16 +000062 if (!PyArg_ParseTuple(args, "s|OOO:__import__",
Guido van Rossum24c13741995-02-14 09:42:43 +000063 &name, &globals, &locals, &fromlist))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000064 return NULL;
Guido van Rossumaee0bad1997-09-05 07:33:22 +000065 return PyImport_ImportModuleEx(name, globals, locals, fromlist);
Guido van Rossum1ae940a1995-01-02 19:04:15 +000066}
67
68
Guido van Rossum79f25d91997-04-29 20:08:16 +000069static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +000070builtin_abs(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000071 PyObject *self;
72 PyObject *args;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000073{
Guido van Rossum79f25d91997-04-29 20:08:16 +000074 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000075
Guido van Rossum79f25d91997-04-29 20:08:16 +000076 if (!PyArg_ParseTuple(args, "O:abs", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +000077 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +000078 return PyNumber_Absolute(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +000079}
80
Guido van Rossum79f25d91997-04-29 20:08:16 +000081static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +000082builtin_apply(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +000083 PyObject *self;
84 PyObject *args;
Guido van Rossumc02e15c1991-12-16 13:03:00 +000085{
Guido van Rossum79f25d91997-04-29 20:08:16 +000086 PyObject *func, *alist = NULL, *kwdict = NULL;
Guido van Rossum1ae940a1995-01-02 19:04:15 +000087
Guido van Rossum79f25d91997-04-29 20:08:16 +000088 if (!PyArg_ParseTuple(args, "O|OO:apply", &func, &alist, &kwdict))
Guido van Rossumc02e15c1991-12-16 13:03:00 +000089 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +000090 if (alist != NULL && !PyTuple_Check(alist)) {
91 PyErr_SetString(PyExc_TypeError,
92 "apply() 2nd argument must be tuple");
Guido van Rossum2d951851994-08-29 12:52:16 +000093 return NULL;
94 }
Guido van Rossum79f25d91997-04-29 20:08:16 +000095 if (kwdict != NULL && !PyDict_Check(kwdict)) {
96 PyErr_SetString(PyExc_TypeError,
Guido van Rossum681d79a1995-07-18 14:51:37 +000097 "apply() 3rd argument must be dictionary");
98 return NULL;
99 }
100 return PyEval_CallObjectWithKeywords(func, alist, kwdict);
Guido van Rossumc02e15c1991-12-16 13:03:00 +0000101}
102
Guido van Rossum79f25d91997-04-29 20:08:16 +0000103static PyObject *
Guido van Rossum2d951851994-08-29 12:52:16 +0000104builtin_callable(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000105 PyObject *self;
106 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +0000107{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000108 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000109
Guido van Rossum79f25d91997-04-29 20:08:16 +0000110 if (!PyArg_ParseTuple(args, "O:callable", &v))
Guido van Rossum2d951851994-08-29 12:52:16 +0000111 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000112 return PyInt_FromLong((long)PyCallable_Check(v));
Guido van Rossum2d951851994-08-29 12:52:16 +0000113}
114
Guido van Rossum79f25d91997-04-29 20:08:16 +0000115static PyObject *
Guido van Rossume77a7571993-11-03 15:01:26 +0000116builtin_filter(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000117 PyObject *self;
118 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000119{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000120 PyObject *func, *seq, *result;
121 PySequenceMethods *sqf;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000122 int len;
123 register int i, j;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000124
Guido van Rossum79f25d91997-04-29 20:08:16 +0000125 if (!PyArg_ParseTuple(args, "OO:filter", &func, &seq))
Guido van Rossum12d12c51993-10-26 17:58:25 +0000126 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000127
Guido van Rossum79f25d91997-04-29 20:08:16 +0000128 if (PyString_Check(seq)) {
129 PyObject *r = filterstring(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000130 return r;
131 }
132
Guido van Rossum79f25d91997-04-29 20:08:16 +0000133 if (PyTuple_Check(seq)) {
134 PyObject *r = filtertuple(func, seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000135 return r;
136 }
137
Guido van Rossum09df08a1998-05-22 00:51:39 +0000138 sqf = seq->ob_type->tp_as_sequence;
139 if (sqf == NULL || sqf->sq_length == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000140 PyErr_SetString(PyExc_TypeError,
Guido van Rossume77a7571993-11-03 15:01:26 +0000141 "argument 2 to filter() must be a sequence type");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000142 goto Fail_2;
143 }
144
145 if ((len = (*sqf->sq_length)(seq)) < 0)
146 goto Fail_2;
147
Guido van Rossum79f25d91997-04-29 20:08:16 +0000148 if (PyList_Check(seq) && seq->ob_refcnt == 1) {
149 Py_INCREF(seq);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000150 result = seq;
151 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000152 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000153 if ((result = PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000154 goto Fail_2;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000155 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000156
Guido van Rossum2d951851994-08-29 12:52:16 +0000157 for (i = j = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000158 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000159 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000160
Guido van Rossum2d951851994-08-29 12:52:16 +0000161 if ((item = (*sqf->sq_item)(seq, i)) == NULL) {
162 if (i < len)
163 goto Fail_1;
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000164 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000165 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000166 break;
167 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000168 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000169 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000170
Guido van Rossum79f25d91997-04-29 20:08:16 +0000171 if (func == Py_None) {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000172 good = item;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000173 Py_INCREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000174 }
175 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000176 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000177 if (arg == NULL)
178 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000179 good = PyEval_CallObject(func, arg);
180 Py_DECREF(arg);
Guido van Rossum58b68731995-01-10 17:40:55 +0000181 if (good == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000182 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000183 goto Fail_1;
Guido van Rossum58b68731995-01-10 17:40:55 +0000184 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000185 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000186 ok = PyObject_IsTrue(good);
187 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000188 if (ok) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000189 if (j < len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000190 if (PyList_SetItem(result, j++, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000191 goto Fail_1;
192 }
193 else {
194 j++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000195 if (PyList_Append(result, item) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000196 goto Fail_1;
197 }
Guido van Rossum58b68731995-01-10 17:40:55 +0000198 } else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000199 Py_DECREF(item);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000200 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000201 }
202
Guido van Rossum12d12c51993-10-26 17:58:25 +0000203
Guido van Rossum79f25d91997-04-29 20:08:16 +0000204 if (j < len && PyList_SetSlice(result, j, len, NULL) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000205 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000206
Guido van Rossum12d12c51993-10-26 17:58:25 +0000207 return result;
208
Guido van Rossum12d12c51993-10-26 17:58:25 +0000209Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000210 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000211Fail_2:
Guido van Rossum12d12c51993-10-26 17:58:25 +0000212 return NULL;
213}
214
Guido van Rossum79f25d91997-04-29 20:08:16 +0000215static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000216builtin_chr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000217 PyObject *self;
218 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000219{
220 long x;
221 char s[1];
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000222
Guido van Rossum79f25d91997-04-29 20:08:16 +0000223 if (!PyArg_ParseTuple(args, "l:chr", &x))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000224 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000225 if (x < 0 || x >= 256) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000226 PyErr_SetString(PyExc_ValueError,
227 "chr() arg not in range(256)");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000228 return NULL;
229 }
Guido van Rossum6bf62da1997-04-11 20:37:35 +0000230 s[0] = (char)x;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000231 return PyString_FromStringAndSize(s, 1);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000232}
233
Guido van Rossum79f25d91997-04-29 20:08:16 +0000234static PyObject *
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000235builtin_cmp(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000236 PyObject *self;
237 PyObject *args;
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000238{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000239 PyObject *a, *b;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000240 int c;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000241
Guido van Rossum79f25d91997-04-29 20:08:16 +0000242 if (!PyArg_ParseTuple(args, "OO:cmp", &a, &b))
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000243 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000244 if (PyObject_Cmp(a, b, &c) < 0)
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000245 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000246 return PyInt_FromLong((long)c);
Guido van Rossuma9e7dc11992-10-18 18:53:57 +0000247}
248
Guido van Rossum79f25d91997-04-29 20:08:16 +0000249static PyObject *
Guido van Rossum5524a591995-01-10 15:26:20 +0000250builtin_coerce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000251 PyObject *self;
252 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000253{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000254 PyObject *v, *w;
255 PyObject *res;
Guido van Rossum5524a591995-01-10 15:26:20 +0000256
Guido van Rossum79f25d91997-04-29 20:08:16 +0000257 if (!PyArg_ParseTuple(args, "OO:coerce", &v, &w))
Guido van Rossum5524a591995-01-10 15:26:20 +0000258 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000259 if (PyNumber_Coerce(&v, &w) < 0)
Guido van Rossum04691fc1992-08-12 15:35:34 +0000260 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000261 res = Py_BuildValue("(OO)", v, w);
262 Py_DECREF(v);
263 Py_DECREF(w);
Guido van Rossum04691fc1992-08-12 15:35:34 +0000264 return res;
265}
266
Guido van Rossum79f25d91997-04-29 20:08:16 +0000267static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000268builtin_compile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000269 PyObject *self;
270 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000271{
272 char *str;
273 char *filename;
274 char *startstr;
275 int start;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000276
Guido van Rossum79f25d91997-04-29 20:08:16 +0000277 if (!PyArg_ParseTuple(args, "sss:compile", &str, &filename, &startstr))
Guido van Rossum5b722181993-03-30 17:46:03 +0000278 return NULL;
279 if (strcmp(startstr, "exec") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000280 start = Py_file_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000281 else if (strcmp(startstr, "eval") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000282 start = Py_eval_input;
Guido van Rossum872537c1995-07-07 22:43:42 +0000283 else if (strcmp(startstr, "single") == 0)
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000284 start = Py_single_input;
Guido van Rossum5b722181993-03-30 17:46:03 +0000285 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000286 PyErr_SetString(PyExc_ValueError,
Guido van Rossum872537c1995-07-07 22:43:42 +0000287 "compile() mode must be 'exec' or 'eval' or 'single'");
Guido van Rossum5b722181993-03-30 17:46:03 +0000288 return NULL;
289 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000290 return Py_CompileString(str, filename, start);
Guido van Rossum5b722181993-03-30 17:46:03 +0000291}
292
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000293#ifndef WITHOUT_COMPLEX
294
Guido van Rossum79f25d91997-04-29 20:08:16 +0000295static PyObject *
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000296builtin_complex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000297 PyObject *self;
298 PyObject *args;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000299{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000300 PyObject *r, *i, *tmp;
301 PyNumberMethods *nbr, *nbi = NULL;
Guido van Rossum530956d1996-07-21 02:27:43 +0000302 Py_complex cr, ci;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000303 int own_r = 0;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000304
305 i = NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000306 if (!PyArg_ParseTuple(args, "O|O:complex", &r, &i))
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000307 return NULL;
308 if ((nbr = r->ob_type->tp_as_number) == NULL ||
Guido van Rossumc6472e91997-03-31 17:15:43 +0000309 nbr->nb_float == NULL ||
310 (i != NULL &&
311 ((nbi = i->ob_type->tp_as_number) == NULL ||
312 nbi->nb_float == NULL))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000313 PyErr_SetString(PyExc_TypeError,
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000314 "complex() argument can't be converted to complex");
315 return NULL;
316 }
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000317 /* XXX Hack to support classes with __complex__ method */
Guido van Rossum79f25d91997-04-29 20:08:16 +0000318 if (PyInstance_Check(r)) {
319 static PyObject *complexstr;
320 PyObject *f;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000321 if (complexstr == NULL) {
Guido van Rossum8d751611997-01-18 08:04:16 +0000322 complexstr = PyString_InternFromString("__complex__");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000323 if (complexstr == NULL)
324 return NULL;
325 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000326 f = PyObject_GetAttr(r, complexstr);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000327 if (f == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000328 PyErr_Clear();
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000329 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000330 PyObject *args = Py_BuildValue("()");
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000331 if (args == NULL)
332 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000333 r = PyEval_CallObject(f, args);
334 Py_DECREF(args);
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000335 if (r == NULL)
336 return NULL;
Guido van Rossumc6472e91997-03-31 17:15:43 +0000337 own_r = 1;
Guido van Rossumed0af8f1996-12-05 23:18:18 +0000338 }
339 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000340 if (PyComplex_Check(r)) {
341 cr = ((PyComplexObject*)r)->cval;
Guido van Rossum730806d1998-04-10 22:27:42 +0000342 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000343 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000344 }
Guido van Rossumc6472e91997-03-31 17:15:43 +0000345 }
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000346 else {
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000347 tmp = (*nbr->nb_float)(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000348 if (own_r) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000349 Py_DECREF(r);
Guido van Rossum730806d1998-04-10 22:27:42 +0000350 }
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000351 if (tmp == NULL)
352 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000353 cr.real = PyFloat_AsDouble(tmp);
354 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000355 cr.imag = 0.;
356 }
357 if (i == NULL) {
358 ci.real = 0.;
359 ci.imag = 0.;
360 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000361 else if (PyComplex_Check(i))
362 ci = ((PyComplexObject*)i)->cval;
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000363 else {
Guido van Rossumc6472e91997-03-31 17:15:43 +0000364 tmp = (*nbi->nb_float)(i);
Guido van Rossumfe4b6ee1996-08-08 18:49:41 +0000365 if (tmp == NULL)
366 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000367 ci.real = PyFloat_AsDouble(tmp);
368 Py_DECREF(tmp);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000369 ci.imag = 0.;
370 }
371 cr.real -= ci.imag;
372 cr.imag += ci.real;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000373 return PyComplex_FromCComplex(cr);
Guido van Rossum8a5c5d21996-01-12 01:09:56 +0000374}
375
376#endif
377
Guido van Rossum79f25d91997-04-29 20:08:16 +0000378static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000379builtin_dir(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000380 PyObject *self;
381 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000382{
Guido van Rossum666b17a1997-05-06 16:36:57 +0000383 static char *attrlist[] = {"__members__", "__methods__", NULL};
384 PyObject *v = NULL, *l = NULL, *m = NULL;
385 PyObject *d, *x;
386 int i;
387 char **s;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000388
Guido van Rossum79f25d91997-04-29 20:08:16 +0000389 if (!PyArg_ParseTuple(args, "|O:dir", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000390 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000391 if (v == NULL) {
Guido van Rossum666b17a1997-05-06 16:36:57 +0000392 x = PyEval_GetLocals();
393 if (x == NULL)
394 goto error;
395 l = PyMapping_Keys(x);
396 if (l == NULL)
397 goto error;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000398 }
399 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000400 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum666b17a1997-05-06 16:36:57 +0000401 if (d == NULL)
Guido van Rossum795ba581996-05-23 22:49:07 +0000402 PyErr_Clear();
Guido van Rossum666b17a1997-05-06 16:36:57 +0000403 else {
404 l = PyMapping_Keys(d);
405 if (l == NULL)
406 PyErr_Clear();
407 Py_DECREF(d);
408 }
409 if (l == NULL) {
410 l = PyList_New(0);
411 if (l == NULL)
412 goto error;
413 }
414 for (s = attrlist; *s != NULL; s++) {
415 m = PyObject_GetAttrString(v, *s);
416 if (m == NULL) {
417 PyErr_Clear();
418 continue;
419 }
420 for (i = 0; ; i++) {
421 x = PySequence_GetItem(m, i);
422 if (x == NULL) {
423 PyErr_Clear();
424 break;
425 }
426 if (PyList_Append(l, x) != 0) {
427 Py_DECREF(x);
428 Py_DECREF(m);
429 goto error;
430 }
431 Py_DECREF(x);
432 }
433 Py_DECREF(m);
Guido van Rossum795ba581996-05-23 22:49:07 +0000434 }
Guido van Rossum006bcd41991-10-24 14:54:44 +0000435 }
Guido van Rossum666b17a1997-05-06 16:36:57 +0000436 if (PyList_Sort(l) != 0)
437 goto error;
438 return l;
439 error:
440 Py_XDECREF(l);
441 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000442}
443
Guido van Rossum79f25d91997-04-29 20:08:16 +0000444static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000445builtin_divmod(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000446 PyObject *self;
447 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000448{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000449 PyObject *v, *w;
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000450
Guido van Rossum79f25d91997-04-29 20:08:16 +0000451 if (!PyArg_ParseTuple(args, "OO:divmod", &v, &w))
Guido van Rossum6a00cd81995-01-07 12:39:01 +0000452 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000453 return PyNumber_Divmod(v, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000454}
455
Guido van Rossum79f25d91997-04-29 20:08:16 +0000456static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000457builtin_eval(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000458 PyObject *self;
459 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000460{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000461 PyObject *cmd;
462 PyObject *globals = Py_None, *locals = Py_None;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000463 char *str;
Guido van Rossum590baa41993-11-30 13:40:46 +0000464
Guido van Rossum79f25d91997-04-29 20:08:16 +0000465 if (!PyArg_ParseTuple(args, "O|O!O!:eval",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000466 &cmd,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000467 &PyDict_Type, &globals,
468 &PyDict_Type, &locals))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000469 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000470 if (globals == Py_None) {
471 globals = PyEval_GetGlobals();
472 if (locals == Py_None)
473 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000474 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000475 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000476 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000477 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
478 if (PyDict_SetItemString(globals, "__builtins__",
479 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000480 return NULL;
481 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000482 if (PyCode_Check(cmd))
483 return PyEval_EvalCode((PyCodeObject *) cmd, globals, locals);
484 if (!PyString_Check(cmd)) {
485 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000486 "eval() argument 1 must be string or code object");
Guido van Rossum94390a41992-08-14 15:14:30 +0000487 return NULL;
488 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000489 str = PyString_AsString(cmd);
490 if ((int)strlen(str) != PyString_Size(cmd)) {
491 PyErr_SetString(PyExc_ValueError,
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000492 "embedded '\\0' in string arg");
493 return NULL;
Guido van Rossumf08ab0a1992-03-04 16:41:41 +0000494 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000495 while (*str == ' ' || *str == '\t')
496 str++;
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000497 return PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000498}
499
Guido van Rossum79f25d91997-04-29 20:08:16 +0000500static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000501builtin_execfile(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000502 PyObject *self;
503 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000504{
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000505 char *filename;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000506 PyObject *globals = Py_None, *locals = Py_None;
507 PyObject *res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000508 FILE* fp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000509
Guido van Rossum79f25d91997-04-29 20:08:16 +0000510 if (!PyArg_ParseTuple(args, "s|O!O!:execfile",
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000511 &filename,
Guido van Rossum79f25d91997-04-29 20:08:16 +0000512 &PyDict_Type, &globals,
513 &PyDict_Type, &locals))
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000514 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000515 if (globals == Py_None) {
516 globals = PyEval_GetGlobals();
517 if (locals == Py_None)
518 locals = PyEval_GetLocals();
Guido van Rossum6135a871995-01-09 17:53:26 +0000519 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000520 else if (locals == Py_None)
Guido van Rossum6135a871995-01-09 17:53:26 +0000521 locals = globals;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000522 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
523 if (PyDict_SetItemString(globals, "__builtins__",
524 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000525 return NULL;
526 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000527 Py_BEGIN_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000528 fp = fopen(filename, "r");
Guido van Rossum79f25d91997-04-29 20:08:16 +0000529 Py_END_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000530 if (fp == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000531 PyErr_SetFromErrno(PyExc_IOError);
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000532 return NULL;
533 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000534 res = PyRun_File(fp, filename, Py_file_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000535 Py_BEGIN_ALLOW_THREADS
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000536 fclose(fp);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000537 Py_END_ALLOW_THREADS
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000538 return res;
Guido van Rossum0f61f8a1992-02-25 18:55:05 +0000539}
540
Guido van Rossum79f25d91997-04-29 20:08:16 +0000541static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000542builtin_float(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000543 PyObject *self;
544 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000545{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000546 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000547
Guido van Rossum79f25d91997-04-29 20:08:16 +0000548 if (!PyArg_ParseTuple(args, "O:float", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000549 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000550 return PyNumber_Float(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000551}
552
Guido van Rossum79f25d91997-04-29 20:08:16 +0000553static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000554builtin_getattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000555 PyObject *self;
556 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000557{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000558 PyObject *v;
559 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000560
Guido van Rossum79f25d91997-04-29 20:08:16 +0000561 if (!PyArg_ParseTuple(args, "OS:getattr", &v, &name))
Guido van Rossum33894be1992-01-27 16:53:09 +0000562 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000563 return PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000564}
565
Guido van Rossum79f25d91997-04-29 20:08:16 +0000566static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000567builtin_globals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000568 PyObject *self;
569 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000570{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000571 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000572
Guido van Rossum79f25d91997-04-29 20:08:16 +0000573 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000574 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000575 d = PyEval_GetGlobals();
576 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000577 return d;
578}
579
Guido van Rossum79f25d91997-04-29 20:08:16 +0000580static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000581builtin_hasattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000582 PyObject *self;
583 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000584{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000585 PyObject *v;
586 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000587
Guido van Rossum79f25d91997-04-29 20:08:16 +0000588 if (!PyArg_ParseTuple(args, "OS:hasattr", &v, &name))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000589 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000590 v = PyObject_GetAttr(v, name);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000591 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000592 PyErr_Clear();
Guido van Rossum09df08a1998-05-22 00:51:39 +0000593 Py_INCREF(Py_False);
594 return Py_False;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000595 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000596 Py_DECREF(v);
Guido van Rossum09df08a1998-05-22 00:51:39 +0000597 Py_INCREF(Py_True);
598 return Py_True;
Guido van Rossum33894be1992-01-27 16:53:09 +0000599}
600
Guido van Rossum79f25d91997-04-29 20:08:16 +0000601static PyObject *
Guido van Rossum5b722181993-03-30 17:46:03 +0000602builtin_id(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000603 PyObject *self;
604 PyObject *args;
Guido van Rossum5b722181993-03-30 17:46:03 +0000605{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000606 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000607
Guido van Rossum79f25d91997-04-29 20:08:16 +0000608 if (!PyArg_ParseTuple(args, "O:id", &v))
Guido van Rossum5b722181993-03-30 17:46:03 +0000609 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000610 return PyInt_FromLong((long)v);
Guido van Rossum5b722181993-03-30 17:46:03 +0000611}
612
Guido van Rossum79f25d91997-04-29 20:08:16 +0000613static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +0000614builtin_map(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000615 PyObject *self;
616 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000617{
618 typedef struct {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000619 PyObject *seq;
620 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000621 int len;
622 } sequence;
623
Guido van Rossum79f25d91997-04-29 20:08:16 +0000624 PyObject *func, *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000625 sequence *seqs = NULL, *sqp;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000626 int n, len;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000627 register int i, j;
628
Guido van Rossum79f25d91997-04-29 20:08:16 +0000629 n = PyTuple_Size(args);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000630 if (n < 2) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000631 PyErr_SetString(PyExc_TypeError,
632 "map() requires at least two args");
Guido van Rossum12d12c51993-10-26 17:58:25 +0000633 return NULL;
634 }
635
Guido van Rossum79f25d91997-04-29 20:08:16 +0000636 func = PyTuple_GetItem(args, 0);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000637 n--;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000638
Guido van Rossum79f25d91997-04-29 20:08:16 +0000639 if ((seqs = PyMem_NEW(sequence, n)) == NULL) {
640 PyErr_NoMemory();
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000641 goto Fail_2;
642 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000643
Guido van Rossum2d951851994-08-29 12:52:16 +0000644 for (len = 0, i = 0, sqp = seqs; i < n; ++i, ++sqp) {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000645 int curlen;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000646 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000647
Guido van Rossum79f25d91997-04-29 20:08:16 +0000648 if ((sqp->seq = PyTuple_GetItem(args, i + 1)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000649 goto Fail_2;
650
Guido van Rossum09df08a1998-05-22 00:51:39 +0000651 sqp->sqf = sqf = sqp->seq->ob_type->tp_as_sequence;
652 if (sqf == NULL ||
653 sqf->sq_length == NULL ||
654 sqf->sq_item == NULL)
655 {
Guido van Rossum12d12c51993-10-26 17:58:25 +0000656 static char errmsg[] =
657 "argument %d to map() must be a sequence object";
Guido van Rossum15e33a41997-04-30 19:00:27 +0000658 char errbuf[sizeof(errmsg) + 25];
Guido van Rossum12d12c51993-10-26 17:58:25 +0000659
660 sprintf(errbuf, errmsg, i+2);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000661 PyErr_SetString(PyExc_TypeError, errbuf);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000662 goto Fail_2;
663 }
664
665 if ((curlen = sqp->len = (*sqp->sqf->sq_length)(sqp->seq)) < 0)
666 goto Fail_2;
667
668 if (curlen > len)
669 len = curlen;
670 }
671
Guido van Rossum79f25d91997-04-29 20:08:16 +0000672 if ((result = (PyObject *) PyList_New(len)) == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +0000673 goto Fail_2;
674
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000675 /* XXX Special case map(None, single_list) could be more efficient */
Guido van Rossum2d951851994-08-29 12:52:16 +0000676 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000677 PyObject *alist, *item=NULL, *value;
Guido van Rossum2d951851994-08-29 12:52:16 +0000678 int any = 0;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000679
Guido van Rossum79f25d91997-04-29 20:08:16 +0000680 if (func == Py_None && n == 1)
Guido van Rossum32120311995-07-10 13:52:21 +0000681 alist = NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +0000682 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000683 if ((alist = PyTuple_New(n)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +0000684 goto Fail_1;
685 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000686
687 for (j = 0, sqp = seqs; j < n; ++j, ++sqp) {
Guido van Rossum2d951851994-08-29 12:52:16 +0000688 if (sqp->len < 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000689 Py_INCREF(Py_None);
690 item = Py_None;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000691 }
Guido van Rossum12d12c51993-10-26 17:58:25 +0000692 else {
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000693 item = (*sqp->sqf->sq_item)(sqp->seq, i);
Guido van Rossum2d951851994-08-29 12:52:16 +0000694 if (item == NULL) {
695 if (i < sqp->len)
696 goto Fail_0;
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000697 if (PyErr_ExceptionMatches(
698 PyExc_IndexError))
699 {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000700 PyErr_Clear();
701 Py_INCREF(Py_None);
702 item = Py_None;
Guido van Rossum2d951851994-08-29 12:52:16 +0000703 sqp->len = -1;
704 }
705 else {
706 goto Fail_0;
707 }
708 }
709 else
710 any = 1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000711
Guido van Rossum12d12c51993-10-26 17:58:25 +0000712 }
Guido van Rossum32120311995-07-10 13:52:21 +0000713 if (!alist)
Guido van Rossum2d951851994-08-29 12:52:16 +0000714 break;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000715 if (PyTuple_SetItem(alist, j, item) < 0) {
716 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000717 goto Fail_0;
Guido van Rossum2d951851994-08-29 12:52:16 +0000718 }
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000719 continue;
720
721 Fail_0:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000722 Py_XDECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000723 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000724 }
725
Guido van Rossum32120311995-07-10 13:52:21 +0000726 if (!alist)
727 alist = item;
Guido van Rossum2d951851994-08-29 12:52:16 +0000728
729 if (!any) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000730 Py_DECREF(alist);
Guido van Rossum2d951851994-08-29 12:52:16 +0000731 break;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000732 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000733
Guido van Rossum79f25d91997-04-29 20:08:16 +0000734 if (func == Py_None)
Guido van Rossum32120311995-07-10 13:52:21 +0000735 value = alist;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000736 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000737 value = PyEval_CallObject(func, alist);
738 Py_DECREF(alist);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000739 if (value == NULL)
740 goto Fail_1;
Guido van Rossum2d951851994-08-29 12:52:16 +0000741 }
742 if (i >= len) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000743 if (PyList_Append(result, value) < 0)
Guido van Rossum2d951851994-08-29 12:52:16 +0000744 goto Fail_1;
745 }
746 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000747 if (PyList_SetItem(result, i, value) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +0000748 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +0000749 }
750 }
751
Guido van Rossum79f25d91997-04-29 20:08:16 +0000752 PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000753 return result;
754
Guido van Rossum12d12c51993-10-26 17:58:25 +0000755Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000756 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000757Fail_2:
Guido van Rossum79f25d91997-04-29 20:08:16 +0000758 if (seqs) PyMem_DEL(seqs);
Guido van Rossum12d12c51993-10-26 17:58:25 +0000759 return NULL;
760}
761
Guido van Rossum79f25d91997-04-29 20:08:16 +0000762static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +0000763builtin_setattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000764 PyObject *self;
765 PyObject *args;
Guido van Rossum33894be1992-01-27 16:53:09 +0000766{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000767 PyObject *v;
768 PyObject *name;
769 PyObject *value;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000770
Guido van Rossum79f25d91997-04-29 20:08:16 +0000771 if (!PyArg_ParseTuple(args, "OSO:setattr", &v, &name, &value))
Guido van Rossum33894be1992-01-27 16:53:09 +0000772 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000773 if (PyObject_SetAttr(v, name, value) != 0)
Guido van Rossum33894be1992-01-27 16:53:09 +0000774 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000775 Py_INCREF(Py_None);
776 return Py_None;
Guido van Rossum33894be1992-01-27 16:53:09 +0000777}
778
Guido van Rossum79f25d91997-04-29 20:08:16 +0000779static PyObject *
Guido van Rossum14144fc1994-08-29 12:53:40 +0000780builtin_delattr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000781 PyObject *self;
782 PyObject *args;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000783{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000784 PyObject *v;
785 PyObject *name;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000786
Guido van Rossum79f25d91997-04-29 20:08:16 +0000787 if (!PyArg_ParseTuple(args, "OS:delattr", &v, &name))
Guido van Rossum14144fc1994-08-29 12:53:40 +0000788 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000789 if (PyObject_SetAttr(v, name, (PyObject *)NULL) != 0)
Guido van Rossum14144fc1994-08-29 12:53:40 +0000790 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000791 Py_INCREF(Py_None);
792 return Py_None;
Guido van Rossum14144fc1994-08-29 12:53:40 +0000793}
794
Guido van Rossum79f25d91997-04-29 20:08:16 +0000795static PyObject *
Guido van Rossum9bfef441993-03-29 10:43:31 +0000796builtin_hash(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000797 PyObject *self;
798 PyObject *args;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000799{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000800 PyObject *v;
Guido van Rossum9bfef441993-03-29 10:43:31 +0000801 long x;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000802
Guido van Rossum79f25d91997-04-29 20:08:16 +0000803 if (!PyArg_ParseTuple(args, "O:hash", &v))
Guido van Rossum9bfef441993-03-29 10:43:31 +0000804 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000805 x = PyObject_Hash(v);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000806 if (x == -1)
807 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000808 return PyInt_FromLong(x);
Guido van Rossum9bfef441993-03-29 10:43:31 +0000809}
810
Guido van Rossum79f25d91997-04-29 20:08:16 +0000811static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000812builtin_hex(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000813 PyObject *self;
814 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000815{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000816 PyObject *v;
817 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000818
Guido van Rossum79f25d91997-04-29 20:08:16 +0000819 if (!PyArg_ParseTuple(args, "O:hex", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000820 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000821
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000822 if ((nb = v->ob_type->tp_as_number) == NULL ||
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000823 nb->nb_hex == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000824 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000825 "hex() argument can't be converted to hex");
826 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +0000827 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000828 return (*nb->nb_hex)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +0000829}
830
Guido van Rossum79f25d91997-04-29 20:08:16 +0000831static PyObject *builtin_raw_input Py_PROTO((PyObject *, PyObject *));
Guido van Rossum3165fe61992-09-25 21:59:05 +0000832
Guido van Rossum79f25d91997-04-29 20:08:16 +0000833static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000834builtin_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000835 PyObject *self;
836 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000837{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000838 PyObject *line;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000839 char *str;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000840 PyObject *res;
841 PyObject *globals, *locals;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000842
843 line = builtin_raw_input(self, args);
Guido van Rossum3165fe61992-09-25 21:59:05 +0000844 if (line == NULL)
845 return line;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000846 if (!PyArg_Parse(line, "s;embedded '\\0' in input line", &str))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000847 return NULL;
848 while (*str == ' ' || *str == '\t')
849 str++;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000850 globals = PyEval_GetGlobals();
851 locals = PyEval_GetLocals();
852 if (PyDict_GetItemString(globals, "__builtins__") == NULL) {
853 if (PyDict_SetItemString(globals, "__builtins__",
854 PyEval_GetBuiltins()) != 0)
Guido van Rossum6135a871995-01-09 17:53:26 +0000855 return NULL;
856 }
Guido van Rossumb05a5c71997-05-07 17:46:13 +0000857 res = PyRun_String(str, Py_eval_input, globals, locals);
Guido van Rossum79f25d91997-04-29 20:08:16 +0000858 Py_DECREF(line);
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000859 return res;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000860}
861
Guido van Rossume8811f81997-02-14 15:48:05 +0000862static PyObject *
863builtin_intern(self, args)
864 PyObject *self;
865 PyObject *args;
866{
867 PyObject *s;
868 if (!PyArg_ParseTuple(args, "S", &s))
869 return NULL;
870 Py_INCREF(s);
871 PyString_InternInPlace(&s);
872 return s;
873}
874
Guido van Rossum79f25d91997-04-29 20:08:16 +0000875static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000876builtin_int(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000877 PyObject *self;
878 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000879{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000880 PyObject *v;
881 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000882
Guido van Rossum79f25d91997-04-29 20:08:16 +0000883 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000884 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000885 return PyNumber_Int(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000886}
887
Guido van Rossum79f25d91997-04-29 20:08:16 +0000888static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000889builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000890 PyObject *self;
891 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000892{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000893 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000894
Guido van Rossum79f25d91997-04-29 20:08:16 +0000895 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000896 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000897 return PyInt_FromLong((long)PyObject_Length(v));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000898}
899
Guido van Rossum79f25d91997-04-29 20:08:16 +0000900static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000901builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000902 PyObject *self;
903 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000904{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000905 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +0000906
Guido van Rossum79f25d91997-04-29 20:08:16 +0000907 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000908 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000909 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +0000910}
911
Guido van Rossum8861b741996-07-30 16:49:37 +0000912
913static PyObject *
914builtin_slice(self, args)
915 PyObject *self;
916 PyObject *args;
917{
Guido van Rossum09df08a1998-05-22 00:51:39 +0000918 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +0000919
Guido van Rossum09df08a1998-05-22 00:51:39 +0000920 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000921
Guido van Rossum09df08a1998-05-22 00:51:39 +0000922 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
923 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000924
Guido van Rossum09df08a1998-05-22 00:51:39 +0000925 /* This swapping of stop and start is to maintain similarity with
926 range(). */
927 if (stop == NULL) {
928 stop = start;
929 start = NULL;
930 }
931 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +0000932}
933
Guido van Rossum79f25d91997-04-29 20:08:16 +0000934static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000935builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000936 PyObject *self;
937 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000938{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000939 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000940
Guido van Rossum79f25d91997-04-29 20:08:16 +0000941 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000942 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000943 d = PyEval_GetLocals();
944 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000945 return d;
946}
947
Guido van Rossum79f25d91997-04-29 20:08:16 +0000948static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000949builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000950 PyObject *self;
951 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000952{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000953 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000954
Guido van Rossum79f25d91997-04-29 20:08:16 +0000955 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000956 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000957 return PyNumber_Long(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000958}
959
Guido van Rossum79f25d91997-04-29 20:08:16 +0000960static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000961min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000962 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000963 int sign;
964{
Guido van Rossum2d951851994-08-29 12:52:16 +0000965 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000966 PyObject *v, *w, *x;
967 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000968
Guido van Rossum79f25d91997-04-29 20:08:16 +0000969 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000970 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000971 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000972 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000973 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000974 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000975 PyErr_SetString(PyExc_TypeError,
976 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000977 return NULL;
978 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000979 w = NULL;
980 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000981 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000982 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000983 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000984 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000985 break;
986 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000987 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +0000988 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000989 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000990 if (w == NULL)
991 w = x;
992 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000993 int c = PyObject_Compare(x, w);
994 if (c && PyErr_Occurred()) {
995 Py_DECREF(x);
996 Py_XDECREF(w);
997 return NULL;
998 }
999 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001000 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001001 w = x;
1002 }
1003 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001004 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001005 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001006 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001007 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001008 PyErr_SetString(PyExc_ValueError,
1009 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001010 return w;
1011}
1012
Guido van Rossum79f25d91997-04-29 20:08:16 +00001013static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001014builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001015 PyObject *self;
1016 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001017{
1018 return min_max(v, -1);
1019}
1020
Guido van Rossum79f25d91997-04-29 20:08:16 +00001021static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001022builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001023 PyObject *self;
1024 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001025{
1026 return min_max(v, 1);
1027}
1028
Guido van Rossum79f25d91997-04-29 20:08:16 +00001029static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001030builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001031 PyObject *self;
1032 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001033{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001034 PyObject *v;
1035 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001036
Guido van Rossum79f25d91997-04-29 20:08:16 +00001037 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001038 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001039 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1040 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001041 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001042 "oct() argument can't be converted to oct");
1043 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001044 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001045 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001046}
1047
Guido van Rossum79f25d91997-04-29 20:08:16 +00001048static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001049builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001050 PyObject *self;
1051 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001052{
Guido van Rossum2d951851994-08-29 12:52:16 +00001053 char *name;
1054 char *mode = "r";
1055 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001056 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001057
Guido van Rossum79f25d91997-04-29 20:08:16 +00001058 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001059 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001060 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001061 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001062 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001063 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001064}
1065
Guido van Rossum79f25d91997-04-29 20:08:16 +00001066static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001067builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001068 PyObject *self;
1069 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001070{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001071 char c;
1072
Guido van Rossum79f25d91997-04-29 20:08:16 +00001073 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001074 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001075 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001076}
1077
Guido van Rossum79f25d91997-04-29 20:08:16 +00001078static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001079builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001080 PyObject *self;
1081 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001082{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001083 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001084
Guido van Rossum79f25d91997-04-29 20:08:16 +00001085 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001086 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001087 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001088}
1089
Guido van Rossum79f25d91997-04-29 20:08:16 +00001090static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001091builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001092 PyObject *self;
1093 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001094{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001095 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001096 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001097 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001098
Guido van Rossum79f25d91997-04-29 20:08:16 +00001099 if (PyTuple_Size(args) <= 1) {
1100 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001101 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001102 &ihigh))
1103 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001104 }
1105 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001106 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001107 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001108 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001109 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001110 }
1111 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001112 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001113 return NULL;
1114 }
1115 /* XXX ought to check overflow of subtraction */
1116 if (istep > 0)
1117 n = (ihigh - ilow + istep - 1) / istep;
1118 else
1119 n = (ihigh - ilow + istep + 1) / istep;
1120 if (n < 0)
1121 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001122 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001123 if (v == NULL)
1124 return NULL;
1125 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001126 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001127 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001128 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001129 return NULL;
1130 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001131 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001132 ilow += istep;
1133 }
1134 return v;
1135}
1136
Guido van Rossum79f25d91997-04-29 20:08:16 +00001137static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001138builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001139 PyObject *self;
1140 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001141{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001142 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001143 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001144
Guido van Rossum79f25d91997-04-29 20:08:16 +00001145 if (PyTuple_Size(args) <= 1) {
1146 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001147 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001148 &ihigh))
1149 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001150 }
1151 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001152 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001153 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001154 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001155 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001156 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001157 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001158 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001159 return NULL;
1160 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001161 /* XXX ought to check overflow of subtraction */
1162 if (istep > 0)
1163 n = (ihigh - ilow + istep - 1) / istep;
1164 else
1165 n = (ihigh - ilow + istep + 1) / istep;
1166 if (n < 0)
1167 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001168 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001169}
1170
Guido van Rossum79f25d91997-04-29 20:08:16 +00001171extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001172
Guido van Rossum79f25d91997-04-29 20:08:16 +00001173static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001174builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001175 PyObject *self;
1176 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001177{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001178 PyObject *v = NULL;
1179 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001180
Guido van Rossum79f25d91997-04-29 20:08:16 +00001181 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001182 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001183 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1184 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001185 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001186 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001187 char *prompt;
1188 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001189 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001190 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001191 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001192 if (po == NULL)
1193 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001194 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001195 }
1196 else {
1197 po = NULL;
1198 prompt = "";
1199 }
Guido van Rossumee81af81997-09-26 21:47:43 +00001200 Py_BEGIN_ALLOW_THREADS
Guido van Rossum79f25d91997-04-29 20:08:16 +00001201 s = PyOS_Readline(prompt);
Guido van Rossumee81af81997-09-26 21:47:43 +00001202 Py_END_ALLOW_THREADS
Guido van Rossum79f25d91997-04-29 20:08:16 +00001203 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001204 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001205 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001206 return NULL;
1207 }
1208 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001209 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001210 result = NULL;
1211 }
1212 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001213 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001214 }
1215 free(s);
1216 return result;
1217 }
Guido van Rossum90933611991-06-07 16:10:43 +00001218 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001219 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001220 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001221 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001222 return NULL;
1223 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001224 if (Py_FlushLine() != 0 ||
1225 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001226 return NULL;
1227 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001228 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001229 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001230 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001231 return NULL;
1232 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001233 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001234}
1235
Guido van Rossum79f25d91997-04-29 20:08:16 +00001236static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001237builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001238 PyObject *self;
1239 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001240{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001241 PyObject *seq, *func, *result = NULL;
1242 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001243 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001244
Guido van Rossum79f25d91997-04-29 20:08:16 +00001245 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001246 return NULL;
1247 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001248 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001249
Guido van Rossum09df08a1998-05-22 00:51:39 +00001250 sqf = seq->ob_type->tp_as_sequence;
1251 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001252 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001253 "2nd argument to reduce() must be a sequence object");
1254 return NULL;
1255 }
1256
Guido van Rossum79f25d91997-04-29 20:08:16 +00001257 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001258 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001259
Guido van Rossum2d951851994-08-29 12:52:16 +00001260 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001261 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001262
1263 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001264 Py_DECREF(args);
1265 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001266 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001267 }
1268
Guido van Rossum2d951851994-08-29 12:52:16 +00001269 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001270 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001271 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001272 break;
1273 }
1274 goto Fail;
1275 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001276
Guido van Rossum2d951851994-08-29 12:52:16 +00001277 if (result == NULL)
1278 result = op2;
1279 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001280 PyTuple_SetItem(args, 0, result);
1281 PyTuple_SetItem(args, 1, op2);
1282 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001283 goto Fail;
1284 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001285 }
1286
Guido van Rossum79f25d91997-04-29 20:08:16 +00001287 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001288
Guido van Rossum2d951851994-08-29 12:52:16 +00001289 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001290 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001291 "reduce of empty sequence with no initial value");
1292
Guido van Rossum12d12c51993-10-26 17:58:25 +00001293 return result;
1294
Guido van Rossum2d951851994-08-29 12:52:16 +00001295Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001296 Py_XDECREF(args);
1297 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001298 return NULL;
1299}
1300
Guido van Rossum79f25d91997-04-29 20:08:16 +00001301static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001302builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001303 PyObject *self;
1304 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001305{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001306 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001307
Guido van Rossum79f25d91997-04-29 20:08:16 +00001308 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001309 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001310 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001311}
1312
Guido van Rossum79f25d91997-04-29 20:08:16 +00001313static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001314builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001315 PyObject *self;
1316 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001317{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001318 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001319
Guido van Rossum79f25d91997-04-29 20:08:16 +00001320 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001321 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001322 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001323}
1324
Guido van Rossum79f25d91997-04-29 20:08:16 +00001325static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001326builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001327 PyObject *self;
1328 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001329{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001330 double x;
1331 double f;
1332 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001333 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001334
Guido van Rossum79f25d91997-04-29 20:08:16 +00001335 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001336 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001337 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001338 i = abs(ndigits);
1339 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001340 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001341 if (ndigits < 0)
1342 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001343 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001344 x *= f;
1345 if (x >= 0.0)
1346 x = floor(x + 0.5);
1347 else
1348 x = ceil(x - 0.5);
1349 if (ndigits < 0)
1350 x *= f;
1351 else
1352 x /= f;
1353 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001354}
1355
Guido van Rossum79f25d91997-04-29 20:08:16 +00001356static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001357builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001358 PyObject *self;
1359 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001360{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001361 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001362
Guido van Rossum79f25d91997-04-29 20:08:16 +00001363 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001364 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001365 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001366}
1367
Guido van Rossum79f25d91997-04-29 20:08:16 +00001368static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001369builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001370 PyObject *self;
1371 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001372{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001373 PyObject *v;
1374 PySequenceMethods *sqf;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001375
Guido van Rossum79f25d91997-04-29 20:08:16 +00001376 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001377 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001378 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001379}
1380
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001382builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001383 PyObject *self;
1384 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001385{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001387
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001389 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001390 v = (PyObject *)v->ob_type;
1391 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001392 return v;
1393}
1394
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001396builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001397 PyObject *self;
1398 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001399{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001400 PyObject *v = NULL;
1401 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402
Guido van Rossum79f25d91997-04-29 20:08:16 +00001403 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001404 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001405 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001407 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001408 if (!PyErr_Occurred())
1409 PyErr_SetString(PyExc_SystemError,
1410 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001411 }
1412 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001413 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001414 }
1415 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001417 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001418 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001419 "vars() argument must have __dict__ attribute");
1420 return NULL;
1421 }
1422 }
1423 return d;
1424}
1425
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001426static PyObject *
1427builtin_isinstance(self, args)
1428 PyObject *self;
1429 PyObject *args;
1430{
1431 PyObject *inst;
1432 PyObject *cls;
1433 int retval;
1434
1435 if (!PyArg_ParseTuple(args, "OO", &inst, &cls))
1436 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001437 if (PyType_Check(cls)) {
Guido van Rossumd6af46d1997-12-10 05:51:47 +00001438 retval = ((PyObject *)(inst->ob_type) == cls);
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001439 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001440 else {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001441 if (!PyClass_Check(cls)) {
1442 PyErr_SetString(PyExc_TypeError,
1443 "second argument must be a class");
1444 return NULL;
1445 }
1446
1447 if (!PyInstance_Check(inst))
1448 retval = 0;
1449 else {
1450 PyObject *inclass =
1451 (PyObject*)((PyInstanceObject*)inst)->in_class;
1452 retval = PyClass_IsSubclass(inclass, cls);
1453 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001454 }
1455 return PyInt_FromLong(retval);
1456}
1457
1458
1459static PyObject *
1460builtin_issubclass(self, args)
1461 PyObject *self;
1462 PyObject *args;
1463{
1464 PyObject *derived;
1465 PyObject *cls;
1466 int retval;
1467
1468 if (!PyArg_ParseTuple(args, "OO", &derived, &cls))
1469 return NULL;
1470 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1471 PyErr_SetString(PyExc_TypeError, "arguments must be classes");
1472 return NULL;
1473 }
1474 /* shortcut */
1475 if (!(retval = (derived == cls)))
1476 retval = PyClass_IsSubclass(derived, cls);
1477
1478 return PyInt_FromLong(retval);
1479}
1480
1481
Guido van Rossum79f25d91997-04-29 20:08:16 +00001482static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001483 {"__import__", builtin___import__, 1},
1484 {"abs", builtin_abs, 1},
1485 {"apply", builtin_apply, 1},
1486 {"callable", builtin_callable, 1},
1487 {"chr", builtin_chr, 1},
1488 {"cmp", builtin_cmp, 1},
1489 {"coerce", builtin_coerce, 1},
1490 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001491#ifndef WITHOUT_COMPLEX
1492 {"complex", builtin_complex, 1},
1493#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001494 {"delattr", builtin_delattr, 1},
1495 {"dir", builtin_dir, 1},
1496 {"divmod", builtin_divmod, 1},
1497 {"eval", builtin_eval, 1},
1498 {"execfile", builtin_execfile, 1},
1499 {"filter", builtin_filter, 1},
1500 {"float", builtin_float, 1},
1501 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001502 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001503 {"hasattr", builtin_hasattr, 1},
1504 {"hash", builtin_hash, 1},
1505 {"hex", builtin_hex, 1},
1506 {"id", builtin_id, 1},
1507 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001508 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001509 {"int", builtin_int, 1},
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001510 {"isinstance", builtin_isinstance, 1},
1511 {"issubclass", builtin_issubclass, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001512 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001513 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001514 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001515 {"long", builtin_long, 1},
1516 {"map", builtin_map, 1},
1517 {"max", builtin_max, 1},
1518 {"min", builtin_min, 1},
1519 {"oct", builtin_oct, 1},
1520 {"open", builtin_open, 1},
1521 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001522 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001523 {"range", builtin_range, 1},
1524 {"raw_input", builtin_raw_input, 1},
1525 {"reduce", builtin_reduce, 1},
1526 {"reload", builtin_reload, 1},
1527 {"repr", builtin_repr, 1},
1528 {"round", builtin_round, 1},
1529 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001530 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001531 {"str", builtin_str, 1},
1532 {"tuple", builtin_tuple, 1},
1533 {"type", builtin_type, 1},
1534 {"vars", builtin_vars, 1},
1535 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001536 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537};
1538
Guido van Rossum3f5da241990-12-20 15:06:42 +00001539/* Predefined exceptions */
1540
Guido van Rossum04748321997-09-16 18:43:15 +00001541PyObject *PyExc_Exception;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001542PyObject *PyExc_StandardError;
Barry Warsaw412cdc21997-09-16 21:51:14 +00001543PyObject *PyExc_ArithmeticError;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001544PyObject *PyExc_LookupError;
1545
Guido van Rossum79f25d91997-04-29 20:08:16 +00001546PyObject *PyExc_AssertionError;
1547PyObject *PyExc_AttributeError;
1548PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001549PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001550PyObject *PyExc_IOError;
1551PyObject *PyExc_ImportError;
1552PyObject *PyExc_IndexError;
1553PyObject *PyExc_KeyError;
1554PyObject *PyExc_KeyboardInterrupt;
1555PyObject *PyExc_MemoryError;
1556PyObject *PyExc_NameError;
1557PyObject *PyExc_OverflowError;
1558PyObject *PyExc_RuntimeError;
1559PyObject *PyExc_SyntaxError;
1560PyObject *PyExc_SystemError;
1561PyObject *PyExc_SystemExit;
1562PyObject *PyExc_TypeError;
1563PyObject *PyExc_ValueError;
1564PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001565
Barry Warsaw757af0e1997-08-29 22:13:51 +00001566PyObject *PyExc_MemoryErrorInst;
1567
1568static struct
1569{
1570 char* name;
1571 PyObject** exc;
1572 int leaf_exc;
1573}
1574bltin_exc[] = {
Guido van Rossum04748321997-09-16 18:43:15 +00001575 {"Exception", &PyExc_Exception, 0},
Barry Warsaw757af0e1997-08-29 22:13:51 +00001576 {"StandardError", &PyExc_StandardError, 0},
Barry Warsaw412cdc21997-09-16 21:51:14 +00001577 {"ArithmeticError", &PyExc_ArithmeticError, 0},
Barry Warsaw757af0e1997-08-29 22:13:51 +00001578 {"LookupError", &PyExc_LookupError, 0},
1579 {"AssertionError", &PyExc_AssertionError, 1},
1580 {"AttributeError", &PyExc_AttributeError, 1},
1581 {"EOFError", &PyExc_EOFError, 1},
1582 {"FloatingPointError", &PyExc_FloatingPointError, 1},
1583 {"IOError", &PyExc_IOError, 1},
1584 {"ImportError", &PyExc_ImportError, 1},
1585 {"IndexError", &PyExc_IndexError, 1},
1586 {"KeyError", &PyExc_KeyError, 1},
1587 {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, 1},
1588 {"MemoryError", &PyExc_MemoryError, 1},
1589 {"NameError", &PyExc_NameError, 1},
1590 {"OverflowError", &PyExc_OverflowError, 1},
1591 {"RuntimeError", &PyExc_RuntimeError, 1},
1592 {"SyntaxError", &PyExc_SyntaxError, 1},
1593 {"SystemError", &PyExc_SystemError, 1},
1594 {"SystemExit", &PyExc_SystemExit, 1},
1595 {"TypeError", &PyExc_TypeError, 1},
1596 {"ValueError", &PyExc_ValueError, 1},
1597 {"ZeroDivisionError", &PyExc_ZeroDivisionError, 1},
1598 {NULL, NULL}
1599};
1600
1601
1602/* import exceptions module to extract class exceptions */
1603static void
1604init_class_exc(dict)
1605 PyObject *dict;
1606{
1607 int i;
1608 PyObject *m = PyImport_ImportModule("exceptions");
1609 PyObject *d;
1610 PyObject *args;
1611
1612 if (m == NULL ||
1613 (d = PyModule_GetDict(m)) == NULL)
1614 {
Guido van Rossum09df08a1998-05-22 00:51:39 +00001615 /* XXX Should use PySys_WriteStderr here */
Barry Warsaw757af0e1997-08-29 22:13:51 +00001616 PyObject *f = PySys_GetObject("stderr");
1617 if (Py_VerboseFlag) {
1618 PyFile_WriteString(
1619 "'import exceptions' failed; traceback:\n", f);
1620 PyErr_Print();
1621 }
1622 else {
1623 PyFile_WriteString(
1624 "'import exceptions' failed; use -v for traceback\n", f);
1625 PyErr_Clear();
1626 }
1627 PyFile_WriteString("defaulting to old style exceptions\n", f);
1628 return;
1629 }
1630 for (i = 0; bltin_exc[i].name; i++) {
1631 /* dig the exception out of the module */
1632 PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name);
1633 if (!exc)
1634 Py_FatalError("built-in exception cannot be initialized");
1635
1636 Py_XDECREF(*bltin_exc[i].exc);
1637
1638 /* squirrel away a pointer to the exception */
1639 Py_INCREF(exc);
1640 *bltin_exc[i].exc = exc;
1641
1642 /* and insert the name in the __builtin__ module */
1643 PyDict_SetItemString(dict, bltin_exc[i].name, exc);
1644 }
1645
1646 /* we need one pre-allocated instance */
1647 args = Py_BuildValue("()");
1648 if (args) {
1649 PyExc_MemoryErrorInst =
1650 PyEval_CallObject(PyExc_MemoryError, args);
1651 Py_DECREF(args);
1652 }
1653
1654 /* we're done with the exceptions module */
1655 Py_DECREF(m);
1656
1657 if (PyErr_Occurred())
1658 Py_FatalError("can't instantiate standard exceptions");
1659}
1660
1661
1662static void
1663fini_instances()
1664{
1665 Py_XDECREF(PyExc_MemoryErrorInst);
1666 PyExc_MemoryErrorInst = NULL;
1667}
1668
1669
Guido van Rossum79f25d91997-04-29 20:08:16 +00001670static PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +00001671newstdexception(dict, name)
1672 PyObject *dict;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001673 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001674{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001675 PyObject *v = PyString_FromString(name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001676 if (v == NULL || PyDict_SetItemString(dict, name, v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001677 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001678 return v;
1679}
1680
1681static void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001682initerrors(dict)
1683 PyObject *dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001684{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001685 int i;
1686 int exccnt = 0;
1687 for (i = 0; bltin_exc[i].name; i++, exccnt++) {
1688 if (bltin_exc[i].leaf_exc)
1689 *bltin_exc[i].exc =
1690 newstdexception(dict, bltin_exc[i].name);
1691 }
1692
1693 /* This is kind of bogus because we special case the three new
1694 exceptions to be nearly forward compatible. But this means we
1695 hard code knowledge about exceptions.py into C here. I don't
1696 have a better solution, though
1697 */
1698 PyExc_LookupError = PyTuple_New(2);
1699 Py_INCREF(PyExc_IndexError);
1700 PyTuple_SET_ITEM(PyExc_LookupError, 0, PyExc_IndexError);
1701 Py_INCREF(PyExc_KeyError);
1702 PyTuple_SET_ITEM(PyExc_LookupError, 1, PyExc_KeyError);
1703 PyDict_SetItemString(dict, "LookupError", PyExc_LookupError);
1704
Barry Warsaw412cdc21997-09-16 21:51:14 +00001705 PyExc_ArithmeticError = PyTuple_New(3);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001706 Py_INCREF(PyExc_OverflowError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001707 PyTuple_SET_ITEM(PyExc_ArithmeticError, 0, PyExc_OverflowError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001708 Py_INCREF(PyExc_ZeroDivisionError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001709 PyTuple_SET_ITEM(PyExc_ArithmeticError, 1, PyExc_ZeroDivisionError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001710 Py_INCREF(PyExc_FloatingPointError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001711 PyTuple_SET_ITEM(PyExc_ArithmeticError, 2, PyExc_FloatingPointError);
1712 PyDict_SetItemString(dict, "ArithmeticError", PyExc_ArithmeticError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001713
Barry Warsawb01a7fa1997-09-18 03:44:38 +00001714 PyExc_StandardError = PyTuple_New(exccnt-2);
1715 for (i = 2; bltin_exc[i].name; i++) {
Barry Warsaw757af0e1997-08-29 22:13:51 +00001716 PyObject *exc = *bltin_exc[i].exc;
1717 Py_INCREF(exc);
Barry Warsawb01a7fa1997-09-18 03:44:38 +00001718 PyTuple_SET_ITEM(PyExc_StandardError, i-2, exc);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001719 }
1720 PyDict_SetItemString(dict, "StandardError", PyExc_StandardError);
Guido van Rossum04748321997-09-16 18:43:15 +00001721
1722 /* Exception is treated differently; for now, it's == StandardError */
1723 PyExc_Exception = PyExc_StandardError;
1724 Py_INCREF(PyExc_Exception);
1725 PyDict_SetItemString(dict, "Exception", PyExc_Exception);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001726
1727 if (PyErr_Occurred())
1728 Py_FatalError("Could not initialize built-in string exceptions");
Guido van Rossum25ce5661997-08-02 03:10:38 +00001729}
1730
1731static void
1732finierrors()
1733{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001734 int i;
1735 for (i = 0; bltin_exc[i].name; i++) {
1736 PyObject *exc = *bltin_exc[i].exc;
1737 Py_XDECREF(exc);
1738 *bltin_exc[i].exc = NULL;
1739 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001740}
1741
1742PyObject *
Barry Warsaw757af0e1997-08-29 22:13:51 +00001743_PyBuiltin_Init_1()
Guido van Rossum25ce5661997-08-02 03:10:38 +00001744{
1745 PyObject *mod, *dict;
1746 mod = Py_InitModule("__builtin__", builtin_methods);
1747 if (mod == NULL)
1748 return NULL;
1749 dict = PyModule_GetDict(mod);
1750 initerrors(dict);
1751 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1752 return NULL;
1753 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1754 return NULL;
1755 if (PyDict_SetItemString(dict, "__debug__",
1756 PyInt_FromLong(Py_OptimizeFlag == 0)) < 0)
1757 return NULL;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001758
Guido van Rossum25ce5661997-08-02 03:10:38 +00001759 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001760}
1761
1762void
Barry Warsaw757af0e1997-08-29 22:13:51 +00001763_PyBuiltin_Init_2(dict)
1764 PyObject *dict;
1765{
1766 /* if Python was started with -X, initialize the class exceptions */
1767 if (Py_UseClassExceptionsFlag)
1768 init_class_exc(dict);
1769}
1770
1771
1772void
1773_PyBuiltin_Fini_1()
1774{
1775 fini_instances();
1776}
1777
1778
1779void
1780_PyBuiltin_Fini_2()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001781{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001782 finierrors();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001783}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001784
Guido van Rossum12d12c51993-10-26 17:58:25 +00001785
Guido van Rossume77a7571993-11-03 15:01:26 +00001786/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001789filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001790 PyObject *func;
1791 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001792{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001794 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001795 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001796
Guido van Rossumb7b45621995-08-04 04:07:45 +00001797 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001798 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001799 return tuple;
1800 }
1801
Guido van Rossum79f25d91997-04-29 20:08:16 +00001802 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001803 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001804
Guido van Rossum12d12c51993-10-26 17:58:25 +00001805 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001806 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001807 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001808
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001810 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001811 if (func == Py_None) {
1812 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001813 good = item;
1814 }
1815 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001816 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001817 if (arg == NULL)
1818 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001819 good = PyEval_CallObject(func, arg);
1820 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001821 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001822 goto Fail_1;
1823 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001824 ok = PyObject_IsTrue(good);
1825 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001826 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001827 Py_INCREF(item);
1828 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001829 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001830 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001831 }
1832
Guido van Rossum79f25d91997-04-29 20:08:16 +00001833 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001834 return NULL;
1835
Guido van Rossum12d12c51993-10-26 17:58:25 +00001836 return result;
1837
Guido van Rossum12d12c51993-10-26 17:58:25 +00001838Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001839 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001840 return NULL;
1841}
1842
1843
Guido van Rossume77a7571993-11-03 15:01:26 +00001844/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001845
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001847filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001848 PyObject *func;
1849 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001850{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001852 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001853 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001854
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001856 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001857 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001858 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001859 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001860 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001861 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001862
Guido van Rossum12d12c51993-10-26 17:58:25 +00001863 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001864 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001865 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001866
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001867 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1868 if (item == NULL)
1869 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001870 arg = Py_BuildValue("(O)", item);
1871 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001872 if (arg == NULL)
1873 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001874 good = PyEval_CallObject(func, arg);
1875 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001876 if (good == NULL)
1877 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001878 ok = PyObject_IsTrue(good);
1879 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001880 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001881 PyString_AS_STRING((PyStringObject *)result)[j++] =
1882 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001883 }
1884
Guido van Rossum79f25d91997-04-29 20:08:16 +00001885 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886 return NULL;
1887
Guido van Rossum12d12c51993-10-26 17:58:25 +00001888 return result;
1889
Guido van Rossum12d12c51993-10-26 17:58:25 +00001890Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001891 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001892 return NULL;
1893}