blob: 3aba792d0088a762105678cd63c5f1ae10c657cd [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;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000881
Guido van Rossum79f25d91997-04-29 20:08:16 +0000882 if (!PyArg_ParseTuple(args, "O:int", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000883 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000884 return PyNumber_Int(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +0000885}
886
Guido van Rossum79f25d91997-04-29 20:08:16 +0000887static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000888builtin_len(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000889 PyObject *self;
890 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000891{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000892 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000893
Guido van Rossum79f25d91997-04-29 20:08:16 +0000894 if (!PyArg_ParseTuple(args, "O:len", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000895 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000896 return PyInt_FromLong((long)PyObject_Length(v));
Guido van Rossum3f5da241990-12-20 15:06:42 +0000897}
898
Guido van Rossum79f25d91997-04-29 20:08:16 +0000899static PyObject *
Guido van Rossumd1705771996-04-09 02:41:06 +0000900builtin_list(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000901 PyObject *self;
902 PyObject *args;
Guido van Rossumd1705771996-04-09 02:41:06 +0000903{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000904 PyObject *v;
Guido van Rossumd1705771996-04-09 02:41:06 +0000905
Guido van Rossum79f25d91997-04-29 20:08:16 +0000906 if (!PyArg_ParseTuple(args, "O:list", &v))
Guido van Rossumd1705771996-04-09 02:41:06 +0000907 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000908 return PySequence_List(v);
Guido van Rossumd1705771996-04-09 02:41:06 +0000909}
910
Guido van Rossum8861b741996-07-30 16:49:37 +0000911
912static PyObject *
913builtin_slice(self, args)
914 PyObject *self;
915 PyObject *args;
916{
Guido van Rossum09df08a1998-05-22 00:51:39 +0000917 PyObject *start, *stop, *step;
Guido van Rossum8861b741996-07-30 16:49:37 +0000918
Guido van Rossum09df08a1998-05-22 00:51:39 +0000919 start = stop = step = NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000920
Guido van Rossum09df08a1998-05-22 00:51:39 +0000921 if (!PyArg_ParseTuple(args, "O|OO:slice", &start, &stop, &step))
922 return NULL;
Guido van Rossum8861b741996-07-30 16:49:37 +0000923
Guido van Rossum09df08a1998-05-22 00:51:39 +0000924 /* This swapping of stop and start is to maintain similarity with
925 range(). */
926 if (stop == NULL) {
927 stop = start;
928 start = NULL;
929 }
930 return PySlice_New(start, stop, step);
Guido van Rossum8861b741996-07-30 16:49:37 +0000931}
932
Guido van Rossum79f25d91997-04-29 20:08:16 +0000933static PyObject *
Guido van Rossum872537c1995-07-07 22:43:42 +0000934builtin_locals(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000935 PyObject *self;
936 PyObject *args;
Guido van Rossum872537c1995-07-07 22:43:42 +0000937{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000938 PyObject *d;
Guido van Rossum872537c1995-07-07 22:43:42 +0000939
Guido van Rossum79f25d91997-04-29 20:08:16 +0000940 if (!PyArg_ParseTuple(args, ""))
Guido van Rossum872537c1995-07-07 22:43:42 +0000941 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000942 d = PyEval_GetLocals();
943 Py_INCREF(d);
Guido van Rossum872537c1995-07-07 22:43:42 +0000944 return d;
945}
946
Guido van Rossum79f25d91997-04-29 20:08:16 +0000947static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000948builtin_long(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000949 PyObject *self;
950 PyObject *args;
Guido van Rossumd4905451991-05-05 20:00:36 +0000951{
Guido van Rossum79f25d91997-04-29 20:08:16 +0000952 PyObject *v;
Guido van Rossum1899c2e1992-09-12 11:09:23 +0000953
Guido van Rossum79f25d91997-04-29 20:08:16 +0000954 if (!PyArg_ParseTuple(args, "O:long", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000955 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000956 return PyNumber_Long(v);
Guido van Rossumd4905451991-05-05 20:00:36 +0000957}
958
Guido van Rossum79f25d91997-04-29 20:08:16 +0000959static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000960min_max(args, sign)
Guido van Rossum79f25d91997-04-29 20:08:16 +0000961 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000962 int sign;
963{
Guido van Rossum2d951851994-08-29 12:52:16 +0000964 int i;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000965 PyObject *v, *w, *x;
966 PySequenceMethods *sq;
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000967
Guido van Rossum79f25d91997-04-29 20:08:16 +0000968 if (PyTuple_Size(args) > 1)
Guido van Rossum1ae940a1995-01-02 19:04:15 +0000969 v = args;
Guido van Rossum79f25d91997-04-29 20:08:16 +0000970 else if (!PyArg_ParseTuple(args, "O:min/max", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +0000971 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000972 sq = v->ob_type->tp_as_sequence;
Guido van Rossum09df08a1998-05-22 00:51:39 +0000973 if (sq == NULL || sq->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000974 PyErr_SetString(PyExc_TypeError,
975 "min() or max() of non-sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +0000976 return NULL;
977 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000978 w = NULL;
979 for (i = 0; ; i++) {
Guido van Rossum3f5da241990-12-20 15:06:42 +0000980 x = (*sq->sq_item)(v, i); /* Implies INCREF */
Guido van Rossum2d951851994-08-29 12:52:16 +0000981 if (x == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +0000982 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000983 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +0000984 break;
985 }
Guido van Rossum79f25d91997-04-29 20:08:16 +0000986 Py_XDECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +0000987 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +0000988 }
Guido van Rossum2d951851994-08-29 12:52:16 +0000989 if (w == NULL)
990 w = x;
991 else {
Guido van Rossumc8b6df91997-05-23 00:06:51 +0000992 int c = PyObject_Compare(x, w);
993 if (c && PyErr_Occurred()) {
994 Py_DECREF(x);
995 Py_XDECREF(w);
996 return NULL;
997 }
998 if (c * sign > 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +0000999 Py_DECREF(w);
Guido van Rossum2d951851994-08-29 12:52:16 +00001000 w = x;
1001 }
1002 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001003 Py_DECREF(x);
Guido van Rossum2d951851994-08-29 12:52:16 +00001004 }
Guido van Rossum3f5da241990-12-20 15:06:42 +00001005 }
Guido van Rossum2d951851994-08-29 12:52:16 +00001006 if (w == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001007 PyErr_SetString(PyExc_ValueError,
1008 "min() or max() of empty sequence");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001009 return w;
1010}
1011
Guido van Rossum79f25d91997-04-29 20:08:16 +00001012static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001013builtin_min(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001014 PyObject *self;
1015 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001016{
1017 return min_max(v, -1);
1018}
1019
Guido van Rossum79f25d91997-04-29 20:08:16 +00001020static PyObject *
Guido van Rossum3f5da241990-12-20 15:06:42 +00001021builtin_max(self, v)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001022 PyObject *self;
1023 PyObject *v;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001024{
1025 return min_max(v, 1);
1026}
1027
Guido van Rossum79f25d91997-04-29 20:08:16 +00001028static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001029builtin_oct(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001030 PyObject *self;
1031 PyObject *args;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001032{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001033 PyObject *v;
1034 PyNumberMethods *nb;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001035
Guido van Rossum79f25d91997-04-29 20:08:16 +00001036 if (!PyArg_ParseTuple(args, "O:oct", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001037 return NULL;
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001038 if (v == NULL || (nb = v->ob_type->tp_as_number) == NULL ||
1039 nb->nb_oct == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001040 PyErr_SetString(PyExc_TypeError,
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001041 "oct() argument can't be converted to oct");
1042 return NULL;
Guido van Rossum006bcd41991-10-24 14:54:44 +00001043 }
Guido van Rossum1899c2e1992-09-12 11:09:23 +00001044 return (*nb->nb_oct)(v);
Guido van Rossum006bcd41991-10-24 14:54:44 +00001045}
1046
Guido van Rossum79f25d91997-04-29 20:08:16 +00001047static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001048builtin_open(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001049 PyObject *self;
1050 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001051{
Guido van Rossum2d951851994-08-29 12:52:16 +00001052 char *name;
1053 char *mode = "r";
1054 int bufsize = -1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001055 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001056
Guido van Rossum79f25d91997-04-29 20:08:16 +00001057 if (!PyArg_ParseTuple(args, "s|si:open", &name, &mode, &bufsize))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001058 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001059 f = PyFile_FromString(name, mode);
Guido van Rossum2d951851994-08-29 12:52:16 +00001060 if (f != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001061 PyFile_SetBufSize(f, bufsize);
Guido van Rossum2d951851994-08-29 12:52:16 +00001062 return f;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001063}
1064
Guido van Rossum79f25d91997-04-29 20:08:16 +00001065static PyObject *
Guido van Rossum94390a41992-08-14 15:14:30 +00001066builtin_ord(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001067 PyObject *self;
1068 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001069{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001070 char c;
1071
Guido van Rossum79f25d91997-04-29 20:08:16 +00001072 if (!PyArg_ParseTuple(args, "c:ord", &c))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001073 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001074 return PyInt_FromLong((long)(c & 0xff));
Guido van Rossum3f5da241990-12-20 15:06:42 +00001075}
1076
Guido van Rossum79f25d91997-04-29 20:08:16 +00001077static PyObject *
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001078builtin_pow(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001079 PyObject *self;
1080 PyObject *args;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001081{
Guido van Rossum09df08a1998-05-22 00:51:39 +00001082 PyObject *v, *w, *z = Py_None;
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001083
Guido van Rossum79f25d91997-04-29 20:08:16 +00001084 if (!PyArg_ParseTuple(args, "OO|O:pow", &v, &w, &z))
Guido van Rossum6a00cd81995-01-07 12:39:01 +00001085 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001086 return PyNumber_Power(v, w, z);
Guido van Rossumd4905451991-05-05 20:00:36 +00001087}
1088
Guido van Rossum79f25d91997-04-29 20:08:16 +00001089static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001090builtin_range(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001091 PyObject *self;
1092 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001093{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001094 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001095 int i, n;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001096 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001097
Guido van Rossum79f25d91997-04-29 20:08:16 +00001098 if (PyTuple_Size(args) <= 1) {
1099 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001100 "l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001101 &ihigh))
1102 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001103 }
1104 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001105 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001106 "ll|l;range() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001107 &ilow, &ihigh, &istep))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001108 return NULL;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001109 }
1110 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001111 PyErr_SetString(PyExc_ValueError, "zero step for range()");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001112 return NULL;
1113 }
1114 /* XXX ought to check overflow of subtraction */
1115 if (istep > 0)
1116 n = (ihigh - ilow + istep - 1) / istep;
1117 else
1118 n = (ihigh - ilow + istep + 1) / istep;
1119 if (n < 0)
1120 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001121 v = PyList_New(n);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001122 if (v == NULL)
1123 return NULL;
1124 for (i = 0; i < n; i++) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001125 PyObject *w = PyInt_FromLong(ilow);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001126 if (w == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001127 Py_DECREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001128 return NULL;
1129 }
Guido van Rossuma937d141998-04-24 18:22:02 +00001130 PyList_SET_ITEM(v, i, w);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001131 ilow += istep;
1132 }
1133 return v;
1134}
1135
Guido van Rossum79f25d91997-04-29 20:08:16 +00001136static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001137builtin_xrange(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001138 PyObject *self;
1139 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001140{
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001141 long ilow = 0, ihigh = 0, istep = 1;
Guido van Rossum0865dd91995-01-17 16:30:22 +00001142 long n;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001143
Guido van Rossum79f25d91997-04-29 20:08:16 +00001144 if (PyTuple_Size(args) <= 1) {
1145 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001146 "l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001147 &ihigh))
1148 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001149 }
1150 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001151 if (!PyArg_ParseTuple(args,
Guido van Rossum0865dd91995-01-17 16:30:22 +00001152 "ll|l;xrange() requires 1-3 int arguments",
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001153 &ilow, &ihigh, &istep))
Guido van Rossum12d12c51993-10-26 17:58:25 +00001154 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001155 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001156 if (istep == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001157 PyErr_SetString(PyExc_ValueError, "zero step for xrange()");
Guido van Rossum12d12c51993-10-26 17:58:25 +00001158 return NULL;
1159 }
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001160 /* XXX ought to check overflow of subtraction */
1161 if (istep > 0)
1162 n = (ihigh - ilow + istep - 1) / istep;
1163 else
1164 n = (ihigh - ilow + istep + 1) / istep;
1165 if (n < 0)
1166 n = 0;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001167 return PyRange_New(ilow, n, istep, 1);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001168}
1169
Guido van Rossum79f25d91997-04-29 20:08:16 +00001170extern char *PyOS_Readline Py_PROTO((char *));
Guido van Rossum872537c1995-07-07 22:43:42 +00001171
Guido van Rossum79f25d91997-04-29 20:08:16 +00001172static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001173builtin_raw_input(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001174 PyObject *self;
1175 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001176{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001177 PyObject *v = NULL;
1178 PyObject *f;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001179
Guido van Rossum79f25d91997-04-29 20:08:16 +00001180 if (!PyArg_ParseTuple(args, "|O:[raw_]input", &v))
Guido van Rossum3165fe61992-09-25 21:59:05 +00001181 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001182 if (PyFile_AsFile(PySys_GetObject("stdin")) == stdin &&
1183 PyFile_AsFile(PySys_GetObject("stdout")) == stdout &&
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001184 isatty(fileno(stdin)) && isatty(fileno(stdout))) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001185 PyObject *po;
Guido van Rossum872537c1995-07-07 22:43:42 +00001186 char *prompt;
1187 char *s;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001188 PyObject *result;
Guido van Rossum872537c1995-07-07 22:43:42 +00001189 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001190 po = PyObject_Str(v);
Guido van Rossum872537c1995-07-07 22:43:42 +00001191 if (po == NULL)
1192 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001193 prompt = PyString_AsString(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001194 }
1195 else {
1196 po = NULL;
1197 prompt = "";
1198 }
Guido van Rossumee81af81997-09-26 21:47:43 +00001199 Py_BEGIN_ALLOW_THREADS
Guido van Rossum79f25d91997-04-29 20:08:16 +00001200 s = PyOS_Readline(prompt);
Guido van Rossumee81af81997-09-26 21:47:43 +00001201 Py_END_ALLOW_THREADS
Guido van Rossum79f25d91997-04-29 20:08:16 +00001202 Py_XDECREF(po);
Guido van Rossum872537c1995-07-07 22:43:42 +00001203 if (s == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001204 PyErr_SetNone(PyExc_KeyboardInterrupt);
Guido van Rossum872537c1995-07-07 22:43:42 +00001205 return NULL;
1206 }
1207 if (*s == '\0') {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001208 PyErr_SetNone(PyExc_EOFError);
Guido van Rossum872537c1995-07-07 22:43:42 +00001209 result = NULL;
1210 }
1211 else { /* strip trailing '\n' */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001212 result = PyString_FromStringAndSize(s, strlen(s)-1);
Guido van Rossum872537c1995-07-07 22:43:42 +00001213 }
1214 free(s);
1215 return result;
1216 }
Guido van Rossum90933611991-06-07 16:10:43 +00001217 if (v != NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001218 f = PySys_GetObject("stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001219 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001220 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001221 return NULL;
1222 }
Guido van Rossumc8b6df91997-05-23 00:06:51 +00001223 if (Py_FlushLine() != 0 ||
1224 PyFile_WriteObject(v, f, Py_PRINT_RAW) != 0)
Guido van Rossum90933611991-06-07 16:10:43 +00001225 return NULL;
1226 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001227 f = PySys_GetObject("stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001228 if (f == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001229 PyErr_SetString(PyExc_RuntimeError, "lost sys.stdin");
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001230 return NULL;
1231 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001232 return PyFile_GetLine(f, -1);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001233}
1234
Guido van Rossum79f25d91997-04-29 20:08:16 +00001235static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001236builtin_reduce(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001237 PyObject *self;
1238 PyObject *args;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001239{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001240 PyObject *seq, *func, *result = NULL;
1241 PySequenceMethods *sqf;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001242 register int i;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001243
Guido van Rossum79f25d91997-04-29 20:08:16 +00001244 if (!PyArg_ParseTuple(args, "OO|O:reduce", &func, &seq, &result))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001245 return NULL;
1246 if (result != NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001247 Py_INCREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001248
Guido van Rossum09df08a1998-05-22 00:51:39 +00001249 sqf = seq->ob_type->tp_as_sequence;
1250 if (sqf == NULL || sqf->sq_item == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001251 PyErr_SetString(PyExc_TypeError,
Guido van Rossum12d12c51993-10-26 17:58:25 +00001252 "2nd argument to reduce() must be a sequence object");
1253 return NULL;
1254 }
1255
Guido van Rossum79f25d91997-04-29 20:08:16 +00001256 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001257 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001258
Guido van Rossum2d951851994-08-29 12:52:16 +00001259 for (i = 0; ; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001260 PyObject *op2;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001261
1262 if (args->ob_refcnt > 1) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001263 Py_DECREF(args);
1264 if ((args = PyTuple_New(2)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001265 goto Fail;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001266 }
1267
Guido van Rossum2d951851994-08-29 12:52:16 +00001268 if ((op2 = (*sqf->sq_item)(seq, i)) == NULL) {
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001269 if (PyErr_ExceptionMatches(PyExc_IndexError)) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001270 PyErr_Clear();
Guido van Rossum2d951851994-08-29 12:52:16 +00001271 break;
1272 }
1273 goto Fail;
1274 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001275
Guido van Rossum2d951851994-08-29 12:52:16 +00001276 if (result == NULL)
1277 result = op2;
1278 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001279 PyTuple_SetItem(args, 0, result);
1280 PyTuple_SetItem(args, 1, op2);
1281 if ((result = PyEval_CallObject(func, args)) == NULL)
Guido van Rossum2d951851994-08-29 12:52:16 +00001282 goto Fail;
1283 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001284 }
1285
Guido van Rossum79f25d91997-04-29 20:08:16 +00001286 Py_DECREF(args);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001287
Guido van Rossum2d951851994-08-29 12:52:16 +00001288 if (result == NULL)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001289 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001290 "reduce of empty sequence with no initial value");
1291
Guido van Rossum12d12c51993-10-26 17:58:25 +00001292 return result;
1293
Guido van Rossum2d951851994-08-29 12:52:16 +00001294Fail:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001295 Py_XDECREF(args);
1296 Py_XDECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001297 return NULL;
1298}
1299
Guido van Rossum79f25d91997-04-29 20:08:16 +00001300static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001301builtin_reload(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001302 PyObject *self;
1303 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001304{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001305 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001306
Guido van Rossum79f25d91997-04-29 20:08:16 +00001307 if (!PyArg_ParseTuple(args, "O:reload", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001308 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001309 return PyImport_ReloadModule(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001310}
1311
Guido van Rossum79f25d91997-04-29 20:08:16 +00001312static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001313builtin_repr(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001314 PyObject *self;
1315 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001316{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001317 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001318
Guido van Rossum79f25d91997-04-29 20:08:16 +00001319 if (!PyArg_ParseTuple(args, "O:repr", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001320 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001321 return PyObject_Repr(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001322}
1323
Guido van Rossum79f25d91997-04-29 20:08:16 +00001324static PyObject *
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001325builtin_round(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001326 PyObject *self;
1327 PyObject *args;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001328{
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001329 double x;
1330 double f;
1331 int ndigits = 0;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001332 int i;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001333
Guido van Rossum79f25d91997-04-29 20:08:16 +00001334 if (!PyArg_ParseTuple(args, "d|i:round", &x, &ndigits))
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001335 return NULL;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001336 f = 1.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001337 i = abs(ndigits);
1338 while (--i >= 0)
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001339 f = f*10.0;
Guido van Rossum1e162d31998-05-09 14:42:25 +00001340 if (ndigits < 0)
1341 x /= f;
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001342 else
Guido van Rossum1e162d31998-05-09 14:42:25 +00001343 x *= f;
1344 if (x >= 0.0)
1345 x = floor(x + 0.5);
1346 else
1347 x = ceil(x - 0.5);
1348 if (ndigits < 0)
1349 x *= f;
1350 else
1351 x /= f;
1352 return PyFloat_FromDouble(x);
Guido van Rossum9e51f9b1993-02-12 16:29:05 +00001353}
1354
Guido van Rossum79f25d91997-04-29 20:08:16 +00001355static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001356builtin_str(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001357 PyObject *self;
1358 PyObject *args;
Guido van Rossumc89705d1992-11-26 08:54:07 +00001359{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001360 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001361
Guido van Rossum79f25d91997-04-29 20:08:16 +00001362 if (!PyArg_ParseTuple(args, "O:str", &v))
Guido van Rossumc89705d1992-11-26 08:54:07 +00001363 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001364 return PyObject_Str(v);
Guido van Rossumc89705d1992-11-26 08:54:07 +00001365}
1366
Guido van Rossum79f25d91997-04-29 20:08:16 +00001367static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001368builtin_tuple(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001369 PyObject *self;
1370 PyObject *args;
Guido van Rossumcae027b1994-08-29 12:53:11 +00001371{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001372 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001373
Guido van Rossum79f25d91997-04-29 20:08:16 +00001374 if (!PyArg_ParseTuple(args, "O:tuple", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001375 return NULL;
Guido van Rossum09df08a1998-05-22 00:51:39 +00001376 return PySequence_Tuple(v);
Guido van Rossumcae027b1994-08-29 12:53:11 +00001377}
1378
Guido van Rossum79f25d91997-04-29 20:08:16 +00001379static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001380builtin_type(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001381 PyObject *self;
1382 PyObject *args;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001383{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001384 PyObject *v;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001385
Guido van Rossum79f25d91997-04-29 20:08:16 +00001386 if (!PyArg_ParseTuple(args, "O:type", &v))
Guido van Rossum3f5da241990-12-20 15:06:42 +00001387 return NULL;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001388 v = (PyObject *)v->ob_type;
1389 Py_INCREF(v);
Guido van Rossum3f5da241990-12-20 15:06:42 +00001390 return v;
1391}
1392
Guido van Rossum79f25d91997-04-29 20:08:16 +00001393static PyObject *
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001394builtin_vars(self, args)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001395 PyObject *self;
1396 PyObject *args;
Guido van Rossum2d951851994-08-29 12:52:16 +00001397{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001398 PyObject *v = NULL;
1399 PyObject *d;
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001400
Guido van Rossum79f25d91997-04-29 20:08:16 +00001401 if (!PyArg_ParseTuple(args, "|O:vars", &v))
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001402 return NULL;
Guido van Rossum2d951851994-08-29 12:52:16 +00001403 if (v == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001404 d = PyEval_GetLocals();
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001405 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001406 if (!PyErr_Occurred())
1407 PyErr_SetString(PyExc_SystemError,
1408 "no locals!?");
Guido van Rossum53bb7ff1995-07-26 16:26:31 +00001409 }
1410 else
Guido van Rossum79f25d91997-04-29 20:08:16 +00001411 Py_INCREF(d);
Guido van Rossum2d951851994-08-29 12:52:16 +00001412 }
1413 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001414 d = PyObject_GetAttrString(v, "__dict__");
Guido van Rossum2d951851994-08-29 12:52:16 +00001415 if (d == NULL) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001416 PyErr_SetString(PyExc_TypeError,
Guido van Rossum2d951851994-08-29 12:52:16 +00001417 "vars() argument must have __dict__ attribute");
1418 return NULL;
1419 }
1420 }
1421 return d;
1422}
1423
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001424static PyObject *
1425builtin_isinstance(self, args)
1426 PyObject *self;
1427 PyObject *args;
1428{
1429 PyObject *inst;
1430 PyObject *cls;
1431 int retval;
1432
1433 if (!PyArg_ParseTuple(args, "OO", &inst, &cls))
1434 return NULL;
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001435 if (PyType_Check(cls)) {
Guido van Rossumd6af46d1997-12-10 05:51:47 +00001436 retval = ((PyObject *)(inst->ob_type) == cls);
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001437 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001438 else {
Guido van Rossumf5dd9141997-12-02 19:11:45 +00001439 if (!PyClass_Check(cls)) {
1440 PyErr_SetString(PyExc_TypeError,
1441 "second argument must be a class");
1442 return NULL;
1443 }
1444
1445 if (!PyInstance_Check(inst))
1446 retval = 0;
1447 else {
1448 PyObject *inclass =
1449 (PyObject*)((PyInstanceObject*)inst)->in_class;
1450 retval = PyClass_IsSubclass(inclass, cls);
1451 }
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001452 }
1453 return PyInt_FromLong(retval);
1454}
1455
1456
1457static PyObject *
1458builtin_issubclass(self, args)
1459 PyObject *self;
1460 PyObject *args;
1461{
1462 PyObject *derived;
1463 PyObject *cls;
1464 int retval;
1465
1466 if (!PyArg_ParseTuple(args, "OO", &derived, &cls))
1467 return NULL;
1468 if (!PyClass_Check(derived) || !PyClass_Check(cls)) {
1469 PyErr_SetString(PyExc_TypeError, "arguments must be classes");
1470 return NULL;
1471 }
1472 /* shortcut */
1473 if (!(retval = (derived == cls)))
1474 retval = PyClass_IsSubclass(derived, cls);
1475
1476 return PyInt_FromLong(retval);
1477}
1478
1479
Guido van Rossum79f25d91997-04-29 20:08:16 +00001480static PyMethodDef builtin_methods[] = {
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001481 {"__import__", builtin___import__, 1},
1482 {"abs", builtin_abs, 1},
1483 {"apply", builtin_apply, 1},
1484 {"callable", builtin_callable, 1},
1485 {"chr", builtin_chr, 1},
1486 {"cmp", builtin_cmp, 1},
1487 {"coerce", builtin_coerce, 1},
1488 {"compile", builtin_compile, 1},
Guido van Rossum8a5c5d21996-01-12 01:09:56 +00001489#ifndef WITHOUT_COMPLEX
1490 {"complex", builtin_complex, 1},
1491#endif
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001492 {"delattr", builtin_delattr, 1},
1493 {"dir", builtin_dir, 1},
1494 {"divmod", builtin_divmod, 1},
1495 {"eval", builtin_eval, 1},
1496 {"execfile", builtin_execfile, 1},
1497 {"filter", builtin_filter, 1},
1498 {"float", builtin_float, 1},
1499 {"getattr", builtin_getattr, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001500 {"globals", builtin_globals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001501 {"hasattr", builtin_hasattr, 1},
1502 {"hash", builtin_hash, 1},
1503 {"hex", builtin_hex, 1},
1504 {"id", builtin_id, 1},
1505 {"input", builtin_input, 1},
Guido van Rossume8811f81997-02-14 15:48:05 +00001506 {"intern", builtin_intern, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001507 {"int", builtin_int, 1},
Barry Warsawcde8b1b1997-08-22 21:14:38 +00001508 {"isinstance", builtin_isinstance, 1},
1509 {"issubclass", builtin_issubclass, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001510 {"len", builtin_len, 1},
Guido van Rossumd1705771996-04-09 02:41:06 +00001511 {"list", builtin_list, 1},
Guido van Rossum872537c1995-07-07 22:43:42 +00001512 {"locals", builtin_locals, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001513 {"long", builtin_long, 1},
1514 {"map", builtin_map, 1},
1515 {"max", builtin_max, 1},
1516 {"min", builtin_min, 1},
1517 {"oct", builtin_oct, 1},
1518 {"open", builtin_open, 1},
1519 {"ord", builtin_ord, 1},
Guido van Rossum030ae171994-11-10 22:33:19 +00001520 {"pow", builtin_pow, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001521 {"range", builtin_range, 1},
1522 {"raw_input", builtin_raw_input, 1},
1523 {"reduce", builtin_reduce, 1},
1524 {"reload", builtin_reload, 1},
1525 {"repr", builtin_repr, 1},
1526 {"round", builtin_round, 1},
1527 {"setattr", builtin_setattr, 1},
Guido van Rossum8861b741996-07-30 16:49:37 +00001528 {"slice", builtin_slice, 1},
Guido van Rossum1ae940a1995-01-02 19:04:15 +00001529 {"str", builtin_str, 1},
1530 {"tuple", builtin_tuple, 1},
1531 {"type", builtin_type, 1},
1532 {"vars", builtin_vars, 1},
1533 {"xrange", builtin_xrange, 1},
Guido van Rossumc02e15c1991-12-16 13:03:00 +00001534 {NULL, NULL},
Guido van Rossum3f5da241990-12-20 15:06:42 +00001535};
1536
Guido van Rossum3f5da241990-12-20 15:06:42 +00001537/* Predefined exceptions */
1538
Guido van Rossum04748321997-09-16 18:43:15 +00001539PyObject *PyExc_Exception;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001540PyObject *PyExc_StandardError;
Barry Warsaw412cdc21997-09-16 21:51:14 +00001541PyObject *PyExc_ArithmeticError;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001542PyObject *PyExc_LookupError;
1543
Guido van Rossum79f25d91997-04-29 20:08:16 +00001544PyObject *PyExc_AssertionError;
1545PyObject *PyExc_AttributeError;
1546PyObject *PyExc_EOFError;
Guido van Rossumb6a7f771997-05-09 03:03:23 +00001547PyObject *PyExc_FloatingPointError;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001548PyObject *PyExc_IOError;
1549PyObject *PyExc_ImportError;
1550PyObject *PyExc_IndexError;
1551PyObject *PyExc_KeyError;
1552PyObject *PyExc_KeyboardInterrupt;
1553PyObject *PyExc_MemoryError;
1554PyObject *PyExc_NameError;
1555PyObject *PyExc_OverflowError;
1556PyObject *PyExc_RuntimeError;
1557PyObject *PyExc_SyntaxError;
1558PyObject *PyExc_SystemError;
1559PyObject *PyExc_SystemExit;
1560PyObject *PyExc_TypeError;
1561PyObject *PyExc_ValueError;
1562PyObject *PyExc_ZeroDivisionError;
Guido van Rossum50afb7a1991-12-10 13:52:31 +00001563
Barry Warsaw757af0e1997-08-29 22:13:51 +00001564PyObject *PyExc_MemoryErrorInst;
1565
1566static struct
1567{
1568 char* name;
1569 PyObject** exc;
1570 int leaf_exc;
1571}
1572bltin_exc[] = {
Guido van Rossum04748321997-09-16 18:43:15 +00001573 {"Exception", &PyExc_Exception, 0},
Barry Warsaw757af0e1997-08-29 22:13:51 +00001574 {"StandardError", &PyExc_StandardError, 0},
Barry Warsaw412cdc21997-09-16 21:51:14 +00001575 {"ArithmeticError", &PyExc_ArithmeticError, 0},
Barry Warsaw757af0e1997-08-29 22:13:51 +00001576 {"LookupError", &PyExc_LookupError, 0},
1577 {"AssertionError", &PyExc_AssertionError, 1},
1578 {"AttributeError", &PyExc_AttributeError, 1},
1579 {"EOFError", &PyExc_EOFError, 1},
1580 {"FloatingPointError", &PyExc_FloatingPointError, 1},
1581 {"IOError", &PyExc_IOError, 1},
1582 {"ImportError", &PyExc_ImportError, 1},
1583 {"IndexError", &PyExc_IndexError, 1},
1584 {"KeyError", &PyExc_KeyError, 1},
1585 {"KeyboardInterrupt", &PyExc_KeyboardInterrupt, 1},
1586 {"MemoryError", &PyExc_MemoryError, 1},
1587 {"NameError", &PyExc_NameError, 1},
1588 {"OverflowError", &PyExc_OverflowError, 1},
1589 {"RuntimeError", &PyExc_RuntimeError, 1},
1590 {"SyntaxError", &PyExc_SyntaxError, 1},
1591 {"SystemError", &PyExc_SystemError, 1},
1592 {"SystemExit", &PyExc_SystemExit, 1},
1593 {"TypeError", &PyExc_TypeError, 1},
1594 {"ValueError", &PyExc_ValueError, 1},
1595 {"ZeroDivisionError", &PyExc_ZeroDivisionError, 1},
1596 {NULL, NULL}
1597};
1598
1599
1600/* import exceptions module to extract class exceptions */
1601static void
1602init_class_exc(dict)
1603 PyObject *dict;
1604{
1605 int i;
1606 PyObject *m = PyImport_ImportModule("exceptions");
1607 PyObject *d;
1608 PyObject *args;
1609
1610 if (m == NULL ||
1611 (d = PyModule_GetDict(m)) == NULL)
1612 {
Guido van Rossum09df08a1998-05-22 00:51:39 +00001613 /* XXX Should use PySys_WriteStderr here */
Barry Warsaw757af0e1997-08-29 22:13:51 +00001614 PyObject *f = PySys_GetObject("stderr");
1615 if (Py_VerboseFlag) {
1616 PyFile_WriteString(
1617 "'import exceptions' failed; traceback:\n", f);
1618 PyErr_Print();
1619 }
1620 else {
1621 PyFile_WriteString(
1622 "'import exceptions' failed; use -v for traceback\n", f);
1623 PyErr_Clear();
1624 }
1625 PyFile_WriteString("defaulting to old style exceptions\n", f);
1626 return;
1627 }
1628 for (i = 0; bltin_exc[i].name; i++) {
1629 /* dig the exception out of the module */
1630 PyObject *exc = PyDict_GetItemString(d, bltin_exc[i].name);
1631 if (!exc)
1632 Py_FatalError("built-in exception cannot be initialized");
1633
1634 Py_XDECREF(*bltin_exc[i].exc);
1635
1636 /* squirrel away a pointer to the exception */
1637 Py_INCREF(exc);
1638 *bltin_exc[i].exc = exc;
1639
1640 /* and insert the name in the __builtin__ module */
1641 PyDict_SetItemString(dict, bltin_exc[i].name, exc);
1642 }
1643
1644 /* we need one pre-allocated instance */
1645 args = Py_BuildValue("()");
1646 if (args) {
1647 PyExc_MemoryErrorInst =
1648 PyEval_CallObject(PyExc_MemoryError, args);
1649 Py_DECREF(args);
1650 }
1651
1652 /* we're done with the exceptions module */
1653 Py_DECREF(m);
1654
1655 if (PyErr_Occurred())
1656 Py_FatalError("can't instantiate standard exceptions");
1657}
1658
1659
1660static void
1661fini_instances()
1662{
1663 Py_XDECREF(PyExc_MemoryErrorInst);
1664 PyExc_MemoryErrorInst = NULL;
1665}
1666
1667
Guido van Rossum79f25d91997-04-29 20:08:16 +00001668static PyObject *
Guido van Rossum25ce5661997-08-02 03:10:38 +00001669newstdexception(dict, name)
1670 PyObject *dict;
Guido van Rossumfb905c31991-12-16 15:42:38 +00001671 char *name;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001672{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001673 PyObject *v = PyString_FromString(name);
Guido van Rossum25ce5661997-08-02 03:10:38 +00001674 if (v == NULL || PyDict_SetItemString(dict, name, v) != 0)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001675 Py_FatalError("no mem for new standard exception");
Guido van Rossum3f5da241990-12-20 15:06:42 +00001676 return v;
1677}
1678
1679static void
Guido van Rossum25ce5661997-08-02 03:10:38 +00001680initerrors(dict)
1681 PyObject *dict;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001682{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001683 int i;
1684 int exccnt = 0;
1685 for (i = 0; bltin_exc[i].name; i++, exccnt++) {
1686 if (bltin_exc[i].leaf_exc)
1687 *bltin_exc[i].exc =
1688 newstdexception(dict, bltin_exc[i].name);
1689 }
1690
1691 /* This is kind of bogus because we special case the three new
1692 exceptions to be nearly forward compatible. But this means we
1693 hard code knowledge about exceptions.py into C here. I don't
1694 have a better solution, though
1695 */
1696 PyExc_LookupError = PyTuple_New(2);
1697 Py_INCREF(PyExc_IndexError);
1698 PyTuple_SET_ITEM(PyExc_LookupError, 0, PyExc_IndexError);
1699 Py_INCREF(PyExc_KeyError);
1700 PyTuple_SET_ITEM(PyExc_LookupError, 1, PyExc_KeyError);
1701 PyDict_SetItemString(dict, "LookupError", PyExc_LookupError);
1702
Barry Warsaw412cdc21997-09-16 21:51:14 +00001703 PyExc_ArithmeticError = PyTuple_New(3);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001704 Py_INCREF(PyExc_OverflowError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001705 PyTuple_SET_ITEM(PyExc_ArithmeticError, 0, PyExc_OverflowError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001706 Py_INCREF(PyExc_ZeroDivisionError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001707 PyTuple_SET_ITEM(PyExc_ArithmeticError, 1, PyExc_ZeroDivisionError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001708 Py_INCREF(PyExc_FloatingPointError);
Barry Warsaw412cdc21997-09-16 21:51:14 +00001709 PyTuple_SET_ITEM(PyExc_ArithmeticError, 2, PyExc_FloatingPointError);
1710 PyDict_SetItemString(dict, "ArithmeticError", PyExc_ArithmeticError);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001711
Barry Warsawb01a7fa1997-09-18 03:44:38 +00001712 PyExc_StandardError = PyTuple_New(exccnt-2);
1713 for (i = 2; bltin_exc[i].name; i++) {
Barry Warsaw757af0e1997-08-29 22:13:51 +00001714 PyObject *exc = *bltin_exc[i].exc;
1715 Py_INCREF(exc);
Barry Warsawb01a7fa1997-09-18 03:44:38 +00001716 PyTuple_SET_ITEM(PyExc_StandardError, i-2, exc);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001717 }
1718 PyDict_SetItemString(dict, "StandardError", PyExc_StandardError);
Guido van Rossum04748321997-09-16 18:43:15 +00001719
1720 /* Exception is treated differently; for now, it's == StandardError */
1721 PyExc_Exception = PyExc_StandardError;
1722 Py_INCREF(PyExc_Exception);
1723 PyDict_SetItemString(dict, "Exception", PyExc_Exception);
Barry Warsaw757af0e1997-08-29 22:13:51 +00001724
1725 if (PyErr_Occurred())
1726 Py_FatalError("Could not initialize built-in string exceptions");
Guido van Rossum25ce5661997-08-02 03:10:38 +00001727}
1728
1729static void
1730finierrors()
1731{
Barry Warsaw757af0e1997-08-29 22:13:51 +00001732 int i;
1733 for (i = 0; bltin_exc[i].name; i++) {
1734 PyObject *exc = *bltin_exc[i].exc;
1735 Py_XDECREF(exc);
1736 *bltin_exc[i].exc = NULL;
1737 }
Guido van Rossum25ce5661997-08-02 03:10:38 +00001738}
1739
1740PyObject *
Barry Warsaw757af0e1997-08-29 22:13:51 +00001741_PyBuiltin_Init_1()
Guido van Rossum25ce5661997-08-02 03:10:38 +00001742{
1743 PyObject *mod, *dict;
1744 mod = Py_InitModule("__builtin__", builtin_methods);
1745 if (mod == NULL)
1746 return NULL;
1747 dict = PyModule_GetDict(mod);
1748 initerrors(dict);
1749 if (PyDict_SetItemString(dict, "None", Py_None) < 0)
1750 return NULL;
1751 if (PyDict_SetItemString(dict, "Ellipsis", Py_Ellipsis) < 0)
1752 return NULL;
1753 if (PyDict_SetItemString(dict, "__debug__",
1754 PyInt_FromLong(Py_OptimizeFlag == 0)) < 0)
1755 return NULL;
Barry Warsaw757af0e1997-08-29 22:13:51 +00001756
Guido van Rossum25ce5661997-08-02 03:10:38 +00001757 return mod;
Guido van Rossum3f5da241990-12-20 15:06:42 +00001758}
1759
1760void
Barry Warsaw757af0e1997-08-29 22:13:51 +00001761_PyBuiltin_Init_2(dict)
1762 PyObject *dict;
1763{
1764 /* if Python was started with -X, initialize the class exceptions */
1765 if (Py_UseClassExceptionsFlag)
1766 init_class_exc(dict);
1767}
1768
1769
1770void
1771_PyBuiltin_Fini_1()
1772{
1773 fini_instances();
1774}
1775
1776
1777void
1778_PyBuiltin_Fini_2()
Guido van Rossum3f5da241990-12-20 15:06:42 +00001779{
Guido van Rossum25ce5661997-08-02 03:10:38 +00001780 finierrors();
Guido van Rossum3f5da241990-12-20 15:06:42 +00001781}
Guido van Rossumc6bb8f71991-07-01 18:42:41 +00001782
Guido van Rossum12d12c51993-10-26 17:58:25 +00001783
Guido van Rossume77a7571993-11-03 15:01:26 +00001784/* Helper for filter(): filter a tuple through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001785
Guido van Rossum79f25d91997-04-29 20:08:16 +00001786static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001787filtertuple(func, tuple)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001788 PyObject *func;
1789 PyObject *tuple;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001790{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001791 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001792 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001793 int len = PyTuple_Size(tuple);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001794
Guido van Rossumb7b45621995-08-04 04:07:45 +00001795 if (len == 0) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001796 Py_INCREF(tuple);
Guido van Rossumb7b45621995-08-04 04:07:45 +00001797 return tuple;
1798 }
1799
Guido van Rossum79f25d91997-04-29 20:08:16 +00001800 if ((result = PyTuple_New(len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001801 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001802
Guido van Rossum12d12c51993-10-26 17:58:25 +00001803 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001804 PyObject *item, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001805 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001806
Guido van Rossum79f25d91997-04-29 20:08:16 +00001807 if ((item = PyTuple_GetItem(tuple, i)) == NULL)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001808 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001809 if (func == Py_None) {
1810 Py_INCREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001811 good = item;
1812 }
1813 else {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001814 PyObject *arg = Py_BuildValue("(O)", item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001815 if (arg == NULL)
1816 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001817 good = PyEval_CallObject(func, arg);
1818 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001819 if (good == NULL)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001820 goto Fail_1;
1821 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001822 ok = PyObject_IsTrue(good);
1823 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001824 if (ok) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001825 Py_INCREF(item);
1826 if (PyTuple_SetItem(result, j++, item) < 0)
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001827 goto Fail_1;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001828 }
Guido van Rossum12d12c51993-10-26 17:58:25 +00001829 }
1830
Guido van Rossum79f25d91997-04-29 20:08:16 +00001831 if (_PyTuple_Resize(&result, j, 0) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001832 return NULL;
1833
Guido van Rossum12d12c51993-10-26 17:58:25 +00001834 return result;
1835
Guido van Rossum12d12c51993-10-26 17:58:25 +00001836Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001837 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001838 return NULL;
1839}
1840
1841
Guido van Rossume77a7571993-11-03 15:01:26 +00001842/* Helper for filter(): filter a string through a function */
Guido van Rossum12d12c51993-10-26 17:58:25 +00001843
Guido van Rossum79f25d91997-04-29 20:08:16 +00001844static PyObject *
Guido van Rossum12d12c51993-10-26 17:58:25 +00001845filterstring(func, strobj)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001846 PyObject *func;
1847 PyObject *strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001848{
Guido van Rossum79f25d91997-04-29 20:08:16 +00001849 PyObject *result;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001850 register int i, j;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001851 int len = PyString_Size(strobj);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001852
Guido van Rossum79f25d91997-04-29 20:08:16 +00001853 if (func == Py_None) {
Guido van Rossum2586bf01993-11-01 16:21:44 +00001854 /* No character is ever false -- share input string */
Guido van Rossum79f25d91997-04-29 20:08:16 +00001855 Py_INCREF(strobj);
Guido van Rossum2d951851994-08-29 12:52:16 +00001856 return strobj;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001857 }
Guido van Rossum79f25d91997-04-29 20:08:16 +00001858 if ((result = PyString_FromStringAndSize(NULL, len)) == NULL)
Guido van Rossum2586bf01993-11-01 16:21:44 +00001859 return NULL;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001860
Guido van Rossum12d12c51993-10-26 17:58:25 +00001861 for (i = j = 0; i < len; ++i) {
Guido van Rossum79f25d91997-04-29 20:08:16 +00001862 PyObject *item, *arg, *good;
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001863 int ok;
Guido van Rossum12d12c51993-10-26 17:58:25 +00001864
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001865 item = (*strobj->ob_type->tp_as_sequence->sq_item)(strobj, i);
1866 if (item == NULL)
1867 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001868 arg = Py_BuildValue("(O)", item);
1869 Py_DECREF(item);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001870 if (arg == NULL)
1871 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001872 good = PyEval_CallObject(func, arg);
1873 Py_DECREF(arg);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001874 if (good == NULL)
1875 goto Fail_1;
Guido van Rossum79f25d91997-04-29 20:08:16 +00001876 ok = PyObject_IsTrue(good);
1877 Py_DECREF(good);
Guido van Rossumdc4b93d1993-10-27 14:56:44 +00001878 if (ok)
Guido van Rossum79f25d91997-04-29 20:08:16 +00001879 PyString_AS_STRING((PyStringObject *)result)[j++] =
1880 PyString_AS_STRING((PyStringObject *)item)[0];
Guido van Rossum12d12c51993-10-26 17:58:25 +00001881 }
1882
Guido van Rossum79f25d91997-04-29 20:08:16 +00001883 if (j < len && _PyString_Resize(&result, j) < 0)
Guido van Rossum12d12c51993-10-26 17:58:25 +00001884 return NULL;
1885
Guido van Rossum12d12c51993-10-26 17:58:25 +00001886 return result;
1887
Guido van Rossum12d12c51993-10-26 17:58:25 +00001888Fail_1:
Guido van Rossum79f25d91997-04-29 20:08:16 +00001889 Py_DECREF(result);
Guido van Rossum12d12c51993-10-26 17:58:25 +00001890 return NULL;
1891}